diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/MapView.kt b/app/src/fdroid/kotlin/org/meshtastic/app/map/MapView.kt index 1ba1e02f7..afbedfa0b 100644 --- a/app/src/fdroid/kotlin/org/meshtastic/app/map/MapView.kt +++ b/app/src/fdroid/kotlin/org/meshtastic/app/map/MapView.kt @@ -28,7 +28,6 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.rememberScrollState @@ -97,7 +96,6 @@ import org.meshtastic.core.common.util.nowMillis import org.meshtastic.core.common.util.nowSeconds import org.meshtastic.core.model.DataPacket import org.meshtastic.core.model.Node -import org.meshtastic.core.model.util.toString import org.meshtastic.core.resources.Res import org.meshtastic.core.resources.calculating import org.meshtastic.core.resources.cancel @@ -107,10 +105,7 @@ import org.meshtastic.core.resources.delete_for_everyone import org.meshtastic.core.resources.delete_for_me import org.meshtastic.core.resources.expires import org.meshtastic.core.resources.getString -import org.meshtastic.core.resources.heading -import org.meshtastic.core.resources.latitude import org.meshtastic.core.resources.location_disabled -import org.meshtastic.core.resources.longitude import org.meshtastic.core.resources.map_cache_info import org.meshtastic.core.resources.map_cache_manager import org.meshtastic.core.resources.map_cache_size @@ -142,7 +137,6 @@ import org.meshtastic.core.ui.util.showToast import org.meshtastic.feature.map.LastHeardFilter import org.meshtastic.feature.map.model.TracerouteOverlay import org.meshtastic.feature.map.tracerouteNodeSelection -import org.meshtastic.proto.Config.DisplayConfig.DisplayUnits import org.meshtastic.proto.Position import org.meshtastic.proto.Waypoint import org.osmdroid.bonuspack.utils.BonusPackHelper.getBitmapFromVectorDrawable @@ -444,7 +438,9 @@ fun MapView( if (node.batteryStr != "") node.batteryStr else "?", ) ourNode?.distanceStr(node, displayUnits)?.let { dist -> - subDescription = getString(Res.string.map_subDescription, ourNode.bearing(node).toString(), dist) + ourNode.bearing(node)?.let { bearing -> + subDescription = getString(Res.string.map_subDescription, bearing, dist) + } } setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM) position = nodePosition diff --git a/app/src/fdroid/kotlin/org/meshtastic/app/map/MapViewModel.kt b/app/src/fdroid/kotlin/org/meshtastic/app/map/MapViewModel.kt index ab891cbc6..4bb2c9083 100644 --- a/app/src/fdroid/kotlin/org/meshtastic/app/map/MapViewModel.kt +++ b/app/src/fdroid/kotlin/org/meshtastic/app/map/MapViewModel.kt @@ -22,7 +22,6 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import org.koin.core.annotation.KoinViewModel import org.meshtastic.core.common.BuildConfigProvider -import org.meshtastic.core.model.DataPacket import org.meshtastic.core.model.RadioController import org.meshtastic.core.repository.MapPrefs import org.meshtastic.core.repository.NodeRepository @@ -37,7 +36,7 @@ import org.meshtastic.proto.LocalConfig class MapViewModel( mapPrefs: MapPrefs, packetRepository: PacketRepository, - override val nodeRepository: NodeRepository, + nodeRepository: NodeRepository, radioController: RadioController, radioConfigRepository: RadioConfigRepository, buildConfigProvider: BuildConfigProvider, @@ -65,6 +64,4 @@ class MapViewModel( get() = localConfig.value val applicationId = buildConfigProvider.applicationId - - override fun getUser(userId: String?) = nodeRepository.getUser(userId ?: DataPacket.ID_BROADCAST) } diff --git a/app/src/main/kotlin/org/meshtastic/app/navigation/NodesNavigation.kt b/app/src/main/kotlin/org/meshtastic/app/navigation/NodesNavigation.kt index 24893c7a7..34c742882 100644 --- a/app/src/main/kotlin/org/meshtastic/app/navigation/NodesNavigation.kt +++ b/app/src/main/kotlin/org/meshtastic/app/navigation/NodesNavigation.kt @@ -34,6 +34,7 @@ import androidx.navigation3.runtime.NavKey import kotlinx.coroutines.flow.Flow import org.jetbrains.compose.resources.StringResource import org.koin.compose.viewmodel.koinViewModel +import org.koin.core.parameter.parametersOf import org.meshtastic.app.map.node.NodeMapScreen import org.meshtastic.app.ui.node.AdaptiveNodeListScreen import org.meshtastic.core.navigation.ContactsRoutes @@ -115,7 +116,8 @@ fun EntryProviderScope.nodeDetailGraph( } entry { args -> - val metricsViewModel = koinViewModel() + val metricsViewModel = + koinViewModel(key = "metrics-${args.destNum}") { parametersOf(args.destNum) } metricsViewModel.setNodeId(args.destNum) TracerouteLogScreen( @@ -134,7 +136,8 @@ fun EntryProviderScope.nodeDetailGraph( } entry { args -> - val metricsViewModel = koinViewModel() + val metricsViewModel = + koinViewModel(key = "metrics-${args.destNum}") { parametersOf(args.destNum) } metricsViewModel.setNodeId(args.destNum) TracerouteMapScreen( @@ -176,8 +179,8 @@ private inline fun EntryProviderScope.addNodeDetailS crossinline getDestNum: (R) -> Int, ) { entry { args -> - val metricsViewModel = koinViewModel() val destNum = getDestNum(args) + val metricsViewModel = koinViewModel(key = "metrics-$destNum") { parametersOf(destNum) } metricsViewModel.setNodeId(destNum) routeInfo.screenComposable(metricsViewModel) { backStack.removeLastOrNull() } diff --git a/app/src/test/kotlin/org/meshtastic/app/di/KoinVerificationTest.kt b/app/src/test/kotlin/org/meshtastic/app/di/KoinVerificationTest.kt index 341d25ccf..d71c7dd9c 100644 --- a/app/src/test/kotlin/org/meshtastic/app/di/KoinVerificationTest.kt +++ b/app/src/test/kotlin/org/meshtastic/app/di/KoinVerificationTest.kt @@ -32,6 +32,7 @@ import org.koin.test.verify.injectedParameters import org.koin.test.verify.verify import org.meshtastic.app.map.MapViewModel import org.meshtastic.core.model.util.NodeIdLookup +import org.meshtastic.feature.node.metrics.MetricsViewModel class KoinVerificationTest { @@ -54,7 +55,11 @@ class KoinVerificationTest { HttpClientEngine::class, OkHttpClient::class, ), - injections = injectedParameters(definition(SavedStateHandle::class)), + injections = + injectedParameters( + definition(SavedStateHandle::class), + definition(Int::class), + ), ) } } diff --git a/feature/map/src/commonMain/kotlin/org/meshtastic/feature/map/BaseMapViewModel.kt b/feature/map/src/commonMain/kotlin/org/meshtastic/feature/map/BaseMapViewModel.kt index a7caf78a9..73dcbe499 100644 --- a/feature/map/src/commonMain/kotlin/org/meshtastic/feature/map/BaseMapViewModel.kt +++ b/feature/map/src/commonMain/kotlin/org/meshtastic/feature/map/BaseMapViewModel.kt @@ -47,7 +47,7 @@ import org.meshtastic.proto.Waypoint @Suppress("TooManyFunctions") open class BaseMapViewModel( protected val mapPrefs: MapPrefs, - protected open val nodeRepository: NodeRepository, + protected val nodeRepository: NodeRepository, private val packetRepository: PacketRepository, private val radioController: RadioController, ) : ViewModel() { diff --git a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/debugging/DebugViewModel.kt b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/debugging/DebugViewModel.kt index bca6235b7..c3410f33d 100644 --- a/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/debugging/DebugViewModel.kt +++ b/feature/settings/src/commonMain/kotlin/org/meshtastic/feature/settings/debugging/DebugViewModel.kt @@ -193,19 +193,19 @@ class LogFilterManager { return logs.filter { logItem -> when (filterMode) { FilterMode.OR -> - filterTexts.any { - it.contains(logItem.logMessage, ignoreCase = true) || - it.contains(logItem.messageType, ignoreCase = true) || - it.contains(logItem.formattedReceivedDate, ignoreCase = true) || - (logItem.decodedPayload?.contains(it, ignoreCase = true) == true) + filterTexts.any { filter -> + logItem.logMessage.contains(filter, ignoreCase = true) || + logItem.messageType.contains(filter, ignoreCase = true) || + logItem.formattedReceivedDate.contains(filter, ignoreCase = true) || + (logItem.decodedPayload?.contains(filter, ignoreCase = true) == true) } FilterMode.AND -> - filterTexts.all { - it.contains(logItem.logMessage, ignoreCase = true) || - it.contains(logItem.messageType, ignoreCase = true) || - it.contains(logItem.formattedReceivedDate, ignoreCase = true) || - (logItem.decodedPayload?.contains(it, ignoreCase = true) == true) + filterTexts.all { filter -> + logItem.logMessage.contains(filter, ignoreCase = true) || + logItem.messageType.contains(filter, ignoreCase = true) || + logItem.formattedReceivedDate.contains(filter, ignoreCase = true) || + (logItem.decodedPayload?.contains(filter, ignoreCase = true) == true) } } }