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

Commit f50efdcd authored by jasonwshsu's avatar jasonwshsu Committed by Jason Hsu
Browse files

Fix hearing aid appears wrong side after device reboot.

Root Cause: Only set deviceSide() and deviceMode() when connection state change.

Solution: Set deviceSide() and deviceMode() together with setHiSyncId()  when HearingAidService connected and addDevice() into CachedBluetoothDevice.

Bug: 243621489
Test: make RunSettingsLibRoboTests ROBOTEST_FILTER=HearingAidDeviceManagerTest
Change-Id: Iaa5a00311006c6e6bb9aaf565224627df1c5beaa
parent f73ff9ec
Loading
Loading
Loading
Loading
+36 −5
Original line number Diff line number Diff line
@@ -46,16 +46,43 @@ public class HearingAidDeviceManager {
        if (isValidHiSyncId(hiSyncId)) {
            // Once hiSyncId is valid, assign hiSyncId
            newDevice.setHiSyncId(hiSyncId);
            final int side = getDeviceSide(newDevice.getDevice());
            final int mode = getDeviceMode(newDevice.getDevice());
            newDevice.setDeviceSide(side);
            newDevice.setDeviceMode(mode);
        }
    }

    private long getHiSyncId(BluetoothDevice device) {
        LocalBluetoothProfileManager profileManager = mBtManager.getProfileManager();
        HearingAidProfile profileProxy = profileManager.getHearingAidProfile();
        if (profileProxy != null) {
        final LocalBluetoothProfileManager profileManager = mBtManager.getProfileManager();
        final HearingAidProfile profileProxy = profileManager.getHearingAidProfile();
        if (profileProxy == null) {
            return BluetoothHearingAid.HI_SYNC_ID_INVALID;
        }

        return profileProxy.getHiSyncId(device);
    }
        return BluetoothHearingAid.HI_SYNC_ID_INVALID;

    private int getDeviceSide(BluetoothDevice device) {
        final LocalBluetoothProfileManager profileManager = mBtManager.getProfileManager();
        final HearingAidProfile profileProxy = profileManager.getHearingAidProfile();
        if (profileProxy == null) {
            Log.w(TAG, "HearingAidProfile is not supported and not ready to fetch device side");
            return HearingAidProfile.DeviceSide.SIDE_INVALID;
        }

        return profileProxy.getDeviceSide(device);
    }

    private int getDeviceMode(BluetoothDevice device) {
        final LocalBluetoothProfileManager profileManager = mBtManager.getProfileManager();
        final HearingAidProfile profileProxy = profileManager.getHearingAidProfile();
        if (profileProxy == null) {
            Log.w(TAG, "HearingAidProfile is not supported and not ready to fetch device mode");
            return HearingAidProfile.DeviceMode.MODE_INVALID;
        }

        return profileProxy.getDeviceMode(device);
    }

    boolean setSubDeviceIfNeeded(CachedBluetoothDevice newDevice) {
@@ -98,6 +125,10 @@ public class HearingAidDeviceManager {
                if (isValidHiSyncId(newHiSyncId)) {
                    cachedDevice.setHiSyncId(newHiSyncId);
                    newSyncIdSet.add(newHiSyncId);
                    final int side = getDeviceSide(cachedDevice.getDevice());
                    final int mode = getDeviceMode(cachedDevice.getDevice());
                    cachedDevice.setDeviceSide(side);
                    cachedDevice.setDeviceMode(mode);
                }
            }
        }
+34 −2
Original line number Diff line number Diff line
@@ -102,16 +102,25 @@ public class HearingAidDeviceManagerTest {
    }

    /**
     * Test initHearingAidDeviceIfNeeded, a valid HiSyncId will be assigned
     * Test initHearingAidDeviceIfNeeded, set HearingAid's information, including HiSyncId,
     * deviceSide, deviceMode.
     */
    @Test
    public void initHearingAidDeviceIfNeeded_validHiSyncId_verifyHiSyncId() {
    public void initHearingAidDeviceIfNeeded_validHiSyncId_setHearingAidInfos() {
        when(mHearingAidProfile.getHiSyncId(mDevice1)).thenReturn(HISYNCID1);
        when(mHearingAidProfile.getDeviceMode(mDevice1)).thenReturn(
                HearingAidProfile.DeviceMode.MODE_BINAURAL);
        when(mHearingAidProfile.getDeviceSide(mDevice1)).thenReturn(
                HearingAidProfile.DeviceSide.SIDE_RIGHT);

        assertThat(mCachedDevice1.getHiSyncId()).isNotEqualTo(HISYNCID1);
        mHearingAidDeviceManager.initHearingAidDeviceIfNeeded(mCachedDevice1);

        assertThat(mCachedDevice1.getHiSyncId()).isEqualTo(HISYNCID1);
        assertThat(mCachedDevice1.getDeviceMode()).isEqualTo(
                HearingAidProfile.DeviceMode.MODE_BINAURAL);
        assertThat(mCachedDevice1.getDeviceSide()).isEqualTo(
                HearingAidProfile.DeviceSide.SIDE_RIGHT);
    }

    /**
@@ -250,6 +259,29 @@ public class HearingAidDeviceManagerTest {
        verify(mHearingAidDeviceManager, never()).onHiSyncIdChanged(anyLong());
    }

    /**
     * Test updateHearingAidsDevices, set HearingAid's information, including HiSyncId, deviceSide,
     * deviceMode.
     */
    @Test
    public void updateHearingAidsDevices_validHiSyncId_setHearingAidInfos() {
        when(mHearingAidProfile.getHiSyncId(mDevice1)).thenReturn(HISYNCID1);
        when(mHearingAidProfile.getDeviceMode(mDevice1)).thenReturn(
                HearingAidProfile.DeviceMode.MODE_BINAURAL);
        when(mHearingAidProfile.getDeviceSide(mDevice1)).thenReturn(
                HearingAidProfile.DeviceSide.SIDE_RIGHT);
        mCachedDeviceManager.mCachedDevices.add(mCachedDevice1);

        mHearingAidDeviceManager.updateHearingAidsDevices();

        assertThat(mCachedDevice1.getHiSyncId()).isEqualTo(HISYNCID1);
        assertThat(mCachedDevice1.getDeviceMode()).isEqualTo(
                HearingAidProfile.DeviceMode.MODE_BINAURAL);
        assertThat(mCachedDevice1.getDeviceSide()).isEqualTo(
                HearingAidProfile.DeviceSide.SIDE_RIGHT);
        verify(mHearingAidDeviceManager).onHiSyncIdChanged(HISYNCID1);
    }

    /**
     * Test onProfileConnectionStateChangedIfProcessed.
     * When first hearing aid device is connected, to process it same as other generic devices.