From a4099aaa01b00cd01fc817fdee35d7885b49209f Mon Sep 17 00:00:00 2001 From: Joanne Chung Date: Thu, 26 Dec 2019 11:20:30 +0800 Subject: [PATCH] Ensure OVERTYPE event has an entity type. Bug: 145282510 Test: atest FrameworksCoreTests:android.widget.TextViewActivityTest Change-Id: Ia064318198effbdfde00566c6746ab922573c32d --- .../TextClassificationSession.java | 2 + .../android/widget/TextViewActivityTest.java | 60 ++++++++++++++----- 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/core/java/android/view/textclassifier/TextClassificationSession.java b/core/java/android/view/textclassifier/TextClassificationSession.java index abfbc6c4f4ae7..4329a206746de 100644 --- a/core/java/android/view/textclassifier/TextClassificationSession.java +++ b/core/java/android/view/textclassifier/TextClassificationSession.java @@ -20,6 +20,7 @@ import android.annotation.WorkerThread; import android.view.textclassifier.SelectionEvent.InvocationMethod; import com.android.internal.util.Preconditions; + import java.util.Objects; /** @@ -183,6 +184,7 @@ final class TextClassificationSession implements TextClassifier { mSmartEvent = event; break; case SelectionEvent.ACTION_ABANDON: + case SelectionEvent.ACTION_OVERTYPE: if (mPrevEvent != null) { event.setEntityType(mPrevEvent.getEntityType()); } diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java index c3ef1c8ec648d..fbe4c1a10fe17 100644 --- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java +++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java @@ -1022,23 +1022,11 @@ public class TextViewActivityTest { @Test public void testSelectionMetricsLogger_abandonEventIncludesEntityType() throws Throwable { - final List selectionEvents = new ArrayList<>(); - final TextClassifier classifier = new TextClassifier() { - @Override - public void onSelectionEvent(SelectionEvent event) { - selectionEvents.add(event); - } - - @Override - public TextSelection suggestSelection(TextSelection.Request request) { - return new TextSelection.Builder(request.getStartIndex(), request.getEndIndex()) - .setEntityType(TextClassifier.TYPE_PHONE, 1) - .build(); - } - }; + final TestableTextClassifier classifier = new TestableTextClassifier(); final TextView textView = mActivity.findViewById(R.id.textview); mActivityRule.runOnUiThread(() -> textView.setTextClassifier(classifier)); mInstrumentation.waitForIdleSync(); + final String text = "My number is 987654321"; onView(withId(R.id.textview)).perform(replaceText(text)); @@ -1053,6 +1041,7 @@ public class TextViewActivityTest { long waitTime = 0; SelectionEvent lastEvent; do { + final List selectionEvents = classifier.getSelectionEvents(); lastEvent = selectionEvents.get(selectionEvents.size() - 1); if (lastEvent.getEventType() == SelectionEvent.ACTION_ABANDON) { break; @@ -1061,6 +1050,29 @@ public class TextViewActivityTest { waitTime += pollInterval; } while (waitTime < abandonDelay * 10); assertEquals(SelectionEvent.ACTION_ABANDON, lastEvent.getEventType()); + } + + @Test + public void testSelectionMetricsLogger_overtypeEventIncludesEntityType() throws Throwable { + final TestableTextClassifier classifier = new TestableTextClassifier(); + final TextView textView = mActivity.findViewById(R.id.textview); + mActivityRule.runOnUiThread(() -> textView.setTextClassifier(classifier)); + mInstrumentation.waitForIdleSync(); + + final String text = "My number is 987654321"; + + // Long press to trigger selection + onView(withId(R.id.textview)).perform(replaceText(text)); + onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('9'))); + sleepForFloatingToolbarPopup(); + + // Type over the selection + onView(withId(R.id.textview)).perform(pressKey(KeyEvent.KEYCODE_A)); + mInstrumentation.waitForIdleSync(); + + final List selectionEvents = classifier.getSelectionEvents(); + final SelectionEvent lastEvent = selectionEvents.get(selectionEvents.size() - 1); + assertEquals(SelectionEvent.ACTION_OVERTYPE, lastEvent.getEventType()); assertEquals(TextClassifier.TYPE_PHONE, lastEvent.getEntityType()); } @@ -1115,4 +1127,24 @@ public class TextViewActivityTest { private enum TextStyle { PLAIN, STYLED } + + private final class TestableTextClassifier implements TextClassifier { + final List mSelectionEvents = new ArrayList<>(); + + @Override + public void onSelectionEvent(SelectionEvent event) { + mSelectionEvents.add(event); + } + + @Override + public TextSelection suggestSelection(TextSelection.Request request) { + return new TextSelection.Builder(request.getStartIndex(), request.getEndIndex()) + .setEntityType(TextClassifier.TYPE_PHONE, 1) + .build(); + } + + List getSelectionEvents() { + return mSelectionEvents; + } + } }