From 87e6d6e32c4f1bf36606ddfe11063102575234dd Mon Sep 17 00:00:00 2001 From: Yiyi Shen Date: Mon, 4 Dec 2023 17:51:55 +0800 Subject: [PATCH] [Audiosharing] Fix main sharing flow. Fetch the active device before starting the sharing. Because once the sharing is started, all devices connected will switch to inactive. Flagged with enable_le_audio_sharing Bug: 305620450 Test: manual Change-Id: Ie287d1094fe40dbcb42c121ea79409fc48e0eec7 --- .../AudioSharingSwitchBarController.java | 80 ++++++++++--------- 1 file changed, 44 insertions(+), 36 deletions(-) diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java index dc04bee013c..69a18e8d1a5 100644 --- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java +++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingSwitchBarController.java @@ -45,12 +45,16 @@ import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastAssistant; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.utils.ThreadUtils; +import com.google.common.collect.ImmutableList; + import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.concurrent.Executor; import java.util.concurrent.Executors; +import java.util.stream.Collectors; public class AudioSharingSwitchBarController extends BasePreferenceController implements DefaultLifecycleObserver, OnCheckedChangeListener { @@ -69,6 +73,9 @@ public class AudioSharingSwitchBarController extends BasePreferenceController private final Executor mExecutor; private final OnSwitchBarChangedListener mListener; private DashboardFragment mFragment; + private Map> mGroupedConnectedDevices = new HashMap<>(); + private List mTargetActiveSinks = new ArrayList<>(); + private ArrayList mDeviceItemsForSharing = new ArrayList<>(); @VisibleForTesting IntentFilter mIntentFilter; @VisibleForTesting @@ -114,24 +121,7 @@ public class AudioSharingSwitchBarController extends BasePreferenceController + broadcastId + ", metadata = " + metadata.getBroadcastName()); - Map> groupedConnectedDevices = - AudioSharingUtils.fetchConnectedDevicesByGroupId(mBtManager); - ArrayList deviceItems = - AudioSharingUtils.buildOrderedConnectedLeadAudioSharingDeviceItem( - mBtManager, - groupedConnectedDevices, - /* filterByInSharing= */ false); - // deviceItems is ordered. The active device is the first place if exits. - ArrayList deviceItemsForSharing = deviceItems; - if (!deviceItems.isEmpty() && deviceItems.get(0).isActive()) { - for (CachedBluetoothDevice device : - groupedConnectedDevices.get(deviceItems.get(0).getGroupId())) { - // If active device exists for audio sharing, share to it - // automatically once the broadcast is started. - addSourceToSink(device.getDevice()); - } - deviceItemsForSharing.remove(0); - } + addSourceToTargetSinks(mTargetActiveSinks); if (mFragment == null) { Log.w(TAG, "Dialog fail to show due to null fragment."); return; @@ -140,16 +130,16 @@ public class AudioSharingSwitchBarController extends BasePreferenceController () -> { AudioSharingDialogFragment.show( mFragment, - deviceItemsForSharing, + mDeviceItemsForSharing, item -> { - if (groupedConnectedDevices.containsKey( - item.getGroupId())) { - for (CachedBluetoothDevice device : - groupedConnectedDevices.get( - item.getGroupId())) { - addSourceToSink(device.getDevice()); - } - } + addSourceToTargetSinks( + mGroupedConnectedDevices + .getOrDefault( + item.getGroupId(), + ImmutableList.of()) + .stream() + .map(CachedBluetoothDevice::getDevice) + .collect(Collectors.toList())); }); }); } @@ -333,6 +323,22 @@ public class AudioSharingSwitchBarController extends BasePreferenceController mSwitchBar.setEnabled(true); return; } + mGroupedConnectedDevices = AudioSharingUtils.fetchConnectedDevicesByGroupId(mBtManager); + ArrayList deviceItems = + AudioSharingUtils.buildOrderedConnectedLeadAudioSharingDeviceItem( + mBtManager, mGroupedConnectedDevices, /* filterByInSharing= */ false); + // deviceItems is ordered. The active device is the first place if exits. + mDeviceItemsForSharing = new ArrayList<>(deviceItems); + if (!deviceItems.isEmpty() && deviceItems.get(0).isActive()) { + for (CachedBluetoothDevice device : + mGroupedConnectedDevices.getOrDefault( + deviceItems.get(0).getGroupId(), ImmutableList.of())) { + // If active device exists for audio sharing, share to it + // automatically once the broadcast is started. + mTargetActiveSinks.add(device.getDevice()); + } + mDeviceItemsForSharing.remove(0); + } // TODO: start broadcast with new API mBroadcast.startBroadcast("test", null); } @@ -367,8 +373,8 @@ public class AudioSharingSwitchBarController extends BasePreferenceController return mBroadcast != null && mBroadcast.isEnabled(null); } - private void addSourceToSink(BluetoothDevice sink) { - if (mBroadcast == null || mAssistant == null) { + private void addSourceToTargetSinks(List sinks) { + if (sinks.isEmpty() || mBroadcast == null || mAssistant == null) { Log.d(TAG, "Skip adding source to target."); return; } @@ -378,12 +384,14 @@ public class AudioSharingSwitchBarController extends BasePreferenceController Log.e(TAG, "Error: There is no broadcastMetadata."); return; } - Log.d( - TAG, - "Add broadcast with broadcastId: " - + broadcastMetadata.getBroadcastId() - + " to the device: " - + sink.getAnonymizedAddress()); - mAssistant.addSource(sink, broadcastMetadata, /* isGroupOp= */ false); + for (BluetoothDevice sink : sinks) { + Log.d( + TAG, + "Add broadcast with broadcastId: " + + broadcastMetadata.getBroadcastId() + + "to the device: " + + sink.getAnonymizedAddress()); + mAssistant.addSource(sink, broadcastMetadata, /* isGroupOp= */ false); + } } }