From 6093be73aab570cbef75bb29d27fd49ea099cbd9 Mon Sep 17 00:00:00 2001 From: SongFerngWang Date: Thu, 25 Aug 2022 13:05:57 +0800 Subject: [PATCH] [BT LE unicast] clear the GroupId when user click 'Forget' - To clear the groupId after device unpaired. - switchMemberDeviceContent don't change the member list. Bug: 240103816 Test: build pass. [pass] make RunSettingsLibRoboTests -j40 ROBOTEST_FILTER=CachedBluetoothDeviceManagerTest [psss] make RunSettingsLibRoboTests -j40 ROBOTEST_FILTER=CachedBluetoothDeviceTest Change-Id: I65dc254f33236fa7fad08a07e56187962700e6c6 --- .../bluetooth/BluetoothEventManager.java | 6 ++++++ .../bluetooth/CachedBluetoothDevice.java | 10 ++++------ .../CachedBluetoothDeviceManager.java | 3 +++ .../bluetooth/CsipDeviceManager.java | 5 +++-- .../CachedBluetoothDeviceManagerTest.java | 13 ++++++++++++- .../bluetooth/CachedBluetoothDeviceTest.java | 19 +++++++++++++++++++ 6 files changed, 47 insertions(+), 9 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java index 62c83cf04a4fa..51812f0439086 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java @@ -367,8 +367,14 @@ public class BluetoothEventManager { if (bondState == BluetoothDevice.BOND_NONE) { // Check if we need to remove other Coordinated set member devices / Hearing Aid // devices + if (DEBUG) { + Log.d(TAG, "BondStateChangedHandler: cachedDevice.getGroupId() = " + + cachedDevice.getGroupId() + ", cachedDevice.getHiSyncId()= " + + cachedDevice.getHiSyncId()); + } if (cachedDevice.getGroupId() != BluetoothCsipSetCoordinator.GROUP_ID_INVALID || cachedDevice.getHiSyncId() != BluetoothHearingAid.HI_SYNC_ID_INVALID) { + Log.d(TAG, "BondStateChangedHandler: Start onDeviceUnpaired"); mDeviceManager.onDeviceUnpaired(cachedDevice); } int reason = intent.getIntExtra(BluetoothDevice.EXTRA_UNBOND_REASON, diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index 32d5b787489a6..3ca94dba027ee 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -1431,11 +1431,10 @@ public class CachedBluetoothDevice implements Comparable * first connected device in the coordinated set, and then switch the content of the main * device and member devices. * - * @param prevMainDevice the previous Main device, it will be added into the member device set. - * @param newMainDevice the new Main device, it will be removed from the member device set. + * @param newMainDevice the new Main device which is from the previous main device's member + * list. */ - public void switchMemberDeviceContent(CachedBluetoothDevice prevMainDevice, - CachedBluetoothDevice newMainDevice) { + public void switchMemberDeviceContent(CachedBluetoothDevice newMainDevice) { // Backup from main device final BluetoothDevice tmpDevice = mDevice; final short tmpRssi = mRssi; @@ -1444,8 +1443,7 @@ public class CachedBluetoothDevice implements Comparable mDevice = newMainDevice.mDevice; mRssi = newMainDevice.mRssi; mJustDiscovered = newMainDevice.mJustDiscovered; - addMemberDevice(prevMainDevice); - mMemberDevices.remove(newMainDevice); + // Set sub device from backup newMainDevice.mDevice = tmpDevice; newMainDevice.mRssi = tmpRssi; diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java index cd3242a9f7c2d..26a2080264118 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java @@ -17,6 +17,7 @@ package com.android.settingslib.bluetooth; import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothCsipSetCoordinator; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.content.Context; @@ -317,12 +318,14 @@ public class CachedBluetoothDeviceManager { } public synchronized void onDeviceUnpaired(CachedBluetoothDevice device) { + device.setGroupId(BluetoothCsipSetCoordinator.GROUP_ID_INVALID); CachedBluetoothDevice mainDevice = mCsipDeviceManager.findMainDevice(device); final Set memberDevices = device.getMemberDevice(); if (!memberDevices.isEmpty()) { // Main device is unpaired, to unpair the member device for (CachedBluetoothDevice memberDevice : memberDevices) { memberDevice.unpair(); + memberDevice.setGroupId(BluetoothCsipSetCoordinator.GROUP_ID_INVALID); device.removeMemberDevice(memberDevice); } } else if (mainDevice != null) { diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java index fc70ba40fb476..9b38238ca8b8e 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java @@ -231,7 +231,7 @@ public class CsipDeviceManager { // 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(mainDevice, cachedDevice); + mainDevice.switchMemberDeviceContent(cachedDevice); mainDevice.refresh(); // It is necessary to do remove and add for updating the mapping on // preference and device @@ -255,10 +255,11 @@ 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); + cachedDevice.switchMemberDeviceContent(device); cachedDevice.refresh(); // It is necessary to do remove and add for updating the mapping on // preference and device 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 bef1d9cbcde1a..62552f9144594 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 @@ -25,6 +25,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.bluetooth.BluetoothClass; +import android.bluetooth.BluetoothCsipSetCoordinator; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothUuid; import android.content.Context; @@ -518,7 +519,8 @@ public class CachedBluetoothDeviceManagerTest { */ @Test public void onDeviceUnpaired_unpairCsipMainDevice() { - when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_NONE); + when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1); CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2); cachedDevice1.setGroupId(1); @@ -527,7 +529,12 @@ public class CachedBluetoothDeviceManagerTest { // Call onDeviceUnpaired for the one in mCachedDevices. mCachedDeviceManager.onDeviceUnpaired(cachedDevice1); + verify(mDevice2).removeBond(); + assertThat(cachedDevice1.getGroupId()).isEqualTo( + BluetoothCsipSetCoordinator.GROUP_ID_INVALID); + assertThat(cachedDevice2.getGroupId()).isEqualTo( + BluetoothCsipSetCoordinator.GROUP_ID_INVALID); } /** @@ -536,6 +543,7 @@ public class CachedBluetoothDeviceManagerTest { @Test public void onDeviceUnpaired_unpairCsipSubDevice() { when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_NONE); CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1); CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2); cachedDevice1.setGroupId(1); @@ -544,7 +552,10 @@ public class CachedBluetoothDeviceManagerTest { // Call onDeviceUnpaired for the one in mCachedDevices. mCachedDeviceManager.onDeviceUnpaired(cachedDevice2); + verify(mDevice1).removeBond(); + assertThat(cachedDevice2.getGroupId()).isEqualTo( + BluetoothCsipSetCoordinator.GROUP_ID_INVALID); } /** 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 76c066cd029e6..79e99387b2fa0 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 @@ -1050,4 +1050,23 @@ 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(); + } }