Merge "Update media long press menu" into tm-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
501f016364
27
packages/SystemUI/res/drawable/qs_media_solid_button.xml
Normal file
27
packages/SystemUI/res/drawable/qs_media_solid_button.xml
Normal file
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
~ Copyright (C) 2022 The Android Open Source Project
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License
|
||||
-->
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
|
||||
android:shape="rectangle">
|
||||
<solid android:color="?androidprv:attr/colorAccentPrimaryVariant" />
|
||||
<corners android:radius="24dp"/>
|
||||
<padding
|
||||
android:left="16dp"
|
||||
android:right="16dp"
|
||||
android:top="8dp"
|
||||
android:bottom="8dp" />
|
||||
</shape>
|
||||
@@ -264,7 +264,7 @@
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/qs_media_padding"
|
||||
android:layout_marginTop="0dp"
|
||||
android:layout_marginStart="@dimen/qs_media_padding"
|
||||
android:layout_marginEnd="@dimen/qs_media_padding"
|
||||
android:id="@+id/remove_text"
|
||||
@@ -274,64 +274,56 @@
|
||||
android:marqueeRepeatLimit="marquee_forever"
|
||||
android:text="@string/controls_media_close_session"
|
||||
android:gravity="center_horizontal|top"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/settings"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/cancel" />
|
||||
|
||||
<FrameLayout
|
||||
<ImageButton
|
||||
android:id="@+id/settings"
|
||||
android:background="@drawable/qs_media_light_source"
|
||||
android:src="@drawable/ic_settings"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginEnd="4dp"
|
||||
android:background="@drawable/qs_media_light_source"
|
||||
android:contentDescription="@string/controls_media_settings_button"
|
||||
android:layout_gravity="top"
|
||||
app:layout_constraintWidth_min="@dimen/min_clickable_item_size"
|
||||
app:layout_constraintHeight_min="@dimen/min_clickable_item_size"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
</ImageButton>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/dismiss"
|
||||
android:background="@drawable/qs_media_light_source"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/qs_media_padding"
|
||||
android:layout_marginEnd="@dimen/qs_media_action_spacing"
|
||||
android:layout_marginBottom="@dimen/qs_media_padding"
|
||||
app:layout_constrainedWidth="true"
|
||||
app:layout_constraintWidth_min="@dimen/min_clickable_item_size"
|
||||
app:layout_constraintHeight_min="@dimen/min_clickable_item_size"
|
||||
app:layout_constraintHorizontal_chainStyle="spread_inside"
|
||||
app:layout_constraintHorizontal_chainStyle="packed"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/cancel"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/remove_text">
|
||||
<TextView
|
||||
android:id="@+id/settings_text"
|
||||
android:id="@+id/dismiss_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center|bottom"
|
||||
style="@style/MediaPlayer.OutlineButton"
|
||||
android:text="@string/controls_media_settings_button" />
|
||||
android:layout_gravity="center|top"
|
||||
style="@style/MediaPlayer.SolidButton"
|
||||
android:background="@drawable/qs_media_solid_button"
|
||||
android:text="@string/controls_media_dismiss_button" />
|
||||
</FrameLayout>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/cancel"
|
||||
android:background="@drawable/qs_media_light_source"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/qs_media_action_spacing"
|
||||
android:layout_marginEnd="@dimen/qs_media_action_spacing"
|
||||
android:layout_marginBottom="@dimen/qs_media_padding"
|
||||
app:layout_constrainedWidth="true"
|
||||
app:layout_constraintWidth_min="@dimen/min_clickable_item_size"
|
||||
app:layout_constraintHeight_min="@dimen/min_clickable_item_size"
|
||||
app:layout_constraintStart_toEndOf="@id/settings"
|
||||
app:layout_constraintEnd_toStartOf="@id/dismiss"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/remove_text">
|
||||
<TextView
|
||||
android:id="@+id/cancel_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center|bottom"
|
||||
style="@style/MediaPlayer.OutlineButton"
|
||||
android:text="@string/cancel" />
|
||||
</FrameLayout>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/dismiss"
|
||||
android:background="@drawable/qs_media_light_source"
|
||||
android:layout_width="0dp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="@dimen/qs_media_action_spacing"
|
||||
android:layout_marginEnd="@dimen/qs_media_padding"
|
||||
@@ -339,16 +331,16 @@
|
||||
app:layout_constrainedWidth="true"
|
||||
app:layout_constraintWidth_min="@dimen/min_clickable_item_size"
|
||||
app:layout_constraintHeight_min="@dimen/min_clickable_item_size"
|
||||
app:layout_constraintStart_toEndOf="@id/cancel"
|
||||
app:layout_constraintStart_toEndOf="@id/dismiss"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/remove_text">
|
||||
<TextView
|
||||
android:id="@+id/dismiss_text"
|
||||
android:id="@+id/cancel_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center|bottom"
|
||||
android:layout_gravity="center|top"
|
||||
style="@style/MediaPlayer.OutlineButton"
|
||||
android:text="@string/controls_media_dismiss_button" />
|
||||
android:text="@string/cancel" />
|
||||
</FrameLayout>
|
||||
</com.android.systemui.util.animation.TransitionLayout>
|
||||
|
||||
@@ -2140,11 +2140,11 @@
|
||||
<!-- Title for media controls [CHAR_LIMIT=50] -->
|
||||
<string name="controls_media_title">Media</string>
|
||||
<!-- Explanation for closing controls associated with a specific media session [CHAR_LIMIT=50] -->
|
||||
<string name="controls_media_close_session">Hide this media session?</string>
|
||||
<string name="controls_media_close_session">Hide this media control for <xliff:g id="app_name" example="YouTube Music">%1$s</xliff:g>?</string>
|
||||
<!-- Explanation that controls associated with a specific media session are active [CHAR_LIMIT=50] -->
|
||||
<string name="controls_media_active_session">The current media session cannot be hidden.</string>
|
||||
<!-- Label for a button that will hide media controls [CHAR_LIMIT=30] -->
|
||||
<string name="controls_media_dismiss_button">Dismiss</string>
|
||||
<string name="controls_media_dismiss_button">Hide</string>
|
||||
<!-- Label for button to resume media playback [CHAR_LIMIT=NONE] -->
|
||||
<string name="controls_media_resume">Resume</string>
|
||||
<!-- Label for button to go to media control settings screen [CHAR_LIMIT=30] -->
|
||||
|
||||
@@ -630,7 +630,7 @@
|
||||
</style>
|
||||
|
||||
<style name="MediaPlayer.OutlineButton">
|
||||
<item name="android:background">@drawable/qs_media_button_background</item>
|
||||
<item name="android:background">@drawable/qs_media_outline_button</item>
|
||||
<item name="android:textColor">?android:attr/textColorPrimary</item>
|
||||
<item name="android:backgroundTint">@color/media_player_outline_button_bg</item>
|
||||
<item name="android:fontFamily">@*android:string/config_headlineFontFamilyMedium</item>
|
||||
|
||||
@@ -515,7 +515,7 @@ class MediaCarouselController @Inject constructor(
|
||||
|
||||
private fun recreatePlayers() {
|
||||
bgColor = getBackgroundColor()
|
||||
pageIndicator.tintList = ColorStateList.valueOf(getForegroundColor())
|
||||
pageIndicator.tintList = ColorStateList.valueOf(R.color.material_dynamic_neutral_variant80)
|
||||
|
||||
MediaPlayerData.mediaData().forEach { (key, data, isSsMediaRec) ->
|
||||
if (isSsMediaRec) {
|
||||
@@ -536,10 +536,6 @@ class MediaCarouselController @Inject constructor(
|
||||
return context.getColor(R.color.material_dynamic_secondary95)
|
||||
}
|
||||
|
||||
private fun getForegroundColor(): Int {
|
||||
return context.getColor(R.color.material_dynamic_neutral_variant80)
|
||||
}
|
||||
|
||||
private fun updatePageIndicator() {
|
||||
val numPages = mediaContent.getChildCount()
|
||||
pageIndicator.setNumPages(numPages)
|
||||
|
||||
@@ -35,7 +35,6 @@ import android.media.session.MediaController;
|
||||
import android.media.session.MediaSession;
|
||||
import android.media.session.PlaybackState;
|
||||
import android.os.Process;
|
||||
import android.text.Layout;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@@ -416,9 +415,13 @@ public class MediaControlPanel {
|
||||
|
||||
private void bindLongPressMenu(MediaData data) {
|
||||
boolean isDismissible = data.isClearable();
|
||||
mMediaViewHolder.getLongPressText().setText(isDismissible
|
||||
? R.string.controls_media_close_session
|
||||
: R.string.controls_media_active_session);
|
||||
String dismissText;
|
||||
if (isDismissible) {
|
||||
dismissText = mContext.getString(R.string.controls_media_close_session, data.getApp());
|
||||
} else {
|
||||
dismissText = mContext.getString(R.string.controls_media_active_session);
|
||||
}
|
||||
mMediaViewHolder.getLongPressText().setText(dismissText);
|
||||
|
||||
// Dismiss button
|
||||
mMediaViewHolder.getDismissText().setAlpha(isDismissible ? 1 : DISABLED_ALPHA);
|
||||
@@ -551,11 +554,10 @@ public class MediaControlPanel {
|
||||
|
||||
// Long press buttons
|
||||
mMediaViewHolder.getLongPressText().setTextColor(textColorList);
|
||||
mMediaViewHolder.getSettingsText().setTextColor(textColorList);
|
||||
mMediaViewHolder.getSettingsText().setBackgroundTintList(accentColorList);
|
||||
mMediaViewHolder.getSettings().setImageTintList(accentColorList);
|
||||
mMediaViewHolder.getCancelText().setTextColor(textColorList);
|
||||
mMediaViewHolder.getCancelText().setBackgroundTintList(accentColorList);
|
||||
mMediaViewHolder.getDismissText().setTextColor(textColorList);
|
||||
mMediaViewHolder.getDismissText().setTextColor(surfaceColor);
|
||||
mMediaViewHolder.getDismissText().setBackgroundTintList(accentColorList);
|
||||
}
|
||||
|
||||
@@ -849,28 +851,11 @@ public class MediaControlPanel {
|
||||
}
|
||||
|
||||
private void openGuts() {
|
||||
ConstraintSet expandedSet = mMediaViewController.getExpandedLayout();
|
||||
ConstraintSet collapsedSet = mMediaViewController.getCollapsedLayout();
|
||||
|
||||
boolean wasTruncated = false;
|
||||
Layout l = null;
|
||||
if (mMediaViewHolder != null) {
|
||||
mMediaViewHolder.marquee(true, mMediaViewController.GUTS_ANIMATION_DURATION);
|
||||
l = mMediaViewHolder.getSettingsText().getLayout();
|
||||
} else if (mRecommendationViewHolder != null) {
|
||||
mRecommendationViewHolder.marquee(true, mMediaViewController.GUTS_ANIMATION_DURATION);
|
||||
l = mRecommendationViewHolder.getSettingsText().getLayout();
|
||||
}
|
||||
if (l != null) {
|
||||
wasTruncated = l.getEllipsisCount(0) > 0;
|
||||
}
|
||||
mMediaViewController.setShouldHideGutsSettings(wasTruncated);
|
||||
if (wasTruncated) {
|
||||
// not enough room for the settings button to show fully, let's hide it
|
||||
expandedSet.constrainMaxWidth(R.id.settings, 0);
|
||||
collapsedSet.constrainMaxWidth(R.id.settings, 0);
|
||||
}
|
||||
|
||||
mMediaViewController.openGuts();
|
||||
}
|
||||
|
||||
|
||||
@@ -189,11 +189,6 @@ class MediaViewController @Inject constructor(
|
||||
var isGutsVisible = false
|
||||
private set
|
||||
|
||||
/**
|
||||
* Whether the settings button in the guts should be visible
|
||||
*/
|
||||
var shouldHideGutsSettings = false
|
||||
|
||||
init {
|
||||
mediaHostStatesManager.addController(this)
|
||||
layoutController.sizeChangedListener = { width: Int, height: Int ->
|
||||
@@ -280,9 +275,6 @@ class MediaViewController @Inject constructor(
|
||||
viewState.widgetStates.get(id)?.alpha = if (isGutsVisible) 1f else 0f
|
||||
viewState.widgetStates.get(id)?.gone = !isGutsVisible
|
||||
}
|
||||
if (shouldHideGutsSettings) {
|
||||
viewState.widgetStates.get(R.id.settings)?.gone = true
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -58,8 +58,7 @@ class MediaViewHolder constructor(itemView: View) {
|
||||
val cancelText = itemView.requireViewById<TextView>(R.id.cancel_text)
|
||||
val dismiss = itemView.requireViewById<ViewGroup>(R.id.dismiss)
|
||||
val dismissText = itemView.requireViewById<TextView>(R.id.dismiss_text)
|
||||
val settings = itemView.requireViewById<View>(R.id.settings)
|
||||
val settingsText = itemView.requireViewById<TextView>(R.id.settings_text)
|
||||
val settings = itemView.requireViewById<ImageButton>(R.id.settings)
|
||||
|
||||
// Action Buttons
|
||||
val actionPlayPause = itemView.requireViewById<ImageButton>(R.id.actionPlayPause)
|
||||
|
||||
@@ -122,8 +122,7 @@ public class MediaControlPanelTest : SysuiTestCase() {
|
||||
private lateinit var actionPrev: ImageButton
|
||||
@Mock private lateinit var longPressText: TextView
|
||||
@Mock private lateinit var handler: Handler
|
||||
private lateinit var settings: View
|
||||
private lateinit var settingsText: TextView
|
||||
private lateinit var settings: ImageButton
|
||||
private lateinit var cancel: View
|
||||
private lateinit var cancelText: TextView
|
||||
private lateinit var dismiss: FrameLayout
|
||||
@@ -161,8 +160,7 @@ public class MediaControlPanelTest : SysuiTestCase() {
|
||||
seekBar = SeekBar(context)
|
||||
elapsedTimeView = TextView(context)
|
||||
totalTimeView = TextView(context)
|
||||
settings = View(context)
|
||||
settingsText = TextView(context)
|
||||
settings = ImageButton(context)
|
||||
cancel = View(context)
|
||||
cancelText = TextView(context)
|
||||
dismiss = FrameLayout(context)
|
||||
@@ -252,7 +250,6 @@ public class MediaControlPanelTest : SysuiTestCase() {
|
||||
whenever(viewHolder.longPressText).thenReturn(longPressText)
|
||||
whenever(longPressText.handler).thenReturn(handler)
|
||||
whenever(viewHolder.settings).thenReturn(settings)
|
||||
whenever(viewHolder.settingsText).thenReturn(settingsText)
|
||||
whenever(viewHolder.cancel).thenReturn(cancel)
|
||||
whenever(viewHolder.cancelText).thenReturn(cancelText)
|
||||
whenever(viewHolder.dismiss).thenReturn(dismiss)
|
||||
|
||||
Reference in New Issue
Block a user