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