Skip to content

feat(power): move Power saving into More (between Test Centre and Settings), offer 35% - #1431

Merged
ryanbr merged 1 commit into
mainfrom
feat/power-saving-in-more
Aug 18, 2026
Merged

ryanbr merged 1 commit into
mainfrom
feat/power-saving-in-more

Conversation

@ryanbr

@ryanbr ryanbr commented Aug 18, 2026

Copy link
Copy Markdown
Owner

Power saving was one card buried mid-scroll in Settings. It now has its own screen, reachable where people actually look for it when a strap is running down — plus a higher threshold ceiling.

Where it moved

Shell Placement
iPhone A first-class More row, between Test Centre and Settings
Android The same row in the More page's App group, between Test Centre and Settings
macOS Its own sidebar item next to Settings (that shell has no More page)

macOS keeps it inside the one "Data & App" group, so MoreListParityTests' every-NavItem-is-reachable-in-exactly-one-group contract still holds.

Kick-in ceiling 30% → 35%

The "Kick in at (strap battery)" slider now offers 10–35 in 5s (was 10–30). Engaging one step earlier in the discharge buys roughly another 5% of strap life, at the cost of a slightly longer quiet stretch. Both platforms; Android's steps went 3 → 4 to keep the 5% snapping.

Note this does not touch clampIdleThrottlePct (0 or 10..30) — that guards the separate, dormant idle-throttle lever (#478), which keeps its own range and risk profile.

Otherwise a pure surface move

The controls, their prefs and their wiring are unchanged. applyPowerSaving() still reads every value from PuffinExperiment / NoopPrefs on both platforms, so relocating the screen cannot alter behaviour, and the master still gates its three sub-options (threshold, Pause HRV capture, Low refresh).

Parity

Same feature, same controls, same order relative to Settings on all three shells; new screens are twins (PowerSavingView / PowerSavingScreen) extracted from the same card. New copy localized de/es/fr/pl/pt-PT (iOS catalog) and de/es/fr/pl/pt-PT/zh (Android), including the new nav label.

Validation

  • Full Android suite: 4,042 tests, 0 failures; compileFullDebugKotlin + processFullDebugResources (aapt) clean.
  • Tools/i18n_audit.py --ci green; doc_comment_lint.py green.
  • Apple half is app-target Swift → app-build (both legs) is the validator; dispatched for this branch.

@ryanbr
ryanbr force-pushed the feat/power-saving-in-more branch from b48d4c6 to 9927725 Compare August 18, 2026 11:42
…nd offer 35%

Power saving was one card buried mid-scroll in Settings. It is now its own
screen, reachable where people look for it when a strap is running down:

- iPhone: a first-class More row between Test Centre and Settings.
- Android: the same row in the More page`s App group, between Test Centre and
  Settings.
- macOS: its own sidebar item next to Settings (that shell has no More page; it
  stays inside the one Data & App group so the every-NavItem-is-grouped contract
  in MoreListParityTests still holds).

Also raises the "Kick in at (strap battery)" ceiling from 30% to 35% (10-35 in
5s), so the levers can engage one step earlier in the discharge and buy roughly
another 5% of strap life, at the cost of a slightly longer quiet stretch.

Pure surface move otherwise: the controls, their prefs and their wiring are
unchanged. applyPowerSaving() still reads every value from PuffinExperiment /
NoopPrefs on both platforms, so relocating the screen cannot alter behaviour, and
the master still gates its three sub-options.
Re-review cleanup: removing the card left four now-unused state vars in the
Android SettingsScreen (they still read SharedPreferences on every composition)
and a hole at index 4 in the iOS staggeredAppear sequence, which lengthened the
pause before the next card. Both closed.
Re-review also caught the Android half of the 35% bump silently not applying:
the edit matched on the wrong indentation, so the comment claimed 10-35 while
valueRange stayed 10f..30f / steps = 3 - a comment that lied AND a parity break
against the iOS slider. Both values corrected and pinned by a behavioural diff
of the moved code: the only differences between the old card and the new screen
are the slider range/steps and the new screen title. Every toggle, binding,
callback and pref key is byte-identical.

New copy localized de/es/fr/pl/pt-PT (iOS catalog) and de/es/fr/pl/pt-PT/zh
(Android). Full Android suite 4042 tests green, aapt + i18n --ci + doc-comment
lint green; app-build green on both legs.
@ryanbr
ryanbr force-pushed the feat/power-saving-in-more branch from 9927725 to 72672d0 Compare August 18, 2026 11:55
@ryanbr
ryanbr merged commit 73acce8 into main Aug 18, 2026
5 checks passed
@ryanbr
ryanbr deleted the feat/power-saving-in-more branch August 18, 2026 12:04
ryanbr added a commit that referenced this pull request Aug 18, 2026
Build numbers only. MARKETING_VERSION / versionName stay 10.1.1 — the staging
line is one above the latest release (v10.1.0) and holds there until 10.1.1
actually ships.

versionCode 341 -> 342 and CURRENT_PROJECT_VERSION 223 -> 224, both +1 past the
previous staging build so a sideloaded update installs in place rather than
being refused as a downgrade.

Picks up since the last testing build (f2271cd): backup build provenance
(#1422), the CTL/ATL/TSB training-load engine (#1423) and its Trends card
(#1425), sleep-vs-wake HR contrast (#1424), the v20 optical decoder + CRC gate
(#895), the Sleep UI split (#1426), the WHOOP4 clock-correlation fix (#1427),
the settings waist-row layout + copy fix (#1428), hourly Apple step import
(#1429), Low refresh (#1430), and Power saving moving into More with a 35%
ceiling (#1431).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant