diff options
| author | Mihai Popa <popam@google.com> | 2018-02-20 15:31:11 +0000 |
|---|---|---|
| committer | Mihai Popa <popam@google.com> | 2018-02-20 17:22:03 +0000 |
| commit | a4e39c4f596ebcc3769afdc358d78386c9f6f63b (patch) | |
| tree | 1c37b80bc49de04fae48290a5cf657e5c21b6eaf /core/java/android | |
| parent | 944836c6c70bb91e1520434149c630313d0b8699 (diff) | |
[Magnifier-23] Fix invisible cursor in magnifier
Previously, if the magnifier was triggered when the cursor was invisible
between blinks, the cursor would remain invisible until its position
first changed as a result of user dragging. This CL fixes this, by
forcing the cursor to become visible when the magnifier is triggered.
Test: manual testing
Test: atest CtsWidgetTestCases:android.widget.cts.TextViewTest
Test: atest FrameworksCoreTests:android.widget.TextViewActivityTest
Bug: 72314929
Bug: 63531115
Change-Id: I95dd0c2474f1cd1695ff3083e062ee38867b8a0c
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/widget/Editor.java | 21 | ||||
| -rw-r--r-- | core/java/android/widget/TextView.java | 4 |
2 files changed, 20 insertions, 5 deletions
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 892b8b635207..2e7b2fd65d33 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -262,7 +262,8 @@ public class Editor { boolean mDiscardNextActionUp; boolean mIgnoreActionUpEvent; - long mShowCursor; + private long mShowCursor; + private boolean mRenderCursorRegardlessTiming; private Blink mBlink; boolean mCursorVisible = true; @@ -681,11 +682,22 @@ public class Editor { } } - boolean isCursorVisible() { + private boolean isCursorVisible() { // The default value is true, even when there is no associated Editor return mCursorVisible && mTextView.isTextEditable(); } + boolean shouldRenderCursor() { + if (!isCursorVisible()) { + return false; + } + if (mRenderCursorRegardlessTiming) { + return true; + } + final long showCursorDelta = SystemClock.uptimeMillis() - mShowCursor; + return showCursorDelta % (2 * BLINK) < BLINK; + } + void prepareCursorControllers() { boolean windowSupportsHandles = false; @@ -4666,13 +4678,18 @@ public class Editor { + mTextView.getLayout().getLineBottom(lineNumber)) / 2.0f + mTextView.getTotalPaddingTop() - mTextView.getScrollY(); + // Make the cursor visible and stop blinking. + mRenderCursorRegardlessTiming = true; + mTextView.invalidateCursorPath(); suspendBlink(); + mMagnifier.show(xPosInView, yPosInView); } protected final void dismissMagnifier() { if (mMagnifier != null) { mMagnifier.dismiss(); + mRenderCursorRegardlessTiming = false; resumeBlink(); } } diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 1e02c3062d97..9ac5d59119fb 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -6965,9 +6965,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final int selEnd = getSelectionEnd(); if (mMovement != null && (isFocused() || isPressed()) && selStart >= 0) { if (selStart == selEnd) { - if (mEditor != null && mEditor.isCursorVisible() - && (SystemClock.uptimeMillis() - mEditor.mShowCursor) - % (2 * Editor.BLINK) < Editor.BLINK) { + if (mEditor != null && mEditor.shouldRenderCursor()) { if (mHighlightPathBogus) { if (mHighlightPath == null) mHighlightPath = new Path(); mHighlightPath.reset(); |
