diff --git a/app/src/main/java/com/geeksville/mesh/NodeInfo.kt b/app/src/main/java/com/geeksville/mesh/NodeInfo.kt index 55ea51f75..e7e03b658 100644 --- a/app/src/main/java/com/geeksville/mesh/NodeInfo.kt +++ b/app/src/main/java/com/geeksville/mesh/NodeInfo.kt @@ -2,6 +2,8 @@ package com.geeksville.mesh import android.os.Parcel import android.os.Parcelable +import com.geeksville.mesh.ui.bearing +import com.geeksville.mesh.ui.latLongToMeter // model objects that directly map to the corresponding protobufs @@ -44,6 +46,12 @@ data class Position(val latitude: Double, val longitude: Double, val altitude: I ) { } + /// @return distance in meters to some other node (or null if unknown) + fun distance(o: Position) = latLongToMeter(latitude, longitude, o.latitude, o.longitude) + + /// @return bearing to the other position in degrees + fun bearing(o: Position) = bearing(latitude, longitude, o.latitude, o.longitude) + override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeDouble(latitude) parcel.writeDouble(longitude) @@ -80,6 +88,24 @@ data class NodeInfo( ) { } + /// @return distance in meters to some other node (or null if unknown) + fun distance(o: NodeInfo?): Double? { + val p = position + val op = o?.position + return if (p != null && op != null) + p.distance(op) + else + null + } + + /// @return a nice human readable string for the distance, or null for unknown + fun distanceStr(o: NodeInfo?) = distance(o)?.let { dist -> + if (dist < 1000) + "%.0f m".format(dist) + else + "%.1f km".format(dist / 1000) + } + override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeInt(num) parcel.writeParcelable(user, flags) diff --git a/app/src/main/java/com/geeksville/mesh/ui/LocationUtils.kt b/app/src/main/java/com/geeksville/mesh/ui/LocationUtils.kt index fbb29944e..10df4cacc 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/LocationUtils.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/LocationUtils.kt @@ -96,7 +96,10 @@ fun addDistance( return doubleArrayOf(lat + dLat, longitude + dLong) } -fun LatLongToMeter( +/** + * @return distance in meters along the surface of the earth (ish) + */ +fun latLongToMeter( lat_a: Double, lng_a: Double, lat_b: Double, diff --git a/app/src/main/java/com/geeksville/mesh/ui/Messages.kt b/app/src/main/java/com/geeksville/mesh/ui/Messages.kt index c6a079ae5..5e885f207 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/Messages.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/Messages.kt @@ -36,7 +36,7 @@ val TimestampEmphasis = object : Emphasis { @Composable fun MessageCard(msg: TextMessage, modifier: Modifier = Modifier.None) { Row(modifier = modifier) { - UserIcon(null) + UserIcon(NodeDB.nodes.value[msg.from]) Column(modifier = LayoutPadding(left = 12.dp)) { Row { diff --git a/app/src/main/java/com/geeksville/mesh/ui/UserIcon.kt b/app/src/main/java/com/geeksville/mesh/ui/UserIcon.kt index 8016b84fd..e40622ce3 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/UserIcon.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/UserIcon.kt @@ -9,6 +9,7 @@ import androidx.ui.material.MaterialTheme import androidx.ui.tooling.preview.Preview import com.geeksville.mesh.NodeInfo import com.geeksville.mesh.R +import com.geeksville.mesh.model.NodeDB /** * Show the user icon for a particular user with distance from the operator and a small pointer @@ -22,7 +23,10 @@ fun UserIcon(user: NodeInfo? = null, modifier: Modifier = Modifier.None) { tint = palette.onSecondary, modifier = LayoutGravity.Center ) - Text("1.2 km", modifier = LayoutGravity.Center) + val ourNodeInfo = NodeDB.ourNodeInfo + val distance = ourNodeInfo.distanceStr(user) + if (distance != null) + Text(distance, modifier = LayoutGravity.Center) } } @@ -31,6 +35,6 @@ fun UserIcon(user: NodeInfo? = null, modifier: Modifier = Modifier.None) { fun previewUserIcon() { // another bug? It seems modaldrawerlayout not yet supported in preview MaterialTheme(colors = palette) { - UserIcon() + UserIcon(NodeDB.testNodes[1]) } }