From 37289dfa671d89446efc135f9f043a55047ec130 Mon Sep 17 00:00:00 2001 From: SongFerngWang Date: Wed, 23 Mar 2022 14:55:39 +0800 Subject: Add "Broadcast" button at output switcher MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.Add ”Broadcast“ button at output switcher. like the UX mock P9. 2.If the user launches the the broadcast at first time, then the UI shows the educational dialog. like the UX mock P8. Bug: 227109903 Test: manual test Change-Id: Icc4272b3f37e5ed68280a5a5a5efabb766a683e0 --- .../media/dialog/MediaOutputBaseDialog.java | 35 ++++++++++++++++++++++ .../media/dialog/MediaOutputBroadcastDialog.java | 2 +- .../media/dialog/MediaOutputController.java | 29 ++++++++++++++++++ .../systemui/media/dialog/MediaOutputDialog.java | 17 +++++++++-- 4 files changed, 80 insertions(+), 3 deletions(-) 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 dcb1c7c4637c..bde772d95674 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java @@ -21,6 +21,7 @@ import static android.view.WindowInsets.Type.statusBars; import android.app.WallpaperColors; import android.content.Context; +import android.content.SharedPreferences; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -35,6 +36,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; @@ -65,6 +67,8 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog implements private static final String TAG = "MediaOutputDialog"; private static final String EMPTY_TITLE = " "; + private static final String PREF_NAME = "MediaOutputDialog"; + private static final String PREF_IS_LE_BROADCAST_FIRST_LAUNCH = "PrefIsLeBroadcastFirstLaunch"; private final Handler mMainThreadHandler = new Handler(Looper.getMainLooper()); private final RecyclerView.LayoutManager mLayoutManager; @@ -252,6 +256,33 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog implements } // Show when remote media session is available mStopButton.setVisibility(getStopButtonVisibility()); + if (isBroadcastSupported() && mMediaOutputController.isPlaying()) { + mStopButton.setText(R.string.media_output_broadcast); + mStopButton.setOnClickListener(v -> { + SharedPreferences sharedPref = mContext.getSharedPreferences(PREF_NAME, + Context.MODE_PRIVATE); + + if (sharedPref != null + && sharedPref.getBoolean(PREF_IS_LE_BROADCAST_FIRST_LAUNCH, true)) { + Log.d(TAG, "PREF_IS_LE_BROADCAST_FIRST_LAUNCH: true"); + + mMediaOutputController.launchLeBroadcastNotifyDialog(mDialogView, + mBroadcastSender, + MediaOutputController.BroadcastNotifyDialog.ACTION_FIRST_LAUNCH); + SharedPreferences.Editor editor = sharedPref.edit(); + editor.putBoolean(PREF_IS_LE_BROADCAST_FIRST_LAUNCH, false); + editor.apply(); + } else { + mMediaOutputController.launchMediaOutputBroadcastDialog(mDialogView, + mBroadcastSender); + } + }); + } else { + mStopButton.setOnClickListener(v -> { + mMediaOutputController.releaseSession(); + dismiss(); + }); + } } private Drawable resizeDrawable(Drawable drawable, int size) { @@ -284,6 +315,10 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog implements abstract int getStopButtonVisibility(); + public boolean isBroadcastSupported() { + return false; + } + @Override public void onMediaChanged() { mMainThreadHandler.post(() -> refresh()); diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBroadcastDialog.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBroadcastDialog.java index c277c334d9c4..494dae0532dc 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBroadcastDialog.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBroadcastDialog.java @@ -228,7 +228,7 @@ public class MediaOutputBroadcastDialog extends MediaOutputBaseDialog { * that convert BluetoothLeBroadcastMetadata object to String format. */ private String getBroadcastMetaData() { - return ""; + return "TEST"; } /** 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 97e79e9cab1b..807f0f1bb0ba 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java @@ -58,7 +58,9 @@ import androidx.mediarouter.media.MediaRouterParams; import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.Utils; import com.android.settingslib.bluetooth.BluetoothUtils; +import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.LocalBluetoothManager; +import com.android.settingslib.media.BluetoothMediaDevice; import com.android.settingslib.media.InfoMediaManager; import com.android.settingslib.media.LocalMediaManager; import com.android.settingslib.media.MediaDevice; @@ -683,6 +685,20 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, || features.contains(MediaRoute2Info.FEATURE_REMOTE_GROUP_PLAYBACK)); } + boolean isBluetoothLeDevice(@NonNull MediaDevice device) { + if (device instanceof BluetoothMediaDevice) { + final CachedBluetoothDevice cachedDevice = + ((BluetoothMediaDevice) device).getCachedDevice(); + boolean isConnectedLeAudioDevice = + (cachedDevice != null) ? cachedDevice.isConnectedLeAudioDevice() : false; + if (DEBUG) { + Log.d(TAG, "isConnectedLeAudioDevice=" + isConnectedLeAudioDevice); + } + return isConnectedLeAudioDevice; + } + return false; + } + private boolean isPlayBackInfoLocal() { return mMediaController != null && mMediaController.getPlaybackInfo() != null @@ -690,6 +706,19 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, == MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL; } + boolean isPlaying() { + if (mMediaController == null) { + return false; + } + + PlaybackState state = mMediaController.getPlaybackState(); + if (state == null) { + return false; + } + + return (state.getState() == PlaybackState.STATE_PLAYING); + } + boolean isVolumeControlEnabled(@NonNull MediaDevice device) { return isPlayBackInfoLocal() || mLocalMediaManager.isMediaSessionAvailableForVolumeControl(); diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialog.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialog.java index 7834ec0fa17f..3cffd0266ac8 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialog.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialog.java @@ -27,6 +27,7 @@ import androidx.core.graphics.drawable.IconCompat; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEventLogger; +import com.android.settingslib.media.MediaDevice; import com.android.systemui.R; import com.android.systemui.broadcast.BroadcastSender; import com.android.systemui.dagger.SysUISingleton; @@ -87,8 +88,20 @@ public class MediaOutputDialog extends MediaOutputBaseDialog { @Override int getStopButtonVisibility() { - return mMediaOutputController.isActiveRemoteDevice( - mMediaOutputController.getCurrentConnectedMediaDevice()) ? View.VISIBLE : View.GONE; + boolean isActiveRemoteDevice = mMediaOutputController.isActiveRemoteDevice( + mMediaOutputController.getCurrentConnectedMediaDevice()); + boolean isBroadCastSupported = isBroadcastSupported(); + + return (isActiveRemoteDevice || isBroadCastSupported) ? View.VISIBLE : View.GONE; + } + + @Override + public boolean isBroadcastSupported() { + MediaDevice device = mMediaOutputController.getCurrentConnectedMediaDevice(); + if (device == null) { + return false; + } + return mMediaOutputController.isBluetoothLeDevice(device); } @VisibleForTesting -- cgit v1.2.3-59-g8ed1b