diff --git a/packages/SystemUI/res/layout/media_carousel.xml b/packages/SystemUI/res/layout/media_carousel.xml new file mode 100644 index 0000000000000..e91f840fe238f --- /dev/null +++ b/packages/SystemUI/res/layout/media_carousel.xml @@ -0,0 +1,35 @@ + + + + + + + + + diff --git a/packages/SystemUI/src/com/android/systemui/qs/DoubleLineTileLayout.kt b/packages/SystemUI/src/com/android/systemui/qs/DoubleLineTileLayout.kt index f710f7fc47e2b..f66a1ece18686 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/DoubleLineTileLayout.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/DoubleLineTileLayout.kt @@ -68,7 +68,7 @@ class DoubleLineTileLayout(context: Context) : ViewGroup(context), QSPanel.QSTil override fun updateResources(): Boolean { with(mContext.resources) { smallTileSize = getDimensionPixelSize(R.dimen.qs_quick_tile_size) - cellMarginHorizontal = getDimensionPixelSize(R.dimen.qs_tile_margin_horizontal) + cellMarginHorizontal = getDimensionPixelSize(R.dimen.qs_tile_margin_horizontal) / 2 cellMarginVertical = getDimensionPixelSize(R.dimen.new_qs_vertical_margin) } requestLayout() diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSMediaPlayer.java b/packages/SystemUI/src/com/android/systemui/qs/QSMediaPlayer.java index f7e4c794836e7..1077834e7146a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSMediaPlayer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSMediaPlayer.java @@ -124,7 +124,7 @@ public class QSMediaPlayer { } } }); - btn.setImageDrawable(mContext.getResources().getDrawable(R.drawable.lb_ic_replay)); + btn.setImageDrawable(mContext.getResources().getDrawable(R.drawable.lb_ic_play)); btn.setImageTintList(ColorStateList.valueOf(mForegroundColor)); btn.setVisibility(View.VISIBLE); @@ -199,8 +199,7 @@ public class QSMediaPlayer { List info = pm.queryBroadcastReceiversAsUser(it, 0, mContext.getUser()); if (info != null) { for (ResolveInfo inf : info) { - if (inf.activityInfo.packageName.equals(notif.contentIntent.getCreatorPackage())) { - Log.d(TAG, "Found receiver for package: " + inf); + if (inf.activityInfo.packageName.equals(mController.getPackageName())) { mRecvComponent = inf.getComponentInfo().getComponentName(); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 51e352b30019b..35b8312ba25c9 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -184,21 +184,10 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne // Add media carousel if (useQsMediaPlayer(context)) { - HorizontalScrollView mediaScrollView = new HorizontalScrollView(mContext); - mediaScrollView.setHorizontalScrollBarEnabled(false); - int playerHeight = (int) getResources().getDimension(R.dimen.qs_media_height); - int padding = (int) getResources().getDimension(R.dimen.qs_media_padding); - LayoutParams lpView = new LayoutParams(LayoutParams.MATCH_PARENT, playerHeight); - lpView.setMarginStart(padding); - lpView.setMarginEnd(padding); - addView(mediaScrollView, lpView); - - LayoutParams lpCarousel = new LayoutParams(LayoutParams.MATCH_PARENT, - LayoutParams.WRAP_CONTENT); - mMediaCarousel = new LinearLayout(mContext); - mMediaCarousel.setOrientation(LinearLayout.HORIZONTAL); - mediaScrollView.addView(mMediaCarousel, lpCarousel); - mediaScrollView.setVisibility(View.GONE); + HorizontalScrollView mediaScrollView = (HorizontalScrollView) LayoutInflater.from( + mContext).inflate(R.layout.media_carousel, this, false); + mMediaCarousel = mediaScrollView.findViewById(R.id.media_carousel); + addView(mediaScrollView); } else { mMediaCarousel = null; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSMediaPlayer.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSMediaPlayer.java index d40e25064352d..cec1cb2fb53b3 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSMediaPlayer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSMediaPlayer.java @@ -106,7 +106,7 @@ public class QuickQSMediaPlayer { } } }); - btn.setImageDrawable(mContext.getResources().getDrawable(R.drawable.lb_ic_replay)); + btn.setImageDrawable(mContext.getResources().getDrawable(R.drawable.lb_ic_play)); btn.setImageTintList(ColorStateList.valueOf(mForegroundColor)); btn.setVisibility(View.VISIBLE); } @@ -136,14 +136,25 @@ public class QuickQSMediaPlayer { * @param actionsContainer a LinearLayout containing the media action buttons * @param actionsToShow indices of which actions to display in the mini player * (max 3: Notification.MediaStyle.MAX_MEDIA_BUTTONS_IN_COMPACT) + * @param contentIntent Intent to send when user taps on the view */ public void setMediaSession(MediaSession.Token token, Icon icon, int iconColor, int bgColor, - View actionsContainer, int[] actionsToShow) { - Log.d(TAG, "Setting media session: " + token); + View actionsContainer, int[] actionsToShow, PendingIntent contentIntent) { mToken = token; mForegroundColor = iconColor; mBackgroundColor = bgColor; - mController = new MediaController(mContext, token); + + String oldPackage = ""; + if (mController != null) { + oldPackage = mController.getPackageName(); + } + MediaController controller = new MediaController(mContext, token); + boolean samePlayer = mToken.equals(token) && oldPackage.equals(controller.getPackageName()); + if (mController != null && !samePlayer && !isPlaying(controller)) { + // Only update if this is a different session and currently playing + return; + } + mController = controller; MediaMetadata mMediaMetadata = mController.getMetadata(); // Try to find a receiver for the media button that matches this app @@ -153,7 +164,6 @@ public class QuickQSMediaPlayer { if (info != null) { for (ResolveInfo inf : info) { if (inf.activityInfo.packageName.equals(mController.getPackageName())) { - Log.d(TAG, "Found receiver for package: " + inf); mRecvComponent = inf.getComponentInfo().getComponentName(); } } @@ -165,6 +175,16 @@ public class QuickQSMediaPlayer { return; } + // Action + mMediaNotifView.setOnClickListener(v -> { + try { + contentIntent.send(); + mContext.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); + } catch (PendingIntent.CanceledException e) { + Log.e(TAG, "Pending intent was canceled: " + e.getMessage()); + } + }); + // Album art addAlbumArtBackground(mMediaMetadata, mBackgroundColor); @@ -237,12 +257,12 @@ public class QuickQSMediaPlayer { * Check whether the media controlled by this player is currently playing * @return whether it is playing, or false if no controller information */ - public boolean isPlaying() { - if (mController == null) { + public boolean isPlaying(MediaController controller) { + if (controller == null) { return false; } - PlaybackState state = mController.getPlaybackState(); + PlaybackState state = controller.getPlaybackState(); if (state == null) { return false; } @@ -261,12 +281,11 @@ public class QuickQSMediaPlayer { private void addAlbumArtBackground(MediaMetadata metadata, int bgColor) { Bitmap albumArt = metadata.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART); float radius = mContext.getResources().getDimension(R.dimen.qs_media_corner_radius); - if (albumArt != null) { - Rect bounds = new Rect(); - mMediaNotifView.getBoundsOnScreen(bounds); - int width = bounds.width(); - int height = bounds.height(); - + Rect bounds = new Rect(); + mMediaNotifView.getBoundsOnScreen(bounds); + int width = bounds.width(); + int height = bounds.height(); + if (albumArt != null && width > 0 && height > 0) { Bitmap original = albumArt.copy(Bitmap.Config.ARGB_8888, true); Bitmap scaled = scaleBitmap(original, width, height); Canvas canvas = new Canvas(scaled); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index db52e7d37a922..b05d4fdf7db7d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -85,20 +85,19 @@ public class QuickQSPanel extends QSPanel { mHorizontalLinearLayout.setClipChildren(false); mHorizontalLinearLayout.setClipToPadding(false); - LayoutParams lp = new LayoutParams(0, LayoutParams.MATCH_PARENT, 1); - mTileLayout = new DoubleLineTileLayout(context); mMediaTileLayout = mTileLayout; mRegularTileLayout = new HeaderTileLayout(context); + LayoutParams lp = new LayoutParams(0, LayoutParams.MATCH_PARENT, 1); lp.setMarginEnd(10); lp.setMarginStart(0); mHorizontalLinearLayout.addView((View) mTileLayout, lp); mMediaPlayer = new QuickQSMediaPlayer(mContext, mHorizontalLinearLayout); - - lp.setMarginEnd(0); - lp.setMarginStart(10); - mHorizontalLinearLayout.addView(mMediaPlayer.getView(), lp); + LayoutParams lp2 = new LayoutParams(0, LayoutParams.MATCH_PARENT, 1); + lp2.setMarginEnd(0); + lp2.setMarginStart(25); + mHorizontalLinearLayout.addView(mMediaPlayer.getView(), lp2); sDefaultMaxTiles = getResources().getInteger(R.integer.quick_qs_panel_max_columns); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java index 352ba0f75a32a..76fdfc6fbabcd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationMediaTemplateViewWrapper.java @@ -28,6 +28,7 @@ import android.media.session.MediaSession; import android.media.session.PlaybackState; import android.metrics.LogMaker; import android.os.Handler; +import android.service.notification.StatusBarNotification; import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.View; @@ -176,27 +177,30 @@ public class NotificationMediaTemplateViewWrapper extends NotificationTemplateVi final MediaSession.Token token = mRow.getEntry().getSbn().getNotification().extras .getParcelable(Notification.EXTRA_MEDIA_SESSION); - if (Utils.useQsMediaPlayer(mContext)) { + if (Utils.useQsMediaPlayer(mContext) && token != null) { final int[] compactActions = mRow.getEntry().getSbn().getNotification().extras .getIntArray(Notification.EXTRA_COMPACT_ACTIONS); int tintColor = getNotificationHeader().getOriginalIconColor(); StatusBarWindowController ctrl = Dependency.get(StatusBarWindowController.class); QuickQSPanel panel = ctrl.getStatusBarView().findViewById( com.android.systemui.R.id.quick_qs_panel); + StatusBarNotification sbn = mRow.getEntry().getSbn(); + Notification notif = sbn.getNotification(); panel.getMediaPlayer().setMediaSession(token, - mRow.getEntry().getSbn().getNotification().getSmallIcon(), + notif.getSmallIcon(), tintColor, mBackgroundColor, mActions, - compactActions); + compactActions, + notif.contentIntent); QSPanel bigPanel = ctrl.getStatusBarView().findViewById( com.android.systemui.R.id.quick_settings_panel); bigPanel.addMediaSession(token, - mRow.getEntry().getSbn().getNotification().getSmallIcon(), + notif.getSmallIcon(), tintColor, mBackgroundColor, mActions, - mRow.getEntry().getSbn()); + sbn); } boolean showCompactSeekbar = mMediaManager.getShowCompactMediaSeekbar();