feat(train): record a ride indoors, without GPS (ADR 0030, D66)

A home trainer's or an exercise bike's ride had no place: Cycling waits
for GPS and pauses by speed. Cycling indoors needs no GPS, route or
device: the time, then whichever strap, speed and cadence sensor or
power meter there is. It goes to Health Connect as stationary biking,
and another app's stationary ride comes in as one.

With no GPS, steps or device the recorder has no foreground service
type, which Android 14 on doesn't allow, so it asks for the physical
activity permission and doesn't start without it.

Whats-New: Record a ride on a home trainer or exercise bike with Cycling indoors, without GPS.
Whats-New-De: Zeichne eine Fahrt auf dem Heimtrainer mit Radfahren drinnen auf, ganz ohne GPS.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-05 16:47:23 +01:00
commit 3bd49920db
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -1744,6 +1744,31 @@ Strava. What was found, 27 Oct:
across runs (`heartByMinute`, a second between a run's samples), not one mean a
run, which zigzagged where runs lay close. Dropping the zeros from the list was
the alternative; it would have moved the later samples' times.
- **D66 Rides indoors** (the developer's, 5 Nov 2026; the details the agent's): a
home trainer's or an exercise bike's ride had no place: *Cycling* waits for GPS and
its auto-pause goes by speed. *Cycling indoors* (`Activity.indoorCycling`, stored by
name, so no migration; an older app skips such a workout) records without GPS, as a
row does, with no route and no announcements, and needs no device: time, then the
strap's or the Loop's heart rate and the bike's speed and cadence sensor or power
meter where there are any. `rides` holds what both rides share (the sensors, speed
rather than pace, splits of 5 km).
- **No auto-pause**: without GPS, a wheel or a machine nothing tells a ride from a
rest, so the sheet doesn't offer it and pausing is by hand. By a sensor's crank
or wheel it could come later.
- **The service's type**: with no GPS, no steps and no device a recording has no
foreground service type, which Android 14 on doesn't allow an app targeting it. A
ride indoors asks for the physical activity permission, which allows the `health`
type, and doesn't start without it (`activityRefused`). Asked only where no sensor
is chosen was the alternative: it would need the app to know whether a chosen
device's permission still holds.
- **Health Connect and exports**: it is written as `BIKING_STATIONARY`, and another
app's stationary ride now comes in as a ride indoors, not a ride; those brought in
before stay as they are. FIT says cycling, indoor cycling (2, 6); TCX `Biking`.
- **The Sportstech SX200**: no FTMS driver now. The product page says "Bluetooth-
compatible" without a standard, retailers name Kinomap and iConsole+, and the
developer's Bluetooth scan showed nothing of it (5 Nov 2026). Indoor Bike Data
(`0x2AD2`) waits for a machine that shows it, a frame recorded, as D8's did.
## Consequences
- Train's sensors are one pattern: open profiles read by the app itself, on the phone;