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();