From 9732df1addac665f61f0b7ebd63e1e08607bce3a Mon Sep 17 00:00:00 2001 From: Andras Kloczl Date: Thu, 9 Sep 2021 19:40:42 +0100 Subject: [PATCH] Fix two dragging related bugs in Launcher home - accessibility bug: 199394124 - dragging on side bug: http://shortn/_LFBdIllupk Test: manual Bug: 199394124 Change-Id: I478e31332119f337bf0f8b6c92926845eb4889c4 --- src/com/android/launcher3/PagedView.java | 2 +- src/com/android/launcher3/Workspace.java | 31 ++++++++++++++++-------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index 2f9b5af050..978886d96d 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -1553,7 +1553,7 @@ public abstract class PagedView extends ViewGrou return getDisplacementFromScreenCenter(childIndex, screenCenter); } - private int getScreenCenter(int primaryScroll) { + protected int getScreenCenter(int primaryScroll) { float primaryScale = mOrientationHandler.getPrimaryScale(this); float primaryPivot = mOrientationHandler.getPrimaryValue(getPivotX(), getPivotY()); int pageOrientationSize = mOrientationHandler.getMeasuredSize(this); diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index a21c8e30f1..8a43ca991f 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -2453,21 +2453,32 @@ public class Workspace extends PagedView } int nextPage = getNextPage(); - if (layout == null && !isPageInTransition()) { - layout = verifyInsidePage(nextPage + (mIsRtl ? 1 : -1), Math.min(centerX, d.x), d.y); + IntSet pageIndexesToVerify = IntSet.wrap(nextPage - 1, nextPage + 1); + if (isTwoPanelEnabled()) { + // If two panel is enabled, users can also drag items to nextPage + 2 + pageIndexesToVerify.add(nextPage + 2); } - if (layout == null && !isPageInTransition()) { - layout = verifyInsidePage(nextPage + (mIsRtl ? -1 : 1), Math.max(centerX, d.x), d.y); + int touchX = (int) Math.min(centerX, d.x); + int touchY = d.y; + + // Go through the pages and check if the dragged item is inside one of them + for (int pageIndex : pageIndexesToVerify) { + if (layout != null || isPageInTransition()) { + break; + } + layout = verifyInsidePage(pageIndex, touchX, touchY); } - // If two panel is enabled, users can also drag items to currentPage + 2 - if (isTwoPanelEnabled() && layout == null && !isPageInTransition()) { - layout = verifyInsidePage(nextPage + (mIsRtl ? -2 : 2), Math.max(centerX, d.x), d.y); - } - - // Always pick the current page. + // If the dragged item isn't located in one of the pages above, the icon will stay on the + // current screen. For two panel pick the closest panel on the current screen, + // on one panel just choose the current page. if (layout == null && nextPage >= 0 && nextPage < getPageCount()) { + if (isTwoPanelEnabled()) { + nextPage = getScreenCenter(getScrollX()) > touchX + ? (mIsRtl ? nextPage + 1 : nextPage) // left side + : (mIsRtl ? nextPage : nextPage + 1); // right side + } layout = (CellLayout) getChildAt(nextPage); } if (layout != mDragTargetLayout) {