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