From 69f2e8c839a833d16f5db814f2603f04982c36b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Kosson?= Date: Sun, 15 Jun 2025 12:50:58 +0200 Subject: [PATCH] feat: show distance to the node on node details screen (#2122) --- .../com/geeksville/mesh/ui/node/NodeDetail.kt | 26 +++++++++++++++++-- app/src/main/res/values/strings.xml | 1 + 2 files changed, 25 insertions(+), 2 deletions(-) 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 15c98fcbc..81cee6d66 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 @@ -61,6 +61,7 @@ import androidx.compose.material.icons.filled.Scale import androidx.compose.material.icons.filled.Settings import androidx.compose.material.icons.filled.Share import androidx.compose.material.icons.filled.SignalCellularAlt +import androidx.compose.material.icons.filled.SocialDistance import androidx.compose.material.icons.filled.Speed import androidx.compose.material.icons.filled.Star import androidx.compose.material.icons.filled.StarBorder @@ -111,6 +112,7 @@ import coil3.compose.AsyncImage import coil3.request.ErrorResult import coil3.request.ImageRequest import coil3.request.SuccessResult +import com.geeksville.mesh.ConfigProtos.Config.DisplayConfig.DisplayUnits import com.geeksville.mesh.DataPacket import com.geeksville.mesh.R import com.geeksville.mesh.android.BuildUtils.debug @@ -141,6 +143,7 @@ import com.geeksville.mesh.util.UnitConversions.toTempString 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.toSpeedString import kotlinx.coroutines.delay import kotlin.time.Duration @@ -210,6 +213,7 @@ fun NodeDetailScreen( } NodeDetailList( node = node, + ourNode = uiViewModel.ourNodeInfo.value, metricsState = state, onAction = { action -> when (action) { @@ -251,6 +255,7 @@ fun NodeDetailScreen( private fun NodeDetailList( modifier: Modifier = Modifier, node: Node, + ourNode: Node?, metricsState: MetricsState, onAction: (Any) -> Unit = {}, metricsAvailability: BooleanArray, @@ -268,7 +273,7 @@ private fun NodeDetailList( } } PreferenceCategory(stringResource(R.string.details)) { - NodeDetailsContent(node) + NodeDetailsContent(node, ourNode, metricsState.displayUnits) } DeviceActions( @@ -577,6 +582,8 @@ fun DeviceHardwareImage( @Composable private fun NodeDetailsContent( node: Node, + ourNode: Node?, + displayUnits: DisplayUnits, ) { if (node.mismatchKey) { Row(verticalAlignment = Alignment.CenterVertically) { @@ -649,6 +656,19 @@ private fun NodeDetailsContent( icon = Icons.Default.History, value = formatAgo(node.lastHeard) ) + val distance = ourNode?.distance(node)?.toDistanceString(displayUnits) + if (node != ourNode && distance != null) { + NodeDetailRow( + label = stringResource(R.string.node_sort_distance), + icon = Icons.Default.SocialDistance, + value = distance + ) + NodeDetailRow( + label = stringResource(R.string.last_position_update), + icon = Icons.Default.LocationOn, + value = formatAgo(node.position.time) + ) + } } @Composable @@ -989,11 +1009,13 @@ fun NodeActionSwitch( @Composable private fun NodeDetailsPreview( @PreviewParameter(NodePreviewParameterProvider::class) - node: Node + node: Node, + ourNode: Node, ) { AppTheme { NodeDetailList( node = node, + ourNode = ourNode, metricsState = MetricsState.Empty, metricsAvailability = BooleanArray(LogsType.entries.size) { false }, ) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7ccc0c88d..b5b574690 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -314,6 +314,7 @@ Device Metrics Log Node Map Position Log + Last position update Environment Metrics Log Signal Metrics Log Administration