From b0523697c61c0813b86230da9b41a59386b9e646 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Fri, 4 Nov 2022 14:36:36 -0700 Subject: [PATCH] Stash taskbar if user touch down above the gesture height. Bug: 252905206 Test: open taskbar, tap in gesture area, confirm no stash open taskbar, tap on taskbar item, confirm no stash open taskbar, tap to the side above gesture area, confirm stash Change-Id: Ide030840440b5f0541d0ccfb055b8a8a7e851657 --- .../taskbar/LauncherTaskbarUIController.java | 10 ----- .../launcher3/taskbar/TaskbarControllers.java | 1 + .../launcher3/taskbar/TaskbarDragLayer.java | 12 +++++- .../taskbar/TaskbarDragLayerController.java | 42 +++++++++++++++++-- 4 files changed, 50 insertions(+), 15 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java index 317f6a4884..89f0f987f5 100644 --- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java @@ -26,7 +26,6 @@ import android.annotation.ColorInt; import android.os.RemoteException; import android.util.Log; import android.util.SparseArray; -import android.view.MotionEvent; import android.view.TaskTransitionSpec; import android.view.WindowManagerGlobal; @@ -196,15 +195,6 @@ public class LauncherTaskbarUIController extends TaskbarUIController { return mTaskbarLauncherStateController.createAnimToLauncher(toState, callbacks, duration); } - /** - * @param ev MotionEvent in screen coordinates. - * @return Whether any Taskbar item could handle the given MotionEvent if given the chance. - */ - public boolean isEventOverAnyTaskbarItem(MotionEvent ev) { - return mControllers.taskbarViewController.isEventOverAnyItem(ev) - || mControllers.navbarButtonsViewController.isEventOverAnyItem(ev); - } - public boolean isDraggingItem() { return mControllers.taskbarDragController.isDragging(); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java index 9c2d21ef8c..772cf18b63 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java @@ -164,6 +164,7 @@ public class TaskbarControllers { public void onConfigurationChanged(@Config int configChanges) { navbarButtonsViewController.onConfigurationChanged(configChanges); + taskbarDragLayerController.onConfigurationChanged(); } /** diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java index 7c9a13c5dc..ffb3622ac0 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java @@ -115,10 +115,18 @@ public class TaskbarDragLayer extends BaseDragLayer { return true; } + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + if (mControllerCallbacks != null) { + mControllerCallbacks.tryStashBasedOnMotionEvent(ev); + } + return super.onInterceptTouchEvent(ev); + } + @Override public boolean onTouchEvent(MotionEvent ev) { - if (mControllerCallbacks != null && ev.getAction() == MotionEvent.ACTION_OUTSIDE) { - mControllerCallbacks.onActionOutsideEvent(); + if (mControllerCallbacks != null) { + mControllerCallbacks.tryStashBasedOnMotionEvent(ev); } return super.onTouchEvent(ev); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java index 13ecf81a7d..fe8a04ce81 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java @@ -18,10 +18,12 @@ package com.android.launcher3.taskbar; import android.content.res.Resources; import android.graphics.Point; import android.graphics.Rect; +import android.view.MotionEvent; import android.view.ViewTreeObserver; import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; +import com.android.launcher3.testing.shared.ResourceUtils; import com.android.launcher3.util.DimensionUtils; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.TouchController; @@ -37,6 +39,7 @@ public class TaskbarDragLayerController implements TaskbarControllers.LoggableTa private final TaskbarActivityContext mActivity; private final TaskbarDragLayer mTaskbarDragLayer; private final int mFolderMargin; + private float mGestureHeightYThreshold; // Alpha properties for taskbar background. private final AnimatedFloat mBgTaskbar = new AnimatedFloat(this::updateBackgroundAlpha); @@ -63,6 +66,7 @@ public class TaskbarDragLayerController implements TaskbarControllers.LoggableTa mTaskbarDragLayer = taskbarDragLayer; final Resources resources = mTaskbarDragLayer.getResources(); mFolderMargin = resources.getDimensionPixelSize(R.dimen.taskbar_folder_margin); + updateGestureHeight(); } public void init(TaskbarControllers controllers) { @@ -122,6 +126,19 @@ public class TaskbarDragLayerController implements TaskbarControllers.LoggableTa return mBgOffset; } + private void updateGestureHeight() { + int gestureHeight = ResourceUtils.getNavbarSize(ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE, + mActivity.getResources()); + mGestureHeightYThreshold = mActivity.getDeviceProfile().heightPx - gestureHeight; + } + + /** + * Make updates when configuration changes. + */ + public void onConfigurationChanged() { + updateGestureHeight(); + } + private void updateBackgroundAlpha() { final float bgNavbar = mBgNavbar.value; final float bgTaskbar = mBgTaskbar.value * mKeyguardBgTaskbar.value @@ -158,6 +175,8 @@ public class TaskbarDragLayerController implements TaskbarControllers.LoggableTa */ public class TaskbarDragLayerCallbacks { + private final int[] mTempOutLocation = new int[2]; + /** * Called to update the touchable insets. * @see ViewTreeObserver.InternalInsetsInfo#setTouchableInsets(int) @@ -167,9 +186,9 @@ public class TaskbarDragLayerController implements TaskbarControllers.LoggableTa } /** - * Called whenever TaskbarDragLayer receives an ACTION_OUTSIDE event. + * Listens to TaskbarDragLayer touch events and responds accordingly. */ - public void onActionOutsideEvent() { + public void tryStashBasedOnMotionEvent(MotionEvent ev) { if (!DisplayController.isTransientTaskbar(mActivity)) { return; } @@ -177,7 +196,24 @@ public class TaskbarDragLayerController implements TaskbarControllers.LoggableTa return; } - mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(true); + boolean stashTaskbar = false; + + MotionEvent screenCoordinates = MotionEvent.obtain(ev); + if (ev.getAction() == MotionEvent.ACTION_OUTSIDE) { + stashTaskbar = true; + } else if (ev.getAction() == MotionEvent.ACTION_DOWN) { + mTaskbarDragLayer.getLocationOnScreen(mTempOutLocation); + screenCoordinates.offsetLocation(mTempOutLocation[0], mTempOutLocation[1]); + + if (!mControllers.taskbarViewController.isEventOverAnyItem(screenCoordinates) + && screenCoordinates.getY() < mGestureHeightYThreshold) { + stashTaskbar = true; + } + } + + if (stashTaskbar) { + mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(true); + } } /**