diff options
| -rw-r--r-- | core/java/android/widget/Editor.java | 3 | ||||
| -rw-r--r-- | core/java/android/widget/TextView.java | 10 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/widget/TextViewActivityTest.java | 22 |
3 files changed, 29 insertions, 6 deletions
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 59d857c35afe..47b034886ad8 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -3640,6 +3640,9 @@ public class Editor { } if (menu.hasVisibleItems() || mode.getCustomView() != null) { + if (mHasSelection && !mTextView.hasTransientState()) { + mTextView.setHasTransientState(true); + } return true; } else { return false; diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 7602416fa751..15d1bd6e08c6 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -8289,14 +8289,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener newSelEnd = Selection.getSelectionEnd(buf); } - if (newSelStart == newSelEnd && hasTransientState()) { - setHasTransientState(false); - } else if (newSelStart != newSelEnd && !hasTransientState()) { - setHasTransientState(true); - } - if (mEditor != null) { mEditor.refreshTextActionMode(); + if (!hasSelection() && mEditor.mTextActionMode == null && hasTransientState()) { + // User generated selection has been removed. + setHasTransientState(false); + } } onSelectionChanged(newSelStart, newSelEnd); } diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java index f779d6cee976..ecf88f1558a1 100644 --- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java +++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java @@ -675,4 +675,26 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV assertFloatingToolbarContainsItem( getActivity().getString(com.android.internal.R.string.copy)); } + + @SmallTest + public void testTransientState() throws Exception { + final String text = "abc def"; + onView(withId(R.id.textview)).perform(click()); + onView(withId(R.id.textview)).perform(replaceText(text)); + + final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + assertFalse(textView.hasTransientState()); + + onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('b'))); + // hasTransientState should return true when user generated selection is active. + assertTrue(textView.hasTransientState()); + onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.indexOf('d'))); + // hasTransientState should return false as the selection has been cleared. + assertFalse(textView.hasTransientState()); + textView.post( + () -> Selection.setSelection((Spannable) textView.getText(), 0, text.length())); + getInstrumentation().waitForIdleSync(); + // hasTransientState should return false when selection is created by API. + assertFalse(textView.hasTransientState()); + } } |