RadioAlarm.kt 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. lateinit var alarmIntent: PendingIntent
  20. fun cancelAlarm(c: Context)
  21. {
  22. if (::alarmIntent.isInitialized)
  23. {
  24. val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager
  25. alarmManager.cancel(alarmIntent)
  26. }
  27. }
  28. fun setNextAlarm(c: Context, isForce: Boolean = false, forceTime: Int? = null, forceDays: Set<String>? = null)
  29. {
  30. // don't do anything if the preference is set to FALSE, of course.
  31. if (!PreferenceManager.getDefaultSharedPreferences(c).getBoolean("isWakingUp", false) && !isForce)
  32. return
  33. val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager
  34. alarmIntent = Intent(c, BootBroadcastReceiver::class.java).let { intent ->
  35. intent.putExtra("action", "$tag.${Actions.PLAY_OR_FALLBACK.name}")
  36. PendingIntent.getBroadcast(c, 0, intent, 0)
  37. }
  38. val showIntent = Intent(c, ParametersActivity::class.java).let { intent ->
  39. intent.putExtra("action", ActionOpenParam.ALARM.name)
  40. PendingIntent.getActivity(c, 0, intent, 0)
  41. }
  42. val time = findNextAlarmTime(c, forceTime, forceDays)
  43. if (time > 0)
  44. AlarmManagerCompat.setAlarmClock(alarmManager, time, showIntent, alarmIntent)
  45. }
  46. fun findNextAlarmTime(c: Context, forceTime: Int? = null, forceDays: Set<String>? = null) : Long
  47. {
  48. val calendar = Calendar.getInstance()
  49. val days = forceDays ?: PreferenceManager.getDefaultSharedPreferences(c).getStringSet("alarmDays", setOf())
  50. val time = forceTime ?: PreferenceManager.getDefaultSharedPreferences(c).getInt("alarmTimeFromMidnight", 7*60) // default value is set to 07:00 AM
  51. val hourOfDay = time / 60 //time is in minutes
  52. val minute = time % 60
  53. val fullWeekOrdered = weekdaysSundayFirst //Sunday --> Saturday
  54. val selectedDays = arrayListOf<Int>()
  55. for (item in fullWeekOrdered)
  56. {
  57. if (days!!.contains(item))
  58. selectedDays.add(fullWeekOrdered.indexOf(item))
  59. }
  60. if (selectedDays.isEmpty()) // in case the user uncheck all boxes... do nothing.
  61. return 0
  62. val currentDay = calendar.get(Calendar.DAY_OF_WEEK) - 1 // 0 (Sunday) to 6 (Saturday)
  63. val datePassed = if (calendar.get(Calendar.HOUR_OF_DAY)*60 + calendar.get(Calendar.MINUTE) >= time ) 1 else 0
  64. var nextSelectedDay = (currentDay + datePassed)%7
  65. var i = 0 + datePassed
  66. while (!selectedDays.contains(nextSelectedDay))
  67. {
  68. nextSelectedDay = (nextSelectedDay + 1)%7
  69. i++
  70. }
  71. // We found out the next selected day in the list.
  72. // we must move 'i' days forward
  73. calendar.isLenient = true
  74. calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH) + i, hourOfDay, minute)
  75. Log.d(tag, calendar.toString())
  76. return calendar.timeInMillis
  77. }
  78. fun snooze(c: Context)
  79. {
  80. val snoozeString = preferenceStore.getString("snoozeDuration", "10") ?: "10"
  81. val snoozeMinutes = if (snoozeString == c.getString(R.string.disable)) 0 else Integer.parseInt(snoozeString)
  82. if (snoozeMinutes > 0)
  83. {
  84. val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager
  85. alarmIntent = Intent(c, BootBroadcastReceiver::class.java).let { intent ->
  86. intent.putExtra("action", "$tag.${Actions.PLAY_OR_FALLBACK.name}")
  87. PendingIntent.getBroadcast(c, 0, intent, 0)
  88. }
  89. val showIntent = Intent(c, ParametersActivity::class.java).let { intent ->
  90. intent.putExtra("action", "alarm")
  91. PendingIntent.getActivity(c, 0, intent, 0)
  92. }
  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. }