From a8297a313bba98599c4d23655e82a5c9bde3bd48 Mon Sep 17 00:00:00 2001 From: Angela Wang Date: Fri, 2 Aug 2024 03:52:03 +0000 Subject: [PATCH] Fix LE Audio toggle missing issue for dual mode hearing device After the code change of ag/28283226, they hide the LE Audio toggle for LE Audio only device since turning off the profile may cause this device no functioning. But the dual mode hearing devices(LE Audio + Asha) are wrongly recognized as LE Audio only devices since HearingAidProfile.accessProfileEnabled() return false. This make the users lost the ability to switch between profiles they preferred. Make HearingAidProfile.accessProfileEnabled() return true and hide the Hearing Aid toggle by default since it's also meaningless to turn off the Asha profile for Asha-only devices. Flag: com.android.settingslib.flags.asha_profile_access_profile_enabled_true Bug: 356530795 Test: manual checking the UI Test: atest BluetoothDetailsProfilesControllerTest Change-Id: Ica350b4c16c1b07945399bfee1038f7b0824baed --- .../BluetoothDetailsProfilesController.java | 9 ++-- ...luetoothDetailsProfilesControllerTest.java | 50 ++++++++++++++++--- 2 files changed, 50 insertions(+), 9 deletions(-) diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java index 015d427f8cd..47687d4cd24 100644 --- a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java +++ b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java @@ -309,7 +309,7 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll * Helper to get the list of connectable and special profiles. */ private List getProfiles() { - List result = new ArrayList(); + List result = new ArrayList<>(); mProfileDeviceMap.clear(); if (mAllOfCachedDevices == null || mAllOfCachedDevices.isEmpty()) { return result; @@ -320,8 +320,7 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll if (mProfileDeviceMap.containsKey(profile.toString())) { mProfileDeviceMap.get(profile.toString()).add(cachedItem); } else { - List tmpCachedDeviceList = - new ArrayList(); + List tmpCachedDeviceList = new ArrayList<>(); tmpCachedDeviceList.add(cachedItem); mProfileDeviceMap.put(profile.toString(), tmpCachedDeviceList); result.add(profile); @@ -357,6 +356,10 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll } boolean hearingAidSupported = result.contains( mManager.getProfileManager().getHearingAidProfile()); + // Remove hearing aids toggle anyway since showing the toggle will confuse users + if (hearingAidSupported) { + result.remove(mManager.getProfileManager().getHearingAidProfile()); + } if (leAudioSupported && !classicAudioSupported && !hearingAidSupported) { mIsLeAudioOnlyDevice = true; } diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsProfilesControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsProfilesControllerTest.java index 2d1f4c0e907..219c37b6c08 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsProfilesControllerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsProfilesControllerTest.java @@ -44,6 +44,7 @@ import com.android.settings.testutils.shadow.ShadowBluetoothDevice; import com.android.settingslib.R; import com.android.settingslib.bluetooth.A2dpProfile; import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; +import com.android.settingslib.bluetooth.HearingAidProfile; import com.android.settingslib.bluetooth.LeAudioProfile; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothProfile; @@ -90,8 +91,12 @@ public class BluetoothDetailsProfilesControllerTest extends BluetoothDetailsCont @Mock private CachedBluetoothDeviceManager mCachedBluetoothDeviceManager; - private @Mock A2dpProfile mA2dpProfile; - private @Mock LeAudioProfile mLeAudioProfile; + @Mock + private A2dpProfile mA2dpProfile; + @Mock + private LeAudioProfile mLeAudioProfile; + @Mock + private HearingAidProfile mHearingAidProfile; @Override public void setUp() { @@ -399,18 +404,23 @@ public class BluetoothDetailsProfilesControllerTest extends BluetoothDetailsCont when(mProfileManager.getProfileByName(eq(mA2dpProfile.toString()))) .thenReturn(mA2dpProfile); when(mA2dpProfile.getNameResource(any())) - .thenReturn(com.android.settingslib.R.string.bluetooth_profile_a2dp); + .thenReturn(R.string.bluetooth_profile_a2dp); when(mA2dpProfile.getHighQualityAudioOptionLabel(any())).thenReturn( - mContext.getString(com.android.settingslib.R - .string.bluetooth_profile_a2dp_high_quality_unknown_codec)); + mContext.getString(R.string.bluetooth_profile_a2dp_high_quality_unknown_codec)); when(mA2dpProfile.isProfileReady()).thenReturn(true); when(mProfileManager.getA2dpProfile()).thenReturn(mA2dpProfile); when(mLeAudioProfile.toString()).thenReturn("LE_AUDIO"); when(mLeAudioProfile.getNameResource(any())) - .thenReturn(com.android.settingslib.R.string.bluetooth_profile_le_audio); + .thenReturn(R.string.bluetooth_profile_le_audio); when(mLeAudioProfile.isProfileReady()).thenReturn(true); when(mProfileManager.getLeAudioProfile()).thenReturn(mLeAudioProfile); + + when(mHearingAidProfile.toString()).thenReturn("HearingAid"); + when(mHearingAidProfile.getNameResource(any())) + .thenReturn(R.string.bluetooth_profile_hearing_aid); + when(mHearingAidProfile.isProfileReady()).thenReturn(true); + when(mProfileManager.getHearingAidProfile()).thenReturn(mHearingAidProfile); } private void addA2dpProfileToDevice(boolean preferred, boolean supportsHighQualityAudio, @@ -426,6 +436,11 @@ public class BluetoothDetailsProfilesControllerTest extends BluetoothDetailsCont mConnectableProfiles.add(mLeAudioProfile); } + private void addHearingAidProfileToDevice(boolean enabled) { + when(mHearingAidProfile.isEnabled(any())).thenReturn(enabled); + mConnectableProfiles.add(mHearingAidProfile); + } + private SwitchPreferenceCompat getHighQualityAudioPref() { return (SwitchPreferenceCompat) mScreen.findPreference( BluetoothDetailsProfilesController.HIGH_QUALITY_AUDIO_PREF_TAG); @@ -591,4 +606,27 @@ public class BluetoothDetailsProfilesControllerTest extends BluetoothDetailsCont List switches = getProfileSwitches(false); assertThat(switches.get(0).isVisible()).isFalse(); } + + @Test + public void ashaHearingAid_hideAshaToggle() { + setupDevice(makeDefaultDeviceConfig()); + addHearingAidProfileToDevice(true); + + showScreen(mController); + + List switches = getProfileSwitches(false); + assertThat(switches.isEmpty()).isTrue(); + } + @Test + public void ashaHearingAidWithLeAudio_showLeAudioToggle() { + setupDevice(makeDefaultDeviceConfig()); + addHearingAidProfileToDevice(false); + addLeAudioProfileToDevice(true); + + showScreen(mController); + + List switches = getProfileSwitches(false); + assertThat(switches.getFirst().getTitle()).isEqualTo( + mContext.getString(mLeAudioProfile.getNameResource(mDevice))); + } }