You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Lands the Health Connect plumbing without yet pulling the SDK or
reading any data — the toggle, the user-facing UI, and the privacy
narrative all ship now so the follow-up release that adds the
androidx.health.connect:connect-client integration can light up
immediately for opted-in users and ship behind a Play Console health-
permissions policy review.
Wiring (N12 scaffold):
- AppSettings.healthConnectEnabled (default false). DataStore key
HEALTH_CONNECT_ENABLED; read/write mappings symmetric with the rest
of AppSettings.
- SettingsBackup.healthConnectEnabled with default 0 (back-compat
read). Round-trips through both plain JSON and AES-256 encrypted
backup paths so opt-in survives device swaps.
- SettingsViewModel.updateHealthConnectEnabled(enabled) setter.
- New HealthConnectSection in SettingsScreen, placed between
PhilipsHueSection and PersonalizationSection. Flavor-aware copy:
Play-flavor users see the read-sleep-sessions pitch; F-Droid users
see "this flavor does not ship Health Connect — install Play to opt
in" honest disclosure.
Documentation (N13):
- PRIVACY_POLICY.html gains a "Health Connect (Play flavor, opt-in)"
section that spells out:
* What's read (SleepSessionRecord only — start/end + optional
stage breakdown for past 7 days).
* Where it stays (on device — Health Connect's encrypted store +
app DataStore; no analytics SDK; no transmission).
* Revocation flow (in-app toggle or Health Connect settings).
* F-Droid behaviour (no SDK shipped; toggle is a no-op).
* Google Play Health Apps policy use-case statement
("wellness / sleep tracking only; never for employment or
insurance eligibility; never shared").
- Satisfies the documentation prerequisite for the Play Console
health-permissions declaration so the follow-up release that wires
the actual SDK can submit for review without surprises.
Deferred to a follow-up release:
- The actual androidx.health.connect:connect-client dependency,
HealthConnectGateway interface, the read-permission handoff to the
Health Connect Settings screen, and the Bedtime/Stats data
surfacing. The roadmap entry for N12 is marked [~] (in progress)
with this scaffold complete; N13 is marked [x] (shipped).
Internal: versionCode 65 → 66, versionName 1.13.0 → 1.13.1. Verified
the v1.12.3 CI version-line lint passes against the new tree (all six
anchors report 1.13.1).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: PRIVACY_POLICY.html
+10Lines changed: 10 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -63,6 +63,16 @@ <h2>Data Storage</h2>
63
63
<h2>Third-Party Services</h2>
64
64
<p>The app does not integrate with any third-party analytics, advertising, or tracking services. The only external service used is the Open-Meteo weather API, which is free, open-source, and does not require authentication.</p>
65
65
66
+
<h2>Health Connect (Play flavor, opt-in)</h2>
67
+
<p>The Play-flavor build includes an opt-in toggle to read sleep session data from Android's Health Connect (Settings → Health Connect → "Allow reading sleep sessions"). When you enable the toggle and grant the Health Connect permission prompt:</p>
68
+
<ul>
69
+
<li>The app reads <strong>SleepSessionRecord</strong> entries (start time, end time, optional sleep stage breakdown) for the past 7 days to surface "Last night you slept X hours" context on the Bedtime tab and to drive future Stats charts.</li>
70
+
<li>All Health Connect data stays on your device. It is not uploaded, transmitted, shared with the developer, or persisted outside Health Connect's own encrypted store and the app's local DataStore preferences. There is no analytics SDK that could exfiltrate it.</li>
71
+
<li>You can revoke access at any time via Health Connect (Settings → Apps → Health Connect → Manage permissions) or by toggling the in-app switch off. Revoking immediately stops further reads; previously displayed values clear on next launch.</li>
72
+
<li>The F-Droid flavor does not include the Health Connect SDK at all. The toggle is visible but has no effect on F-Droid builds.</li>
73
+
<li>Per the Google Play Health Apps policy (April 2026), AlarmClockXtreme uses Health Connect sleep data only for the "wellness / sleep tracking" use case stated above. It is never used to determine employment or insurance eligibility, and it is never shared.</li>
74
+
</ul>
75
+
66
76
<h2>Children's Privacy</h2>
67
77
<p>This app does not knowingly collect any information from children under 13. The app does not collect information from anyone.</p>
**Latest signed APK** — [Releases page](https://github.com/SysAdminDoc/AlarmClockXtreme/releases/latest)
16
16
17
17
```
18
-
adb install AlarmClockXtreme-v1.13.0-play.apk
18
+
adb install AlarmClockXtreme-v1.13.1-play.apk
19
19
```
20
20
21
21
The Play-flavor APK includes the YouTube alarm-sound downloader (yt-dlp + NewPipe Extractor) and the Wear OS Data Layer bridge. The F-Droid flavor strips those proprietary pieces for an unencumbered build.
-**Surface area:** 120 Kotlin files in `:app` + 3 in `:wear`, two phone
52
53
flavors (`play`, `fdroid`), **22 user-facing dismiss challenges** (all now
53
54
whitelisted by `Alarm.sanitized()` after N1), 50+ alarm fields, 35+
@@ -82,8 +83,8 @@ in their notes. **Order is the recommended landing order.**
82
83
| N9 |[x] RingtonePool chip-based editor — **shipped v1.12.2.** Replaced the textarea with a horizontally scrollable chip row in the Advanced section. Each pool URI renders as an `AppFilterChip` (tap to remove); an "Add" chip opens an `AlertDialog` for pasting a new URI with duplicate-protection. New `ringtoneShortName(uri)` helper trims content://media/external/audio/media/12345 → "audio/12345" without a per-render ContentResolver lookup. Storage format unchanged. | local: [AlarmEditScreen.kt:1247](app/src/main/java/com/sysadmindoc/alarmclock/ui/alarmedit/AlarmEditScreen.kt)| S | UX polish, no schema change. |
83
84
| N10 |[x] CI version-line consistency lint — **shipped v1.12.3.** New `.github/workflows/version-lint.yml` runs on every push/PR. Asserts six touchpoints agree with `app/build.gradle.kts`: the `:wear` module's `versionName`, the README badge, the README `adb install` snippet, the CHANGELOG top `## [x.y.z]` header, and the ROADMAP `## Current snapshot (vX.Y.Z)` header. Pure regex/grep — no JDK/Gradle bootstrap. | local: [.github/workflows/version-lint.yml](.github/workflows/version-lint.yml)| S | Prevents the recurring "README still says vX.Y.Z" post-release mismatch. |
84
85
| N11 |[x] Adaptive primary navigation — **shipped v1.13.0.** Used the lower-level `material3-window-size-class` API rather than `NavigationSuiteScaffold` so the existing custom `BottomNavContainer` treatment + accent colors carry through unchanged on phones. AppNavigation branches on width class: COMPACT keeps the bottom NavigationBar verbatim, MEDIUM/EXPANDED render a `NavigationRail` on the leading edge inside a Row. Extracted the per-route NavHost into a private `AppNavHost` to dedupe. |[Android Developers — adaptive navigation](https://developer.android.com/develop/ui/compose/layouts/adaptive/build-adaptive-navigation)| M | Phone UX is byte-for-byte identical. Defers dual-pane Alarms/Edit (X14 follow-on) to a later release. |
85
-
| N12 |[] Health Connect Sleep Sessions — **read-only first pass**(write deferred to v1.13). Pulls overnight sessions to seed Bedtime tab + Stats; user data never leaves device. |[androidx.health.connect:connect-client docs](https://developer.android.com/health-and-fitness/health-connect); [Track sleep sessions](https://developer.android.com/health-and-fitness/health-connect/features/sleep-sessions)| M |Required pre-work: Play Console health-permissions declaration + privacy-policy refresh (see N13). API surface is stable at `1.1.0-alpha12`; pin behind Play flavor only at first, then move main once Google removes alpha gating. |
86
-
| N13 |[] Play Store data-safety + health-permission declaration refresh — required by [April 2026 policy](https://support.google.com/googleplay/android-developer/answer/16926792?hl=en) before N12 ships. Update `PRIVACY_POLICY.html`Health-Connect paragraph. |[Play Console policy April 15 2026](https://support.google.com/googleplay/android-developer/answer/16926792?hl=en)| S |Hard prerequisite for N12. Document the read-only justification ("local-only sleep analysis; not transmitted off device"). |
86
+
| N12 |[~] Health Connect Sleep Sessions — **scaffold shipped v1.13.1.**DataStore opt-in toggle (`healthConnectEnabled`), Settings → Health Connect card with flavor-aware copy, backup round-trip. Actual `androidx.health.connect:connect-client` SDK integration + Bedtime/Statsdata surfacing deferred to a follow-up release pending Play Console health-permissions review. |[androidx.health.connect:connect-client docs](https://developer.android.com/health-and-fitness/health-connect); [Track sleep sessions](https://developer.android.com/health-and-fitness/health-connect/features/sleep-sessions)| M |Toggle survives backup so opted-in users light up immediately when the data path lands. |
87
+
| N13 |[x] Play Store data-safety + health-permission declaration refresh — **shipped v1.13.1.**`PRIVACY_POLICY.html` gains a "Health Connect (Play flavor, opt-in)" section spelling out the data type read (`SleepSessionRecord` only), retention (none), revocation flow, F-Droid behaviour (no SDK shipped), and the Google Play Health Apps policy use-case statement. |[Play Console policy April 15 2026](https://support.google.com/googleplay/android-developer/answer/16926792?hl=en)| S |Documentation prerequisite for the follow-up release that wires the SDK. |
val isPlayFlavor = com.sysadmindoc.alarmclock.BuildConfig.FLAVOR=="play"
1336
+
AppSurfaceCard {
1337
+
AppSectionTitle(
1338
+
title ="Health Connect",
1339
+
description =if (isPlayFlavor) {
1340
+
"Read overnight sleep sessions from Health Connect to enrich the Bedtime tab and Stats. The connection prompt opens the system Health Connect screen."
1341
+
} else {
1342
+
"The F-Droid flavor does not ship Health Connect support. Install the Play flavor to opt in."
1343
+
}
1344
+
)
1345
+
SettingsToggle(
1346
+
label ="Allow reading sleep sessions",
1347
+
checked = state.settings.healthConnectEnabled,
1348
+
supportingText =if (isPlayFlavor) {
1349
+
"Toggle on to grant Health Connect access (data integration ships in a follow-up release; toggle survives backup/restore so opted-in users light up immediately when it does)."
1350
+
} else {
1351
+
"Disabled on F-Droid. Toggle has no effect on this build."
1352
+
},
1353
+
onToggle = viewModel::updateHealthConnectEnabled
1354
+
)
1355
+
}
1356
+
}
1357
+
1321
1358
/**
1322
1359
* v1.2.0 personalization controls. Until this audit pass these settings
0 commit comments