diff options
6 files changed, 91 insertions, 15 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index 8fa95977c5ce..d267ead7ccb8 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -110,6 +110,10 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> mHiSyncId = id; } + public boolean isHearingAidDevice() { + return mHiSyncId != BluetoothHearingAid.HI_SYNC_ID_INVALID; + } + /** * Last time a bt profile auto-connect was attempted. * If an ACTION_UUID intent comes in within @@ -144,8 +148,8 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> void onProfileStateChanged(LocalBluetoothProfile profile, int newProfileState) { if (Utils.D) { - Log.d(TAG, "onProfileStateChanged: profile " + profile + - " newProfileState " + newProfileState); + Log.d(TAG, "onProfileStateChanged: profile " + profile + ", device=" + mDevice + + ", newProfileState " + newProfileState); } if (mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_TURNING_OFF) { diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java index b360faabcbb0..3a5662767c42 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java @@ -162,14 +162,14 @@ public class CachedBluetoothDeviceManager { */ public synchronized String getHearingAidPairDeviceSummary(CachedBluetoothDevice device) { String pairDeviceSummary = null; - if (device.getHiSyncId() != BluetoothHearingAid.HI_SYNC_ID_INVALID) { - for (CachedBluetoothDevice hearingAidDevice : mHearingAidDevicesNotAddedInCache) { - if (hearingAidDevice.getHiSyncId() != BluetoothHearingAid.HI_SYNC_ID_INVALID - && hearingAidDevice.getHiSyncId() == device.getHiSyncId()) { - pairDeviceSummary = hearingAidDevice.getConnectionSummary(); - } - } + CachedBluetoothDevice otherHearingAidDevice = + getHearingAidOtherDevice(device, device.getHiSyncId()); + if (otherHearingAidDevice != null) { + pairDeviceSummary = otherHearingAidDevice.getConnectionSummary(); } + log("getHearingAidPairDeviceSummary: pairDeviceSummary=" + pairDeviceSummary + + ", otherHearingAidDevice=" + otherHearingAidDevice); + return pairDeviceSummary; } @@ -358,7 +358,7 @@ public class CachedBluetoothDeviceManager { } } - private CachedBluetoothDevice getHearingAidOtherDevice(CachedBluetoothDevice thisDevice, + public CachedBluetoothDevice getHearingAidOtherDevice(CachedBluetoothDevice thisDevice, long hiSyncId) { if (hiSyncId == BluetoothHearingAid.HI_SYNC_ID_INVALID) { return null; diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java index 75cbb6589037..88ec1d8dccdd 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java @@ -378,9 +378,10 @@ public class LocalBluetoothProfileManager { Log.i(TAG, "Failed to connect " + mProfile + " device"); } - if (getHearingAidProfile() != null && - mProfile instanceof HearingAidProfile && - (newState == BluetoothProfile.STATE_CONNECTED)) { + boolean isHearingAidProfile = (getHearingAidProfile() != null) && + (mProfile instanceof HearingAidProfile); + + if (isHearingAidProfile && (newState == BluetoothProfile.STATE_CONNECTED)) { // Check if the HiSyncID has being initialized if (cachedDevice.getHiSyncId() == BluetoothHearingAid.HI_SYNC_ID_INVALID) { @@ -393,10 +394,22 @@ public class LocalBluetoothProfileManager { } } - mEventManager.dispatchProfileConnectionStateChanged(cachedDevice, newState, - mProfile.getProfileId()); cachedDevice.onProfileStateChanged(mProfile, newState); cachedDevice.refresh(); + + if (isHearingAidProfile) { + CachedBluetoothDevice otherDevice = + mDeviceManager.getHearingAidOtherDevice(cachedDevice, cachedDevice.getHiSyncId()); + if (otherDevice != null) { + if (DEBUG) { + Log.d(TAG, "Refreshing other hearing aid=" + otherDevice + + ", newState=" + newState); + } + otherDevice.refresh(); + } + } + mEventManager.dispatchProfileConnectionStateChanged(cachedDevice, newState, + mProfile.getProfileId()); } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java index 6d6a13284a80..a3d10a2490e5 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java @@ -828,4 +828,20 @@ public class CachedBluetoothDeviceManagerTest { assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse(); } + + /** + * Test to verify getHearingAidOtherDevice() for hearing aid devices with same HiSyncId. + */ + @Test + public void testGetHearingAidOtherDevice_bothHearingAidsPaired_returnsOtherDevice() { + mCachedDevice1.setHiSyncId(HISYNCID1); + mCachedDevice2.setHiSyncId(HISYNCID1); + mCachedDeviceManager.mCachedDevices.add(mCachedDevice1); + mCachedDeviceManager.mHearingAidDevicesNotAddedInCache.add(mCachedDevice2); + doAnswer((invocation) -> DEVICE_SUMMARY_1).when(mCachedDevice1).getConnectionSummary(); + doAnswer((invocation) -> DEVICE_SUMMARY_2).when(mCachedDevice2).getConnectionSummary(); + + assertThat(mCachedDeviceManager.getHearingAidOtherDevice(mCachedDevice1, HISYNCID1)) + .isEqualTo(mCachedDevice2); + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java index 927a94f6b017..16a292b06234 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java @@ -28,6 +28,7 @@ import static org.robolectric.Shadows.shadowOf; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothHearingAid; import android.bluetooth.BluetoothProfile; import android.content.Context; import android.media.AudioManager; @@ -572,4 +573,16 @@ public class CachedBluetoothDeviceTest { assertThat(mCachedDevice.isHfpDevice()).isFalse(); } + + @Test + public void testIsHearingAidDevice_isHearingAidDevice() { + mCachedDevice.setHiSyncId(0x1234); + assertThat(mCachedDevice.isHearingAidDevice()).isTrue(); + } + + @Test + public void testIsHearingAidDevice_isNotHearingAidDevice() { + mCachedDevice.setHiSyncId(BluetoothHearingAid.HI_SYNC_ID_INVALID); + assertThat(mCachedDevice.isHearingAidDevice()).isFalse(); + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManagerTest.java index ca997bf8d27f..17af42903260 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManagerTest.java @@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.anyLong; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -51,6 +52,7 @@ import java.util.List; @RunWith(RobolectricTestRunner.class) @Config(resourceDir = "../../res") public class LocalBluetoothProfileManagerTest { + private final static long HI_SYNC_ID = 0x1234; @Mock private CachedBluetoothDeviceManager mDeviceManager; @Mock @@ -61,6 +63,8 @@ public class LocalBluetoothProfileManagerTest { private BluetoothDevice mDevice; @Mock private CachedBluetoothDevice mCachedBluetoothDevice; + @Mock + private CachedBluetoothDevice mHearingAidOtherDevice; private Context mContext; private LocalBluetoothProfileManager mProfileManager; @@ -199,6 +203,32 @@ public class LocalBluetoothProfileManagerTest { } /** + * Verify BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED with uuid intent will dispatch to + * refresh both sides devices. + */ + @Test + public void stateChangedHandler_receiveHAPConnectionStateChanged_shouldRefreshBothSides() { + ArrayList<Integer> supportProfiles = new ArrayList<>(); + supportProfiles.add(BluetoothProfile.HEARING_AID); + when(mAdapter.getSupportedProfiles()).thenReturn(supportProfiles); + when(mCachedBluetoothDevice.getHiSyncId()).thenReturn(HI_SYNC_ID); + when(mDeviceManager.getHearingAidOtherDevice(mCachedBluetoothDevice, HI_SYNC_ID)) + .thenReturn(mHearingAidOtherDevice); + + mProfileManager = new LocalBluetoothProfileManager(mContext, mAdapter, mDeviceManager, + mEventManager); + mIntent = new Intent(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED); + mIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice); + mIntent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, BluetoothProfile.STATE_CONNECTING); + mIntent.putExtra(BluetoothProfile.EXTRA_STATE, BluetoothProfile.STATE_CONNECTED); + + mContext.sendBroadcast(mIntent); + + verify(mCachedBluetoothDevice).refresh(); + verify(mHearingAidOtherDevice).refresh(); + } + + /** * Verify BluetoothPan.ACTION_CONNECTION_STATE_CHANGED intent with uuid will dispatch to * profile connection state changed callback */ |