diff options
author | 2025-03-20 15:08:33 +0800 | |
---|---|---|
committer | 2025-03-20 15:52:17 +0800 | |
commit | 11a0ee96606234ece4ca046a92b38207d1046148 (patch) | |
tree | 34634cb8e635332b275ccb1d5f34ac2f01b4b183 /packages/SettingsLib | |
parent | daa6e12a0b1e75c28cdb26870167cce7fc9c9267 (diff) |
[Audiosharing] Remove source for sinks disconnected/unpaired from Settings
Test: atest
Bug: 404299137
Flag: com.android.settingslib.flags.enable_le_audio_sharing
Change-Id: I4c0e5e23ea16676062eff4bf6e618ff7c58afaaf
Diffstat (limited to 'packages/SettingsLib')
2 files changed, 80 insertions, 0 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index e81c8220d707..78b307e7b816 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -25,6 +25,7 @@ import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothCsipSetCoordinator; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHearingAid; +import android.bluetooth.BluetoothLeBroadcastReceiveState; import android.bluetooth.BluetoothProfile; import android.bluetooth.BluetoothUuid; import android.content.Context; @@ -58,6 +59,7 @@ import com.android.settingslib.flags.Flags; import com.android.settingslib.utils.ThreadUtils; import com.android.settingslib.widget.AdaptiveOutlineDrawable; +import com.google.common.collect.ImmutableSet; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -397,6 +399,9 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> } } Log.d(TAG, "Disconnect " + this); + if (Flags.enableLeAudioSharing()) { + removeBroadcastSource(ImmutableSet.of(mDevice)); + } mDevice.disconnect(); } // Disconnect PBAP server in case its connected @@ -609,6 +614,16 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> final BluetoothDevice dev = mDevice; if (dev != null) { mUnpairing = true; + if (Flags.enableLeAudioSharing()) { + Set<BluetoothDevice> devicesToRemoveSource = new HashSet<>(); + devicesToRemoveSource.add(dev); + if (getGroupId() != BluetoothCsipSetCoordinator.GROUP_ID_INVALID) { + for (CachedBluetoothDevice member : getMemberDevice()) { + devicesToRemoveSource.add(member.getDevice()); + } + } + removeBroadcastSource(devicesToRemoveSource); + } final boolean successful = dev.removeBond(); if (successful) { releaseLruCache(); @@ -623,6 +638,25 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> } } + @WorkerThread + private void removeBroadcastSource(Set<BluetoothDevice> devices) { + if (mProfileManager == null || devices.isEmpty()) return; + LocalBluetoothLeBroadcast broadcast = mProfileManager.getLeAudioBroadcastProfile(); + LocalBluetoothLeBroadcastAssistant assistant = + mProfileManager.getLeAudioBroadcastAssistantProfile(); + if (broadcast != null && assistant != null && broadcast.isEnabled(null)) { + for (BluetoothDevice device : devices) { + for (BluetoothLeBroadcastReceiveState state : assistant.getAllSources(device)) { + if (BluetoothUtils.D) { + Log.d(TAG, "Remove broadcast source " + state.getBroadcastId() + + " from device " + device.getAnonymizedAddress()); + } + assistant.removeSource(device, state.getSourceId()); + } + } + } + } + public int getProfileConnectionState(LocalBluetoothProfile profile) { return profile != null ? profile.getConnectionStatus(mDevice) 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 635010ec824d..146b66737e83 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 @@ -2383,6 +2383,52 @@ public class CachedBluetoothDeviceTest { Integer.parseInt(TWS_BATTERY_LEFT)); } + @Test + public void disconnect_removeBroadcastSource() { + when(mCachedDevice.getGroupId()).thenReturn(1); + when(mSubCachedDevice.getGroupId()).thenReturn(1); + mCachedDevice.addMemberDevice(mSubCachedDevice); + LocalBluetoothLeBroadcast broadcast = mock(LocalBluetoothLeBroadcast.class); + LocalBluetoothLeBroadcastAssistant assistant = mock( + LocalBluetoothLeBroadcastAssistant.class); + when(mProfileManager.getLeAudioBroadcastProfile()).thenReturn(broadcast); + when(mProfileManager.getLeAudioBroadcastAssistantProfile()).thenReturn(assistant); + when(broadcast.isEnabled(null)).thenReturn(true); + BluetoothLeBroadcastReceiveState state = mock(BluetoothLeBroadcastReceiveState.class); + when(state.getSourceId()).thenReturn(1); + when(assistant.getAllSources(mDevice)).thenReturn(ImmutableList.of(state)); + when(assistant.getAllSources(mSubDevice)).thenReturn(ImmutableList.of(state)); + + mCachedDevice.disconnect(); + verify(assistant).removeSource(mDevice, /* sourceId= */1); + verify(assistant).removeSource(mSubDevice, /* sourceId= */1); + verify(mDevice).disconnect(); + verify(mSubDevice).disconnect(); + } + + @Test + public void unpair_removeBroadcastSource() { + when(mCachedDevice.getGroupId()).thenReturn(1); + when(mSubCachedDevice.getGroupId()).thenReturn(1); + mCachedDevice.addMemberDevice(mSubCachedDevice); + when(mCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + LocalBluetoothLeBroadcast broadcast = mock(LocalBluetoothLeBroadcast.class); + LocalBluetoothLeBroadcastAssistant assistant = mock( + LocalBluetoothLeBroadcastAssistant.class); + when(mProfileManager.getLeAudioBroadcastProfile()).thenReturn(broadcast); + when(mProfileManager.getLeAudioBroadcastAssistantProfile()).thenReturn(assistant); + when(broadcast.isEnabled(null)).thenReturn(true); + BluetoothLeBroadcastReceiveState state = mock(BluetoothLeBroadcastReceiveState.class); + when(state.getSourceId()).thenReturn(1); + when(assistant.getAllSources(mDevice)).thenReturn(ImmutableList.of(state)); + when(assistant.getAllSources(mSubDevice)).thenReturn(ImmutableList.of(state)); + + mCachedDevice.unpair(); + verify(assistant).removeSource(mDevice, /* sourceId= */1); + verify(assistant).removeSource(mSubDevice, /* sourceId= */1); + verify(mDevice).removeBond(); + } + private void updateProfileStatus(LocalBluetoothProfile profile, int status) { doReturn(status).when(profile).getConnectionStatus(mDevice); mCachedDevice.onProfileStateChanged(profile, status); |