summaryrefslogtreecommitdiff
path: root/core/java/android/widget/TextView.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/widget/TextView.java')
-rw-r--r--core/java/android/widget/TextView.java79
1 files changed, 49 insertions, 30 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index b6dd59dd891f..d6e597407f3f 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -319,6 +319,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
private int mLastDownPositionX, mLastDownPositionY;
private Callback mCustomSelectionActionModeCallback;
+ private final int mSquaredTouchSlopDistance;
+
/*
* Kick-start the font cache for the zygote process (to pay the cost of
* initializing freetype for our default font only once).
@@ -1009,6 +1011,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
setLongClickable(longClickable);
prepareCursorControllers();
+
+ final ViewConfiguration viewConfiguration = ViewConfiguration.get(context);
+ final int touchSlop = viewConfiguration.getScaledTouchSlop();
+ mSquaredTouchSlopDistance = touchSlop * touchSlop;
}
private void setTypefaceByIndex(int typefaceIndex, int styleIndex) {
@@ -8402,15 +8408,24 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
private float mTouchOffsetY;
private int mLastParentX;
private int mLastParentY;
+ private float mDownPositionX, mDownPositionY;
private int mContainerPositionX, mContainerPositionY;
private long mTouchTimer;
- private boolean mHasPastePopupWindow = false;
+ private boolean mIsInsertionHandle = false;
private PastePopupMenu mPastePopupWindow;
+ private LongPressCallback mLongPressCallback;
public static final int LEFT = 0;
public static final int CENTER = 1;
public static final int RIGHT = 2;
+ class LongPressCallback implements Runnable {
+ public void run() {
+ mController.hide();
+ startSelectionActionMode();
+ }
+ }
+
public HandleView(CursorController controller, int pos) {
super(TextView.this.mContext);
mController = controller;
@@ -8457,7 +8472,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
mDrawable = mSelectHandleCenter;
handleWidth = mDrawable.getIntrinsicWidth();
mHotspotX = handleWidth / 2;
- mHasPastePopupWindow = true;
+ mIsInsertionHandle = true;
break;
}
}
@@ -8616,20 +8631,25 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
- final float rawX = ev.getRawX();
- final float rawY = ev.getRawY();
- mTouchToWindowOffsetX = rawX - mPositionX;
- mTouchToWindowOffsetY = rawY - mPositionY;
+ mDownPositionX = ev.getRawX();
+ mDownPositionY = ev.getRawY();
+ mTouchToWindowOffsetX = mDownPositionX - mPositionX;
+ mTouchToWindowOffsetY = mDownPositionY - mPositionY;
final int[] coords = mTempCoords;
TextView.this.getLocationInWindow(coords);
mLastParentX = coords[0];
mLastParentY = coords[1];
mIsDragging = true;
- if (mHasPastePopupWindow) {
+ if (mIsInsertionHandle) {
mTouchTimer = SystemClock.uptimeMillis();
+ if (mLongPressCallback == null) {
+ mLongPressCallback = new LongPressCallback();
+ }
+ postDelayed(mLongPressCallback, ViewConfiguration.getLongPressTimeout());
}
break;
}
+
case MotionEvent.ACTION_MOVE: {
final float rawX = ev.getRawX();
final float rawY = ev.getRawY();
@@ -8638,35 +8658,37 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
mController.updatePosition(this, Math.round(newPosX), Math.round(newPosY));
+ if (mIsInsertionHandle) {
+ final float dx = rawX - mDownPositionX;
+ final float dy = rawY - mDownPositionY;
+ final float distanceSquared = dx * dx + dy * dy;
+ if (distanceSquared >= mSquaredTouchSlopDistance) {
+ removeCallbacks(mLongPressCallback);
+ }
+ }
break;
}
+
case MotionEvent.ACTION_UP:
- if (mHasPastePopupWindow) {
+ if (mIsInsertionHandle) {
+ removeCallbacks(mLongPressCallback);
long delay = SystemClock.uptimeMillis() - mTouchTimer;
if (delay < ViewConfiguration.getTapTimeout()) {
- final float touchOffsetX = ev.getRawX() - mPositionX;
- final float touchOffsetY = ev.getRawY() - mPositionY;
- final float dx = touchOffsetX - mTouchToWindowOffsetX;
- final float dy = touchOffsetY - mTouchToWindowOffsetY;
- final float distanceSquared = dx * dx + dy * dy;
- final ViewConfiguration viewConfiguration = ViewConfiguration.get(getContext());
- final int doubleTapSlop = viewConfiguration.getScaledDoubleTapSlop();
- final int slopSquared = doubleTapSlop * doubleTapSlop;
- if (distanceSquared < slopSquared) {
- if (mPastePopupWindow != null && mPastePopupWindow.isShowing()) {
- // Tapping on the handle dismisses the displayed paste view,
- mPastePopupWindow.hide();
- } else {
- ((InsertionPointCursorController) mController).show(0);
- }
+ if (mPastePopupWindow != null && mPastePopupWindow.isShowing()) {
+ // Tapping on the handle dismisses the displayed paste view,
+ mPastePopupWindow.hide();
+ } else {
+ ((InsertionPointCursorController) mController).show(0);
}
- } else {
- mController.show();
}
}
mIsDragging = false;
break;
+
case MotionEvent.ACTION_CANCEL:
+ if (mIsInsertionHandle) {
+ removeCallbacks(mLongPressCallback);
+ }
mIsDragging = false;
}
return true;
@@ -8696,7 +8718,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
void showPastePopupWindow() {
- if (mHasPastePopupWindow) {
+ if (mIsInsertionHandle) {
if (mPastePopupWindow == null) {
// Lazy initialisation: create when actually shown only.
mPastePopupWindow = new PastePopupMenu();
@@ -8924,10 +8946,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
final int deltaX = x - mPreviousTapPositionX;
final int deltaY = y - mPreviousTapPositionY;
final int distanceSquared = deltaX * deltaX + deltaY * deltaY;
- final int doubleTapSlop =
- ViewConfiguration.get(getContext()).getScaledDoubleTapSlop();
- final int slopSquared = doubleTapSlop * doubleTapSlop;
- if (distanceSquared < slopSquared) {
+ if (distanceSquared < mSquaredTouchSlopDistance) {
startSelectionActionMode();
mDiscardNextActionUp = true;
}