From f50efdcd71c77334e8e1fd0fdc1981bfc99d7c37 Mon Sep 17 00:00:00 2001 From: jasonwshsu Date: Fri, 9 Sep 2022 02:20:05 +0800 Subject: [PATCH] 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 --- .../bluetooth/HearingAidDeviceManager.java | 41 ++++++++++++++++--- .../HearingAidDeviceManagerTest.java | 36 +++++++++++++++- 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java index 818f5ca33ebf6..cf4e1ee99f921 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HearingAidDeviceManager.java @@ -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) { - return profileProxy.getHiSyncId(device); + final LocalBluetoothProfileManager profileManager = mBtManager.getProfileManager(); + final HearingAidProfile profileProxy = profileManager.getHearingAidProfile(); + if (profileProxy == null) { + return BluetoothHearingAid.HI_SYNC_ID_INVALID; } - return BluetoothHearingAid.HI_SYNC_ID_INVALID; + + return profileProxy.getHiSyncId(device); + } + + 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); } } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java index d80a59178c1cd..611b0a4a28b8d 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/HearingAidDeviceManagerTest.java @@ -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.