ci: cache Robolectric SDK jars to prevent flaky SocketException failures (#5045)

This commit is contained in:
James Rich 2026-04-10 10:05:07 -05:00 committed by GitHub
parent 93e0b9ca57
commit 1390a3cd4f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
34 changed files with 374 additions and 426 deletions

View file

@ -20,30 +20,30 @@ import androidx.navigation3.runtime.EntryProviderScope
import androidx.navigation3.runtime.NavBackStack
import androidx.navigation3.runtime.NavKey
import org.koin.compose.viewmodel.koinViewModel
import org.meshtastic.core.navigation.ConnectionsRoutes
import org.meshtastic.core.navigation.NodesRoutes
import org.meshtastic.core.navigation.ConnectionsRoute
import org.meshtastic.core.navigation.NodesRoute
import org.meshtastic.feature.connections.ScannerViewModel
import org.meshtastic.feature.connections.ui.ConnectionsScreen
import org.meshtastic.feature.settings.radio.RadioConfigViewModel
/** Navigation graph for for the top level ConnectionsScreen - [ConnectionsRoutes.Connections]. */
/** Navigation graph for for the top level ConnectionsScreen - [ConnectionsRoute.Connections]. */
fun EntryProviderScope<NavKey>.connectionsGraph(backStack: NavBackStack<NavKey>) {
entry<ConnectionsRoutes.ConnectionsGraph> {
entry<ConnectionsRoute.ConnectionsGraph> {
ConnectionsScreen(
scanModel = koinViewModel<ScannerViewModel>(),
radioConfigViewModel = koinViewModel<RadioConfigViewModel>(),
onClickNodeChip = { backStack.add(NodesRoutes.NodeDetail(it)) },
onNavigateToNodeDetails = { backStack.add(NodesRoutes.NodeDetail(it)) },
onClickNodeChip = { backStack.add(NodesRoute.NodeDetail(it)) },
onNavigateToNodeDetails = { backStack.add(NodesRoute.NodeDetail(it)) },
onConfigNavigate = { route -> backStack.add(route) },
)
}
entry<ConnectionsRoutes.Connections> {
entry<ConnectionsRoute.Connections> {
ConnectionsScreen(
scanModel = koinViewModel<ScannerViewModel>(),
radioConfigViewModel = koinViewModel<RadioConfigViewModel>(),
onClickNodeChip = { backStack.add(NodesRoutes.NodeDetail(it)) },
onNavigateToNodeDetails = { backStack.add(NodesRoutes.NodeDetail(it)) },
onClickNodeChip = { backStack.add(NodesRoute.NodeDetail(it)) },
onNavigateToNodeDetails = { backStack.add(NodesRoute.NodeDetail(it)) },
onConfigNavigate = { route -> backStack.add(route) },
)
}

View file

@ -51,7 +51,7 @@ import org.koin.compose.viewmodel.koinViewModel
import org.meshtastic.core.model.ConnectionState
import org.meshtastic.core.model.DeviceType
import org.meshtastic.core.navigation.Route
import org.meshtastic.core.navigation.SettingsRoutes
import org.meshtastic.core.navigation.SettingsRoute
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.connected
import org.meshtastic.core.resources.connected_device
@ -125,8 +125,8 @@ fun ConnectionsScreen(
getNavRouteFrom(radioConfigState.route)?.let { route ->
isWaiting = false
radioConfigViewModel.clearPacketResponse()
if (route == SettingsRoutes.LoRa) {
onConfigNavigate(SettingsRoutes.LoRa)
if (route == SettingsRoute.LoRa) {
onConfigNavigate(SettingsRoute.LoRa)
}
}
},

View file

@ -21,14 +21,14 @@ import androidx.navigation3.runtime.EntryProviderScope
import androidx.navigation3.runtime.NavBackStack
import androidx.navigation3.runtime.NavKey
import org.koin.compose.viewmodel.koinViewModel
import org.meshtastic.core.navigation.FirmwareRoutes
import org.meshtastic.core.navigation.FirmwareRoute
import org.meshtastic.feature.firmware.FirmwareUpdateScreen
import org.meshtastic.feature.firmware.FirmwareUpdateViewModel
/** Registers the firmware update screen entries into the Navigation 3 entry provider. */
fun EntryProviderScope<NavKey>.firmwareGraph(backStack: NavBackStack<NavKey>) {
entry<FirmwareRoutes.FirmwareGraph> { FirmwareScreen(onNavigateUp = { backStack.removeLastOrNull() }) }
entry<FirmwareRoutes.FirmwareUpdate> { FirmwareScreen(onNavigateUp = { backStack.removeLastOrNull() }) }
entry<FirmwareRoute.FirmwareGraph> { FirmwareScreen(onNavigateUp = { backStack.removeLastOrNull() }) }
entry<FirmwareRoute.FirmwareUpdate> { FirmwareScreen(onNavigateUp = { backStack.removeLastOrNull() }) }
}
@Composable

View file

@ -19,15 +19,15 @@ package org.meshtastic.feature.map.navigation
import androidx.navigation3.runtime.EntryProviderScope
import androidx.navigation3.runtime.NavBackStack
import androidx.navigation3.runtime.NavKey
import org.meshtastic.core.navigation.MapRoutes
import org.meshtastic.core.navigation.NodesRoutes
import org.meshtastic.core.navigation.MapRoute
import org.meshtastic.core.navigation.NodesRoute
fun EntryProviderScope<NavKey>.mapGraph(backStack: NavBackStack<NavKey>) {
entry<MapRoutes.Map> { args ->
entry<MapRoute.Map> { args ->
val mapScreen = org.meshtastic.core.ui.util.LocalMapMainScreenProvider.current
mapScreen(
{ backStack.add(NodesRoutes.NodeDetail(it)) }, // onClickNodeChip
{ backStack.add(NodesRoutes.NodeDetail(it)) }, // navigateToNodeDetails
{ backStack.add(NodesRoute.NodeDetail(it)) }, // onClickNodeChip
{ backStack.add(NodesRoute.NodeDetail(it)) }, // navigateToNodeDetails
args.waypointId,
)
}

View file

@ -27,8 +27,8 @@ import androidx.navigation3.runtime.NavKey
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import org.koin.compose.viewmodel.koinViewModel
import org.meshtastic.core.navigation.ContactsRoutes
import org.meshtastic.core.navigation.NodesRoutes
import org.meshtastic.core.navigation.ContactsRoute
import org.meshtastic.core.navigation.NodesRoute
import org.meshtastic.core.navigation.replaceLast
import org.meshtastic.core.ui.component.ScrollToTopEvent
import org.meshtastic.feature.messaging.QuickChatScreen
@ -43,15 +43,15 @@ fun EntryProviderScope<NavKey>.contactsGraph(
backStack: NavBackStack<NavKey>,
scrollToTopEvents: Flow<ScrollToTopEvent> = MutableSharedFlow(),
) {
entry<ContactsRoutes.ContactsGraph>(metadata = { ListDetailSceneStrategy.listPane() }) {
entry<ContactsRoute.ContactsGraph>(metadata = { ListDetailSceneStrategy.listPane() }) {
ContactsEntryContent(backStack = backStack, scrollToTopEvents = scrollToTopEvents)
}
entry<ContactsRoutes.Contacts>(metadata = { ListDetailSceneStrategy.listPane() }) {
entry<ContactsRoute.Contacts>(metadata = { ListDetailSceneStrategy.listPane() }) {
ContactsEntryContent(backStack = backStack, scrollToTopEvents = scrollToTopEvents)
}
entry<ContactsRoutes.Messages>(metadata = { ListDetailSceneStrategy.detailPane() }) { args ->
entry<ContactsRoute.Messages>(metadata = { ListDetailSceneStrategy.detailPane() }) { args ->
val contactKey = args.contactKey
val messageViewModel: org.meshtastic.feature.messaging.MessageViewModel =
koinViewModel(key = "messages-$contactKey")
@ -61,23 +61,23 @@ fun EntryProviderScope<NavKey>.contactsGraph(
contactKey = contactKey,
message = args.message,
viewModel = messageViewModel,
navigateToNodeDetails = { backStack.add(NodesRoutes.NodeDetail(it)) },
navigateToQuickChatOptions = { backStack.add(org.meshtastic.core.navigation.ContactsRoutes.QuickChat) },
navigateToNodeDetails = { backStack.add(NodesRoute.NodeDetail(it)) },
navigateToQuickChatOptions = { backStack.add(org.meshtastic.core.navigation.ContactsRoute.QuickChat) },
onNavigateBack = { backStack.removeLastOrNull() },
)
}
entry<ContactsRoutes.Share>(metadata = { ListDetailSceneStrategy.extraPane() }) { args ->
entry<ContactsRoute.Share>(metadata = { ListDetailSceneStrategy.extraPane() }) { args ->
val message = args.message
val viewModel = koinViewModel<ContactsViewModel>()
ShareScreen(
viewModel = viewModel,
onConfirm = { contactKey -> backStack.replaceLast(ContactsRoutes.Messages(contactKey, message)) },
onConfirm = { contactKey -> backStack.replaceLast(ContactsRoute.Messages(contactKey, message)) },
onNavigateUp = { backStack.removeLastOrNull() },
)
}
entry<ContactsRoutes.QuickChat>(metadata = { ListDetailSceneStrategy.extraPane() }) {
entry<ContactsRoute.QuickChat>(metadata = { ListDetailSceneStrategy.extraPane() }) {
val viewModel = koinViewModel<QuickChatViewModel>()
QuickChatScreen(viewModel = viewModel, onNavigateUp = { backStack.removeLastOrNull() })
}

View file

@ -21,9 +21,9 @@ import androidx.navigation3.runtime.NavBackStack
import androidx.navigation3.runtime.NavKey
import kotlinx.coroutines.flow.Flow
import org.meshtastic.core.common.util.MeshtasticUri
import org.meshtastic.core.navigation.ChannelsRoutes
import org.meshtastic.core.navigation.ContactsRoutes
import org.meshtastic.core.navigation.NodesRoutes
import org.meshtastic.core.navigation.ChannelsRoute
import org.meshtastic.core.navigation.ContactsRoute
import org.meshtastic.core.navigation.NodesRoute
import org.meshtastic.core.ui.component.ScrollToTopEvent
import org.meshtastic.proto.ChannelSet
import org.meshtastic.proto.SharedContact
@ -40,16 +40,16 @@ fun AdaptiveContactsScreen(
onClearRequestChannelUrl: () -> Unit,
) {
ContactsScreen(
onNavigateToShare = { backStack.add(ChannelsRoutes.ChannelsGraph) },
onNavigateToShare = { backStack.add(ChannelsRoute.ChannelsGraph) },
sharedContactRequested = sharedContactRequested,
requestChannelSet = requestChannelSet,
onHandleDeepLink = onHandleDeepLink,
onClearSharedContactRequested = onClearSharedContactRequested,
onClearRequestChannelUrl = onClearRequestChannelUrl,
viewModel = contactsViewModel,
onClickNodeChip = { backStack.add(NodesRoutes.NodeDetail(it)) },
onNavigateToMessages = { contactKey -> backStack.add(ContactsRoutes.Messages(contactKey)) },
onNavigateToNodeDetails = { backStack.add(NodesRoutes.NodeDetail(it)) },
onClickNodeChip = { backStack.add(NodesRoute.NodeDetail(it)) },
onNavigateToMessages = { contactKey -> backStack.add(ContactsRoute.Messages(contactKey)) },
onNavigateToNodeDetails = { backStack.add(NodesRoute.NodeDetail(it)) },
scrollToTopEvents = scrollToTopEvents,
activeContactKey = null,
)

View file

@ -27,7 +27,7 @@ import org.meshtastic.core.database.entity.asDeviceVersion
import org.meshtastic.core.model.DeviceVersion
import org.meshtastic.core.model.Node
import org.meshtastic.core.model.service.ServiceAction
import org.meshtastic.core.navigation.SettingsRoutes
import org.meshtastic.core.navigation.SettingsRoute
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.administration
import org.meshtastic.core.resources.firmware
@ -77,7 +77,7 @@ fun AdministrationSection(
leadingIcon = MeshtasticIcons.Settings,
enabled = metricsState.isLocal || node.metadata != null,
) {
onAction(NodeDetailAction.Navigate(SettingsRoutes.Settings(node.num)))
onAction(NodeDetailAction.Navigate(SettingsRoute.Settings(node.num)))
}
}
}

View file

@ -18,7 +18,7 @@ package org.meshtastic.feature.node.model
import org.jetbrains.compose.resources.DrawableResource
import org.jetbrains.compose.resources.StringResource
import org.meshtastic.core.navigation.NodeDetailRoutes
import org.meshtastic.core.navigation.NodeDetailRoute
import org.meshtastic.core.navigation.Route
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.device_metrics_log
@ -43,14 +43,14 @@ import org.meshtastic.core.resources.signal_quality
import org.meshtastic.core.resources.traceroute_log
enum class LogsType(val titleRes: StringResource, val icon: DrawableResource, val routeFactory: (Int) -> Route) {
DEVICE(Res.string.device_metrics_log, Res.drawable.ic_charging_station, { NodeDetailRoutes.DeviceMetrics(it) }),
NODE_MAP(Res.string.node_map, Res.drawable.ic_map, { NodeDetailRoutes.NodeMap(it) }),
POSITIONS(Res.string.position_log, Res.drawable.ic_location_on, { NodeDetailRoutes.PositionLog(it) }),
ENVIRONMENT(Res.string.env_metrics_log, Res.drawable.ic_thermostat, { NodeDetailRoutes.EnvironmentMetrics(it) }),
SIGNAL(Res.string.signal_quality, Res.drawable.ic_signal_cellular_alt, { NodeDetailRoutes.SignalMetrics(it) }),
POWER(Res.string.power_metrics_log, Res.drawable.ic_power, { NodeDetailRoutes.PowerMetrics(it) }),
TRACEROUTE(Res.string.traceroute_log, Res.drawable.ic_route, { NodeDetailRoutes.TracerouteLog(it) }),
NEIGHBOR_INFO(Res.string.neighbor_info, Res.drawable.ic_groups, { NodeDetailRoutes.NeighborInfoLog(it) }),
HOST(Res.string.host_metrics_log, Res.drawable.ic_memory, { NodeDetailRoutes.HostMetricsLog(it) }),
PAX(Res.string.pax_metrics_log, Res.drawable.ic_people, { NodeDetailRoutes.PaxMetrics(it) }),
DEVICE(Res.string.device_metrics_log, Res.drawable.ic_charging_station, { NodeDetailRoute.DeviceMetrics(it) }),
NODE_MAP(Res.string.node_map, Res.drawable.ic_map, { NodeDetailRoute.NodeMap(it) }),
POSITIONS(Res.string.position_log, Res.drawable.ic_location_on, { NodeDetailRoute.PositionLog(it) }),
ENVIRONMENT(Res.string.env_metrics_log, Res.drawable.ic_thermostat, { NodeDetailRoute.EnvironmentMetrics(it) }),
SIGNAL(Res.string.signal_quality, Res.drawable.ic_signal_cellular_alt, { NodeDetailRoute.SignalMetrics(it) }),
POWER(Res.string.power_metrics_log, Res.drawable.ic_power, { NodeDetailRoute.PowerMetrics(it) }),
TRACEROUTE(Res.string.traceroute_log, Res.drawable.ic_route, { NodeDetailRoute.TracerouteLog(it) }),
NEIGHBOR_INFO(Res.string.neighbor_info, Res.drawable.ic_groups, { NodeDetailRoute.NeighborInfoLog(it) }),
HOST(Res.string.host_metrics_log, Res.drawable.ic_memory, { NodeDetailRoute.HostMetricsLog(it) }),
PAX(Res.string.pax_metrics_log, Res.drawable.ic_people, { NodeDetailRoute.PaxMetrics(it) }),
}

View file

@ -21,8 +21,8 @@ import androidx.navigation3.runtime.NavBackStack
import androidx.navigation3.runtime.NavKey
import kotlinx.coroutines.flow.Flow
import org.koin.compose.viewmodel.koinViewModel
import org.meshtastic.core.navigation.ChannelsRoutes
import org.meshtastic.core.navigation.NodesRoutes
import org.meshtastic.core.navigation.ChannelsRoute
import org.meshtastic.core.navigation.NodesRoute
import org.meshtastic.core.ui.component.ScrollToTopEvent
import org.meshtastic.feature.node.list.NodeListScreen
import org.meshtastic.feature.node.list.NodeListViewModel
@ -37,8 +37,8 @@ fun AdaptiveNodeListScreen(
NodeListScreen(
viewModel = nodeListViewModel,
navigateToNodeDetails = { nodeId -> backStack.add(NodesRoutes.NodeDetail(nodeId)) },
onNavigateToChannels = { backStack.add(ChannelsRoutes.ChannelsGraph) },
navigateToNodeDetails = { nodeId -> backStack.add(NodesRoute.NodeDetail(nodeId)) },
onNavigateToChannels = { backStack.add(ChannelsRoute.ChannelsGraph) },
scrollToTopEvents = scrollToTopEvents,
activeNodeId = null,
onHandleDeepLink = onHandleDeepLink,

View file

@ -28,9 +28,9 @@ import org.jetbrains.compose.resources.DrawableResource
import org.jetbrains.compose.resources.StringResource
import org.koin.compose.viewmodel.koinViewModel
import org.koin.core.parameter.parametersOf
import org.meshtastic.core.navigation.ContactsRoutes
import org.meshtastic.core.navigation.NodeDetailRoutes
import org.meshtastic.core.navigation.NodesRoutes
import org.meshtastic.core.navigation.ContactsRoute
import org.meshtastic.core.navigation.NodeDetailRoute
import org.meshtastic.core.navigation.NodesRoute
import org.meshtastic.core.navigation.Route
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.device
@ -74,7 +74,7 @@ fun EntryProviderScope<NavKey>.nodesGraph(
scrollToTopEvents: Flow<ScrollToTopEvent> = MutableSharedFlow(),
onHandleDeepLink: (org.meshtastic.core.common.util.MeshtasticUri, onInvalid: () -> Unit) -> Unit = { _, _ -> },
) {
entry<NodesRoutes.NodesGraph>(metadata = { ListDetailSceneStrategy.listPane() }) {
entry<NodesRoute.NodesGraph>(metadata = { ListDetailSceneStrategy.listPane() }) {
AdaptiveNodeListScreen(
backStack = backStack,
scrollToTopEvents = scrollToTopEvents,
@ -82,7 +82,7 @@ fun EntryProviderScope<NavKey>.nodesGraph(
)
}
entry<NodesRoutes.Nodes>(metadata = { ListDetailSceneStrategy.listPane() }) {
entry<NodesRoute.Nodes>(metadata = { ListDetailSceneStrategy.listPane() }) {
AdaptiveNodeListScreen(
backStack = backStack,
scrollToTopEvents = scrollToTopEvents,
@ -100,7 +100,7 @@ fun EntryProviderScope<NavKey>.nodeDetailGraph(
scrollToTopEvents: Flow<ScrollToTopEvent>,
onHandleDeepLink: (org.meshtastic.core.common.util.MeshtasticUri, onInvalid: () -> Unit) -> Unit = { _, _ -> },
) {
entry<NodesRoutes.NodeDetailGraph>(metadata = { ListDetailSceneStrategy.listPane() }) { args ->
entry<NodesRoute.NodeDetailGraph>(metadata = { ListDetailSceneStrategy.listPane() }) { args ->
AdaptiveNodeListScreen(
backStack = backStack,
scrollToTopEvents = scrollToTopEvents,
@ -108,7 +108,7 @@ fun EntryProviderScope<NavKey>.nodeDetailGraph(
)
}
entry<NodesRoutes.NodeDetail>(metadata = { ListDetailSceneStrategy.detailPane() }) { args ->
entry<NodesRoute.NodeDetail>(metadata = { ListDetailSceneStrategy.detailPane() }) { args ->
val nodeDetailViewModel: NodeDetailViewModel = koinViewModel()
val compassViewModel: CompassViewModel = koinViewModel()
val destNum = args.destNum ?: 0 // Handle nullable destNum if needed
@ -116,18 +116,18 @@ fun EntryProviderScope<NavKey>.nodeDetailGraph(
nodeId = destNum,
viewModel = nodeDetailViewModel,
compassViewModel = compassViewModel,
navigateToMessages = { backStack.add(ContactsRoutes.Messages(it)) },
navigateToMessages = { backStack.add(ContactsRoute.Messages(it)) },
onNavigate = { backStack.add(it) },
onNavigateUp = { backStack.removeLastOrNull() },
)
}
entry<NodeDetailRoutes.NodeMap>(metadata = { ListDetailSceneStrategy.extraPane() }) { args ->
entry<NodeDetailRoute.NodeMap>(metadata = { ListDetailSceneStrategy.extraPane() }) { args ->
val mapScreen = org.meshtastic.core.ui.util.LocalNodeMapScreenProvider.current
mapScreen(args.destNum) { backStack.removeLastOrNull() }
}
entry<NodeDetailRoutes.TracerouteLog>(metadata = { ListDetailSceneStrategy.extraPane() }) { args ->
entry<NodeDetailRoute.TracerouteLog>(metadata = { ListDetailSceneStrategy.extraPane() }) { args ->
val metricsViewModel = koinViewModel<MetricsViewModel> { parametersOf(args.destNum) }
metricsViewModel.setNodeId(args.destNum)
@ -136,7 +136,7 @@ fun EntryProviderScope<NavKey>.nodeDetailGraph(
onNavigateUp = { backStack.removeLastOrNull() },
onViewOnMap = { requestId, responseLogUuid ->
backStack.add(
NodeDetailRoutes.TracerouteMap(
NodeDetailRoute.TracerouteMap(
destNum = args.destNum,
requestId = requestId,
logUuid = responseLogUuid,
@ -146,40 +146,40 @@ fun EntryProviderScope<NavKey>.nodeDetailGraph(
)
}
entry<NodeDetailRoutes.TracerouteMap>(metadata = { ListDetailSceneStrategy.extraPane() }) { args ->
entry<NodeDetailRoute.TracerouteMap>(metadata = { ListDetailSceneStrategy.extraPane() }) { args ->
val tracerouteMapScreen = org.meshtastic.core.ui.util.LocalTracerouteMapScreenProvider.current
tracerouteMapScreen(args.destNum, args.requestId, args.logUuid) { backStack.removeLastOrNull() }
}
NodeDetailRoute.entries.forEach { routeInfo ->
NodeDetailScreen.entries.forEach { routeInfo ->
when (routeInfo.routeClass) {
NodeDetailRoutes.DeviceMetrics::class ->
addNodeDetailScreenComposable<NodeDetailRoutes.DeviceMetrics>(backStack, routeInfo) { it.destNum }
NodeDetailRoutes.PositionLog::class ->
addNodeDetailScreenComposable<NodeDetailRoutes.PositionLog>(backStack, routeInfo) { it.destNum }
NodeDetailRoutes.EnvironmentMetrics::class ->
addNodeDetailScreenComposable<NodeDetailRoutes.EnvironmentMetrics>(backStack, routeInfo) { it.destNum }
NodeDetailRoutes.SignalMetrics::class ->
addNodeDetailScreenComposable<NodeDetailRoutes.SignalMetrics>(backStack, routeInfo) { it.destNum }
NodeDetailRoutes.PowerMetrics::class ->
addNodeDetailScreenComposable<NodeDetailRoutes.PowerMetrics>(backStack, routeInfo) { it.destNum }
NodeDetailRoutes.HostMetricsLog::class ->
addNodeDetailScreenComposable<NodeDetailRoutes.HostMetricsLog>(backStack, routeInfo) { it.destNum }
NodeDetailRoutes.PaxMetrics::class ->
addNodeDetailScreenComposable<NodeDetailRoutes.PaxMetrics>(backStack, routeInfo) { it.destNum }
NodeDetailRoutes.NeighborInfoLog::class ->
addNodeDetailScreenComposable<NodeDetailRoutes.NeighborInfoLog>(backStack, routeInfo) { it.destNum }
NodeDetailRoute.DeviceMetrics::class ->
addNodeDetailScreenComposable<NodeDetailRoute.DeviceMetrics>(backStack, routeInfo) { it.destNum }
NodeDetailRoute.PositionLog::class ->
addNodeDetailScreenComposable<NodeDetailRoute.PositionLog>(backStack, routeInfo) { it.destNum }
NodeDetailRoute.EnvironmentMetrics::class ->
addNodeDetailScreenComposable<NodeDetailRoute.EnvironmentMetrics>(backStack, routeInfo) { it.destNum }
NodeDetailRoute.SignalMetrics::class ->
addNodeDetailScreenComposable<NodeDetailRoute.SignalMetrics>(backStack, routeInfo) { it.destNum }
NodeDetailRoute.PowerMetrics::class ->
addNodeDetailScreenComposable<NodeDetailRoute.PowerMetrics>(backStack, routeInfo) { it.destNum }
NodeDetailRoute.HostMetricsLog::class ->
addNodeDetailScreenComposable<NodeDetailRoute.HostMetricsLog>(backStack, routeInfo) { it.destNum }
NodeDetailRoute.PaxMetrics::class ->
addNodeDetailScreenComposable<NodeDetailRoute.PaxMetrics>(backStack, routeInfo) { it.destNum }
NodeDetailRoute.NeighborInfoLog::class ->
addNodeDetailScreenComposable<NodeDetailRoute.NeighborInfoLog>(backStack, routeInfo) { it.destNum }
else -> Unit
}
}
}
fun NavKey.isNodeDetailRoute(): Boolean = NodeDetailRoute.entries.any { this::class == it.routeClass }
fun NavKey.isNodeDetailRoute(): Boolean = NodeDetailScreen.entries.any { this::class == it.routeClass }
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
private inline fun <reified R : Route> EntryProviderScope<NavKey>.addNodeDetailScreenComposable(
backStack: NavBackStack<NavKey>,
routeInfo: NodeDetailRoute,
routeInfo: NodeDetailScreen,
crossinline getDestNum: (R) -> Int,
) {
entry<R>(metadata = { ListDetailSceneStrategy.extraPane() }) { args ->
@ -192,7 +192,7 @@ private inline fun <reified R : Route> EntryProviderScope<NavKey>.addNodeDetailS
}
/** Expect declaration for the platform-specific traceroute map screen. */
enum class NodeDetailRoute(
enum class NodeDetailScreen(
val title: StringResource,
val routeClass: KClass<out Route>,
val icon: DrawableResource? = null,
@ -200,55 +200,55 @@ enum class NodeDetailRoute(
) {
DEVICE(
Res.string.device,
NodeDetailRoutes.DeviceMetrics::class,
NodeDetailRoute.DeviceMetrics::class,
Res.drawable.ic_router,
{ metricsVM, onNavigateUp -> DeviceMetricsScreen(metricsVM, onNavigateUp) },
),
POSITION_LOG(
Res.string.position_log,
NodeDetailRoutes.PositionLog::class,
NodeDetailRoute.PositionLog::class,
Res.drawable.ic_location_on,
{ metricsVM, onNavigateUp -> PositionLogScreen(metricsVM, onNavigateUp) },
),
ENVIRONMENT(
Res.string.environment,
NodeDetailRoutes.EnvironmentMetrics::class,
NodeDetailRoute.EnvironmentMetrics::class,
Res.drawable.ic_light_mode,
{ metricsVM, onNavigateUp -> EnvironmentMetricsScreen(metricsVM, onNavigateUp) },
),
SIGNAL(
Res.string.signal,
NodeDetailRoutes.SignalMetrics::class,
NodeDetailRoute.SignalMetrics::class,
Res.drawable.ic_cell_tower,
{ metricsVM, onNavigateUp -> SignalMetricsScreen(metricsVM, onNavigateUp) },
),
TRACEROUTE(
Res.string.traceroute,
NodeDetailRoutes.TracerouteLog::class,
NodeDetailRoute.TracerouteLog::class,
Res.drawable.ic_perm_scan_wifi,
{ metricsVM, onNavigateUp -> TracerouteLogScreen(viewModel = metricsVM, onNavigateUp = onNavigateUp) },
),
NEIGHBOR_INFO(
Res.string.neighbor_info,
NodeDetailRoutes.NeighborInfoLog::class,
NodeDetailRoute.NeighborInfoLog::class,
Res.drawable.ic_groups,
{ metricsVM, onNavigateUp -> NeighborInfoLogScreen(viewModel = metricsVM, onNavigateUp = onNavigateUp) },
),
POWER(
Res.string.power,
NodeDetailRoutes.PowerMetrics::class,
NodeDetailRoute.PowerMetrics::class,
Res.drawable.ic_power,
{ metricsVM, onNavigateUp -> PowerMetricsScreen(metricsVM, onNavigateUp) },
),
HOST(
Res.string.host,
NodeDetailRoutes.HostMetricsLog::class,
NodeDetailRoute.HostMetricsLog::class,
Res.drawable.ic_memory,
{ metricsVM, onNavigateUp -> HostMetricsLogScreen(metricsVM, onNavigateUp) },
),
PAX(
Res.string.pax,
NodeDetailRoutes.PaxMetrics::class,
NodeDetailRoute.PaxMetrics::class,
Res.drawable.ic_people,
{ metricsVM, onNavigateUp -> PaxMetricsScreen(metricsVM, onNavigateUp) },
),

View file

@ -41,8 +41,8 @@ import org.meshtastic.core.common.util.toDate
import org.meshtastic.core.common.util.toInstant
import org.meshtastic.core.common.util.toMeshtasticUri
import org.meshtastic.core.navigation.Route
import org.meshtastic.core.navigation.SettingsRoutes
import org.meshtastic.core.navigation.WifiProvisionRoutes
import org.meshtastic.core.navigation.SettingsRoute
import org.meshtastic.core.navigation.WifiProvisionRoute
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.bottom_nav_settings
import org.meshtastic.core.resources.export_configuration
@ -233,7 +233,7 @@ fun SettingsScreen(
ExpressiveSection(title = stringResource(Res.string.wifi_devices)) {
ListItem(text = stringResource(Res.string.wifi_devices), leadingIcon = MeshtasticIcons.Wifi) {
onNavigate(WifiProvisionRoutes.WifiProvision())
onNavigate(WifiProvisionRoute.WifiProvision())
}
}
@ -249,7 +249,7 @@ fun SettingsScreen(
excludedModulesUnlocked = excludedModulesUnlocked,
onUnlockExcludedModules = { settingsViewModel.unlockExcludedModules() },
onShowAppIntro = { settingsViewModel.showAppIntro() },
onNavigateToAbout = { onNavigate(SettingsRoutes.About) },
onNavigateToAbout = { onNavigate(SettingsRoute.About) },
)
}
}

View file

@ -16,7 +16,7 @@
*/
package org.meshtastic.feature.settings.navigation
import org.meshtastic.core.navigation.SettingsRoutes
import org.meshtastic.core.navigation.SettingsRoute
actual fun getAboutLibrariesJson(): String =
SettingsRoutes::class.java.getResource("/aboutlibraries.json")?.readText() ?: ""
SettingsRoute::class.java.getResource("/aboutlibraries.json")?.readText() ?: ""

View file

@ -19,7 +19,7 @@ package org.meshtastic.feature.settings.navigation
import org.jetbrains.compose.resources.DrawableResource
import org.jetbrains.compose.resources.StringResource
import org.meshtastic.core.navigation.Route
import org.meshtastic.core.navigation.SettingsRoutes
import org.meshtastic.core.navigation.SettingsRoute
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.bluetooth
import org.meshtastic.core.resources.channels
@ -50,43 +50,43 @@ enum class ConfigRoute(
val icon: DrawableResource? = null,
val type: Int = 0,
) {
USER(Res.string.user, SettingsRoutes.User, Res.drawable.ic_person, 0),
CHANNELS(Res.string.channels, SettingsRoutes.ChannelConfig, Res.drawable.ic_list, 0),
USER(Res.string.user, SettingsRoute.User, Res.drawable.ic_person, 0),
CHANNELS(Res.string.channels, SettingsRoute.ChannelConfig, Res.drawable.ic_list, 0),
DEVICE(
Res.string.device,
SettingsRoutes.Device,
SettingsRoute.Device,
Res.drawable.ic_router,
AdminMessage.ConfigType.DEVICE_CONFIG.value,
),
POSITION(
Res.string.position,
SettingsRoutes.Position,
SettingsRoute.Position,
Res.drawable.ic_location_on,
AdminMessage.ConfigType.POSITION_CONFIG.value,
),
POWER(Res.string.power, SettingsRoutes.Power, Res.drawable.ic_power, AdminMessage.ConfigType.POWER_CONFIG.value),
POWER(Res.string.power, SettingsRoute.Power, Res.drawable.ic_power, AdminMessage.ConfigType.POWER_CONFIG.value),
NETWORK(
Res.string.network,
SettingsRoutes.Network,
SettingsRoute.Network,
Res.drawable.ic_wifi,
AdminMessage.ConfigType.NETWORK_CONFIG.value,
),
DISPLAY(
Res.string.display,
SettingsRoutes.Display,
SettingsRoute.Display,
Res.drawable.ic_display_settings,
AdminMessage.ConfigType.DISPLAY_CONFIG.value,
),
LORA(Res.string.lora, SettingsRoutes.LoRa, Res.drawable.ic_cell_tower, AdminMessage.ConfigType.LORA_CONFIG.value),
LORA(Res.string.lora, SettingsRoute.LoRa, Res.drawable.ic_cell_tower, AdminMessage.ConfigType.LORA_CONFIG.value),
BLUETOOTH(
Res.string.bluetooth,
SettingsRoutes.Bluetooth,
SettingsRoute.Bluetooth,
Res.drawable.ic_bluetooth,
AdminMessage.ConfigType.BLUETOOTH_CONFIG.value,
),
SECURITY(
Res.string.security,
SettingsRoutes.Security,
SettingsRoute.Security,
Res.drawable.ic_security,
AdminMessage.ConfigType.SECURITY_CONFIG.value,
),

View file

@ -20,7 +20,7 @@ import org.jetbrains.compose.resources.DrawableResource
import org.jetbrains.compose.resources.StringResource
import org.meshtastic.core.model.Capabilities
import org.meshtastic.core.navigation.Route
import org.meshtastic.core.navigation.SettingsRoutes
import org.meshtastic.core.navigation.SettingsRoute
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.ambient_lighting
import org.meshtastic.core.resources.audio
@ -64,96 +64,96 @@ enum class ModuleRoute(
val isSupported: (Capabilities) -> Boolean = { true },
val isApplicable: (Config.DeviceConfig.Role?) -> Boolean = { true },
) {
MQTT(Res.string.mqtt, SettingsRoutes.MQTT, Res.drawable.ic_cloud, AdminMessage.ModuleConfigType.MQTT_CONFIG.value),
MQTT(Res.string.mqtt, SettingsRoute.MQTT, Res.drawable.ic_cloud, AdminMessage.ModuleConfigType.MQTT_CONFIG.value),
SERIAL(
Res.string.serial,
SettingsRoutes.Serial,
SettingsRoute.Serial,
Res.drawable.ic_usb,
AdminMessage.ModuleConfigType.SERIAL_CONFIG.value,
),
EXT_NOTIFICATION(
Res.string.external_notification,
SettingsRoutes.ExtNotification,
SettingsRoute.ExtNotification,
Res.drawable.ic_notifications,
AdminMessage.ModuleConfigType.EXTNOTIF_CONFIG.value,
),
STORE_FORWARD(
Res.string.store_forward,
SettingsRoutes.StoreForward,
SettingsRoute.StoreForward,
Res.drawable.ic_terminal,
AdminMessage.ModuleConfigType.STOREFORWARD_CONFIG.value,
),
RANGE_TEST(
Res.string.range_test,
SettingsRoutes.RangeTest,
SettingsRoute.RangeTest,
Res.drawable.ic_speed,
AdminMessage.ModuleConfigType.RANGETEST_CONFIG.value,
),
TELEMETRY(
Res.string.telemetry,
SettingsRoutes.Telemetry,
SettingsRoute.Telemetry,
Res.drawable.ic_data_usage,
AdminMessage.ModuleConfigType.TELEMETRY_CONFIG.value,
),
CANNED_MESSAGE(
Res.string.canned_message,
SettingsRoutes.CannedMessage,
SettingsRoute.CannedMessage,
Res.drawable.ic_message,
AdminMessage.ModuleConfigType.CANNEDMSG_CONFIG.value,
),
AUDIO(
Res.string.audio,
SettingsRoutes.Audio,
SettingsRoute.Audio,
Res.drawable.ic_volume_up,
AdminMessage.ModuleConfigType.AUDIO_CONFIG.value,
),
REMOTE_HARDWARE(
Res.string.remote_hardware,
SettingsRoutes.RemoteHardware,
SettingsRoute.RemoteHardware,
Res.drawable.ic_settings_remote,
AdminMessage.ModuleConfigType.REMOTEHARDWARE_CONFIG.value,
),
NEIGHBOR_INFO(
Res.string.neighbor_info,
SettingsRoutes.NeighborInfo,
SettingsRoute.NeighborInfo,
Res.drawable.ic_people,
AdminMessage.ModuleConfigType.NEIGHBORINFO_CONFIG.value,
),
AMBIENT_LIGHTING(
Res.string.ambient_lighting,
SettingsRoutes.AmbientLighting,
SettingsRoute.AmbientLighting,
Res.drawable.ic_light_mode,
AdminMessage.ModuleConfigType.AMBIENTLIGHTING_CONFIG.value,
),
DETECTION_SENSOR(
Res.string.detection_sensor,
SettingsRoutes.DetectionSensor,
SettingsRoute.DetectionSensor,
Res.drawable.ic_sensors,
AdminMessage.ModuleConfigType.DETECTIONSENSOR_CONFIG.value,
),
PAXCOUNTER(
Res.string.paxcounter,
SettingsRoutes.Paxcounter,
SettingsRoute.Paxcounter,
Res.drawable.ic_perm_scan_wifi,
AdminMessage.ModuleConfigType.PAXCOUNTER_CONFIG.value,
),
STATUS_MESSAGE(
Res.string.status_message,
SettingsRoutes.StatusMessage,
SettingsRoute.StatusMessage,
Res.drawable.ic_message,
AdminMessage.ModuleConfigType.STATUSMESSAGE_CONFIG.value,
isSupported = { it.supportsStatusMessage },
),
TRAFFIC_MANAGEMENT(
Res.string.traffic_management,
SettingsRoutes.TrafficManagement,
SettingsRoute.TrafficManagement,
Res.drawable.ic_alt_route,
AdminMessage.ModuleConfigType.TRAFFICMANAGEMENT_CONFIG.value,
isSupported = { it.supportsTrafficManagementConfig },
),
TAK(
Res.string.tak,
SettingsRoutes.TAK,
SettingsRoute.TAK,
Res.drawable.ic_people,
AdminMessage.ModuleConfigType.TAK_CONFIG.value,
isSupported = { it.supportsTakConfig },

View file

@ -26,9 +26,9 @@ import androidx.navigation3.runtime.EntryProviderScope
import androidx.navigation3.runtime.NavBackStack
import androidx.navigation3.runtime.NavKey
import org.koin.compose.viewmodel.koinViewModel
import org.meshtastic.core.navigation.NodesRoutes
import org.meshtastic.core.navigation.NodesRoute
import org.meshtastic.core.navigation.Route
import org.meshtastic.core.navigation.SettingsRoutes
import org.meshtastic.core.navigation.SettingsRoute
import org.meshtastic.feature.settings.AboutScreen
import org.meshtastic.feature.settings.AdministrationScreen
import org.meshtastic.feature.settings.DeviceConfigurationScreen
@ -74,10 +74,10 @@ fun getRadioConfigViewModel(backStack: NavBackStack<NavKey>): RadioConfigViewMod
val viewModel = koinViewModel<RadioConfigViewModel>()
val destNum =
remember(backStack.toList()) {
backStack.lastOrNull { it is SettingsRoutes.Settings }?.let { (it as SettingsRoutes.Settings).destNum }
backStack.lastOrNull { it is SettingsRoute.Settings }?.let { (it as SettingsRoute.Settings).destNum }
?: backStack
.lastOrNull { it is SettingsRoutes.SettingsGraph }
?.let { (it as SettingsRoutes.SettingsGraph).destNum }
.lastOrNull { it is SettingsRoute.SettingsGraph }
?.let { (it as SettingsRoute.SettingsGraph).destNum }
}
SideEffect { viewModel.initDestNum(destNum) }
return viewModel
@ -85,25 +85,25 @@ fun getRadioConfigViewModel(backStack: NavBackStack<NavKey>): RadioConfigViewMod
@Suppress("LongMethod", "CyclomaticComplexMethod")
fun EntryProviderScope<NavKey>.settingsGraph(backStack: NavBackStack<NavKey>) {
entry<SettingsRoutes.SettingsGraph> {
entry<SettingsRoute.SettingsGraph> {
SettingsMainScreen(
settingsViewModel = koinViewModel(),
radioConfigViewModel = getRadioConfigViewModel(backStack),
onClickNodeChip = { backStack.add(NodesRoutes.NodeDetail(it)) },
onClickNodeChip = { backStack.add(NodesRoute.NodeDetail(it)) },
onNavigate = { backStack.add(it) },
)
}
entry<SettingsRoutes.Settings> {
entry<SettingsRoute.Settings> {
SettingsMainScreen(
settingsViewModel = koinViewModel(),
radioConfigViewModel = getRadioConfigViewModel(backStack),
onClickNodeChip = { backStack.add(NodesRoutes.NodeDetail(it)) },
onClickNodeChip = { backStack.add(NodesRoute.NodeDetail(it)) },
onNavigate = { backStack.add(it) },
)
}
entry<SettingsRoutes.DeviceConfiguration> {
entry<SettingsRoute.DeviceConfiguration> {
DeviceConfigurationScreen(
viewModel = getRadioConfigViewModel(backStack),
onBack = { backStack.removeLastOrNull() },
@ -111,7 +111,7 @@ fun EntryProviderScope<NavKey>.settingsGraph(backStack: NavBackStack<NavKey>) {
)
}
entry<SettingsRoutes.ModuleConfiguration> {
entry<SettingsRoute.ModuleConfiguration> {
val settingsViewModel: SettingsViewModel = koinViewModel()
val excludedModulesUnlocked by settingsViewModel.excludedModulesUnlocked.collectAsStateWithLifecycle()
ModuleConfigurationScreen(
@ -122,11 +122,11 @@ fun EntryProviderScope<NavKey>.settingsGraph(backStack: NavBackStack<NavKey>) {
)
}
entry<SettingsRoutes.Administration> {
entry<SettingsRoute.Administration> {
AdministrationScreen(viewModel = getRadioConfigViewModel(backStack), onBack = { backStack.removeLastOrNull() })
}
entry<SettingsRoutes.CleanNodeDb> {
entry<SettingsRoute.CleanNodeDb> {
val viewModel: CleanNodeDatabaseViewModel = koinViewModel()
CleanNodeDatabaseScreen(viewModel = viewModel)
}
@ -185,16 +185,16 @@ fun EntryProviderScope<NavKey>.settingsGraph(backStack: NavBackStack<NavKey>) {
}
}
entry<SettingsRoutes.DebugPanel> {
entry<SettingsRoute.DebugPanel> {
val viewModel: DebugViewModel = koinViewModel()
DebugScreen(viewModel = viewModel, onNavigateUp = { backStack.removeLastOrNull() })
}
entry<SettingsRoutes.About> {
entry<SettingsRoute.About> {
AboutScreen(onNavigateUp = { backStack.removeLastOrNull() }, jsonProvider = { getAboutLibrariesJson() })
}
entry<SettingsRoutes.FilterSettings> {
entry<SettingsRoute.FilterSettings> {
val viewModel: FilterSettingsViewModel = koinViewModel()
FilterSettingsScreen(viewModel = viewModel, onBack = { backStack.removeLastOrNull() })
}

View file

@ -28,9 +28,9 @@ import org.jetbrains.compose.resources.DrawableResource
import org.jetbrains.compose.resources.StringResource
import org.jetbrains.compose.resources.stringResource
import org.jetbrains.compose.resources.vectorResource
import org.meshtastic.core.navigation.FirmwareRoutes
import org.meshtastic.core.navigation.FirmwareRoute
import org.meshtastic.core.navigation.Route
import org.meshtastic.core.navigation.SettingsRoutes
import org.meshtastic.core.navigation.SettingsRoute
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.administration
import org.meshtastic.core.resources.advanced_title
@ -125,7 +125,7 @@ private fun DeviceConfigSection(isManaged: Boolean, enabled: Boolean, onNavigate
trailingIcon = MeshtasticIcons.KeyboardArrowRight,
enabled = enabled,
) {
onNavigate(SettingsRoutes.DeviceConfiguration)
onNavigate(SettingsRoute.DeviceConfiguration)
}
}
}
@ -142,7 +142,7 @@ private fun ModuleSettingsSection(isManaged: Boolean, enabled: Boolean, onNaviga
trailingIcon = MeshtasticIcons.KeyboardArrowRight,
enabled = enabled,
) {
onNavigate(SettingsRoutes.ModuleConfiguration)
onNavigate(SettingsRoute.ModuleConfiguration)
}
}
}
@ -181,7 +181,7 @@ private fun AdministrationSection(enabled: Boolean, onNavigate: (Route) -> Unit)
trailingIconTint = MaterialTheme.colorScheme.error,
enabled = enabled,
) {
onNavigate(SettingsRoutes.Administration)
onNavigate(SettingsRoute.Administration)
}
}
}
@ -198,7 +198,7 @@ private fun AdvancedSection(isManaged: Boolean, isOtaCapable: Boolean, enabled:
text = stringResource(Res.string.firmware_update_title),
leadingIcon = MeshtasticIcons.SystemUpdate,
enabled = enabled,
onClick = { onNavigate(FirmwareRoutes.FirmwareUpdate) },
onClick = { onNavigate(FirmwareRoute.FirmwareUpdate) },
)
}
@ -206,14 +206,14 @@ private fun AdvancedSection(isManaged: Boolean, isOtaCapable: Boolean, enabled:
text = stringResource(Res.string.clean_node_database_title),
leadingIcon = MeshtasticIcons.CleaningServices,
enabled = enabled,
onClick = { onNavigate(SettingsRoutes.CleanNodeDb) },
onClick = { onNavigate(SettingsRoute.CleanNodeDb) },
)
ListItem(
text = stringResource(Res.string.debug_panel),
leadingIcon = MeshtasticIcons.BugReport,
enabled = enabled,
onClick = { onNavigate(SettingsRoutes.DebugPanel) },
onClick = { onNavigate(SettingsRoute.DebugPanel) },
)
}
}

View file

@ -20,12 +20,12 @@ import androidx.navigation3.runtime.EntryProviderScope
import androidx.navigation3.runtime.NavBackStack
import androidx.navigation3.runtime.NavKey
import org.koin.compose.viewmodel.koinViewModel
import org.meshtastic.core.navigation.ChannelsRoutes
import org.meshtastic.core.navigation.ChannelsRoute
import org.meshtastic.feature.settings.radio.RadioConfigViewModel
/** Navigation graph for for the top level ChannelScreen - [ChannelsRoutes.Channels]. */
/** Navigation graph for for the top level ChannelScreen - [ChannelsRoute.Channels]. */
fun EntryProviderScope<NavKey>.channelsGraph(backStack: NavBackStack<NavKey>) {
entry<ChannelsRoutes.ChannelsGraph> {
entry<ChannelsRoute.ChannelsGraph> {
ChannelScreen(
radioConfigViewModel = koinViewModel<RadioConfigViewModel>(),
onNavigate = { route -> backStack.add(route) },
@ -33,7 +33,7 @@ fun EntryProviderScope<NavKey>.channelsGraph(backStack: NavBackStack<NavKey>) {
)
}
entry<ChannelsRoutes.Channels> {
entry<ChannelsRoute.Channels> {
ChannelScreen(
radioConfigViewModel = koinViewModel<RadioConfigViewModel>(),
onNavigate = { route -> backStack.add(route) },

View file

@ -39,8 +39,8 @@ import kotlinx.coroutines.launch
import org.jetbrains.compose.resources.stringResource
import org.meshtastic.core.database.DatabaseConstants
import org.meshtastic.core.navigation.Route
import org.meshtastic.core.navigation.SettingsRoutes
import org.meshtastic.core.navigation.WifiProvisionRoutes
import org.meshtastic.core.navigation.SettingsRoute
import org.meshtastic.core.navigation.WifiProvisionRoute
import org.meshtastic.core.resources.Res
import org.meshtastic.core.resources.acknowledgements
import org.meshtastic.core.resources.app_settings
@ -202,7 +202,7 @@ fun DesktopSettingsScreen(
ExpressiveSection(title = stringResource(Res.string.wifi_devices)) {
ListItem(text = stringResource(Res.string.wifi_devices), leadingIcon = MeshtasticIcons.Wifi) {
onNavigate(WifiProvisionRoutes.WifiProvision())
onNavigate(WifiProvisionRoute.WifiProvision())
}
}
@ -219,7 +219,7 @@ fun DesktopSettingsScreen(
appVersionName = settingsViewModel.appVersionName,
excludedModulesUnlocked = excludedModulesUnlocked,
onUnlockExcludedModules = { settingsViewModel.unlockExcludedModules() },
onNavigateToAbout = { onNavigate(SettingsRoutes.About) },
onNavigateToAbout = { onNavigate(SettingsRoute.About) },
)
}
}

View file

@ -16,7 +16,7 @@
*/
package org.meshtastic.feature.settings.navigation
import org.meshtastic.core.navigation.SettingsRoutes
import org.meshtastic.core.navigation.SettingsRoute
actual fun getAboutLibrariesJson(): String =
SettingsRoutes::class.java.getResource("/aboutlibraries.json")?.readText() ?: ""
SettingsRoute::class.java.getResource("/aboutlibraries.json")?.readText() ?: ""

View file

@ -19,21 +19,21 @@ package org.meshtastic.feature.wifiprovision.navigation
import androidx.navigation3.runtime.EntryProviderScope
import androidx.navigation3.runtime.NavBackStack
import androidx.navigation3.runtime.NavKey
import org.meshtastic.core.navigation.WifiProvisionRoutes
import org.meshtastic.core.navigation.WifiProvisionRoute
import org.meshtastic.feature.wifiprovision.ui.WifiProvisionScreen
/**
* Registers the WiFi provisioning graph entries into the host navigation provider.
*
* Both the graph sentinel ([WifiProvisionRoutes.WifiProvisionGraph]) and the primary screen
* ([WifiProvisionRoutes.WifiProvision]) navigate to the same composable so that the feature can be reached via either a
* Both the graph sentinel ([WifiProvisionRoute.WifiProvisionGraph]) and the primary screen
* ([WifiProvisionRoute.WifiProvision]) navigate to the same composable so that the feature can be reached via either a
* top-level push or a deep-link graph push.
*/
fun EntryProviderScope<NavKey>.wifiProvisionGraph(backStack: NavBackStack<NavKey>) {
entry<WifiProvisionRoutes.WifiProvisionGraph> {
entry<WifiProvisionRoute.WifiProvisionGraph> {
WifiProvisionScreen(onNavigateUp = { backStack.removeLastOrNull() })
}
entry<WifiProvisionRoutes.WifiProvision> { key ->
entry<WifiProvisionRoute.WifiProvision> { key ->
WifiProvisionScreen(onNavigateUp = { backStack.removeLastOrNull() }, address = key.address)
}
}