diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/TimedEventManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/TimedEventManager.java index 2d48c8a287..835dd54ba7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/TimedEventManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/TimedEventManager.java @@ -18,6 +18,7 @@ import androidx.annotation.WorkerThread; import org.signal.core.util.PendingIntentFlags; import org.signal.core.util.ThreadUtil; import org.signal.core.util.logging.Log; +import org.thoughtcrime.securesms.util.RemoteConfig; import org.thoughtcrime.securesms.util.ServiceUtil; /** @@ -108,7 +109,13 @@ public abstract class TimedEventManager { boolean hasManagerPermission = Build.VERSION.SDK_INT < 31 || alarmManager.canScheduleExactAlarms(); if (hasManagerPermission) { try { - alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(timestamp, showIntent), pendingIntent); + if (RemoteConfig.exactAlarm()) { + Log.d(TAG, "[trySetExactAlarm] Using setExactAndAllowWhileIdle()"); + alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, timestamp, pendingIntent); + } else { + Log.d(TAG, "[trySetExactAlarm] Using setAlarmClock()"); + alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(timestamp, showIntent), pendingIntent); + } return; } catch (Exception e) { Log.w(TAG, e); diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt index 66438f78b1..27242e0b52 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt @@ -1343,5 +1343,16 @@ object RemoteConfig { hotSwappable = false ) + /** + * Whether to use setExactAlarmAndAllowWhileIdle for exact alarms. + */ + @JvmStatic + @get:JvmName("exactAlarm") + val exactAlarm: Boolean by remoteBoolean( + key = "android.exactAlarm", + defaultValue = false, + hotSwappable = true + ) + // endregion }