Merge "Update media long press menu" into tm-dev

This commit is contained in:
Beth Thibodeau
2022-03-22 14:37:24 +00:00
committed by Android (Google) Code Review
10 changed files with 74 additions and 86 deletions

View 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>

View File

@@ -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>

View File

@@ -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] -->

View File

@@ -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>

View File

@@ -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)

View File

@@ -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();
}

View File

@@ -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
}
}
/**

View File

@@ -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)

View File

@@ -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)