diff options
| author | 2018-04-04 19:40:38 +0200 | |
|---|---|---|
| committer | 2018-04-07 12:04:49 +0000 | |
| commit | 5a03094ebc91df1c64a2232be648ac3ed26657ce (patch) | |
| tree | e740f0222417bda52cbaef8c17f28867b69d857a | |
| parent | 4d289593f259db3e690c0f6877eadad608666def (diff) | |
Remove legacy logger
Migrate DefaultLogger implementation to SelectionSessionLogger.
This cleans up after the API refactor and fixes two bugs:
- All events are currently logged twice.
- Interfaces accept a null signature, but it currently crashes the legacy logger.
Bug: 73392698
Bug: 77659305
Test: atest FrameworksCoreTests:TextClassificationManagerTest
Test: atest FrameworksCoreTests:TextClassificationTest
Test: atest CtsViewTestCases:TextClassificationManagerTest
Test: atest CtsViewTestCases:TextClassifierValueObjectsTest
Test: atest CtsWidgetTestCases:TextViewTest
Test: atest CtsWidgetTestCases:EditTextTest
Test: Manually examined logs
Change-Id: I0d2b925abf5cab12d71fc2cc0fa527530c86ab10
| -rw-r--r-- | config/hiddenapi-light-greylist.txt | 1 | ||||
| -rw-r--r-- | core/java/android/view/textclassifier/GenerateLinksLogger.java | 10 | ||||
| -rw-r--r-- | core/java/android/view/textclassifier/Logger.java | 397 | ||||
| -rw-r--r-- | core/java/android/view/textclassifier/SelectionEvent.java | 14 | ||||
| -rw-r--r-- | core/java/android/view/textclassifier/SelectionSessionLogger.java (renamed from core/java/android/view/textclassifier/DefaultLogger.java) | 58 | ||||
| -rw-r--r-- | core/java/android/view/textclassifier/SystemTextClassifier.java | 29 | ||||
| -rw-r--r-- | core/java/android/view/textclassifier/TextClassificationSession.java | 4 | ||||
| -rw-r--r-- | core/java/android/view/textclassifier/TextClassifier.java | 12 | ||||
| -rw-r--r-- | core/java/android/view/textclassifier/TextClassifierImpl.java | 28 | ||||
| -rw-r--r-- | core/java/android/widget/SelectionActionModeHelper.java | 24 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java | 16 |
11 files changed, 50 insertions, 543 deletions
diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt index ee75edeaa116..010f902d9aa9 100644 --- a/config/hiddenapi-light-greylist.txt +++ b/config/hiddenapi-light-greylist.txt @@ -2231,7 +2231,6 @@ Landroid/view/SurfaceView;->mRequestedFormat:I Landroid/view/SurfaceView;->mSurfaceHolder:Landroid/view/SurfaceHolder; Landroid/view/SurfaceView;->surfacePositionLost_uiRtSync(J)V Landroid/view/SurfaceView;->updateSurfacePosition_renderWorker(JIIII)V -Landroid/view/textclassifier/Logger;->DISABLED:Landroid/view/textclassifier/Logger; Landroid/view/textclassifier/logging/SmartSelectionEventTracker;-><init>(Landroid/content/Context;I)V Landroid/view/textclassifier/logging/SmartSelectionEventTracker;->logEvent(Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;)V Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionAction(III)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; diff --git a/core/java/android/view/textclassifier/GenerateLinksLogger.java b/core/java/android/view/textclassifier/GenerateLinksLogger.java index 73cf43b87ea7..067513f1de67 100644 --- a/core/java/android/view/textclassifier/GenerateLinksLogger.java +++ b/core/java/android/view/textclassifier/GenerateLinksLogger.java @@ -19,13 +19,13 @@ package android.view.textclassifier; import android.annotation.Nullable; import android.metrics.LogMaker; import android.util.ArrayMap; -import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.util.Preconditions; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Random; @@ -39,6 +39,7 @@ import java.util.UUID; public final class GenerateLinksLogger { private static final String LOG_TAG = "GenerateLinksLogger"; + private static final boolean DEBUG_LOG_ENABLED = false; private static final String ZERO = "0"; private final MetricsLogger mMetricsLogger; @@ -127,7 +128,7 @@ public final class GenerateLinksLogger { } private static void debugLog(LogMaker log) { - if (!Logger.DEBUG_LOG_ENABLED) return; + if (!DEBUG_LOG_ENABLED) return; final String callId = Objects.toString( log.getTaggedData(MetricsEvent.FIELD_LINKIFY_CALL_ID), ""); @@ -142,8 +143,9 @@ public final class GenerateLinksLogger { final int latencyMs = Integer.parseInt( Objects.toString(log.getTaggedData(MetricsEvent.FIELD_LINKIFY_LATENCY), ZERO)); - Log.d(LOG_TAG, String.format("%s:%s %d links (%d/%d chars) %dms %s", callId, entityType, - numLinks, linkLength, textLength, latencyMs, log.getPackageName())); + Log.d(LOG_TAG, + String.format(Locale.US, "%s:%s %d links (%d/%d chars) %dms %s", callId, entityType, + numLinks, linkLength, textLength, latencyMs, log.getPackageName())); } /** Helper class for storing per-entity type statistics. */ diff --git a/core/java/android/view/textclassifier/Logger.java b/core/java/android/view/textclassifier/Logger.java deleted file mode 100644 index f03906a0b5ea..000000000000 --- a/core/java/android/view/textclassifier/Logger.java +++ /dev/null @@ -1,397 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.view.textclassifier; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.content.Context; - -import com.android.internal.util.Preconditions; - -import java.text.BreakIterator; -import java.util.Locale; -import java.util.Objects; - -/** - * A helper for logging TextClassifier related events. - * @hide - */ -public abstract class Logger { - - private static final String LOG_TAG = "Logger"; - /* package */ static final boolean DEBUG_LOG_ENABLED = true; - - private @SelectionEvent.InvocationMethod int mInvocationMethod; - private SelectionEvent mPrevEvent; - private SelectionEvent mSmartEvent; - private SelectionEvent mStartEvent; - - /** - * Logger that does not log anything. - * @hide - */ - public static final Logger DISABLED = new Logger() { - @Override - public void writeEvent(SelectionEvent event) {} - }; - - @Nullable - private final Config mConfig; - - public Logger(Config config) { - mConfig = Preconditions.checkNotNull(config); - } - - private Logger() { - mConfig = null; - } - - /** - * Writes the selection event to a log. - */ - public abstract void writeEvent(@NonNull SelectionEvent event); - - /** - * Returns true if the resultId matches that of a smart selection event (i.e. - * {@link SelectionEvent#EVENT_SMART_SELECTION_SINGLE} or - * {@link SelectionEvent#EVENT_SMART_SELECTION_MULTI}). - * Returns false otherwise. - */ - public boolean isSmartSelection(@NonNull String resultId) { - return false; - } - - /** - * Returns a token iterator for tokenizing text for logging purposes. - */ - public BreakIterator getTokenIterator(@NonNull Locale locale) { - return BreakIterator.getWordInstance(Preconditions.checkNotNull(locale)); - } - - /** - * Logs a "selection started" event. - * - * @param invocationMethod the way the selection was triggered - * @param start the token index of the selected token - */ - public final void logSelectionStartedEvent( - @SelectionEvent.InvocationMethod int invocationMethod, int start) { - if (mConfig == null) { - return; - } - - mInvocationMethod = invocationMethod; - logEvent(new SelectionEvent( - start, start + 1, SelectionEvent.EVENT_SELECTION_STARTED, - TextClassifier.TYPE_UNKNOWN, mInvocationMethod, null, mConfig)); - } - - /** - * Logs a "selection modified" event. - * Use when the user modifies the selection. - * - * @param start the start token (inclusive) index of the selection - * @param end the end token (exclusive) index of the selection - */ - public final void logSelectionModifiedEvent(int start, int end) { - Preconditions.checkArgument(end >= start, "end cannot be less than start"); - - if (mConfig == null) { - return; - } - - logEvent(new SelectionEvent( - start, end, SelectionEvent.EVENT_SELECTION_MODIFIED, - TextClassifier.TYPE_UNKNOWN, mInvocationMethod, null, mConfig)); - } - - /** - * Logs a "selection modified" event. - * Use when the user modifies the selection and the selection's entity type is known. - * - * @param start the start token (inclusive) index of the selection - * @param end the end token (exclusive) index of the selection - * @param classification the TextClassification object returned by the TextClassifier that - * classified the selected text - */ - public final void logSelectionModifiedEvent( - int start, int end, @NonNull TextClassification classification) { - Preconditions.checkArgument(end >= start, "end cannot be less than start"); - Preconditions.checkNotNull(classification); - - if (mConfig == null) { - return; - } - - final String entityType = classification.getEntityCount() > 0 - ? classification.getEntity(0) - : TextClassifier.TYPE_UNKNOWN; - logEvent(new SelectionEvent( - start, end, SelectionEvent.EVENT_SELECTION_MODIFIED, - entityType, mInvocationMethod, classification.getId(), mConfig)); - } - - /** - * Logs a "selection modified" event. - * Use when a TextClassifier modifies the selection. - * - * @param start the start token (inclusive) index of the selection - * @param end the end token (exclusive) index of the selection - * @param selection the TextSelection object returned by the TextClassifier for the - * specified selection - */ - public final void logSelectionModifiedEvent( - int start, int end, @NonNull TextSelection selection) { - Preconditions.checkArgument(end >= start, "end cannot be less than start"); - Preconditions.checkNotNull(selection); - - if (mConfig == null) { - return; - } - - final int eventType; - if (isSmartSelection(selection.getId())) { - eventType = end - start > 1 - ? SelectionEvent.EVENT_SMART_SELECTION_MULTI - : SelectionEvent.EVENT_SMART_SELECTION_SINGLE; - - } else { - eventType = SelectionEvent.EVENT_AUTO_SELECTION; - } - final String entityType = selection.getEntityCount() > 0 - ? selection.getEntity(0) - : TextClassifier.TYPE_UNKNOWN; - logEvent(new SelectionEvent(start, end, eventType, entityType, mInvocationMethod, - selection.getId(), mConfig)); - } - - /** - * Logs an event specifying an action taken on a selection. - * Use when the user clicks on an action to act on the selected text. - * - * @param start the start token (inclusive) index of the selection - * @param end the end token (exclusive) index of the selection - * @param actionType the action that was performed on the selection - */ - public final void logSelectionActionEvent( - int start, int end, @SelectionEvent.ActionType int actionType) { - Preconditions.checkArgument(end >= start, "end cannot be less than start"); - checkActionType(actionType); - - if (mConfig == null) { - return; - } - - logEvent(new SelectionEvent( - start, end, actionType, TextClassifier.TYPE_UNKNOWN, mInvocationMethod, - null, mConfig)); - } - - /** - * Logs an event specifying an action taken on a selection. - * Use when the user clicks on an action to act on the selected text and the selection's - * entity type is known. - * - * @param start the start token (inclusive) index of the selection - * @param end the end token (exclusive) index of the selection - * @param actionType the action that was performed on the selection - * @param classification the TextClassification object returned by the TextClassifier that - * classified the selected text - * - * @throws IllegalArgumentException If actionType is not a valid SelectionEvent actionType - */ - public final void logSelectionActionEvent( - int start, int end, @SelectionEvent.ActionType int actionType, - @NonNull TextClassification classification) { - Preconditions.checkArgument(end >= start, "end cannot be less than start"); - Preconditions.checkNotNull(classification); - checkActionType(actionType); - - if (mConfig == null) { - return; - } - - final String entityType = classification.getEntityCount() > 0 - ? classification.getEntity(0) - : TextClassifier.TYPE_UNKNOWN; - logEvent(new SelectionEvent(start, end, actionType, entityType, mInvocationMethod, - classification.getId(), mConfig)); - } - - private void logEvent(@NonNull SelectionEvent event) { - Preconditions.checkNotNull(event); - - if (event.getEventType() != SelectionEvent.EVENT_SELECTION_STARTED - && mStartEvent == null) { - if (DEBUG_LOG_ENABLED) { - Log.d(LOG_TAG, "Selection session not yet started. Ignoring event"); - } - return; - } - - final long now = System.currentTimeMillis(); - switch (event.getEventType()) { - case SelectionEvent.EVENT_SELECTION_STARTED: - Preconditions.checkArgument(event.getAbsoluteEnd() == event.getAbsoluteStart() + 1); - event.setSessionId(startNewSession()); - mStartEvent = event; - break; - case SelectionEvent.EVENT_SMART_SELECTION_SINGLE: // fall through - case SelectionEvent.EVENT_SMART_SELECTION_MULTI: - mSmartEvent = event; - break; - case SelectionEvent.EVENT_SELECTION_MODIFIED: // fall through - case SelectionEvent.EVENT_AUTO_SELECTION: - if (mPrevEvent != null - && mPrevEvent.getAbsoluteStart() == event.getAbsoluteStart() - && mPrevEvent.getAbsoluteEnd() == event.getAbsoluteEnd()) { - // Selection did not change. Ignore event. - return; - } - break; - default: - // do nothing. - } - - event.setEventTime(now); - if (mStartEvent != null) { - event.setSessionId(mStartEvent.getSessionId()) - .setDurationSinceSessionStart(now - mStartEvent.getEventTime()) - .setStart(event.getAbsoluteStart() - mStartEvent.getAbsoluteStart()) - .setEnd(event.getAbsoluteEnd() - mStartEvent.getAbsoluteStart()); - } - if (mSmartEvent != null) { - event.setResultId(mSmartEvent.getResultId()) - .setSmartStart(mSmartEvent.getAbsoluteStart() - mStartEvent.getAbsoluteStart()) - .setSmartEnd(mSmartEvent.getAbsoluteEnd() - mStartEvent.getAbsoluteStart()); - } - if (mPrevEvent != null) { - event.setDurationSincePreviousEvent(now - mPrevEvent.getEventTime()) - .setEventIndex(mPrevEvent.getEventIndex() + 1); - } - writeEvent(event); - mPrevEvent = event; - - if (event.isTerminal()) { - endSession(); - } - } - - private TextClassificationSessionId startNewSession() { - endSession(); - return new TextClassificationSessionId(); - } - - private void endSession() { - mPrevEvent = null; - mSmartEvent = null; - mStartEvent = null; - } - - /** - * @throws IllegalArgumentException If eventType is not an {@link SelectionEvent.ActionType} - */ - private static void checkActionType(@SelectionEvent.EventType int eventType) - throws IllegalArgumentException { - switch (eventType) { - case SelectionEvent.ACTION_OVERTYPE: // fall through - case SelectionEvent.ACTION_COPY: // fall through - case SelectionEvent.ACTION_PASTE: // fall through - case SelectionEvent.ACTION_CUT: // fall through - case SelectionEvent.ACTION_SHARE: // fall through - case SelectionEvent.ACTION_SMART_SHARE: // fall through - case SelectionEvent.ACTION_DRAG: // fall through - case SelectionEvent.ACTION_ABANDON: // fall through - case SelectionEvent.ACTION_SELECT_ALL: // fall through - case SelectionEvent.ACTION_RESET: // fall through - return; - default: - throw new IllegalArgumentException( - String.format(Locale.US, "%d is not an eventType", eventType)); - } - } - - - /** - * A Logger config. - */ - public static final class Config { - - private final String mPackageName; - private final String mWidgetType; - @Nullable private final String mWidgetVersion; - - /** - * @param context Context of the widget the logger logs for - * @param widgetType a name for the widget being logged for. e.g. - * {@link TextClassifier#WIDGET_TYPE_TEXTVIEW} - * @param widgetVersion a string version info for the widget the logger logs for - */ - public Config( - @NonNull Context context, - @TextClassifier.WidgetType String widgetType, - @Nullable String widgetVersion) { - mPackageName = Preconditions.checkNotNull(context).getPackageName(); - mWidgetType = widgetType; - mWidgetVersion = widgetVersion; - } - - /** - * Returns the package name of the application the logger logs for. - */ - public String getPackageName() { - return mPackageName; - } - - /** - * Returns the name for the widget being logged for. e.g. - * {@link TextClassifier#WIDGET_TYPE_TEXTVIEW}. - */ - public String getWidgetType() { - return mWidgetType; - } - - /** - * Returns string version info for the logger. This is specific to the text classifier. - */ - @Nullable - public String getWidgetVersion() { - return mWidgetVersion; - } - - @Override - public int hashCode() { - return Objects.hash(mPackageName, mWidgetType, mWidgetVersion); - } - - @Override - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - - if (!(obj instanceof Config)) { - return false; - } - - final Config other = (Config) obj; - return Objects.equals(mPackageName, other.mPackageName) - && Objects.equals(mWidgetType, other.mWidgetType) - && Objects.equals(mWidgetVersion, other.mWidgetType); - } - } -} diff --git a/core/java/android/view/textclassifier/SelectionEvent.java b/core/java/android/view/textclassifier/SelectionEvent.java index 1e978ccf5390..ceab78addac9 100644 --- a/core/java/android/view/textclassifier/SelectionEvent.java +++ b/core/java/android/view/textclassifier/SelectionEvent.java @@ -150,20 +150,6 @@ public final class SelectionEvent implements Parcelable { mInvocationMethod = invocationMethod; } - SelectionEvent( - int start, int end, - @EventType int eventType, @EntityType String entityType, - @InvocationMethod int invocationMethod, @Nullable String resultId, - Logger.Config config) { - this(start, end, eventType, entityType, invocationMethod, resultId); - Preconditions.checkNotNull(config); - setTextClassificationSessionContext( - new TextClassificationContext.Builder( - config.getPackageName(), config.getWidgetType()) - .setWidgetVersion(config.getWidgetVersion()) - .build()); - } - private SelectionEvent(Parcel in) { mAbsoluteStart = in.readInt(); mAbsoluteEnd = in.readInt(); diff --git a/core/java/android/view/textclassifier/DefaultLogger.java b/core/java/android/view/textclassifier/SelectionSessionLogger.java index 203ca5606818..f2fb63eb01f3 100644 --- a/core/java/android/view/textclassifier/DefaultLogger.java +++ b/core/java/android/view/textclassifier/SelectionSessionLogger.java @@ -17,28 +17,29 @@ package android.view.textclassifier; import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.Context; import android.metrics.LogMaker; -import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.util.Preconditions; +import java.text.BreakIterator; import java.util.List; import java.util.Locale; import java.util.Objects; import java.util.StringJoiner; /** - * Default Logger. - * Used internally by TextClassifierImpl. + * A helper for logging selection session events. * @hide */ -public final class DefaultLogger extends Logger { +public final class SelectionSessionLogger { - private static final String LOG_TAG = "DefaultLogger"; + private static final String LOG_TAG = "SelectionSessionLogger"; + private static final boolean DEBUG_LOG_ENABLED = false; static final String CLASSIFIER_ID = "androidtc"; private static final int START_EVENT_DELTA = MetricsEvent.FIELD_SELECTION_SINCE_START; @@ -59,23 +60,16 @@ public final class DefaultLogger extends Logger { private final MetricsLogger mMetricsLogger; - public DefaultLogger(@NonNull Config config) { - super(config); + public SelectionSessionLogger() { mMetricsLogger = new MetricsLogger(); } @VisibleForTesting - public DefaultLogger(@NonNull Config config, @NonNull MetricsLogger metricsLogger) { - super(config); + public SelectionSessionLogger(@NonNull MetricsLogger metricsLogger) { mMetricsLogger = Preconditions.checkNotNull(metricsLogger); } - @Override - public boolean isSmartSelection(@NonNull String signature) { - return CLASSIFIER_ID.equals(SignatureParser.getClassifierId(signature)); - } - - @Override + /** Emits a selection event to the logs. */ public void writeEvent(@NonNull SelectionEvent event) { Preconditions.checkNotNull(event); final LogMaker log = new LogMaker(MetricsEvent.TEXT_SELECTION_SESSION) @@ -93,7 +87,7 @@ public final class DefaultLogger extends Logger { .addTaggedData(SMART_END, event.getSmartEnd()) .addTaggedData(EVENT_START, event.getStart()) .addTaggedData(EVENT_END, event.getEnd()) - .addTaggedData(SESSION_ID, event.getSessionId()); + .addTaggedData(SESSION_ID, event.getSessionId().flattenToString()); mMetricsLogger.write(log); debugLog(log); } @@ -225,9 +219,17 @@ public final class DefaultLogger extends Logger { final int eventEnd = Integer.parseInt( Objects.toString(log.getTaggedData(EVENT_END), ZERO)); - Log.d(LOG_TAG, String.format("%2d: %s/%s/%s, range=%d,%d - smart_range=%d,%d (%s/%s)", - index, type, subType, entity, eventStart, eventEnd, smartStart, smartEnd, widget, - model)); + Log.d(LOG_TAG, + String.format(Locale.US, "%2d: %s/%s/%s, range=%d,%d - smart_range=%d,%d (%s/%s)", + index, type, subType, entity, eventStart, eventEnd, smartStart, smartEnd, + widget, model)); + } + + /** + * Returns a token iterator for tokenizing text for logging purposes. + */ + public static BreakIterator getTokenIterator(@NonNull Locale locale) { + return BreakIterator.getWordInstance(Preconditions.checkNotNull(locale)); } /** @@ -260,8 +262,10 @@ public final class DefaultLogger extends Logger { return String.format(Locale.US, "%s|%s|%d", classifierId, modelName, hash); } - static String getClassifierId(String signature) { - Preconditions.checkNotNull(signature); + static String getClassifierId(@Nullable String signature) { + if (signature == null) { + return ""; + } final int end = signature.indexOf("|"); if (end >= 0) { return signature.substring(0, end); @@ -269,8 +273,10 @@ public final class DefaultLogger extends Logger { return ""; } - static String getModelName(String signature) { - Preconditions.checkNotNull(signature); + static String getModelName(@Nullable String signature) { + if (signature == null) { + return ""; + } final int start = signature.indexOf("|") + 1; final int end = signature.indexOf("|", start); if (start >= 1 && end >= start) { @@ -279,8 +285,10 @@ public final class DefaultLogger extends Logger { return ""; } - static int getHash(String signature) { - Preconditions.checkNotNull(signature); + static int getHash(@Nullable String signature) { + if (signature == null) { + return 0; + } final int index1 = signature.indexOf("|"); final int index2 = signature.indexOf("|", index1); if (index2 > 0) { diff --git a/core/java/android/view/textclassifier/SystemTextClassifier.java b/core/java/android/view/textclassifier/SystemTextClassifier.java index 45fd6bfb1949..490c389037e5 100644 --- a/core/java/android/view/textclassifier/SystemTextClassifier.java +++ b/core/java/android/view/textclassifier/SystemTextClassifier.java @@ -28,7 +28,6 @@ import android.service.textclassifier.ITextClassifierService; import android.service.textclassifier.ITextLinksCallback; import android.service.textclassifier.ITextSelectionCallback; -import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; import com.android.internal.util.Preconditions; @@ -49,13 +48,6 @@ public final class SystemTextClassifier implements TextClassifier { private final TextClassificationConstants mSettings; private final TextClassifier mFallback; private final String mPackageName; - - private final Object mLoggerLock = new Object(); - @GuardedBy("mLoggerLock") - private Logger.Config mLoggerConfig; - @GuardedBy("mLoggerLock") - private Logger mLogger; - @GuardedBy("mLoggerLock") private TextClassificationSessionId mSessionId; public SystemTextClassifier(Context context, TextClassificationConstants settings) @@ -147,27 +139,6 @@ public final class SystemTextClassifier implements TextClassifier { } @Override - public Logger getLogger(@NonNull Logger.Config config) { - Preconditions.checkNotNull(config); - synchronized (mLoggerLock) { - if (mLogger == null || !config.equals(mLoggerConfig)) { - mLoggerConfig = config; - mLogger = new Logger(config) { - @Override - public void writeEvent(SelectionEvent event) { - try { - mManagerService.onSelectionEvent(mSessionId, event); - } catch (RemoteException e) { - Log.e(LOG_TAG, "Error reporting selection event.", e); - } - } - }; - } - } - return mLogger; - } - - @Override public void destroy() { try { if (mSessionId != null) { diff --git a/core/java/android/view/textclassifier/TextClassificationSession.java b/core/java/android/view/textclassifier/TextClassificationSession.java index e8e300a94de4..4c6419855f7c 100644 --- a/core/java/android/view/textclassifier/TextClassificationSession.java +++ b/core/java/android/view/textclassifier/TextClassificationSession.java @@ -17,7 +17,6 @@ package android.view.textclassifier; import android.annotation.WorkerThread; -import android.view.textclassifier.DefaultLogger.SignatureParser; import android.view.textclassifier.SelectionEvent.InvocationMethod; import com.android.internal.util.Preconditions; @@ -222,7 +221,8 @@ final class TextClassificationSession implements TextClassifier { } private static boolean isPlatformLocalTextClassifierSmartSelection(String signature) { - return DefaultLogger.CLASSIFIER_ID.equals(SignatureParser.getClassifierId(signature)); + return SelectionSessionLogger.CLASSIFIER_ID.equals( + SelectionSessionLogger.SignatureParser.getClassifierId(signature)); } } } diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java index 4710671f8b88..1a3d1628d33c 100644 --- a/core/java/android/view/textclassifier/TextClassifier.java +++ b/core/java/android/view/textclassifier/TextClassifier.java @@ -349,18 +349,6 @@ public interface TextClassifier { } /** - * Returns a helper for logging TextClassifier related events. - * - * @param config logger configuration - * @hide - */ - @WorkerThread - default Logger getLogger(@NonNull Logger.Config config) { - Preconditions.checkNotNull(config); - return Logger.DISABLED; - } - - /** * Reports a selection event. * * <strong>NOTE: </strong>If a TextClassifier has been destroyed, calls to this method should diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java index 7e3748ae76cd..2213355821d4 100644 --- a/core/java/android/view/textclassifier/TextClassifierImpl.java +++ b/core/java/android/view/textclassifier/TextClassifierImpl.java @@ -94,11 +94,7 @@ public final class TextClassifierImpl implements TextClassifier { private final Object mLoggerLock = new Object(); @GuardedBy("mLoggerLock") // Do not access outside this lock. - private Logger.Config mLoggerConfig; - @GuardedBy("mLoggerLock") // Do not access outside this lock. - private Logger mLogger; - @GuardedBy("mLoggerLock") // Do not access outside this lock. - private Logger mLogger2; // This is the new logger. Will replace mLogger. + private SelectionSessionLogger mSessionLogger; private final TextClassificationConstants mSettings; @@ -283,28 +279,14 @@ public final class TextClassifierImpl implements TextClassifier { } } - /** @inheritDoc */ - @Override - public Logger getLogger(@NonNull Logger.Config config) { - Preconditions.checkNotNull(config); - synchronized (mLoggerLock) { - if (mLogger == null || !config.equals(mLoggerConfig)) { - mLoggerConfig = config; - mLogger = new DefaultLogger(config); - } - } - return mLogger; - } - @Override public void onSelectionEvent(SelectionEvent event) { Preconditions.checkNotNull(event); synchronized (mLoggerLock) { - if (mLogger2 == null) { - mLogger2 = new DefaultLogger( - new Logger.Config(mContext, WIDGET_TYPE_UNKNOWN, null)); + if (mSessionLogger == null) { + mSessionLogger = new SelectionSessionLogger(); } - mLogger2.writeEvent(event); + mSessionLogger.writeEvent(event); } } @@ -331,7 +313,7 @@ public final class TextClassifierImpl implements TextClassifier { private String createId(String text, int start, int end) { synchronized (mLock) { - return DefaultLogger.createId(text, start, end, mContext, mModel.getVersion(), + return SelectionSessionLogger.createId(text, start, end, mContext, mModel.getVersion(), mModel.getSupportedLocales()); } } diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java index b3327a70d579..468abdcb2c00 100644 --- a/core/java/android/widget/SelectionActionModeHelper.java +++ b/core/java/android/widget/SelectionActionModeHelper.java @@ -33,9 +33,9 @@ import android.text.Spannable; import android.text.TextUtils; 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.SelectionSessionLogger; import android.view.textclassifier.TextClassification; import android.view.textclassifier.TextClassificationConstants; import android.view.textclassifier.TextClassificationManager; @@ -663,7 +663,6 @@ public final class SelectionActionModeHelper { private static final String LOG_TAG = "SelectionMetricsLogger"; private static final Pattern PATTERN_WHITESPACE = Pattern.compile("\\s+"); - private final Logger mLogger; private final boolean mEditTextLogger; private final BreakIterator mTokenIterator; @@ -673,10 +672,8 @@ public final class SelectionActionModeHelper { SelectionMetricsLogger(TextView textView) { Preconditions.checkNotNull(textView); - mLogger = textView.getTextClassifier().getLogger( - new Logger.Config(textView.getContext(), getWidetType(textView), null)); mEditTextLogger = textView.isTextEditable(); - mTokenIterator = mLogger.getTokenIterator(textView.getTextLocale()); + mTokenIterator = SelectionSessionLogger.getTokenIterator(textView.getTextLocale()); } @TextClassifier.WidgetType @@ -702,8 +699,6 @@ public final class SelectionActionModeHelper { } mTokenIterator.setText(mText); mStartIndex = index; - mLogger.logSelectionStartedEvent(invocationMethod, 0); - // TODO: Remove the above legacy logging. mClassificationSession = classificationSession; mClassificationSession.onSelectionEvent( SelectionEvent.createSelectionStartedEvent(invocationMethod, 0)); @@ -720,27 +715,18 @@ public final class SelectionActionModeHelper { Preconditions.checkArgumentInRange(end, start, mText.length(), "end"); int[] wordIndices = getWordDelta(start, end); if (selection != null) { - mLogger.logSelectionModifiedEvent( - wordIndices[0], wordIndices[1], selection); - // TODO: Remove the above legacy logging. if (mClassificationSession != null) { mClassificationSession.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. if (mClassificationSession != null) { mClassificationSession.onSelectionEvent( SelectionEvent.createSelectionModifiedEvent( wordIndices[0], wordIndices[1], classification)); } } else { - mLogger.logSelectionModifiedEvent( - wordIndices[0], wordIndices[1]); - // TODO: Remove the above legacy logging. if (mClassificationSession != null) { mClassificationSession.onSelectionEvent( SelectionEvent.createSelectionModifiedEvent( @@ -762,18 +748,12 @@ public final class SelectionActionModeHelper { Preconditions.checkArgumentInRange(end, start, mText.length(), "end"); int[] wordIndices = getWordDelta(start, end); if (classification != null) { - mLogger.logSelectionActionEvent( - wordIndices[0], wordIndices[1], action, classification); - // TODO: Remove the above legacy logging. if (mClassificationSession != null) { mClassificationSession.onSelectionEvent( SelectionEvent.createSelectionActionEvent( wordIndices[0], wordIndices[1], action, classification)); } } else { - mLogger.logSelectionActionEvent( - wordIndices[0], wordIndices[1], action); - // TODO: Remove the above legacy logging. if (mClassificationSession != null) { mClassificationSession.onSelectionEvent( SelectionEvent.createSelectionActionEvent( diff --git a/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java b/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java index 861a43ad346b..3e4c85f9d217 100644 --- a/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/SelectionEventTest.java @@ -19,7 +19,6 @@ package android.view.textclassifier; import static org.junit.Assert.assertEquals; import android.os.Parcel; -import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; @@ -32,19 +31,8 @@ public class SelectionEventTest { @Test public void testParcel() { - final SelectionEvent[] captured = new SelectionEvent[1]; - final Logger logger = new Logger( - new Logger.Config( - InstrumentationRegistry.getTargetContext(), - TextClassifier.WIDGET_TYPE_TEXTVIEW, - null)) { - @Override - public void writeEvent(SelectionEvent event) { - captured[0] = event; - } - }; - logger.logSelectionStartedEvent(SelectionEvent.INVOCATION_MANUAL, 0); - final SelectionEvent event = captured[0]; + final SelectionEvent event = SelectionEvent.createSelectionStartedEvent( + SelectionEvent.INVOCATION_MANUAL, 0); final Parcel parcel = Parcel.obtain(); event.writeToParcel(parcel, event.describeContents()); parcel.setDataPosition(0); |