Increase drag distance threshold when drag starts from deep press

Also don't update distance dragged until drag actually starts
(otherwise we add a lot of motion before deep press triggers).

Bug: 146146413
Change-Id: I28bd23707a9be53c709d7a4e779e84b9a0be9ce2
(cherry picked from commit a7704c09c7)
This commit is contained in:
Tony Wickham 2019-12-22 15:17:18 -08:00
parent b9ba427576
commit 848696ac1d
1 changed files with 23 additions and 8 deletions

View File

@ -19,6 +19,7 @@ package com.android.launcher3.dragndrop;
import static com.android.launcher3.AbstractFloatingView.TYPE_DISCOVERY_BOUNCE; import static com.android.launcher3.AbstractFloatingView.TYPE_DISCOVERY_BOUNCE;
import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY; import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY;
import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.NORMAL;
import static com.android.launcher3.Utilities.ATLEAST_Q;
import android.animation.ValueAnimator; import android.animation.ValueAnimator;
import android.content.ComponentName; import android.content.ComponentName;
@ -56,6 +57,12 @@ import java.util.ArrayList;
public class DragController implements DragDriver.EventListener, TouchController { public class DragController implements DragDriver.EventListener, TouchController {
private static final boolean PROFILE_DRAWING_DURING_DRAG = false; private static final boolean PROFILE_DRAWING_DURING_DRAG = false;
/**
* When a drag is started from a deep press, you need to drag this much farther than normal to
* end a pre-drag. See {@link DragOptions.PreDragCondition#shouldStartDrag(double)}.
*/
private static final int DEEP_PRESS_DISTANCE_FACTOR = 3;
@Thunk Launcher mLauncher; @Thunk Launcher mLauncher;
private FlingToDeleteHelper mFlingToDeleteHelper; private FlingToDeleteHelper mFlingToDeleteHelper;
@ -91,9 +98,10 @@ public class DragController implements DragDriver.EventListener, TouchController
private DropTarget mLastDropTarget; private DropTarget mLastDropTarget;
@Thunk int mLastTouch[] = new int[2]; private final int[] mLastTouch = new int[2];
@Thunk long mLastTouchUpTime = -1; private long mLastTouchUpTime = -1;
@Thunk int mDistanceSinceScroll = 0; private int mLastTouchClassification;
private int mDistanceSinceScroll = 0;
private int mTmpPoint[] = new int[2]; private int mTmpPoint[] = new int[2];
private Rect mDragLayerRect = new Rect(); private Rect mDragLayerRect = new Rect();
@ -204,7 +212,7 @@ public class DragController implements DragDriver.EventListener, TouchController
} }
mLauncher.getDragLayer().performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); mLauncher.getDragLayer().performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
dragView.show(mMotionDownX, mMotionDownY); dragView.show(mLastTouch[0], mLastTouch[1]);
mDistanceSinceScroll = 0; mDistanceSinceScroll = 0;
if (!mIsInPreDrag) { if (!mIsInPreDrag) {
@ -213,9 +221,7 @@ public class DragController implements DragDriver.EventListener, TouchController
mOptions.preDragCondition.onPreDragStart(mDragObject); mOptions.preDragCondition.onPreDragStart(mDragObject);
} }
mLastTouch[0] = mMotionDownX; handleMoveEvent(mLastTouch[0], mLastTouch[1]);
mLastTouch[1] = mMotionDownY;
handleMoveEvent(mMotionDownX, mMotionDownY);
mLauncher.getUserEventDispatcher().resetActionDurationMillis(); mLauncher.getUserEventDispatcher().resetActionDurationMillis();
return dragView; return dragView;
} }
@ -430,6 +436,11 @@ public class DragController implements DragDriver.EventListener, TouchController
final int[] dragLayerPos = getClampedDragLayerPos(ev.getX(), ev.getY()); final int[] dragLayerPos = getClampedDragLayerPos(ev.getX(), ev.getY());
final int dragLayerX = dragLayerPos[0]; final int dragLayerX = dragLayerPos[0];
final int dragLayerY = dragLayerPos[1]; final int dragLayerY = dragLayerPos[1];
mLastTouch[0] = dragLayerX;
mLastTouch[1] = dragLayerY;
if (ATLEAST_Q) {
mLastTouchClassification = ev.getClassification();
}
switch (action) { switch (action) {
case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_DOWN:
@ -488,8 +499,12 @@ public class DragController implements DragDriver.EventListener, TouchController
mLastTouch[0] = x; mLastTouch[0] = x;
mLastTouch[1] = y; mLastTouch[1] = y;
int distanceDragged = mDistanceSinceScroll;
if (ATLEAST_Q && mLastTouchClassification == MotionEvent.CLASSIFICATION_DEEP_PRESS) {
distanceDragged /= DEEP_PRESS_DISTANCE_FACTOR;
}
if (mIsInPreDrag && mOptions.preDragCondition != null if (mIsInPreDrag && mOptions.preDragCondition != null
&& mOptions.preDragCondition.shouldStartDrag(mDistanceSinceScroll)) { && mOptions.preDragCondition.shouldStartDrag(distanceDragged)) {
callOnDragStart(); callOnDragStart();
} }
} }