Brings the branches the sibling apps actually ship from back onto main, so floret-kit stops forking per project. Merged in: - `vouch/settings` (what vouch pins), which already contains `feat/clockula` (what clockula pins) and `chore/deps-2026-10`: core-prefs, core-di, CollapsingScaffold FAB/no-back slots, the glance module, LocaleManager on API 33+, and the dependency bump - `feat/glance-module`: the three glance commits clockula's branch didn't have yet (progress ring/tile/check button, expressive shapes + header pill, WidgetDoneState) Both merged without conflicts. Version ends up at 0.7.0 (untagged). Heads-up for consumers: the deps bump moves the toolchain to Gradle 9.8.0 / AGP 9.4.1 / Kotlin 2.4.20. Since floret-kit is a composite build, a consumer must be on Gradle >= 9.6 to pin anything from here on. Calendula builds, tests and lints against this branch with just that toolchain bump, no source changes. Co-authored-by: Jean-Luc Makiola <business@jeanlucmakiola.de> Reviewed-on: https://codeberg.org/jlmakiola/floret-kit/pulls/11
84 lines
3.8 KiB
Markdown
84 lines
3.8 KiB
Markdown
# floret-kit — roadmap
|
|
|
|
What's extracted, what's deferred, and what's deliberately **not** shared. The
|
|
defer/skip calls come from a cross-app survey of both Calendula and Agendula —
|
|
the guiding rule is to share only what is genuinely common, and to keep
|
|
divergent or app-specific code where it lives.
|
|
|
|
---
|
|
|
|
## Extracted (done)
|
|
|
|
| Module | Type | Consumers |
|
|
|---|---|---|
|
|
| `core-time` | JVM | Agendula (and Calendula's pending branch) |
|
|
| `core-reminders` | JVM | Agendula (and Calendula's pending branch) |
|
|
| `core-locale` | Android | Agendula, Calendula |
|
|
| `core-crash` | Android | Agendula |
|
|
| `core-prefs` | Android | Clockula |
|
|
| `core-di` | JVM | Clockula |
|
|
| `identity` | Android | Agendula |
|
|
| `components` | Android | Agendula |
|
|
| `glance` | Android | Agendula (Calendula pending — its own M3 Expressive widget pass) |
|
|
|
|
See [`../CHANGELOG.md`](../CHANGELOG.md) for the contents of each.
|
|
|
|
### Follow-ups on what's extracted
|
|
|
|
- **Migrate Calendula and Agendula onto `core-prefs` + `core-di`** — Clockula
|
|
triggered the extraction (the third app that made the duplication hurt) and is
|
|
its only consumer today. Both siblings still carry their own `ThemeMode`,
|
|
`toEnum()` and `@IoDispatcher`. The stored key names are identical
|
|
(`theme_mode`, `dynamic_color`), so each migration is a code change with **no
|
|
data migration** — deliberately out of scope for the extraction, and done by
|
|
each sibling when it next re-pins the kit.
|
|
|
|
---
|
|
|
|
## Deferred / not yet worth it
|
|
|
|
- **`ReminderFormatting`** (`ReminderUnit` + `reminderLeadTimeLabel` +
|
|
`decomposeReminder`) — the labels are `@Composable` over app-specific
|
|
`R.plurals`, and the presets differ per app. Extract later behind a
|
|
**label/preset callback API**, not before.
|
|
|
|
## Deferred — needs migration first
|
|
|
|
- **`core-provider`** (the ContentProvider seam: `ColumnReader`, failures,
|
|
observer→Flow) — the two apps' `ColumnReader`s diverged (Calendula index-based,
|
|
Agendula name-based + null-safe). True sharing means migrating Calendula to the
|
|
better name-based design first (~a few hundred LOC), so it waits until Calendula
|
|
is actively on the kit.
|
|
|
|
## Not shared (by design)
|
|
|
|
- **A generic Settings scaffold** — the two apps' settings *domains* are too
|
|
divergent for a config-driven `SettingsScaffold` to stay readable. The win is
|
|
captured instead at the **component** level (shared `GroupedRow`/section
|
|
primitives + `CollapsingScaffold` + `OptionPicker`); each app composes its own
|
|
settings from those.
|
|
- **The reminder *scheduler*** — the shared `core-reminders` module is the
|
|
app-agnostic override *model* only (`ReminderOverride` + codec + unit model,
|
|
now multi-value). The *delivery* stays app-local: Agendula self-schedules
|
|
alarms (pull), Calendula is provider-event-driven (push) — opposite
|
|
architectures over incompatible data models, so forcing a shared scheduler
|
|
abstraction would be leaky. A tiny `core-notification` (idempotent channel
|
|
setup, `POST_NOTIFICATIONS` checks) *might* land later; schedulers stay
|
|
app-local.
|
|
- Domain-specific UI (date/time fields tied to a domain, calendar/timeline
|
|
widgets, recurrence text, domain pickers) and all string wording — these encode
|
|
each app's model and resist parameterization.
|
|
|
|
---
|
|
|
|
## Consumers & cadence
|
|
|
|
- **Agendula** consumes the kit on `main` (active development).
|
|
- **Clockula** consumes the kit on `main` (active development); the first
|
|
consumer of `core-prefs` and `core-di`.
|
|
- **Calendula** (ships via official F-Droid reproducible builds) has a pending
|
|
adoption branch. Bringing it onto the kit is where the canonical-`GroupedSurface`
|
|
convergence becomes visible, and where the F-Droid reproducibility checklist
|
|
(`submodules: true` in the recipe; the repro guard scanning the submodule)
|
|
applies — see [`ARCHITECTURE.md`](ARCHITECTURE.md) §2 and §5.
|