diff options
| author | Abodunrinwa Toki <toki@google.com> | 2018-03-23 04:01:28 +0000 |
|---|---|---|
| committer | Abodunrinwa Toki <toki@google.com> | 2018-03-28 02:54:36 +0100 |
| commit | 88be5a6cee59868eaee6f7b52fd8b2e6f6f28429 (patch) | |
| tree | a62da8148708c06c58c3df806e9b3f2ad2176c8f /core/java/android/widget/SelectionActionModeHelper.java | |
| parent | 8eaee9eea5f970b2a45011151a6f6b74603ab3a5 (diff) | |
Implement Stateful TextClassifier APIs.
Outstanding work tbd in other CLs
- Introduce request objects with session Ids
- Implement character based indexing for Selection events.
This CL hides the old Logger API but still keeps running so that we can
check that the modifications to the new API does not break anything.
We will remove the old Logger once we're convinced this is stable.
Please refer to I3c9ceea0863099fc4f0a5ce5e823c648ee9c4521 for previous
reviews related to this CL.
Bug: 74461129
Test: bit FrameworksCoreTests:android.view.textclassifier.TextClassificationManagerTest
Test: bit CtsViewTestCases:android.view.textclassifier.cts.TextClassificationManagerTest
Test: bit CtsWidgetTestCases:android.widget.cts.TextViewTest
Test: bit FrameworksCoreTests:android.widget.TextViewActivityTest
Change-Id: Iea744f1fa5964b4399290c31863ebeffa99af8d3
Diffstat (limited to 'core/java/android/widget/SelectionActionModeHelper.java')
| -rw-r--r-- | core/java/android/widget/SelectionActionModeHelper.java | 66 |
1 files changed, 48 insertions, 18 deletions
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java index 6e855ba3f8f7..9e4e6d6ac355 100644 --- a/core/java/android/widget/SelectionActionModeHelper.java +++ b/core/java/android/widget/SelectionActionModeHelper.java @@ -35,6 +35,7 @@ import android.util.Log; import android.view.ActionMode; import android.view.textclassifier.Logger; import android.view.textclassifier.SelectionEvent; +import android.view.textclassifier.SelectionEvent.InvocationMethod; import android.view.textclassifier.TextClassification; import android.view.textclassifier.TextClassificationConstants; import android.view.textclassifier.TextClassificationManager; @@ -86,7 +87,7 @@ public final class SelectionActionModeHelper { mTextClassificationSettings = TextClassificationManager.getSettings(mTextView.getContext()); mTextClassificationHelper = new TextClassificationHelper( mTextView.getContext(), - mTextView.getTextClassifier(), + mTextView::getTextClassifier, getText(mTextView), 0, 1, mTextView.getTextLocales()); mSelectionTracker = new SelectionTracker(mTextView); @@ -218,7 +219,7 @@ public final class SelectionActionModeHelper { private boolean skipTextClassification() { // No need to make an async call for a no-op TextClassifier. - final boolean noOpTextClassifier = mTextView.getTextClassifier() == TextClassifier.NO_OP; + final boolean noOpTextClassifier = mTextView.usesNoOpTextClassifier(); // Do not call the TextClassifier if there is no selection. final boolean noSelection = mTextView.getSelectionEnd() == mTextView.getSelectionStart(); // Do not call the TextClassifier if this is a password field. @@ -444,7 +445,7 @@ public final class SelectionActionModeHelper { selectionEnd = mTextView.getSelectionEnd(); } mTextClassificationHelper.init( - mTextView.getTextClassifier(), + mTextView::getTextClassifier, getText(mTextView), selectionStart, selectionEnd, mTextView.getTextLocales()); @@ -657,6 +658,7 @@ public final class SelectionActionModeHelper { private static final String LOG_TAG = "SelectionMetricsLogger"; private static final Pattern PATTERN_WHITESPACE = Pattern.compile("\\s+"); + private final Supplier<TextClassifier> mTextClassificationSession; private final Logger mLogger; private final boolean mEditTextLogger; private final BreakIterator mTokenIterator; @@ -665,26 +667,27 @@ public final class SelectionActionModeHelper { SelectionMetricsLogger(TextView textView) { Preconditions.checkNotNull(textView); + mTextClassificationSession = textView::getTextClassificationSession; mLogger = textView.getTextClassifier().getLogger( new Logger.Config(textView.getContext(), getWidetType(textView), null)); mEditTextLogger = textView.isTextEditable(); mTokenIterator = mLogger.getTokenIterator(textView.getTextLocale()); } - @Logger.WidgetType + @TextClassifier.WidgetType private static String getWidetType(TextView textView) { if (textView.isTextEditable()) { - return Logger.WIDGET_EDITTEXT; + return TextClassifier.WIDGET_TYPE_EDITTEXT; } if (textView.isTextSelectable()) { - return Logger.WIDGET_TEXTVIEW; + return TextClassifier.WIDGET_TYPE_TEXTVIEW; } - return Logger.WIDGET_UNSELECTABLE_TEXTVIEW; + return TextClassifier.WIDGET_TYPE_UNSELECTABLE_TEXTVIEW; } public void logSelectionStarted( CharSequence text, int index, - @SelectionEvent.InvocationMethod int invocationMethod) { + @InvocationMethod int invocationMethod) { try { Preconditions.checkNotNull(text); Preconditions.checkArgumentInRange(index, 0, text.length(), "index"); @@ -694,9 +697,12 @@ public final class SelectionActionModeHelper { mTokenIterator.setText(mText); mStartIndex = index; mLogger.logSelectionStartedEvent(invocationMethod, 0); + // TODO: Remove the above legacy logging. + mTextClassificationSession.get().onSelectionEvent( + SelectionEvent.createSelectionStartedEvent(invocationMethod, 0)); } catch (Exception e) { // Avoid crashes due to logging. - Log.d(LOG_TAG, e.getMessage()); + Log.e(LOG_TAG, "" + e.getMessage(), e); } } @@ -709,16 +715,28 @@ public final class SelectionActionModeHelper { if (selection != null) { mLogger.logSelectionModifiedEvent( wordIndices[0], wordIndices[1], selection); + // TODO: Remove the above legacy logging. + mTextClassificationSession.get().onSelectionEvent( + SelectionEvent.createSelectionModifiedEvent( + wordIndices[0], wordIndices[1], selection)); } else if (classification != null) { mLogger.logSelectionModifiedEvent( wordIndices[0], wordIndices[1], classification); + // TODO: Remove the above legacy logging. + mTextClassificationSession.get().onSelectionEvent( + SelectionEvent.createSelectionModifiedEvent( + wordIndices[0], wordIndices[1], classification)); } else { mLogger.logSelectionModifiedEvent( wordIndices[0], wordIndices[1]); + // TODO: Remove the above legacy logging. + mTextClassificationSession.get().onSelectionEvent( + SelectionEvent.createSelectionModifiedEvent( + wordIndices[0], wordIndices[1])); } } catch (Exception e) { // Avoid crashes due to logging. - Log.d(LOG_TAG, e.getMessage()); + Log.e(LOG_TAG, "" + e.getMessage(), e); } } @@ -733,13 +751,25 @@ public final class SelectionActionModeHelper { if (classification != null) { mLogger.logSelectionActionEvent( wordIndices[0], wordIndices[1], action, classification); + // TODO: Remove the above legacy logging. + mTextClassificationSession.get().onSelectionEvent( + SelectionEvent.createSelectionActionEvent( + wordIndices[0], wordIndices[1], action, classification)); } else { mLogger.logSelectionActionEvent( wordIndices[0], wordIndices[1], action); + // TODO: Remove the above legacy logging. + mTextClassificationSession.get().onSelectionEvent( + SelectionEvent.createSelectionActionEvent( + wordIndices[0], wordIndices[1], action)); } } catch (Exception e) { // Avoid crashes due to logging. - Log.d(LOG_TAG, e.getMessage()); + Log.e(LOG_TAG, "" + e.getMessage(), e); + } finally { + if (SelectionEvent.isTerminal(action)) { + mTextClassificationSession.get().destroy(); + } } } @@ -880,7 +910,7 @@ public final class SelectionActionModeHelper { private final Context mContext; private final boolean mDarkLaunchEnabled; - private TextClassifier mTextClassifier; + private Supplier<TextClassifier> mTextClassifier; /** The original TextView text. **/ private String mText; @@ -912,7 +942,7 @@ public final class SelectionActionModeHelper { /** Whether the TextClassifier has been initialized. */ private boolean mHot; - TextClassificationHelper(Context context, TextClassifier textClassifier, + TextClassificationHelper(Context context, Supplier<TextClassifier> textClassifier, CharSequence text, int selectionStart, int selectionEnd, LocaleList locales) { init(textClassifier, text, selectionStart, selectionEnd, locales); mContext = Preconditions.checkNotNull(context); @@ -921,7 +951,7 @@ public final class SelectionActionModeHelper { } @UiThread - public void init(TextClassifier textClassifier, CharSequence text, + public void init(Supplier<TextClassifier> textClassifier, CharSequence text, int selectionStart, int selectionEnd, LocaleList locales) { mTextClassifier = Preconditions.checkNotNull(textClassifier); mText = Preconditions.checkNotNull(text).toString(); @@ -946,11 +976,11 @@ public final class SelectionActionModeHelper { trimText(); final TextSelection selection; if (mContext.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.O_MR1) { - selection = mTextClassifier.suggestSelection( + selection = mTextClassifier.get().suggestSelection( mTrimmedText, mRelativeStart, mRelativeEnd, mSelectionOptions); } else { // Use old APIs. - selection = mTextClassifier.suggestSelection( + selection = mTextClassifier.get().suggestSelection( mTrimmedText, mRelativeStart, mRelativeEnd, mSelectionOptions.getDefaultLocales()); } @@ -995,11 +1025,11 @@ public final class SelectionActionModeHelper { trimText(); final TextClassification classification; if (mContext.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.O_MR1) { - classification = mTextClassifier.classifyText( + classification = mTextClassifier.get().classifyText( mTrimmedText, mRelativeStart, mRelativeEnd, mClassificationOptions); } else { // Use old APIs. - classification = mTextClassifier.classifyText( + classification = mTextClassifier.get().classifyText( mTrimmedText, mRelativeStart, mRelativeEnd, mClassificationOptions.getDefaultLocales()); } |
