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.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY;
import static com.android.launcher3.LauncherState.NORMAL;
import static com.android.launcher3.Utilities.ATLEAST_Q;
import android.animation.ValueAnimator;
import android.content.ComponentName;
@ -56,6 +57,12 @@ import java.util.ArrayList;
public class DragController implements DragDriver.EventListener, TouchController {
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;
private FlingToDeleteHelper mFlingToDeleteHelper;
@ -91,9 +98,10 @@ public class DragController implements DragDriver.EventListener, TouchController
private DropTarget mLastDropTarget;
@Thunk int mLastTouch[] = new int[2];
@Thunk long mLastTouchUpTime = -1;
@Thunk int mDistanceSinceScroll = 0;
private final int[] mLastTouch = new int[2];
private long mLastTouchUpTime = -1;
private int mLastTouchClassification;
private int mDistanceSinceScroll = 0;
private int mTmpPoint[] = new int[2];
private Rect mDragLayerRect = new Rect();
@ -204,7 +212,7 @@ public class DragController implements DragDriver.EventListener, TouchController
}
mLauncher.getDragLayer().performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
dragView.show(mMotionDownX, mMotionDownY);
dragView.show(mLastTouch[0], mLastTouch[1]);
mDistanceSinceScroll = 0;
if (!mIsInPreDrag) {
@ -213,9 +221,7 @@ public class DragController implements DragDriver.EventListener, TouchController
mOptions.preDragCondition.onPreDragStart(mDragObject);
}
mLastTouch[0] = mMotionDownX;
mLastTouch[1] = mMotionDownY;
handleMoveEvent(mMotionDownX, mMotionDownY);
handleMoveEvent(mLastTouch[0], mLastTouch[1]);
mLauncher.getUserEventDispatcher().resetActionDurationMillis();
return dragView;
}
@ -430,6 +436,11 @@ public class DragController implements DragDriver.EventListener, TouchController
final int[] dragLayerPos = getClampedDragLayerPos(ev.getX(), ev.getY());
final int dragLayerX = dragLayerPos[0];
final int dragLayerY = dragLayerPos[1];
mLastTouch[0] = dragLayerX;
mLastTouch[1] = dragLayerY;
if (ATLEAST_Q) {
mLastTouchClassification = ev.getClassification();
}
switch (action) {
case MotionEvent.ACTION_DOWN:
@ -488,8 +499,12 @@ public class DragController implements DragDriver.EventListener, TouchController
mLastTouch[0] = x;
mLastTouch[1] = y;
int distanceDragged = mDistanceSinceScroll;
if (ATLEAST_Q && mLastTouchClassification == MotionEvent.CLASSIFICATION_DEEP_PRESS) {
distanceDragged /= DEEP_PRESS_DISTANCE_FACTOR;
}
if (mIsInPreDrag && mOptions.preDragCondition != null
&& mOptions.preDragCondition.shouldStartDrag(mDistanceSinceScroll)) {
&& mOptions.preDragCondition.shouldStartDrag(distanceDragged)) {
callOnDragStart();
}
}