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:
parent
b9ba427576
commit
848696ac1d
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue