feat(alarms): the list and the editor

The tab the app has been missing. Rows carry the time, the repeat summary and
the next-fire countdown, ordered by time of day rather than by when they fire
next — a row must not move under the thumb reaching for it, so the next alarm
is marked by colour instead. The editor covers time, repeat days, label,
ringtone, vibration and snooze, with the five per-alarm overrides as
three-state pickers: a switch cannot say "I have not chosen".

Two things that look like details and are not. A ringing alarm is dismissed
through the engine before it is disabled, edited or deleted — otherwise its
state is cleared while the service keeps sounding and the auto-silence backstop
returns early on its own guard, leaving the alarm ringing until the wake-lock
timeout. And clearing the last repeat day disarms a pending skip, because
otherwise the resolver disables the alarm and the control that would have
explained it is already hidden.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wmy1BpCKi8KeSjaWhYuCPV
This commit is contained in:
2026-09-12 14:43:46 +02:00
co-authored by Claude Opus 5
parent 4662aee90d
commit 97ca617e6a
25 changed files with 3530 additions and 7 deletions
+77
View File
@@ -49,4 +49,81 @@
<string name="ring_challenge_hold">Hold to dismiss</string>
<string name="ring_challenge_escape">Dismiss without solving</string>
<string name="ring_snooze_unavailable">No snoozes left</string>
<!-- M5: the alarms list -->
<string name="alarms_add">Add alarm</string>
<string name="alarms_empty_hint">Tap + to set your first alarm</string>
<string name="alarm_row_toggle">Alarm at %1$s</string>
<string name="alarm_next_imminent">in less than a minute</string>
<plurals name="alarm_next_in_minutes">
<item quantity="one">in %1$d min</item>
<item quantity="other">in %1$d min</item>
</plurals>
<string name="alarm_next_in_hours">in %1$dh</string>
<string name="alarm_next_in_hours_minutes">in %1$dh %2$dm</string>
<string name="alarm_next_in_days">in %1$dd</string>
<string name="alarm_next_in_days_hours">in %1$dd %2$dh</string>
<string name="alarm_next_ringing">Ringing now</string>
<string name="alarm_next_snoozed">Snoozed \u00b7 %1$s</string>
<string name="alarm_skipping_next">Skipping next</string>
<string name="alarm_repeat_once">Once</string>
<string name="alarm_repeat_every_day">Every day</string>
<string name="alarm_repeat_weekdays">Weekdays</string>
<string name="alarm_repeat_weekends">Weekends</string>
<string name="alarm_summary_separator" translatable="false">" \u00b7 "</string>
<!-- M5: the alarm editor -->
<string name="editor_title">Alarm</string>
<string name="editor_repeat">Repeat</string>
<string name="editor_skip_next">Skip next alarm</string>
<string name="editor_skip_next_summary">Ring the one after this</string>
<string name="editor_label_placeholder">Alarm name</string>
<string name="editor_section_sound">Sound and vibration</string>
<string name="editor_section_snooze">Snooze and dismiss</string>
<string name="editor_ringtone">Sound</string>
<string name="editor_vibrate">Vibrate</string>
<string name="editor_volume_ramp">Gradual volume</string>
<string name="editor_snooze_length">Snooze length</string>
<string name="editor_snooze_limit">Snooze limit</string>
<string name="editor_dismiss_challenge">To dismiss</string>
<string name="editor_delete">Delete alarm</string>
<string name="editor_delete_title">Delete this alarm?</string>
<string name="editor_delete_message">The %1$s alarm will be removed.</string>
<string name="action_delete">Delete</string>
<string name="action_cancel">Cancel</string>
<string name="action_ok">OK</string>
<!-- M5: the per-alarm overrides -->
<string name="override_app_default">App default</string>
<string name="override_app_default_value">App default (%1$s)</string>
<string name="value_on">On</string>
<string name="value_off">Off</string>
<string name="volume_ramp_none">No gradual volume</string>
<plurals name="volume_ramp_seconds">
<item quantity="one">%1$d second</item>
<item quantity="other">%1$d seconds</item>
</plurals>
<plurals name="snooze_minutes">
<item quantity="one">%1$d minute</item>
<item quantity="other">%1$d minutes</item>
</plurals>
<string name="snooze_limit_none">No snoozing</string>
<plurals name="snooze_limit_times">
<item quantity="one">%1$d time</item>
<item quantity="other">%1$d times</item>
</plurals>
<string name="challenge_none">Just tap Dismiss</string>
<string name="challenge_math">Solve a sum</string>
<string name="challenge_hold">Press and hold</string>
<!-- M5: the ringtone picker -->
<string name="ringtone_picker_title">Alarm sound</string>
<string name="ringtone_silent">Silent</string>
<string name="ringtone_silent_summary">Vibration only</string>
<string name="ringtone_device_default">Device default alarm sound</string>
<string name="ringtone_pick_file">Choose from files\u2026</string>
<string name="ringtone_none_available">This device has no alarm sounds. Clockula will use the system default.</string>
<string name="ringtone_unavailable">Unavailable \u2014 the default alarm sound will be used</string>
<string name="ringtone_unknown">Unknown sound</string>
<string name="ringtone_access_may_lapse">Clockula may lose access to this file later</string>
</resources>