diff --git a/app/src/main/java/com/geeksville/mesh/MainActivity.kt b/app/src/main/java/com/geeksville/mesh/MainActivity.kt
index bfa50f18e..669db59b7 100644
--- a/app/src/main/java/com/geeksville/mesh/MainActivity.kt
+++ b/app/src/main/java/com/geeksville/mesh/MainActivity.kt
@@ -548,7 +548,18 @@ class MainActivity : AppCompatActivity(), Logging,
model.radioConfig.value =
MeshProtos.RadioConfig.parseFrom(service.radioConfig)
- model.myNodeInfo.value = service.myNodeInfo
+ val info = service.myNodeInfo
+ model.myNodeInfo.value = info
+
+ val isOld = info.minAppVersion > BuildConfig.VERSION_CODE
+ if (isOld)
+ MaterialAlertDialogBuilder(this)
+ .setTitle(getString(R.string.app_too_old))
+ .setMessage(getString(R.string.must_update))
+ .setPositiveButton("Okay") { _, _ ->
+ info("User acknowledged app is old")
+ }
+ .show()
updateNodesFromDevice()
diff --git a/app/src/main/java/com/geeksville/mesh/MyNodeInfo.kt b/app/src/main/java/com/geeksville/mesh/MyNodeInfo.kt
index ef3d37ef7..e5a447b1c 100644
--- a/app/src/main/java/com/geeksville/mesh/MyNodeInfo.kt
+++ b/app/src/main/java/com/geeksville/mesh/MyNodeInfo.kt
@@ -17,7 +17,8 @@ data class MyNodeInfo(
val currentPacketId: Long,
val nodeNumBits: Int,
val packetIdBits: Int,
- val messageTimeoutMsec: Int
+ val messageTimeoutMsec: Int,
+ val minAppVersion: Int
) : Parcelable {
/** A human readable description of the software/hardware version */
val firmwareString: String get() = "$model $region/$firmwareVersion"
@@ -33,6 +34,7 @@ data class MyNodeInfo(
parcel.readLong(),
parcel.readInt(),
parcel.readInt(),
+ parcel.readInt(),
parcel.readInt()
) {
}
@@ -49,6 +51,7 @@ data class MyNodeInfo(
parcel.writeInt(nodeNumBits)
parcel.writeInt(packetIdBits)
parcel.writeInt(messageTimeoutMsec)
+ parcel.writeInt(minAppVersion)
}
override fun describeContents(): Int {
diff --git a/app/src/main/java/com/geeksville/mesh/model/MessagesState.kt b/app/src/main/java/com/geeksville/mesh/model/MessagesState.kt
index f35f8c2fd..cdb4c353b 100644
--- a/app/src/main/java/com/geeksville/mesh/model/MessagesState.kt
+++ b/app/src/main/java/com/geeksville/mesh/model/MessagesState.kt
@@ -5,9 +5,7 @@ import androidx.lifecycle.MutableLiveData
import com.geeksville.android.BuildUtils.isEmulator
import com.geeksville.android.Logging
import com.geeksville.mesh.DataPacket
-import com.geeksville.mesh.MeshProtos
import com.geeksville.mesh.MessageStatus
-import com.geeksville.mesh.utf8
class MessagesState(private val ui: UIViewModel) : Logging {
@@ -31,12 +29,14 @@ class MessagesState(private val ui: UIViewModel) : Logging {
/// add a message our GUI list of past msgs
fun addMessage(m: DataPacket) {
+ debug("Adding message to view id=${m.id}")
// FIXME - don't just slam in a new list each time, it probably causes extra drawing.
messages.value = messages.value!! + m
}
fun updateStatus(id: Int, status: MessageStatus) {
// Super inefficent but this is rare
+ debug("Handling message status change $id: $status")
val msgs = messages.value!!
msgs.find { it.id == id }?.let { p ->
@@ -55,11 +55,8 @@ class MessagesState(private val ui: UIViewModel) : Logging {
fun sendMessage(str: String, dest: String = DataPacket.ID_BROADCAST) {
val service = ui.meshService
- val p = DataPacket(
- dest,
- str.toByteArray(utf8),
- MeshProtos.Data.Type.CLEAR_TEXT_VALUE
- )
+ val p = DataPacket(dest, str)
+
if (service != null)
try {
service.send(p)
@@ -69,6 +66,7 @@ class MessagesState(private val ui: UIViewModel) : Logging {
else
p.errorMessage = "Error: No Mesh service"
+ // FIXME - why is the first time we are called p is already in the list at this point?
addMessage(p)
}
}
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 d62e6d30f..6ee667a09 100644
--- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt
+++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt
@@ -1228,7 +1228,8 @@ class MeshService : Service(), Logging {
currentPacketId.toLong() and 0xffffffffL,
if (nodeNumBits == 0) 8 else nodeNumBits,
if (packetIdBits == 0) 8 else packetIdBits,
- if (messageTimeoutMsec == 0) 5 * 60 * 1000 else messageTimeoutMsec // constants from current device code
+ if (messageTimeoutMsec == 0) 5 * 60 * 1000 else messageTimeoutMsec, // constants from current device code
+ minAppVersion
)
}
@@ -1543,8 +1544,6 @@ class MeshService : Service(), Logging {
"num_data_sent",
DataPair(1)
)
-
- connectionState == ConnectionState.CONNECTED
}
}
diff --git a/app/src/main/proto b/app/src/main/proto
index e9c7f9b95..9d083d5d4 160000
--- a/app/src/main/proto
+++ b/app/src/main/proto
@@ -1 +1 @@
-Subproject commit e9c7f9b95d490aea3f0f213d4666d2dbf7e2111c
+Subproject commit 9d083d5d4ff4ef095135b18468004eaba77cb691
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 0976c025a..900780f9d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -59,4 +59,6 @@
Not connected, select radio below
Connected to radio, but it is sleeping
Update to %s
+ Application too old
+ You must update this application on the Google Play store (or Github). It is too old to talk to this radio.
diff --git a/geeksville-androidlib b/geeksville-androidlib
index a7b2f9534..62172dbfa 160000
--- a/geeksville-androidlib
+++ b/geeksville-androidlib
@@ -1 +1 @@
-Subproject commit a7b2f95341876ae96525c9cd38fa2fa0cc833351
+Subproject commit 62172dbfa2d85a389f6edaea6b416663e8bf4d2c
diff --git a/images/app-too-old.png b/images/app-too-old.png
new file mode 100644
index 000000000..92f98b778
Binary files /dev/null and b/images/app-too-old.png differ