refactor: encapsulate `NodeDetail` navigation

pull/1542/head
andrekir 2025-01-11 09:02:20 -03:00 zatwierdzone przez Andre K
rodzic 0d5157eb36
commit e196bfb683
3 zmienionych plików z 126 dodań i 48 usunięć

Wyświetl plik

@ -0,0 +1,76 @@
/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.geeksville.mesh.navigation
import androidx.compose.runtime.remember
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import com.geeksville.mesh.model.MetricsViewModel
import com.geeksville.mesh.ui.NodeDetailScreen
import com.geeksville.mesh.ui.components.DeviceMetricsScreen
import com.geeksville.mesh.ui.components.EnvironmentMetricsScreen
import com.geeksville.mesh.ui.components.NodeMapScreen
import com.geeksville.mesh.ui.components.PositionLogScreen
import com.geeksville.mesh.ui.components.SignalMetricsScreen
import com.geeksville.mesh.ui.components.TracerouteLogScreen
fun NavGraphBuilder.addNodDetailSection(navController: NavController) {
composable<Route.NodeDetail> {
NodeDetailScreen(
onNavigate = navController::navigate,
)
}
composable<Route.DeviceMetrics> {
val parentEntry = remember { navController.getBackStackEntry<Route.NodeDetail>() }
DeviceMetricsScreen(
viewModel = hiltViewModel<MetricsViewModel>(parentEntry),
)
}
composable<Route.NodeMap> {
val parentEntry = remember { navController.getBackStackEntry<Route.NodeDetail>() }
NodeMapScreen(
viewModel = hiltViewModel<MetricsViewModel>(parentEntry),
)
}
composable<Route.PositionLog> {
val parentEntry = remember { navController.getBackStackEntry<Route.NodeDetail>() }
PositionLogScreen(
viewModel = hiltViewModel<MetricsViewModel>(parentEntry),
)
}
composable<Route.EnvironmentMetrics> {
val parentEntry = remember { navController.getBackStackEntry<Route.NodeDetail>() }
EnvironmentMetricsScreen(
viewModel = hiltViewModel<MetricsViewModel>(parentEntry),
)
}
composable<Route.SignalMetrics> {
val parentEntry = remember { navController.getBackStackEntry<Route.NodeDetail>() }
SignalMetricsScreen(
viewModel = hiltViewModel<MetricsViewModel>(parentEntry),
)
}
composable<Route.TracerouteLog> {
val parentEntry = remember { navController.getBackStackEntry<Route.NodeDetail>() }
TracerouteLogScreen(
viewModel = hiltViewModel<MetricsViewModel>(parentEntry),
)
}
}

Wyświetl plik

@ -0,0 +1,42 @@
/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.geeksville.mesh.navigation
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import androidx.navigation.toRoute
import com.geeksville.mesh.ui.ShareScreen
fun NavController.navigateToSharedMessage(contactKey: String, message: String) {
navigate(Route.Messages(contactKey, message)) {
popUpTo<Route.Share> { inclusive = true }
}
}
fun NavGraphBuilder.shareScreen(
navigateUp: () -> Unit,
onConfirm: (String, String) -> Unit
) {
composable<Route.Share> { backStackEntry ->
val message = backStackEntry.toRoute<Route.Share>().message
ShareScreen(
navigateUp = navigateUp,
) { contactKey -> onConfirm(contactKey, message) }
}
}

Wyświetl plik

@ -23,7 +23,6 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.compose.ui.platform.ViewCompositionStrategy
@ -31,25 +30,18 @@ import androidx.compose.ui.res.stringResource
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import androidx.navigation.toRoute
import com.geeksville.mesh.R import com.geeksville.mesh.R
import com.geeksville.mesh.android.Logging import com.geeksville.mesh.android.Logging
import com.geeksville.mesh.model.MetricsViewModel
import com.geeksville.mesh.navigation.Route import com.geeksville.mesh.navigation.Route
import com.geeksville.mesh.navigation.addNodDetailSection
import com.geeksville.mesh.navigation.addRadioConfigSection import com.geeksville.mesh.navigation.addRadioConfigSection
import com.geeksville.mesh.navigation.navigateToSharedMessage
import com.geeksville.mesh.navigation.shareScreen
import com.geeksville.mesh.ui.components.BaseScaffold import com.geeksville.mesh.ui.components.BaseScaffold
import com.geeksville.mesh.ui.components.DeviceMetricsScreen
import com.geeksville.mesh.ui.components.EnvironmentMetricsScreen
import com.geeksville.mesh.ui.components.NodeMapScreen
import com.geeksville.mesh.ui.components.PositionLogScreen
import com.geeksville.mesh.ui.components.SignalMetricsScreen
import com.geeksville.mesh.ui.components.TracerouteLogScreen
import com.geeksville.mesh.ui.radioconfig.RadioConfigViewModel import com.geeksville.mesh.ui.radioconfig.RadioConfigViewModel
import com.geeksville.mesh.ui.theme.AppTheme import com.geeksville.mesh.ui.theme.AppTheme
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@ -125,43 +117,11 @@ fun NavGraph(
startDestination = startDestination, startDestination = startDestination,
modifier = modifier, modifier = modifier,
) { ) {
composable<Route.NodeDetail> { addNodDetailSection(navController)
NodeDetailScreen { navController.navigate(route = it) }
}
composable<Route.DeviceMetrics> {
val parentEntry = remember { navController.getBackStackEntry<Route.NodeDetail>() }
DeviceMetricsScreen(hiltViewModel<MetricsViewModel>(parentEntry))
}
composable<Route.NodeMap> {
val parentEntry = remember { navController.getBackStackEntry<Route.NodeDetail>() }
NodeMapScreen(hiltViewModel<MetricsViewModel>(parentEntry))
}
composable<Route.PositionLog> {
val parentEntry = remember { navController.getBackStackEntry<Route.NodeDetail>() }
PositionLogScreen(hiltViewModel<MetricsViewModel>(parentEntry))
}
composable<Route.EnvironmentMetrics> {
val parentEntry = remember { navController.getBackStackEntry<Route.NodeDetail>() }
EnvironmentMetricsScreen(hiltViewModel<MetricsViewModel>(parentEntry))
}
composable<Route.SignalMetrics> {
val parentEntry = remember { navController.getBackStackEntry<Route.NodeDetail>() }
SignalMetricsScreen(hiltViewModel<MetricsViewModel>(parentEntry))
}
composable<Route.TracerouteLog> {
val parentEntry = remember { navController.getBackStackEntry<Route.NodeDetail>() }
TracerouteLogScreen(hiltViewModel<MetricsViewModel>(parentEntry))
}
addRadioConfigSection(navController) addRadioConfigSection(navController)
composable<Route.Share> { backStackEntry -> shareScreen(
val message = backStackEntry.toRoute<Route.Share>().message
ShareScreen(
navigateUp = navController::navigateUp, navigateUp = navController::navigateUp,
) { onConfirm = navController::navigateToSharedMessage,
navController.navigate(Route.Messages(it, message)) { )
popUpTo<Route.Share> { inclusive = true }
}
}
}
} }
} }