Files
pluriwave/openspec/changes/alarm-live-countdown/specs/alarm-snooze-dismiss/spec.md
T
FreeTLab bccc5c48b8
Build & Deploy PluriWave / Análisis de código (push) Successful in 38s
Build & Deploy PluriWave / Build APK + AAB release (push) Successful in 2m30s
docs(openspec): add SDD artifact trail for recent alarm and EQ changes
Persist the exploration, proposal, spec, design, tasks, and
verify/archive reports produced during the multi-device EQ,
alarm-countdown, and notification-visual-polish SDD cycles.
2026-07-04 12:42:11 +02:00

78 lines
3.0 KiB
Markdown

# Alarm Snooze Dismiss Specification
## Purpose
Define the required behavior for dismissing the alarm screen when the user taps
Snooze. The dismissal MUST work reliably regardless of whether the app was already
running or was launched cold (dead-app state) by the full-screen intent.
## Requirements
### Requirement: Reliable Screen Dismissal on Snooze
When the user taps Snooze, the alarm screen MUST be removed from view. The system
MUST handle both a live Navigator stack (app was running) and an empty Navigator
stack (app launched from dead state via full-screen intent).
The system MUST use `Navigator.canPop()` to determine the stack state before
calling `Navigator.pop()`. If `canPop()` returns false, the system MUST call
`SystemNavigator.pop()` as a fallback to close the activity.
#### Scenario: Snooze from a running app (Navigator stack non-empty)
- GIVEN the alarm screen is displayed and the app was already running before the alarm fired
- WHEN the user taps Snooze
- THEN `Navigator.canPop()` returns true
- AND `Navigator.pop()` is called
- AND the alarm screen is dismissed
- AND the app returns to the previous screen
#### Scenario: Snooze from dead-app state (Navigator stack empty)
- GIVEN the app was not running when the alarm fired
- AND the alarm screen was launched by the full-screen intent as the root activity
- WHEN the user taps Snooze
- THEN `Navigator.canPop()` returns false
- AND `SystemNavigator.pop()` is called
- AND the alarm screen activity is closed
- AND the device returns to the home screen or the previous app
#### Scenario: Snooze side effects always complete regardless of dismiss path
- GIVEN either app state (running or dead)
- WHEN the user taps Snooze
- THEN `_liberarAudioLocal()` is called before any navigation action
- AND `radio.audio.pausar()` is called before any navigation action
- AND `alarmas.posponerAlarma()` is called before any navigation action
- AND the navigation dismissal is the LAST action in `_posponer()`
---
### Requirement: Snooze Re-Trigger Is Unaffected
The snooze re-schedule logic MUST remain unchanged. The fix MUST NOT alter when or
how `posponerAlarma()` reprograms the AlarmManager.
#### Scenario: Snooze re-trigger after dead-app dismissal
- GIVEN the alarm screen was dismissed via `SystemNavigator.pop()`
- WHEN the snoozed time (`snoozeHasta`) is reached
- THEN the AlarmManager fires the alarm again
- AND the alarm screen is shown again via full-screen intent
---
### Requirement: No Unintended App Termination
`SystemNavigator.pop()` MUST only be called when `canPop()` is false (i.e., the
screen was the root route launched from a dead-app full-screen intent). It MUST NOT
be called when a live Navigator stack exists.
#### Scenario: Guard prevents accidental SystemNavigator.pop() in running-app state
- GIVEN the app has a non-empty Navigator stack
- WHEN the user taps Snooze
- THEN `canPop()` returns true
- AND `SystemNavigator.pop()` is NOT called
- AND only `Navigator.pop()` is used for dismissal