From e6d7819704dbd47c6f2b74aceb242a94b6feb657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Br=C3=B6nner?= Date: Sat, 15 Aug 2026 13:31:49 +0200 Subject: [PATCH 1/8] Restore explicit shifting start and status feedback Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: fce4c745-c85c-40aa-aac2-3dbbf605f9e7 --- README.md | 5 +- .../VirtualGearsCore/ProxyCoordinator.swift | 12 +- .../ProxyCoordinatorTests.swift | 11 ++ VirtualGears.xcodeproj/project.pbxproj | 4 +- VirtualGearsProduct/ClickCentralService.swift | 6 + VirtualGearsProduct/VirtualGearsApp.swift | 1 - .../VirtualGearsHomeView.swift | 111 ++++++++++-------- docs/APP_STORE.md | 24 ++-- docs/accessibility.md | 4 + docs/demo.md | 7 +- docs/index.md | 10 +- docs/requirements.md | 13 +- 12 files changed, 133 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index 21f4aaf..a0ba02b 100644 --- a/README.md +++ b/README.md @@ -53,8 +53,9 @@ supported. may show the iPhone's name instead. 4. Ride and shift with the large **Easier** and **Harder** buttons. -There is no start button and no setup wizard. If it finds more than one trainer, -it asks you to choose yours by name. +There is no setup wizard. Once the trainer is connected, tap **Start Shifting** +when you want Virtual Gears to apply its gears. If it finds more than one +trainer, it asks you to choose yours by name. The same rule applies to optional equipment: one Click or Headwind is used automatically; if several are found, Virtual Gears asks instead of guessing. diff --git a/Sources/VirtualGearsCore/ProxyCoordinator.swift b/Sources/VirtualGearsCore/ProxyCoordinator.swift index 6bad937..fd859fe 100644 --- a/Sources/VirtualGearsCore/ProxyCoordinator.swift +++ b/Sources/VirtualGearsCore/ProxyCoordinator.swift @@ -120,6 +120,16 @@ public final class ProxyCoordinator { && (confirmedGearIndex ?? Int.max) < gearSequence.count - 1 } + /// Makes the transparent trainer proxy available without enabling gears. + /// + /// The riding app owns its ride. Virtual Gears can therefore pass trainer + /// data and commands through as soon as the KICKR is usable, while the rider + /// separately decides when to apply virtual shifting. + public func makeTrainerProxyAvailable() { + guard kickr.isReady else { return } + peripheral.startAdvertising() + } + public init( kickr: any TrainerLink, click: any ShifterLink, @@ -340,7 +350,7 @@ public final class ProxyCoordinator { hasAppliedVirtualGear = true defaults.set(wheelSize, forKey: interruptedShiftingKey) guard startMayProceed(id) else { throw CancellationError() } - peripheral.startAdvertising() + makeTrainerProxyAvailable() try await waitUntilPeripheralReady(shiftingID: id) lifecycle.markActive() log("Ride session started") diff --git a/Tests/VirtualGearsCoreTests/ProxyCoordinatorTests.swift b/Tests/VirtualGearsCoreTests/ProxyCoordinatorTests.swift index 802c8cf..5fb4093 100644 --- a/Tests/VirtualGearsCoreTests/ProxyCoordinatorTests.swift +++ b/Tests/VirtualGearsCoreTests/ProxyCoordinatorTests.swift @@ -80,6 +80,17 @@ final class ProxyCoordinatorTests: XCTestCase { XCTFail("Timed out waiting for the ride to reach the expected state") } + func testTrainerProxyCanBeAvailableBeforeShiftingStarts() async { + coordinator.makeTrainerProxyAvailable() + + XCTAssertTrue(ridingApp.isAdvertising) + XCTAssertEqual(coordinator.state, .idle) + XCTAssertNil(coordinator.displayedGear) + + let response = await ridingApp.send(.requestControl) + XCTAssertEqual(response?.result, .success) + } + // MARK: - What the trainer is left on func testStoppingPutsTheTrainerBackOnTheSizeItStartedWith() async throws { diff --git a/VirtualGears.xcodeproj/project.pbxproj b/VirtualGears.xcodeproj/project.pbxproj index 847f320..acb1f67 100644 --- a/VirtualGears.xcodeproj/project.pbxproj +++ b/VirtualGears.xcodeproj/project.pbxproj @@ -214,7 +214,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 8; DEVELOPMENT_TEAM = MNW6SJT4V7; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = VirtualGearsProduct/Info.plist; @@ -239,7 +239,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 6; + CURRENT_PROJECT_VERSION = 8; DEVELOPMENT_TEAM = MNW6SJT4V7; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = VirtualGearsProduct/Info.plist; diff --git a/VirtualGearsProduct/ClickCentralService.swift b/VirtualGearsProduct/ClickCentralService.swift index b2cee94..573b385 100644 --- a/VirtualGearsProduct/ClickCentralService.swift +++ b/VirtualGearsProduct/ClickCentralService.swift @@ -28,6 +28,10 @@ final class ClickCentralService: NSObject { private(set) var latestButtonEvent: ZwiftClickButtonEvent? private(set) var identificationCandidateID: UUID? private(set) var latestShiftRequest: ShiftRequest? + /// The physical button whose press the app accepted. Unlike the raw button + /// event, this excludes simultaneous or overlapping presses that shifting + /// deliberately ignores. + private(set) var pressedButton: ZwiftClickButton? private(set) var shiftRequests: [ShiftRequest] = [] var shiftHandler: ((ShiftRequest) -> Void)? @@ -430,6 +434,7 @@ final class ClickCentralService: NSObject { return } heldButton = button + pressedButton = button emit(.single(direction(for: button))) startRepeat(button) case let .released(button): @@ -460,6 +465,7 @@ final class ClickCentralService: NSObject { repeatTask?.cancel() repeatTask = nil heldButton = nil + pressedButton = nil if isHolding { isHolding = false emit(.holdEnded) diff --git a/VirtualGearsProduct/VirtualGearsApp.swift b/VirtualGearsProduct/VirtualGearsApp.swift index 1741cb4..2581e34 100644 --- a/VirtualGearsProduct/VirtualGearsApp.swift +++ b/VirtualGearsProduct/VirtualGearsApp.swift @@ -136,7 +136,6 @@ private struct ScreenshotFixtureView: View { click: click, headwind: headwind, coordinator: coordinator, - autoStarts: true, beginsDiscovery: false ) case .ride: diff --git a/VirtualGearsProduct/VirtualGearsHomeView.swift b/VirtualGearsProduct/VirtualGearsHomeView.swift index bbb70b9..2e2c342 100644 --- a/VirtualGearsProduct/VirtualGearsHomeView.swift +++ b/VirtualGearsProduct/VirtualGearsHomeView.swift @@ -9,9 +9,6 @@ struct VirtualGearsHomeView: View { @Bindable var headwind: HeadwindCentralService @Bindable var coordinator: ProxyCoordinator @Binding var isDemoMode: Bool - /// Set once the rider stops a ride, so the app does not immediately start a - /// new one. Reopening the app is the only way to ask for another ride. - @State private var riderStopped = false /// Whether demo entry took the trainer service away from a still-connected /// riding app, so exit knows to put it back. @State private var demoInterruptedAdvertising = false @@ -29,7 +26,7 @@ struct VirtualGearsHomeView: View { click: click, headwind: headwind, coordinator: coordinator, - onRiderStop: { riderStopped = true } + onRiderStop: {} ) } else { StartupView( @@ -38,7 +35,6 @@ struct VirtualGearsHomeView: View { click: click, headwind: headwind, coordinator: coordinator, - autoStarts: !riderStopped, onTryDemo: enterDemoMode ) } @@ -148,8 +144,6 @@ struct StartupView: View { @Bindable var click: ClickCentralService @Bindable var headwind: HeadwindCentralService @Bindable var coordinator: ProxyCoordinator - /// False after the rider stops a ride, so this screen waits for a tap. - var autoStarts: Bool = true var beginsDiscovery = true var onTryDemo: () -> Void = {} @State private var showsSettings = false @@ -167,10 +161,11 @@ struct StartupView: View { retryButton } else if mustChoose { chooser - } else if autoStarts { - searching + } else if canStart { + readyCard + retryButton } else { - stoppedCard + searching retryButton } demoEntry @@ -205,7 +200,7 @@ struct StartupView: View { await begin() } } - .onChange(of: canStart) { _, _ in startIfReady() } + .onChange(of: canStart) { _, _ in makeProxyAvailableIfReady() } .onChange(of: kickr.candidates) { _, _ in considerCandidates() } .onDisappear { kickr.stopScanning(reconnectSavedDevice: false) @@ -218,7 +213,7 @@ struct StartupView: View { private func begin() async { if store.configuration.hasValidKickr { kickr.autoConnectSavedDevice() - startIfReady() + makeProxyAvailableIfReady() } else { trainerScanSettled = false kickr.startScanning() @@ -229,12 +224,12 @@ struct StartupView: View { guard !Task.isCancelled else { return } trainerScanSettled = true considerCandidates() - startIfReady() + makeProxyAvailableIfReady() } /// Never interrupts a connection already under way. private func considerCandidates() { - guard trainerScanSettled, autoStarts, + guard trainerScanSettled, !store.configuration.hasValidKickr, kickr.selectedID == nil, !mustChoose else { return } let seen = kickr.candidates.map { DiscoveredTrainer(id: $0.id) } @@ -347,11 +342,11 @@ struct StartupView: View { // MARK: - Stopping and failing - private var stoppedCard: some View { + private var readyCard: some View { VStack(spacing: 16) { - Text("Virtual shifting stopped") + Text("Ready to shift") .font(.title3.weight(.semibold)) - connectionList(includeRidingApp: false) + connectionList(includeRidingApp: true) } .frame(maxWidth: .infinity) } @@ -509,13 +504,11 @@ struct StartupView: View { return nil } - /// The app does only one thing, so opening it is the instruction. - private func startIfReady() { - guard autoStarts, canStart, coordinator.state == .idle else { return } + private func makeProxyAvailableIfReady() { + guard canStart else { return } kickr.stopScanning() mustChoose = false - headwind.applySavedControlPreference() - coordinator.startShifting(configuration: store.configuration) + coordinator.makeTrainerProxyAvailable() } } @@ -1368,28 +1361,31 @@ struct ShiftingView: View { // The KICKR and the Click are grouped because Virtual Gears is // the one connecting to them. The riding app is set apart // because it connects to Virtual Gears instead. - HStack(spacing: 26) { - equipmentGroup(items: ownedEquipment.filter { $0.state == .ok }) - equipmentGroup(items: [ridingAppEquipment]) - // Deliberately separate from the Click's tick, which means - // connected. Tinting that tick would read, at a glance on - // a moving bike, as the Click having dropped out. - if configuration.usesClick, click.isReady, click.batteryIsLow, - let battery = click.batteryLevel { - HStack(spacing: 4) { - Image(systemName: "battery.25percent") - .foregroundStyle(.orange) - Text("Click \(battery)%") - } - .accessibilityElement(children: .ignore) - .accessibilityLabel("Click battery low, \(battery) percent") - } - if coordinator.ridingAppSetWheelSize { - Text("Wheel size from your app") + VStack(spacing: 4) { + equipmentGroup(items: ownedEquipment) + HStack(spacing: 12) { + equipmentGroup(items: [ridingAppEquipment]) + // Deliberately separate from the Click's status symbol. + // Tinting that symbol would look like a lost connection. + if configuration.usesClick, click.isReady, click.batteryIsLow, + let battery = click.batteryLevel { + HStack(spacing: 4) { + Image(systemName: "battery.25percent") + .foregroundStyle(.orange) + Text("Click \(battery)%") + } + .accessibilityElement(children: .ignore) .accessibilityLabel( - "Your riding app set the wheel size. " - + "Your gears are built around it." + "Click battery low, \(battery) percent" ) + } + if coordinator.ridingAppSetWheelSize { + Text("Wheel size from your app") + .accessibilityLabel( + "Your riding app set the wheel size. " + + "Your gears are built around it." + ) + } } } .foregroundStyle(.secondary) @@ -1412,12 +1408,12 @@ struct ShiftingView: View { HStack(spacing: 10) { ForEach(items) { item in HStack(spacing: 4) { - Image(systemName: "checkmark.circle.fill") - .foregroundStyle(.green) + Image(systemName: item.state.symbol) + .foregroundStyle(item.state.tint) Text(item.title) } .accessibilityElement(children: .ignore) - .accessibilityLabel("\(item.title), connected") + .accessibilityLabel("\(item.title), \(item.detail)") } } } @@ -1532,17 +1528,20 @@ struct ShiftingView: View { } private func shiftButton(easier: Bool) -> some View { - ShiftButton( + let direction: ShiftDirection = easier ? .easier : .harder + return ShiftButton( title: easier ? "Easier" : "Harder", symbol: easier ? "minus" : "plus", hint: easier ? "Requests the next easier gear. Hold to keep shifting easier." : "Requests the next harder gear. Hold to keep shifting harder.", - disabled: easier ? !coordinator.canShiftEasier : !coordinator.canShiftHarder + disabled: easier ? !coordinator.canShiftEasier : !coordinator.canShiftHarder, + externallyPressed: click.pressedButton + == (easier ? .minus : .plus) ) { - coordinator.shift(easier ? .easier : .harder) + coordinator.shift(direction) } repeatAction: { - coordinator.beginHold(easier ? .easier : .harder) + coordinator.beginHold(direction) } releaseAction: { coordinator.endHold() } @@ -1753,10 +1752,12 @@ private struct ShiftButton: View { let symbol: String let hint: String let disabled: Bool + var externallyPressed = false let action: () -> Void let repeatAction: () -> Void let releaseAction: () -> Void @Environment(\.scenePhase) private var scenePhase + @Environment(\.accessibilityReduceMotion) private var reduceMotion @ScaledMetric(relativeTo: .largeTitle) private var symbolSize: CGFloat = 56 @State private var repeatTask: Task? @State private var isHeld = false @@ -1781,6 +1782,18 @@ private struct ShiftButton: View { .buttonStyle(.borderedProminent) .buttonBorderShape(.roundedRectangle(radius: 24)) .disabled(disabled) + .brightness(externallyPressed ? -0.12 : 0) + .scaleEffect(externallyPressed && !reduceMotion ? 0.96 : 1) + .overlay { + RoundedRectangle(cornerRadius: 24) + .stroke(.tint, lineWidth: externallyPressed ? 5 : 0) + .padding(2) + .allowsHitTesting(false) + } + .animation( + reduceMotion ? nil : .easeOut(duration: 0.08), + value: externallyPressed + ) // The button keeps its normal tap behaviour; this only adds the hold. .simultaneousGesture( DragGesture(minimumDistance: 0) diff --git a/docs/APP_STORE.md b/docs/APP_STORE.md index 9a495c4..35a059d 100644 --- a/docs/APP_STORE.md +++ b/docs/APP_STORE.md @@ -80,8 +80,8 @@ the iPhone and when advertising itself as a trainer. virtual gears or an exact copy of the gears on your real bike. NOTHING TO SET UP - Open the app and it starts. It finds your trainer, connects to it, puts your - gears on and appears to your riding app on its own. Optional original Zwift Click and + Open the app and it finds your trainer, connects to it and appears to your + riding app. Tap Start Shifting when you want it to put your gears on. Optional original Zwift Click and Wahoo Headwind accessories are found and remembered automatically too. If more than one matching device is found, Virtual Gears asks rather than guessing. If Clicks have identical names, pressing a button identifies the one you want. @@ -117,7 +117,8 @@ the iPhone and when advertising itself as a trainer. OPTIONAL SHIFT BUTTONS Wake an original Zwift Click before opening Virtual Gears and it connects - automatically. It shifts alongside the on-screen buttons, but is never required. + automatically. It shifts alongside the on-screen buttons and visibly presses + the matching control, but is never required. OPTIONAL HEADWIND CONTROL Turn on a Wahoo KICKR HEADWIND before opening Virtual Gears and it connects @@ -264,12 +265,17 @@ For each update, raise `MARKETING_VERSION` (1.0 → 1.1) and upload again. `CURRENT_PROJECT_VERSION` must increase on every single upload, even a re-upload of the same version. -The current review build is 1.0 (6). Build 5 added the Demo Mode that shows the -wheel size and command bytes changing. Build 6 removes a wheel-size limit that -was never real: a physical KICKR V5 accepts every value the command can express, -so the app now states the range of riding-app wheel sizes it supports instead of -guessing at a trainer limit. It also stops describing itself to riders as -starting a session, because it does not — it puts their gears on. +The current TestFlight build is 1.0 (8). Build 5 added the Demo Mode that shows +the wheel size and command bytes changing. Build 6 removed a wheel-size limit +that was never real: a physical KICKR V5 accepts every value the command can +express, so the app now states the range of riding-app wheel sizes it supports +instead of guessing at a trainer limit. It also stopped describing itself to +riders as starting a session, because it does not — it puts their gears on. +Build 7 mirrors an accepted Zwift Click press on the matching on-screen shift +button while keeping the gear number and haptic tied to trainer confirmation. +Build 8 restores the explicit Start Shifting step while making the transparent +trainer proxy available as soon as the KICKR is ready, and keeps every configured +equipment status visible on the shifting screen. The live App Store description still carries the old "starts the session" sentence. It is corrected in this file and needs the same edit in App Store diff --git a/docs/accessibility.md b/docs/accessibility.md index 7df2a70..0ab27ef 100644 --- a/docs/accessibility.md +++ b/docs/accessibility.md @@ -17,6 +17,10 @@ button continues shifting. Equipment, connection problems, battery warnings and Bluetooth errors have spoken descriptions rather than relying only on icons or colour. +Pressing the optional Zwift Click visibly presses the matching on-screen +button. This visual acknowledgement is separate from the gear announcement +and haptic, which occur only after the trainer confirms the shift. + ## Display and motion The ride controls use large targets in portrait and landscape. At Accessibility diff --git a/docs/demo.md b/docs/demo.md index 69b04d0..818b151 100644 --- a/docs/demo.md +++ b/docs/demo.md @@ -41,9 +41,10 @@ advertise, connect or send Bluetooth commands.
![The saved trainer connecting while the Zwift Click and Headwind are connected](screenshots/starting.png){ width="280" } -
Open the app and it goes looking for your trainer. There is - nothing to press for a real ride. Try Demo is available when no trainer is - nearby. Optional equipment reconnects by itself.
+
Open the app and it goes looking for your trainer. Once connected, + Start Shifting applies the gears; the riding app remains responsible for the + ride itself. Try Demo is available when no trainer is nearby. Optional + equipment reconnects by itself.
diff --git a/docs/index.md b/docs/index.md index 076f0db..287da3c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -75,7 +75,9 @@ list of tooth counts can tell you. Two large buttons on the phone, placed for sweaty hands and a locked-out gaze. An original Zwift Click can be added and shifts the same gears, but it is never -required and nothing ever waits for it. +required and nothing ever waits for it. Its physical press is mirrored on the +matching phone button; the gear number still changes only after the trainer +confirms the shift. The current gear is also an adjustable VoiceOver control: swipe up for a harder gear and down for an easier one. Confirmed gear changes are announced, so the @@ -97,9 +99,9 @@ switching to another fan. ### Nothing to set up -Open the app. It looks for your trainer, connects to it, puts your gears on -and appears to your riding app, all on its own. There is no setup to complete and no -button to press. +Open the app. It looks for your trainer, connects to it and appears to your +riding app. When the trainer is ready, tap **Start Shifting** to put your gears +on. The riding app owns the ride; this button only controls Virtual Gears. The only question it asks is which device, and only when it finds more than one trainer, Click or Headwind. A single device is simply used. Bluetooth signal diff --git a/docs/requirements.md b/docs/requirements.md index 8429267..794ce9e 100644 --- a/docs/requirements.md +++ b/docs/requirements.md @@ -91,9 +91,12 @@ idea of the bike and leaves the road alone. own. If it finds more than one trainer, it asks you which one. 3. On your computer, open your riding app and pair with the trainer it offers. That will be your iPhone, appearing as a trainer. -4. Ride. Shift with the two large buttons on the phone. +4. Tap **Start Shifting**, then ride and shift with the two large buttons on the + phone. -There is no setup screen to complete first and no start button to press. +There is no setup screen to complete first. The app connects to the trainer and +makes it available to the riding app automatically; **Start Shifting** only +applies the virtual gears. You can explore the app without any equipment by tapping **Try Demo** while it looks for a trainer. The simulated ride does not use Bluetooth or control @@ -118,8 +121,10 @@ About → Name — but that changes its name everywhere else too. Wake the Click by pressing a button before opening Virtual Gears. The app finds, connects and remembers it automatically. It shifts the same gears as the -on-screen buttons. Nothing ever waits for it, so a Click that runs out of -battery mid-ride costs you nothing but the buttons on the handlebar. +on-screen buttons, and pressing it visibly presses the matching phone button. +The gear number still changes only after the trainer confirms the shift. +Nothing ever waits for the Click, so one that runs out of battery mid-ride +costs you nothing but the buttons on the handlebar. If the app finds more than one Click, choose yours in Settings rather than letting it guess. Some Clicks advertise the same name. In that case, keep From 55567a95e150df678f7fd25e153eb332e8aa1242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Br=C3=B6nner?= Date: Sat, 15 Aug 2026 14:06:08 +0200 Subject: [PATCH 2/8] Add comprehensive UI regression tests Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: fce4c745-c85c-40aa-aac2-3dbbf605f9e7 --- .github/workflows/ci.yml | 14 ++ DEVELOPMENT.md | 18 ++ VirtualGears.xcodeproj/project.pbxproj | 119 +++++++++ VirtualGearsProduct/FTMSPeripheral.swift | 6 + VirtualGearsProduct/SetupView.swift | 3 + VirtualGearsProduct/VirtualGearsApp.swift | 8 +- .../VirtualGearsHomeView.swift | 15 +- VirtualGearsUITests/VirtualGearsUITests.swift | 234 ++++++++++++++++++ 8 files changed, 413 insertions(+), 4 deletions(-) create mode 100644 VirtualGearsUITests/VirtualGearsUITests.swift diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bf131c5..11c39cb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,3 +44,17 @@ jobs: -scheme "${{ matrix.scheme }}" \ -destination 'generic/platform=iOS Simulator' \ CODE_SIGNING_ALLOWED=NO + + ui-tests: + name: UI tests + runs-on: macos-26 + steps: + - uses: actions/checkout@v7 + + - name: Run UI regression tests + run: | + xcodebuild test \ + -project VirtualGears.xcodeproj \ + -scheme VirtualGears \ + -destination 'platform=iOS Simulator,name=iPhone 17 Pro' \ + -parallel-testing-enabled NO diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 276015a..0d2958f 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -30,6 +30,23 @@ Run the hardware-independent test suite: swift test ``` +Run the simulator UI regression suite: + +```bash +xcodebuild test \ + -project VirtualGears.xcodeproj \ + -scheme VirtualGears \ + -destination 'platform=iOS Simulator,name=iPhone 17 Pro' \ + -parallel-testing-enabled NO +``` + +`VirtualGearsUITests` launches deterministic debug fixtures rather than pretending +the simulator has Bluetooth hardware. It covers every primary screen, status +icon visibility in portrait and landscape, shifting controls, settings +destinations, gear configuration, Headwind controls and Demo Mode interactions. +Screenshots are attached to every test result. Protocol behavior and equipment +lifecycle remain covered by the package tests and physical-hardware evidence. + Open the iPhone project: ```bash @@ -54,6 +71,7 @@ without code signing. | `Sources/VirtualGearsCore` | Gear calculations, trainer commands, ride coordination and other hardware-independent logic | | `VirtualGearsProduct` | SwiftUI screens and the real Bluetooth services | | `Tests/VirtualGearsCoreTests` | Hardware-independent unit and ride-lifecycle tests | +| `VirtualGearsUITests` | Simulator UI, navigation, accessibility and layout regression tests | | `Tools` | macOS tools for inspecting the KICKR, Zwift Click and advertised trainer name | | `docs` | MkDocs website, screenshots and hardware findings | | `VirtualGears.xcodeproj` | iPhone app project | diff --git a/VirtualGears.xcodeproj/project.pbxproj b/VirtualGears.xcodeproj/project.pbxproj index acb1f67..e04f7b5 100644 --- a/VirtualGears.xcodeproj/project.pbxproj +++ b/VirtualGears.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + B00000000000000000000001 /* VirtualGearsUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10000000000000000000001 /* VirtualGearsUITests.swift */; }; 100000000000000000000008 /* VirtualGearsApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 200000000000000000000009 /* VirtualGearsApp.swift */; }; 100000000000000000000009 /* VirtualGearsHomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20000000000000000000000A /* VirtualGearsHomeView.swift */; }; A00000000000000000000001 /* AppConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = A10000000000000000000001 /* AppConfiguration.swift */; }; @@ -22,6 +23,8 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + B10000000000000000000001 /* VirtualGearsUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VirtualGearsUITests.swift; sourceTree = ""; }; + B10000000000000000000002 /* VirtualGearsUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = VirtualGearsUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 200000000000000000000005 /* VirtualGears.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = VirtualGears.app; sourceTree = BUILT_PRODUCTS_DIR; }; 200000000000000000000009 /* VirtualGearsApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VirtualGearsApp.swift; sourceTree = ""; }; 20000000000000000000000A /* VirtualGearsHomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VirtualGearsHomeView.swift; sourceTree = ""; }; @@ -38,6 +41,13 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + B30000000000000000000001 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 300000000000000000000004 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -53,6 +63,7 @@ isa = PBXGroup; children = ( 400000000000000000000004 /* VirtualGears */, + B40000000000000000000001 /* VirtualGearsUITests */, 400000000000000000000003 /* Products */, ); sourceTree = ""; @@ -80,13 +91,52 @@ isa = PBXGroup; children = ( 200000000000000000000005 /* VirtualGears.app */, + B10000000000000000000002 /* VirtualGearsUITests.xctest */, ); name = Products; sourceTree = ""; }; + B40000000000000000000001 /* VirtualGearsUITests */ = { + isa = PBXGroup; + children = ( + B10000000000000000000001 /* VirtualGearsUITests.swift */, + ); + path = VirtualGearsUITests; + sourceTree = ""; + }; /* End PBXGroup section */ +/* Begin PBXContainerItemProxy section */ + B20000000000000000000001 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 600000000000000000000001 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 500000000000000000000001; + remoteInfo = VirtualGears; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXNativeTarget section */ + B50000000000000000000001 /* VirtualGearsUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = B80000000000000000000001 /* Build configuration list for PBXNativeTarget "VirtualGearsUITests" */; + buildPhases = ( + B30000000000000000000002 /* Sources */, + B30000000000000000000001 /* Frameworks */, + B30000000000000000000003 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + B20000000000000000000002 /* PBXTargetDependency */, + ); + name = VirtualGearsUITests; + packageProductDependencies = ( + ); + productName = VirtualGearsUITests; + productReference = B10000000000000000000002 /* VirtualGearsUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; 500000000000000000000001 /* VirtualGears */ = { isa = PBXNativeTarget; buildConfigurationList = 800000000000000000000002 /* Build configuration list for PBXNativeTarget "VirtualGears" */; @@ -120,6 +170,10 @@ 500000000000000000000001 = { CreatedOnToolsVersion = 26.4; }; + B50000000000000000000001 = { + CreatedOnToolsVersion = 26.4; + TestTargetID = 500000000000000000000001; + }; }; }; buildConfigurationList = 800000000000000000000001 /* Build configuration list for PBXProject "VirtualGears" */; @@ -139,11 +193,19 @@ projectRoot = ""; targets = ( 500000000000000000000001 /* VirtualGears */, + B50000000000000000000001 /* VirtualGearsUITests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + B30000000000000000000003 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 300000000000000000000006 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -156,6 +218,14 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + B30000000000000000000002 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B00000000000000000000001 /* VirtualGearsUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 300000000000000000000005 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -175,6 +245,38 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ + B70000000000000000000001 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = MNW6SJT4V7; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + PRODUCT_BUNDLE_IDENTIFIER = com.sbroenne.VirtualGearsUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SWIFT_VERSION = 6.0; + TARGETED_DEVICE_FAMILY = 1; + TEST_TARGET_NAME = VirtualGears; + }; + name = Debug; + }; + B70000000000000000000002 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = MNW6SJT4V7; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + PRODUCT_BUNDLE_IDENTIFIER = com.sbroenne.VirtualGearsUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SWIFT_VERSION = 6.0; + TARGETED_DEVICE_FAMILY = 1; + TEST_TARGET_NAME = VirtualGears; + }; + name = Release; + }; 700000000000000000000001 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -262,6 +364,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + B80000000000000000000001 /* Build configuration list for PBXNativeTarget "VirtualGearsUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B70000000000000000000001 /* Debug */, + B70000000000000000000002 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 800000000000000000000001 /* Build configuration list for PBXProject "VirtualGears" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -282,6 +393,14 @@ }; /* End XCConfigurationList section */ +/* Begin PBXTargetDependency section */ + B20000000000000000000002 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 500000000000000000000001 /* VirtualGears */; + targetProxy = B20000000000000000000001 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCLocalSwiftPackageReference section */ 900000000000000000000002 /* XCLocalSwiftPackageReference "." */ = { isa = XCLocalSwiftPackageReference; diff --git a/VirtualGearsProduct/FTMSPeripheral.swift b/VirtualGearsProduct/FTMSPeripheral.swift index 4e3401e..7897c12 100644 --- a/VirtualGearsProduct/FTMSPeripheral.swift +++ b/VirtualGearsProduct/FTMSPeripheral.swift @@ -401,6 +401,12 @@ final class FTMSPeripheral: NSObject { #if DEBUG extension FTMSPeripheral { + func stageScreenshotAdvertising() { + isAdvertising = true + subscribedAppCount = 0 + controllingAppID = nil + } + func stageScreenshotConnection() { isAdvertising = true subscribedAppCount = 1 diff --git a/VirtualGearsProduct/SetupView.swift b/VirtualGearsProduct/SetupView.swift index 8aa8f53..843798c 100644 --- a/VirtualGearsProduct/SetupView.swift +++ b/VirtualGearsProduct/SetupView.swift @@ -21,6 +21,7 @@ struct SetupView: View { } .navigationTitle("Settings") .navigationBarTitleDisplayMode(.inline) + .accessibilityIdentifier("screen.settings") .task { if autoConnectsOnAppear { autoConnectSavedEquipment() @@ -458,6 +459,7 @@ struct HeadwindControlView: View { } .navigationTitle("Headwind") .navigationBarTitleDisplayMode(.inline) + .accessibilityIdentifier("screen.headwind") .toolbar { if let onDone { ToolbarItem(placement: .confirmationAction) { @@ -710,6 +712,7 @@ struct GearChoiceView: View { } .navigationTitle("Gears") .navigationBarTitleDisplayMode(.inline) + .accessibilityIdentifier("screen.gears") } } diff --git a/VirtualGearsProduct/VirtualGearsApp.swift b/VirtualGearsProduct/VirtualGearsApp.swift index 2581e34..a108f1d 100644 --- a/VirtualGearsProduct/VirtualGearsApp.swift +++ b/VirtualGearsProduct/VirtualGearsApp.swift @@ -94,6 +94,7 @@ struct VirtualGearsApp: App { #if DEBUG enum ScreenshotFixture: String { case starting = "-shotStarting" + case ready = "-shotReady" case ride = "-shotRide" case settings = "-shotSettings" case gears = "-shotGears" @@ -129,7 +130,7 @@ private struct ScreenshotFixtureView: View { var body: some View { Group { switch scenario { - case .starting: + case .starting, .ready: StartupView( store: store, kickr: kickr, @@ -205,7 +206,10 @@ private struct ScreenshotFixtureView: View { speed: 50 ) - if scenario == .ride { + if scenario == .ready { + (coordinator.peripheral as? FTMSPeripheral)? + .stageScreenshotAdvertising() + } else if scenario == .ride { (coordinator.peripheral as? FTMSPeripheral)? .stageScreenshotConnection() coordinator.stageScreenshotRide(configuration: configuration) diff --git a/VirtualGearsProduct/VirtualGearsHomeView.swift b/VirtualGearsProduct/VirtualGearsHomeView.swift index 2e2c342..e6162c2 100644 --- a/VirtualGearsProduct/VirtualGearsHomeView.swift +++ b/VirtualGearsProduct/VirtualGearsHomeView.swift @@ -206,6 +206,7 @@ struct StartupView: View { kickr.stopScanning(reconnectSavedDevice: false) } } + .accessibilityIdentifier("screen.startup") } // MARK: - Finding a trainer @@ -259,8 +260,8 @@ struct StartupView: View { .font(.title3.weight(.semibold)) .multilineTextAlignment(.center) Text( - "Turn the pedals if your trainer is asleep. Virtual shifting starts " - + "by itself, and your riding app will find Virtual Gears." + "Turn the pedals if your trainer is asleep. Your riding app can " + + "find Virtual Gears as soon as the trainer is connected." ) .font(.subheadline) .foregroundStyle(.secondary) @@ -605,6 +606,7 @@ struct DemoModeView: View { .task { await runSimulatedTrainer() } .task { await runSimulatedRidingApp() } .onDisappear(perform: stopSweep) + .accessibilityIdentifier("screen.demo") } private var simulationNotice: some View { @@ -951,6 +953,7 @@ private struct DemoSettingsView: View { .fontWeight(.semibold) } } + .accessibilityIdentifier("screen.demo-settings") } } @@ -1015,6 +1018,7 @@ private struct DemoHeadwindControlView: View { .fontWeight(.semibold) } } + .accessibilityIdentifier("screen.demo-headwind") } } @@ -1230,6 +1234,7 @@ struct ShiftingView: View { } Button("Cancel", role: .cancel) {} } + .accessibilityIdentifier("screen.ride") } /// The gear is the one thing the rider looks at, so it owns the screen and @@ -1357,6 +1362,7 @@ struct ShiftingView: View { .foregroundStyle(problem.state.tint) .accessibilityElement(children: .ignore) .accessibilityLabel(equipmentProblem ?? "") + .accessibilityIdentifier("status.\(problem.id)") } else { // The KICKR and the Click are grouped because Virtual Gears is // the one connecting to them. The riding app is set apart @@ -1410,10 +1416,13 @@ struct ShiftingView: View { HStack(spacing: 4) { Image(systemName: item.state.symbol) .foregroundStyle(item.state.tint) + .accessibilityIdentifier("status.\(item.id).icon") Text(item.title) + .accessibilityIdentifier("status.\(item.id).label") } .accessibilityElement(children: .ignore) .accessibilityLabel("\(item.title), \(item.detail)") + .accessibilityIdentifier("status.\(item.id)") } } } @@ -1721,6 +1730,7 @@ private struct ConnectionStatusList: View { .foregroundStyle(item.state.tint) .font(.title3) .frame(width: 28) + .accessibilityIdentifier("status.\(item.id).icon") VStack(alignment: .leading, spacing: 2) { Text(item.name) .font(.headline) @@ -1736,6 +1746,7 @@ private struct ConnectionStatusList: View { .padding(.vertical, 11) .accessibilityElement(children: .ignore) .accessibilityLabel("\(item.name), \(item.role), \(item.detail)") + .accessibilityIdentifier("status.\(item.id)") } } .background(Color(.secondarySystemGroupedBackground), in: .rect(cornerRadius: 16)) diff --git a/VirtualGearsUITests/VirtualGearsUITests.swift b/VirtualGearsUITests/VirtualGearsUITests.swift new file mode 100644 index 0000000..828967f --- /dev/null +++ b/VirtualGearsUITests/VirtualGearsUITests.swift @@ -0,0 +1,234 @@ +import XCTest + +@MainActor +final class VirtualGearsUITests: XCTestCase { + private var app: XCUIApplication! + + func testStartingScreenShowsEveryConfiguredEquipmentStatus() { + launch("-shotStarting") + + assertVisible("screen.startup") + XCTAssertTrue(app.navigationBars["Virtual Gears"].exists) + XCTAssertTrue(app.buttons["Settings"].exists) + XCTAssertTrue(app.buttons["Try Demo"].exists) + assertStatusItems(["trainer", "click", "headwind"]) + } + + func testReadyScreenShowsTrainerAndRidingAppAdvertisingStatus() { + launch("-shotReady") + + XCTAssertTrue(app.staticTexts["Ready to shift"].waitForExistence(timeout: 3)) + assertStatusItems(["trainer", "click", "headwind", "riding-app"]) + let ridingApp = app.descendants(matching: .any)["status.riding-app"] + XCTAssertTrue(ridingApp.label.contains("PC riding app")) + XCTAssertTrue(ridingApp.label.contains("Waiting for connection")) + } + + func testRideShowsAllStatusIconsAndPrimaryControls() { + launch("-shotRide") + + assertVisible("screen.ride") + assertVisibleElement(app.buttons["Shift easier"]) + assertVisibleElement(app.buttons["Shift harder"]) + assertVisibleElement(app.buttons["Settings"]) + assertVisibleElement(app.buttons["Headwind controls"]) + assertVisibleElement(app.buttons["Stop virtual shifting"]) + assertVisibleElement(app.descendants(matching: .any)["Gear"].firstMatch) + assertStatusItems(["kickr", "click", "headwind", "ridingapp"]) + } + + func testRideStatusIconsRemainVisibleInLandscape() { + launch("-shotRide") + XCUIDevice.shared.orientation = .landscapeLeft + + assertVisible("screen.ride") + assertStatusItems(["kickr", "click", "headwind", "ridingapp"]) + assertVisibleElement(app.buttons["Shift easier"]) + assertVisibleElement(app.buttons["Shift harder"]) + } + + func testRideOpensSettingsFanAndStopConfirmation() { + launch("-shotRide") + + app.buttons["Settings"].tap() + assertVisible("screen.settings") + app.buttons["Done"].tap() + + app.buttons["Headwind controls"].tap() + assertVisible("screen.headwind") + app.buttons["Done"].tap() + + app.buttons["Stop virtual shifting"].tap() + XCTAssertTrue(app.staticTexts["Stop virtual shifting?"].waitForExistence(timeout: 2)) + XCTAssertTrue(app.buttons["Stop Shifting"].exists) + } + + func testSettingsNavigatesToEveryDestination() { + launch("-shotSettings") + + assertVisible("screen.settings") + for destination in ["Trainer", "Zwift Click", "Wahoo Headwind", "Gears"] { + let row = app.staticTexts[destination].firstMatch + assertVisibleElement(row) + row.tap() + XCTAssertTrue( + app.navigationBars[destination].waitForExistence(timeout: 2), + "\(destination) screen did not open" + ) + app.navigationBars.buttons.firstMatch.tap() + } + } + + func testVirtualGearChoiceShowsModeAndPreview() { + launch("-shotGears") + + assertVisible("screen.gears") + XCTAssertTrue(app.buttons["Virtual gears"].exists) + XCTAssertTrue(app.buttons["Copy a real bike"].exists) + assertVisibleElement(app.staticTexts["24 gears"].firstMatch) + } + + func testRealGearChoiceNavigatesToChainringsAndCassette() { + launch("-shotRealGears") + + assertVisible("screen.gears") + assertVisibleElement(app.staticTexts["Chainrings"]) + assertVisibleElement(app.staticTexts["Cassette"]) + + app.staticTexts["Chainrings"].tap() + XCTAssertTrue(app.navigationBars["Chainrings"].waitForExistence(timeout: 2)) + app.navigationBars.buttons.firstMatch.tap() + + app.staticTexts["Cassette"].tap() + XCTAssertTrue(app.navigationBars["Cassette"].waitForExistence(timeout: 2)) + } + + func testHeadwindControlsExposeModeSpeedAndPresets() { + launch("-shotHeadwind") + + assertVisible("screen.headwind") + XCTAssertTrue(app.buttons["Automatic"].exists) + XCTAssertTrue(app.buttons["Manual"].exists) + ["Fan off", "25 percent", "50 percent", "75 percent", "100 percent"].forEach { + assertVisibleElement(app.buttons[$0]) + } + assertVisibleElement(app.buttons["Slower"]) + assertVisibleElement(app.buttons["Faster"]) + } + + func testDemoSupportsShiftingSettingsAndFanControls() { + launch("-shotDemo") + + assertVisible("screen.demo") + XCTAssertTrue(app.navigationBars["Demo Ride"].exists) + let gear = app.descendants(matching: .any)["Simulated gear"] + assertVisibleElement(gear) + let initialValue = gear.value as? String + app.buttons["Shift harder"].tap() + expectation( + for: NSPredicate(format: "value != %@", initialValue ?? ""), + evaluatedWith: gear + ) + waitForExpectations(timeout: 2) + + app.buttons["Settings"].tap() + assertVisible("screen.demo-settings") + app.buttons["Done"].tap() + + app.buttons["Fan"].tap() + assertVisible("screen.demo-headwind") + app.buttons["Manual"].tap() + assertVisibleElement(app.buttons["50 percent"]) + } + + private func launch(_ fixture: String) { + continueAfterFailure = false + app = XCUIApplication() + addTeardownBlock { @MainActor [weak self] in + guard let self, let app = self.app else { return } + if app.state == .runningForeground { + let screenshot = XCTAttachment(screenshot: app.screenshot()) + screenshot.name = self.name + screenshot.lifetime = .keepAlways + self.add(screenshot) + } + app.terminate() + self.app = nil + } + XCUIDevice.shared.orientation = .portrait + app.launchArguments = [ + fixture, "-AppleLanguages", "(en)", "-AppleLocale", "en_US", + ] + app.launch() + } + + private func assertStatusItems( + _ identifiers: [String], + file: StaticString = #filePath, + line: UInt = #line + ) { + var frames: [(String, CGRect)] = [] + for identifier in identifiers { + assertVisible("status.\(identifier)", file: file, line: line) + assertVisible( + "status.\(identifier).icon", + file: file, + line: line + ) + frames.append(( + identifier, + app.descendants(matching: .any)["status.\(identifier)"].frame + )) + } + for index in frames.indices { + for otherIndex in frames.indices where otherIndex > index { + let overlap = frames[index].1.intersection(frames[otherIndex].1) + XCTAssertTrue( + overlap.isNull || overlap.width * overlap.height < 1, + "\(frames[index].0) overlaps \(frames[otherIndex].0)", + file: file, + line: line + ) + } + } + } + + private func assertVisible( + _ identifier: String, + file: StaticString = #filePath, + line: UInt = #line + ) { + assertVisibleElement( + app.descendants(matching: .any)[identifier], + file: file, + line: line + ) + } + + private func assertVisibleElement( + _ element: XCUIElement, + file: StaticString = #filePath, + line: UInt = #line + ) { + XCTAssertTrue( + element.waitForExistence(timeout: 3), + "\(element) does not exist", + file: file, + line: line + ) + let frame = element.frame + XCTAssertGreaterThan(frame.width, 1, file: file, line: line) + XCTAssertGreaterThan(frame.height, 1, file: file, line: line) + let windowFrame = app.windows.firstMatch.frame + let visibleFrame = frame.intersection(windowFrame) + let visibleArea = visibleFrame.isNull ? 0 : visibleFrame.width * visibleFrame.height + let totalArea = frame.width * frame.height + XCTAssertGreaterThanOrEqual( + visibleArea / totalArea, + 0.95, + "\(element) is clipped or outside the visible window", + file: file, + line: line + ) + } +} From 1869dda17be50ea27d71ba904e724daa1cf9b44a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Br=C3=B6nner?= Date: Sat, 15 Aug 2026 15:37:07 +0200 Subject: [PATCH 3/8] Fix ride status visibility with edge-state tests Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: fce4c745-c85c-40aa-aac2-3dbbf605f9e7 --- DEVELOPMENT.md | 12 +- README.md | 2 + .../VirtualGearsCore/AppConfiguration.swift | 3 + .../VirtualGearsCore/ProxyCoordinator.swift | 13 ++ .../AppConfigurationTests.swift | 4 + VirtualGears.xcodeproj/project.pbxproj | 4 +- VirtualGearsProduct/ClickCentralService.swift | 4 + VirtualGearsProduct/SetupView.swift | 6 +- VirtualGearsProduct/VirtualGearsApp.swift | 48 ++++- .../VirtualGearsHomeView.swift | 188 +++++++++++------- VirtualGearsUITests/VirtualGearsUITests.swift | 118 ++++++++++- docs/APP_STORE.md | 12 +- docs/accessibility.md | 3 + docs/index.md | 4 + docs/screenshots/riding.png | Bin 187498 -> 151479 bytes 15 files changed, 331 insertions(+), 90 deletions(-) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 0d2958f..ce1182d 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -41,11 +41,13 @@ xcodebuild test \ ``` `VirtualGearsUITests` launches deterministic debug fixtures rather than pretending -the simulator has Bluetooth hardware. It covers every primary screen, status -icon visibility in portrait and landscape, shifting controls, settings -destinations, gear configuration, Headwind controls and Demo Mode interactions. -Screenshots are attached to every test result. Protocol behavior and equipment -lifecycle remain covered by the package tests and physical-hardware evidence. +the simulator has Bluetooth hardware. Its 20 scenarios cover every primary +screen, portrait and landscape status visibility, Accessibility Dynamic Type, +startup failure, trainer reconnect, a riding app waiting, low Click battery, +pending shifts, accepted Click press feedback, navigation, Headwind controls and +Demo Mode interactions. Screenshots are attached to every test result. Protocol +behavior and equipment lifecycle remain covered by the package tests and +physical-hardware evidence. Open the iPhone project: diff --git a/README.md b/README.md index a0ba02b..361329b 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,8 @@ with physical hardware. - **On-phone shifting** with large controls in portrait and landscape. - **Accessible ride controls** with VoiceOver gear feedback, adjustable gear control and support for larger text. +- **Persistent equipment statuses** that keep the trainer, Click, fan and + riding app visible independently, including while the riding app is waiting. - **Automatic optional-equipment discovery** for an original Zwift Click and Wahoo KICKR HEADWIND. - **Optional Zwift Click shifting** from the handlebar. diff --git a/Sources/VirtualGearsCore/AppConfiguration.swift b/Sources/VirtualGearsCore/AppConfiguration.swift index 7f8963c..ff0edbc 100644 --- a/Sources/VirtualGearsCore/AppConfiguration.swift +++ b/Sources/VirtualGearsCore/AppConfiguration.swift @@ -145,6 +145,9 @@ public extension AppConfiguration { guard drivetrain != nil else { return "Too wide a range for the trainer" } + if usesVirtualGears { + return "\(gearCount) gears · extra-low climbing range" + } return "\(gearCount) gears · \(rangeDescription)" } diff --git a/Sources/VirtualGearsCore/ProxyCoordinator.swift b/Sources/VirtualGearsCore/ProxyCoordinator.swift index fd859fe..2808ee7 100644 --- a/Sources/VirtualGearsCore/ProxyCoordinator.swift +++ b/Sources/VirtualGearsCore/ProxyCoordinator.swift @@ -1176,5 +1176,18 @@ extension ProxyCoordinator { TrainerSafety.referenceCircumferenceMillimeters updateDisplayedGear() } + + public func stageScreenshotFailure(_ message: String) { + lifecycle.refuseStart(message) + } + + public func stageScreenshotPendingShift() { + _ = gearEngine?.requestShift(by: 1) + requestedGearIndex = gearEngine?.requestedIndex + } + + public func stageScreenshotReconnecting() { + lifecycle.markReconnecting() + } } #endif diff --git a/Tests/VirtualGearsCoreTests/AppConfigurationTests.swift b/Tests/VirtualGearsCoreTests/AppConfigurationTests.swift index 86a5133..f59aac8 100644 --- a/Tests/VirtualGearsCoreTests/AppConfigurationTests.swift +++ b/Tests/VirtualGearsCoreTests/AppConfigurationTests.swift @@ -83,6 +83,10 @@ final class AppConfigurationTests: XCTestCase { XCTAssertNotNil(configuration.drivetrain) XCTAssertTrue(configuration.hasSafeCircumference) XCTAssertEqual(configuration.drivetrainName, "Virtual gears") + XCTAssertEqual( + configuration.gearSummary, + "24 gears · extra-low climbing range" + ) } /// Gears wider than the trainer can copy must block a ride rather than be diff --git a/VirtualGears.xcodeproj/project.pbxproj b/VirtualGears.xcodeproj/project.pbxproj index e04f7b5..8c44bdb 100644 --- a/VirtualGears.xcodeproj/project.pbxproj +++ b/VirtualGears.xcodeproj/project.pbxproj @@ -316,7 +316,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 8; + CURRENT_PROJECT_VERSION = 9; DEVELOPMENT_TEAM = MNW6SJT4V7; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = VirtualGearsProduct/Info.plist; @@ -341,7 +341,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 8; + CURRENT_PROJECT_VERSION = 9; DEVELOPMENT_TEAM = MNW6SJT4V7; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = VirtualGearsProduct/Info.plist; diff --git a/VirtualGearsProduct/ClickCentralService.swift b/VirtualGearsProduct/ClickCentralService.swift index 573b385..0b5a5af 100644 --- a/VirtualGearsProduct/ClickCentralService.swift +++ b/VirtualGearsProduct/ClickCentralService.swift @@ -542,6 +542,10 @@ extension ClickCentralService { self.batteryLevel = batteryLevel state = .ready } + + func stageScreenshotPressedButton(_ button: ZwiftClickButton) { + pressedButton = button + } } #endif diff --git a/VirtualGearsProduct/SetupView.swift b/VirtualGearsProduct/SetupView.swift index 843798c..ec991d9 100644 --- a/VirtualGearsProduct/SetupView.swift +++ b/VirtualGearsProduct/SetupView.swift @@ -671,9 +671,9 @@ struct GearChoiceView: View { } footer: { Text( store.configuration.usesVirtualGears - ? "Twenty-four very wide virtual gears, from an easier " - + "climbing gear to the same hard end. They belong " - + "to no particular bike." + ? "Twenty-four evenly spaced gears with an extra-low " + + "climbing range. They are designed for indoor " + + "riding rather than copied from a particular bike." : "Copy the numbers printed on your own bike, or pick " + "any combination you would like to ride. It does " + "not have to be a set that anyone sells." diff --git a/VirtualGearsProduct/VirtualGearsApp.swift b/VirtualGearsProduct/VirtualGearsApp.swift index a108f1d..f6abc6a 100644 --- a/VirtualGearsProduct/VirtualGearsApp.swift +++ b/VirtualGearsProduct/VirtualGearsApp.swift @@ -95,7 +95,14 @@ struct VirtualGearsApp: App { enum ScreenshotFixture: String { case starting = "-shotStarting" case ready = "-shotReady" + case failed = "-shotFailed" case ride = "-shotRide" + case rideAccessibility = "-shotRideAccessibility" + case rideWaiting = "-shotRideWaiting" + case rideLowBattery = "-shotRideLowBattery" + case ridePending = "-shotRidePending" + case ridePressed = "-shotRidePressed" + case rideReconnecting = "-shotRideReconnecting" case settings = "-shotSettings" case gears = "-shotGears" case realGears = "-shotRealGears" @@ -130,7 +137,7 @@ private struct ScreenshotFixtureView: View { var body: some View { Group { switch scenario { - case .starting, .ready: + case .starting, .ready, .failed: StartupView( store: store, kickr: kickr, @@ -139,7 +146,8 @@ private struct ScreenshotFixtureView: View { coordinator: coordinator, beginsDiscovery: false ) - case .ride: + case .ride, .rideAccessibility, .rideWaiting, .rideLowBattery, + .ridePending, .ridePressed, .rideReconnecting: ShiftingView( store: store, kickr: kickr, @@ -170,6 +178,9 @@ private struct ScreenshotFixtureView: View { DemoModeView(onExit: {}) } } + .dynamicTypeSize( + scenario == .rideAccessibility ? .accessibility5 : .large + ) .task { stage() try? await Task.sleep(for: .milliseconds(500)) @@ -206,14 +217,43 @@ private struct ScreenshotFixtureView: View { speed: 50 ) - if scenario == .ready { + if scenario == .rideLowBattery { + click.stageScreenshot(name: configuration.clickName, batteryLevel: 15) + } else if scenario == .ridePressed { + click.stageScreenshotPressedButton(.plus) + } + + if scenario == .ready || scenario == .rideWaiting { (coordinator.peripheral as? FTMSPeripheral)? .stageScreenshotAdvertising() - } else if scenario == .ride { + } else if isRideScenario { (coordinator.peripheral as? FTMSPeripheral)? .stageScreenshotConnection() + } + if isRideScenario { coordinator.stageScreenshotRide(configuration: configuration) } + if scenario == .failed { + coordinator.stageScreenshotFailure("KICKR denied FTMS control") + } else if scenario == .ridePending { + coordinator.stageScreenshotPendingShift() + } else if scenario == .rideReconnecting { + kickr.stageScreenshot( + name: configuration.kickrName, + state: .connecting(name: configuration.kickrName) + ) + coordinator.stageScreenshotReconnecting() + } + } + + private var isRideScenario: Bool { + switch scenario { + case .ride, .rideAccessibility, .rideWaiting, .rideLowBattery, + .ridePending, .ridePressed, .rideReconnecting: + true + default: + false + } } } #endif diff --git a/VirtualGearsProduct/VirtualGearsHomeView.swift b/VirtualGearsProduct/VirtualGearsHomeView.swift index e6162c2..9356a85 100644 --- a/VirtualGearsProduct/VirtualGearsHomeView.swift +++ b/VirtualGearsProduct/VirtualGearsHomeView.swift @@ -330,8 +330,8 @@ struct StartupView: View { "Opens a simulated ride without connecting to a trainer" ) Text( - "No trainer nearby? Watch a simulated ride show how shifting " - + "resizes the trainer's wheel. Demo Mode does not use " + "No trainer nearby? Try the same large shift buttons and gear " + + "display used during a real ride. Demo Mode does not use " + "Bluetooth." ) .font(.footnote) @@ -358,7 +358,6 @@ struct StartupView: View { id: "trainer", name: store.configuration.kickrName.isEmpty ? "Trainer" : store.configuration.kickrName, - role: "Trainer", detail: connectionDetail(kickr.state), state: connectionState(kickr.state, isReady: kickr.isReady) ) @@ -368,7 +367,6 @@ struct StartupView: View { ConnectionStatusItem( id: "click", name: store.configuration.clickName, - role: "Zwift Click", detail: connectionDetail(click.state), state: connectionState( click.state, @@ -383,7 +381,6 @@ struct StartupView: View { ConnectionStatusItem( id: "headwind", name: store.configuration.headwindName ?? "Wahoo HEADWIND", - role: "Fan", detail: connectionDetail(headwind.state), state: connectionState( headwind.state, @@ -399,8 +396,7 @@ struct StartupView: View { items.append( ConnectionStatusItem( id: "riding-app", - name: "PC riding app", - role: "Riding app", + name: "Riding app", detail: steering ? "Connected and steering" : (connected ? "Connected" : "Waiting for connection"), @@ -479,7 +475,10 @@ struct StartupView: View { headwind.applySavedControlPreference() coordinator.startShifting(configuration: store.configuration) } label: { - Label("Start Shifting", systemImage: "bicycle") + Label( + canStart ? "Start Shifting" : "Waiting for trainer", + systemImage: canStart ? "bicycle" : "hourglass" + ) .font(.title2.bold()) .frame(maxWidth: .infinity, minHeight: 64) } @@ -614,11 +613,16 @@ struct DemoModeView: View { Label("Demo Mode · Simulated", systemImage: "testtube.2") .font(.title3.weight(.bold)) Text( - "No trainer is connected. This demo stays on your iPhone and " - + "does not use Bluetooth. The wheel sizes and commands " - + "below are the real ones a shift would send." + "Try the same large shift buttons and gear display used during " + + "a real ride." ) .font(.subheadline) + Text( + "No trainer is connected and Bluetooth stays off. The details " + + "below explain what a confirmed shift changes." + ) + .font(.footnote) + .foregroundStyle(.secondary) } .padding() .frame(maxWidth: .infinity, alignment: .leading) @@ -1258,7 +1262,10 @@ struct ShiftingView: View { } } label: { HStack(spacing: 4) { - Text(configuration.drivetrainName) + Text( + dynamicTypeSize.isAccessibilitySize + ? "Gears" : configuration.drivetrainName + ) .font(.headline) Image(systemName: "chevron.down") .font(.caption2.weight(.bold)) @@ -1346,85 +1353,122 @@ struct ShiftingView: View { return "\(problem.title), \(problem.detail)" } - /// Supporting detail, so it sits at the bottom in the quietest type on the - /// screen and never takes more than one line. When something is wrong that - /// single line becomes the plain-English problem instead, so the rider only - /// ever reads one thing down here. + /// Every device keeps its own status element. Accessibility sizes use two + /// columns rather than breaking short equipment names in the middle. private var equipmentFooter: some View { Group { if let problem = equipmentItems.first(where: { !$0.isOptional && $0.state != .ok }) { - Label( - "\(problem.title) · \(problem.detail)", - systemImage: problem.state.symbol + HStack(spacing: 6) { + Image(systemName: problem.state.symbol) + .foregroundStyle(problem.state.tint) + Text("\(problem.title) · \(problem.detail)") + } + .font(.body.weight(.semibold)) + .lineLimit(2) + .padding(.horizontal, 12) + .padding(.vertical, 8) + .background( + Color(.secondarySystemGroupedBackground), + in: Capsule() ) - .foregroundStyle(problem.state.tint) .accessibilityElement(children: .ignore) .accessibilityLabel(equipmentProblem ?? "") .accessibilityIdentifier("status.\(problem.id)") } else { - // The KICKR and the Click are grouped because Virtual Gears is - // the one connecting to them. The riding app is set apart - // because it connects to Virtual Gears instead. - VStack(spacing: 4) { - equipmentGroup(items: ownedEquipment) - HStack(spacing: 12) { - equipmentGroup(items: [ridingAppEquipment]) - // Deliberately separate from the Click's status symbol. - // Tinting that symbol would look like a lost connection. - if configuration.usesClick, click.isReady, click.batteryIsLow, - let battery = click.batteryLevel { - HStack(spacing: 4) { - Image(systemName: "battery.25percent") - .foregroundStyle(.orange) - Text("Click \(battery)%") + VStack(spacing: 6) { + if dynamicTypeSize.isAccessibilitySize { + Grid(horizontalSpacing: 6, verticalSpacing: 6) { + ForEach( + Array(statusRows.enumerated()), + id: \.offset + ) { _, row in + GridRow { + ForEach(row) { item in + equipmentStatus(item, expands: true) + } + } } - .accessibilityElement(children: .ignore) - .accessibilityLabel( - "Click battery low, \(battery) percent" - ) } - if coordinator.ridingAppSetWheelSize { - Text("Wheel size from your app") - .accessibilityLabel( - "Your riding app set the wheel size. " - + "Your gears are built around it." - ) + } else { + VStack(spacing: 4) { + HStack(spacing: 12) { + ForEach(ownedEquipment) { item in + equipmentStatus(item) + } + } + HStack(spacing: 12) { + equipmentStatus(ridingAppEquipment) + equipmentNotes + } } } + if dynamicTypeSize.isAccessibilitySize { + equipmentNotes + } } - .foregroundStyle(.secondary) } } - .font(.caption) - // The one line a rider most needs when something is wrong is the line - // that must not be squeezed away. Large text sizes are chosen by people - // who need them, so it wraps rather than shrinking to nothing. - .lineLimit(2) - .minimumScaleFactor(0.8) .multilineTextAlignment(.center) .frame(maxWidth: .infinity) .accessibilityElement(children: .contain) } - /// Every item carries its own tick. Sharing one tick across a group read as - /// though only the first piece of equipment was connected. - private func equipmentGroup(items: [EquipmentItem]) -> some View { - HStack(spacing: 10) { - ForEach(items) { item in + private var statusRows: [[EquipmentItem]] { + stride(from: 0, to: equipmentItems.count, by: 2).map { start in + Array(equipmentItems[start.. some View { + HStack(spacing: 5) { + Image(systemName: item.state.symbol) + .foregroundStyle(item.state.tint) + .accessibilityIdentifier("status.\(item.id).icon") + Text( + dynamicTypeSize.isAccessibilitySize && item.id == "ridingapp" + ? "App" : item.title + ) + .lineLimit(1) + .minimumScaleFactor(0.75) + .accessibilityIdentifier("status.\(item.id).label") + } + .font(.footnote.weight(.medium)) + .foregroundStyle(.secondary) + .padding(.vertical, expands ? 4 : 0) + .frame(maxWidth: expands ? .infinity : nil) + .accessibilityElement(children: .ignore) + .accessibilityLabel("\(item.title), \(item.detail)") + .accessibilityIdentifier("status.\(item.id)") + } + + @ViewBuilder + private var equipmentNotes: some View { + HStack(spacing: 12) { + if configuration.usesClick, click.isReady, click.batteryIsLow, + let battery = click.batteryLevel { HStack(spacing: 4) { - Image(systemName: item.state.symbol) - .foregroundStyle(item.state.tint) - .accessibilityIdentifier("status.\(item.id).icon") - Text(item.title) - .accessibilityIdentifier("status.\(item.id).label") + Image(systemName: "battery.25percent") + .foregroundStyle(.orange) + Text("Click \(battery)%") } .accessibilityElement(children: .ignore) - .accessibilityLabel("\(item.title), \(item.detail)") - .accessibilityIdentifier("status.\(item.id)") + .accessibilityLabel("Click battery low, \(battery) percent") + } + if coordinator.ridingAppSetWheelSize { + Text("Wheel size from your app") + .accessibilityLabel( + "Your riding app set the wheel size. " + + "Your gears are built around it." + ) } } + .font(.caption) + .foregroundStyle(.secondary) } private var equipmentItems: [EquipmentItem] { @@ -1439,7 +1483,8 @@ struct ShiftingView: View { title: "KICKR", state: kickr.isReady ? .ok : (kickr.state.isConnectionInProgress ? .pending : .warn), - detail: kickr.state.label + detail: coordinator.state == .reconnecting + ? "Reconnecting" : kickr.state.label ) ] if configuration.usesClick { @@ -1478,15 +1523,12 @@ struct ShiftingView: View { } else if isConnected { detail = "Connected" } else if isAdvertising { - // Virtual Gears broadcasts its own name, but iOS also reports the - // phone's name and will not let an app change it, so some riding - // apps list the phone instead. A rider hunting a name that is not - // there assumes it is broken, so name both before they look. - detail = "Pick Virtual Gears or your iPhone's name" + detail = "Waiting for connection" } else { detail = "Not advertising" } return EquipmentItem( + isOptional: true, id: "ridingapp", title: "Riding app", state: isConnected ? .ok : (isAdvertising ? .pending : .warn), @@ -1710,7 +1752,6 @@ private struct EquipmentItem: Identifiable { private struct ConnectionStatusItem: Identifiable { let id: String let name: String - let role: String let detail: String let state: EquipmentItem.LinkState } @@ -1735,7 +1776,7 @@ private struct ConnectionStatusList: View { Text(item.name) .font(.headline) .lineLimit(1) - Text("\(item.role) · \(item.detail)") + Text(item.detail) .font(.subheadline) .foregroundStyle(.secondary) .lineLimit(2) @@ -1745,7 +1786,7 @@ private struct ConnectionStatusList: View { .padding(.horizontal, 14) .padding(.vertical, 11) .accessibilityElement(children: .ignore) - .accessibilityLabel("\(item.name), \(item.role), \(item.detail)") + .accessibilityLabel("\(item.name), \(item.detail)") .accessibilityIdentifier("status.\(item.id)") } } @@ -1818,6 +1859,7 @@ private struct ShiftButton: View { if scenePhase != .active { cancelRepeat() } } .accessibilityLabel("Shift \(title.lowercased())") + .accessibilityValue(externallyPressed ? "Pressed" : "") .accessibilityHint( disabled ? "You are already in the last gear" : hint ) diff --git a/VirtualGearsUITests/VirtualGearsUITests.swift b/VirtualGearsUITests/VirtualGearsUITests.swift index 828967f..e8e8526 100644 --- a/VirtualGearsUITests/VirtualGearsUITests.swift +++ b/VirtualGearsUITests/VirtualGearsUITests.swift @@ -14,16 +14,36 @@ final class VirtualGearsUITests: XCTestCase { assertStatusItems(["trainer", "click", "headwind"]) } + func testStartingScreenUsesWaitingStateInsteadOfDisabledStartAction() { + launch("-shotStarting") + + assertVisibleElement(app.buttons["Waiting for trainer"]) + XCTAssertFalse(app.buttons["Start Shifting"].exists) + } + func testReadyScreenShowsTrainerAndRidingAppAdvertisingStatus() { launch("-shotReady") XCTAssertTrue(app.staticTexts["Ready to shift"].waitForExistence(timeout: 3)) assertStatusItems(["trainer", "click", "headwind", "riding-app"]) let ridingApp = app.descendants(matching: .any)["status.riding-app"] - XCTAssertTrue(ridingApp.label.contains("PC riding app")) + XCTAssertTrue(ridingApp.label.contains("Riding app")) XCTAssertTrue(ridingApp.label.contains("Waiting for connection")) } + func testReadyScreenUsesPlatformNeutralNonDuplicativeStatusCopy() { + launch("-shotReady") + + let trainer = app.descendants(matching: .any)["status.trainer"] + let click = app.descendants(matching: .any)["status.click"] + let fan = app.descendants(matching: .any)["status.headwind"] + let ridingApp = app.descendants(matching: .any)["status.riding-app"] + XCTAssertEqual(trainer.label, "Wahoo KICKR 2A93, Connected") + XCTAssertEqual(click.label, "Zwift Click, Connected") + XCTAssertEqual(fan.label, "KICKR HEADWIND 4D21, Connected") + XCTAssertEqual(ridingApp.label, "Riding app, Waiting for connection") + } + func testRideShowsAllStatusIconsAndPrimaryControls() { launch("-shotRide") @@ -37,6 +57,91 @@ final class VirtualGearsUITests: XCTestCase { assertStatusItems(["kickr", "click", "headwind", "ridingapp"]) } + func testRideKeepsEveryStatusIndependentlyVisible() { + launch("-shotRide") + + for identifier in ["kickr", "click", "headwind", "ridingapp"] { + let item = app.descendants(matching: .any)["status.\(identifier)"] + assertVisibleElement(item) + } + } + + func testAccessibilityRideKeepsStatusWordsAndToolbarSeparated() { + launch("-shotRideAccessibility") + + for identifier in ["kickr", "click", "headwind", "ridingapp"] { + let item = app.descendants(matching: .any)["status.\(identifier)"] + assertVisibleElement(item) + XCTAssertLessThanOrEqual( + item.frame.height, + 70, + "\(identifier) wrapped into a tall, broken label" + ) + } + let gearMenu = app.buttons.matching( + NSPredicate(format: "label CONTAINS %@", "gears") + ).firstMatch + assertVisibleElement(gearMenu) + for control in ["Settings", "Headwind controls"] { + XCTAssertTrue( + app.buttons[control].frame.intersection(gearMenu.frame).isNull, + "The gear menu overlaps \(control)" + ) + } + } + + func testRideWaitingForRidingAppKeepsEveryEquipmentStatus() { + launch("-shotRideWaiting") + + assertStatusItems(["kickr", "click", "headwind", "ridingapp"]) + XCTAssertTrue( + app.descendants(matching: .any)["status.ridingapp"].label + .contains("Waiting for connection") + ) + } + + func testRideShowsLowClickBatteryWithoutReplacingStatuses() { + launch("-shotRideLowBattery") + + assertStatusItems(["kickr", "click", "headwind", "ridingapp"]) + assertVisibleElement(app.descendants(matching: .any)["Click battery low, 15 percent"]) + } + + func testRideShowsPendingShiftFeedback() { + launch("-shotRidePending") + + assertVisibleElement(app.staticTexts["Shifting…"]) + assertStatusItems(["kickr", "click", "headwind", "ridingapp"]) + } + + func testAcceptedClickPressMarksMatchingButtonPressed() { + launch("-shotRidePressed") + + XCTAssertEqual(app.buttons["Shift harder"].value as? String, "Pressed") + XCTAssertNotEqual(app.buttons["Shift easier"].value as? String, "Pressed") + } + + func testReconnectProblemIsProminentAndPlainLanguage() { + launch("-shotRideReconnecting") + + let problem = app.descendants(matching: .any)["status.kickr"] + assertVisibleElement(problem) + XCTAssertGreaterThanOrEqual(problem.frame.height, 32) + XCTAssertTrue(problem.label.contains("Reconnecting")) + } + + func testStartupFailureExplainsConflictAndOffersRetry() { + launch("-shotFailed") + + assertVisibleElement(app.staticTexts["Shifting could not start"]) + assertVisibleElement( + app.staticTexts[ + "Your trainer would not hand over control. Something else may still be connected to it." + ] + ) + assertVisibleElement(app.buttons["Start Shifting"]) + } + func testRideStatusIconsRemainVisibleInLandscape() { launch("-shotRide") XCUIDevice.shared.orientation = .landscapeLeft @@ -86,6 +191,12 @@ final class VirtualGearsUITests: XCTestCase { XCTAssertTrue(app.buttons["Virtual gears"].exists) XCTAssertTrue(app.buttons["Copy a real bike"].exists) assertVisibleElement(app.staticTexts["24 gears"].firstMatch) + XCTAssertFalse(app.staticTexts.matching( + NSPredicate(format: "label CONTAINS[c] %@", "same hard end") + ).firstMatch.exists) + XCTAssertFalse(app.staticTexts.matching( + NSPredicate(format: "label CONTAINS[c] %@", "very wide") + ).firstMatch.exists) } func testRealGearChoiceNavigatesToChainringsAndCassette() { @@ -121,6 +232,11 @@ final class VirtualGearsUITests: XCTestCase { assertVisible("screen.demo") XCTAssertTrue(app.navigationBars["Demo Ride"].exists) + assertVisibleElement( + app.staticTexts[ + "Try the same large shift buttons and gear display used during a real ride." + ] + ) let gear = app.descendants(matching: .any)["Simulated gear"] assertVisibleElement(gear) let initialValue = gear.value as? String diff --git a/docs/APP_STORE.md b/docs/APP_STORE.md index 35a059d..366ecf0 100644 --- a/docs/APP_STORE.md +++ b/docs/APP_STORE.md @@ -76,8 +76,9 @@ the iPhone and when advertising itself as a trainer. Virtual Gears supplies and displays its own gears on the iPhone through an ordinary FTMS trainer connection; it does not support Zwift's native gear system. - You get a full set of gears you can shift through mid-ride — either 24 very wide - virtual gears or an exact copy of the gears on your real bike. + You get a full set of gears you can shift through mid-ride — either 24 evenly + spaced gears with an extra-low climbing range or an exact copy of the gears on + your real bike. NOTHING TO SET UP Open the app and it finds your trainer, connects to it and appears to your @@ -277,6 +278,13 @@ Build 8 restores the explicit Start Shifting step while making the transparent trainer proxy available as soon as the KICKR is ready, and keeps every configured equipment status visible on the shifting screen. +Source build 1.0 (9) has not yet been uploaded. It fixes the case where a riding +app waiting to connect replaced the KICKR, Click and fan statuses; each connection +now keeps its own status. It also adds adaptive status layout for +Accessibility Dynamic Type, clearer startup/status/gear/demo wording, and +deterministic UI coverage for failure, reconnect, waiting, low-battery, +pending-shift and physical-press states. + The live App Store description still carries the old "starts the session" sentence. It is corrected in this file and needs the same edit in App Store Connect on the next metadata change. diff --git a/docs/accessibility.md b/docs/accessibility.md index 0ab27ef..e14f403 100644 --- a/docs/accessibility.md +++ b/docs/accessibility.md @@ -26,6 +26,9 @@ and haptic, which occur only after the trainer confirms the shift. The ride controls use large targets in portrait and landscape. At Accessibility Dynamic Type sizes, the ride screen uses its vertical layout even when the phone is sideways so controls have room to reflow instead of being compressed. +Equipment statuses reflow into a two-column grid at those sizes, keeping short +names on one line instead of breaking words apart. The toolbar shortens the gear +menu label so it cannot overlap the equipment controls. Virtual Gears respects the iPhone's Reduce Motion setting for the gear-number transition. Connection and status states use names and symbols alongside diff --git a/docs/index.md b/docs/index.md index 287da3c..feda9c6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -114,6 +114,10 @@ Headwind and riding-app status. Demo Mode never uses Bluetooth and never changes saved equipment. It is a tour of the product, not evidence that untested physical hardware works. +During shifting, the trainer, Click, fan and riding app each keep their own +status. A riding app that is still waiting to connect does not hide +the equipment Virtual Gears already connected. + ### Everything changeable mid-ride Trainer, gears, Click and Headwind can all be changed from the ride screen. diff --git a/docs/screenshots/riding.png b/docs/screenshots/riding.png index 8f88c785358ddc3fe982e3d848dc2ff820bf5df6..f8258d4fd81152d08b563fc53bb5af9d81339e6c 100644 GIT binary patch literal 151479 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

f6NQAA{yr6-U@=ti$QWAf)i8U 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%0AyR%+-?n^U%sEs1HY;5-4*nyaJoX? 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%0AK`F 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�xd$T-k2NCk$Gr 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 T&nwpef9KA)e}g?8_``nz?xOC5 From ae2c4ecc874b447cb9666cb7943ac86bc3bfb6b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Br=C3=B6nner?= Date: Sat, 15 Aug 2026 16:06:39 +0200 Subject: [PATCH 4/8] Expand regression coverage Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: fce4c745-c85c-40aa-aac2-3dbbf605f9e7 --- .github/workflows/ci.yml | 22 +++++- DEVELOPMENT.md | 12 ++- .../AppConfigurationTests.swift | 44 +++++++++++ .../HeadwindProtocolTests.swift | 25 ++++++ .../ProductPresentationTests.swift | 79 +++++++++++++++++++ VirtualGearsUITests/VirtualGearsUITests.swift | 58 ++++++++++++++ 6 files changed, 235 insertions(+), 5 deletions(-) create mode 100644 Tests/VirtualGearsCoreTests/ProductPresentationTests.swift diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 11c39cb..bf5bace 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,27 @@ jobs: - uses: actions/checkout@v7 - name: Run the tests - run: swift test + run: swift test --enable-code-coverage + + - name: Require 90% core line coverage + run: | + binary="$(find .build -type f -name VirtualGearsPackageTests -print -quit)" + report="$( + xcrun llvm-cov report "$binary" \ + -instr-profile=.build/debug/codecov/default.profdata \ + -ignore-filename-regex='Tests|Tools' + )" + printf '%s\n' "$report" + coverage="$( + printf '%s\n' "$report" | + awk '/^TOTAL/ { gsub("%", "", $10); print $10 }' + )" + awk -v coverage="$coverage" 'BEGIN { + if (coverage + 0 < 90) { + printf "Core line coverage %.2f%% is below 90%%\n", coverage + exit 1 + } + }' build: name: App build diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index ce1182d..e7cc38d 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -27,9 +27,12 @@ does not add any physical-hardware evidence. Run the hardware-independent test suite: ```bash -swift test +swift test --enable-code-coverage ``` +CI requires at least 90% line coverage for `Sources/VirtualGearsCore`, excluding +tests and hardware investigation tools. + Run the simulator UI regression suite: ```bash @@ -41,11 +44,12 @@ xcodebuild test \ ``` `VirtualGearsUITests` launches deterministic debug fixtures rather than pretending -the simulator has Bluetooth hardware. Its 20 scenarios cover every primary +the simulator has Bluetooth hardware. Its 24 scenarios cover every primary screen, portrait and landscape status visibility, Accessibility Dynamic Type, startup failure, trainer reconnect, a riding app waiting, low Click battery, -pending shifts, accepted Click press feedback, navigation, Headwind controls and -Demo Mode interactions. Screenshots are attached to every test result. Protocol +pending shifts, accepted Click press feedback, navigation, stop confirmation, +gear-mode switching, Headwind controls and Demo Mode interactions in both shift +directions. Screenshots are attached to every test result. Protocol behavior and equipment lifecycle remain covered by the package tests and physical-hardware evidence. diff --git a/Tests/VirtualGearsCoreTests/AppConfigurationTests.swift b/Tests/VirtualGearsCoreTests/AppConfigurationTests.swift index f59aac8..5f9784e 100644 --- a/Tests/VirtualGearsCoreTests/AppConfigurationTests.swift +++ b/Tests/VirtualGearsCoreTests/AppConfigurationTests.swift @@ -75,6 +75,19 @@ final class AppConfigurationTests: XCTestCase { XCTAssertTrue(configuration.canFinishSetup) } + func testForgettingAHeadwindClearsBothStoredFields() { + var configuration = trainerReady() + configuration.rememberHeadwind(named: "HEADWIND 9267", id: UUID()) + XCTAssertTrue(configuration.usesHeadwind) + + configuration.forgetHeadwind() + + XCTAssertNil(configuration.headwindName) + XCTAssertNil(configuration.headwindUUID) + XCTAssertFalse(configuration.usesHeadwind) + XCTAssertTrue(configuration.canFinishSetup) + } + // MARK: - Gears the trainer can actually copy func testTheStartingChoiceIsSafeWithoutTheRiderTouchingAnything() { @@ -149,6 +162,37 @@ final class AppConfigurationTests: XCTestCase { XCTAssertEqual(configuration.gearCount, drivetrain.gears.count) } + func testRealDrivetrainsUsePartNamesAndDescribeTheirRange() { + let expectedDescriptions = [ + "close together, for flat roads", + "a normal road spread", + "wide, with easy climbing gears", + "very wide, for steep climbs", + ] + var observedDescriptions = Set() + + for chainring in DrivetrainCatalog.chainrings { + for cassette in DrivetrainCatalog.cassettes { + var configuration = trainerReady() + configuration.usesVirtualGears = false + configuration.chainringID = chainring.id + configuration.cassetteID = cassette.id + guard configuration.drivetrain != nil else { continue } + + XCTAssertEqual( + configuration.drivetrainName, + "\(chainring.name) · \(cassette.name)" + ) + for description in expectedDescriptions + where configuration.gearSummary.contains(description) { + observedDescriptions.insert(description) + } + } + } + + XCTAssertEqual(observedDescriptions, Set(expectedDescriptions)) + } + // MARK: - Surviving an update /// The configuration is stored on the phone between launches, so a rider diff --git a/Tests/VirtualGearsCoreTests/HeadwindProtocolTests.swift b/Tests/VirtualGearsCoreTests/HeadwindProtocolTests.swift index e99fbe4..3ba243c 100644 --- a/Tests/VirtualGearsCoreTests/HeadwindProtocolTests.swift +++ b/Tests/VirtualGearsCoreTests/HeadwindProtocolTests.swift @@ -2,6 +2,21 @@ import XCTest @testable import VirtualGearsCore final class HeadwindProtocolTests: XCTestCase { + func testEveryModeDescribesItsControlBehavior() { + let expectations: [(HeadwindMode, String, Bool)] = [ + (.off, "Off", false), + (.heartRate, "Heart-rate sensor", true), + (.speed, "Speed sensor", true), + (.manual, "Manual", false), + (.sleep, "Sleeping", false), + ] + + for (mode, label, isSensorControlled) in expectations { + XCTAssertEqual(mode.label, label) + XCTAssertEqual(mode.isSensorControlled, isSensorControlled) + } + } + func testEncodesEveryModeCommand() throws { XCTAssertEqual( Array(try HeadwindCommand.setMode(.heartRate).encode()), @@ -63,5 +78,15 @@ final class HeadwindProtocolTests: XCTestCase { ) { XCTAssertEqual($0 as? HeadwindProtocolError, .unknownMode(0xFF)) } + XCTAssertThrowsError( + try HeadwindMessageDecoder.decode(Data([0xFE, 0x04, 0x01, 0xFF])) + ) { + XCTAssertEqual($0 as? HeadwindProtocolError, .unknownMode(0xFF)) + } + XCTAssertThrowsError( + try HeadwindMessageDecoder.decode(Data([0x00, 0x00, 0x00, 0x00])) + ) { + XCTAssertEqual($0 as? HeadwindProtocolError, .malformedMessage) + } } } diff --git a/Tests/VirtualGearsCoreTests/ProductPresentationTests.swift b/Tests/VirtualGearsCoreTests/ProductPresentationTests.swift new file mode 100644 index 0000000..d751f35 --- /dev/null +++ b/Tests/VirtualGearsCoreTests/ProductPresentationTests.swift @@ -0,0 +1,79 @@ +import XCTest +@testable import VirtualGearsCore + +final class ProductPresentationTests: XCTestCase { + func testEveryConnectionStateHasPlainLanguageLabels() { + let states: [(ProductConnectionState, String, String)] = [ + (.unavailable("Bluetooth is off"), "Bluetooth is off", "Bluetooth is off"), + (.disconnected, "Not connected", "Not connected"), + (.scanning, "Looking for it…", "Looking for it…"), + (.reconnecting(attempt: 3), "Reconnecting…", "Reconnecting…"), + (.connecting(name: "KICKR"), "Connecting to KICKR…", "Connecting…"), + (.discovering, "Getting ready…", "Getting ready…"), + (.preparing, "Almost ready…", "Almost ready…"), + (.ready, "Ready", "Ready"), + (.disconnecting, "Disconnecting…", "Disconnecting…"), + (.failed("Control denied"), "Control denied", "Control denied"), + ] + + for (state, label, shortLabel) in states { + XCTAssertEqual(state.label, label) + XCTAssertEqual(state.shortLabel, shortLabel) + } + } + + func testEveryEquipmentDisplayStateHasALabel() { + XCTAssertEqual(EquipmentDisplayState.connected.label, "Connected") + XCTAssertEqual(EquipmentDisplayState.connecting.label, "Connecting") + XCTAssertEqual(EquipmentDisplayState.disconnected.label, "Not connected") + XCTAssertEqual(EquipmentDisplayState.notAdded.label, "Not added") + } + + func testDiscoveryCanReturnToSearchingAndReset() { + var discovery = DeviceDiscoveryState() + discovery.start() + discovery.observe(candidateCount: 1) + XCTAssertEqual(discovery.phase, .showingResults) + + discovery.observe(candidateCount: 0) + XCTAssertEqual(discovery.phase, .searching) + + discovery.reset() + XCTAssertEqual(discovery.phase, .idle) + } + + func testTrainerSafetyRoundsToTheCommandResolution() { + XCTAssertEqual(TrainerSafety.circumferenceAsSent(2_070.04), 2_070.0) + XCTAssertEqual(TrainerSafety.circumferenceAsSent(2_070.06), 2_070.1) + XCTAssertEqual( + TrainerSafety.widestSupportedSpan, + TrainerSafety.supportedScaleRange.upperBound + / TrainerSafety.supportedScaleRange.lowerBound + ) + } + + func testKickrCapabilitiesAndPeripheralSuccessKeepTheirValues() throws { + let feature = FitnessMachineFeature( + machineFeatures: [.cadence], + targetSettingFeatures: [] + ) + let resistance = try SupportedResistanceLevelRange( + minimumTenths: -10, + maximumTenths: 100, + incrementTenths: 1 + ) + let capabilities = KickrCapabilities( + feature: feature, + resistanceRange: resistance, + supportsWahooControl: true + ) + + XCTAssertEqual(capabilities.feature, feature) + XCTAssertEqual(capabilities.resistanceRange, resistance) + XCTAssertTrue(capabilities.supportsWahooControl) + + let result = FTMSPeripheralCommandResult.success(status: .startedOrResumed) + XCTAssertEqual(result.result, .success) + XCTAssertEqual(result.status, .startedOrResumed) + } +} diff --git a/VirtualGearsUITests/VirtualGearsUITests.swift b/VirtualGearsUITests/VirtualGearsUITests.swift index e8e8526..075e7b0 100644 --- a/VirtualGearsUITests/VirtualGearsUITests.swift +++ b/VirtualGearsUITests/VirtualGearsUITests.swift @@ -168,6 +168,17 @@ final class VirtualGearsUITests: XCTestCase { XCTAssertTrue(app.buttons["Stop Shifting"].exists) } + func testStoppingRequiresConfirmationBeforeRideControlsDisappear() { + launch("-shotRide") + + app.buttons["Stop virtual shifting"].tap() + + assertVisible("screen.ride") + assertVisibleElement(app.buttons["Shift easier"]) + assertVisibleElement(app.buttons["Shift harder"]) + assertVisibleElement(app.buttons["Stop Shifting"]) + } + func testSettingsNavigatesToEveryDestination() { launch("-shotSettings") @@ -199,6 +210,19 @@ final class VirtualGearsUITests: XCTestCase { ).firstMatch.exists) } + func testGearModeCanSwitchBetweenVirtualAndRealBikeOptions() { + launch("-shotGears") + + app.buttons["Copy a real bike"].tap() + assertVisibleElement(app.staticTexts["Chainrings"]) + assertVisibleElement(app.staticTexts["Cassette"]) + + app.buttons["Virtual gears"].tap() + XCTAssertFalse(app.staticTexts["Chainrings"].exists) + XCTAssertFalse(app.staticTexts["Cassette"].exists) + assertVisibleElement(app.staticTexts["24 gears"].firstMatch) + } + func testRealGearChoiceNavigatesToChainringsAndCassette() { launch("-shotRealGears") @@ -257,6 +281,40 @@ final class VirtualGearsUITests: XCTestCase { assertVisibleElement(app.buttons["50 percent"]) } + func testDemoCanShiftHarderAndEasierBackToItsStartingGear() { + launch("-shotDemo") + + let gear = app.descendants(matching: .any)["Simulated gear"] + assertVisibleElement(gear) + let initialValue = gear.value as? String + + app.buttons["Shift harder"].tap() + expectation( + for: NSPredicate(format: "value != %@", initialValue ?? ""), + evaluatedWith: gear + ) + waitForExpectations(timeout: 2) + + app.buttons["Shift easier"].tap() + expectation( + for: NSPredicate(format: "value == %@", initialValue ?? ""), + evaluatedWith: gear + ) + waitForExpectations(timeout: 2) + } + + func testDemoFanPresetsChangeTheDisplayedSpeed() { + launch("-shotDemo") + + app.buttons["Fan"].tap() + assertVisible("screen.demo-headwind") + app.buttons["Manual"].tap() + app.buttons["75 percent"].tap() + + XCTAssertTrue(app.buttons["75 percent"].isSelected) + XCTAssertFalse(app.buttons["50 percent"].isSelected) + } + private func launch(_ fixture: String) { continueAfterFailure = false app = XCUIApplication() From dc9a6f56947ad9e0667e81d2a356d62e78f2603a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Br=C3=B6nner?= Date: Sat, 15 Aug 2026 16:58:06 +0200 Subject: [PATCH 5/8] Say the ride status in words and let the rider cancel a stop The ride status sat in the middle of the toolbar, squeezed between the settings and fan controls on one side and Stop on the other. It lost its text long before it lost its icon: a reconnecting trainer showed the rider a bare orange warning triangle 21 points wide with nothing to explain it. The status now sits beside the gear, where it has room to be read, and the toolbar keeps only the gear menu. Stopping used a confirmation dialog, which on iOS 26 renders as a compact card that drops its cancel button entirely. A rider who tapped Stop by mistake mid-ride was left with a destructive choice and no visible way out. It is now an alert, which always shows both actions, and it says what stopping actually does. Both were found by reading rendered screens, and both are now guarded by UI tests with measured assertions rather than mere existence checks. --- DEVELOPMENT.md | 11 +-- .../VirtualGearsHomeView.swift | 69 ++++++++++++++----- VirtualGearsUITests/VirtualGearsUITests.swift | 33 +++++++++ docs/APP_STORE.md | 5 +- 4 files changed, 96 insertions(+), 22 deletions(-) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index e7cc38d..3b10dc8 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -44,12 +44,15 @@ xcodebuild test \ ``` `VirtualGearsUITests` launches deterministic debug fixtures rather than pretending -the simulator has Bluetooth hardware. Its 24 scenarios cover every primary +the simulator has Bluetooth hardware. Its 26 scenarios cover every primary screen, portrait and landscape status visibility, Accessibility Dynamic Type, startup failure, trainer reconnect, a riding app waiting, low Click battery, -pending shifts, accepted Click press feedback, navigation, stop confirmation, -gear-mode switching, Headwind controls and Demo Mode interactions in both shift -directions. Screenshots are attached to every test result. Protocol +pending shifts, accepted Click press feedback, navigation, stop confirmation and +cancellation, gear-mode switching, Headwind controls and Demo Mode interactions +in both shift directions. Two of them are regression guards with measured +assertions: the ride status must be wide enough to be read as words rather than +collapsing to an icon, and cancelling the stop confirmation must return to the +ride. Screenshots are attached to every test result. Protocol behavior and equipment lifecycle remain covered by the package tests and physical-hardware evidence. diff --git a/VirtualGearsProduct/VirtualGearsHomeView.swift b/VirtualGearsProduct/VirtualGearsHomeView.swift index 9356a85..01fb700 100644 --- a/VirtualGearsProduct/VirtualGearsHomeView.swift +++ b/VirtualGearsProduct/VirtualGearsHomeView.swift @@ -1146,15 +1146,13 @@ struct ShiftingView: View { .accessibilityLabel("Headwind controls") } } - // The middle of the bar says what the ride is doing whenever it - // is doing anything other than simply running. + // What the ride is doing is said in words next to the gear, not + // here. The middle of the bar is squeezed between the controls + // on either side, and a status put here loses its text long + // before it loses its icon, leaving a bare warning glyph with + // nothing to explain it. ToolbarItem(placement: .principal) { - if coordinator.state != .active { - Label(statusText, systemImage: statusSymbol) - .font(.footnote.weight(.semibold)) - .foregroundStyle(statusColor) - .lineLimit(1) - } else { + if coordinator.state == .active && !isChangingGears { gearsMenu } } @@ -1226,17 +1224,21 @@ struct ShiftingView: View { performFeedback(coordinator.lastShiftFeedback) announce("Gear \(gearAccessibilityValue)") } - .confirmationDialog( - "Stop virtual shifting?", - isPresented: $confirmsStop, - titleVisibility: .visible - ) { + // An alert rather than a confirmation dialog, because the dialog renders + // as a compact card that drops its cancel button entirely, leaving a + // rider mid-ride with a destructive choice and no visible way out. + .alert("Stop virtual shifting?", isPresented: $confirmsStop) { + Button("Cancel", role: .cancel) {} Button("Stop Shifting", role: .destructive) { onRiderStop() headwind.releaseFanControl() Task { await coordinator.stopShifting() } } - Button("Cancel", role: .cancel) {} + } message: { + Text( + "The trainer goes back to its own gearing. " + + "Your riding app stays connected." + ) } .accessibilityIdentifier("screen.ride") } @@ -1335,12 +1337,45 @@ struct ShiftingView: View { } private func gearHero(fontSize: CGFloat) -> some View { - gearReadout( - fontSize: fontSize - ) + VStack(spacing: 12) { + if showsRideStatus { + rideStatus + } + gearReadout( + fontSize: fontSize + ) + } .frame(maxWidth: .infinity, maxHeight: .infinity) } + /// True whenever the ride is doing something other than simply running, and + /// so has something to say to the rider. + private var showsRideStatus: Bool { + coordinator.state != .active || isChangingGears + } + + /// Says what the ride is doing, in words, at a size that survives being read + /// from a bike. The icon carries no meaning on its own, so it is hidden from + /// VoiceOver and never allowed to appear without its text. + private var rideStatus: some View { + HStack(spacing: 8) { + Image(systemName: statusSymbol) + .font(.title3.weight(.semibold)) + .accessibilityHidden(true) + Text(statusText) + .font(.title3.weight(.semibold)) + .multilineTextAlignment(.leading) + .lineLimit(3) + .minimumScaleFactor(0.7) + } + .foregroundStyle(statusColor) + .padding(.horizontal, 16) + .padding(.vertical, 10) + .background(statusColor.opacity(0.14), in: .rect(cornerRadius: 16)) + .accessibilityElement(children: .combine) + .accessibilityIdentifier("ride.status") + } + private var hasEquipmentProblem: Bool { equipmentItems.contains { !$0.isOptional && $0.state != .ok } } diff --git a/VirtualGearsUITests/VirtualGearsUITests.swift b/VirtualGearsUITests/VirtualGearsUITests.swift index 075e7b0..7acf1da 100644 --- a/VirtualGearsUITests/VirtualGearsUITests.swift +++ b/VirtualGearsUITests/VirtualGearsUITests.swift @@ -130,6 +130,19 @@ final class VirtualGearsUITests: XCTestCase { XCTAssertTrue(problem.label.contains("Reconnecting")) } + func testReconnectStatusIsSpelledOutRatherThanShrunkToAnIcon() { + launch("-shotRideReconnecting") + + let status = app.descendants(matching: .any)["ride.status"] + assertVisibleElement(status) + XCTAssertEqual(status.label, "Control lost · reconnecting") + XCTAssertGreaterThan( + status.frame.width, + 200, + "The ride status is squeezed down to a wordless icon" + ) + } + func testStartupFailureExplainsConflictAndOffersRetry() { launch("-shotFailed") @@ -179,6 +192,26 @@ final class VirtualGearsUITests: XCTestCase { assertVisibleElement(app.buttons["Stop Shifting"]) } + func testCancellingTheStopConfirmationReturnsToTheRide() { + launch("-shotRide") + + app.buttons["Stop virtual shifting"].tap() + + assertVisibleElement(app.buttons["Stop Shifting"]) + assertVisibleElement(app.buttons["Cancel"]) + + app.buttons["Cancel"].tap() + + XCTAssertFalse( + app.buttons["Stop Shifting"].waitForExistence(timeout: 1), + "Cancelling left the confirmation on screen" + ) + assertVisible("screen.ride") + assertVisibleElement(app.buttons["Shift easier"]) + assertVisibleElement(app.buttons["Shift harder"]) + assertVisibleElement(app.buttons["Stop virtual shifting"]) + } + func testSettingsNavigatesToEveryDestination() { launch("-shotSettings") diff --git a/docs/APP_STORE.md b/docs/APP_STORE.md index 366ecf0..7b19083 100644 --- a/docs/APP_STORE.md +++ b/docs/APP_STORE.md @@ -283,7 +283,10 @@ app waiting to connect replaced the KICKR, Click and fan statuses; each connecti now keeps its own status. It also adds adaptive status layout for Accessibility Dynamic Type, clearer startup/status/gear/demo wording, and deterministic UI coverage for failure, reconnect, waiting, low-battery, -pending-shift and physical-press states. +pending-shift and physical-press states. It moves the ride status out of the +title bar, where it was squeezed until only a wordless warning icon remained, to +a legible line beside the gear, and gives the stop confirmation a visible Cancel +so a rider is never shown a destructive choice with no way out. The live App Store description still carries the old "starts the session" sentence. It is corrected in this file and needs the same edit in App Store From 6e75d768acca9e0eae9fefc7a0224830bc5cecbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Br=C3=B6nner?= Date: Sat, 15 Aug 2026 17:34:25 +0200 Subject: [PATCH 6/8] Make the ride screen show what only it can show The gear rail was a row of identical dots with one coloured in, which can only be read by counting. It now fills in the gears already ridden through and gives every marker kind its own height, so a position can be seen rather than counted, and still reads in greyscale. The line under the gear was a fixed large title competing with the number it describes; it is now sized as a caption to it. Easier and harder were two identical slabs distinguished by a small symbol. Harder is drawn solid and easier tinted, so they differ in weight as well as in glyph and word. Neutral grey was tried first and read as disabled, so the lighter button keeps its tint. The four equipment statuses were split three-and-one, orphaning the riding app. They now share a row. A Click battery about to die was a grey caption; it is the one thing on that screen a rider can still act on, so it is drawn as a warning. In settings, a Click that reports itself as "Zwift Click" no longer repeats the row's own title, the gears row leads with the gears chosen rather than a count of them, and cassettes that share a name are told apart by their cog count where no heading does it for them. Retrying a failed start says Try Again rather than Start Shifting, which read as though nothing had been attempted. The rail model, the read-out sizing and the cassette naming are pure functions in the core package with tests, rather than numbers typed into a view. Two more UI tests measure the status row and the battery warning. --- DEVELOPMENT.md | 12 +- .../VirtualGearsCore/DrivetrainCatalog.swift | 8 + .../GearRailPresentation.swift | 72 ++++++++ .../RideReadoutPresentationTests.swift | 104 ++++++++++++ VirtualGearsProduct/SetupView.swift | 30 +++- .../VirtualGearsHomeView.swift | 158 ++++++++++++------ VirtualGearsUITests/VirtualGearsUITests.swift | 28 +++- docs/APP_STORE.md | 10 +- 8 files changed, 359 insertions(+), 63 deletions(-) create mode 100644 Sources/VirtualGearsCore/GearRailPresentation.swift create mode 100644 Tests/VirtualGearsCoreTests/RideReadoutPresentationTests.swift diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 3b10dc8..1d94d90 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -44,15 +44,17 @@ xcodebuild test \ ``` `VirtualGearsUITests` launches deterministic debug fixtures rather than pretending -the simulator has Bluetooth hardware. Its 26 scenarios cover every primary +the simulator has Bluetooth hardware. Its 28 scenarios cover every primary screen, portrait and landscape status visibility, Accessibility Dynamic Type, startup failure, trainer reconnect, a riding app waiting, low Click battery, pending shifts, accepted Click press feedback, navigation, stop confirmation and cancellation, gear-mode switching, Headwind controls and Demo Mode interactions -in both shift directions. Two of them are regression guards with measured -assertions: the ride status must be wide enough to be read as words rather than -collapsing to an icon, and cancelling the stop confirmation must return to the -ride. Screenshots are attached to every test result. Protocol +in both shift directions. Four of them are regression guards with measured +assertions rather than existence checks: the ride status must be wide enough to +be read as words rather than collapsing to an icon, cancelling the stop +confirmation must return to the ride, every equipment status must sit on one +row, and a low Click battery must be drawn at warning weight. Screenshots are +attached to every test result. Protocol behavior and equipment lifecycle remain covered by the package tests and physical-hardware evidence. diff --git a/Sources/VirtualGearsCore/DrivetrainCatalog.swift b/Sources/VirtualGearsCore/DrivetrainCatalog.swift index 4695b71..fc9344d 100644 --- a/Sources/VirtualGearsCore/DrivetrainCatalog.swift +++ b/Sources/VirtualGearsCore/DrivetrainCatalog.swift @@ -40,6 +40,14 @@ public struct CassetteOption: Identifiable, Equatable, Sendable { guard let smallest = cogs.first, let largest = cogs.last else { return "" } return "\(smallest)-\(largest)" } + + /// The name plus what tells it apart from the others that share it. Several + /// cassettes are called "11-28"; on a screen that lists them under their own + /// cog-count headings that is clear, but anywhere else — the selected value, + /// VoiceOver — it names three different parts at once. + public var qualifiedName: String { + "\(name) · \(speeds) cogs" + } } /// Real parts a rider can buy, so a saved setup shifts like the bike it names. diff --git a/Sources/VirtualGearsCore/GearRailPresentation.swift b/Sources/VirtualGearsCore/GearRailPresentation.swift new file mode 100644 index 0000000..af59e86 --- /dev/null +++ b/Sources/VirtualGearsCore/GearRailPresentation.swift @@ -0,0 +1,72 @@ +import Foundation + +/// How one gear is drawn on the position rail under the gear number. +/// +/// The rail used to be a row of identical dots with one of them coloured. That +/// can only be read by counting, which is not something a rider does at 90rpm, +/// so the rail said little the number above it had not already said. Filling in +/// the gears behind the rider turns it into a picture of where they are in the +/// range, which is the one thing the number cannot show. +public enum GearRailMarker: String, CaseIterable, Equatable, Sendable { + /// The gear the trainer has confirmed. + case selected + /// An easier gear the rider has already come up through. + case behind + /// A harder gear still available. + case ahead + /// The gear the rider has asked for and the trainer has not confirmed yet. + case requested + + /// How tall this marker is drawn, as a fraction of the tallest one. + /// + /// Every kind has its own height so the rail still reads when colour does + /// not: in greyscale, to a rider who cannot tell the colours apart, or + /// through a phone screen with sweat on it. + public var relativeHeight: Double { + switch self { + case .selected: 1 + case .requested: 0.75 + case .behind: 0.5 + case .ahead: 0.3 + } + } +} + +public enum GearRail { + /// Describes each position on the rail for a gear range of `count` gears. + /// + /// A requested gear is only ever drawn while it differs from the confirmed + /// one, so the rail never shows a gear the trainer has not agreed to as if + /// it were the gear being ridden. + public static func markers( + count: Int, + selected: Int?, + requested: Int? + ) -> [GearRailMarker] { + guard count > 0 else { return [] } + let range = 0.. Double { + min(24, max(15, primary * 0.09)) + } +} diff --git a/Tests/VirtualGearsCoreTests/RideReadoutPresentationTests.swift b/Tests/VirtualGearsCoreTests/RideReadoutPresentationTests.swift new file mode 100644 index 0000000..7e02c38 --- /dev/null +++ b/Tests/VirtualGearsCoreTests/RideReadoutPresentationTests.swift @@ -0,0 +1,104 @@ +import XCTest +@testable import VirtualGearsCore + +/// The gear read-out is the only thing on the screen a rider looks at while +/// pedalling, so how it is drawn is a decision worth pinning down rather than +/// leaving to whichever font size someone last typed into the view. +final class RideReadoutPresentationTests: XCTestCase { + func testTheRailFillsEveryGearBehindTheConfirmedOne() { + let markers = GearRail.markers(count: 8, selected: 3, requested: nil) + + XCTAssertEqual( + markers, + [.behind, .behind, .behind, .selected, .ahead, .ahead, .ahead, .ahead] + ) + } + + func testTheRailMarksTheRequestedGearUntilTheTrainerConfirmsIt() { + let harder = GearRail.markers(count: 6, selected: 2, requested: 4) + XCTAssertEqual( + harder, + [.behind, .behind, .selected, .ahead, .requested, .ahead] + ) + + let easier = GearRail.markers(count: 6, selected: 4, requested: 1) + XCTAssertEqual( + easier, + [.behind, .requested, .behind, .behind, .selected, .ahead] + ) + } + + func testAConfirmedRequestIsDrawnOnlyAsTheSelectedGear() { + let markers = GearRail.markers(count: 4, selected: 2, requested: 2) + + XCTAssertEqual(markers, [.behind, .behind, .selected, .ahead]) + XCTAssertFalse(markers.contains(.requested)) + } + + func testAnUnconfirmedRailClaimsNoPosition() { + let markers = GearRail.markers(count: 3, selected: nil, requested: nil) + + XCTAssertEqual(markers, [.ahead, .ahead, .ahead]) + XCTAssertFalse(markers.contains(.selected)) + XCTAssertFalse(markers.contains(.behind)) + } + + func testTheRailIgnoresPositionsThatDoNotExist() { + XCTAssertTrue(GearRail.markers(count: 0, selected: 0, requested: 0).isEmpty) + XCTAssertTrue(GearRail.markers(count: -4, selected: nil, requested: nil).isEmpty) + XCTAssertEqual( + GearRail.markers(count: 3, selected: 9, requested: -2), + [.ahead, .ahead, .ahead] + ) + } + + func testEveryMarkerKindIsDistinguishableWithoutColour() { + // Colour alone is not readable at a glance on a bike, and is not + // readable at all to a rider who cannot tell these colours apart. + let heights = Set(GearRailMarker.allCases.map(\.relativeHeight)) + XCTAssertEqual(heights.count, GearRailMarker.allCases.count) + XCTAssertEqual(GearRailMarker.selected.relativeHeight, 1) + for marker in GearRailMarker.allCases where marker != .selected { + XCTAssertLessThan(marker.relativeHeight, 1) + XCTAssertGreaterThan(marker.relativeHeight, 0) + } + } + + func testTheSecondLineStaysSubordinateToTheGearNumber() { + // The gear position owns the screen. Everything else on the read-out is + // a caption to it, whatever size the gear itself ends up being — unless + // being subordinate would take it below the size it can still be read + // at, in which case being readable wins. + for primary in stride(from: 44.0, through: 320.0, by: 4.0) { + let secondary = GearReadoutMetrics.secondaryPointSize(forPrimary: primary) + XCTAssertGreaterThanOrEqual(secondary, 15) + XCTAssertLessThanOrEqual(secondary, 24) + XCTAssertTrue( + secondary <= primary * 0.3 || secondary == 15, + "\(secondary)pt is too loud next to a \(primary)pt gear" + ) + } + } + + func testTheSecondLineNeverShrinksAsTheGearGrows() { + let sizes = stride(from: 44.0, through: 320.0, by: 8.0) + .map(GearReadoutMetrics.secondaryPointSize(forPrimary:)) + + XCTAssertEqual(sizes, sizes.sorted()) + } + + func testCassettesOfTheSameSpreadAreToldApartByTheirCogCount() { + // Three different cassettes are all called "11-28". Saying only that + // leaves a rider unable to tell which one they picked. + let repeated = Dictionary(grouping: DrivetrainCatalog.cassettes, by: \.name) + .filter { $0.value.count > 1 } + XCTAssertFalse(repeated.isEmpty, "The catalogue no longer repeats a name") + + for option in DrivetrainCatalog.cassettes { + XCTAssertEqual(option.qualifiedName, "\(option.name) · \(option.speeds) cogs") + } + + let qualified = Set(DrivetrainCatalog.cassettes.map(\.qualifiedName)) + XCTAssertEqual(qualified.count, DrivetrainCatalog.cassettes.count) + } +} diff --git a/VirtualGearsProduct/SetupView.swift b/VirtualGearsProduct/SetupView.swift index ec991d9..4d4c500 100644 --- a/VirtualGearsProduct/SetupView.swift +++ b/VirtualGearsProduct/SetupView.swift @@ -110,10 +110,18 @@ struct SetupView: View { } } - private var shiftingValue: String { + /// The saved name, unless it is the row's own title. A Click that reports + /// itself as "Zwift Click" under a row called "Zwift Click" says the same + /// word twice and tells the rider nothing; the badge beside it already says + /// whether it is there. + private var shiftingValue: String? { let name = store.configuration.clickName .trimmingCharacters(in: .whitespacesAndNewlines) - return name.isEmpty ? "Not added" : name + if name.isEmpty { return "Not added" } + guard name.caseInsensitiveCompare("Zwift Click") != .orderedSame else { + return nil + } + return name } private var gearsSection: some View { @@ -121,11 +129,14 @@ struct SetupView: View { NavigationLink { GearChoiceView(store: store) } label: { + // The row leads with what the rider chose, not with a count of + // it. "24 gears · extra-low climbing range" under the word Gears + // describes the result of a decision without ever naming it. LabeledContent { - Text(store.configuration.drivetrainName) + Text(store.configuration.gearSummary) } label: { Text("Gears") - Text(store.configuration.gearSummary) + Text(store.configuration.drivetrainName) } } @@ -696,7 +707,7 @@ struct GearChoiceView: View { } label: { LabeledContent( "Cassette", - value: store.configuration.cassette.name + value: store.configuration.cassette.qualifiedName ) } } header: { @@ -898,6 +909,7 @@ private struct CassetteChoiceView: View { ForEach(options(speeds: speeds)) { option in ChoiceRow( title: option.name, + spokenTitle: option.qualifiedName, note: option.note, detail: option.cogs.map(String.init) .joined(separator: ", "), @@ -936,6 +948,10 @@ private struct CassetteChoiceView: View { /// dimmed and says why, rather than disappearing and leaving the rider guessing. private struct ChoiceRow: View { let title: String + /// What VoiceOver says, when the visible title alone is ambiguous. Three + /// cassettes are called "11-28"; on screen their section heading tells them + /// apart, but a rider hearing the list gets no heading with each row. + var spokenTitle: String? let note: String let detail: String? let selected: Bool @@ -972,8 +988,8 @@ private struct ChoiceRow: View { .opacity(fits ? 1 : 0.5) .accessibilityLabel( fits - ? "\(title), \(note)" - : "\(title), too wide to combine with your other choice" + ? "\(spokenTitle ?? title), \(note)" + : "\(spokenTitle ?? title), too wide to combine with your other choice" ) .accessibilityAddTraits(selected ? .isSelected : []) } diff --git a/VirtualGearsProduct/VirtualGearsHomeView.swift b/VirtualGearsProduct/VirtualGearsHomeView.swift index 01fb700..45a5b28 100644 --- a/VirtualGearsProduct/VirtualGearsHomeView.swift +++ b/VirtualGearsProduct/VirtualGearsHomeView.swift @@ -470,14 +470,19 @@ struct StartupView: View { } } + /// The same control starts shifting and tries again after a failure. After a + /// failure "Start Shifting" reads as though nothing had been attempted, + /// which is exactly the doubt the card above it has just resolved. private var retryButton: some View { Button { headwind.applySavedControlPreference() coordinator.startShifting(configuration: store.configuration) } label: { Label( - canStart ? "Start Shifting" : "Waiting for trainer", - systemImage: canStart ? "bicycle" : "hourglass" + retryTitle, + systemImage: canStart + ? (failureMessage == nil ? "bicycle" : "arrow.clockwise") + : "hourglass" ) .font(.title2.bold()) .frame(maxWidth: .infinity, minHeight: 64) @@ -490,6 +495,11 @@ struct StartupView: View { ) } + private var retryTitle: String { + guard canStart else { return "Waiting for trainer" } + return failureMessage == nil ? "Start Shifting" : "Try Again" + } + // MARK: - Starting /// Readiness means actually connected, not merely remembered. @@ -1427,17 +1437,15 @@ struct ShiftingView: View { } } } else { - VStack(spacing: 4) { - HStack(spacing: 12) { - ForEach(ownedEquipment) { item in - equipmentStatus(item) - } - } - HStack(spacing: 12) { - equipmentStatus(ridingAppEquipment) - equipmentNotes + // One row for everything. Splitting three across the top + // and one underneath left the riding app looking like a + // different kind of thing to the equipment above it. + HStack(spacing: 10) { + ForEach(equipmentItems) { item in + equipmentStatus(item) } } + equipmentNotes } if dynamicTypeSize.isAccessibilitySize { equipmentNotes @@ -1486,13 +1494,21 @@ struct ShiftingView: View { HStack(spacing: 12) { if configuration.usesClick, click.isReady, click.batteryIsLow, let battery = click.batteryLevel { - HStack(spacing: 4) { + // A shifter about to go flat mid-ride is not a footnote. It is + // the one thing on this screen a rider can still do something + // about, so it is drawn as the warning it is. + HStack(spacing: 5) { Image(systemName: "battery.25percent") - .foregroundStyle(.orange) - Text("Click \(battery)%") + Text("Click battery \(battery)%") } + .font(.footnote.weight(.semibold)) + .foregroundStyle(.orange) + .padding(.horizontal, 10) + .padding(.vertical, 5) + .background(Color.orange.opacity(0.16), in: Capsule()) .accessibilityElement(children: .ignore) .accessibilityLabel("Click battery low, \(battery) percent") + .accessibilityIdentifier("note.clickBattery") } if coordinator.ridingAppSetWheelSize { Text("Wheel size from your app") @@ -1588,7 +1604,15 @@ struct ShiftingView: View { .accessibilityLabel("Gear") .accessibilityValue(gearAccessibilityValue) Text(secondaryGearText) - .font(.largeTitle.weight(.bold)) + .font( + .system( + size: GearReadoutMetrics.secondaryPointSize( + forPrimary: max(44, fontSize) + ), + weight: .semibold, + design: .rounded + ) + ) .foregroundStyle(isShiftPending ? AnyShapeStyle(.tint) : AnyShapeStyle(.secondary)) .lineLimit(1) .minimumScaleFactor(0.6) @@ -1623,7 +1647,8 @@ struct ShiftingView: View { : "Requests the next harder gear. Hold to keep shifting harder.", disabled: easier ? !coordinator.canShiftEasier : !coordinator.canShiftHarder, externallyPressed: click.pressedButton - == (easier ? .minus : .plus) + == (easier ? .minus : .plus), + isProminent: !easier ) { coordinator.shift(direction) } repeatAction: { @@ -1840,6 +1865,11 @@ private struct ShiftButton: View { let hint: String let disabled: Bool var externallyPressed = false + /// Harder is drawn solid and easier is drawn light. Two identical slabs + /// differing only by a small symbol have to be read before they can be + /// used; a difference in weight can be seen without looking directly at + /// it, and survives being seen in greyscale. + var isProminent = true let action: () -> Void let repeatAction: () -> Void let releaseAction: () -> Void @@ -1854,20 +1884,8 @@ private struct ShiftButton: View { @State private var suppressTapUntil: Date? var body: some View { - Button(action: tapped) { - VStack(spacing: 6) { - Image(systemName: symbol) - .font(.system(size: symbolSize, weight: .black, design: .rounded)) - .frame(height: symbolSize) - Text(title) - .font(.title2.weight(.bold)) - .lineLimit(1) - .minimumScaleFactor(0.6) - } - .frame(maxWidth: .infinity, maxHeight: .infinity) - } - .buttonStyle(.borderedProminent) - .buttonBorderShape(.roundedRectangle(radius: 24)) + styledButton + .buttonBorderShape(.roundedRectangle(radius: 24)) .disabled(disabled) .brightness(externallyPressed ? -0.12 : 0) .scaleEffect(externallyPressed && !reduceMotion ? 0.96 : 1) @@ -1900,6 +1918,37 @@ private struct ShiftButton: View { ) } + @ViewBuilder + private var styledButton: some View { + if isProminent { + plainButton.buttonStyle(.borderedProminent) + } else { + // Tinted rather than neutral: a grey slab beside a solid one reads + // as unavailable, and this button is anything but. + plainButton + .buttonStyle(.bordered) + .background( + Color.accentColor.opacity(disabled ? 0 : 0.16), + in: RoundedRectangle(cornerRadius: 24) + ) + } + } + + private var plainButton: some View { + Button(action: tapped) { + VStack(spacing: 6) { + Image(systemName: symbol) + .font(.system(size: symbolSize, weight: .black, design: .rounded)) + .frame(height: symbolSize) + Text(title) + .font(.title2.weight(.bold)) + .lineLimit(1) + .minimumScaleFactor(0.6) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + } + private func tapped() { if let suppressTapUntil, Date() < suppressTapUntil { self.suppressTapUntil = nil @@ -1953,44 +2002,55 @@ private struct GearPositionRail: View { @Environment(\.accessibilityDifferentiateWithoutColor) private var differentiate var body: some View { - GeometryReader { proxy in + let markers = GearRail.markers( + count: gears.count, + selected: selectedIndex, + requested: requestedIndex + ) + return GeometryReader { proxy in let spacing: CGFloat = 4 let width = max( 3, - (proxy.size.width - spacing * CGFloat(max(0, gears.count - 1))) - / CGFloat(max(1, gears.count)) + (proxy.size.width - spacing * CGFloat(max(0, markers.count - 1))) + / CGFloat(max(1, markers.count)) ) - HStack(spacing: spacing) { - ForEach(Array(gears.indices), id: \.self) { index in + // Bottom-aligned, so the filled gears behind the rider read as a + // level rising through the range rather than a row of dots that can + // only be understood by counting them. + HStack(alignment: .bottom, spacing: spacing) { + ForEach(Array(markers.enumerated()), id: \.offset) { _, marker in Capsule() - .fill(fill(for: index)) - .frame(width: width, height: index == selectedIndex ? 34 : 16) + .fill(fill(marker)) + .frame( + width: width, + height: Self.height * marker.relativeHeight + ) .overlay { - if isTarget(index) || (differentiate && index == selectedIndex) { + if marker == .requested + || (differentiate && marker == .selected) { Capsule().stroke(Color.accentColor, lineWidth: 2) } } } } - .frame(maxHeight: .infinity) + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottom) } - .frame(height: 40) + .frame(height: Self.height) // The big readout directly above already says which gear this is, and // saying it twice makes a rider swipe past the same fact to reach the // shift buttons. This is a picture of what that number means. .accessibilityHidden(true) } - private func fill(for index: Int) -> Color { - if index == selectedIndex { return .accentColor } - return .secondary.opacity(0.35) - } + private static let height: CGFloat = 44 - /// The gear the rider asked for is outlined until the trainer confirms it, - /// so a tap is acknowledged without ever showing it as the current gear. - private func isTarget(_ index: Int) -> Bool { - guard let requestedIndex, requestedIndex != selectedIndex else { return false } - return index == requestedIndex + private func fill(_ marker: GearRailMarker) -> Color { + switch marker { + case .selected: .accentColor + case .requested: .accentColor.opacity(0.45) + case .behind: .accentColor.opacity(0.4) + case .ahead: .secondary.opacity(0.3) + } } } diff --git a/VirtualGearsUITests/VirtualGearsUITests.swift b/VirtualGearsUITests/VirtualGearsUITests.swift index 7acf1da..1089a76 100644 --- a/VirtualGearsUITests/VirtualGearsUITests.swift +++ b/VirtualGearsUITests/VirtualGearsUITests.swift @@ -143,6 +143,32 @@ final class VirtualGearsUITests: XCTestCase { ) } + func testEveryEquipmentStatusSitsOnASingleRow() { + launch("-shotRide") + + let centres = ["kickr", "click", "headwind", "ridingapp"].map { + app.descendants(matching: .any)["status.\($0)"].frame.midY + } + let spread = (centres.max() ?? 0) - (centres.min() ?? 0) + XCTAssertLessThan( + spread, + 8, + "The equipment statuses are split across rows, orphaning one of them" + ) + } + + func testLowClickBatteryIsWarnedAboutRatherThanFootnoted() { + launch("-shotRideLowBattery") + + let note = app.descendants(matching: .any)["note.clickBattery"] + assertVisibleElement(note) + XCTAssertGreaterThanOrEqual( + note.frame.height, + 24, + "A dying shifter battery is drawn as quietly as a caption" + ) + } + func testStartupFailureExplainsConflictAndOffersRetry() { launch("-shotFailed") @@ -152,7 +178,7 @@ final class VirtualGearsUITests: XCTestCase { "Your trainer would not hand over control. Something else may still be connected to it." ] ) - assertVisibleElement(app.buttons["Start Shifting"]) + assertVisibleElement(app.buttons["Try Again"]) } func testRideStatusIconsRemainVisibleInLandscape() { diff --git a/docs/APP_STORE.md b/docs/APP_STORE.md index 7b19083..a02caec 100644 --- a/docs/APP_STORE.md +++ b/docs/APP_STORE.md @@ -286,7 +286,15 @@ deterministic UI coverage for failure, reconnect, waiting, low-battery, pending-shift and physical-press states. It moves the ride status out of the title bar, where it was squeezed until only a wordless warning icon remained, to a legible line beside the gear, and gives the stop confirmation a visible Cancel -so a rider is never shown a destructive choice with no way out. +so a rider is never shown a destructive choice with no way out. The ride screen +was then reworked around what only it can show: the position rail fills in the +gears already ridden through so a position can be seen instead of counted, the +line under the gear became a caption rather than a rival to it, easier and harder +are told apart by weight as well as by symbol, every equipment status sits on one +row, and a low Click battery is drawn as a warning. Settings stopped saying +"Zwift Click" twice in one row, the gears row leads with the gears chosen rather +than a count of them, cassettes that share a name are told apart by their cog +count, and retrying a failed start says "Try Again". The live App Store description still carries the old "starts the session" sentence. It is corrected in this file and needs the same edit in App Store From 444b5cbbe048ca225f7173c4210a66475f54ed98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Br=C3=B6nner?= Date: Sat, 15 Aug 2026 18:14:45 +0200 Subject: [PATCH 7/8] Ship build 1.0 (10) to TestFlight Build 9 was archived but never uploaded, so build 10 carries everything since build 8: the per-connection statuses, the ride status that says what it means in words, the stop confirmation a rider can back out of, and the ride screen reworked around what only it can show. The release note records that all of it was made against the simulator and none of it has been ridden on a physical KICKR yet. --- VirtualGears.xcodeproj/project.pbxproj | 4 ++-- docs/APP_STORE.md | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/VirtualGears.xcodeproj/project.pbxproj b/VirtualGears.xcodeproj/project.pbxproj index 8c44bdb..228ff4c 100644 --- a/VirtualGears.xcodeproj/project.pbxproj +++ b/VirtualGears.xcodeproj/project.pbxproj @@ -316,7 +316,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 9; + CURRENT_PROJECT_VERSION = 10; DEVELOPMENT_TEAM = MNW6SJT4V7; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = VirtualGearsProduct/Info.plist; @@ -341,7 +341,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 9; + CURRENT_PROJECT_VERSION = 10; DEVELOPMENT_TEAM = MNW6SJT4V7; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = VirtualGearsProduct/Info.plist; diff --git a/docs/APP_STORE.md b/docs/APP_STORE.md index a02caec..4e6f154 100644 --- a/docs/APP_STORE.md +++ b/docs/APP_STORE.md @@ -278,7 +278,9 @@ Build 8 restores the explicit Start Shifting step while making the transparent trainer proxy available as soon as the KICKR is ready, and keeps every configured equipment status visible on the shifting screen. -Source build 1.0 (9) has not yet been uploaded. It fixes the case where a riding +Build 1.0 (10) was uploaded to TestFlight on 15 August 2026. Build 9 was never +uploaded, so build 10 carries everything since build 8. It fixes the case where a +riding app waiting to connect replaced the KICKR, Click and fan statuses; each connection now keeps its own status. It also adds adaptive status layout for Accessibility Dynamic Type, clearer startup/status/gear/demo wording, and @@ -296,6 +298,10 @@ row, and a low Click battery is drawn as a warning. Settings stopped saying than a count of them, cassettes that share a name are told apart by their cog count, and retrying a failed start says "Try Again". +Every change in build 10 was made against the simulator. The gear rail, shift +button weighting, one-row status footer and battery warning have not yet been +checked on a physical KICKR while riding. + The live App Store description still carries the old "starts the session" sentence. It is corrected in this file and needs the same edit in App Store Connect on the next metadata change. From 9696460274838ddce6432eda9132112e10204f5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Br=C3=B6nner?= Date: Sun, 16 Aug 2026 07:21:04 +0200 Subject: [PATCH 8/8] Fix chain reminder jump and demo mode button styling Two bugs found riding build 10 on a physical KICKR: 1. The chain-position reminder was only shown in the searching/chooser states, not readyCard, so it vanished the instant the trainer connected and the Start Shifting button jumped upward to fill the space. It now renders in a fixed position across every startup state. 2. DemoModeView.shiftButton constructed ShiftButton without the isProminent parameter added for the ride screen's easier/harder weight differentiation, so demo mode still showed two equally prominent buttons. It now passes isProminent: !easier to match. Test-first: added testTheChainReminderNeverAppearsOrDisappearsAcrossStartupStates and testDemoShiftButtonsAreDrawnLikeTheRideScreensAreWithDistinctWeight (the latter introduces pixel-sampling averageColor/colorDistance helpers since button styling isn't exposed via the accessibility tree), confirmed both red, then fixed. Full suite: 30/30 UI tests, 259 core tests, 90.80% coverage. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: fce4c745-c85c-40aa-aac2-3dbbf605f9e7 --- DEVELOPMENT.md | 11 ++- .../VirtualGearsHomeView.swift | 11 ++- VirtualGearsUITests/VirtualGearsUITests.swift | 76 +++++++++++++++++++ docs/APP_STORE.md | 8 ++ 4 files changed, 100 insertions(+), 6 deletions(-) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 1d94d90..242f4e1 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -44,16 +44,21 @@ xcodebuild test \ ``` `VirtualGearsUITests` launches deterministic debug fixtures rather than pretending -the simulator has Bluetooth hardware. Its 28 scenarios cover every primary +the simulator has Bluetooth hardware. Its 30 scenarios cover every primary screen, portrait and landscape status visibility, Accessibility Dynamic Type, startup failure, trainer reconnect, a riding app waiting, low Click battery, pending shifts, accepted Click press feedback, navigation, stop confirmation and cancellation, gear-mode switching, Headwind controls and Demo Mode interactions -in both shift directions. Four of them are regression guards with measured +in both shift directions. Six of them are regression guards with measured assertions rather than existence checks: the ride status must be wide enough to be read as words rather than collapsing to an icon, cancelling the stop confirmation must return to the ride, every equipment status must sit on one -row, and a low Click battery must be drawn at warning weight. Screenshots are +row, a low Click battery must be drawn at warning weight, the Easier/Harder +buttons in Demo Mode must be drawn with the same distinct visual weight as the +ride screen's (sampled by pixel colour, since button styling isn't exposed via +the accessibility tree), and the chain-position reminder must never appear or +disappear across startup states (it previously vanished the instant the +trainer connected, making the button above it jump). Screenshots are attached to every test result. Protocol behavior and equipment lifecycle remain covered by the package tests and physical-hardware evidence. diff --git a/VirtualGearsProduct/VirtualGearsHomeView.swift b/VirtualGearsProduct/VirtualGearsHomeView.swift index 45a5b28..e64645b 100644 --- a/VirtualGearsProduct/VirtualGearsHomeView.swift +++ b/VirtualGearsProduct/VirtualGearsHomeView.swift @@ -168,6 +168,12 @@ struct StartupView: View { searching retryButton } + // Fixed in the layout regardless of state, so it never + // appears or disappears under the button above it. It used + // to live only inside the searching and chooser cards, so + // the button jumped the instant the trainer connected and + // this reminder vanished with the rest of that card. + chainReminder demoEntry } .frame(maxWidth: 560) @@ -267,7 +273,6 @@ struct StartupView: View { .foregroundStyle(.secondary) .multilineTextAlignment(.center) connectionList(includeRidingApp: false) - chainReminder } .frame(maxWidth: .infinity) .accessibilityElement(children: .contain) @@ -300,7 +305,6 @@ struct StartupView: View { } .buttonStyle(.bordered) } - chainReminder } .frame(maxWidth: .infinity, alignment: .leading) } @@ -746,7 +750,8 @@ struct DemoModeView: View { hint: easier ? "Moves to the next easier simulated gear. Hold to keep shifting." : "Moves to the next harder simulated gear. Hold to keep shifting.", - disabled: easier ? !ride.canShiftEasier : !ride.canShiftHarder + disabled: easier ? !ride.canShiftEasier : !ride.canShiftHarder, + isProminent: !easier ) { ride.shift(direction) } repeatAction: { diff --git a/VirtualGearsUITests/VirtualGearsUITests.swift b/VirtualGearsUITests/VirtualGearsUITests.swift index 1089a76..acf30cb 100644 --- a/VirtualGearsUITests/VirtualGearsUITests.swift +++ b/VirtualGearsUITests/VirtualGearsUITests.swift @@ -340,6 +340,23 @@ final class VirtualGearsUITests: XCTestCase { assertVisibleElement(app.buttons["50 percent"]) } + func testDemoShiftButtonsAreDrawnLikeTheRideScreensAreWithDistinctWeight() { + launch("-shotDemo") + + let easier = app.buttons["Shift easier"] + let harder = app.buttons["Shift harder"] + assertVisibleElement(easier) + assertVisibleElement(harder) + + let easierColor = averageColor(of: easier) + let harderColor = averageColor(of: harder) + XCTAssertGreaterThan( + colorDistance(easierColor, harderColor), + 0.1, + "Demo's Easier and Harder buttons look identical, unlike the ride screen" + ) + } + func testDemoCanShiftHarderAndEasierBackToItsStartingGear() { launch("-shotDemo") @@ -395,6 +412,65 @@ final class VirtualGearsUITests: XCTestCase { app.launch() } + func testTheChainReminderNeverAppearsOrDisappearsAcrossStartupStates() { + // It used to live only inside the searching and chooser cards, so it + // vanished the instant the trainer connected and the button above it + // jumped up to fill the gap. It must now be part of the fixed layout, + // present in every startup state. + let reminderText = "Use the smaller front ring if your bike has one. " + + "Pick a rear gear that keeps the chain straight, and leave it " + + "there." + + launch("-shotStarting") + assertVisibleElement(app.staticTexts[reminderText]) + + launch("-shotReady") + assertVisibleElement(app.staticTexts[reminderText]) + + launch("-shotFailed") + assertVisibleElement(app.staticTexts[reminderText]) + } + + /// Samples the average colour of an element as it is actually rendered. + /// Button styling (bordered vs borderedProminent, tint) is not exposed on + /// the accessibility tree, so the only honest way to test "these two + /// buttons must not look identical" is to look at the pixels. + private func averageColor(of element: XCUIElement) -> (r: Double, g: Double, b: Double) { + let screenshot = element.screenshot().image + guard let cgImage = screenshot.cgImage else { return (0, 0, 0) } + let width = cgImage.width + let height = cgImage.height + guard width > 0, height > 0, + let data = cgImage.dataProvider?.data, + let pointer = CFDataGetBytePtr(data) else { return (0, 0, 0) } + let bytesPerPixel = cgImage.bitsPerPixel / 8 + let bytesPerRow = cgImage.bytesPerRow + var totals = (r: 0.0, g: 0.0, b: 0.0) + var samples = 0.0 + // Sample a sparse grid rather than every pixel: fast, and averages out + // the icon/text drawn on top of the button's own fill colour. + let strideStep = max(1, min(width, height) / 12) + for y in stride(from: 0, to: height, by: strideStep) { + for x in stride(from: 0, to: width, by: strideStep) { + let offset = y * bytesPerRow + x * bytesPerPixel + guard offset + 2 < CFDataGetLength(data) else { continue } + totals.r += Double(pointer[offset]) + totals.g += Double(pointer[offset + 1]) + totals.b += Double(pointer[offset + 2]) + samples += 1 + } + } + guard samples > 0 else { return (0, 0, 0) } + return (totals.r / samples / 255, totals.g / samples / 255, totals.b / samples / 255) + } + + private func colorDistance( + _ a: (r: Double, g: Double, b: Double), + _ b: (r: Double, g: Double, b: Double) + ) -> Double { + (pow(a.r - b.r, 2) + pow(a.g - b.g, 2) + pow(a.b - b.b, 2)).squareRoot() + } + private func assertStatusItems( _ identifiers: [String], file: StaticString = #filePath, diff --git a/docs/APP_STORE.md b/docs/APP_STORE.md index 4e6f154..f055413 100644 --- a/docs/APP_STORE.md +++ b/docs/APP_STORE.md @@ -302,6 +302,14 @@ Every change in build 10 was made against the simulator. The gear rail, shift button weighting, one-row status footer and battery warning have not yet been checked on a physical KICKR while riding. +Build 10 was ridden on a physical KICKR and surfaced two bugs, both fixed for +build 11: the chain-position reminder was omitted from the "ready to start +shifting" state, so it vanished the instant the trainer connected and made the +Start Shifting button jump upward; it is now shown in a fixed position across +every startup state. Demo Mode's shift buttons never received the +easier/harder weight differentiation added in build 10, so they still looked +like two equally prominent buttons; they now match the ride screen's styling. + The live App Store description still carries the old "starts the session" sentence. It is corrected in this file and needs the same edit in App Store Connect on the next metadata change.