RadioAlarm.kt 5.2KB

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