feat: show distance to the node on node details screen (#2122)

This commit is contained in:
Łukasz Kosson 2025-06-15 12:50:58 +02:00 committed by GitHub
parent 446ddab469
commit 69f2e8c839
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 25 additions and 2 deletions

View file

@ -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 },
)

View file

@ -314,6 +314,7 @@
<string name="device_metrics_log">Device Metrics Log</string>
<string name="node_map">Node Map</string>
<string name="position_log">Position Log</string>
<string name="last_position_update">Last position update</string>
<string name="env_metrics_log">Environment Metrics Log</string>
<string name="sig_metrics_log">Signal Metrics Log</string>
<string name="administration">Administration</string>