Phase 0 of the shared-kit plan: floret-kit is embedded as a git submodule and
wired in with Gradle includeBuild("floret-kit"), so the app depends on
de.jeanlucmakiola.floret:core-time and Gradle substitutes the local source
module (built from source — F-Droid-safe). Proves the submodule + composite-build
pipeline before any design layers move.
- Remove app copies of DayWindow + Instant date/time formatting (now in
core-time); repoint imports to de.jeanlucmakiola.floret.time.
- DateTimeField gains an explicit import (was same-package).
- CI checkouts fetch submodules recursively.
- Clean composite build + unit tests + debug assemble green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Floret is promoted to the family / design-language (shared-kit) name; the
tasks app itself becomes Agendula (de.jeanlucmakiola.agendula) — agenda
('things to be done') + Calendula's -ula, a twin of the Calendula name.
Renames the package, namespace, applicationId, rootProject.name, app_name,
FloretApp/FloretNavHost/FloretTransitions classes, theme, F-Droid metadata
dir, CI artifact name, and docs. The botanical word 'florets' is preserved in
the name-origin prose, which is rewritten to Agendula's etymology. Clean
build + unit tests green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reminders onboarding & polish, plus the Settings screen (landed early).
- One-time reminder onboarding gate after the provider grant
(ReminderOnboardingScreen + OnboardingScaffold), requesting
POST_NOTIFICATIONS on API 33+; choice recorded in prefs.
- Settings screen, structured after Calendula as a category hub with
sliding sub-screens (CollapsingScaffold + grouped rows + full-screen
OptionPicker): About card, Appearance (theme, dynamic colour), Task
form (default edit-form fields, default list, add-a-subtask-row
opt-out), Reminders, Language, and Report a problem. Reached via an
expressive shaped action button (MaterialShapes.Cookie4Sided) on the
lists overview. Back from a sub-screen returns to the hub.
- Reminders: master enable toggle (gates the whole engine; re-requests
the notification permission), a default lead time with a Custom
amount/unit editor, an Android-12 exact-alarm status row, and
per-list overrides of the default (Inherit / None / custom lead),
honoured by ReminderScheduler per task.
- Per-app language (AppLanguage + locales_config.xml + appcompat
locales service); add-a-subtask-row opt-out wired into the task list.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Promote [Unreleased] → [0.2.0] in the changelog (M2 UI + M3/M4 + fixes) and
bump the dev-default version to 0.2.0 / 200. The pushed tag drives the released
version per docs/RELEASING.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
M3 detail/edit polish:
- "Progress" slider on the edit form writes Tasks.PERCENT_COMPLETE (clamped
0-100, 5% detents); status stays owned by the complete toggle.
- Conflict-safe saves: updateTask re-checks the provider's last_modified against
the value captured when the form loaded and throws TaskConflictException; the
editor offers overwrite-or-cancel instead of clobbering an external change.
M4 subtasks (UI):
- Reparent: a "Parent task" picker files a task under any top-level task in its
list (or "None" to promote it); candidates stay top-level to keep nesting one
level deep. Switching list clears the now-invalid parent.
- Tapping a subtask opens its own detail (a new TaskDetail entry, own VM).
Tests: percent clamping, parent-id write, populatedFields reveal logic.
Docs: ROADMAP M2/M3/M4 reconciled to the codebase; CHANGELOG [Unreleased].
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Render the subtasks group on every task, not just ones that already
have children, so the inline add field is available from the start.
Hide the done/total count until there's at least one subtask.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the boxed-text-field form with the family's tonal-card layout:
Close + filled SAVE top bar, a borderless headline title with a
list-colour accent bar, a "When" card (all-day switch + tappable
start/due rows), a tappable list card and reminder card that open
OptionCard dialogs, and segmented-button priority.
Optional Description / Priority / Reminder sections unfold from a
"More fields" picker (Calendula's disclosure): TaskFormField enum +
populatedFields() auto-reveal fields that already carry a value, and a
persisted defaultEditFields pref decides which start open (the settings
UI to edit it lands with M6). New shared InlineTextField + OptionCard;
date/time conversion helpers in DateTimeField promoted to internal.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Count a parent's subtask progress over the full task set in the
repository (attached to Task as subtaskTotal/subtaskDone) so completed
children are counted even on smart lists that hide closed tasks — the
chip showed "0 / 2" instead of "18 / 20". List membership (and the home
overview counts) are unchanged; only the parent's derived progress is.
Also wrap the task-row metadata in a FlowRow so the subtask chip drops
to a further line when a dated task with subtasks can't fit due + chips
on one line, rather than squeezing the trailing chip.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Drive the NavHost with the motion scheme's fastSpatialSpec: forward fades in
over a held, static background; back (and the predictive-back drag) slides the
top screen out to the right, revealing the screen beneath unmoved — the same
overlay feel as Calendula, instead of the default navigation-compose transition.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the base scaffolds with the real Material 3 Expressive UI on the
existing M1 ViewModels.
Task list: due-date section headers (collapsible Completed), grouped tonal
rows with a list-colour accent bar, swipe-to-complete / -delete, inline add,
list-name chip and subtask "done/total" chip in mixed views (children folded
into their parent). New pure TaskSections grouping + unit test.
Detail: each fact its own tonal card with a leading icon (Calendula pattern) —
when/list/priority/progress/description; progress shows only with subtasks.
Subtasks are a connected grouped run whose first segment is the expand toggle,
with an accent-tinted inline add row; completed subtasks sink to the bottom.
Edit: title, description, list dropdown, start/due date-time + all-day,
priority segmented buttons, reminder offset, validation; IME auto-scroll.
Extract GroupedSurface from GroupedRow so the connected-row look is reusable
at any width; add ListNameChip + date-time format/picker helpers.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the RootScreen nav stubs with a real NavHost. Each destination
binds its existing M1 ViewModel from route args.
- ui/navigation: Dest route table (string-based; no serialization plugin)
+ FloretNavHost (lists -> task list -> detail / edit).
- Base scaffolds for TaskListScreen, TaskDetailScreen, TaskEditScreen,
wired to their ViewModels — skeletons for the rich M2/M3 UI.
- RootScreen READY branch now hands off to FloretNavHost.
- Add navigation-compose 2.9.0; supporting strings.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a grounded doc set under docs/ plus a root CONTRIBUTING.md:
- docs/ARCHITECTURE.md: current code shape (layers, data seam, provider
resolution, reminder engine, DI, build/tooling, manifest)
- docs/ROADMAP.md: status view (M0/M1 done, M2 in progress, open decisions)
- docs/RELEASING.md: tag-driven release flow, CI jobs, F-Droid repo, secrets
(was referenced by build.gradle.kts and CHANGELOG but missing)
- docs/README.md: docs index and how the docs relate
- CONTRIBUTING.md: build/test/lint, layer rules, style, PR conventions
Also refresh the stale "M0 — skeleton" status note in README.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reduce the home top bar to MediumTopAppBar, and make the smart-list tiles
expressive subtly — clean tonal cards whose corners gently morph rounder on
press (matching the lists' shape behaviour), rather than loud silhouettes.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copy Calendula's GroupedRow (connected surface segments, press-morph corners)
and the circular colour chip into Floret's ui/common, and render the lists with
them: full-width rows, 72dp height, 2dp connect-gap, ListColorChip (pastelised
list colour + checklist glyph). Shared identity across the two apps.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Restore the smart cards to their original size/typography (they were right)
and put the expressive scale-up where it was actually wanted — the list rows:
titleLarge names, 16dp colour dots, taller padded rows in the surface card.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bigger smart tiles (160dp, 28dp corners, displaySmall hero counts, larger
icons, 20dp padding, 12dp gaps); list group cards use extra-large (28dp)
corners and surfaceContainerHigh for more presence.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Per-account lists now render inside rounded surfaceContainer cards
(grouped-list pattern) with inset dividers and transparent rows, instead
of bare ListItems on the background — surfaces-first per design feedback.
- Add debug-only DemoSeeder (local, non-syncing 'Floret Demo' list) behind
BuildConfig.DEBUG + an intent extra, to populate the UI for design review.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
First real screen replacing the scaffold: LargeTopAppBar, smart-list cards
in a 2x2 grid with correct tonal pairings (Today=primary, Overdue=error,
Upcoming=tertiary, All=secondary containers), user lists grouped by account
with colour dots + open counts, and an Extended FAB. Consumes the live
ListsViewModel; navigation callbacks stubbed for the next screens.
Verified on device against real tasks.org/DAVx5 data.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
On-device smoke test (tasks.org, which bundles an older OpenTasks provider)
hit SQLITE_ERROR 'no such column: is_recurring' — that column and
distance_from_current don't exist in every provider version. Query all
columns (projection=null) and let the by-name mapper read what's present
(absent -> null); the repository re-sorts, so no provider sort column is
needed either. Verified live: reads the real tasks.org/DAVx5 provider
(1 list, 0 open tasks) with zero errors.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Non-visual stack (backoffice) complete and verified against the real
provider semantics (tasks.org's bundled dmfs TaskProvider, authority
org.tasks.opentasks, org.tasks.permission.* dangerous):
- TaskContract subset + ProviderResolver (runtime authority/permission)
- AndroidTasksDataSource (Instances query, ContentObserver) + TasksRepository
with live Flows; domain models, smart-list filtering, sorting, form validation
- Self-scheduled due-reminder engine (AlarmManager, boot/provider-change)
- Render-only ViewModels + UiState for every screen
- 24 JVM unit tests; assembleDebug + lintDebug + testDebugUnitTest green
- RootScreen is a functional scaffold over real data, to be replaced with the
Material 3 Expressive screens one by one
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sibling to Calendula. Pure front-end posture; TaskContract data layer,
task screens and reminder engine to follow (see docs/PLAN.md).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>