Skip to content

6.2#370

Merged
jonasbark merged 109 commits into
mainfrom
6.2
Jun 28, 2026
Merged

6.2#370
jonasbark merged 109 commits into
mainfrom
6.2

Conversation

@jonasbark

Copy link
Copy Markdown
Collaborator

No description provided.

jonasbark and others added 30 commits June 19, 2026 13:24
These keys existed only in the en template (so non-English users saw the
English fallback): the battery-saver alert (reconnect, batterySaverTitle,
controllersDisconnectedInactivity), the trainer overlay settings
(overlay* — 15 keys), virtualShiftingHint, and noConnection /
noConnectionHint. Added to all five locales, keeping established
terminology (Virtual Shifting, ERG, Trainer-App/app di allenamento/...)
and the {minutes} and {trainerApp} placeholders with their @meta.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Drops the standalone services block (debugText already emits it per-proxy)
and adds a mounted guard after the now-slower debugText await.
debugText now runs a multi-second mDNS scan. Stop awaiting it before
navigating — kick it off as a future, open the chat immediately, and let
SupportChatPage await it lazily for the diagnostic preview and at send time.
Add frontShiftEnabled, smallChainringTeeth, and largeChainringTeeth fields
to ShiftingConfig with defaults (false, 34, 50) and proper serialization.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add frontShift case to handleTrainerAction: ERG mode returns Ignored,
disabled returns Ignored, sim mode toggles front ring and returns
Success with large/small ring message. Add 3 ARB keys (6 locales) and
4 TDD tests in the consolidated test file.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
jonasbark and others added 22 commits June 25, 2026 15:40
The fork's `changes` branch was rebased onto upstream universal_ble 2.1.0
and reduced to the single iOS/macOS background-connect Swift patch. The
Windows shared-mode/hresult fixes and addServicesInScanResponse have all
landed upstream, so they are no longer carried by the fork.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Regression tests for the "Advertising has already started" fix (shared by
the OpenBikeControl and Zwift BLE emulators): unrelated/null errors are
ignored, an already-advertising collision stops then restarts once, the
match is case-insensitive, and the re-entrancy guard prevents a restart
loop on a persistent error.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…bler

Extract the OpenBikeControl app-info fragment-stitching out of the BLE
emulator's write handler into a small, behavior-preserving AppInfoReassembler
so it can be unit-tested directly (the emulator's startServer() is otherwise
only reachable through the live peripheral platform).

Adds regression tests for the multi-packet app-info write (TrainingPeaks on
macOS), including the three-fragment case the previous single prior-fragment
buffer dropped — it kept only the first failed fragment, so a message split
across three packets never reassembled.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ailleur"

The toggle named the SRAM AXS input gesture (press both shifters) rather
than what the feature actually is — a virtual second chainring. Rename the
label across all 6 languages and move the both-paddles / SRAM-AXS detail
into the description.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ctive

With the virtual front derailleur on, the compact gear readout switches
from rear gear/total (14/25) to head-unit-style front×rear position
notation (small ring 1×N, large ring 2×N, e.g. 2×14) — matching how
Garmin/Wahoo display Di2/AXS gearing. With it off, it stays 14/25.

- Add tested formatGearReadout helper.
- Wire into the proxy card, debug menu, desktop second window + Android
  PiP/overlay (trainer_overlay_view), and the gear hero card (2× · 50T).
- Carry frontShiftEnabled + frontRingLarge through TrainerOverlayState
  (json, ==, hashCode, activity map) so the snapshot reaches the overlay
  and the iOS surfaces.
- iOS PiP + Live Activity: format 2×N centrally in GearSnapshot.
- Standardize the off-state readout to 14/25 across all surfaces.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Align the 6.2 entry with the new wording and the 2×N gear notation.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Equal-width leading/trailing slots keep the primary readout centred
whether or not the app icon / drag handle is shown; the container's
horizontal padding is now symmetric and the bottom row no longer carries
an extra inset — so the value lines up over the metrics row.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Extract FrontShiftCard from the gear-ratios page so it can render in
isolation, and add two golden scenes that capture single widgets for the
6.2 blog: the front-derailleur setting card and the second-window gear
overlay (2×N notation). Each renders the widget in a keyed RepaintBoundary
for a tight, page-free capture.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Extract the trainer-app picker into a public TrainerAppSelect widget so it
renders standalone, and add mywhoosh-trainer-select and
mywhoosh-network-connection golden scenes for the website setup guide.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lers

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…gPeaks snapshots

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…6 controllers

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…; handle combo errors

- FrontShiftCard now applies its toggle/chainring changes to the live
  FitnessBikeDefinition (not just the persisted config), so enabling the
  virtual front derailleur takes effect immediately instead of only after a
  reconnect/mode-switch — the combo gate read the config while the action
  checked the def, so the just-enabled feature reported itself disabled.
- Bound the small-ring stepper to the large ring so small can't exceed large
  (which inverted the ratio and made the shift a no-op).
- Error-handle the fire-and-forget front-shift combo so a throw is recorded
  instead of becoming an unobserved async error.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A half-received or corrupt app-info write was retained forever (cleared only
on a successful parse), poisoning every later parse so OpenBikeControl never
reported "Connected to app" again until app restart. Reset the reassembler on
disconnect and cap the buffer at 512 bytes so a stuck/corrupt stream recovers
and can't leak. Adds regression tests for reset and the bound.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…failures

- Ignore toggles during the transient starting/stopping states (in-flight
  guard) so a double-press can't double-start or stop-during-start.
- macOS: reset the recorder handle when start() throws, so one failure no
  longer permanently blocks recording (only stop() nilled it before).
- iOS: remove the broadcast picker view after triggering so a 1x1 view doesn't
  accumulate on the key window on every start.
- Report failures via recordError (was debugPrintStack, which vanishes in
  release builds). Adds an in-flight-toggle guard test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…n-safe DI detection

- The floating overlay's drag handle now fills the full 24px trailing slot
  instead of only the 14px icon.
- iOS overlay: arm PiP only while still showing and tear it down if a hide
  lands mid-start(), so a show/hide race can't orphan a frozen PiP window.
- Detect Dynamic Island via the max safe-area inset instead of the top inset,
  which collapsed in landscape and could auto-start an unwanted PiP.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…r + app

Adds a "Use {controller} with {app}" link that opens the matching
bikecontrol.app/use-<controller>-with-<app>/ how-to page:
- as the first entry in the Help & Support dropdown (above Instruction
  Videos), using the connected controller + selected trainer app;
- on the controller detail page, for that controller + the selected app.

Each controller device and trainer app maps to its website slug
(SupportedApp.helpSlug + a controller lookup in help_article.dart), with a
generic "other-training-app" fallback when a combination has no dedicated
page and no entry when the controller type has none. New localized string
useControllerWithApp across all 6 languages.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…link

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings June 26, 2026 19:29

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

jonasbark and others added 4 commits June 26, 2026 22:00
App Store upload rejected the build (altool 90112): 'picture-in-picture' is
not a valid UIBackgroundModes value. The PiP gear overlay runs off the
existing 'audio' background mode, so just remove the bogus entry.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
6.2.0+141 already has a Shorebird release, so a fresh iOS build needs a
higher build number; the marketing version stays 6.2.0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@jonasbark jonasbark merged commit 9d651bd into main Jun 28, 2026
2 checks passed
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.

2 participants