RadioAlarm.kt 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package fr.forum_thalie.tsumugi.alarm
  2. import android.app.AlarmManager
  3. import android.app.PendingIntent
  4. import android.content.Context
  5. import android.content.Intent
  6. import android.util.Log
  7. import androidx.core.app.AlarmManagerCompat
  8. import fr.forum_thalie.tsumugi.BootBroadcastReceiver
  9. import androidx.preference.PreferenceManager
  10. import fr.forum_thalie.tsumugi.*
  11. import java.util.*
  12. import kotlin.collections.ArrayList
  13. class RadioAlarm {
  14. companion object {
  15. val instance by lazy {
  16. RadioAlarm()
  17. }
  18. }
  19. private lateinit var alarmIntent: PendingIntent
  20. private lateinit var showIntent: PendingIntent
  21. private fun defineIntents(c: Context)
  22. {
  23. alarmIntent = Intent(c, BootBroadcastReceiver::class.java).let { intent ->
  24. intent.putExtra("action", "$tag.${Actions.PLAY_OR_FALLBACK.name}")
  25. PendingIntent.getBroadcast(c, 0, intent, 0)
  26. }
  27. showIntent = Intent(c, ParametersActivity::class.java).let { intent ->
  28. intent.putExtra("action", "alarm")
  29. PendingIntent.getActivity(c, 0, intent, 0)
  30. }
  31. }
  32. fun cancelAlarm(c: Context)
  33. {
  34. defineIntents(c)
  35. val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager
  36. alarmManager.cancel(alarmIntent)
  37. }
  38. fun setNextAlarm(c: Context, isForce: Boolean = false, forceTime: Int? = null, forceDays: Set<String>? = null)
  39. {
  40. defineIntents(c)
  41. // don't do anything if the preference is set to FALSE, of course.
  42. if (!PreferenceManager.getDefaultSharedPreferences(c).getBoolean("isWakingUp", false) && !isForce)
  43. return
  44. val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager
  45. val showIntent = Intent(c, ParametersActivity::class.java).let { intent ->
  46. intent.putExtra("action", ActionOpenParam.ALARM.name)
  47. PendingIntent.getActivity(c, 0, intent, 0)
  48. }
  49. val time = findNextAlarmTime(c, forceTime, forceDays)
  50. if (time > 0)
  51. AlarmManagerCompat.setAlarmClock(alarmManager, time, showIntent, alarmIntent)
  52. }
  53. fun findNextAlarmTime(c: Context, forceTime: Int? = null, forceDays: Set<String>? = null) : Long
  54. {
  55. val calendar = Calendar.getInstance()
  56. val days = forceDays ?: PreferenceManager.getDefaultSharedPreferences(c).getStringSet("alarmDays", setOf())
  57. val time = forceTime ?: PreferenceManager.getDefaultSharedPreferences(c).getInt("alarmTimeFromMidnight", 7*60) // default value is set to 07:00 AM
  58. val hourOfDay = time / 60 //time is in minutes
  59. val minute = time % 60
  60. val fullWeekOrdered = weekdaysSundayFirst //Sunday --> Saturday
  61. val selectedDays = arrayListOf<Int>()
  62. for (item in fullWeekOrdered)
  63. {
  64. if (days!!.contains(item))
  65. selectedDays.add(fullWeekOrdered.indexOf(item))
  66. }
  67. if (selectedDays.isEmpty()) // in case the user uncheck all boxes... do nothing.
  68. return 0
  69. val currentDay = calendar.get(Calendar.DAY_OF_WEEK) - 1 // 0 (Sunday) to 6 (Saturday)
  70. val datePassed = if (calendar.get(Calendar.HOUR_OF_DAY)*60 + calendar.get(Calendar.MINUTE) >= time ) 1 else 0
  71. var nextSelectedDay = (currentDay + datePassed)%7
  72. var i = 0 + datePassed
  73. while (!selectedDays.contains(nextSelectedDay))
  74. {
  75. nextSelectedDay = (nextSelectedDay + 1)%7
  76. i++
  77. }
  78. // We found out the next selected day in the list.
  79. // we must move 'i' days forward
  80. calendar.isLenient = true
  81. calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH) + i, hourOfDay, minute)
  82. //[REMOVE LOG CALLS]Log.d(tag, calendar.toString())
  83. return calendar.timeInMillis
  84. }
  85. fun snooze(c: Context)
  86. {
  87. defineIntents(c)
  88. val snoozeString = preferenceStore.getString("snoozeDuration", "10") ?: "10"
  89. val snoozeMinutes = if (snoozeString == c.getString(R.string.disable)) 0 else Integer.parseInt(snoozeString)
  90. if (snoozeMinutes > 0)
  91. {
  92. val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager
  93. AlarmManagerCompat.setAlarmClock(alarmManager, Calendar.getInstance().timeInMillis + (snoozeMinutes * 60 * 1000), showIntent, alarmIntent)
  94. // now that the next alarm has been scheduled, kill the app
  95. c.startService(Intent(c, RadioService::class.java).putExtra("action", Actions.KILL.name))
  96. }
  97. }
  98. }