docs(train): Health Connect through Kotlin of our own (ADR 0030, D30)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-28 16:27:12 +01:00
commit 2fae7e4f3b
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -1,6 +1,6 @@
# ADR 0030: Halkyon Train, what it does and where its data comes from
- **Status:** decided 27–28 Oct 2026, by the developer (D1–D29 below). The shell (D12)
- **Status:** decided 27–28 Oct 2026, by the developer (D1–D30 below). The shell (D12)
is built; recording (D13–D28) is built on Android, iOS waiting for a Mac; Health
Connect (D29) comes next.
- **Numbering:** 0025 is held by the federation draft (stashed), 0026–0029 by the .NET
@ -473,6 +473,17 @@ Strava. What was found, 27 Oct:
firmware, and new kinds of data (daily activity, sleep, 24/7 heart rate, Nightly
Recharge) with synced models of their own; it is tried only with the band at hand.
The intervals (D2) need neither.
- **D30 Health Connect through Kotlin of our own** (recommended, the developer's; revises
D6's `health` package, as D26 revised D5): `androidx.health.connect:connect-client`
(Apache-2.0, AndroidX, no Play services) behind a channel of Train's, as the strap's.
The `health` package (13.3.2) lacks power, cadence, elevation gained, distance and
speed as records of their own, ties no heart rate to its session, has no changes API
(so each read would be a whole window read again) and sets no client record ID (so a
workout written again would be a second copy, not a replacement). Our own gets every
record type, the changes API, Train's workout ID as the client record ID (written
again replaces, deleted deletes) and each record's origin. Its logic is tested on the
JVM, the Dart side on a fake platform; Apple Health needs Swift of its own later,
as iOS waits for a Mac anyway (D25).
## Consequences