Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1136e450 authored by Andrei Stingaceanu's avatar Andrei Stingaceanu Committed by Android (Google) Code Review
Browse files

Merge "TextView - lazy GestureDetector creation for ClickableSpans"

parents 270565cc 1fd8ea75
Loading
Loading
Loading
Loading
+43 −20
Original line number Diff line number Diff line
@@ -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);
            }

            // 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.