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