diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java index bf6975714acd2..01d581ed28dbc 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java @@ -303,6 +303,18 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { } public BluetoothLeBroadcastMetadata getLatestBluetoothLeBroadcastMetadata() { + if (mService == null) { + Log.d(TAG, "The BluetoothLeBroadcast is null"); + return null; + } + if (mBluetoothLeBroadcastMetadata == null) { + final List metadataList = + mService.getAllBroadcastMetadata(); + mBluetoothLeBroadcastMetadata = metadataList.stream() + .filter(i -> i.getBroadcastId() == mBroadcastId) + .findFirst() + .orElse(null); + } return mBluetoothLeBroadcastMetadata; } @@ -372,7 +384,12 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { } public LocalBluetoothLeBroadcastMetadata getLocalBluetoothLeBroadcastMetaData() { - return new LocalBluetoothLeBroadcastMetadata(mBluetoothLeBroadcastMetadata); + final BluetoothLeBroadcastMetadata metadata = getLatestBluetoothLeBroadcastMetadata(); + if (metadata == null) { + Log.d(TAG, "The BluetoothLeBroadcastMetadata is null."); + return null; + } + return new LocalBluetoothLeBroadcastMetadata(metadata); } public boolean isProfileReady() { diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java index 1d773a1984deb..7e263d8d5b738 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java @@ -101,6 +101,7 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog implements private int mListMaxHeight; private WallpaperColors mWallpaperColors; private Executor mExecutor; + private boolean mShouldLaunchLeBroadcastDialog; MediaOutputBaseAdapter mAdapter; @@ -399,7 +400,9 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog implements } public void handleLeBroadcastStarted() { - startLeBroadcastDialog(); + // Waiting for the onBroadcastMetadataChanged. The UI launchs the broadcast dialog when + // the metadata is ready. + mShouldLaunchLeBroadcastDialog = true; } public void handleLeBroadcastStartFailed() { @@ -409,10 +412,15 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog implements } public void handleLeBroadcastMetadataChanged() { + if (mShouldLaunchLeBroadcastDialog) { + startLeBroadcastDialog(); + mShouldLaunchLeBroadcastDialog = false; + } refresh(); } public void handleLeBroadcastStopped() { + mShouldLaunchLeBroadcastDialog = false; refresh(); } diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java index 7e58a83c56970..27095b3882a4c 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java @@ -62,6 +62,7 @@ import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.Utils; import com.android.settingslib.bluetooth.BluetoothUtils; import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast; +import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastMetadata; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.media.InfoMediaManager; import com.android.settingslib.media.LocalMediaManager; @@ -816,7 +817,9 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, Log.d(TAG, "getBroadcastMetadata: LE Audio Broadcast is null"); return ""; } - return broadcast.getLocalBluetoothLeBroadcastMetaData().convertToQrCodeString(); + final LocalBluetoothLeBroadcastMetadata metadata = + broadcast.getLocalBluetoothLeBroadcastMetaData(); + return metadata != null ? metadata.convertToQrCodeString() : ""; } boolean isActiveRemoteDevice(@NonNull MediaDevice device) {