From 8d04a71fc4f0ccb4075ded4517450126d56aac11 Mon Sep 17 00:00:00 2001 From: Vadim Furman Date: Tue, 2 Feb 2021 18:39:41 -0800 Subject: [PATCH 1/2] Fix radio button enabled/disabled state to match device connected/not-connected state --- .../geeksville/mesh/ui/SettingsFragment.kt | 102 ++++++++++-------- 1 file changed, 55 insertions(+), 47 deletions(-) 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 78f772151..bfb7f82f2 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -660,6 +660,55 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { binding.scanProgressBar.visibility = visible binding.deviceRadioGroup.visibility = visible } + private fun updateDevicesButtons( devices: MutableMap?) { + // Remove the old radio buttons and repopulate + binding.deviceRadioGroup.removeAllViews() + + if(devices == null) return + + val adapter = scanModel.bluetoothAdapter + var hasShownOurDevice = false + devices.values.forEach { device -> + if (device.address == scanModel.selectedNotNull) + hasShownOurDevice = true + addDeviceButton(device, true) + } + + // The device the user is already paired with is offline currently, still show it + // it in the list, but greyed out + if (!hasShownOurDevice) { + // Note: we pull this into a tempvar, because otherwise some other thread can change selectedAddress after our null check + // and before use + val bleAddr = scanModel.selectedBluetooth + + if (bleAddr != null && adapter != null && adapter.isEnabled) { + val bDevice = + adapter.getRemoteDevice(bleAddr) + 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, + scanModel.selectedAddress!!, + bDevice.bondState == BOND_BONDED + ) + addDeviceButton(curDevice, model.isConnected.value == MeshService.ConnectionState.CONNECTED) + } + } else if (scanModel.selectedUSB != null) { + // Must be a USB device, show a placeholder disabled entry + val curDevice = BTScanModel.DeviceListEntry( + scanModel.selectedUSB!!, + scanModel.selectedAddress!!, + false + ) + addDeviceButton(curDevice, false) + } + } + + val hasBonded = + RadioInterfaceService.getBondedDeviceAddress(requireContext()) != null + + // get rid of the warning text once at least one device is paired + binding.warningNotPaired.visibility = if (hasBonded) View.GONE else View.VISIBLE + } /// Setup the GUI to do a classic (pre SDK 26 BLE scan) private fun initClassicScan() { @@ -681,54 +730,13 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { } }) - scanModel.devices.observe(viewLifecycleOwner, Observer { devices -> - // Remove the old radio buttons and repopulate - binding.deviceRadioGroup.removeAllViews() + scanModel.devices.observe( + viewLifecycleOwner, + Observer { devices -> updateDevicesButtons(devices) }) - val adapter = scanModel.bluetoothAdapter - - var hasShownOurDevice = false - devices.values.forEach { device -> - if (device.address == scanModel.selectedNotNull) - hasShownOurDevice = true - addDeviceButton(device, true) - } - - // The device the user is already paired with is offline currently, still show it - // it in the list, but greyed out - if (!hasShownOurDevice) { - // Note: we pull this into a tempvar, because otherwise some other thread can change selectedAddress after our null check - // and before use - val bleAddr = scanModel.selectedBluetooth - - if (bleAddr != null && adapter != null && adapter.isEnabled) { - val bDevice = - adapter.getRemoteDevice(bleAddr) - 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, - scanModel.selectedAddress!!, - bDevice.bondState == BOND_BONDED - ) - addDeviceButton(curDevice, false) - } - } else if (scanModel.selectedUSB != null) { - // Must be a USB device, show a placeholder disabled entry - val curDevice = BTScanModel.DeviceListEntry( - scanModel.selectedUSB!!, - scanModel.selectedAddress!!, - false - ) - addDeviceButton(curDevice, false) - } - } - - val hasBonded = - RadioInterfaceService.getBondedDeviceAddress(requireContext()) != null - - // get rid of the warning text once at least one device is paired - binding.warningNotPaired.visibility = if (hasBonded) View.GONE else View.VISIBLE - }) + model.isConnected.observe( + viewLifecycleOwner, + { updateDevicesButtons(scanModel.devices.value) }) } /// Start running the modern scan, once it has one result we enable the From ac8fd1344d955953e56e0f46126c696e2f2af4c3 Mon Sep 17 00:00:00 2001 From: Vadim Furman Date: Tue, 2 Feb 2021 19:01:11 -0800 Subject: [PATCH 2/2] Updated comment --- app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 bfb7f82f2..fdf4ce85c 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -674,8 +674,9 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { addDeviceButton(device, true) } - // The device the user is already paired with is offline currently, still show it - // it in the list, but greyed out + // The selected device is not in the scan; it is either offline, or it doesn't advertise + // itself (most BLE devices don't advertise when connected). + // Show it in the list, greyed out based on connection status. if (!hasShownOurDevice) { // Note: we pull this into a tempvar, because otherwise some other thread can change selectedAddress after our null check // and before use