diff options
5 files changed, 145 insertions, 62 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index a3d632cfb82a..04168ce6d79a 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -940,6 +940,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> + getName() + ", groupId=" + mGroupId + + ", member= " + mMemberDevices + ")"; } @@ -1494,33 +1495,6 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> } /** - * In order to show the preference for the whole group, we always set the main device as the - * first connected device in the coordinated set, and then switch the content of the main - * device and member devices. - * - * @param newMainDevice the new Main device which is from the previous main device's member - * list. - */ - public void switchMemberDeviceContent(CachedBluetoothDevice newMainDevice) { - // Backup from main device - final BluetoothDevice tmpDevice = mDevice; - final short tmpRssi = mRssi; - final boolean tmpJustDiscovered = mJustDiscovered; - // Set main device from sub device - release(); - mDevice = newMainDevice.mDevice; - mRssi = newMainDevice.mRssi; - mJustDiscovered = newMainDevice.mJustDiscovered; - - // Set sub device from backup - newMainDevice.release(); - newMainDevice.mDevice = tmpDevice; - newMainDevice.mRssi = tmpRssi; - newMainDevice.mJustDiscovered = tmpJustDiscovered; - fetchActiveDevices(); - } - - /** * Get cached bluetooth icon with description */ public Pair<Drawable, String> getDrawableWithDescription() { diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java index 7b4c86207a2a..d191b1e1c0e6 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java @@ -464,6 +464,59 @@ public class CachedBluetoothDeviceManager { return !(mOngoingSetMemberPair == null) && mOngoingSetMemberPair.equals(device); } + /** + * In order to show the preference for the whole group, we always set the main device as the + * first connected device in the coordinated set, and then switch the relationship of the main + * device and member devices. + * + * @param newMainDevice the new Main device which is from the previous main device's member + * list. + */ + public void switchRelationshipFromMemberToMain(CachedBluetoothDevice newMainDevice) { + if (newMainDevice == null) { + log("switchRelationshipFromMemberToMain: input is null"); + return; + } + log("switchRelationshipFromMemberToMain: CachedBluetoothDevice list: " + mCachedDevices); + + final CachedBluetoothDevice finalNewMainDevice = newMainDevice; + int newMainGroupId = newMainDevice.getGroupId(); + CachedBluetoothDevice oldMainDevice = mCachedDevices.stream() + .filter(cachedDevice -> !cachedDevice.equals(finalNewMainDevice) + && cachedDevice.getGroupId() == newMainGroupId).findFirst().orElse(null); + boolean hasMainDevice = oldMainDevice != null; + Set<CachedBluetoothDevice> memberSet = + hasMainDevice ? oldMainDevice.getMemberDevice() : null; + boolean isMemberDevice = memberSet != null && memberSet.contains(newMainDevice); + if (!hasMainDevice || !isMemberDevice) { + log("switchRelationshipFromMemberToMain: " + + newMainDevice.getDevice().getAnonymizedAddress() + + " is not the member device."); + return; + } + + mCachedDevices.remove(oldMainDevice); + // When both LE Audio devices are disconnected, receiving member device + // connection. To switch content and dispatch to notify UI change + mBtManager.getEventManager().dispatchDeviceRemoved(oldMainDevice); + + for (CachedBluetoothDevice memberDeviceItem : memberSet) { + if (memberDeviceItem.equals(newMainDevice)) { + continue; + } + newMainDevice.addMemberDevice(memberDeviceItem); + } + memberSet.clear(); + newMainDevice.addMemberDevice(oldMainDevice); + + mCachedDevices.add(newMainDevice); + // It is necessary to do remove and add for updating the mapping on + // preference and device + mBtManager.getEventManager().dispatchDeviceAdded(newMainDevice); + log("switchRelationshipFromMemberToMain: After change, CachedBluetoothDevice list: " + + mCachedDevices); + } + private void log(String msg) { if (DEBUG) { Log.d(TAG, msg); diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java index 20a6cd8e09ce..814c395865b1 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java @@ -238,14 +238,10 @@ public class CsipDeviceManager { mainDevice.refresh(); return true; } else { - // When both LE Audio devices are disconnected, receiving member device - // connection. To switch content and dispatch to notify UI change - mBtManager.getEventManager().dispatchDeviceRemoved(mainDevice); - mainDevice.switchMemberDeviceContent(cachedDevice); - mainDevice.refresh(); - // It is necessary to do remove and add for updating the mapping on - // preference and device - mBtManager.getEventManager().dispatchDeviceAdded(mainDevice); + final CachedBluetoothDeviceManager deviceManager = + mBtManager.getCachedDeviceManager(); + deviceManager.switchRelationshipFromMemberToMain(cachedDevice); + cachedDevice.refresh(); return true; } } @@ -266,14 +262,10 @@ public class CsipDeviceManager { for (CachedBluetoothDevice device: memberSet) { if (device.isConnected()) { log("set device: " + device + " as the main device"); - // Main device is disconnected and sub device is connected - // To copy data from sub device to main device - mBtManager.getEventManager().dispatchDeviceRemoved(cachedDevice); - cachedDevice.switchMemberDeviceContent(device); - cachedDevice.refresh(); - // It is necessary to do remove and add for updating the mapping on - // preference and device - mBtManager.getEventManager().dispatchDeviceAdded(cachedDevice); + final CachedBluetoothDeviceManager deviceManager = + mBtManager.getCachedDeviceManager(); + deviceManager.switchRelationshipFromMemberToMain(device); + device.refresh(); return true; } } 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 4b3820eb0444..1791dce6021f 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 @@ -604,4 +604,87 @@ public class CachedBluetoothDeviceManagerTest { verify(mDevice2).setPhonebookAccessPermission(BluetoothDevice.ACCESS_ALLOWED); verify(mDevice2).createBond(BluetoothDevice.TRANSPORT_LE); } + + @Test + public void switchRelationshipFromMemberToMain_switchesMainDevice_switchesSuccessful() { + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice1); + CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1); + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice2); + doReturn(CAP_GROUP2).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice3); + CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2); + CachedBluetoothDevice cachedDevice3 = mCachedDeviceManager.addDevice(mDevice3); + assertThat(mCachedDeviceManager.isSubDevice(mDevice1)).isFalse(); + assertThat(mCachedDeviceManager.isSubDevice(mDevice2)).isTrue(); + assertThat(mCachedDeviceManager.isSubDevice(mDevice3)).isFalse(); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isTrue(); + + mCachedDeviceManager.switchRelationshipFromMemberToMain(cachedDevice2); + + assertThat(mCachedDeviceManager.isSubDevice(mDevice1)).isTrue(); + assertThat(mCachedDeviceManager.isSubDevice(mDevice2)).isFalse(); + assertThat(mCachedDeviceManager.isSubDevice(mDevice3)).isFalse(); + assertThat(cachedDevice2.getMemberDevice().contains(cachedDevice1)).isTrue(); + } + + @Test + public void switchRelationshipFromMemberToMain_moreMembersCase_switchesSuccessful() { + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice1); + CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1); + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice2); + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice3); + CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2); + CachedBluetoothDevice cachedDevice3 = mCachedDeviceManager.addDevice(mDevice3); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isTrue(); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue(); + + mCachedDeviceManager.switchRelationshipFromMemberToMain(cachedDevice2); + + assertThat(mCachedDeviceManager.isSubDevice(mDevice1)).isTrue(); + assertThat(mCachedDeviceManager.isSubDevice(mDevice2)).isFalse(); + assertThat(mCachedDeviceManager.isSubDevice(mDevice3)).isTrue(); + assertThat(cachedDevice2.getMemberDevice().contains(cachedDevice1)).isTrue(); + assertThat(cachedDevice2.getMemberDevice().contains(cachedDevice3)).isTrue(); + } + + @Test + public void switchRelationshipFromMemberToMain_inputDeviceIsMainDevice_doesNotChangelist() { + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice1); + CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1); + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice2); + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice3); + CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2); + CachedBluetoothDevice cachedDevice3 = mCachedDeviceManager.addDevice(mDevice3); + Collection<CachedBluetoothDevice> devices = mCachedDeviceManager.getCachedDevicesCopy(); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isTrue(); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue(); + + mCachedDeviceManager.switchRelationshipFromMemberToMain(cachedDevice1); + + devices = mCachedDeviceManager.getCachedDevicesCopy(); + assertThat(devices).contains(cachedDevice1); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isTrue(); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue(); + } + + @Test + public void switchRelationshipFromMemberToMain_inputDeviceNotInMemberList_doesNotChangelist() { + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice1); + CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1); + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice2); + doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice3); + CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2); + cachedDevice1.getMemberDevice().remove(cachedDevice2); + CachedBluetoothDevice cachedDevice3 = mCachedDeviceManager.addDevice(mDevice3); + Collection<CachedBluetoothDevice> devices = mCachedDeviceManager.getCachedDevicesCopy(); + + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isFalse(); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue(); + + mCachedDeviceManager.switchRelationshipFromMemberToMain(cachedDevice2); + + devices = mCachedDeviceManager.getCachedDevicesCopy(); + assertThat(devices).contains(cachedDevice1); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isFalse(); + assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue(); + } } 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 1c179f838586..ff1af92d71fe 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 @@ -1138,25 +1138,6 @@ public class CachedBluetoothDeviceTest { } @Test - public void switchMemberDeviceContent_switchMainDevice_switchesSuccessful() { - mCachedDevice.mRssi = RSSI_1; - mCachedDevice.mJustDiscovered = JUSTDISCOVERED_1; - mSubCachedDevice.mRssi = RSSI_2; - mSubCachedDevice.mJustDiscovered = JUSTDISCOVERED_2; - mCachedDevice.addMemberDevice(mSubCachedDevice); - - mCachedDevice.switchMemberDeviceContent(mSubCachedDevice); - - assertThat(mCachedDevice.mRssi).isEqualTo(RSSI_2); - assertThat(mCachedDevice.mJustDiscovered).isEqualTo(JUSTDISCOVERED_2); - assertThat(mCachedDevice.mDevice).isEqualTo(mSubDevice); - assertThat(mSubCachedDevice.mRssi).isEqualTo(RSSI_1); - assertThat(mSubCachedDevice.mJustDiscovered).isEqualTo(JUSTDISCOVERED_1); - assertThat(mSubCachedDevice.mDevice).isEqualTo(mDevice); - assertThat(mCachedDevice.getMemberDevice().contains(mSubCachedDevice)).isTrue(); - } - - @Test public void isConnectedHearingAidDevice_isConnectedAshaHearingAidDevice_returnTrue() { when(mProfileManager.getHearingAidProfile()).thenReturn(mHearingAidProfile); |