Add long press menu to remove media player

Screenshots: https://drive.google.com/drive/folders/1oaE6oFqShIhmcnG6P7CJFhgVenFgYNgm?usp=sharing

Fixes: 150742919
Test: manual
Change-Id: I36b61c62443bfee3ce6f13cccea9564460563918
This commit is contained in:
Beth Thibodeau
2020-03-18 20:01:27 -04:00
parent dd394239bb
commit 8ebf6ad928
5 changed files with 251 additions and 150 deletions

View File

@@ -0,0 +1,24 @@
<!--
~ Copyright (C) 2020 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.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24.0dp"
android:height="24.0dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12 19,6.41z"
android:fillColor="#FF000000"/>
</vector>

View File

@@ -27,163 +27,174 @@
android:background="@drawable/qs_media_background"
>
<!-- Header section -->
<!-- Buttons to remove this view when no longer needed -->
<include
layout="@layout/qs_media_panel_options"
android:visibility="gone"/>
<LinearLayout
android:orientation="horizontal"
android:id="@+id/media_guts"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
>
<ImageView
android:id="@+id/album_art"
android:layout_width="@dimen/qs_media_album_size"
android:layout_height="@dimen/qs_media_album_size"
android:layout_marginRight="16dp"
android:layout_weight="0"
/>
android:layout_height="match_parent">
<!-- Header section -->
<LinearLayout
android:orientation="vertical"
android:layout_width="0dp"
android:layout_height="@dimen/qs_media_album_size"
android:layout_weight="1"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
>
<ImageView
android:id="@+id/album_art"
android:layout_width="@dimen/qs_media_album_size"
android:layout_height="@dimen/qs_media_album_size"
android:layout_marginRight="16dp"
android:layout_weight="0"
/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:layout_width="0dp"
android:layout_height="@dimen/qs_media_album_size"
android:layout_weight="1"
>
<com.android.internal.widget.CachingIconView
android:id="@+id/icon"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginEnd="5dp"
/>
<TextView
android:id="@+id/app_name"
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
>
<com.android.internal.widget.CachingIconView
android:id="@+id/icon"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginEnd="5dp"
/>
<TextView
android:id="@+id/app_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:singleLine="true"
/>
</LinearLayout>
<!-- Song name -->
<TextView
android:id="@+id/header_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
android:textSize="18sp"
android:paddingBottom="6dp"
android:gravity="center"/>
<!-- Artist name -->
<TextView
android:id="@+id/header_artist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@*android:string/config_bodyFontFamily"
android:textSize="14sp"
android:singleLine="true"
/>
</LinearLayout>
<!-- Song name -->
<TextView
android:id="@+id/header_title"
android:layout_width="wrap_content"
<!-- Output chip -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:singleLine="true"
android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
android:textSize="18sp"
android:orientation="horizontal"
android:visibility="gone"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:gravity="center"/>
<!-- Artist name -->
<TextView
android:id="@+id/header_artist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@*android:string/config_bodyFontFamily"
android:textSize="14sp"
android:singleLine="true"
/>
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:gravity="center"
android:id="@+id/media_seamless"
android:background="@*android:drawable/media_seamless_background"
android:layout_weight="1"
>
<ImageView
android:layout_width="@dimen/qs_seamless_icon_size"
android:layout_height="@dimen/qs_seamless_icon_size"
android:src="@*android:drawable/ic_media_seamless"
android:layout_marginRight="8dp"
android:id="@+id/media_seamless_image"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@*android:string/config_bodyFontFamily"
android:text="@*android:string/ext_media_seamless_action"
android:textSize="14sp"
android:id="@+id/media_seamless_text"
android:singleLine="true"
/>
</LinearLayout>
</LinearLayout>
<!-- Output chip -->
<!-- Controls -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@+id/media_actions"
android:orientation="horizontal"
android:visibility="gone"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:layoutDirection="ltr"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:id="@+id/media_seamless"
android:background="@*android:drawable/media_seamless_background"
android:layout_weight="1"
>
<ImageView
android:layout_width="@dimen/qs_seamless_icon_size"
android:layout_height="@dimen/qs_seamless_icon_size"
android:src="@*android:drawable/ic_media_seamless"
android:layout_marginRight="8dp"
android:id="@+id/media_seamless_image"
>
<ImageButton
style="@android:style/Widget.Material.Button.Borderless.Small"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:gravity="center"
android:visibility="gone"
android:id="@+id/action0"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@*android:string/config_bodyFontFamily"
android:text="@*android:string/ext_media_seamless_action"
android:textSize="14sp"
android:id="@+id/media_seamless_text"
android:singleLine="true"
<ImageButton
style="@android:style/Widget.Material.Button.Borderless.Small"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:gravity="center"
android:visibility="gone"
android:id="@+id/action1"
/>
<ImageButton
style="@android:style/Widget.Material.Button.Borderless.Small"
android:layout_width="52dp"
android:layout_height="52dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:gravity="center"
android:visibility="gone"
android:id="@+id/action2"
/>
<ImageButton
style="@android:style/Widget.Material.Button.Borderless.Small"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:gravity="center"
android:visibility="gone"
android:id="@+id/action3"
/>
<ImageButton
style="@android:style/Widget.Material.Button.Borderless.Small"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:gravity="center"
android:visibility="gone"
android:id="@+id/action4"
/>
</LinearLayout>
</LinearLayout>
<!-- Controls -->
<LinearLayout
android:id="@+id/media_actions"
android:orientation="horizontal"
android:layoutDirection="ltr"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
>
<ImageButton
style="@android:style/Widget.Material.Button.Borderless.Small"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:gravity="center"
android:visibility="gone"
android:id="@+id/action0"
/>
<ImageButton
style="@android:style/Widget.Material.Button.Borderless.Small"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:gravity="center"
android:visibility="gone"
android:id="@+id/action1"
/>
<ImageButton
style="@android:style/Widget.Material.Button.Borderless.Small"
android:layout_width="52dp"
android:layout_height="52dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:gravity="center"
android:visibility="gone"
android:id="@+id/action2"
/>
<ImageButton
style="@android:style/Widget.Material.Button.Borderless.Small"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:gravity="center"
android:visibility="gone"
android:id="@+id/action3"
/>
<ImageButton
style="@android:style/Widget.Material.Button.Borderless.Small"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:gravity="center"
android:visibility="gone"
android:id="@+id/action4"
/>
</LinearLayout>
</LinearLayout>

View File

@@ -19,23 +19,40 @@
android:id="@+id/qs_media_controls_options"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center"
android:layout_gravity="center"
android:padding="10dp"
>
<ImageButton
android:padding="16dp"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_weight="1"
android:minWidth="48dp"
android:layout_gravity="start|bottom"
android:gravity="bottom"
android:id="@+id/remove"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@android:drawable/ic_menu_delete"
android:padding="8dp"
/>
<ImageButton
android:orientation="horizontal">
<ImageView
android:layout_width="18dp"
android:layout_height="18dp"
android:id="@+id/remove_icon"
android:layout_marginEnd="16dp"
android:src="@drawable/ic_clear"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/remove_text"
android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
android:singleLine="true"
android:text="@string/controls_media_close_session" />
</LinearLayout>
<TextView
android:id="@+id/cancel"
android:layout_width="48dp"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:src="@android:drawable/ic_menu_revert"
android:padding="8dp"
/>
android:layout_weight="1"
android:minWidth="48dp"
android:layout_gravity="end|bottom"
android:gravity="bottom"
android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
android:text="@string/cancel" />
</LinearLayout>

View File

@@ -2661,4 +2661,7 @@
<!-- Message to tell the user to wait while systemui attempts to load a set of
recommended controls [CHAR_LIMIT=30] -->
<string name="controls_seeding_in_progress">Loading recommendations</string>
<!-- Close the controls associated with a specific media session [CHAR_LIMIT=NONE] -->
<string name="controls_media_close_session">Close this media session</string>
</resources>

View File

@@ -18,6 +18,7 @@ package com.android.systemui.qs;
import android.app.Notification;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.media.session.MediaSession;
@@ -25,7 +26,9 @@ import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.settingslib.media.MediaDevice;
import com.android.systemui.R;
@@ -50,6 +53,8 @@ public class QSMediaPlayer extends MediaControlPanel {
R.id.action4
};
private final QSPanel mParent;
/**
* Initialize quick shade version of player
* @param context
@@ -62,6 +67,7 @@ public class QSMediaPlayer extends MediaControlPanel {
Executor foregroundExecutor, Executor backgroundExecutor) {
super(context, parent, manager, R.layout.qs_media_panel, QS_ACTION_IDS, foregroundExecutor,
backgroundExecutor);
mParent = (QSPanel) parent;
}
/**
@@ -108,5 +114,45 @@ public class QSMediaPlayer extends MediaControlPanel {
ImageButton thisBtn = mMediaNotifView.findViewById(QS_ACTION_IDS[i]);
thisBtn.setVisibility(View.GONE);
}
// Set up long press menu
View guts = mMediaNotifView.findViewById(R.id.media_guts);
View options = mMediaNotifView.findViewById(R.id.qs_media_controls_options);
options.setMinimumHeight(guts.getHeight());
View clearView = options.findViewById(R.id.remove);
clearView.setOnClickListener(b -> {
mParent.removeMediaPlayer(QSMediaPlayer.this);
});
ImageView removeIcon = options.findViewById(R.id.remove_icon);
removeIcon.setImageTintList(ColorStateList.valueOf(iconColor));
TextView removeText = options.findViewById(R.id.remove_text);
removeText.setTextColor(iconColor);
TextView cancelView = options.findViewById(R.id.cancel);
cancelView.setTextColor(iconColor);
cancelView.setOnClickListener(b -> {
options.setVisibility(View.GONE);
guts.setVisibility(View.VISIBLE);
});
// ... but don't enable it yet, and make sure is reset when the session is updated
mMediaNotifView.setOnLongClickListener(null);
options.setVisibility(View.GONE);
guts.setVisibility(View.VISIBLE);
}
@Override
public void clearControls() {
super.clearControls();
View guts = mMediaNotifView.findViewById(R.id.media_guts);
View options = mMediaNotifView.findViewById(R.id.qs_media_controls_options);
mMediaNotifView.setOnLongClickListener(v -> {
// Replace player view with close/cancel view
guts.setVisibility(View.GONE);
options.setVisibility(View.VISIBLE);
return true; // consumed click
});
}
}