diff options
| -rw-r--r-- | core/java/android/text/method/ArrowKeyMovementMethod.java | 79 | ||||
| -rw-r--r-- | core/java/android/view/View.java | 24 |
2 files changed, 49 insertions, 54 deletions
diff --git a/core/java/android/text/method/ArrowKeyMovementMethod.java b/core/java/android/text/method/ArrowKeyMovementMethod.java index e27804c294cb..0d04b1305487 100644 --- a/core/java/android/text/method/ArrowKeyMovementMethod.java +++ b/core/java/android/text/method/ArrowKeyMovementMethod.java @@ -262,44 +262,51 @@ implements MovementMethod widget.getParent().requestDisallowInterceptTouchEvent(true); } } else if (event.getAction() == MotionEvent.ACTION_MOVE ) { - boolean cap = (MetaKeyKeyListener.getMetaState(buffer, - KeyEvent.META_SHIFT_ON) == 1) || - (MetaKeyKeyListener.getMetaState(buffer, - MetaKeyKeyListener.META_SELECTING) != 0); - - if (cap) { - // Update selection as we're moving the selection area. + boolean cap = (MetaKeyKeyListener.getMetaState(buffer, + KeyEvent.META_SHIFT_ON) == 1) || + (MetaKeyKeyListener.getMetaState(buffer, + MetaKeyKeyListener.META_SELECTING) != 0); - // Get the current touch position - int x = (int) event.getX(); - int y = (int) event.getY(); - int offset = getOffset(x, y, widget); - - // Get the last down touch position (the position at which the - // user started the selection) - int lastDownOffset = buffer.getSpanStart(LAST_TAP_DOWN); - - // Compute the selection boundries - int spanstart; - int spanend; - if (offset >= lastDownOffset) { - // Expand from word start of the original tap to new word - // end, since we are selecting "forwards" - spanstart = findWordStart(buffer, lastDownOffset); - spanend = findWordEnd(buffer, offset); - } else { - // Expand to from new word start to word end of the original - // tap since we are selecting "backwards". - // The spanend will always need to be associated with the touch - // up position, so that refining the selection with the - // trackball will work as expected. - spanstart = findWordEnd(buffer, lastDownOffset); - spanend = findWordStart(buffer, offset); + if (cap & handled) { + // Before selecting, make sure we've moved out of the "slop". + // handled will be true, if we're in select mode AND we're + // OUT of the slop + + // Turn long press off while we're selecting. User needs to + // re-tap on the selection to enable longpress + widget.cancelLongPress(); + + // Update selection as we're moving the selection area. + + // Get the current touch position + int x = (int) event.getX(); + int y = (int) event.getY(); + int offset = getOffset(x, y, widget); + + // Get the last down touch position (the position at which the + // user started the selection) + int lastDownOffset = buffer.getSpanStart(LAST_TAP_DOWN); + + // Compute the selection boundries + int spanstart; + int spanend; + if (offset >= lastDownOffset) { + // Expand from word start of the original tap to new word + // end, since we are selecting "forwards" + spanstart = findWordStart(buffer, lastDownOffset); + spanend = findWordEnd(buffer, offset); + } else { + // Expand to from new word start to word end of the original + // tap since we are selecting "backwards". + // The spanend will always need to be associated with the touch + // up position, so that refining the selection with the + // trackball will work as expected. + spanstart = findWordEnd(buffer, lastDownOffset); + spanend = findWordStart(buffer, offset); + } + Selection.setSelection(buffer, spanstart, spanend); + return true; } - - Selection.setSelection(buffer, spanstart, spanend); - return true; - } } else if (event.getAction() == MotionEvent.ACTION_UP) { // If we have scrolled, then the up shouldn't move the cursor, // but we do need to make sure the cursor is still visible at diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 7f5d254313af..788f04aa16ec 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -2726,9 +2726,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility setPressed(false); if (!mHasPerformedLongPress) { - if (mPendingCheckForLongPress != null) { - removeCallbacks(mPendingCheckForLongPress); - } + cancelLongPress(); } } } @@ -3750,9 +3748,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility if (imm != null && (mPrivateFlags & FOCUSED) != 0) { imm.focusOut(this); } - if (mPendingCheckForLongPress != null) { - removeCallbacks(mPendingCheckForLongPress); - } + cancelLongPress(); onFocusLost(); } else if (imm != null && (mPrivateFlags & FOCUSED) != 0) { imm.focusIn(this); @@ -3998,9 +3994,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility if (!mHasPerformedLongPress) { // This is a tap, so remove the longpress check - if (mPendingCheckForLongPress != null) { - removeCallbacks(mPendingCheckForLongPress); - } + cancelLongPress(); result = performClick(); } @@ -4190,9 +4184,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility if (!mHasPerformedLongPress) { // This is a tap, so remove the longpress check - if (mPendingCheckForLongPress != null) { - removeCallbacks(mPendingCheckForLongPress); - } + cancelLongPress(); // Only perform take click actions if we were in the pressed state if (!focusTaken) { @@ -4235,9 +4227,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility // Outside button if ((mPrivateFlags & PRESSED) != 0) { // Remove any future long press checks - if (mPendingCheckForLongPress != null) { - removeCallbacks(mPendingCheckForLongPress); - } + cancelLongPress(); // Need to switch from pressed to not pressed mPrivateFlags &= ~PRESSED; @@ -5769,9 +5759,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility * @see #onAttachedToWindow() */ protected void onDetachedFromWindow() { - if (mPendingCheckForLongPress != null) { - removeCallbacks(mPendingCheckForLongPress); - } + cancelLongPress(); destroyDrawingCache(); } |