summaryrefslogtreecommitdiffhomepage
path: root/android/app/src
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2025-04-15 11:18:08 +0200
committerDavid Göransson <david.goransson@mullvad.net>2025-04-15 11:18:08 +0200
commitf52454a9ff8810b4b904c7e849c6fa04a9a5656e (patch)
treeb7d1274252028f80e437d6b93f6feeb2eb44abe1 /android/app/src
parent8a7f8ca15cd7dfcfa33ee46a244f2e5889b970f7 (diff)
parent95c579704a1f3c1e08378aa5907af00eb88b5275 (diff)
downloadmullvadvpn-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.kt33
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))