3.1 KiB
3.1 KiB
Changelog
All notable changes to Clockula are documented here.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
Tag sections feed the release notes — see docs/RELEASING.md.
[Unreleased]
Added
- Project skeleton: Gradle build, version catalog, Hilt, Compose and the Material 3
Expressive theme over floret-kit's
identitymodule, 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 viacore-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.mdanddocs/ROADMAP.md. - Preferences over floret-kit's new
core-prefs:SettingsPrefsholds 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-disupplies the@IoDispatcherthe 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_clocksandstopwatch_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.