diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/AdaptiveNodeListScreen.kt b/app/src/main/java/com/geeksville/mesh/ui/node/AdaptiveNodeListScreen.kt index 1b4779e36..8c8932f1e 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/node/AdaptiveNodeListScreen.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/node/AdaptiveNodeListScreen.kt @@ -38,6 +38,7 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import kotlinx.coroutines.flow.Flow @@ -87,6 +88,9 @@ fun AdaptiveNodeListScreen( value = navigator.scaffoldValue, listPane = { AnimatedPane { + val focusManager = LocalFocusManager.current + // Prevent TextFields from auto-focusing when pane animates in + LaunchedEffect(Unit) { focusManager.clearFocus() } NodeListScreen( navigateToNodeDetails = { nodeId -> scope.launch { navigator.navigateTo(ListDetailPaneScaffoldRole.Detail, nodeId) } @@ -98,7 +102,10 @@ fun AdaptiveNodeListScreen( }, detailPane = { AnimatedPane { + val focusManager = LocalFocusManager.current val nodeId = navigator.currentDestination?.contentKey + // Prevent TextFields from auto-focusing when pane animates in + LaunchedEffect(nodeId) { focusManager.clearFocus() } if (nodeId != null) { NodeDetailScreenWrapper( nodeId = nodeId, diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/detail/NodeDetailList.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/detail/NodeDetailList.kt index 8ad94eebf..e345e0a16 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/detail/NodeDetailList.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/detail/NodeDetailList.kt @@ -17,6 +17,7 @@ package org.meshtastic.feature.node.detail +import androidx.compose.foundation.focusable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize @@ -109,7 +110,7 @@ fun NodeDetailList( } Column( - modifier = modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(16.dp), + modifier = modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(16.dp).focusable(), verticalArrangement = Arrangement.spacedBy(16.dp), ) { if (metricsState.deviceHardware != null) { diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/list/NodeListScreen.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/list/NodeListScreen.kt index ddd650f05..3cb254eee 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/list/NodeListScreen.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/list/NodeListScreen.kt @@ -19,6 +19,7 @@ package org.meshtastic.feature.node.list import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.background +import androidx.compose.foundation.focusable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize @@ -148,7 +149,7 @@ fun NodeListScreen( ) }, ) { contentPadding -> - Box(modifier = Modifier.fillMaxSize().padding(contentPadding)) { + Box(modifier = Modifier.fillMaxSize().padding(contentPadding).focusable()) { LazyColumn(state = listState, modifier = Modifier.fillMaxSize()) { stickyHeader { val animatedAlpha by