fix(alarms): fallback native scheduling
This commit is contained in:
@@ -41,13 +41,13 @@ class AlarmScheduler(private val context: Context) {
|
||||
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
|
||||
)
|
||||
|
||||
alarmManager.setAlarmClock(
|
||||
AlarmManager.AlarmClockInfo(triggerAtMillis, showIntent),
|
||||
alarmIntent
|
||||
)
|
||||
Log.d(tag, "alarm.schedule setAlarmClock OK id=$id")
|
||||
val mainScheduled = scheduleMainAlarm(id, triggerAtMillis, showIntent, alarmIntent)
|
||||
|
||||
val now = System.currentTimeMillis()
|
||||
if (!mainScheduled) {
|
||||
Log.w(tag, "alarm.schedule main alarm fallback failed or degraded id=$id")
|
||||
}
|
||||
|
||||
if (preNoticeAtMillis > now) {
|
||||
try {
|
||||
alarmManager.setExactAndAllowWhileIdle(
|
||||
@@ -83,6 +83,55 @@ class AlarmScheduler(private val context: Context) {
|
||||
}
|
||||
}
|
||||
|
||||
private fun scheduleMainAlarm(
|
||||
id: String,
|
||||
triggerAtMillis: Long,
|
||||
showIntent: PendingIntent,
|
||||
alarmIntent: PendingIntent
|
||||
): Boolean {
|
||||
try {
|
||||
alarmManager.setAlarmClock(
|
||||
AlarmManager.AlarmClockInfo(triggerAtMillis, showIntent),
|
||||
alarmIntent
|
||||
)
|
||||
Log.d(tag, "alarm.schedule setAlarmClock OK id=$id")
|
||||
return true
|
||||
} catch (error: SecurityException) {
|
||||
Log.e(tag, "alarm.schedule setAlarmClock SecurityException id=$id", error)
|
||||
} catch (error: Throwable) {
|
||||
Log.e(tag, "alarm.schedule setAlarmClock ERROR id=$id", error)
|
||||
}
|
||||
|
||||
return try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && alarmManager.canScheduleExactAlarms()) {
|
||||
alarmManager.setExactAndAllowWhileIdle(
|
||||
AlarmManager.RTC_WAKEUP,
|
||||
triggerAtMillis,
|
||||
alarmIntent
|
||||
)
|
||||
Log.d(tag, "alarm.schedule setExactAndAllowWhileIdle fallback OK id=$id")
|
||||
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
alarmManager.setAndAllowWhileIdle(
|
||||
AlarmManager.RTC_WAKEUP,
|
||||
triggerAtMillis,
|
||||
alarmIntent
|
||||
)
|
||||
Log.d(tag, "alarm.schedule setAndAllowWhileIdle fallback OK id=$id")
|
||||
} else {
|
||||
alarmManager.set(
|
||||
AlarmManager.RTC_WAKEUP,
|
||||
triggerAtMillis,
|
||||
alarmIntent
|
||||
)
|
||||
Log.d(tag, "alarm.schedule set fallback OK id=$id")
|
||||
}
|
||||
true
|
||||
} catch (error: Throwable) {
|
||||
Log.e(tag, "alarm.schedule fallback ERROR id=$id", error)
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
fun cancelAlarm(id: String) {
|
||||
Log.d(tag, "alarm.cancel id=$id")
|
||||
for (slot in 1..3) {
|
||||
|
||||
Reference in New Issue
Block a user