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"
+ }
}