diff options
| -rw-r--r-- | core/java/android/widget/TextView.java | 63 |
1 files changed, 43 insertions, 20 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 6dafe34fdc13..64779a2fbab5 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -651,7 +651,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener */ private Editor mEditor; - private final GestureDetector mClickableSpanOnClickGestureDetector; + private GestureDetector mClickableSpanOnClickGestureDetector; private static final int DEVICE_PROVISIONED_UNKNOWN = 0; private static final int DEVICE_PROVISIONED_NO = 1; @@ -1491,24 +1491,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) { setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); } - - mClickableSpanOnClickGestureDetector = new GestureDetector(context, - new GestureDetector.SimpleOnGestureListener() { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - if (mLinksClickable && (mMovement != null) && - (mMovement instanceof LinkMovementMethod - || (mAutoLinkMask != 0 && isTextSelectable()))) { - ClickableSpan[] links = ((Spannable) mText).getSpans( - getSelectionStart(), getSelectionEnd(), ClickableSpan.class); - if (links.length > 0) { - links[0].onClick(TextView.this); - return true; - } - } - return false; - } - }); } private int[] parseDimensionArray(TypedArray dimens) { @@ -8536,7 +8518,23 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (mMovement != null) { handled |= mMovement.onTouchEvent(this, (Spannable) mText, event); } - handled |= mClickableSpanOnClickGestureDetector.onTouchEvent(event); + + // Lazily create the clickable span gesture detector only if it looks like it + // might be useful. + if (action == MotionEvent.ACTION_DOWN && mClickableSpanOnClickGestureDetector == null + && shouldUseClickableSpanOnClickGestureDetector()) { + ClickableSpan[] links = ((Spannable) mText).getSpans( + getSelectionStart(), getSelectionEnd(), + ClickableSpan.class); + if (links.length > 0) { + mClickableSpanOnClickGestureDetector = + createClickableSpanOnClickGestureDetector(); + } + } + + if (mClickableSpanOnClickGestureDetector != null) { + handled |= mClickableSpanOnClickGestureDetector.onTouchEvent(event); + } final boolean textIsSelectable = isTextSelectable(); if (touchIsFinished && (isTextEditable() || textIsSelectable)) { @@ -8937,6 +8935,31 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mEditor.onLocaleChanged(); } + private GestureDetector createClickableSpanOnClickGestureDetector() { + return new GestureDetector(mContext, + new GestureDetector.SimpleOnGestureListener() { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + if (shouldUseClickableSpanOnClickGestureDetector()) { + ClickableSpan[] links = ((Spannable) mText).getSpans( + getSelectionStart(), getSelectionEnd(), + ClickableSpan.class); + if (links.length > 0) { + links[0].onClick(TextView.this); + return true; + } + } + return false; + } + }); + } + + private boolean shouldUseClickableSpanOnClickGestureDetector() { + return mLinksClickable && (mMovement != null) && + (mMovement instanceof LinkMovementMethod + || (mAutoLinkMask != 0 && isTextSelectable())); + } + /** * This method is used by the ArrowKeyMovementMethod to jump from one word to the other. * Made available to achieve a consistent behavior. |