diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt
index 236c352e9..bad2680d9 100644
--- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt
+++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt
@@ -1242,7 +1242,7 @@ class MeshService : Service(), Logging {
MyNodeInfo(
myNodeNum,
hasGps,
- hwModel,
+ hwModelDeprecated,
firmwareVersion,
firmwareUpdateFilename != null,
isBluetoothInterface && SoftwareUpdateService.shouldUpdate(
@@ -1552,10 +1552,10 @@ class MeshService : Service(), Logging {
*/
private fun setFirmwareUpdateFilename(info: MeshProtos.MyNodeInfo) {
firmwareUpdateFilename = try {
- if (info.region != null && info.firmwareVersion != null && info.hwModel != null)
+ if (info.region != null && info.firmwareVersion != null && info.hwModelDeprecated != null)
SoftwareUpdateService.getUpdateFilename(
this,
- info.hwModel
+ info.hwModelDeprecated
)
else
null
diff --git a/app/src/main/java/com/geeksville/mesh/service/MockInterface.kt b/app/src/main/java/com/geeksville/mesh/service/MockInterface.kt
index 7c76458e5..a6786c13c 100644
--- a/app/src/main/java/com/geeksville/mesh/service/MockInterface.kt
+++ b/app/src/main/java/com/geeksville/mesh/service/MockInterface.kt
@@ -160,7 +160,7 @@ class MockInterface(private val service: RadioInterfaceService) : Logging, IRadi
MeshProtos.FromRadio.newBuilder().apply {
myInfo = MeshProtos.MyNodeInfo.newBuilder().apply {
myNodeNum = MY_NODE
- hwModel = "Sim"
+ hwModelDeprecated = "Sim"
messageTimeoutMsec = 5 * 60 * 1000
firmwareVersion = service.getString(R.string.cur_firmware_version)
numBands = 13
diff --git a/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt
index e4d6bd771..f40c78b3d 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt
@@ -13,6 +13,7 @@ import com.geeksville.android.Logging
import com.geeksville.mesh.NodeInfo
import com.geeksville.mesh.R
import com.geeksville.mesh.model.UIViewModel
+import com.geeksville.util.formatAgo
import com.mapbox.geojson.Feature
import com.mapbox.geojson.FeatureCollection
import com.mapbox.geojson.Point
@@ -79,7 +80,7 @@ class MapFragment : ScreenFragment("Map"), Logging {
)
)
node.user?.let {
- f.addStringProperty("name", it.longName)
+ f.addStringProperty("name", it.longName + " " + formatAgo(p.time))
}
f
}
@@ -93,7 +94,8 @@ class MapFragment : ScreenFragment("Map"), Logging {
}
fun zoomToNodes(map: MapboxMap) {
- val nodesWithPosition = model.nodeDB.nodes.value?.values?.filter { it.validPosition != null }
+ val nodesWithPosition =
+ model.nodeDB.nodes.value?.values?.filter { it.validPosition != null }
if (nodesWithPosition != null && nodesWithPosition.isNotEmpty()) {
val update = if (nodesWithPosition.size >= 2) {
// Multiple nodes, make them all fit on the map view
@@ -158,7 +160,10 @@ class MapFragment : ScreenFragment("Map"), Logging {
if (view != null) { // it might have gone away by now
// val markerIcon = BitmapFactory.decodeResource(context.resources, R.drawable.ic_twotone_person_pin_24)
val markerIcon =
- ContextCompat.getDrawable(requireActivity(), R.drawable.ic_twotone_person_pin_24)!!
+ ContextCompat.getDrawable(
+ requireActivity(),
+ R.drawable.ic_twotone_person_pin_24
+ )!!
map.setStyle(Style.OUTDOORS) { style ->
style.addSource(nodePositions)
@@ -176,7 +181,7 @@ class MapFragment : ScreenFragment("Map"), Logging {
// Any times nodes change update our map
model.nodeDB.nodes.observe(viewLifecycleOwner, Observer { nodes ->
- if(isViewVisible)
+ if (isViewVisible)
onNodesChanged(map, nodes.values)
})
zoomToNodes(map)
diff --git a/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt
index 0b6529679..66bc2c270 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/UsersFragment.kt
@@ -2,11 +2,13 @@ package com.geeksville.mesh.ui
import android.os.Bundle
-import android.text.format.DateFormat
+import android.text.Html
+import android.text.method.LinkMovementMethod
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
+import androidx.core.text.HtmlCompat
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
@@ -17,13 +19,14 @@ import com.geeksville.mesh.R
import com.geeksville.mesh.databinding.AdapterNodeLayoutBinding
import com.geeksville.mesh.databinding.NodelistFragmentBinding
import com.geeksville.mesh.model.UIViewModel
-import java.text.ParseException
-import java.util.*
+import com.geeksville.util.formatAgo
+import java.net.URLEncoder
class UsersFragment : ScreenFragment("Users"), Logging {
private var _binding: NodelistFragmentBinding? = null
+
// This property is only valid between onCreateView and onDestroyView.
private val binding get() = _binding!!
@@ -34,6 +37,7 @@ class UsersFragment : ScreenFragment("Users"), Logging {
class ViewHolder(itemView: AdapterNodeLayoutBinding) : RecyclerView.ViewHolder(itemView.root) {
val nodeNameView = itemView.nodeNameView
val distanceView = itemView.distanceView
+ val coordsView = itemView.coordsView
val batteryPctView = itemView.batteryPercentageView
val lastTime = itemView.lastConnectionView
val powerIcon = itemView.batteryIcon
@@ -104,8 +108,26 @@ class UsersFragment : ScreenFragment("Users"), Logging {
*/
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val n = nodes[position]
+ val name = n.user?.longName ?: n.user?.id ?: "Unknown node"
+ holder.nodeNameView.text = name
- holder.nodeNameView.text = n.user?.longName ?: n.user?.id ?: "Unknown node"
+ val pos = n.validPosition;
+ if (pos != null) {
+ val coords =
+ String.format("%.5f %.5f", pos.latitude, pos.longitude).replace(",", ".")
+ val html =
+ "${coords}"
+ holder.coordsView.text = HtmlCompat.fromHtml(html, Html.FROM_HTML_MODE_LEGACY)
+ holder.coordsView.movementMethod = LinkMovementMethod.getInstance()
+ holder.coordsView.visibility = View.VISIBLE
+ } else {
+ holder.coordsView.visibility = View.INVISIBLE
+ }
val ourNodeInfo = model.nodeDB.ourNodeInfo
val distance = ourNodeInfo?.distanceStr(n)
@@ -118,7 +140,7 @@ class UsersFragment : ScreenFragment("Users"), Logging {
renderBattery(n.batteryPctLevel, holder)
- holder.lastTime.text = getLastTimeValue(n)
+ holder.lastTime.text = formatAgo(n.lastSeen);
}
private var nodes = arrayOf()
@@ -150,30 +172,6 @@ class UsersFragment : ScreenFragment("Users"), Logging {
})
}
- private fun getLastTimeValue(n: NodeInfo): String {
- var lastTimeText = "?"
- val currentTime = (System.currentTimeMillis()/1000).toInt()
- val threeDaysLong = 3 * 60*60*24
-
- //if the lastSeen is too old
- if (n.lastSeen < (currentTime - threeDaysLong))
- return lastTimeText
-
- try {
- val toLong: Long = n.lastSeen.toLong()
- val long1000 = toLong * 1000L
- val date = Date(long1000)
- val timeFormat = DateFormat.getTimeFormat(context)
-
- lastTimeText = timeFormat.format(date)
-
- } catch (e: ParseException) {
- //
- }
- return lastTimeText
- }
-
-
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
diff --git a/app/src/main/proto b/app/src/main/proto
index 7c025b9a4..ac26ffdc7 160000
--- a/app/src/main/proto
+++ b/app/src/main/proto
@@ -1 +1 @@
-Subproject commit 7c025b9a4d54bb410ec17ee653122861b413f177
+Subproject commit ac26ffdc71dad5765124186df5ec38771a0e5240
diff --git a/app/src/main/res/layout/adapter_node_layout.xml b/app/src/main/res/layout/adapter_node_layout.xml
index 86d70f043..f5577aaac 100644
--- a/app/src/main/res/layout/adapter_node_layout.xml
+++ b/app/src/main/res/layout/adapter_node_layout.xml
@@ -51,6 +51,20 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView" />
+
+
Okay
You must set a region!
Region
+ 55.332244 34.442211
Save messages as csv...
diff --git a/design b/design
index a81074152..d0339f029 160000
--- a/design
+++ b/design
@@ -1 +1 @@
-Subproject commit a81074152157fa54b0d02ccbbd6a6357cc3cedcf
+Subproject commit d0339f0297c629f1bd6873b4abccfecb98443538
diff --git a/geeksville-androidlib b/geeksville-androidlib
index 99cf0da30..6da250358 160000
--- a/geeksville-androidlib
+++ b/geeksville-androidlib
@@ -1 +1 @@
-Subproject commit 99cf0da30fe41163a735ac291f3dd018a7d6295d
+Subproject commit 6da250358ed13e3c58fd4fa2a123b01b3826d4bf