52 lines
3.1 KiB
Markdown
52 lines
3.1 KiB
Markdown
# Changelog
|
|
|
|
All notable changes to Clockula are documented here.
|
|
|
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
Tag sections feed the release notes — see [`docs/RELEASING.md`](docs/RELEASING.md).
|
|
|
|
## [Unreleased]
|
|
|
|
### Added
|
|
- Project skeleton: Gradle build, version catalog, Hilt, Compose and the Material 3
|
|
Expressive theme over floret-kit's `identity` module, seeded `#6B7A5C` — the
|
|
third 120° hue rotation of Calendula's slate, completing the family's palette.
|
|
- floret-kit as a git submodule wired in as a Gradle composite build.
|
|
- Crash capture and the report surface via floret-kit's `core-crash`; per-app
|
|
language support via `core-locale`.
|
|
- Launcher and notification icons: a line-art clock face carrying the family's
|
|
Calendula bloom badge.
|
|
- Full release pipeline, Codeberg-canonical from the first commit — CI,
|
|
translations, release (F-Droid repo + Codeberg release + Google Play) and
|
|
Renovate, with the F-Droid reproducibility rules intact.
|
|
- The locked specification: `docs/PLAN.md` and `docs/ROADMAP.md`.
|
|
- Preferences over floret-kit's new `core-prefs`: `SettingsPrefs` holds the
|
|
appearance slice (theme mode, dynamic colour) in a DataStore of Clockula's own,
|
|
under the family's key names. The theme now follows the stored preference —
|
|
light/dark override and dynamic colour persist across launches instead of
|
|
always following the system — and an unrelated preference write no longer
|
|
re-emits it.
|
|
- floret-kit's `core-di` supplies the `@IoDispatcher` the preference store runs
|
|
on, so Clockula no longer declares its own dispatcher qualifier.
|
|
- Clockula's own storage, headless: a Room database with `alarms`, `timers`,
|
|
`world_clocks` and `stopwatch_laps`, its version-1 schema exported and
|
|
committed so every future migration is reviewable and testable.
|
|
- Plain-Kotlin alarms, timers, world clocks and stopwatch runs behind four
|
|
repository interfaces exposing Flows — nothing above the data layer knows Room
|
|
exists, and a test fails the build if anyone reaches through. A corrupt row
|
|
degrades on read (a clamped time, an unknown ringtone, a rotted zone id)
|
|
rather than crashing the list it appears in.
|
|
- Alarm and timer settings are inherited, not copied: a per-alarm ringtone,
|
|
snooze, vibrate, volume ramp or dismiss challenge is an *override*, so
|
|
changing an app default later reaches every alarm the user never customised.
|
|
- The clock defaults and the stopwatch's running state now live in DataStore
|
|
alongside the appearance preferences, clamped on read as well as on write, so
|
|
a hand-edited or restored file cannot produce a setting the user could never
|
|
have chosen.
|
|
- The wall-clock / elapsed-realtime split, made explicit: alarm records follow
|
|
the system clock, while running timers and the stopwatch are anchored to time
|
|
since boot. Changing the device's time — forwards or backwards — cannot warp
|
|
either, and a timer that survives a reboot falls back to its wall-clock
|
|
estimate and says so instead of vanishing.
|