feat(todo): Settings' Tasks and Reminders, with Snooze on a reminder (ADR 0033, D4)

Settings gains Todo's own groups, kept in the person's sealed settings
row on every device. Tasks: the weekday weeks start on (the language's
unless set), which the week strip, the date and repeat pickers and the
filters follow; and whether a recurring task done opens its sub-tasks
again (on at first). Reminders: an automatic reminder (none at first)
that TaskRepository writes into a task gaining a time without reminders
of its own, and how long a reminder is snoozed for (15 minutes at first).

Each reminder's notification has a Snooze action on Android and Linux:
the reminder comes back that much later under an ID of its own,
scheduled from what the notification carries, so on Android with the
app closed too (the plugin's ActionBroadcastReceiver declared); the plan
of the person's reminders leaves snoozed ones alone. iOS, macOS and
Windows get it later.

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-01 20:25:15 +01:00
commit 51ebed41cd
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -79,7 +79,24 @@ the rail, a wash of strawberry, settings grouped as theirs. What the screenshots
before a timed task, snoozing), the account near the foot (halkyon_app's
`AccountTiles`, `SimpleLoginSection`, `AccountSecuritySection`), What's new and About
Halkyon Todo last, the version small below them. Groups come as their settings are
built; none is shown empty.
built; none is shown empty. **Tasks and Reminders** (as built, 1 Nov, the developer's
"as much as possible without my input"), kept in the person's sealed settings row
(`todo_settings`, D17), so on every device: *Start the week on* (the language's
unless set; the week strip, the date picker's next week, the filters' this week and
the repeat picker follow it, `firstWeekdayOf`); *Reset sub-tasks* (on at first, as
Todoist's; off, a recurring task done leaves its sub-tasks done); *Automatic reminder*
(none at first, so that nothing reminds a person who didn't ask; at the time, or 5 to
60 minutes before): a task gaining a time, added so or given one, without reminders of
its own gets it, written into the task where the person sees and may remove it, and a
task that already had a time keeps what the person left it (`TaskRepository`, every
way of giving a time at once); *When snoozed* (15 minutes at first; 5 to 60): each
reminder's notification has a Snooze action, the reminder coming back that much later
under an ID of its own, scheduled from what the notification carries (`snooze.dart`),
so on Android with the app closed too (`snoozeInBackground`, the plugin's
`ActionBroadcastReceiver` declared), and on Linux by the running app, as its reminders;
the plan of the person's reminders leaves the snoozed ones alone. iOS and macOS
register a notification's actions once, as the app starts and before its texts are
known, and Windows answers an action by starting the app: Snooze comes there later.
- **D5 Todo's rows are sealed, always, as Train's (ADR 0030, D7, D15)**, synced with
`serverpod_offline_sync`: every payload ADR 0017's sealed content under the person's
data key (`content_key`, halkyon_app's `PayloadEnvelope`), nothing readable in a column,