Loading core/java/android/widget/Editor.java +31 −8 Original line number Diff line number Diff line Loading @@ -209,6 +209,10 @@ public class Editor { // Set when this TextView gained focus with some text selected. Will start selection mode. boolean mCreatedWithASelection; boolean mDoubleTap = false; private Runnable mSelectionModeWithoutSelectionRunnable; // The span controller helps monitoring the changes to which the Editor needs to react: // - EasyEditSpans, for which we have some UI to display on attach and on hide // - SelectionSpans, for which we need to call updateSelection if an IME is attached Loading Loading @@ -349,6 +353,11 @@ public class Editor { mTextView.removeCallbacks(mShowSuggestionRunnable); } // Cancel the single tap delayed runnable. if (mSelectionModeWithoutSelectionRunnable != null) { mTextView.removeCallbacks(mSelectionModeWithoutSelectionRunnable); } destroyDisplayListsData(); if (mSpellChecker != null) { Loading Loading @@ -3722,11 +3731,29 @@ public class Editor { public void show() { super.show(); final long durationSinceLastCutCopyOrTextChanged = final long durationSinceCutOrCopy = SystemClock.uptimeMillis() - TextView.sLastCutCopyOrTextChangedTime; if (durationSinceLastCutCopyOrTextChanged < RECENT_CUT_COPY_DURATION) { // Cancel the single tap delayed runnable. if (mDoubleTap && mSelectionModeWithoutSelectionRunnable != null) { mTextView.removeCallbacks(mSelectionModeWithoutSelectionRunnable); } // Prepare and schedule the single tap runnable to run exactly after the double tap // timeout has passed. if (!mDoubleTap && (durationSinceCutOrCopy < RECENT_CUT_COPY_DURATION)) { if (mSelectionModeWithoutSelectionRunnable == null) { mSelectionModeWithoutSelectionRunnable = new Runnable() { public void run() { startSelectionActionModeWithoutSelection(); } }; } mTextView.postDelayed( mSelectionModeWithoutSelectionRunnable, ViewConfiguration.getDoubleTapTimeout() + 1); } hideAfterDelay(); } Loading Loading @@ -4159,8 +4186,6 @@ public class Editor { // The offsets of that last touch down event. Remembered to start selection there. private int mMinTouchOffset, mMaxTouchOffset; // Double tap detection private long mPreviousTapUpTime = 0; private float mDownPositionX, mDownPositionY; private boolean mGestureStayedInTapRegion; Loading Loading @@ -4242,8 +4267,7 @@ public class Editor { // Double tap detection if (mGestureStayedInTapRegion) { long duration = SystemClock.uptimeMillis() - mPreviousTapUpTime; if (duration <= ViewConfiguration.getDoubleTapTimeout()) { if (mDoubleTap) { final float deltaX = x - mDownPositionX; final float deltaY = y - mDownPositionY; final float distanceSquared = deltaX * deltaX + deltaY * deltaY; Loading Loading @@ -4352,7 +4376,6 @@ public class Editor { break; case MotionEvent.ACTION_UP: mPreviousTapUpTime = SystemClock.uptimeMillis(); if (mDragAcceleratorActive) { // No longer dragging to select text, let the parent intercept events. mTextView.getParent().requestDisallowInterceptTouchEvent(false); Loading core/java/android/widget/TextView.java +19 −0 Original line number Diff line number Diff line Loading @@ -599,6 +599,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private final Paint mHighlightPaint; private boolean mHighlightPathBogus = true; private boolean mFirstTouch = false; private long mLastTouchUpTime = 0; // Although these fields are specific to editable text, they are not added to Editor because // they are defined by the TextView's style and are theme-dependent. int mCursorDrawableRes; Loading Loading @@ -8279,6 +8282,22 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener public boolean onTouchEvent(MotionEvent event) { final int action = event.getActionMasked(); if (mEditor != null && action == MotionEvent.ACTION_DOWN) { // Detect double tap and inform the Editor. if (mFirstTouch && (SystemClock.uptimeMillis() - mLastTouchUpTime) <= ViewConfiguration.getDoubleTapTimeout()) { mEditor.mDoubleTap = true; mFirstTouch = false; } else { mEditor.mDoubleTap = false; mFirstTouch = true; } } if (action == MotionEvent.ACTION_UP) { mLastTouchUpTime = SystemClock.uptimeMillis(); } if (mEditor != null) { mEditor.onTouchEvent(event); Loading Loading
core/java/android/widget/Editor.java +31 −8 Original line number Diff line number Diff line Loading @@ -209,6 +209,10 @@ public class Editor { // Set when this TextView gained focus with some text selected. Will start selection mode. boolean mCreatedWithASelection; boolean mDoubleTap = false; private Runnable mSelectionModeWithoutSelectionRunnable; // The span controller helps monitoring the changes to which the Editor needs to react: // - EasyEditSpans, for which we have some UI to display on attach and on hide // - SelectionSpans, for which we need to call updateSelection if an IME is attached Loading Loading @@ -349,6 +353,11 @@ public class Editor { mTextView.removeCallbacks(mShowSuggestionRunnable); } // Cancel the single tap delayed runnable. if (mSelectionModeWithoutSelectionRunnable != null) { mTextView.removeCallbacks(mSelectionModeWithoutSelectionRunnable); } destroyDisplayListsData(); if (mSpellChecker != null) { Loading Loading @@ -3722,11 +3731,29 @@ public class Editor { public void show() { super.show(); final long durationSinceLastCutCopyOrTextChanged = final long durationSinceCutOrCopy = SystemClock.uptimeMillis() - TextView.sLastCutCopyOrTextChangedTime; if (durationSinceLastCutCopyOrTextChanged < RECENT_CUT_COPY_DURATION) { // Cancel the single tap delayed runnable. if (mDoubleTap && mSelectionModeWithoutSelectionRunnable != null) { mTextView.removeCallbacks(mSelectionModeWithoutSelectionRunnable); } // Prepare and schedule the single tap runnable to run exactly after the double tap // timeout has passed. if (!mDoubleTap && (durationSinceCutOrCopy < RECENT_CUT_COPY_DURATION)) { if (mSelectionModeWithoutSelectionRunnable == null) { mSelectionModeWithoutSelectionRunnable = new Runnable() { public void run() { startSelectionActionModeWithoutSelection(); } }; } mTextView.postDelayed( mSelectionModeWithoutSelectionRunnable, ViewConfiguration.getDoubleTapTimeout() + 1); } hideAfterDelay(); } Loading Loading @@ -4159,8 +4186,6 @@ public class Editor { // The offsets of that last touch down event. Remembered to start selection there. private int mMinTouchOffset, mMaxTouchOffset; // Double tap detection private long mPreviousTapUpTime = 0; private float mDownPositionX, mDownPositionY; private boolean mGestureStayedInTapRegion; Loading Loading @@ -4242,8 +4267,7 @@ public class Editor { // Double tap detection if (mGestureStayedInTapRegion) { long duration = SystemClock.uptimeMillis() - mPreviousTapUpTime; if (duration <= ViewConfiguration.getDoubleTapTimeout()) { if (mDoubleTap) { final float deltaX = x - mDownPositionX; final float deltaY = y - mDownPositionY; final float distanceSquared = deltaX * deltaX + deltaY * deltaY; Loading Loading @@ -4352,7 +4376,6 @@ public class Editor { break; case MotionEvent.ACTION_UP: mPreviousTapUpTime = SystemClock.uptimeMillis(); if (mDragAcceleratorActive) { // No longer dragging to select text, let the parent intercept events. mTextView.getParent().requestDisallowInterceptTouchEvent(false); Loading
core/java/android/widget/TextView.java +19 −0 Original line number Diff line number Diff line Loading @@ -599,6 +599,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private final Paint mHighlightPaint; private boolean mHighlightPathBogus = true; private boolean mFirstTouch = false; private long mLastTouchUpTime = 0; // Although these fields are specific to editable text, they are not added to Editor because // they are defined by the TextView's style and are theme-dependent. int mCursorDrawableRes; Loading Loading @@ -8279,6 +8282,22 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener public boolean onTouchEvent(MotionEvent event) { final int action = event.getActionMasked(); if (mEditor != null && action == MotionEvent.ACTION_DOWN) { // Detect double tap and inform the Editor. if (mFirstTouch && (SystemClock.uptimeMillis() - mLastTouchUpTime) <= ViewConfiguration.getDoubleTapTimeout()) { mEditor.mDoubleTap = true; mFirstTouch = false; } else { mEditor.mDoubleTap = false; mFirstTouch = true; } } if (action == MotionEvent.ACTION_UP) { mLastTouchUpTime = SystemClock.uptimeMillis(); } if (mEditor != null) { mEditor.onTouchEvent(event); Loading