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
diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
index f9e7cf0..85ce1f2 100644
--- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
@@ -1306,7 +1306,8 @@
// 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 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 eb47bb0..b6b090c 100644
--- a/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java
@@ -212,7 +212,8 @@
* 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 3c5d71e..fb172b0 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java
@@ -649,7 +649,7 @@
) {
return 0;
}
- Rect iconsBounds = getIconLayoutBounds();
+ Rect iconsBounds = getTransientTaskbarIconLayoutBoundsInParent();
return getTaskBarIconsEndForBubbleBarLocation(location) - iconsBounds.right;
}
@@ -777,26 +777,46 @@
}
/**
- * 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 f65f307..fc3af7a 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java
@@ -202,6 +202,10 @@
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 @@
}
@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 bc5f9a3..4acf2fe 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
@@ -356,12 +356,12 @@
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 @@
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 cb592e6..68917ff 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 @@
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 cc8582c..5867e77 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 @@
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 @@
get() {
return getOnUiThread {
taskbarUnitTestRule.activityContext.deviceProfile.widthPx -
- taskbarViewController.iconLayoutBounds.right
+ taskbarViewController.transientTaskbarIconLayoutBoundsInParent.right
}
}