diff options
| author | David Göransson <david.goransson@mullvad.net> | 2025-04-15 11:18:08 +0200 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2025-04-15 11:18:08 +0200 |
| commit | f52454a9ff8810b4b904c7e849c6fa04a9a5656e (patch) | |
| tree | b7d1274252028f80e437d6b93f6feeb2eb44abe1 /android/app/src | |
| parent | 8a7f8ca15cd7dfcfa33ee46a244f2e5889b970f7 (diff) | |
| parent | 95c579704a1f3c1e08378aa5907af00eb88b5275 (diff) | |
| download | mullvadvpn-f52454a9ff8810b4b904c7e849c6fa04a9a5656e.tar.xz mullvadvpn-f52454a9ff8810b4b904c7e849c6fa04a9a5656e.zip | |
Merge branch 'google-tv-sometimes-opens-sidebar-menu-incorrectly-droid-1926'
Diffstat (limited to 'android/app/src')
| -rw-r--r-- | android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ConnectScreen.kt | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ConnectScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ConnectScreen.kt index 3107574b58..f9422d8bcc 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ConnectScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ConnectScreen.kt @@ -40,8 +40,13 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment +import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha +import androidx.compose.ui.focus.FocusDirection +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusProperties +import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.layout import androidx.compose.ui.platform.LocalConfiguration @@ -284,6 +289,7 @@ fun Connect( } } +@OptIn(ExperimentalComposeUiApi::class) @Composable fun ConnectScreen( state: ConnectUiState, @@ -302,9 +308,12 @@ fun ConnectScreen( onDismissNewDeviceClick: () -> Unit, onNavigateToFeature: (FeatureIndicator) -> Unit, ) { + val contentFocusRequester = remember { FocusRequester() } + val content = @Composable { padding: PaddingValues -> Content( + contentFocusRequester, padding, state, onDisconnectClick, @@ -323,12 +332,26 @@ fun ConnectScreen( if (isTv()) { Scaffold( + modifier = + Modifier.focusProperties { + enter = { focusDirection -> + // When we return to this screen from SelectLocationScreen the focus is + // sometimes put on the TV navigation drawer, which causes it expand + // (when it was previously not expanded). When returning from + // SelectLocationScreen we get a FocusDirection.Down event, so we focus + // on the switch location composable. + // When on TV and we return from account or settings we get a + // FocusDirection.Enter event, so focus remains on the navigation drawer. + if (focusDirection == FocusDirection.Down) contentFocusRequester + else FocusRequester.Default + } + }, snackbarHost = { SnackbarHost( snackbarHostState, snackbar = { snackbarData -> MullvadSnackbar(snackbarData = snackbarData) }, ) - } + }, ) { NavigationDrawerTv( daysLeftUntilExpiry = state.daysLeftUntilExpiry, @@ -356,6 +379,7 @@ fun ConnectScreen( @Composable private fun Content( + focusRequester: FocusRequester, paddingValues: PaddingValues, state: ConnectUiState, onDisconnectClick: () -> Unit, @@ -422,6 +446,7 @@ private fun Content( ConnectionCard( state = state, modifier = Modifier.align(Alignment.BottomCenter), + focusRequester = focusRequester, onSwitchLocationClick = onSwitchLocationClick, onDisconnectClick = onDisconnectClick, onReconnectClick = onReconnectClick, @@ -465,6 +490,7 @@ private fun MullvadMap(state: ConnectUiState, progressIndicatorBias: Float) { private fun ConnectionCard( state: ConnectUiState, modifier: Modifier = Modifier, + focusRequester: FocusRequester, onSwitchLocationClick: () -> Unit, onDisconnectClick: () -> Unit, onReconnectClick: () -> Unit, @@ -511,6 +537,7 @@ private fun ConnectionCard( ButtonPanel( state, + focusRequester, onSwitchLocationClick, onDisconnectClick, onReconnectClick, @@ -643,6 +670,7 @@ fun TunnelState.Connected.toConnectionsDetails(): ConnectionDetails = @Composable private fun ButtonPanel( state: ConnectUiState, + focusRequester: FocusRequester, onSwitchLocationClick: () -> Unit, onDisconnectClick: () -> Unit, onReconnectClick: () -> Unit, @@ -671,7 +699,8 @@ private fun ButtonPanel( isReconnectButtonEnabled = state.tunnelState is TunnelState.Connected || state.tunnelState is TunnelState.Connecting, - modifier = Modifier.testTag(SELECT_LOCATION_BUTTON_TEST_TAG), + modifier = + Modifier.testTag(SELECT_LOCATION_BUTTON_TEST_TAG).focusRequester(focusRequester), reconnectButtonTestTag = RECONNECT_BUTTON_TEST_TAG, ) Spacer(Modifier.height(Dimens.buttonVerticalPadding)) |
