From 6a71e6c4140e70d1c43c4f0f34c6a82d4c54cb1a Mon Sep 17 00:00:00 2001 From: geeksville Date: Sun, 7 Jun 2020 20:17:47 -0700 Subject: [PATCH] 0.7.0 my robotester script found a bug in my previous change! properly map bluetooth addresses to the new transport independent address --- app/build.gradle | 4 +-- .../java/com/geeksville/mesh/MainActivity.kt | 2 +- .../geeksville/mesh/service/MeshService.kt | 29 ++++++++++--------- .../mesh/service/RadioInterfaceService.kt | 5 +++- .../geeksville/mesh/ui/SettingsFragment.kt | 11 ++++--- 5 files changed, 28 insertions(+), 23 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 5f00ad815..6c2b2a8b2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,8 +17,8 @@ android { applicationId "com.geeksville.mesh" minSdkVersion 22 // The oldest emulator image I have tried is 22 (though 21 probably works) targetSdkVersion 29 - versionCode 169 - versionName "0.6.9" + versionCode 170 + versionName "0.7.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { diff --git a/app/src/main/java/com/geeksville/mesh/MainActivity.kt b/app/src/main/java/com/geeksville/mesh/MainActivity.kt index f2aaf1ce6..823fad2e5 100644 --- a/app/src/main/java/com/geeksville/mesh/MainActivity.kt +++ b/app/src/main/java/com/geeksville/mesh/MainActivity.kt @@ -470,7 +470,7 @@ class MainActivity : AppCompatActivity(), Logging, // ... Continue interacting with the paired device. model.meshService?.let { service -> - service.setDeviceAddress(device.address) + MeshService.changeDeviceAddress(this@MainActivity, service, device.address) } } 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 2e8ceeb4a..0aaf4cb84 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -80,6 +80,15 @@ class MeshService : Service(), Logging { } } + /** + * Talk to our running service and try to set a new device address. And then immediately + * call start on the service to possibly promote our service to be a foreground service. + */ + fun changeDeviceAddress(context: Context, service: IMeshService, address: String?) { + service.setDeviceAddress(address) + startService(context) + } + /** * Just after boot the android OS is super busy, so if we call startForegroundService then, our * thread might be stalled long enough to expose this google/samsung bug: @@ -87,19 +96,14 @@ class MeshService : Service(), Logging { */ fun startLater(context: Context) { // No point in even starting the service if the user doesn't have a device bonded + info("Received boot complete announcement, starting mesh service in one minute") + val delayRequest = OneTimeWorkRequestBuilder() + .setInitialDelay(1, TimeUnit.MINUTES) + .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.MINUTES) + .addTag("startLater") + .build() - if (RadioInterfaceService.getBondedDeviceAddress(context) != null) { - info("Received boot complete announcement, starting mesh service in one minute") - val delayRequest = OneTimeWorkRequestBuilder() - .setInitialDelay(1, TimeUnit.MINUTES) - .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 1, TimeUnit.MINUTES) - .addTag("startLater") - .build() - - WorkManager.getInstance(context).enqueue(delayRequest) - } else { - debug("Booted: but not starting mesh service - we are unbonded") - } + WorkManager.getInstance(context).enqueue(delayRequest) } val intent = Intent().apply { @@ -1458,7 +1462,6 @@ class MeshService : Service(), Logging { debug("Passing through device change to radio service: $deviceAddr") discardNodeDB() radio.service.setDeviceAddress(deviceAddr) - startForeground() // We might need to become foreground or background at this point } // Note: bound methods don't get properly exception caught/logged, so do that with a wrapper 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 c80cc1b76..a837bd4ab 100644 --- a/app/src/main/java/com/geeksville/mesh/service/RadioInterfaceService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/RadioInterfaceService.kt @@ -190,7 +190,10 @@ class RadioInterfaceService : Service(), Logging { 'x' -> BluetoothInterface(this, rest) 's' -> SerialInterface(this, rest) 'n' -> nopIf - else -> TODO("Unexpected radio interface type") + else -> { + errormsg("Unexpected radio interface type") + nopIf + } } } } diff --git a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt index 038c3163a..ab3014b74 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -48,7 +48,7 @@ object SLogging : Logging {} fun changeDeviceSelection(context: MainActivity, newAddr: String?) { // FIXME, this is a kinda yucky way to find the service context.model.meshService?.let { service -> - service.setDeviceAddress(newAddr) + MeshService.changeDeviceAddress(context, service, newAddr) } } @@ -165,7 +165,7 @@ class BTScanModel(app: Application) : AndroidViewModel(app), Logging { if (selectedAddress == null && entry.bonded) changeScanSelection( GeeksvilleApplication.currentActivity as MainActivity, - addr + fullAddr ) addDevice(entry) // Add/replace entry } @@ -287,7 +287,7 @@ class BTScanModel(app: Application) : AndroidViewModel(app), Logging { errorText.value = activity.getString(R.string.pairing_completed) changeScanSelection( activity, - device.address + it.address ) } else { errorText.value = activity.getString(R.string.pairing_failed_try_again) @@ -514,14 +514,13 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { // The device the user is already paired with is offline currently, still show it // it in the list, but greyed out - val selectedAddr = scanModel.selectedAddress - if (!hasShownOurDevice && selectedAddr != null) { + if (!hasShownOurDevice && scanModel.selectedBluetooth != null) { val bDevice = scanModel.bluetoothAdapter!!.getRemoteDevice(scanModel.selectedBluetooth) if (bDevice.name != null) { // ignore nodes that node have a name, that means we've lost them since they appeared val curDevice = BTScanModel.DeviceListEntry( bDevice.name, - selectedAddr, + scanModel.selectedAddress!!, bDevice.bondState == BOND_BONDED ) addDeviceButton(curDevice, false)