One shared Material 3 grouped-list blueprint, modelled on the ReFra gallery app and extracted to ui/common/GroupedList.kt: CollapsingScaffold (a LargeTopAppBar whose large title collapses into the bar on scroll) and GroupedRow (Position-based corner grouping so a run of rows reads as one rounded card, with press-animated corners and selected/minHeight knobs). Settings: restructured into a category hub (About card on top, version mark at the foot) with sliding sub-pages for Appearance, the new-event form and Notifications. Theme, week-start and language pickers migrated from DropdownMenu to OptionCard dialogs; token-based icon chips. New ic_gitea.xml (Simple Icons, verbatim path) for the About "Source" button; en+de strings. Calendar manager: same collapsing scaffold + grouped rows; shared CalendarColorChip (neutral chip with a pastelised calendar glyph) replaces the bright colour swatch. Navigation drawer: branded header, grouped View switcher (active view highlighted via secondaryContainer), filter list restyled to grouped rows with a trailing checkbox; the whole drawer now scrolls as one. Cards use surfaceContainerHigh for readable contrast against surface. Version bumped to 2.3.0 / 20300. UI-only; unit tests green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7.1 KiB
Calendula — Current State
Last updated: 2026-06-16
Status
Milestone: 2 (write support) complete — v2.0.0 shipped 2026-06-11;
v2.1.0 (month event grid, drawer view tabs, cursor fix) shipped 2026-06-15.
Phase: post-2.1 backlog work. v2.2.0 (tap-to-create in day/week + local
calendar management) and v2.3.0 (Material 3 grouped-list redesign of Settings,
the calendar manager and the navigation drawer) both shipped 2026-06-16. The
backlog is now organised by theme in ROADMAP.md.
Progress
-
Design spec written and committed (
docs/superpowers/specs/2026-06-08-calendar-app-design.md) -
V1 design decisions resolved (App name "Calendula", icon, seed color)
-
Plan 01 written and executed — foundation lands (theme, icon, i18n, Hilt, DataStore, CI green)
-
Plan 02 written and executed — data layer + permission flow + debug screen
-
Month view (S1) — 6-week grid, event dots, today marker, swipe nav, three states (replaces debug screen)
-
Week view (S2) — time schedule with overlap-resolved lanes, all-day strip, swipe nav, three states
-
Day view (S3) — single-column slice reusing the week layout
-
View-switcher (M1) wired — cycles Month ↔ Week ↔ Day
-
Event-detail screen (S4) — full-screen, humanized recurrence
-
Filter sheet (M3) — per-calendar visibility, grouped by account, persisted, applied centrally in the repository
-
Settings (M4) — appearance (theme, dynamic colour, week start), language (per-app locales), about
-
[~] Jump-to-date (M2) — cut from scope; "Today" half shipped in v0.5, date-picker dropped
-
Full event read (v0.6) — reminders, status, availability, access level, attendee role + self-response, foreign timezone, and linkified description URLs in the detail view; new domain enums + mapper unit tests. (A dedicated URL field was cut — no
CalendarContractcolumn backs it.) -
v1.1 write foundation —
WRITE_CALENDAR(onboarding asks READ+WRITE, only READ gates; contextual upgrade for v1.0 installs), read-only-calendar detection (CALENDAR_ACCESS_LEVEL→canModifyContents, actions hidden for WebCal/birthday calendars), delete from the detail screen (recurring: "only this event" via cancelled exception / "all events in the series"), repository + mapper tests -
v1.2 create event — full-screen
EventEditScreen(title, all-day, M3 date/time pickers with duration-preserving start moves, writable-only calendar picker preselecting the last-used calendar, location, description), "+" FAB on all three views prefilled with the visible day,insertEventwith provider-correct all-day normalisation (UTC midnights, exclusive end), domain/mapper/repository tests -
v1.3 edit event (shipped 2026-06-11) —
EventEditScreenreused for edit (detail-screen Edit action,canModify-gated, contextual WRITE upgrade), dirty-checked partialupdateon the Events row (recurring: series DTSTART moves by the user's delta, DURATION instead of DTEND), reminder diff by minutes (kept rows keep their method), simple recurrence picker (FREQ/INTERVAL/UNTIL/COUNT; complex RRULEs preserved verbatim and shown humanized),EventFormField.Recurrenceincl. settings default, recurrence also available on create; domain/mapper/repository tests. Review round 1: weekly BYDAY day-toggles in the custom picker ("every week on Mon+Fri"). Review rounds 2–4: occurrence edit pulled forward from v2.0 and made three-way like delete ("this" = exception row viaCONTENT_EXCEPTION_URI, "this and following" = series split, "all" = series update); delete equally three-way (truncation via RRULE UNTIL); the edit-scope question moved to save time (Google model) — dirty recurring saves park inSaveUiState.AwaitingScope, a changed rule drops the "only this event" option -
v1.4 reminder notifications (shipped 2026-06-11) — exported
EVENT_REMINDERreceiver →CalendarAlerts(SCHEDULED & due) → dedicated channel, tap opens detail (singleTop deep link); best-effort FIRED marking; one-time onboarding step requestingPOST_NOTIFICATIONSwith duplicate-reminders warning; Settings mirror. Provider only firesMETHOD_ALERTrows (AOSP-verified), so email reminders never reach us -
v2.0 conflict dialog + store polish (shipped 2026-06-11 as v2.0.0) —
EditSnapshotcompare on save (overwrite/discard; deleted → close), quick-add cut, calendar-switch → v3 backlog; F-Droid/README copy refreshed, fastlane screenshots DE+EN captured on-device -
v2.1 (shipped 2026-06-15) — month grid shows real events as continuous multi-day bars; navigation-drawer View section (Month/Week/Day); cursor-jump fix in event text fields
-
v2.2 (shipped 2026-06-16) — tap an empty slot in day/week to create (prefilled with that day + tapped hour, snapped to the hour); local calendar management in a full-screen editor from Settings → Calendars: create/rename/recolor/delete device-only calendars (
ACCOUNT_TYPE_LOCAL, sync-adapter insert) with name, pastel-previewed colour, and description (stored inCAL_SYNC1); synced calendars listed read-only grouped by account with a per-account "manage in source app" deep-link (resolved from the account's authenticator: DAVx5/ICSx5/…) and an add-account shortcut. SharedInlineTextFieldextracted toui.common -
v2.3 settings/calendars/drawer redesign (shipped 2026-06-16) — adopted a shared Material 3 grouped-list blueprint, modelled on the ReFra gallery app and extracted to
ui/common/GroupedList.kt(CollapsingScaffoldwith aLargeTopAppBarexit-until-collapsed title;GroupedRowwith Position-based corner grouping, press-animated corners,selected+minHeightknobs).- Settings: category hub (About card on top → version mark at the foot) with
sliding sub-pages (Appearance / New event form / Notifications); token-
based icon chips; theme/week-start/language pickers migrated from
DropdownMenuto OptionCard dialogs. Newic_gitea.xml(Simple Icons, verbatim path) for the About "Source" button; en+de strings. - Calendar manager: same collapsing scaffold + grouped rows; shared
CalendarColorChip(neutral chip, pastelised calendar glyph). - Navigation drawer: branded header, grouped View switcher (active view
highlighted via
secondaryContainer), the filter list restyled to grouped rows with a trailing checkbox; the whole drawer scrolls as one. - Cards use
surfaceContainerHighfor readable contrast againstsurface. - Donate button on the About card deferred (target still TBD).
- Settings: category hub (About card on top → version mark at the foot) with
sliding sub-pages (Appearance / New event form / Notifications); token-
based icon chips; theme/week-start/language pickers migrated from
Next
- Monitor the F-Droid build/publish for the v2.3.0 tag
- Decide the "Locations & People" and "remote calendar create/edit"
go/no-go calls (both hinge on the INTERNET permission) — see
ROADMAP.md - Per-event color is next — reuses the color picker + palette plumbing from local calendar management; finishes the create/edit theme.
- Then agenda view (strategic, backs a future widget); jump-to-date and
duplicate event remain cheap follow-ups. Full ranked sequence in
ROADMAP.md→ "Near-term sequence".