diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 139dc39..9a730e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -269,6 +269,7 @@ + diff --git a/app/src/main/java/de/jeanlucmakiola/clockula/alarm/receiver/SystemEventReceiver.kt b/app/src/main/java/de/jeanlucmakiola/clockula/alarm/receiver/SystemEventReceiver.kt index 7d82353..033aeda 100644 --- a/app/src/main/java/de/jeanlucmakiola/clockula/alarm/receiver/SystemEventReceiver.kt +++ b/app/src/main/java/de/jeanlucmakiola/clockula/alarm/receiver/SystemEventReceiver.kt @@ -17,7 +17,9 @@ import javax.inject.Inject /** * Everything that invalidates a registration: a reboot clears AlarmManager, an * app update clears it too, and a clock or zone change moves what "07:00" means. - * All four are answered the same way — re-resolve from now. + * All four are answered the same way — re-resolve from now. So is the user + * granting "Alarms & reminders" again, which turns an inexact registration + * back into an exact one. * * Both engines are told, in that order. For the timers a clock change * reschedules nothing (their slot is elapsed-realtime anchored); it re-anchors @@ -65,6 +67,11 @@ class SystemEventReceiver : HiltBroadcastReceiver() { stopwatchEngine.resync() } + ACTION_EXACT_ALARM_PERMISSION_CHANGED -> { + engine.reschedule() + timerEngine.resync() + } + Intent.ACTION_TIME_CHANGED, Intent.ACTION_TIMEZONE_CHANGED, -> { @@ -93,4 +100,10 @@ class SystemEventReceiver : HiltBroadcastReceiver() { } } } + + private companion object { + /** `AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED`, API 31+. */ + const val ACTION_EXACT_ALARM_PERMISSION_CHANGED = + "android.app.action.SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED" + } }