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
diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/src/com/android/quickstep/views/TaskMenuView.java
index e609a40..41626c6 100644
--- a/quickstep/src/com/android/quickstep/views/TaskMenuView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.java
@@ -87,6 +87,7 @@
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 @@
super(context, attrs, defStyleAttr);
mActivity = BaseDraggingActivity.fromContext(context);
+ mThumbnailTopMargin = getResources().getDimension(R.dimen.task_thumbnail_top_margin);
}
@Override
@@ -154,11 +156,16 @@
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 @@
// 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 @@
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 @@
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 1653038..ee542d5 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskView.java
@@ -110,8 +110,24 @@
}
};
+ 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 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 @@
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