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
|
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
|
||||||
)
|
)
|
||||||
|
|
||||||
alarmManager.setAlarmClock(
|
val mainScheduled = scheduleMainAlarm(id, triggerAtMillis, showIntent, alarmIntent)
|
||||||
AlarmManager.AlarmClockInfo(triggerAtMillis, showIntent),
|
|
||||||
alarmIntent
|
|
||||||
)
|
|
||||||
Log.d(tag, "alarm.schedule setAlarmClock OK id=$id")
|
|
||||||
|
|
||||||
val now = System.currentTimeMillis()
|
val now = System.currentTimeMillis()
|
||||||
|
if (!mainScheduled) {
|
||||||
|
Log.w(tag, "alarm.schedule main alarm fallback failed or degraded id=$id")
|
||||||
|
}
|
||||||
|
|
||||||
if (preNoticeAtMillis > now) {
|
if (preNoticeAtMillis > now) {
|
||||||
try {
|
try {
|
||||||
alarmManager.setExactAndAllowWhileIdle(
|
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) {
|
fun cancelAlarm(id: String) {
|
||||||
Log.d(tag, "alarm.cancel id=$id")
|
Log.d(tag, "alarm.cancel id=$id")
|
||||||
for (slot in 1..3) {
|
for (slot in 1..3) {
|
||||||
|
|||||||
Reference in New Issue
Block a user