diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index 04168ce6d79a3..a3d632cfb82af 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -940,7 +940,6 @@ public class CachedBluetoothDevice implements Comparable + getName() + ", groupId=" + mGroupId - + ", member= " + mMemberDevices + ")"; } @@ -1494,6 +1493,33 @@ public class CachedBluetoothDevice implements Comparable mMemberDevices.remove(memberDevice); } + /** + * 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 */ diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java index 5d539d00f5123..f741f655bf7cc 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java @@ -463,59 +463,6 @@ 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 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 814c395865b11..20a6cd8e09ce2 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java @@ -238,10 +238,14 @@ public class CsipDeviceManager { mainDevice.refresh(); return true; } else { - final CachedBluetoothDeviceManager deviceManager = - mBtManager.getCachedDeviceManager(); - deviceManager.switchRelationshipFromMemberToMain(cachedDevice); - cachedDevice.refresh(); + // 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); return true; } } @@ -262,10 +266,14 @@ public class CsipDeviceManager { for (CachedBluetoothDevice device: memberSet) { if (device.isConnected()) { log("set device: " + device + " as the main device"); - final CachedBluetoothDeviceManager deviceManager = - mBtManager.getCachedDeviceManager(); - deviceManager.switchRelationshipFromMemberToMain(device); - device.refresh(); + // 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); 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 4b618ca06937c..f06623d0bd4a0 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,87 +604,4 @@ 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 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 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 ff1af92d71fe1..1c179f8385869 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 @@ -1137,6 +1137,25 @@ public class CachedBluetoothDeviceTest { assertThat(mCachedDevice.mDrawableCache.size()).isEqualTo(0); } + @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);