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/accessibility/HearingDevicePairingDetail.java b/src/com/android/settings/accessibility/HearingDevicePairingDetail.java index de86dcf6909..117a8ed131b 100644 --- a/src/com/android/settings/accessibility/HearingDevicePairingDetail.java +++ b/src/com/android/settings/accessibility/HearingDevicePairingDetail.java @@ -28,7 +28,8 @@ import com.android.settings.R; import com.android.settings.bluetooth.BluetoothDevicePairingDetailBase; import com.android.settingslib.bluetooth.CachedBluetoothDevice; -import java.util.Collections; +import java.util.ArrayList; +import java.util.List; /** * HearingDevicePairingDetail is a page to scan hearing devices. This page shows scanning icons and @@ -42,10 +43,16 @@ public class HearingDevicePairingDetail extends BluetoothDevicePairingDetailBase public HearingDevicePairingDetail() { super(); - final ScanFilter filter = new ScanFilter.Builder() - .setServiceData(BluetoothUuid.HEARING_AID, new byte[]{0}, new byte[]{0}) - .build(); - setFilter(Collections.singletonList(filter)); + final List filterList = new ArrayList<>(); + // Filters for ASHA hearing aids + filterList.add(new ScanFilter.Builder().setServiceUuid(BluetoothUuid.HEARING_AID).build()); + filterList.add(new ScanFilter.Builder() + .setServiceData(BluetoothUuid.HEARING_AID, new byte[0]).build()); + // Filters for LE audio hearing aids + filterList.add(new ScanFilter.Builder().setServiceUuid(BluetoothUuid.HAS).build()); + filterList.add(new ScanFilter.Builder() + .setServiceData(BluetoothUuid.HAS, new byte[0]).build()); + setFilter(filterList); } @Override diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java index 2a350f4abd5..46f534df364 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java @@ -236,6 +236,9 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase protected void onResume() { super.onResume(); + //reset mNextClick to make sure introduction page would be closed correctly + mNextClicked = false; + final int errorMsg = checkMaxEnrolled(); if (errorMsg == 0) { mErrorText.setText(null); 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); diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java index 69f10d629dd..3eba91c854f 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroductionTest.java @@ -85,6 +85,7 @@ public class FingerprintEnrollIntroductionTest { private Context mContext; private TestFingerprintEnrollIntroduction mFingerprintEnrollIntroduction; + private ActivityController mController; private static final int MAX_ENROLLMENTS = 5; private static final byte[] EXPECTED_TOKEN = new byte[] { 10, 20, 30, 40 }; @@ -121,9 +122,8 @@ public class FingerprintEnrollIntroductionTest { void setupFingerprintEnrollIntroWith(@NonNull Intent intent) { - final ActivityController controller = - Robolectric.buildActivity(TestFingerprintEnrollIntroduction.class, intent); - mFingerprintEnrollIntroduction = controller.get(); + mController = Robolectric.buildActivity(TestFingerprintEnrollIntroduction.class, intent); + mFingerprintEnrollIntroduction = mController.get(); mFingerprintEnrollIntroduction.mMockedFingerprintManager = mFingerprintManager; mFingerprintEnrollIntroduction.mMockedGatekeeperPasswordProvider = mGatekeeperPasswordProvider; @@ -137,7 +137,7 @@ public class FingerprintEnrollIntroductionTest { when(mLockPatternUtils.getActivePasswordQuality(userId)) .thenReturn(PASSWORD_QUALITY_SOMETHING); - controller.create(); + mController.create(); } void setFingerprintManagerToHave(int numEnrollments) { @@ -277,6 +277,18 @@ public class FingerprintEnrollIntroductionTest { } } + @Test + public void clickNext_onActivityResult_pause_shouldFinish() { + setupFingerprintEnrollIntroWith(newTokenOnlyIntent()); + mController.resume(); + mFingerprintEnrollIntroduction.clickNextBtn(); + mController.pause().stop(); + assertThat(mFingerprintEnrollIntroduction.shouldFinishWhenBackgrounded()).isEqualTo(false); + + mController.resume().pause().stop(); + assertThat(mFingerprintEnrollIntroduction.shouldFinishWhenBackgrounded()).isEqualTo(true); + } + private Intent newTokenOnlyIntent() { return new Intent() .putExtra(EXTRA_KEY_CHALLENGE_TOKEN, new byte[] { 1 }); @@ -362,5 +374,16 @@ public class FingerprintEnrollIntroductionTest { protected void getChallenge(GenerateChallengeCallback callback) { callback.onChallengeGenerated(mNewSensorId, mUserId, mNewChallenge); } + + @Override + protected boolean shouldFinishWhenBackgrounded() { + return super.shouldFinishWhenBackgrounded(); + } + + //mock click next btn + public void clickNextBtn() { + super.onNextButtonClick(null); + } + } }