Files
clockula/app
makiolajandClaude Opus 5 edbbf0070d feat(alarm): the engine — fire, ring, snooze, dismiss, re-resolve
The engine owns every write and talks to Android through four interfaces it
does not implement, which is what keeps it a plain Kotlin class with 54 JVM
tests over fakes rather than something that needs a device to exercise.

At most one alarm rings, and a newly-firing alarm takes over — so closing a
cycle only touches the shared ring and auto-silence slots when that alarm is
the one actually ringing. Dismissing a snoozed alarm from its notification must
not silence a different alarm mid-ring.

Every read-modify-write over alarm_states runs under one mutex. A cold start
triggered by the fire broadcast otherwise races its own reschedule pass and can
overwrite ringingSince, which silences the alarm that woke the process.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 16:05:03 +02:00
..