feat(reminders): configurable all-day reminder fire time #6

Merged
makiolaj merged 1 commits from feat/default-reminders into main 2026-06-18 07:58:48 +00:00
Owner

Summary

All-day events live at UTC midnight, so a raw "1 day before" reminder fires at an off hour (02:00 local in CEST) instead of the morning. This adds a global all-day reminder time setting (default 09:00) and encodes it into the provider MINUTES offset so the reminder lands at the chosen wall-clock time the day before.

Changes

  • AllDayReminderEncoding — pure to/from provider-minutes helpers. The form/UI/diff stay in whole-day "semantic" minutes; conversion happens only at the Reminders read/write boundary (insertEvent, reconcileReminders, EventDetailMapper). Handles DST, negative offsets ("at time of event"), and pre-existing rows.
  • SettingsPrefs.allDayReminderTimeMinutes (default 540), threaded from the repository into the data-source write paths.
  • Settings — a time-picker row, plus a shared TimePickerAlert lifted from the event editor.
  • Time-picker 12/24h fix — honour an explicit system override, else fall back to the device locale instead of the app's per-app language, so the clock matches the rest of the device.

Testing

  • New AllDayReminderEncodingTest (round-trips across CET/CEST, negative offset, pre-feature rows, DST drift) + pref/repo tests. Full testDebugUnitTest suite green.
  • Installed on-device (Pixel 10): all-day reminder time row works, 24-hour dial now renders correctly.

🤖 Generated with Claude Code

## Summary All-day events live at UTC midnight, so a raw "1 day before" reminder fires at an off hour (02:00 local in CEST) instead of the morning. This adds a global **all-day reminder time** setting (default 09:00) and encodes it into the provider `MINUTES` offset so the reminder lands at the chosen wall-clock time the day before. ## Changes - **AllDayReminderEncoding** — pure to/from provider-minutes helpers. The form/UI/diff stay in whole-day "semantic" minutes; conversion happens only at the `Reminders` read/write boundary (`insertEvent`, `reconcileReminders`, `EventDetailMapper`). Handles DST, negative offsets ("at time of event"), and pre-existing rows. - **SettingsPrefs.allDayReminderTimeMinutes** (default 540), threaded from the repository into the data-source write paths. - **Settings** — a time-picker row, plus a shared `TimePickerAlert` lifted from the event editor. - **Time-picker 12/24h fix** — honour an explicit system override, else fall back to the device locale instead of the app's per-app language, so the clock matches the rest of the device. ## Testing - New `AllDayReminderEncodingTest` (round-trips across CET/CEST, negative offset, pre-feature rows, DST drift) + pref/repo tests. Full `testDebugUnitTest` suite green. - Installed on-device (Pixel 10): all-day reminder time row works, 24-hour dial now renders correctly. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
makiolaj added 1 commit 2026-06-18 07:58:13 +00:00
feat(reminders): configurable all-day reminder fire time
All checks were successful
CI / ci (push) Successful in 3m37s
111b3782b0
All-day events live at UTC midnight, so a raw "1 day before" reminder
fires at an off hour (02:00 local in CEST) rather than the morning. Add a
global "all-day reminder time" setting (default 09:00) and encode it into
the provider MINUTES offset so the reminder lands at the chosen wall-clock
time the day before instead.

- AllDayReminderEncoding: pure to/from provider-minutes helpers, keeping
  the form/UI/diff in whole-day "semantic" minutes and converting only at
  the Reminders read/write boundary (insertEvent, reconcileReminders,
  EventDetailMapper). Covers DST, negative offsets, and pre-existing rows.
- SettingsPrefs.allDayReminderTimeMinutes (default 540) threaded from the
  repository into the data-source write paths.
- Settings: a time-picker row, plus a shared TimePickerAlert lifted from
  the event editor.
- Fix the time picker's 12/24-hour detection: honour an explicit system
  override, else fall back to the device locale rather than the app's
  per-app language, so it matches the rest of the device.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
makiolaj merged commit 3d5cc55ef1 into main 2026-06-18 07:58:48 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: makiolaj/calendula#6