diff --git a/android/app/src/main/kotlin/es/freetimelab/pluriwave/AlarmScheduler.kt b/android/app/src/main/kotlin/es/freetimelab/pluriwave/AlarmScheduler.kt index 402f15d..8a3d9ed 100644 --- a/android/app/src/main/kotlin/es/freetimelab/pluriwave/AlarmScheduler.kt +++ b/android/app/src/main/kotlin/es/freetimelab/pluriwave/AlarmScheduler.kt @@ -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) {