diff options
Diffstat (limited to 'core/java')
-rw-r--r-- | core/java/android/widget/TextView.java | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 248f6eb..6f35b61 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -4303,6 +4303,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (shouldAdvanceFocusOnEnter()) { return 0; } + break; + + case KeyEvent.KEYCODE_BACK: + if (mIsInTextSelectionMode) { + stopTextSelectionMode(); + return -1; + } + break; } if (mInput != null) { @@ -6618,9 +6626,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener end = mPrevEnd; } else { if ((mPrevStart != mPrevEnd) && (start == end)) { - if ((start >= mPrevStart) && (start <= mPrevEnd)) { + if ((start >= mPrevStart) && (start < mPrevEnd)) { // Tapping inside the selection does nothing Selection.setSelection((Spannable) mText, mPrevStart, mPrevEnd); + showContextMenu(); return; } else { // Tapping outside stops selection mode, if any @@ -7221,9 +7230,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener setAlphabeticShortcut('v'); } - menu.add(0, ID_STOP_SELECTING_TEXT, 0, com.android.internal.R.string.stopSelectingText). - setOnMenuItemClickListener(handler); - added = true; } else { /* @@ -7272,10 +7278,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } - if (canPaste()) { + // Paste location is too imprecise. Only allow on empty text fields. + if (canPaste() && textIsOnlySpaces()) { menu.add(0, ID_PASTE, 0, com.android.internal.R.string.paste). setOnMenuItemClickListener(handler). setAlphabeticShortcut('v'); + added = true; } if (isInputMethodTarget()) { @@ -7299,6 +7307,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } + private boolean textIsOnlySpaces() { + final int length = mTransformed.length(); + for (int i=0; i<length; i++) { + final char c = mTransformed.charAt(i); + final int type = Character.getType(c); + if (type != Character.SPACE_SEPARATOR) + return false; + } + return true; + } + /** * Returns whether this text view is a current input method target. The * default implementation just checks with {@link InputMethodManager}. @@ -7737,6 +7756,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private boolean mStartIsDragged = false; // Starting time of the fade timer private long mFadeOutTimerStart; + // Used to detect a tap (vs drag) on the controller + private long mOnDownTimerStart; // The cursor controller images private final Handle mStartHandle, mEndHandle; // Offset between finger hot point on active cursor controller and actual cursor @@ -7884,12 +7905,22 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mOffsetX = (bounds.left + bounds.right) / 2.0f - x; mOffsetY = draggedHandle.mHotSpotVerticalPosition - y; + mOnDownTimerStart = event.getEventTime(); ((ArrowKeyMovementMethod)mMovement).setCursorController(this); } } } break; + case MotionEvent.ACTION_UP: + int time = (int) (event.getEventTime() - mOnDownTimerStart); + + if (time <= ViewConfiguration.getTapTimeout()) { + // A tap on the controller (not a drag) opens the contextual Copy menu + showContextMenu(); + } + break; + case MotionEvent.ACTION_POINTER_DOWN: case MotionEvent.ACTION_POINTER_UP: // Handle multi-point gestures. Keep min and max offset positions. |