From 7a15ecafdec5c5b9598427c19434ee9319b38f26 Mon Sep 17 00:00:00 2001 From: Angela Wang Date: Tue, 29 Aug 2023 07:20:49 +0000 Subject: [PATCH] Hide pair other ear button after device connected via CSIP The pair other ear button should disappear after both ears of binaural hearing aids are connected. Remove checking if CSIP is enabled since CSIP is always enabled in pairing stage. Bug: 296646732 Test: check the UI manually Change-Id: I804819eef41b5d3754ad0a79d9fc1afc66cef5cc --- .../accessibility/HearingAidUtils.java | 11 +- .../BluetoothDetailsPairOtherController.java | 31 +++- .../accessibility/HearingAidUtilsTest.java | 26 +--- ...uetoothDetailsPairOtherControllerTest.java | 139 ++++++++++++++++-- 4 files changed, 152 insertions(+), 55 deletions(-) diff --git a/src/com/android/settings/accessibility/HearingAidUtils.java b/src/com/android/settings/accessibility/HearingAidUtils.java index 4734c55110c..edf2d9f8e5e 100644 --- a/src/com/android/settings/accessibility/HearingAidUtils.java +++ b/src/com/android/settings/accessibility/HearingAidUtils.java @@ -42,9 +42,10 @@ public final class HearingAidUtils { */ public static void launchHearingAidPairingDialog(FragmentManager fragmentManager, @NonNull CachedBluetoothDevice device, int launchPage) { - // No need to show the pair another ear dialog if the device supports and enables CSIP. + // No need to show the pair another ear dialog if the device supports CSIP. // CSIP will pair other devices in the same set automatically. - if (isCsipSupportedAndEnabled(device)) { + if (device.getProfiles().stream().anyMatch( + profile -> profile instanceof CsipSetCoordinatorProfile)) { return; } if (device.isConnectedAshaHearingAidDevice() @@ -63,10 +64,4 @@ public final class HearingAidUtils { HearingAidPairingDialogFragment.newInstance(device.getAddress(), launchPage) .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/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherController.java b/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherController.java index 188b4ad79e6..562a46919a2 100644 --- a/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherController.java +++ b/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherController.java @@ -31,6 +31,8 @@ import com.android.settingslib.widget.ButtonPreference; import com.google.common.annotations.VisibleForTesting; +import java.util.Set; + /** * This class handles button preference logic to display for hearing aid device. */ @@ -91,7 +93,11 @@ public class BluetoothDetailsPairOtherController extends BluetoothDetailsControl } private boolean getButtonPreferenceVisibility(CachedBluetoothDevice cachedDevice) { - return isBinauralMode(cachedDevice) && isOnlyOneSideConnected(cachedDevice); + // The device is not connected yet. Don't show the button. + if (!cachedDevice.isConnectedHearingAidDevice()) { + return false; + } + return isBinauralMode(cachedDevice) && !isOtherSideConnected(cachedDevice); } private void launchPairingDetail() { @@ -106,16 +112,25 @@ public class BluetoothDetailsPairOtherController extends BluetoothDetailsControl return cachedDevice.getDeviceMode() == HearingAidInfo.DeviceMode.MODE_BINAURAL; } - private boolean isOnlyOneSideConnected(CachedBluetoothDevice cachedDevice) { - if (!cachedDevice.isConnectedAshaHearingAidDevice()) { - return false; + private boolean isOtherSideConnected(CachedBluetoothDevice cachedDevice) { + // Check sub device for ASHA hearing aid + if (cachedDevice.isConnectedAshaHearingAidDevice()) { + final CachedBluetoothDevice subDevice = cachedDevice.getSubDevice(); + if (subDevice != null && subDevice.isConnectedAshaHearingAidDevice()) { + return true; + } } - final CachedBluetoothDevice subDevice = cachedDevice.getSubDevice(); - if (subDevice != null && subDevice.isConnectedAshaHearingAidDevice()) { - return false; + // Check member device for LE audio hearing aid + if (cachedDevice.isConnectedLeAudioHearingAidDevice()) { + final Set memberDevices = cachedDevice.getMemberDevice(); + for (CachedBluetoothDevice memberDevice : memberDevices) { + if (memberDevice.isConnectedLeAudioHearingAidDevice()) { + return true; + } + } } - return true; + return false; } } diff --git a/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java b/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java index 6d45af2b380..9368ec80b93 100644 --- a/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/HearingAidUtilsTest.java @@ -156,14 +156,13 @@ public class HearingAidUtilsTest { } @Test - public void launchHearingAidPairingDialog_deviceSupportsCsip_csipEnabled_noDialog() { + public void launchHearingAidPairingDialog_deviceSupportsCsip_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, TEST_LAUNCH_PAGE); @@ -173,24 +172,6 @@ public class HearingAidUtilsTest { 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, - TEST_LAUNCH_PAGE); - - shadowMainLooper().idle(); - final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); - assertThat(dialog.isShowing()).isTrue(); - } - @Test public void launchHearingAidPairingDialog_dialogShown() { when(mCachedBluetoothDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); @@ -213,11 +194,6 @@ public class HearingAidUtilsTest { 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(); diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherControllerTest.java index 090fb0c124d..2bd2d74c492 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherControllerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsPairOtherControllerTest.java @@ -34,6 +34,9 @@ import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import org.robolectric.RobolectricTestRunner; +import java.util.HashSet; +import java.util.Set; + /** Tests for {@link BluetoothDetailsPairOtherController}. */ @RunWith(RobolectricTestRunner.class) public class BluetoothDetailsPairOtherControllerTest extends BluetoothDetailsControllerTestBase { @@ -60,8 +63,9 @@ public class BluetoothDetailsPairOtherControllerTest extends BluetoothDetailsCon mScreen.addPreference(mSpacePreference); } + /** Test the pair other side button title during initialization. */ @Test - public void init_leftSideDevice_rightSideButtonTitle() { + public void init_leftSideDevice_pairRightSideButtonTitle() { when(mCachedDevice.getDeviceSide()).thenReturn(HearingAidInfo.DeviceSide.SIDE_LEFT); mController.init(mScreen); @@ -70,8 +74,9 @@ public class BluetoothDetailsPairOtherControllerTest extends BluetoothDetailsCon mContext.getString(R.string.bluetooth_pair_right_ear_button)); } + /** Test the pair other side button title during initialization. */ @Test - public void init_rightSideDevice_leftSideButtonTitle() { + public void init_rightSideDevice_pairLeftSideButtonTitle() { when(mCachedDevice.getDeviceSide()).thenReturn(HearingAidInfo.DeviceSide.SIDE_RIGHT); mController.init(mScreen); @@ -80,9 +85,10 @@ public class BluetoothDetailsPairOtherControllerTest extends BluetoothDetailsCon mContext.getString(R.string.bluetooth_pair_left_ear_button)); } + /** Test the pair other side button visibility during initialization. */ @Test - public void init_isNotConnectedAshaHearingAidDevice_notVisiblePreference() { - when(mCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(false); + public void init_isNotConnectedHearingAidDevice_preferenceIsNotVisible() { + when(mCachedDevice.isConnectedHearingAidDevice()).thenReturn(false); mController.init(mScreen); @@ -90,23 +96,49 @@ public class BluetoothDetailsPairOtherControllerTest extends BluetoothDetailsCon assertThat(mSpacePreference.isVisible()).isFalse(); } + /** + * Test if the controller is available. + * Conditions: + * 1. Hearing aids is not connected + * Expected result: + * The controller is not available. No need to show pair other side hint for + * not connected device. + */ @Test - public void isAvailable_isNotConnectedAshaHearingAidDevice_notAvailable() { - when(mCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(false); + public void isAvailable_isNotConnectedHearingAidDevice_notAvailable() { + when(mCachedDevice.isConnectedHearingAidDevice()).thenReturn(false); assertThat(mController.isAvailable()).isFalse(); } + /** + * Test if the controller is available. + * Conditions: + * 1. Monaural hearing aids + * Expected result: + * The controller is not available. No need to show pair other side hint for + * monaural device. + */ @Test - public void isAvailable_isConnectedAshaHearingAidDevice_isMonaural_notAvailable() { - when(mCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); + public void isAvailable_isConnectedHearingAidDevice_isMonaural_notAvailable() { + when(mCachedDevice.isConnectedHearingAidDevice()).thenReturn(true); when(mCachedDevice.getDeviceMode()).thenReturn(HearingAidInfo.DeviceMode.MODE_MONAURAL); assertThat(mController.isAvailable()).isFalse(); } + /** + * Test if the controller is available. + * Conditions: + * 1. Binaural ASHA hearing aids + * 2. Sub device is added + * 3. Sub device is connected + * Expected result: + * The controller is not available. Both sides are already paired and connected. + */ @Test - public void isAvailable_subDeviceIsConnectedAshaHearingAidDevice_notAvailable() { + public void isAvailable_ashaDevice_otherDeviceIsConnected_notAvailable() { + when(mCachedDevice.isConnectedHearingAidDevice()).thenReturn(true); when(mCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); when(mCachedDevice.getDeviceMode()).thenReturn(HearingAidInfo.DeviceMode.MODE_BINAURAL); when(mSubCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); @@ -115,8 +147,18 @@ public class BluetoothDetailsPairOtherControllerTest extends BluetoothDetailsCon assertThat(mController.isAvailable()).isFalse(); } + /** + * Test if the controller is available. + * Conditions: + * 1. Binaural ASHA hearing aids + * 2. Sub device is added + * 3. Sub device is not connected + * Expected result: + * The controller is available. Need to show the hint to pair the other side. + */ @Test - public void isAvailable_subDeviceIsNotConnectedAshaHearingAidDevice_available() { + public void isAvailable_ashaDevice_otherDeviceIsNotConnected_available() { + when(mCachedDevice.isConnectedHearingAidDevice()).thenReturn(true); when(mCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); when(mCachedDevice.getDeviceMode()).thenReturn(HearingAidInfo.DeviceMode.MODE_BINAURAL); when(mSubCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(false); @@ -125,8 +167,17 @@ public class BluetoothDetailsPairOtherControllerTest extends BluetoothDetailsCon assertThat(mController.isAvailable()).isTrue(); } + /** + * Test if the controller is available. + * Conditions: + * 1. Binaural ASHA hearing aids + * 2. No sub device added + * Expected result: + * The controller is available. Need to show the hint to pair the other side. + */ @Test - public void isAvailable_subDeviceNotExist_available() { + public void isAvailable_ashaDevice_otherDeviceIsNotExist_available() { + when(mCachedDevice.isConnectedHearingAidDevice()).thenReturn(true); when(mCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(true); when(mCachedDevice.getDeviceMode()).thenReturn(HearingAidInfo.DeviceMode.MODE_BINAURAL); when(mCachedDevice.getSubDevice()).thenReturn(null); @@ -134,8 +185,67 @@ public class BluetoothDetailsPairOtherControllerTest extends BluetoothDetailsCon assertThat(mController.isAvailable()).isTrue(); } + /** + * Test if the controller is available. + * Conditions: + * 1. Binaural LE Audio hearing aids + * 2. Member device is added + * 3. Member device is connected + * Expected result: + * The controller is not available. Both sides are already paired and connected. + */ @Test - public void refresh_leftSideDevice_leftSideButtonTitle() { + public void isAvailable_leAudioDevice_otherDeviceIsConnected_notAvailable() { + when(mCachedDevice.isConnectedHearingAidDevice()).thenReturn(true); + when(mCachedDevice.isConnectedLeAudioHearingAidDevice()).thenReturn(true); + when(mCachedDevice.getDeviceMode()).thenReturn(HearingAidInfo.DeviceMode.MODE_BINAURAL); + when(mSubCachedDevice.isConnectedLeAudioHearingAidDevice()).thenReturn(true); + when(mCachedDevice.getMemberDevice()).thenReturn(Set.of(mSubCachedDevice)); + + assertThat(mController.isAvailable()).isFalse(); + } + + /** + * Test if the controller is available. + * Conditions: + * 1. Binaural LE Audio hearing aids + * 2. Member device is added + * 3. Member device is not connected + * Expected result: + * The controller is available. Need to show the hint to pair the other side. + */ + @Test + public void isAvailable_leAudioDevice_otherDeviceIsNotConnected_available() { + when(mCachedDevice.isConnectedHearingAidDevice()).thenReturn(true); + when(mCachedDevice.isConnectedLeAudioHearingAidDevice()).thenReturn(true); + when(mCachedDevice.getDeviceMode()).thenReturn(HearingAidInfo.DeviceMode.MODE_BINAURAL); + when(mSubCachedDevice.isConnectedLeAudioHearingAidDevice()).thenReturn(false); + when(mCachedDevice.getMemberDevice()).thenReturn(Set.of(mSubCachedDevice)); + + assertThat(mController.isAvailable()).isTrue(); + } + + /** + * Test if the controller is available. + * Conditions: + * 1. Binaural LE Audio hearing aids + * 2. No member device added + * Expected result: + * The controller is available. Need to show the hint to pair the other side. + */ + @Test + public void isAvailable_leAudioDevice_otherDeviceIsNotExist_available() { + when(mCachedDevice.isConnectedHearingAidDevice()).thenReturn(true); + when(mCachedDevice.isConnectedLeAudioHearingAidDevice()).thenReturn(true); + when(mCachedDevice.getDeviceMode()).thenReturn(HearingAidInfo.DeviceMode.MODE_BINAURAL); + when(mCachedDevice.getMemberDevice()).thenReturn(new HashSet<>()); + + assertThat(mController.isAvailable()).isTrue(); + } + + /** Test the pair other side button title after refreshing. */ + @Test + public void refresh_rightSideDevice_pairLeftSideButtonTitle() { when(mCachedDevice.getDeviceSide()).thenReturn(HearingAidInfo.DeviceSide.SIDE_RIGHT); mController.init(mScreen); @@ -145,9 +255,10 @@ public class BluetoothDetailsPairOtherControllerTest extends BluetoothDetailsCon mContext.getString(R.string.bluetooth_pair_left_ear_button)); } + /** Test the pair other side button visibility after refreshing. */ @Test - public void refresh_isNotConnectedAshaHearingAidDevice_notVisiblePreference() { - when(mCachedDevice.isConnectedAshaHearingAidDevice()).thenReturn(false); + public void refresh_isNotConnectedHearingAidDevice_preferenceIsNotVisible() { + when(mCachedDevice.isConnectedHearingAidDevice()).thenReturn(false); mController.init(mScreen); mController.refresh();