Merge "Remove legacy logger" into pi-dev
am: 4f9d750e91
Change-Id: I3ecf08e3608ca0ee79c11f4eae9356f6412f29ab
This commit is contained in:
@@ -2245,7 +2245,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;
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
@@ -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) {
|
||||
@@ -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)
|
||||
@@ -146,27 +138,6 @@ public final class SystemTextClassifier implements TextClassifier {
|
||||
return mFallback.getMaxGenerateLinksTextLength();
|
||||
}
|
||||
|
||||
@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 {
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -358,18 +358,6 @@ public interface TextClassifier {
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user