fix(todo): a snoozed reminder back at the minute too (ADR 0033, D31)
All checks were successful
CI / check (push) Successful in 46m37s
CI / deploy (push) Successful in 5m18s

A snooze was scheduled inexact, as snoozes are minutes long; an idle phone
may bring an inexact alarm back later than the snooze lasts. With
USE_EXACT_ALARM (D31) Android lets the app wake at the minute, so a
snoozed reminder is exactAllowWhileIdle too wherever the plugin says it
can schedule exactly, and inexact where it can't (Android 12 with the
permission taken back).

Whats-New: A snoozed reminder comes back on the minute.
Whats-New-De: Eine geschlummerte Erinnerung kommt pünktlich wieder.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-04 22:55:38 +01:00
commit c00169acbc
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
2 changed files with 16 additions and 3 deletions

View file

@ -54,14 +54,25 @@ Future<void> _scheduleSnoozed(
return; return;
} }
try { try {
// Back at the minute too, where Android lets the app wake then
// (USE_EXACT_ALARM, D31): an inexact alarm may come many minutes late
// while the phone idles, longer than a short snooze lasts.
final exact =
await plugin
.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin
>()
?.canScheduleExactNotifications() ??
true;
await plugin.zonedSchedule( await plugin.zonedSchedule(
id: back.notice.id, id: back.notice.id,
title: back.notice.title, title: back.notice.title,
body: back.notice.body, body: back.notice.body,
scheduledDate: tz.TZDateTime.from(back.notice.at.toUtc(), tz.UTC), scheduledDate: tz.TZDateTime.from(back.notice.at.toUtc(), tz.UTC),
notificationDetails: details, notificationDetails: details,
// Snoozed for minutes, not to the minute: no exact alarm needed. androidScheduleMode: exact
androidScheduleMode: AndroidScheduleMode.inexactAllowWhileIdle, ? AndroidScheduleMode.exactAllowWhileIdle
: AndroidScheduleMode.inexactAllowWhileIdle,
payload: back.payload, payload: back.payload,
); );
} on Object catch (error) { } on Object catch (error) {

View file

@ -594,7 +594,9 @@ The developer's review of 4 Nov 2026, again beside Todoist's screens.
declared for Android 12 and 12L, which don't know the other, up to API 32 alone declared for Android 12 and 12L, which don't know the other, up to API 32 alone
(`test/android/exact_alarms_test.dart`). `AlarmManager.canScheduleExactAlarms` is (`test/android/exact_alarms_test.dart`). `AlarmManager.canScheduleExactAlarms` is
true with either, so the plugin's `canScheduleExactNotifications` is, and reminders true with either, so the plugin's `canScheduleExactNotifications` is, and reminders
are `exactAllowWhileIdle`. *Alternatives:* leading the person to *Alarms & are `exactAllowWhileIdle`, a snoozed reminder too (the developer's, as it had been
inexact while snoozes were minutes long; an idle phone may bring an inexact one later
than the snooze lasts). *Alternatives:* leading the person to *Alarms &
reminders* (one more permission to ask and explain, which most would never find reminders* (one more permission to ask and explain, which most would never find
again once refused), staying inexact (reminders minutes late, which a reminder at a again once refused), staying inexact (reminders minutes late, which a reminder at a
time can't be). Google Play reviews `USE_EXACT_ALARM` against that purpose; Todo is time can't be). Google Play reviews `USE_EXACT_ALARM` against that purpose; Todo is