From bb0305614c255a0ae6eb9aee4049f500e8100ee7 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 19 Jul 2021 16:28:39 -0700 Subject: [PATCH] Preventing workspace scroll over QSB area Bug: 189792966 Test: Manual Change-Id: Ie2fe8e7fb6c80b9cc19d517fe828cf26f54f6f09 --- src/com/android/launcher3/Launcher.java | 2 +- src/com/android/launcher3/PagedView.java | 2 +- src/com/android/launcher3/Workspace.java | 40 +++++++++++++++--------- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 6ea7b17871..0669176aa5 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1195,7 +1195,7 @@ public class Launcher extends StatefulActivity implements Launche // Until the workspace is bound, ensure that we keep the wallpaper offset locked to the // default state, otherwise we will update to the wrong offsets in RTL mWorkspace.lockWallpaperToDefaultPage(); - mWorkspace.bindAndInitFirstWorkspaceScreen(null /* recycled qsb */); + mWorkspace.bindAndInitFirstWorkspaceScreen(); mDragController.addDragListener(mWorkspace); // Get the search/delete/uninstall bar diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index 696e89716f..2f9b5af050 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -1046,7 +1046,7 @@ public abstract class PagedView extends ViewGrou /** * If being flinged and user touches the screen, initiate drag; otherwise don't. */ - private void updateIsBeingDraggedOnTouchDown(MotionEvent ev) { + protected void updateIsBeingDraggedOnTouchDown(MotionEvent ev) { // mScroller.isFinished should be false when being flinged. final int xDist = Math.abs(mScroller.getFinalX() - mScroller.getCurrX()); final boolean finishedScrolling = (mScroller.isFinished() || xDist < mPageSlop / 3); diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 94ec903b86..b197e1cb08 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -223,6 +223,9 @@ public class Workspace extends PagedView // Variables relating to touch disambiguation (scrolling workspace vs. scrolling a widget) private float mXDown; private float mYDown; + private View mQsb; + private boolean mIsEventOverQsb; + final static float START_DAMPING_TOUCH_SLOP_ANGLE = (float) Math.PI / 6; final static float MAX_SWIPE_ANGLE = (float) Math.PI / 3; final static float TOUCH_SLOP_DAMPING_FACTOR = 4; @@ -548,9 +551,8 @@ public class Workspace extends PagedView /** * Initializes and binds the first page - * @param qsb an existing qsb to recycle or null. */ - public void bindAndInitFirstWorkspaceScreen(View qsb) { + public void bindAndInitFirstWorkspaceScreen() { if (!FeatureFlags.QSB_ON_FIRST_SCREEN) { return; } @@ -558,10 +560,10 @@ public class Workspace extends PagedView // Add the first page CellLayout firstPage = insertNewWorkspaceScreen(Workspace.FIRST_SCREEN_ID, getChildCount()); // Always add a QSB on the first screen. - if (qsb == null) { + if (mQsb == null) { // In transposed layout, we add the QSB in the Grid. As workspace does not touch the // edges, we do not need a full width QSB. - qsb = LayoutInflater.from(getContext()) + mQsb = LayoutInflater.from(getContext()) .inflate(R.layout.search_container_workspace, firstPage, false); } @@ -570,8 +572,9 @@ public class Workspace extends PagedView CellLayout.LayoutParams lp = new CellLayout.LayoutParams(0, 0, firstPage.getCountX(), cellVSpan); lp.canReorder = false; - if (!firstPage.addViewToCellLayout(qsb, 0, R.id.search_container_workspace, lp, true)) { + if (!firstPage.addViewToCellLayout(mQsb, 0, R.id.search_container_workspace, lp, true)) { Log.e(TAG, "Failed to add to item at (0, 0) to CellLayout"); + mQsb = null; } } @@ -581,9 +584,8 @@ public class Workspace extends PagedView disableLayoutTransitions(); // Recycle the QSB widget - View qsb = findViewById(R.id.search_container_workspace); - if (qsb != null) { - ((ViewGroup) qsb.getParent()).removeView(qsb); + if (mQsb != null) { + ((ViewGroup) mQsb.getParent()).removeView(mQsb); } // Remove the pages and clear the screen models @@ -596,7 +598,7 @@ public class Workspace extends PagedView mLauncher.mHandler.removeCallbacksAndMessages(DeferredWidgetRefresh.class); // Ensure that the first page is always present - bindAndInitFirstWorkspaceScreen(qsb); + bindAndInitFirstWorkspaceScreen(); // Re-enable the layout transitions enableLayoutTransitions(); @@ -922,17 +924,25 @@ public class Workspace extends PagedView } @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) { - mXDown = ev.getX(); - mYDown = ev.getY(); + protected void updateIsBeingDraggedOnTouchDown(MotionEvent ev) { + super.updateIsBeingDraggedOnTouchDown(ev); + + mXDown = ev.getX(); + mYDown = ev.getY(); + if (mQsb != null) { + mTempFXY[0] = mXDown + getScrollX(); + mTempFXY[1] = mYDown + getScrollY(); + Utilities.mapCoordInSelfToDescendant(mQsb, this, mTempFXY); + mIsEventOverQsb = mQsb.getLeft() <= mTempFXY[0] && mQsb.getRight() >= mTempFXY[0] + && mQsb.getTop() <= mTempFXY[1] && mQsb.getBottom() >= mTempFXY[1]; + } else { + mIsEventOverQsb = false; } - return super.onInterceptTouchEvent(ev); } @Override protected void determineScrollingStart(MotionEvent ev) { - if (!isFinishedSwitchingState()) return; + if (!isFinishedSwitchingState() || mIsEventOverQsb) return; float deltaX = ev.getX() - mXDown; float absDeltaX = Math.abs(deltaX);