fix(alarm): unfreeze snooze modal and add per-minute snooze countdown
The snooze button was fire-and-forget without error handling: if
posponerAlarma threw (e.g. native scheduleAlarm returns false on a
device without exact-alarm permission), _dismissScreen never ran. The
stuck modal also kept _alarmaSonandoActiva true, which made the next
ring get ignored. _posponer/_detener now dismiss in a finally and stop
audio defensively.
Add a native, AlarmManager-driven snooze countdown notification that
re-posts every minute ("Rings in N min", 3->2->1) while the engine is
dead. scheduleSpec drives scheduleSnoozeCountdown for snoozes (instead
of the 30-min pre-notice). Localized text and button labels travel
Dart->Kotlin as {minutes} templates, same pattern as preNoticeTemplate.
Notification actions: "snooze again" (snoozeAgain, anchored to now)
reports back via the existing snoozed event; "stop" (cancelSnooze)
records a handled occurrence for cold-start reconciliation and emits a
new snoozeCancelled event handled in EstadoAlarmas.
Adds snoozeCountdown/snoozeAgainAction keys across all 13 locales and a
test for the snoozeCancelled event. Kotlin changes are static-reviewed
only; no Android build environment available here.
This commit is contained in:
@@ -2312,6 +2312,18 @@ abstract class AppLocalizations {
|
||||
/// **'Empieza en {minutes} min'**
|
||||
String preNoticeCountdown(int minutes);
|
||||
|
||||
/// No description provided for @snoozeCountdown.
|
||||
///
|
||||
/// In es, this message translates to:
|
||||
/// **'Suena en {minutes} min'**
|
||||
String snoozeCountdown(int minutes);
|
||||
|
||||
/// No description provided for @snoozeAgainAction.
|
||||
///
|
||||
/// In es, this message translates to:
|
||||
/// **'Posponer otra vez'**
|
||||
String get snoozeAgainAction;
|
||||
|
||||
/// No description provided for @eqDeviceEditTitle.
|
||||
///
|
||||
/// In es, this message translates to:
|
||||
|
||||
Reference in New Issue
Block a user