Launcher3: update recent tasks header style
* Show the name of the task at the top
* Menu icon for split, info and pin
Change-Id: I2105fc269a565c712e0e664a5c9e68cb357025ac
Signed-off-by: Joey <joey@lineageos.org>
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskMenuView.java
index 07d0796..4d86647 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskMenuView.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskMenuView.java
@@ -58,18 +58,6 @@
private static final Rect sTempRect = new Rect();
- private final OnScaleUpdateListener mTaskViewIconScaleListener = new OnScaleUpdateListener() {
- @Override
- public void onScaleUpdate(float scale) {
- final Drawable drawable = mTaskIcon.getDrawable();
- if (drawable instanceof FastBitmapDrawable) {
- if (scale != ((FastBitmapDrawable) drawable).getScale()) {
- mMenuIconDrawable.setScale(scale);
- }
- }
- }
- };
-
private final OnScaleUpdateListener mMenuIconScaleListener = new OnScaleUpdateListener() {
@Override
public void onScaleUpdate(float scale) {
@@ -86,14 +74,10 @@
private static final int REVEAL_OPEN_DURATION = 150;
private static final int REVEAL_CLOSE_DURATION = 100;
- private final float mThumbnailTopMargin;
private BaseDraggingActivity mActivity;
- private TextView mTaskName;
- private IconView mTaskIcon;
private AnimatorSet mOpenCloseAnimator;
private TaskView mTaskView;
private LinearLayout mOptionLayout;
- private FastBitmapDrawable mMenuIconDrawable;
public TaskMenuView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
@@ -103,14 +87,11 @@
super(context, attrs, defStyleAttr);
mActivity = BaseDraggingActivity.fromContext(context);
- mThumbnailTopMargin = getResources().getDimension(R.dimen.task_thumbnail_top_margin);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
- mTaskName = findViewById(R.id.task_name);
- mTaskIcon = findViewById(R.id.task_icon);
mOptionLayout = findViewById(R.id.menu_option_layout);
}
@@ -142,22 +123,13 @@
}
@Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
-
- // Remove all scale listeners when menu is removed
- mTaskView.getIconView().removeUpdateScaleListener(mTaskViewIconScaleListener);
- mTaskIcon.removeUpdateScaleListener(mMenuIconScaleListener);
- }
-
- @Override
protected boolean isOfType(int type) {
return (type & TYPE_TASK_MENU) != 0;
}
public void setPosition(float x, float y) {
setX(x);
- setY(y + mThumbnailTopMargin);
+ setY(y);
}
public static TaskMenuView showForTask(TaskView taskView) {
@@ -180,23 +152,6 @@
}
private void addMenuOptions(TaskView taskView) {
- Drawable icon = taskView.getTask().icon.getConstantState().newDrawable();
- mTaskIcon.setDrawable(icon);
- mTaskIcon.setOnClickListener(v -> close(true));
- mTaskName.setText(TaskUtils.getTitle(getContext(), taskView.getTask()));
- mTaskName.setOnClickListener(v -> close(true));
-
- // Set the icons to match scale by listening to each other's changes
- mMenuIconDrawable = icon instanceof FastBitmapDrawable ? (FastBitmapDrawable) icon : null;
- taskView.getIconView().addUpdateScaleListener(mTaskViewIconScaleListener);
- mTaskIcon.addUpdateScaleListener(mMenuIconScaleListener);
-
- // Move the icon and text up half an icon size to lay over the TaskView
- LinearLayout.LayoutParams params =
- (LinearLayout.LayoutParams) mTaskIcon.getLayoutParams();
- params.topMargin = (int) -mThumbnailTopMargin;
- mTaskIcon.setLayoutParams(params);
-
final BaseDraggingActivity activity = BaseDraggingActivity.fromContext(getContext());
final List<TaskSystemShortcut> shortcuts =
TaskOverlayFactory.INSTANCE.get(getContext()).getEnabledShortcuts(taskView);
@@ -221,12 +176,11 @@
mActivity.getDragLayer().getDescendantRectRelativeToSelf(taskView, sTempRect);
Rect insets = mActivity.getDragLayer().getInsets();
BaseDragLayer.LayoutParams params = (BaseDragLayer.LayoutParams) getLayoutParams();
- params.width = taskView.getMeasuredWidth();
- params.gravity = Gravity.START;
+ params.gravity = Gravity.END;
setLayoutParams(params);
setScaleX(taskView.getScaleX());
setScaleY(taskView.getScaleY());
- setPosition(sTempRect.left - insets.left, sTempRect.top - insets.top);
+ setY(sTempRect.top - insets.top);
}
private void animateOpen() {
@@ -274,9 +228,10 @@
}
private RoundedRectRevealOutlineProvider createOpenCloseOutlineProvider() {
+ final int width = getWidth();
float radius = Themes.getDialogCornerRadius(getContext());
- Rect fromRect = new Rect(0, 0, getWidth(), 0);
- Rect toRect = new Rect(0, 0, getWidth(), getHeight());
+ Rect fromRect = new Rect(width, 0, width, 0);
+ Rect toRect = new Rect(0, 0, width, getHeight());
return new RoundedRectRevealOutlineProvider(radius, radius, fromRect, toRect);
}
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java
index 51802df..6d81661 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java
@@ -44,7 +44,9 @@
import android.view.View;
import android.view.ViewOutlineProvider;
import android.view.accessibility.AccessibilityNodeInfo;
-import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+import android.widget.ImageView;
+import android.widget.TextView;
import android.widget.Toast;
import com.android.launcher3.BaseDraggingActivity;
@@ -80,7 +82,7 @@
/**
* A task in the Recents view.
*/
-public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
+public class TaskView extends LinearLayout implements PageCallbacks, Reusable {
private static final String TAG = TaskView.class.getSimpleName();
@@ -151,7 +153,10 @@
private Task mTask;
private TaskThumbnailView mSnapshotView;
private TaskMenuView mMenuView;
+ private View mTaskInfoContainer;
private IconView mIconView;
+ private TextView mNameView;
+ private ImageView mMenuIconView;
private final DigitalWellBeingToast mDigitalWellBeingToast;
private float mCurveScale;
private float mFullscreenProgress;
@@ -223,7 +228,10 @@
protected void onFinishInflate() {
super.onFinishInflate();
mSnapshotView = findViewById(R.id.snapshot);
+ mTaskInfoContainer = findViewById(R.id.task_info_container);
mIconView = findViewById(R.id.icon);
+ mNameView = findViewById(R.id.name);
+ mMenuIconView = findViewById(R.id.menu);
}
public TaskMenuView getMenuView() {
@@ -350,6 +358,8 @@
mIconLoadRequest = iconCache.updateIconInBackground(mTask,
(task) -> {
setIcon(task.icon);
+ setName(task);
+ setMenu(true);
if (ENABLE_QUICKSTEP_LIVE_TILE.get() && isRunningTask()) {
getRecentsView().updateLiveTileIcon(task.icon);
}
@@ -358,6 +368,8 @@
} else {
mSnapshotView.setThumbnail(null, null);
setIcon(null);
+ setName(null);
+ setMenu(false);
// Reset the task thumbnail reference as well (it will be fetched from the cache or
// reloaded next time we need it)
mTask.thumbnail = null;
@@ -387,17 +399,24 @@
}
private void setIcon(Drawable icon) {
- if (icon != null) {
- mIconView.setDrawable(icon);
- mIconView.setOnClickListener(v -> showTaskMenu(Touch.TAP));
- mIconView.setOnLongClickListener(v -> {
+ mIconView.setDrawable(icon);
+ }
+
+ private void setName(Task task) {
+ mNameView.setText(task == null ?
+ "" : TaskUtils.getTitle(getContext(), task));
+ }
+
+ private void setMenu(boolean enable) {
+ if (enable) {
+ mMenuIconView.setOnClickListener(v -> showTaskMenu(Touch.TAP));
+ mMenuIconView.setOnLongClickListener(v -> {
requestDisallowInterceptTouchEvent(true);
return showTaskMenu(Touch.LONGPRESS);
});
} else {
- mIconView.setDrawable(null);
- mIconView.setOnClickListener(null);
- mIconView.setOnLongClickListener(null);
+ mMenuIconView.setOnClickListener(null);
+ mMenuIconView.setOnLongClickListener(null);
}
}
@@ -412,8 +431,7 @@
float upperClamp = invert ? 1 : iconScalePercentage;
float scale = Interpolators.clampToProgress(FAST_OUT_SLOW_IN, lowerClamp, upperClamp)
.getInterpolation(progress);
- mIconView.setScaleX(scale);
- mIconView.setScaleY(scale);
+ mTaskInfoContainer.setAlpha(scale);
mFooterVerticalOffset = 1.0f - scale;
for (FooterWrapper footer : mFooters) {
@@ -499,7 +517,8 @@
}
if (mMenuView != null) {
- mMenuView.setPosition(getX() - getRecentsView().getScrollX(), getY());
+ mMenuView.setPosition(getX() - getRecentsView().getScrollX() +
+ getWidth() - (int) mMenuView.getWidth(), getY());
mMenuView.setScaleX(getScaleX());
mMenuView.setScaleY(getScaleY());
}
@@ -794,7 +813,7 @@
}
mFullscreenProgress = progress;
boolean isFullscreen = mFullscreenProgress > 0;
- mIconView.setVisibility(progress < 1 ? VISIBLE : INVISIBLE);
+ mTaskInfoContainer.setVisibility(progress < 1 ? VISIBLE : INVISIBLE);
setClipChildren(!isFullscreen);
setClipToPadding(!isFullscreen);
diff --git a/quickstep/res/drawable/ic_task_menu.xml b/quickstep/res/drawable/ic_task_menu.xml
new file mode 100644
index 0000000..044889d
--- /dev/null
+++ b/quickstep/res/drawable/ic_task_menu.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0"
+ android:tint="?attr/workspaceTextColor">
+
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M12,16A2,2 0 0,1 14,18A2,2 0 0,1 12,20A2,2 0 0,1 10,18A2,2 0 0,1 12,16M12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12A2,2 0 0,1 12,10M12,4A2,2 0 0,1 14,6A2,2 0 0,1 12,8A2,2 0 0,1 10,6A2,2 0 0,1 12,4Z" />
+</vector>
diff --git a/quickstep/res/layout/task.xml b/quickstep/res/layout/task.xml
index 60cfa0c..468aa9d 100644
--- a/quickstep/res/layout/task.xml
+++ b/quickstep/res/layout/task.xml
@@ -18,20 +18,55 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:defaultFocusHighlightEnabled="false"
- android:elevation="4dp"
+ android:orientation="vertical"
android:focusable="true">
+ <RelativeLayout
+ android:id="@+id/task_info_container"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/task_thumbnail_icon_size"
+ android:orientation="horizontal"
+ android:layout_marginBottom="8dp"
+ android:focusable="false">
+
+ <com.android.quickstep.views.IconView
+ android:id="@+id/icon"
+ android:layout_width="@dimen/task_thumbnail_icon_size"
+ android:layout_height="match_parent"
+ android:focusable="false"
+ android:layout_alignParentEnd="true"
+ android:importantForAccessibility="no"/>
+
+ <ImageView
+ android:id="@+id/menu"
+ android:layout_width="@dimen/task_thumbnail_icon_size"
+ android:layout_height="match_parent"
+ android:layout_alignParentStart="true"
+ android:layout_centerVertical="true"
+ android:padding="6dp"
+ android:background="?android:attr/selectableItemBackground"
+ android:src="@drawable/ic_task_menu" />
+
+ <TextView
+ android:id="@+id/name"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical"
+ android:paddingStart="8dp"
+ android:paddingEnd="8dp"
+ android:layout_toStartOf="@id/icon"
+ android:layout_marginStart="@dimen/task_thumbnail_icon_size"
+ android:focusable="false"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:textColor="?attr/workspaceTextColor"
+ android:textSize="16sp"/>
+ </RelativeLayout>
+
<com.android.quickstep.views.TaskThumbnailView
android:id="@+id/snapshot"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_marginTop="@dimen/task_thumbnail_top_margin"/>
+ android:elevation="4dp" />
- <com.android.quickstep.views.IconView
- android:id="@+id/icon"
- android:layout_width="@dimen/task_thumbnail_icon_size"
- android:layout_height="@dimen/task_thumbnail_icon_size"
- android:layout_gravity="top|center_horizontal"
- android:focusable="false"
- android:importantForAccessibility="no"/>
-</com.android.quickstep.views.TaskView>
\ No newline at end of file
+</com.android.quickstep.views.TaskView>
diff --git a/quickstep/res/layout/task_menu.xml b/quickstep/res/layout/task_menu.xml
index 098b34f..d504b7f 100644
--- a/quickstep/res/layout/task_menu.xml
+++ b/quickstep/res/layout/task_menu.xml
@@ -16,39 +16,19 @@
-->
<com.android.quickstep.views.TaskMenuView
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
android:background="@drawable/task_menu_bg"
- android:paddingBottom="@dimen/task_card_menu_shadow_height"
+ android:paddingBottom="@dimen/task_card_menu_option_vertical_padding"
+ android:paddingTop="@dimen/task_card_menu_option_vertical_padding"
android:orientation="vertical"
android:visibility="invisible">
- <com.android.quickstep.views.IconView
- android:id="@+id/task_icon"
- android:layout_width="@dimen/task_thumbnail_icon_size"
- android:layout_height="@dimen/task_thumbnail_icon_size"
- android:layout_gravity="top|center_horizontal"
- android:layout_marginBottom="@dimen/deep_shortcut_drawable_padding"
- android:focusable="false"
- android:importantForAccessibility="no" />
-
- <TextView
- android:id="@+id/task_name"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_horizontal"
- android:layout_marginBottom="16dp"
- android:textSize="12sp"/>
-
<LinearLayout
android:id="@+id/menu_option_layout"
style="@style/TaskMenu"
- android:divider="@drawable/all_apps_divider"
- android:showDividers="beginning"
- android:paddingStart="@dimen/task_card_menu_horizontal_padding"
- android:paddingEnd="@dimen/task_card_menu_horizontal_padding"
- android:layout_width="match_parent"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
-</com.android.quickstep.views.TaskMenuView>
\ No newline at end of file
+</com.android.quickstep.views.TaskMenuView>
diff --git a/quickstep/res/layout/task_view_menu_option.xml b/quickstep/res/layout/task_view_menu_option.xml
index 2256315..0ecd50d 100644
--- a/quickstep/res/layout/task_view_menu_option.xml
+++ b/quickstep/res/layout/task_view_menu_option.xml
@@ -18,10 +18,13 @@
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/TaskMenu.Option"
android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:orientation="vertical"
+ android:layout_gravity="center_horizontal|start"
+ android:gravity="center"
+ android:orientation="horizontal"
android:paddingTop="@dimen/task_card_menu_option_vertical_padding"
android:paddingBottom="@dimen/task_card_menu_option_vertical_padding"
+ android:paddingStart="@dimen/task_card_menu_option_horizontal_padding"
+ android:paddingEnd="@dimen/task_card_menu_option_horizontal_padding"
android:background="?android:attr/selectableItemBackground"
android:theme="@style/PopupItem" >
@@ -29,22 +32,18 @@
android:id="@+id/icon"
android:layout_width="@dimen/system_shortcut_icon_size"
android:layout_height="@dimen/system_shortcut_icon_size"
- android:layout_marginTop="@dimen/system_shortcut_header_icon_padding"
- android:layout_marginBottom="@dimen/deep_shortcut_drawable_padding"
- android:layout_gravity="center_horizontal"
+ android:layout_margin="@dimen/deep_shortcut_drawable_padding"
android:backgroundTint="?android:attr/textColorTertiary"/>
<TextView
style="@style/BaseIcon"
android:id="@+id/text"
- android:layout_width="match_parent"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:paddingBottom="@dimen/popup_padding_end"
+ android:paddingEnd="@dimen/deep_shortcut_drawable_padding"
android:textSize="12sp"
android:textColor="?android:attr/textColorPrimary"
android:fontFamily="@*android:string/config_bodyFontFamily"
- android:gravity="center_horizontal"
- android:layout_gravity="center_horizontal"
android:focusable="false" />
</LinearLayout>
diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml
index 78424ca..2c4a114 100644
--- a/quickstep/res/values/dimens.xml
+++ b/quickstep/res/values/dimens.xml
@@ -16,9 +16,9 @@
<resources>
- <dimen name="task_thumbnail_top_margin">24dp</dimen>
- <dimen name="task_thumbnail_half_top_margin">12dp</dimen>
- <dimen name="task_thumbnail_icon_size">48dp</dimen>
+ <dimen name="task_thumbnail_top_margin">44dp</dimen>
+ <dimen name="task_thumbnail_half_top_margin">22dp</dimen>
+ <dimen name="task_thumbnail_icon_size">36dp</dimen>
<!-- For screens without rounded corners -->
<dimen name="task_corner_radius_small">2dp</dimen>
@@ -53,6 +53,7 @@
in various configurations -->
<dimen name="task_card_vert_space">40dp</dimen>
<dimen name="task_card_menu_option_vertical_padding">8dp</dimen>
+ <dimen name="task_card_menu_option_horizontal_padding">8dp</dimen>
<dimen name="task_card_menu_shadow_height">3dp</dimen>
<dimen name="task_card_menu_horizontal_padding">0dp</dimen>
<dimen name="portrait_task_card_horz_space">136dp</dimen>
diff --git a/quickstep/res/values/styles.xml b/quickstep/res/values/styles.xml
index bb364ff..ecf8c8d 100644
--- a/quickstep/res/values/styles.xml
+++ b/quickstep/res/values/styles.xml
@@ -22,7 +22,7 @@
<!-- Task Menu Option layout styles. -->
<style name="TaskMenu.Option">
- <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
</style>
-</resources>
\ No newline at end of file
+</resources>
diff --git a/quickstep/src/com/android/quickstep/util/LayoutUtils.java b/quickstep/src/com/android/quickstep/util/LayoutUtils.java
index 2e118b4..a3bc2be 100644
--- a/quickstep/src/com/android/quickstep/util/LayoutUtils.java
+++ b/quickstep/src/com/android/quickstep/util/LayoutUtils.java
@@ -105,6 +105,8 @@
}
float topIconMargin = res.getDimension(R.dimen.task_thumbnail_top_margin);
+ // Add extra spacing for the icon + title
+ topIconMargin += res.getDimension(R.dimen.task_thumbnail_icon_size);
float paddingVert = res.getDimension(R.dimen.task_card_vert_space);
// Note this should be same as dp.availableWidthPx and dp.availableHeightPx unless