From 90646a5dd472fc4041f2c81dc29434374ad65f51 Mon Sep 17 00:00:00 2001 From: Matthew Ng Date: Thu, 21 Jun 2018 14:33:38 -0700 Subject: [PATCH] Tapping task icon in overview with scroll to it and open Smaller devices or landscape with splitscreen can show more than one task icon in overview. Tapping the icon when not in the middle will scroll the task into the middle and open at the same time. Change-Id: I0fe261e9a1b8ab6ad7e6c6ea64125a9c7b38da39 Fixes: 110371874 Fixes: 111446332 Test: splitscreen, overview in landscape, tap non-centered task icon --- .../android/quickstep/views/TaskMenuView.java | 25 ++++++++----- .../com/android/quickstep/views/TaskView.java | 35 +++++++++++++++++-- 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/src/com/android/quickstep/views/TaskMenuView.java index e609a404f9..41626c6be0 100644 --- a/quickstep/src/com/android/quickstep/views/TaskMenuView.java +++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.java @@ -87,6 +87,7 @@ public class TaskMenuView extends AbstractFloatingView { 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; @@ -103,6 +104,7 @@ public class TaskMenuView extends AbstractFloatingView { super(context, attrs, defStyleAttr); mActivity = BaseDraggingActivity.fromContext(context); + mThumbnailTopMargin = getResources().getDimension(R.dimen.task_thumbnail_top_margin); } @Override @@ -154,11 +156,16 @@ public class TaskMenuView extends AbstractFloatingView { return (type & TYPE_TASK_MENU) != 0; } - public static boolean showForTask(TaskView taskView) { + public void setPosition(float x, float y) { + setX(x); + setY(y + mThumbnailTopMargin); + } + + public static TaskMenuView showForTask(TaskView taskView) { BaseDraggingActivity activity = BaseDraggingActivity.fromContext(taskView.getContext()); final TaskMenuView taskMenuView = (TaskMenuView) activity.getLayoutInflater().inflate( R.layout.task_menu, activity.getDragLayer(), false); - return taskMenuView.populateAndShowForTask(taskView); + return taskMenuView.populateAndShowForTask(taskView) ? taskMenuView : null; } private boolean populateAndShowForTask(TaskView taskView) { @@ -188,7 +195,7 @@ public class TaskMenuView extends AbstractFloatingView { // 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) -getResources().getDimension(R.dimen.task_thumbnail_top_margin); + params.topMargin = (int) -mThumbnailTopMargin; mTaskIcon.setLayoutParams(params); for (TaskSystemShortcut menuOption : MENU_OPTIONS) { @@ -213,12 +220,12 @@ public class TaskMenuView extends AbstractFloatingView { mActivity.getDragLayer().getDescendantRectRelativeToSelf(taskView, sTempRect); Rect insets = mActivity.getDragLayer().getInsets(); BaseDragLayer.LayoutParams params = (BaseDragLayer.LayoutParams) getLayoutParams(); - params.width = sTempRect.width(); - params.gravity = Gravity.LEFT; + params.width = taskView.getMeasuredWidth(); + params.gravity = Gravity.START; setLayoutParams(params); - setX(Math.round(sTempRect.left - insets.left)); - setY(Math.round(sTempRect.top - insets.top - + getResources().getDimension(R.dimen.task_thumbnail_top_margin))); + setScaleX(taskView.getScaleX()); + setScaleY(taskView.getScaleY()); + setPosition(sTempRect.left - insets.left, sTempRect.top - insets.top); } private void animateOpen() { @@ -232,7 +239,7 @@ public class TaskMenuView extends AbstractFloatingView { private void animateOpenOrClosed(boolean closing) { if (mOpenCloseAnimator != null && mOpenCloseAnimator.isRunning()) { - return; + mOpenCloseAnimator.end(); } mOpenCloseAnimator = LauncherAnimUtils.createAnimatorSet(); diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 1653038808..ee542d57ed 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -110,8 +110,24 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback } }; + private final OnAttachStateChangeListener mTaskMenuStateListener = + new OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View view) { + } + + @Override + public void onViewDetachedFromWindow(View view) { + if (mMenuView != null) { + mMenuView.removeOnAttachStateChangeListener(this); + mMenuView = null; + } + } + }; + private Task mTask; private TaskThumbnailView mSnapshotView; + private TaskMenuView mMenuView; private IconView mIconView; private float mCurveScale; private float mZoomScale; @@ -200,13 +216,22 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback public void onTaskDataLoaded(Task task, ThumbnailData thumbnailData) { mSnapshotView.setThumbnail(task, thumbnailData); mIconView.setDrawable(task.icon); - mIconView.setOnClickListener(icon -> TaskMenuView.showForTask(this)); + mIconView.setOnClickListener(icon -> showTaskMenu()); mIconView.setOnLongClickListener(icon -> { requestDisallowInterceptTouchEvent(true); - return TaskMenuView.showForTask(this); + return showTaskMenu(); }); } + private boolean showTaskMenu() { + getRecentsView().snapToPage(getRecentsView().indexOfChild(this)); + mMenuView = TaskMenuView.showForTask(this); + if (mMenuView != null) { + mMenuView.addOnAttachStateChangeListener(mTaskMenuStateListener); + } + return mMenuView != null; + } + @Override public void onTaskDataUnloaded() { mSnapshotView.setThumbnail(null, null); @@ -266,6 +291,12 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback mSnapshotView.setDimAlpha(curveInterpolation * MAX_PAGE_SCRIM_ALPHA); setCurveScale(getCurveScaleForCurveInterpolation(curveInterpolation)); + + if (mMenuView != null) { + mMenuView.setPosition(getX() - getRecentsView().getScrollX(), getY()); + mMenuView.setScaleX(getScaleX()); + mMenuView.setScaleY(getScaleY()); + } } @Override