From 7205b24938a910495b4aa53cb59685b808d77403 Mon Sep 17 00:00:00 2001 From: Artsiom Mitrokhin Date: Fri, 18 Oct 2024 14:33:13 -0400 Subject: [PATCH] Ignore events that occur between app icons on the taskbar Bug: 297325541 Flag: com.android.launcher3.show_taskbar_pinning_popup_from_anywhere Test: manual, flip the flag, long-click between taskbar items Change-Id: If2ee00f31fcd1788bac2c2c0cd78ba1eada86115 --- .../taskbar/NavbarButtonsViewController.java | 7 ++-- .../taskbar/StashedHandleViewController.java | 3 +- .../launcher3/taskbar/TaskbarView.java | 34 +++++++++++++++---- .../taskbar/TaskbarViewCallbacks.java | 17 +++++++--- .../taskbar/TaskbarViewController.java | 12 +++---- .../taskbar/bubbles/BubbleControllers.java | 3 +- .../launcher3/taskbar/TaskbarOverflowTest.kt | 5 +-- 7 files changed, 58 insertions(+), 23 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java index f9e7cf0f08..85ce1f2b60 100644 --- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java @@ -1306,7 +1306,8 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT // If the task bar is not start aligned, the navigation bar is located in the center // between the taskbar and screen edges, depending on the bubble bar location. float navbarWidth = mNavButtonContainer.getWidth(); - Rect taskbarBounds = mControllers.taskbarViewController.getIconLayoutBounds(); + Rect taskbarBounds = mControllers.taskbarViewController + .getTransientTaskbarIconLayoutBoundsInParent(); if (isNavbarOnRight) { if (mNavButtonsView.isLayoutRtl()) { float taskBarEnd = taskbarBounds.right; @@ -1326,8 +1327,10 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT public void onLayoutsUpdated() { // no need to do anything if on phone, or if taskbar or navbar views were not placed on // screen. + Rect transientTaskbarIconLayoutBoundsInParent = mControllers.taskbarViewController + .getTransientTaskbarIconLayoutBoundsInParent(); if (mContext.getDeviceProfile().isPhone - || mControllers.taskbarViewController.getIconLayoutBounds().isEmpty() + || transientTaskbarIconLayoutBoundsInParent.isEmpty() || mNavButtonsView.getWidth() == 0) { return; } diff --git a/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java b/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java index eb47bb0684..b6b090c39b 100644 --- a/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java @@ -212,7 +212,8 @@ public class StashedHandleViewController implements TaskbarControllers.LoggableT * morphs into the size of where the taskbar icons will be. */ public Animator createRevealAnimToIsStashed(boolean isStashed) { - Rect visualBounds = mControllers.taskbarViewController.getIconLayoutVisualBounds(); + Rect visualBounds = mControllers.taskbarViewController + .getTransientTaskbarIconLayoutBounds(); float startRadius = mStashedHandleRadius; if (DisplayController.isTransientTaskbar(mActivity)) { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java index 3c5d71e1e8..fb172b0573 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java @@ -649,7 +649,7 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar ) { return 0; } - Rect iconsBounds = getIconLayoutBounds(); + Rect iconsBounds = getTransientTaskbarIconLayoutBoundsInParent(); return getTaskBarIconsEndForBubbleBarLocation(location) - iconsBounds.right; } @@ -777,26 +777,46 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar } /** - * Returns whether the given MotionEvent, *in screen coorindates*, is within any Taskbar item's + * Returns whether the given MotionEvent, *in screen coordinates*, is within any Taskbar item's * touch bounds. */ public boolean isEventOverAnyItem(MotionEvent ev) { getLocationOnScreen(mTempOutLocation); - int xInOurCoordinates = (int) ev.getX() - mTempOutLocation[0]; - int yInOurCoorindates = (int) ev.getY() - mTempOutLocation[1]; - return isShown() && mIconLayoutBounds.contains(xInOurCoordinates, yInOurCoorindates); + int xInOurCoordinates = (int) ev.getRawX() - mTempOutLocation[0]; + int yInOurCoordinates = (int) ev.getRawY() - mTempOutLocation[1]; + return isShown() && getTaskbarIconsActualBounds().contains(xInOurCoordinates, + yInOurCoordinates); + } + + /** + * Returns the current visual taskbar icons bounds (unlike `mIconLayoutBounds` which contains + * bounds for transient mode only). + */ + private Rect getTaskbarIconsActualBounds() { + View[] iconViews = getIconViews(); + if (iconViews.length == 0) { + return new Rect(); + } + + int[] firstIconViewLocation = new int[2]; + int[] lastIconViewLocation = new int[2]; + iconViews[0].getLocationOnScreen(firstIconViewLocation); + iconViews[iconViews.length - 1].getLocationOnScreen(lastIconViewLocation); + + return new Rect(firstIconViewLocation[0], 0, lastIconViewLocation[0] + mIconTouchSize, + getHeight()); } /** * Gets visual bounds of the taskbar view. The visual bounds correspond to the taskbar touch * area, rather than layout placement in the parent view. */ - public Rect getIconLayoutVisualBounds() { + public Rect getTransientTaskbarIconLayoutBounds() { return new Rect(mIconLayoutBounds); } /** Gets taskbar layout bounds in parent view. */ - public Rect getIconLayoutBounds() { + public Rect getTransientTaskbarIconLayoutBoundsInParent() { Rect actualBounds = new Rect(mIconLayoutBounds); actualBounds.top = getTop(); actualBounds.bottom = getBottom(); diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java index f65f30799d..fc3af7a5d9 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java @@ -202,6 +202,10 @@ public class TaskbarViewCallbacks { private class TaskbarViewGestureListener extends GestureDetector.SimpleOnGestureListener { @Override public boolean onDown(@NonNull MotionEvent event) { + if (event.isFromSource(InputDevice.SOURCE_MOUSE) + && event.getButtonState() == MotionEvent.BUTTON_SECONDARY) { + maybeShowPinningView(event); + } return true; } @@ -211,11 +215,16 @@ public class TaskbarViewCallbacks { } @Override - public void onLongPress(MotionEvent event) { - if (DisplayController.isPinnedTaskbar(mActivity)) { - mControllers.taskbarPinningController.showPinningView(mTaskbarView, - event.getRawX()); + public void onLongPress(@NonNull MotionEvent event) { + maybeShowPinningView(event); + } + + private void maybeShowPinningView(@NonNull MotionEvent event) { + if (!DisplayController.isPinnedTaskbar(mActivity) || mTaskbarView.isEventOverAnyItem( + event)) { + return; } + mControllers.taskbarPinningController.showPinningView(mTaskbarView, event.getRawX()); } } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java index bc5f9a3ca9..4acf2fe378 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java @@ -356,12 +356,12 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar return mTaskbarView.getMaxNumIconViews(); } - public Rect getIconLayoutVisualBounds() { - return mTaskbarView.getIconLayoutVisualBounds(); + public Rect getTransientTaskbarIconLayoutBounds() { + return mTaskbarView.getTransientTaskbarIconLayoutBounds(); } - public Rect getIconLayoutBounds() { - return mTaskbarView.getIconLayoutBounds(); + public Rect getTransientTaskbarIconLayoutBoundsInParent() { + return mTaskbarView.getTransientTaskbarIconLayoutBoundsInParent(); } public View[] getIconViews() { @@ -559,14 +559,14 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar if (mControllers.getSharedState().startTaskbarVariantIsTransient) { float transY = mTransientTaskbarDp.taskbarBottomMargin + (mTransientTaskbarDp.taskbarHeight - - mTaskbarView.getIconLayoutVisualBounds().bottom) + - mTaskbarView.getTransientTaskbarIconLayoutBounds().bottom) - (mPersistentTaskbarDp.taskbarHeight - mTransientTaskbarDp.taskbarIconSize) / 2f; taskbarIconTranslationYForPinningValue = mapRange(scale, 0f, transY); } else { float transY = -mTransientTaskbarDp.taskbarBottomMargin + (mPersistentTaskbarDp.taskbarHeight - - mTaskbarView.getIconLayoutVisualBounds().bottom) + - mTaskbarView.getTransientTaskbarIconLayoutBounds().bottom) - (mTransientTaskbarDp.taskbarHeight - mTransientTaskbarDp.taskbarIconSize) / 2f; taskbarIconTranslationYForPinningValue = mapRange(scale, transY, 0f); diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleControllers.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleControllers.java index cb592e6006..68917ff236 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleControllers.java +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleControllers.java @@ -102,7 +102,8 @@ public class BubbleControllers { new TaskbarViewPropertiesProvider() { @Override public Rect getTaskbarViewBounds() { - return taskbarControllers.taskbarViewController.getIconLayoutBounds(); + return taskbarControllers.taskbarViewController + .getTransientTaskbarIconLayoutBoundsInParent(); } @Override diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt index cc8582c957..5867e77f46 100644 --- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt +++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt @@ -272,7 +272,8 @@ class TaskbarOverflowTest { private val taskbarIconsCentered: Boolean get() { return getOnUiThread { - val iconLayoutBounds = taskbarViewController.iconLayoutBounds + val iconLayoutBounds = + taskbarViewController.transientTaskbarIconLayoutBoundsInParent val availableWidth = taskbarUnitTestRule.activityContext.deviceProfile.widthPx iconLayoutBounds.left - (availableWidth - iconLayoutBounds.right) < 2 } @@ -282,7 +283,7 @@ class TaskbarOverflowTest { get() { return getOnUiThread { taskbarUnitTestRule.activityContext.deviceProfile.widthPx - - taskbarViewController.iconLayoutBounds.right + taskbarViewController.transientTaskbarIconLayoutBoundsInParent.right } }