Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a8297a31 authored by Angela Wang's avatar Angela Wang
Browse files

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
parent b6e0cd99
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -309,7 +309,7 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll
     * Helper to get the list of connectable and special profiles.
     */
    private List<LocalBluetoothProfile> getProfiles() {
        List<LocalBluetoothProfile> result = new ArrayList<LocalBluetoothProfile>();
        List<LocalBluetoothProfile> 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<CachedBluetoothDevice> tmpCachedDeviceList =
                            new ArrayList<CachedBluetoothDevice>();
                    List<CachedBluetoothDevice> 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;
        }
+44 −6
Original line number Diff line number Diff line
@@ -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<SwitchPreferenceCompat> switches = getProfileSwitches(false);
        assertThat(switches.get(0).isVisible()).isFalse();
    }

    @Test
    public void ashaHearingAid_hideAshaToggle() {
        setupDevice(makeDefaultDeviceConfig());
        addHearingAidProfileToDevice(true);

        showScreen(mController);

        List<SwitchPreferenceCompat> switches = getProfileSwitches(false);
        assertThat(switches.isEmpty()).isTrue();
    }
    @Test
    public void ashaHearingAidWithLeAudio_showLeAudioToggle() {
        setupDevice(makeDefaultDeviceConfig());
        addHearingAidProfileToDevice(false);
        addLeAudioProfileToDevice(true);

        showScreen(mController);

        List<SwitchPreferenceCompat> switches = getProfileSwitches(false);
        assertThat(switches.getFirst().getTitle()).isEqualTo(
                mContext.getString(mLeAudioProfile.getNameResource(mDevice)));
    }
}