Before submitting
Area
apps/mobile
Steps to reproduce
- Use the Android mobile app with a saved direct connection to a compatible T3 Code server.
- Switch the connection off, then open its connection settings.
- Confirm that the row says Off, rather than Client not supported.
- Tap the connection switch itself.
- Repeat with the details collapsed and expanded.
Expected behavior
Tapping the enabled switch turns the saved connection on. Tapping the label or chevron separately opens or expands its details.
Actual behavior
Tapping the switch expands or collapses the connection row instead. The switch stays off and the connection is not enabled.
This remained reproducible after restarting the app cleared an earlier protocol-compatibility block. The remaining Off state had no compatibility error.
Impact
Major degradation or frequent failure. The saved connection cannot be enabled through its switch.
Version or commit
Reproduced on an Android 2.0.0 production build of a local fork. Checked upstream main at 8ed276c246b624631e7d39241ebfd22d8314cb68.
The following three upstream files are byte-for-byte identical to the files in the reproduced build. A stock upstream APK has not been separately runtime-tested.
Environment
Physical Android device running Android 17. Saved direct connection. The Android switch is rendered through Expo UI Jetpack Compose.
Diagnosis and proposed fix
ConnectionEnvironmentRow places ThemedSwitch inside the row's React Native Pressable, whose onPress toggles row details. On Android, ThemedSwitch renders an Expo UI Compose switch through a native Host. The observed behavior is consistent with the ancestor pressable taking the tap instead of the native switch.
Use a non-interactive row container and keep the switch outside every row-navigation pressable:
<View className="flex-row items-center">
<Pressable onPress={onToggleDetails}>
{/* Label and connection status */}
</Pressable>
<ThemedSwitch value={enabled} onValueChange={onSetEnabled} />
<Pressable onPress={onToggleDetails}>
{/* Chevron */}
</Pressable>
</View>
The same nested structure exists in ConnectedCloudEnvironmentRow: its outer pressable wraps a shell containing the native switch. Apply the same separation there, moving navigation and long-press removal onto the content and chevron. Cloud-row runtime reproduction has not been separately confirmed.
Keep the existing compatibility checks and disabled state for genuinely unsupported servers. Give each switch its own accessible connection label.
Validation of the proposed fix
The two row components were updated locally to make the switch a sibling of the row pressables. The rebuilt APK was installed on the same device, and the user confirmed that tapping the switch now triggers the toggle.
Formatting, lint, type checking, the full repository test gate, and the mobile static check passed. The Android release build and APK verification passed. This validates the locally patched build; it does not claim separate upstream APK acceptance.
Recommended native regression checks: direct-row switch taps in both expanded states, switching on and off, saved cloud-row switches, label and chevron navigation, cloud-row long-press removal, unsupported-server disabling, and iOS behavior.
Related reports considered
- #13266 describes desktop welcome-wizard handling of persisted disabled connections and re-pairing.
- #14252 describes the separate mobile activity toggle rolling back after a relay permission failure.
Neither describes connection-switch taps expanding a row without changing its enabled state.
Before submitting
Area
apps/mobile
Steps to reproduce
Expected behavior
Tapping the enabled switch turns the saved connection on. Tapping the label or chevron separately opens or expands its details.
Actual behavior
Tapping the switch expands or collapses the connection row instead. The switch stays off and the connection is not enabled.
This remained reproducible after restarting the app cleared an earlier protocol-compatibility block. The remaining Off state had no compatibility error.
Impact
Major degradation or frequent failure. The saved connection cannot be enabled through its switch.
Version or commit
Reproduced on an Android 2.0.0 production build of a local fork. Checked upstream main at
8ed276c246b624631e7d39241ebfd22d8314cb68.The following three upstream files are byte-for-byte identical to the files in the reproduced build. A stock upstream APK has not been separately runtime-tested.
Environment
Physical Android device running Android 17. Saved direct connection. The Android switch is rendered through Expo UI Jetpack Compose.
Diagnosis and proposed fix
ConnectionEnvironmentRowplacesThemedSwitchinside the row's React NativePressable, whoseonPresstoggles row details. On Android,ThemedSwitchrenders an Expo UI Compose switch through a nativeHost. The observed behavior is consistent with the ancestor pressable taking the tap instead of the native switch.Use a non-interactive row container and keep the switch outside every row-navigation pressable:
The same nested structure exists in
ConnectedCloudEnvironmentRow: its outer pressable wraps a shell containing the native switch. Apply the same separation there, moving navigation and long-press removal onto the content and chevron. Cloud-row runtime reproduction has not been separately confirmed.Keep the existing compatibility checks and disabled state for genuinely unsupported servers. Give each switch its own accessible connection label.
Validation of the proposed fix
The two row components were updated locally to make the switch a sibling of the row pressables. The rebuilt APK was installed on the same device, and the user confirmed that tapping the switch now triggers the toggle.
Formatting, lint, type checking, the full repository test gate, and the mobile static check passed. The Android release build and APK verification passed. This validates the locally patched build; it does not claim separate upstream APK acceptance.
Recommended native regression checks: direct-row switch taps in both expanded states, switching on and off, saved cloud-row switches, label and chevron navigation, cloud-row long-press removal, unsupported-server disabling, and iOS behavior.
Related reports considered
Neither describes connection-switch taps expanding a row without changing its enabled state.