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

Commit be80a2c4 authored by jasonwshsu's avatar jasonwshsu
Browse files

Refresh to show/hide hearing device input preference

Root Cause: When hearing device gets disconnected, it still shows hearing device input preference but it is not valid at this moment.

Solution: Show/hide preferece when refresh() get called

Bug: 410731722
Test: atest BluetoothDetailsHearingDeviceInputRoutingControllerTest
Flag: EXEMPT bugfix
Change-Id: I0ba87f427643c1a8ca0e068cfa4a9fd0fa1fe5a0
parent 07505687
Loading
Loading
Loading
Loading
+21 −5
Original line number Diff line number Diff line
@@ -56,6 +56,10 @@ public class BluetoothDetailsHearingDeviceInputRoutingController extends

    private final HearingAidAudioRoutingHelper mAudioRoutingHelper;
    private final AudioManager mAudioManager;
    @Nullable
    PreferenceCategory mPreferenceContainer;
    @Nullable
    private HearingDeviceInputRoutingPreference mPreference;

    public BluetoothDetailsHearingDeviceInputRoutingController(
            @NonNull Context context,
@@ -92,15 +96,27 @@ public class BluetoothDetailsHearingDeviceInputRoutingController extends

    @Override
    protected void init(PreferenceScreen screen) {
        PreferenceCategory hearingCategory = screen.findPreference(KEY_HEARING_DEVICE_GROUP);
        if (hearingCategory != null) {
            hearingCategory.addPreference(
                    createInputRoutingPreference(hearingCategory.getContext()));
        mPreferenceContainer = screen.findPreference(KEY_HEARING_DEVICE_GROUP);
        if (mPreferenceContainer != null) {
            mPreference = createInputRoutingPreference(mPreferenceContainer.getContext());
            mPreferenceContainer.addPreference(mPreference);
        }
    }

    @Override
    protected void refresh() {}
    protected void refresh() {
        if (mPreferenceContainer == null || mPreference == null) {
            return;
        }
        if (mPreference.isVisible() && !isAvailable()) {
            if (mPreference.isDialogOpen()) {
                mPreference.getDialog().dismiss();
            }
            mPreference.setVisible(false);
        } else if (!mPreference.isVisible() && isAvailable()) {
            mPreference.setVisible(true);
        }
    }

    @Nullable
    @Override
+30 −0
Original line number Diff line number Diff line
@@ -179,6 +179,36 @@ public class BluetoothDetailsHearingDeviceInputRoutingControllerTest extends
        assertThat(mController.isAvailable()).isTrue();
    }

    @Test
    public void refresh_validInputChangeToNotValidInput_noPreference() {
        when(mCachedDevice.getAddress()).thenReturn(TEST_ADDRESS);
        AudioDeviceInfo[] mockInfo = new AudioDeviceInfo[] {mockTestAddressInfo(TEST_ADDRESS)};
        when(mAudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS)).thenReturn(mockInfo);
        when(mCachedDevice.getProfiles()).thenReturn(List.of(mHapClientProfile));
        mController.init(mScreen);

        when(mCachedDevice.getProfiles()).thenReturn(Collections.emptyList());
        mController.refresh();

        Preference pref = mScreen.findPreference(KEY_HEARING_DEVICE_INPUT_ROUTING);
        assertThat(pref.isVisible()).isFalse();
    }

    @Test
    public void refresh_notValidInputChangeToValidInput_expectedPreference() {
        when(mCachedDevice.getAddress()).thenReturn(TEST_ADDRESS);
        AudioDeviceInfo[] mockInfo = new AudioDeviceInfo[] {mockTestAddressInfo(TEST_ADDRESS)};
        when(mAudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS)).thenReturn(mockInfo);
        when(mCachedDevice.getProfiles()).thenReturn(Collections.emptyList());
        mController.init(mScreen);

        when(mCachedDevice.getProfiles()).thenReturn(List.of(mHapClientProfile));
        mController.refresh();

        Preference pref = mScreen.findPreference(KEY_HEARING_DEVICE_INPUT_ROUTING);
        assertThat(pref.isVisible()).isTrue();
    }

    private AudioDeviceInfo mockTestAddressInfo(String address) {
        final AudioDeviceInfo info = mock(AudioDeviceInfo.class);
        when(info.getType()).thenReturn(AudioDeviceInfo.TYPE_BLE_HEADSET);