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

@ -59,11 +59,11 @@ object DeepLinkRouter {
"messages",
"quickchat",
-> routeContacts(uri, pathSegments)
"connections" -> listOf(ConnectionsRoutes.ConnectionsGraph)
"connections" -> listOf(ConnectionsRoute.ConnectionsGraph)
"map" -> routeMap(uri, pathSegments)
"nodes" -> routeNodes(uri, pathSegments)
"settings" -> routeSettings(pathSegments)
"channels" -> listOf(ChannelsRoutes.ChannelsGraph)
"channels" -> listOf(ChannelsRoute.ChannelsGraph)
"firmware" -> routeFirmware(pathSegments)
"wifi-provision" -> routeWifiProvision(uri)
else -> {
@ -78,31 +78,31 @@ object DeepLinkRouter {
return when (firstSegment) {
"share" -> {
val message = uri.getQueryParameter("message") ?: ""
listOf(ContactsRoutes.ContactsGraph, ContactsRoutes.Share(message))
listOf(ContactsRoute.ContactsGraph, ContactsRoute.Share(message))
}
"quickchat" -> {
listOf(ContactsRoutes.ContactsGraph, ContactsRoutes.QuickChat)
listOf(ContactsRoute.ContactsGraph, ContactsRoute.QuickChat)
}
"messages" -> {
val contactKey = if (segments.size > 1) segments[1] else uri.getQueryParameter("contactKey") ?: ""
val message = uri.getQueryParameter("message") ?: ""
if (contactKey.isNotBlank()) {
listOf(
ContactsRoutes.ContactsGraph,
ContactsRoutes.Messages(contactKey = contactKey, message = message),
ContactsRoute.ContactsGraph,
ContactsRoute.Messages(contactKey = contactKey, message = message),
)
} else {
listOf(ContactsRoutes.ContactsGraph)
listOf(ContactsRoute.ContactsGraph)
}
}
else -> listOf(ContactsRoutes.ContactsGraph)
else -> listOf(ContactsRoute.ContactsGraph)
}
}
private fun routeMap(uri: CommonUri, segments: List<String>): List<NavKey> {
val waypointIdStr = if (segments.size > 1) segments[1] else uri.getQueryParameter("waypointId")
val waypointId = waypointIdStr?.toIntOrNull()
return listOf(MapRoutes.Map(waypointId))
return listOf(MapRoute.Map(waypointId))
}
private fun routeNodes(uri: CommonUri, segments: List<String>): List<NavKey> {
@ -110,17 +110,17 @@ object DeepLinkRouter {
val destNum = destNumStr?.toIntOrNull()
return if (destNum == null) {
listOf(NodesRoutes.NodesGraph)
listOf(NodesRoute.NodesGraph)
} else if (segments.size > 2) {
val subRouteStr = segments[2].lowercase()
val detailRouteFn = nodeDetailSubRoutes[subRouteStr]
if (detailRouteFn != null) {
listOf(NodesRoutes.NodesGraph, NodesRoutes.NodeDetailGraph(destNum), detailRouteFn(destNum))
listOf(NodesRoute.NodesGraph, NodesRoute.NodeDetailGraph(destNum), detailRouteFn(destNum))
} else {
listOf(NodesRoutes.NodesGraph, NodesRoutes.NodeDetail(destNum))
listOf(NodesRoute.NodesGraph, NodesRoute.NodeDetail(destNum))
}
} else {
listOf(NodesRoutes.NodesGraph, NodesRoutes.NodeDetail(destNum))
listOf(NodesRoute.NodesGraph, NodesRoute.NodeDetail(destNum))
}
}
@ -142,79 +142,79 @@ object DeepLinkRouter {
}
if (subRouteStr == null) {
return listOf(SettingsRoutes.SettingsGraph(destNum))
return listOf(SettingsRoute.SettingsGraph(destNum))
}
val subRoute = settingsSubRoutes[subRouteStr]
return if (subRoute != null) {
listOf(SettingsRoutes.SettingsGraph(destNum), subRoute)
listOf(SettingsRoute.SettingsGraph(destNum), subRoute)
} else {
listOf(SettingsRoutes.SettingsGraph(destNum))
listOf(SettingsRoute.SettingsGraph(destNum))
}
}
private fun routeWifiProvision(uri: CommonUri): List<NavKey> {
val address = uri.getQueryParameter("address")
return listOf(WifiProvisionRoutes.WifiProvision(address))
return listOf(WifiProvisionRoute.WifiProvision(address))
}
private fun routeFirmware(segments: List<String>): List<NavKey> {
val update = if (segments.size > 1) segments[1].lowercase() == "update" else false
return if (update) {
listOf(FirmwareRoutes.FirmwareGraph, FirmwareRoutes.FirmwareUpdate)
listOf(FirmwareRoute.FirmwareGraph, FirmwareRoute.FirmwareUpdate)
} else {
listOf(FirmwareRoutes.FirmwareGraph)
listOf(FirmwareRoute.FirmwareGraph)
}
}
private val settingsSubRoutes: Map<String, Route> =
mapOf(
"device-config" to SettingsRoutes.DeviceConfiguration,
"module-config" to SettingsRoutes.ModuleConfiguration,
"admin" to SettingsRoutes.Administration,
"user" to SettingsRoutes.User,
"channel" to SettingsRoutes.ChannelConfig,
"device" to SettingsRoutes.Device,
"position" to SettingsRoutes.Position,
"power" to SettingsRoutes.Power,
"network" to SettingsRoutes.Network,
"display" to SettingsRoutes.Display,
"lora" to SettingsRoutes.LoRa,
"bluetooth" to SettingsRoutes.Bluetooth,
"security" to SettingsRoutes.Security,
"mqtt" to SettingsRoutes.MQTT,
"serial" to SettingsRoutes.Serial,
"ext-notification" to SettingsRoutes.ExtNotification,
"store-forward" to SettingsRoutes.StoreForward,
"range-test" to SettingsRoutes.RangeTest,
"telemetry" to SettingsRoutes.Telemetry,
"canned-message" to SettingsRoutes.CannedMessage,
"audio" to SettingsRoutes.Audio,
"remote-hardware" to SettingsRoutes.RemoteHardware,
"neighbor-info" to SettingsRoutes.NeighborInfo,
"ambient-lighting" to SettingsRoutes.AmbientLighting,
"detection-sensor" to SettingsRoutes.DetectionSensor,
"paxcounter" to SettingsRoutes.Paxcounter,
"status-message" to SettingsRoutes.StatusMessage,
"traffic-management" to SettingsRoutes.TrafficManagement,
"tak" to SettingsRoutes.TAK,
"clean-node-db" to SettingsRoutes.CleanNodeDb,
"debug-panel" to SettingsRoutes.DebugPanel,
"about" to SettingsRoutes.About,
"filter-settings" to SettingsRoutes.FilterSettings,
"device-config" to SettingsRoute.DeviceConfiguration,
"module-config" to SettingsRoute.ModuleConfiguration,
"admin" to SettingsRoute.Administration,
"user" to SettingsRoute.User,
"channel" to SettingsRoute.ChannelConfig,
"device" to SettingsRoute.Device,
"position" to SettingsRoute.Position,
"power" to SettingsRoute.Power,
"network" to SettingsRoute.Network,
"display" to SettingsRoute.Display,
"lora" to SettingsRoute.LoRa,
"bluetooth" to SettingsRoute.Bluetooth,
"security" to SettingsRoute.Security,
"mqtt" to SettingsRoute.MQTT,
"serial" to SettingsRoute.Serial,
"ext-notification" to SettingsRoute.ExtNotification,
"store-forward" to SettingsRoute.StoreForward,
"range-test" to SettingsRoute.RangeTest,
"telemetry" to SettingsRoute.Telemetry,
"canned-message" to SettingsRoute.CannedMessage,
"audio" to SettingsRoute.Audio,
"remote-hardware" to SettingsRoute.RemoteHardware,
"neighbor-info" to SettingsRoute.NeighborInfo,
"ambient-lighting" to SettingsRoute.AmbientLighting,
"detection-sensor" to SettingsRoute.DetectionSensor,
"paxcounter" to SettingsRoute.Paxcounter,
"status-message" to SettingsRoute.StatusMessage,
"traffic-management" to SettingsRoute.TrafficManagement,
"tak" to SettingsRoute.TAK,
"clean-node-db" to SettingsRoute.CleanNodeDb,
"debug-panel" to SettingsRoute.DebugPanel,
"about" to SettingsRoute.About,
"filter-settings" to SettingsRoute.FilterSettings,
)
private val nodeDetailSubRoutes: Map<String, (Int) -> Route> =
mapOf(
"device-metrics" to { destNum -> NodeDetailRoutes.DeviceMetrics(destNum) },
"map" to { destNum -> NodeDetailRoutes.NodeMap(destNum) },
"position" to { destNum -> NodeDetailRoutes.PositionLog(destNum) },
"environment" to { destNum -> NodeDetailRoutes.EnvironmentMetrics(destNum) },
"signal" to { destNum -> NodeDetailRoutes.SignalMetrics(destNum) },
"power" to { destNum -> NodeDetailRoutes.PowerMetrics(destNum) },
"traceroute" to { destNum -> NodeDetailRoutes.TracerouteLog(destNum) },
"host-metrics" to { destNum -> NodeDetailRoutes.HostMetricsLog(destNum) },
"pax" to { destNum -> NodeDetailRoutes.PaxMetrics(destNum) },
"neighbors" to { destNum -> NodeDetailRoutes.NeighborInfoLog(destNum) },
"device-metrics" to { destNum -> NodeDetailRoute.DeviceMetrics(destNum) },
"map" to { destNum -> NodeDetailRoute.NodeMap(destNum) },
"position" to { destNum -> NodeDetailRoute.PositionLog(destNum) },
"environment" to { destNum -> NodeDetailRoute.EnvironmentMetrics(destNum) },
"signal" to { destNum -> NodeDetailRoute.SignalMetrics(destNum) },
"power" to { destNum -> NodeDetailRoute.PowerMetrics(destNum) },
"traceroute" to { destNum -> NodeDetailRoute.TracerouteLog(destNum) },
"host-metrics" to { destNum -> NodeDetailRoute.HostMetricsLog(destNum) },
"pax" to { destNum -> NodeDetailRoute.PaxMetrics(destNum) },
"neighbors" to { destNum -> NodeDetailRoute.NeighborInfoLog(destNum) },
)
}

View file

@ -18,99 +18,28 @@ package org.meshtastic.core.navigation
import androidx.navigation3.runtime.NavKey
import androidx.savedstate.serialization.SavedStateConfiguration
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.polymorphic
import kotlinx.serialization.modules.subclassesOfSealed
/**
* Shared polymorphic serialization configuration for Navigation 3 saved-state support. Registers all route types used
* across Android and Desktop navigation graphs.
* Shared polymorphic serialization configuration for Navigation 3 saved-state support. Uses sealed interface
* hierarchies so that new routes are automatically registered at compile time no manual `subclass()` calls needed.
*/
@OptIn(ExperimentalSerializationApi::class)
val MeshtasticNavSavedStateConfig = SavedStateConfiguration {
serializersModule = SerializersModule {
polymorphic(NavKey::class) {
// Nodes
subclass(NodesRoutes.NodesGraph::class, NodesRoutes.NodesGraph.serializer())
subclass(NodesRoutes.Nodes::class, NodesRoutes.Nodes.serializer())
subclass(NodesRoutes.NodeDetailGraph::class, NodesRoutes.NodeDetailGraph.serializer())
subclass(NodesRoutes.NodeDetail::class, NodesRoutes.NodeDetail.serializer())
// Node detail sub-screens
subclass(NodeDetailRoutes.DeviceMetrics::class, NodeDetailRoutes.DeviceMetrics.serializer())
subclass(NodeDetailRoutes.NodeMap::class, NodeDetailRoutes.NodeMap.serializer())
subclass(NodeDetailRoutes.PositionLog::class, NodeDetailRoutes.PositionLog.serializer())
subclass(NodeDetailRoutes.EnvironmentMetrics::class, NodeDetailRoutes.EnvironmentMetrics.serializer())
subclass(NodeDetailRoutes.SignalMetrics::class, NodeDetailRoutes.SignalMetrics.serializer())
subclass(NodeDetailRoutes.PowerMetrics::class, NodeDetailRoutes.PowerMetrics.serializer())
subclass(NodeDetailRoutes.TracerouteLog::class, NodeDetailRoutes.TracerouteLog.serializer())
subclass(NodeDetailRoutes.TracerouteMap::class, NodeDetailRoutes.TracerouteMap.serializer())
subclass(NodeDetailRoutes.HostMetricsLog::class, NodeDetailRoutes.HostMetricsLog.serializer())
subclass(NodeDetailRoutes.PaxMetrics::class, NodeDetailRoutes.PaxMetrics.serializer())
subclass(NodeDetailRoutes.NeighborInfoLog::class, NodeDetailRoutes.NeighborInfoLog.serializer())
// Conversations
subclass(ContactsRoutes.ContactsGraph::class, ContactsRoutes.ContactsGraph.serializer())
subclass(ContactsRoutes.Contacts::class, ContactsRoutes.Contacts.serializer())
subclass(ContactsRoutes.Messages::class, ContactsRoutes.Messages.serializer())
subclass(ContactsRoutes.Share::class, ContactsRoutes.Share.serializer())
subclass(ContactsRoutes.QuickChat::class, ContactsRoutes.QuickChat.serializer())
// Map
subclass(MapRoutes.Map::class, MapRoutes.Map.serializer())
// Firmware
subclass(FirmwareRoutes.FirmwareGraph::class, FirmwareRoutes.FirmwareGraph.serializer())
subclass(FirmwareRoutes.FirmwareUpdate::class, FirmwareRoutes.FirmwareUpdate.serializer())
// Settings
subclass(SettingsRoutes.SettingsGraph::class, SettingsRoutes.SettingsGraph.serializer())
subclass(SettingsRoutes.Settings::class, SettingsRoutes.Settings.serializer())
subclass(SettingsRoutes.DeviceConfiguration::class, SettingsRoutes.DeviceConfiguration.serializer())
subclass(SettingsRoutes.ModuleConfiguration::class, SettingsRoutes.ModuleConfiguration.serializer())
subclass(SettingsRoutes.Administration::class, SettingsRoutes.Administration.serializer())
// Settings - Config routes
subclass(SettingsRoutes.User::class, SettingsRoutes.User.serializer())
subclass(SettingsRoutes.ChannelConfig::class, SettingsRoutes.ChannelConfig.serializer())
subclass(SettingsRoutes.Device::class, SettingsRoutes.Device.serializer())
subclass(SettingsRoutes.Position::class, SettingsRoutes.Position.serializer())
subclass(SettingsRoutes.Power::class, SettingsRoutes.Power.serializer())
subclass(SettingsRoutes.Network::class, SettingsRoutes.Network.serializer())
subclass(SettingsRoutes.Display::class, SettingsRoutes.Display.serializer())
subclass(SettingsRoutes.LoRa::class, SettingsRoutes.LoRa.serializer())
subclass(SettingsRoutes.Bluetooth::class, SettingsRoutes.Bluetooth.serializer())
subclass(SettingsRoutes.Security::class, SettingsRoutes.Security.serializer())
// Settings - Module routes
subclass(SettingsRoutes.MQTT::class, SettingsRoutes.MQTT.serializer())
subclass(SettingsRoutes.Serial::class, SettingsRoutes.Serial.serializer())
subclass(SettingsRoutes.ExtNotification::class, SettingsRoutes.ExtNotification.serializer())
subclass(SettingsRoutes.StoreForward::class, SettingsRoutes.StoreForward.serializer())
subclass(SettingsRoutes.RangeTest::class, SettingsRoutes.RangeTest.serializer())
subclass(SettingsRoutes.Telemetry::class, SettingsRoutes.Telemetry.serializer())
subclass(SettingsRoutes.CannedMessage::class, SettingsRoutes.CannedMessage.serializer())
subclass(SettingsRoutes.Audio::class, SettingsRoutes.Audio.serializer())
subclass(SettingsRoutes.RemoteHardware::class, SettingsRoutes.RemoteHardware.serializer())
subclass(SettingsRoutes.NeighborInfo::class, SettingsRoutes.NeighborInfo.serializer())
subclass(SettingsRoutes.AmbientLighting::class, SettingsRoutes.AmbientLighting.serializer())
subclass(SettingsRoutes.DetectionSensor::class, SettingsRoutes.DetectionSensor.serializer())
subclass(SettingsRoutes.Paxcounter::class, SettingsRoutes.Paxcounter.serializer())
subclass(SettingsRoutes.StatusMessage::class, SettingsRoutes.StatusMessage.serializer())
subclass(SettingsRoutes.TrafficManagement::class, SettingsRoutes.TrafficManagement.serializer())
subclass(SettingsRoutes.TAK::class, SettingsRoutes.TAK.serializer())
// Settings - Advanced routes
subclass(SettingsRoutes.CleanNodeDb::class, SettingsRoutes.CleanNodeDb.serializer())
subclass(SettingsRoutes.DebugPanel::class, SettingsRoutes.DebugPanel.serializer())
subclass(SettingsRoutes.About::class, SettingsRoutes.About.serializer())
subclass(SettingsRoutes.FilterSettings::class, SettingsRoutes.FilterSettings.serializer())
// Channels
subclass(ChannelsRoutes.ChannelsGraph::class, ChannelsRoutes.ChannelsGraph.serializer())
subclass(ChannelsRoutes.Channels::class, ChannelsRoutes.Channels.serializer())
// Connections
subclass(ConnectionsRoutes.ConnectionsGraph::class, ConnectionsRoutes.ConnectionsGraph.serializer())
subclass(ConnectionsRoutes.Connections::class, ConnectionsRoutes.Connections.serializer())
subclassesOfSealed<ChannelsRoute>()
subclassesOfSealed<ConnectionsRoute>()
subclassesOfSealed<ContactsRoute>()
subclassesOfSealed<MapRoute>()
subclassesOfSealed<NodesRoute>()
subclassesOfSealed<NodeDetailRoute>()
subclassesOfSealed<SettingsRoute>()
subclassesOfSealed<FirmwareRoute>()
subclassesOfSealed<WifiProvisionRoute>()
}
}
}

View file

@ -25,160 +25,169 @@ interface Route : NavKey
interface Graph : Route
object ChannelsRoutes {
@Serializable data object ChannelsGraph : Graph
@Serializable
sealed interface ChannelsRoute : Route {
@Serializable data object ChannelsGraph : ChannelsRoute, Graph
@Serializable data object Channels : Route
@Serializable data object Channels : ChannelsRoute
}
object ConnectionsRoutes {
@Serializable data object ConnectionsGraph : Graph
@Serializable
sealed interface ConnectionsRoute : Route {
@Serializable data object ConnectionsGraph : ConnectionsRoute, Graph
@Serializable data object Connections : Route
@Serializable data object Connections : ConnectionsRoute
}
object ContactsRoutes {
@Serializable data object ContactsGraph : Graph
@Serializable
sealed interface ContactsRoute : Route {
@Serializable data object ContactsGraph : ContactsRoute, Graph
@Serializable data object Contacts : Route
@Serializable data object Contacts : ContactsRoute
@Serializable data class Messages(val contactKey: String, val message: String = "") : Route
@Serializable data class Messages(val contactKey: String, val message: String = "") : ContactsRoute
@Serializable data class Share(val message: String) : Route
@Serializable data class Share(val message: String) : ContactsRoute
@Serializable data object QuickChat : Route
@Serializable data object QuickChat : ContactsRoute
}
object MapRoutes {
@Serializable data class Map(val waypointId: Int? = null) : Route
@Serializable
sealed interface MapRoute : Route {
@Serializable data class Map(val waypointId: Int? = null) : MapRoute
}
object NodesRoutes {
@Serializable data object NodesGraph : Graph
@Serializable
sealed interface NodesRoute : Route {
@Serializable data object NodesGraph : NodesRoute, Graph
@Serializable data object Nodes : Route
@Serializable data object Nodes : NodesRoute
@Serializable data class NodeDetailGraph(val destNum: Int? = null) : Graph
@Serializable data class NodeDetailGraph(val destNum: Int? = null) : NodesRoute, Graph
@Serializable data class NodeDetail(val destNum: Int? = null) : Route
@Serializable data class NodeDetail(val destNum: Int? = null) : NodesRoute
}
object NodeDetailRoutes {
@Serializable data class DeviceMetrics(val destNum: Int) : Route
@Serializable
sealed interface NodeDetailRoute : Route {
@Serializable data class DeviceMetrics(val destNum: Int) : NodeDetailRoute
@Serializable data class NodeMap(val destNum: Int) : Route
@Serializable data class NodeMap(val destNum: Int) : NodeDetailRoute
@Serializable data class PositionLog(val destNum: Int) : Route
@Serializable data class PositionLog(val destNum: Int) : NodeDetailRoute
@Serializable data class EnvironmentMetrics(val destNum: Int) : Route
@Serializable data class EnvironmentMetrics(val destNum: Int) : NodeDetailRoute
@Serializable data class SignalMetrics(val destNum: Int) : Route
@Serializable data class SignalMetrics(val destNum: Int) : NodeDetailRoute
@Serializable data class PowerMetrics(val destNum: Int) : Route
@Serializable data class PowerMetrics(val destNum: Int) : NodeDetailRoute
@Serializable data class TracerouteLog(val destNum: Int) : Route
@Serializable data class TracerouteLog(val destNum: Int) : NodeDetailRoute
@Serializable data class TracerouteMap(val destNum: Int, val requestId: Int, val logUuid: String? = null) : Route
@Serializable data class TracerouteMap(val destNum: Int, val requestId: Int, val logUuid: String? = null) : NodeDetailRoute
@Serializable data class HostMetricsLog(val destNum: Int) : Route
@Serializable data class HostMetricsLog(val destNum: Int) : NodeDetailRoute
@Serializable data class PaxMetrics(val destNum: Int) : Route
@Serializable data class PaxMetrics(val destNum: Int) : NodeDetailRoute
@Serializable data class NeighborInfoLog(val destNum: Int) : Route
@Serializable data class NeighborInfoLog(val destNum: Int) : NodeDetailRoute
}
object SettingsRoutes {
@Serializable data class SettingsGraph(val destNum: Int? = null) : Graph
@Serializable
sealed interface SettingsRoute : Route {
@Serializable data class SettingsGraph(val destNum: Int? = null) : SettingsRoute, Graph
@Serializable data class Settings(val destNum: Int? = null) : Route
@Serializable data class Settings(val destNum: Int? = null) : SettingsRoute
@Serializable data object DeviceConfiguration : Route
@Serializable data object DeviceConfiguration : SettingsRoute
@Serializable data object ModuleConfiguration : Route
@Serializable data object ModuleConfiguration : SettingsRoute
@Serializable data object Administration : Route
@Serializable data object Administration : SettingsRoute
// region radio Config Routes
@Serializable data object User : Route
@Serializable data object User : SettingsRoute
@Serializable data object ChannelConfig : Route
@Serializable data object ChannelConfig : SettingsRoute
@Serializable data object Device : Route
@Serializable data object Device : SettingsRoute
@Serializable data object Position : Route
@Serializable data object Position : SettingsRoute
@Serializable data object Power : Route
@Serializable data object Power : SettingsRoute
@Serializable data object Network : Route
@Serializable data object Network : SettingsRoute
@Serializable data object Display : Route
@Serializable data object Display : SettingsRoute
@Serializable data object LoRa : Route
@Serializable data object LoRa : SettingsRoute
@Serializable data object Bluetooth : Route
@Serializable data object Bluetooth : SettingsRoute
@Serializable data object Security : Route
@Serializable data object Security : SettingsRoute
// endregion
// region module config routes
@Serializable data object MQTT : Route
@Serializable data object MQTT : SettingsRoute
@Serializable data object Serial : Route
@Serializable data object Serial : SettingsRoute
@Serializable data object ExtNotification : Route
@Serializable data object ExtNotification : SettingsRoute
@Serializable data object StoreForward : Route
@Serializable data object StoreForward : SettingsRoute
@Serializable data object RangeTest : Route
@Serializable data object RangeTest : SettingsRoute
@Serializable data object Telemetry : Route
@Serializable data object Telemetry : SettingsRoute
@Serializable data object CannedMessage : Route
@Serializable data object CannedMessage : SettingsRoute
@Serializable data object Audio : Route
@Serializable data object Audio : SettingsRoute
@Serializable data object RemoteHardware : Route
@Serializable data object RemoteHardware : SettingsRoute
@Serializable data object NeighborInfo : Route
@Serializable data object NeighborInfo : SettingsRoute
@Serializable data object AmbientLighting : Route
@Serializable data object AmbientLighting : SettingsRoute
@Serializable data object DetectionSensor : Route
@Serializable data object DetectionSensor : SettingsRoute
@Serializable data object Paxcounter : Route
@Serializable data object Paxcounter : SettingsRoute
@Serializable data object StatusMessage : Route
@Serializable data object StatusMessage : SettingsRoute
@Serializable data object TrafficManagement : Route
@Serializable data object TrafficManagement : SettingsRoute
@Serializable data object TAK : Route
@Serializable data object TAK : SettingsRoute
// endregion
// region advanced config routes
@Serializable data object CleanNodeDb : Route
@Serializable data object CleanNodeDb : SettingsRoute
@Serializable data object DebugPanel : Route
@Serializable data object DebugPanel : SettingsRoute
@Serializable data object About : Route
@Serializable data object About : SettingsRoute
@Serializable data object FilterSettings : Route
@Serializable data object FilterSettings : SettingsRoute
// endregion
}
object FirmwareRoutes {
@Serializable data object FirmwareGraph : Graph
@Serializable
sealed interface FirmwareRoute : Route {
@Serializable data object FirmwareGraph : FirmwareRoute, Graph
@Serializable data object FirmwareUpdate : Route
@Serializable data object FirmwareUpdate : FirmwareRoute
}
object WifiProvisionRoutes {
@Serializable data object WifiProvisionGraph : Graph
@Serializable
sealed interface WifiProvisionRoute : Route {
@Serializable data object WifiProvisionGraph : WifiProvisionRoute, Graph
@Serializable data class WifiProvision(val address: String? = null) : Route
@Serializable data class WifiProvision(val address: String? = null) : WifiProvisionRoute
}

View file

@ -32,11 +32,11 @@ import org.meshtastic.core.resources.nodes
* and Desktop navigation shells.
*/
enum class TopLevelDestination(val label: StringResource, val route: Route) {
Conversations(Res.string.conversations, ContactsRoutes.ContactsGraph),
Nodes(Res.string.nodes, NodesRoutes.NodesGraph),
Map(Res.string.map, MapRoutes.Map()),
Settings(Res.string.bottom_nav_settings, SettingsRoutes.SettingsGraph()),
Connections(Res.string.connections, ConnectionsRoutes.ConnectionsGraph),
Conversations(Res.string.conversations, ContactsRoute.ContactsGraph),
Nodes(Res.string.nodes, NodesRoute.NodesGraph),
Map(Res.string.map, MapRoute.Map()),
Settings(Res.string.bottom_nav_settings, SettingsRoute.SettingsGraph()),
Connections(Res.string.connections, ConnectionsRoute.ConnectionsGraph),
;
companion object {

View file

@ -29,7 +29,7 @@ class MultiBackstackTest {
val multiBackstack = MultiBackstack(startTab)
val nodesStack =
NavBackStack<NavKey>().apply { addAll(listOf(TopLevelDestination.Nodes.route, NodesRoutes.Nodes)) }
NavBackStack<NavKey>().apply { addAll(listOf(TopLevelDestination.Nodes.route, NodesRoute.Nodes)) }
val mapStack = NavBackStack<NavKey>().apply { addAll(listOf(TopLevelDestination.Map.route)) }
multiBackstack.backStacks =
@ -51,7 +51,7 @@ class MultiBackstackTest {
val multiBackstack = MultiBackstack(startTab)
val nodesStack =
NavBackStack<NavKey>().apply { addAll(listOf(TopLevelDestination.Nodes.route, NodesRoutes.Nodes)) }
NavBackStack<NavKey>().apply { addAll(listOf(TopLevelDestination.Nodes.route, NodesRoute.Nodes)) }
multiBackstack.backStacks = mapOf(TopLevelDestination.Nodes.route to nodesStack)
assertEquals(2, multiBackstack.activeBackStack.size)
@ -68,7 +68,7 @@ class MultiBackstackTest {
val multiBackstack = MultiBackstack(startTab)
val nodesStack =
NavBackStack<NavKey>().apply { addAll(listOf(TopLevelDestination.Nodes.route, NodesRoutes.Nodes)) }
NavBackStack<NavKey>().apply { addAll(listOf(TopLevelDestination.Nodes.route, NodesRoute.Nodes)) }
multiBackstack.backStacks = mapOf(TopLevelDestination.Nodes.route to nodesStack)
multiBackstack.goBack()
@ -104,11 +104,11 @@ class MultiBackstackTest {
val settingsStack = NavBackStack<NavKey>().apply { addAll(listOf(TopLevelDestination.Settings.route)) }
multiBackstack.backStacks = mapOf(TopLevelDestination.Settings.route to settingsStack)
val deepLinkPath = listOf(TopLevelDestination.Settings.route, SettingsRoutes.About)
val deepLinkPath = listOf(TopLevelDestination.Settings.route, SettingsRoute.About)
multiBackstack.handleDeepLink(deepLinkPath)
assertEquals(TopLevelDestination.Settings.route, multiBackstack.currentTabRoute)
assertEquals(2, multiBackstack.activeBackStack.size)
assertEquals(SettingsRoutes.About, multiBackstack.activeBackStack.last())
assertEquals(SettingsRoute.About, multiBackstack.activeBackStack.last())
}
}