Conversation
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.
…iOS local-network inference
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>
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>
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.