From 81a12831484ff5a6f77414ccd4f4f66d56861ff9 Mon Sep 17 00:00:00 2001 From: geeksville Date: Mon, 30 Mar 2020 16:44:48 -0700 Subject: [PATCH] Android can cache BLE service descriptors. But our device descriptors can change still (because 'progress'). So force android to reread those descriptors while we are in alpha. --- .../mesh/service/RadioInterfaceService.kt | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/service/RadioInterfaceService.kt b/app/src/main/java/com/geeksville/mesh/service/RadioInterfaceService.kt index 976b846f4..6a3f4ea46 100644 --- a/app/src/main/java/com/geeksville/mesh/service/RadioInterfaceService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/RadioInterfaceService.kt @@ -13,7 +13,9 @@ import com.geeksville.android.GeeksvilleApplication import com.geeksville.android.Logging import com.geeksville.concurrent.DeferredExecution import com.geeksville.mesh.IRadioInterfaceService +import com.geeksville.util.exceptionReporter import com.geeksville.util.toRemoteExceptions +import java.lang.reflect.Method import java.util.* @@ -268,12 +270,27 @@ class RadioInterfaceService : Service(), Logging { isConnected = false } + /** + * Android caches old services. But our service is still changing often, so force it to reread the service definitions every + * time + */ + private fun forceServiceRefresh() { + exceptionReporter { + // BluetoothGatt gatt + val gatt = safe!!.gatt!! + val refresh: Method = gatt.javaClass.getMethod("refresh") + refresh.invoke(gatt) + } + } + private fun onConnect(connRes: Result) { // This callback is invoked after we are connected connRes.getOrThrow() // FIXME, instead just try to reconnect? info("Connected to radio!") + forceServiceRefresh() + // FIXME - no need to discover services more than once - instead use lazy() to use them in future attempts safe!!.asyncDiscoverServices { discRes -> discRes.getOrThrow() // FIXME, instead just try to reconnect? @@ -434,13 +451,16 @@ class RadioInterfaceService : Service(), Logging { // A write of any size to nodeinfo means restart reading override fun restartNodeInfo() = doWrite(BTM_NODEINFO_CHARACTER, ByteArray(0)) - override fun readMyNode() = doRead(BTM_MYNODE_CHARACTER)!! + override fun readMyNode() = + doRead(BTM_MYNODE_CHARACTER) ?: throw Exception("Device returned empty MyNodeInfo") override fun sendToRadio(a: ByteArray) = handleSendToRadio(a) - override fun readRadioConfig() = doRead(BTM_RADIO_CHARACTER)!! + override fun readRadioConfig() = + doRead(BTM_RADIO_CHARACTER) ?: throw Exception("Device returned empty RadioConfig") - override fun readOwner() = doRead(BTM_OWNER_CHARACTER)!! + override fun readOwner() = + doRead(BTM_OWNER_CHARACTER) ?: throw Exception("Device returned empty Owner") override fun writeOwner(owner: ByteArray) = doWrite(BTM_OWNER_CHARACTER, owner)