diff --git a/src/com/android/settings/accessibility/AvailableHearingDeviceUpdater.java b/src/com/android/settings/accessibility/AvailableHearingDeviceUpdater.java index b3d371528f6..f600b038ddc 100644 --- a/src/com/android/settings/accessibility/AvailableHearingDeviceUpdater.java +++ b/src/com/android/settings/accessibility/AvailableHearingDeviceUpdater.java @@ -16,7 +16,6 @@ package com.android.settings.accessibility; -import android.bluetooth.BluetoothDevice; import android.content.Context; import com.android.settings.bluetooth.AvailableMediaBluetoothDeviceUpdater; @@ -37,11 +36,9 @@ public class AvailableHearingDeviceUpdater extends AvailableMediaBluetoothDevice @Override public boolean isFilterMatched(CachedBluetoothDevice cachedDevice) { - final BluetoothDevice device = cachedDevice.getDevice(); - final boolean isConnectedHearingAidDevice = (cachedDevice.isConnectedHearingAidDevice() - && (device.getBondState() == BluetoothDevice.BOND_BONDED)); - - return isConnectedHearingAidDevice && isDeviceInCachedDevicesList(cachedDevice); + return cachedDevice.isHearingAidDevice() + && isDeviceConnected(cachedDevice) + && isDeviceInCachedDevicesList(cachedDevice); } @Override diff --git a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.kt b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.kt index 42c24ea2140..f18ae46e18b 100644 --- a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.kt +++ b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.kt @@ -191,10 +191,11 @@ abstract class DeviceListPreferenceFragment(restrictedKey: String?) : private suspend fun addDevice(cachedDevice: CachedBluetoothDevice) = withContext(Dispatchers.Default) { + // TODO(b/289189853): Replace checking if `filter` is null or not to decide which type + // of Bluetooth scanning method will be used + val filterMatched = filter == null || filter!!.matches(cachedDevice.device) == true // Prevent updates while the list shows one of the state messages - if (mBluetoothAdapter!!.state == BluetoothAdapter.STATE_ON && - filter?.matches(cachedDevice.device) == true - ) { + if (mBluetoothAdapter!!.state == BluetoothAdapter.STATE_ON && filterMatched) { createDevicePreference(cachedDevice) } } @@ -304,17 +305,14 @@ abstract class DeviceListPreferenceFragment(restrictedKey: String?) : } } - private val scanCallback = object : ScanCallback() { + private val leScanCallback = object : ScanCallback() { override fun onScanResult(callbackType: Int, result: ScanResult) { - lifecycleScope?.launch { - withContext(Dispatchers.Default) { - if (mBluetoothAdapter!!.state == BluetoothAdapter.STATE_ON) { - val device = result.device - val cachedDevice = mCachedDeviceManager!!.findDevice(device) - ?: mCachedDeviceManager!!.addDevice(device) - createDevicePreference(cachedDevice) - } - } + handleLeScanResult(result) + } + + override fun onBatchScanResults(results: MutableList?) { + for (result in results.orEmpty()) { + handleLeScanResult(result) } } @@ -328,12 +326,23 @@ abstract class DeviceListPreferenceFragment(restrictedKey: String?) : val settings = ScanSettings.Builder() .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) .build() - scanner.startScan(leScanFilters, settings, scanCallback) + scanner.startScan(leScanFilters, settings, leScanCallback) } private fun stopLeScanning() { val scanner = mBluetoothAdapter!!.bluetoothLeScanner - scanner?.stopScan(scanCallback) + scanner?.stopScan(leScanCallback) + } + + private fun handleLeScanResult(result: ScanResult) { + lifecycleScope?.launch { + withContext(Dispatchers.Default) { + val device = result.device + val cachedDevice = mCachedDeviceManager!!.findDevice(device) + ?: mCachedDeviceManager!!.addDevice(device, leScanFilters) + addDevice(cachedDevice) + } + } } companion object { diff --git a/tests/robotests/src/com/android/settings/accessibility/AvailableHearingDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/accessibility/AvailableHearingDeviceUpdaterTest.java index 6305014a6e3..0aab5bba7be 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AvailableHearingDeviceUpdaterTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AvailableHearingDeviceUpdaterTest.java @@ -18,7 +18,6 @@ package com.android.settings.accessibility; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.when; import android.bluetooth.BluetoothDevice; @@ -80,8 +79,9 @@ public class AvailableHearingDeviceUpdaterTest { @Test public void isFilterMatch_connectedHearingDevice_returnTrue() { CachedBluetoothDevice connectedHearingDevice = mCachedBluetoothDevice; - when(connectedHearingDevice.isConnectedHearingAidDevice()).thenReturn(true); - doReturn(BluetoothDevice.BOND_BONDED).when(mBluetoothDevice).getBondState(); + when(connectedHearingDevice.isHearingAidDevice()).thenReturn(true); + when(mBluetoothDevice.isConnected()).thenReturn(true); + when(mBluetoothDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn( new ArrayList<>(List.of(connectedHearingDevice))); @@ -91,8 +91,9 @@ public class AvailableHearingDeviceUpdaterTest { @Test public void isFilterMatch_nonConnectedHearingDevice_returnFalse() { CachedBluetoothDevice nonConnectedHearingDevice = mCachedBluetoothDevice; - when(nonConnectedHearingDevice.isConnectedHearingAidDevice()).thenReturn(false); - doReturn(BluetoothDevice.BOND_BONDED).when(mBluetoothDevice).getBondState(); + when(nonConnectedHearingDevice.isHearingAidDevice()).thenReturn(true); + when(mBluetoothDevice.isConnected()).thenReturn(false); + when(mBluetoothDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn( new ArrayList<>(List.of(nonConnectedHearingDevice))); @@ -103,7 +104,8 @@ public class AvailableHearingDeviceUpdaterTest { public void isFilterMatch_connectedBondingHearingDevice_returnFalse() { CachedBluetoothDevice connectedBondingHearingDevice = mCachedBluetoothDevice; when(connectedBondingHearingDevice.isHearingAidDevice()).thenReturn(true); - doReturn(BluetoothDevice.BOND_BONDING).when(mBluetoothDevice).getBondState(); + when(mBluetoothDevice.isConnected()).thenReturn(true); + when(mBluetoothDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDING); when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn( new ArrayList<>(List.of(connectedBondingHearingDevice))); @@ -114,8 +116,8 @@ public class AvailableHearingDeviceUpdaterTest { public void isFilterMatch_hearingDeviceNotInCachedDevicesList_returnFalse() { CachedBluetoothDevice notInCachedDevicesListDevice = mCachedBluetoothDevice; when(notInCachedDevicesListDevice.isHearingAidDevice()).thenReturn(true); - doReturn(BluetoothDevice.BOND_BONDED).when(mBluetoothDevice).getBondState(); - doReturn(false).when(mBluetoothDevice).isConnected(); + when(mBluetoothDevice.isConnected()).thenReturn(true); + when(mBluetoothDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(new ArrayList<>()); assertThat(mUpdater.isFilterMatched(notInCachedDevicesListDevice)).isEqualTo(false);