From 4765b8e0886d4ef6c52e593fe6179a07183da3b6 Mon Sep 17 00:00:00 2001 From: Jean-Luc Makiola Date: Thu, 22 Oct 2026 08:39:07 +0200 Subject: [PATCH] fix(screensaver): keep both screen saver activities out of the app's task The settings screen Android's screen saver list opens gets a task of its own and stays out of recents, so it never lands in or clears the app's task, and its bars follow the app's theme. The on-demand screen saver is noHistory, so leaving it by Home does not bring the app back to it later, and it only touches the keep-screen-on flag when charging starts or stops. The next-alarm line uses the same 12/24-hour rule as the big readout, joined to the day by a translatable string; the minute's crossfade shows the old minute fading out rather than two copies of the new one. --- app/src/main/AndroidManifest.xml | 11 +++++-- .../ui/screensaver/ScreenSaverActivity.kt | 5 +++ .../ui/screensaver/ScreenSaverContent.kt | 31 ++++++++++--------- .../ScreenSaverSettingsActivity.kt | 18 ++++++++--- app/src/main/res/values/strings.xml | 2 ++ docs/ARCHITECTURE.md | 2 +- 6 files changed, 47 insertions(+), 22 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a3e159b..9bcbaa5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -295,18 +295,25 @@ + and changes nothing a user could not change in-app. A task of its + own and out of recents, so opening it from Settings never lands + in, or clears, the app's own task. --> + app cannot start the system's dream itself. Not exported, and + no history: leaving it by Home or Recents finishes it, so the app + never comes back to a dim screen saver instead of its tabs. --> Next alarm: %1$s + + %1$s %2$s More options Why might my alarm not ring? Why might my alarm not ring? diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 800dc31..057619a 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -98,7 +98,7 @@ kit module: the kit's roadmap keeps schedulers app-local. | `domain/format/` | `ClockFormat` (`M:SS` / `H:MM:SS`, countdowns rounded up, elapsed truncated), `NextFire` (`NextFireLabel` + `NextFireFormat`), the alarm row's "in 9h 12m" as data, and `StopwatchFormat`, the hundredths readout, split into a major field and two digits so the fraction can be drawn smaller | | `domain/backup/` | `BackupContent` (M10): the plain Kotlin model between `data/backup`'s JSON codec and the repository/engine; decoupled from the wire DTOs the same way the data layer is decoupled from Room | | `domain/selfcheck/` | `SelfCheck` (M10): the "why might my alarm not ring?" rule table: pure functions over a `DeviceState` snapshot, each producing a `CheckResult` with a status and an optional deep-link `SelfCheckFix` | -| `domain/screensaver/` | the screen saver's pure half (issue #25): `ScreenSaverSettings` (style and night mode) and `ScreenSaverDrift`, the once-a-minute burn-in position as fractions of the free space, derived from the minute alone | +| `domain/screensaver/` | the screen saver's pure half (issue #25): `ScreenSaverSettings` (style and night mode), `ScreenSaverDrift`, the once-a-minute burn-in position as fractions of the free space, derived from the minute alone, and `ScreenSaverAlarmDay`, which dates a next alarm a week or more away rather than naming its weekday alone | | `domain/widget/` | the three widget presenters (M10), `NextAlarmWidgetModel`/`TimerWidgetModel`/`ClockWidgetModel`: selection and formatting only, so a widget's content is unit-tested without Glance | | `data/db/` | `ClockulaDatabase` (`@Database` v3, `exportSchema = true`) and `Migrations` | | `data/alarms/` | the alarm and ring-state entities, DAOs, mappers and repositories |