From a832ed50c58a868211cca93f4754d0296a2e5882 Mon Sep 17 00:00:00 2001 From: DaneEvans Date: Mon, 7 Jul 2025 23:57:34 +1000 Subject: [PATCH] Fix/2207 node details respects units (#2374) --- .../geeksville/mesh/model/MetricsViewModel.kt | 1 + .../main/java/com/geeksville/mesh/model/Node.kt | 8 +++----- .../java/com/geeksville/mesh/ui/map/MapView.kt | 2 +- .../com/geeksville/mesh/ui/node/NodeDetail.kt | 8 +++++--- .../geeksville/mesh/util/DistanceExtensions.kt | 17 ++++++++++++++--- 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt b/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt index 3d0545e6e..f53bde640 100644 --- a/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt +++ b/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt @@ -289,6 +289,7 @@ class MetricsViewModel @Inject constructor( state.copy( isManaged = profile.config.security.isManaged, isFahrenheit = moduleConfig.telemetry.environmentDisplayFahrenheit, + displayUnits = profile.config.display.units ) } }.launchIn(viewModelScope) diff --git a/app/src/main/java/com/geeksville/mesh/model/Node.kt b/app/src/main/java/com/geeksville/mesh/model/Node.kt index 91a1bdbaa..c4864e0ae 100644 --- a/app/src/main/java/com/geeksville/mesh/model/Node.kt +++ b/app/src/main/java/com/geeksville/mesh/model/Node.kt @@ -89,11 +89,9 @@ data class Node( else -> latLongToMeter(latitude, longitude, o.latitude, o.longitude).toInt() } - // @return a nice human readable string for the distance, or null for unknown - fun distanceStr(o: Node, displayUnits: Int = 0): String? = distance(o)?.let { dist -> - val system = DisplayConfig.DisplayUnits.forNumber(displayUnits) - return if (dist > 0) dist.toDistanceString(system) else null - } + // @return formatted distance string to another node, using the given display units + fun distanceStr(o: Node, displayUnits: DisplayConfig.DisplayUnits): String? = + distance(o)?.toDistanceString(displayUnits) // @return bearing to the other position in degrees fun bearing(o: Node?): Int? = when { diff --git a/app/src/main/java/com/geeksville/mesh/ui/map/MapView.kt b/app/src/main/java/com/geeksville/mesh/ui/map/MapView.kt index afb856560..831c049d1 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/map/MapView.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/map/MapView.kt @@ -308,7 +308,7 @@ fun MapView( val nodesWithPosition = nodes.filter { it.validPosition != null } val ourNode = model.ourNodeInfo.value val gpsFormat = model.config.display.gpsFormat.number - val displayUnits = model.config.display.units.number + val displayUnits = model.config.display.units val mapFilterState = model.mapFilterStateFlow.value // Access mapFilterState directly return nodesWithPosition.mapNotNull { node -> if (mapFilterState.onlyFavorites && !node.isFavorite && !node.equals(ourNode)) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt b/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt index e4624da2e..723ea26bc 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt @@ -145,6 +145,7 @@ import com.geeksville.mesh.util.formatAgo import com.geeksville.mesh.util.formatUptime import com.geeksville.mesh.util.thenIf import com.geeksville.mesh.util.toDistanceString +import com.geeksville.mesh.util.toSmallDistanceString import com.geeksville.mesh.util.toSpeedString import kotlinx.coroutines.delay import kotlin.time.Duration.Companion.milliseconds @@ -294,7 +295,7 @@ private fun NodeDetailList( if (node.hasEnvironmentMetrics) { PreferenceCategory(stringResource(R.string.environment)) - EnvironmentMetrics(node, metricsState.isFahrenheit) + EnvironmentMetrics(node, metricsState.isFahrenheit, metricsState.displayUnits) Spacer(modifier = Modifier.height(8.dp)) } @@ -732,6 +733,7 @@ private fun InfoCard( private fun EnvironmentMetrics( node: Node, isFahrenheit: Boolean = false, + displayUnits: DisplayUnits, ) = with(node.environmentMetrics) { FlowRow( modifier = Modifier.fillMaxWidth(), @@ -799,7 +801,7 @@ private fun EnvironmentMetrics( InfoCard( icon = Icons.Default.Height, text = stringResource(R.string.distance), - value = "%.0f mm".format(distance) + value = distance.toSmallDistanceString(displayUnits) ) } if (hasLux()) { @@ -815,7 +817,7 @@ private fun EnvironmentMetrics( InfoCard( icon = Icons.Outlined.Navigation, text = stringResource(R.string.wind), - value = windSpeed.toSpeedString(), + value = windSpeed.toSpeedString(displayUnits), rotateIcon = normalizedBearing.toFloat(), ) } diff --git a/app/src/main/java/com/geeksville/mesh/util/DistanceExtensions.kt b/app/src/main/java/com/geeksville/mesh/util/DistanceExtensions.kt index 830e00cdf..2d2fe94da 100644 --- a/app/src/main/java/com/geeksville/mesh/util/DistanceExtensions.kt +++ b/app/src/main/java/com/geeksville/mesh/util/DistanceExtensions.kt @@ -91,7 +91,18 @@ fun Int.toDistanceString(system: DisplayUnits): String { } @Suppress("MagicNumber") -fun Float.toSpeedString() = when (DistanceUnit.getFromLocale()) { - DisplayUnits.METRIC -> "%.0f km/h".format(this * 3.6) - else -> "%.0f mph".format(this * 2.23694f) +fun Float.toSpeedString(system: DisplayUnits): String = + if (system == DisplayUnits.METRIC) { + "%.0f km/h".format(this * 3.6) + } else { + "%.0f mph".format(this * 2.23694f) + } + +@Suppress("MagicNumber") +fun Float.toSmallDistanceString(system: DisplayUnits): String { + return if (system == DisplayUnits.IMPERIAL) { + "%.2f in".format(this / 25.4f) + } else { + "%.0f mm".format(this) + } }