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

Commit 8eb18b11 authored by Gilles Debunne's avatar Gilles Debunne Committed by Android (Google) Code Review
Browse files

Merge "Fixes around cursor blink."

parents 0c4650b4 3d01006f
Loading
Loading
Loading
Loading
+45 −49
Original line number Diff line number Diff line
@@ -3997,7 +3997,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
        }

        if (mBlink != null) {
            mBlink.cancel();
            mBlink.removeCallbacks(mBlink);
        }

        if (mInsertionPointCursorController != null) {
@@ -5421,19 +5421,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
        invalidate();
        int curs = getSelectionStart();

        if (curs >= 0 || (mGravity & Gravity.VERTICAL_GRAVITY_MASK) ==
                             Gravity.BOTTOM) {
        if (curs >= 0 || (mGravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.BOTTOM) {
            registerForPreDraw();
        }

        if (curs >= 0) {
            mHighlightPathBogus = true;

            if (isFocused()) {
                mShowCursor = SystemClock.uptimeMillis();
            makeBlink();
        }
        }

        checkForResize();
    }
@@ -6589,6 +6584,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
     */
    @android.view.RemotableViewMethod
    public void setCursorVisible(boolean visible) {
        if (mCursorVisible != visible) {
            mCursorVisible = visible;
            invalidate();

@@ -6597,6 +6593,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
            // InsertionPointCursorController depends on mCursorVisible
            prepareCursorControllers();
        }
    }

    private boolean isCursorVisible() {
        return mCursorVisible && isTextEditable();
@@ -6934,13 +6931,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
            if (oldStart >= 0 || newStart >= 0) {
                invalidateCursor(Selection.getSelectionStart(buf), oldStart, newStart);
                registerForPreDraw();

                if (isFocused()) {
                    mShowCursor = SystemClock.uptimeMillis();
                makeBlink();
            }
        }
        }

        if (what == Selection.SELECTION_START) {
            mHighlightPathBogus = true;
@@ -7089,22 +7082,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
        }
    }

    private void makeBlink() {
        if (!isCursorVisible()) {
            if (mBlink != null) {
                mBlink.removeCallbacks(mBlink);
            }

            return;
        }

        if (mBlink == null)
            mBlink = new Blink(this);

        mBlink.removeCallbacks(mBlink);
        mBlink.postAtTime(mBlink, mShowCursor + BLINK);
    }

    /**
     * @hide
     */
@@ -7271,12 +7248,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
        if (hasWindowFocus) {
            if (mBlink != null) {
                mBlink.uncancel();

                if (isFocused()) {
                    mShowCursor = SystemClock.uptimeMillis();
                makeBlink();
            }
            }
        } else {
            if (mBlink != null) {
                mBlink.cancel();
@@ -7512,11 +7485,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener

            TextView tv = mView.get();

            if (tv != null && tv.isFocused()) {
                int st = tv.getSelectionStart();
                int en = tv.getSelectionEnd();

                if (st == en && st >= 0 && en >= 0) {
            if (tv != null && tv.shouldBlink()) {
                if (tv.mLayout != null) {
                    tv.invalidateCursorPath();
                }
@@ -7524,7 +7493,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
                postAtTime(this, SystemClock.uptimeMillis() + BLINK);
            }
        }
        }

        void cancel() {
            if (!mCancelled) {
@@ -7538,6 +7506,34 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
        }
    }

    /**
     * @return True when the TextView isFocused and has a valid zero-length selection (cursor).
     */
    private boolean shouldBlink() {
        if (!isFocused()) return false;

        final int start = getSelectionStart();
        if (start < 0) return false;

        final int end = getSelectionEnd();
        if (end < 0) return false;

        return start == end;
    }

    private void makeBlink() {
        if (isCursorVisible()) {
            if (shouldBlink()) {
                mShowCursor = SystemClock.uptimeMillis();
                if (mBlink == null) mBlink = new Blink(this);
                mBlink.removeCallbacks(mBlink);
                mBlink.postAtTime(mBlink, mShowCursor + BLINK);
            }
        } else {
            if (mBlink != null) mBlink.removeCallbacks(mBlink);
        }
    }

    @Override
    protected float getLeftFadingEdgeStrength() {
        if (mCurrentAlpha <= ViewConfiguration.ALPHA_THRESHOLD_INT) return 0.0f;