summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java28
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java53
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java24
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java83
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java19
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);