mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-04-20 22:23:37 +00:00
ci: cache Robolectric SDK jars to prevent flaky SocketException failures (#5045)
This commit is contained in:
parent
93e0b9ca57
commit
1390a3cd4f
34 changed files with 374 additions and 426 deletions
|
|
@ -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) },
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue