From 1bc59caf137d32c8c1fd535634dfd2f8c72761fa Mon Sep 17 00:00:00 2001 From: Angela Wang Date: Wed, 24 May 2023 13:26:39 +0000 Subject: [PATCH] Shouldn't show pair another ear dialog if hearing aid supports CSIP Some devices may supports both ASHA and CSIP. If the device supports CSIP, it'll automatically pair the other ear and thus no need to pop up the pair another ear dialog which is specially for ASHA device. Bug: 283269736 Test: make RunSettingsRoboTests ROBOTEST_FILTER=HearingAidUtilsTest Change-Id: I9a8e3876e2905b18b1c63e74f47c6877504ebdc8 --- .../accessibility/HearingAidUtils.java | 12 +++++ .../accessibility/HearingAidUtilsTest.java | 50 +++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/src/com/android/settings/accessibility/HearingAidUtils.java b/src/com/android/settings/accessibility/HearingAidUtils.java index 42484f9df66..43150937ab6 100644 --- a/src/com/android/settings/accessibility/HearingAidUtils.java +++ b/src/com/android/settings/accessibility/HearingAidUtils.java @@ -23,6 +23,7 @@ import androidx.fragment.app.FragmentManager; import com.android.settings.bluetooth.HearingAidPairingDialogFragment; import com.android.settingslib.bluetooth.CachedBluetoothDevice; +import com.android.settingslib.bluetooth.CsipSetCoordinatorProfile; import com.android.settingslib.bluetooth.HearingAidInfo; /** Provides utility methods related hearing aids. */ @@ -40,6 +41,11 @@ public final class HearingAidUtils { */ public static void launchHearingAidPairingDialog(FragmentManager fragmentManager, @NonNull CachedBluetoothDevice device) { + // No need to show the pair another ear dialog if the device supports and enables CSIP. + // CSIP will pair other devices in the same set automatically. + if (isCsipSupportedAndEnabled(device)) { + return; + } if (device.isConnectedAshaHearingAidDevice() && device.getDeviceMode() == HearingAidInfo.DeviceMode.MODE_BINAURAL && device.getSubDevice() == null) { @@ -56,4 +62,10 @@ public final class HearingAidUtils { HearingAidPairingDialogFragment.newInstance(device.getAddress()).show(fragmentManager, HearingAidPairingDialogFragment.TAG); } + + private static boolean isCsipSupportedAndEnabled(@NonNull CachedBluetoothDevice device) { + return device.getProfiles().stream().anyMatch( + profile -> (profile instanceof CsipSetCoordinatorProfile) + && (profile.isEnabled(device.getDevice()))); + } } diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java index 09db6e92d1c..56ab08237c7 100644 --- a/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java @@ -37,8 +37,10 @@ import com.android.settings.testutils.shadow.ShadowBluetoothUtils; import com.android.settings.utils.ActivityControllerWrapper; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; +import com.android.settingslib.bluetooth.CsipSetCoordinatorProfile; import com.android.settingslib.bluetooth.HearingAidInfo; import com.android.settingslib.bluetooth.LocalBluetoothManager; +import com.android.settingslib.bluetooth.LocalBluetoothProfile; import org.junit.Before; import org.junit.Rule; @@ -52,6 +54,9 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import org.robolectric.shadow.api.Shadow; +import java.util.ArrayList; +import java.util.List; + /** Tests for {@link HearingAidUtils}. */ @RunWith(RobolectricTestRunner.class) @Config(shadows = {ShadowAlertDialogCompat.class, ShadowBluetoothAdapter.class, @@ -72,6 +77,8 @@ public class HearingAidUtilsTest { private LocalBluetoothManager mLocalBluetoothManager; @Mock private CachedBluetoothDeviceManager mCachedDeviceManager; + @Mock + private CsipSetCoordinatorProfile mCsipSetCoordinatorProfile; private BluetoothDevice mBluetoothDevice; private BluetoothAdapter mBluetoothAdapter; private ShadowBluetoothAdapter mShadowBluetoothAdapter; @@ -136,6 +143,38 @@ public class HearingAidUtilsTest { assertThat(dialog).isNull(); } + @Test + public void launchHearingAidPairingDialog_deviceSupportsCsip_csipEnabled_noDialog() { + when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); + when(mCachedBluetoothDevice.getDeviceMode()).thenReturn( + HearingAidInfo.DeviceMode.MODE_BINAURAL); + when(mCachedBluetoothDevice.getDeviceSide()).thenReturn( + HearingAidInfo.DeviceSide.SIDE_LEFT); + makeDeviceSupportCsip(); + makeDeviceEnableCsip(true); + + HearingAidUtils.launchHearingAidPairingDialog(mFragmentManager, mCachedBluetoothDevice); + + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(dialog).isNull(); + } + + @Test + public void launchHearingAidPairingDialog_deviceSupportsCsip_csipDisabled_dialogShown() { + when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); + when(mCachedBluetoothDevice.getDeviceMode()).thenReturn( + HearingAidInfo.DeviceMode.MODE_BINAURAL); + when(mCachedBluetoothDevice.getDeviceSide()).thenReturn( + HearingAidInfo.DeviceSide.SIDE_LEFT); + makeDeviceSupportCsip(); + makeDeviceEnableCsip(false); + + HearingAidUtils.launchHearingAidPairingDialog(mFragmentManager, mCachedBluetoothDevice); + + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(dialog.isShowing()).isTrue(); + } + @Test public void launchHearingAidPairingDialog_dialogShown() { when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); @@ -150,6 +189,17 @@ public class HearingAidUtilsTest { assertThat(dialog.isShowing()).isTrue(); } + private void makeDeviceSupportCsip() { + List uuids = new ArrayList<>(); + uuids.add(mCsipSetCoordinatorProfile); + when(mCachedBluetoothDevice.getProfiles()).thenReturn(uuids); + } + + private void makeDeviceEnableCsip(boolean enabled) { + when(mCsipSetCoordinatorProfile.isEnabled(mCachedBluetoothDevice.getDevice())) + .thenReturn(enabled); + } + private void setupEnvironment() { ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager; mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();