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