Settings: units, wheel circumference, HR alerts, auto-pause, vibration #44

Closed
opened 2026-08-31 17:14:53 +02:00 by robert · 1 comment
robert commented 2026-08-31 17:14:53 +02:00 (Migrated from git.butzei.de)

Goal

The knobs worth exposing, on the phone where there is a real keyboard.

Acceptance criteria

  • Metric and imperial units
  • Wheel circumference with presets and a manual value
  • Heart rate zones and optional alerts
  • Auto-pause threshold and toggle
  • Vibration intensity, including off
  • Auto-switch-to-nav-view toggle
  • Settings persisted and pushed to the watch on connect

Files

  • companion/.../settings/

Update — 2026-09-01: auto-pause behaviour moves to #69

FR-M8 sat here as "behaviour not yet specified" while #17 in Phase 2 already needed stop detection for
moving time and the moving average. One definition, in Phase 2, in #69 (D35).

  • This issue keeps only the setting that turns auto-pause on and off; the behaviour is #69's
  • HR zone configuration here feeds HR_ZONE in #65 — unconfigured zones render --, never a
    guessed default

Update — 2026-09-02: voice announcements setting

  • Voice turn announcements on/off (default off), feeding the new Phase 3 announcer issue
    (FR-N19, D45)
## Goal The knobs worth exposing, on the phone where there is a real keyboard. ## Acceptance criteria - [ ] Metric and imperial units - [ ] Wheel circumference with presets and a manual value - [ ] Heart rate zones and optional alerts - [ ] Auto-pause threshold and toggle - [ ] Vibration intensity, including off - [ ] Auto-switch-to-nav-view toggle - [ ] Settings persisted and pushed to the watch on connect ## Files - `companion/.../settings/` ## Update — 2026-09-01: auto-pause behaviour moves to #69 FR-M8 sat here as "behaviour not yet specified" while #17 in Phase 2 already needed stop detection for moving time and the moving average. One definition, in Phase 2, in #69 (D35). - [ ] This issue keeps only the **setting** that turns auto-pause on and off; the behaviour is #69's - [ ] HR zone configuration here feeds `HR_ZONE` in #65 — unconfigured zones render `--`, never a guessed default ## Update — 2026-09-02: voice announcements setting - [ ] Voice turn announcements on/off (default **off**), feeding the new Phase 3 announcer issue (FR-N19, D45)
Owner

Closed by PR #91 (merged): RideSettings/SettingsRepository (pure JVM, :companion:core, 16 host tests) over a SharedPreferences-backed storage adapter in a new :companion:settings module. Units, wheel circumference (presets verified via WebSearch against an ETRTO-derived chart), HR zone boundaries + alerts toggle, auto-pause on/off only (behaviour is #69 per the issue's own 2026-09-01 update), vibration intensity, auto-switch-to-nav-view, and voice announcements (default off, #45) are all persisted and validated. Most have no consumer yet \u2014 stated explicitly per-setting in the PR: nothing reads vibration/auto-switch/voice-announcements settings yet, and PROTOCOL.md defines a wire shape for UNITS only, with no AppMessage send path built anywhere in the app yet to push any setting to the watch.\n\nActually build-verified, not just hand-reviewed: Robert set up a local Android SDK tonight; ran a real ./gradlew :companion:assembleDebug against this branch and caught one real bug the sandbox couldn't \u2014 SettingsScreen's Scaffold/TopAppBar calls needed @OptIn(ExperimentalMaterial3Api::class), a Kotlin compile error, not a warning (same class of bug as #25/PR #92). Fixed and reverified: :companion:assembleDebug succeeds, :companion:core:test passes 112/112 for real via the actual Gradle test runner.

Closed by PR #91 (merged): RideSettings/SettingsRepository (pure JVM, :companion:core, 16 host tests) over a SharedPreferences-backed storage adapter in a new :companion:settings module. Units, wheel circumference (presets verified via WebSearch against an ETRTO-derived chart), HR zone boundaries + alerts toggle, auto-pause **on/off only** (behaviour is #69 per the issue's own 2026-09-01 update), vibration intensity, auto-switch-to-nav-view, and voice announcements (default off, #45) are all persisted and validated. Most have no consumer yet \u2014 stated explicitly per-setting in the PR: nothing reads vibration/auto-switch/voice-announcements settings yet, and PROTOCOL.md defines a wire shape for UNITS only, with no AppMessage send path built anywhere in the app yet to push any setting to the watch.\n\n**Actually build-verified, not just hand-reviewed**: Robert set up a local Android SDK tonight; ran a real `./gradlew :companion:assembleDebug` against this branch and caught one real bug the sandbox couldn't \u2014 `SettingsScreen`'s `Scaffold`/`TopAppBar` calls needed `@OptIn(ExperimentalMaterial3Api::class)`, a Kotlin compile error, not a warning (same class of bug as #25/PR #92). Fixed and reverified: `:companion:assembleDebug` succeeds, `:companion:core:test` passes 112/112 for real via the actual Gradle test runner.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
robert/PedalPebble#44
No description provided.