From a8b0327c41d1fbb40b9467a1e6bbf488366d88c8 Mon Sep 17 00:00:00 2001 From: Phil Oliver <3497406+poliver@users.noreply.github.com> Date: Fri, 26 Sep 2025 20:11:57 -0400 Subject: [PATCH] Decouple `MainAppBar` from `UiViewModel` (#3216) --- .../java/com/geeksville/mesh/model/UIState.kt | 7 ---- .../main/java/com/geeksville/mesh/ui/Main.kt | 12 ++----- .../mesh/ui/common/components/MainAppBar.kt | 33 ++++--------------- 3 files changed, 9 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/model/UIState.kt b/app/src/main/java/com/geeksville/mesh/model/UIState.kt index 1fb6e3bff..b28a5af32 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -235,13 +235,6 @@ constructor( _currentAlert.value = null } - private val _title = MutableStateFlow("") - val title: StateFlow = _title.asStateFlow() - - fun setTitle(title: String) { - viewModelScope.launch { _title.value = title } - } - val meshService: IMeshService? get() = serviceRepository.meshService diff --git a/app/src/main/java/com/geeksville/mesh/ui/Main.kt b/app/src/main/java/com/geeksville/mesh/ui/Main.kt index 62ae55d1a..9db889638 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/Main.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/Main.kt @@ -120,7 +120,6 @@ import org.meshtastic.core.ui.icon.Nodes import org.meshtastic.core.ui.icon.Settings import org.meshtastic.core.ui.theme.StatusColors.StatusBlue import org.meshtastic.core.ui.theme.StatusColors.StatusGreen -import kotlin.reflect.KClass enum class TopLevelDestination(@StringRes val label: Int, val icon: ImageVector, val route: Route) { Conversations(R.string.conversations, MeshtasticIcons.Conversations, ContactsRoutes.ContactsGraph), @@ -131,13 +130,6 @@ enum class TopLevelDestination(@StringRes val label: Int, val icon: ImageVector, ; companion object { - fun NavDestination.isTopLevel(): Boolean = listOf>( - ContactsRoutes.Contacts::class, - MapRoutes.Map::class, - ConnectionsRoutes.Connections::class, - ) - .any { this.hasRoute(it) } - fun fromNavDestination(destination: NavDestination?): TopLevelDestination? = entries.find { dest -> destination?.hierarchy?.any { it.hasRoute(dest.route::class) } == true } } @@ -382,10 +374,12 @@ fun MainScreen(uIViewModel: UIViewModel = hiltViewModel(), scanModel: BTScanMode ) .none { this.hasRoute(it) } + val ourNodeInfo by uIViewModel.ourNodeInfo.collectAsStateWithLifecycle() AnimatedVisibility(visible = currentDestination?.hasGlobalAppBar() ?: false) { MainAppBar( - viewModel = uIViewModel, navController = navController, + ourNode = ourNodeInfo, + isConnected = connectionState.isConnected(), onAction = { action -> when (action) { is NodeMenuAction.MoreDetails -> { diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/MainAppBar.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/MainAppBar.kt index 6a5f425ad..3e4d408cf 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/MainAppBar.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/MainAppBar.kt @@ -40,22 +40,14 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp -import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import androidx.navigation.NavDestination import androidx.navigation.NavDestination.Companion.hasRoute import androidx.navigation.NavHostController import androidx.navigation.compose.currentBackStackEntryAsState -import com.geeksville.mesh.model.UIViewModel -import com.geeksville.mesh.navigation.isConfigRoute -import com.geeksville.mesh.navigation.isNodeDetailRoute -import com.geeksville.mesh.ui.TopLevelDestination.Companion.isTopLevel import com.geeksville.mesh.ui.debug.DebugMenuActions import com.geeksville.mesh.ui.node.components.NodeChip import com.geeksville.mesh.ui.node.components.NodeMenuAction import org.meshtastic.core.database.model.Node import org.meshtastic.core.navigation.ContactsRoutes -import org.meshtastic.core.navigation.NodesRoutes import org.meshtastic.core.navigation.SettingsRoutes import org.meshtastic.core.strings.R import org.meshtastic.core.ui.theme.AppTheme @@ -64,8 +56,9 @@ import org.meshtastic.core.ui.theme.AppTheme @Composable fun MainAppBar( modifier: Modifier = Modifier, - viewModel: UIViewModel = hiltViewModel(), navController: NavHostController, + ourNode: Node?, + isConnected: Boolean, onAction: (NodeMenuAction) -> Unit, ) { val backStackEntry by navController.currentBackStackEntryAsState() @@ -74,13 +67,9 @@ fun MainAppBar( return } - val longTitle by viewModel.title.collectAsStateWithLifecycle("") - val ourNode by viewModel.ourNodeInfo.collectAsStateWithLifecycle() - val isConnected by viewModel.isConnectedStateFlow.collectAsStateWithLifecycle(false) - val title: String = when { - currentDestination == null || currentDestination.isTopLevel() -> stringResource(id = R.string.app_name) + currentDestination == null -> "" currentDestination.hasRoute() -> stringResource(id = R.string.debug_panel) @@ -88,19 +77,17 @@ fun MainAppBar( currentDestination.hasRoute() -> stringResource(id = R.string.share_to) - currentDestination.showLongNameTitle() -> longTitle - - else -> stringResource(id = R.string.app_name) + else -> "" } MainAppBar( modifier = modifier, title = title, subtitle = null, - canNavigateUp = navController.previousBackStackEntry != null && currentDestination?.isTopLevel() == false, + canNavigateUp = navController.previousBackStackEntry != null, ourNode = ourNode, isConnected = isConnected, - showNodeChip = ourNode != null && currentDestination?.isTopLevel() == true && isConnected, + showNodeChip = false, onNavigateUp = navController::navigateUp, actions = { currentDestination?.let { @@ -171,14 +158,6 @@ fun MainAppBar( ) } -fun NavDestination.showLongNameTitle(): Boolean = !this.isTopLevel() && - ( - this.hasRoute() || - this.hasRoute() || - this.isConfigRoute() || - this.isNodeDetailRoute() - ) - @Composable private fun TopBarActions( ourNode: Node?,