Loading api/current.txt +4 −2 Original line number Diff line number Diff line Loading @@ -53573,7 +53573,7 @@ package android.view.textclassifier { public final class TextClassifierEvent implements android.os.Parcelable { method public int describeContents(); method @NonNull public int[] getActionIndices(); method @Nullable public String getEntityType(); method @NonNull public String[] getEntityTypes(); method public int getEventCategory(); method @Nullable public android.view.textclassifier.TextClassificationContext getEventContext(); method public int getEventIndex(); Loading @@ -53586,6 +53586,7 @@ package android.view.textclassifier { method public int getRelativeWordEndIndex(); method public int getRelativeWordStartIndex(); method @Nullable public String getResultId(); method public float getScore(); method public void writeToParcel(android.os.Parcel, int); field public static final int CATEGORY_CONVERSATION_ACTIONS = 3; // 0x3 field public static final int CATEGORY_LANGUAGE_DETECTION = 4; // 0x4 Loading Loading @@ -53620,7 +53621,7 @@ package android.view.textclassifier { ctor public TextClassifierEvent.Builder(int, int); method @NonNull public android.view.textclassifier.TextClassifierEvent build(); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setActionIndices(@NonNull int...); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setEntityType(@Nullable String); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setEntityTypes(@NonNull java.lang.String...); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setEventContext(@Nullable android.view.textclassifier.TextClassificationContext); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setEventIndex(int); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setEventTime(long); Loading @@ -53631,6 +53632,7 @@ package android.view.textclassifier { method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setRelativeWordEndIndex(int); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setRelativeWordStartIndex(int); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setResultId(@Nullable String); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setScore(float); } public final class TextLanguage implements android.os.Parcelable { core/java/android/view/textclassifier/ActionsSuggestionsHelper.java +7 −4 Original line number Diff line number Diff line Loading @@ -103,10 +103,9 @@ public final class ActionsSuggestionsHelper { final String modelName = String.format( Locale.US, "%s_v%d", localesJoiner.toString(), modelVersion); final int hash = Objects.hash( messages.stream() .map(ConversationActions.Message::getText) .collect(Collectors.toList()), context.getPackageName()); messages.stream().mapToInt(ActionsSuggestionsHelper::hashMessage), context.getPackageName(), System.currentTimeMillis()); return SelectionSessionLogger.SignatureParser.createSignature( SelectionSessionLogger.CLASSIFIER_ID, modelName, hash); } Loading @@ -128,4 +127,8 @@ public final class ActionsSuggestionsHelper { return result; } } private static int hashMessage(ConversationActions.Message message) { return Objects.hash(message.getAuthor(), message.getText(), message.getReferenceTime()); } } core/java/android/view/textclassifier/TextClassifierEvent.java +44 −19 Original line number Diff line number Diff line Loading @@ -72,7 +72,7 @@ public final class TextClassifierEvent implements Parcelable { TYPE_ACTIONS_SHOWN, TYPE_LINK_CLICKED, TYPE_OVERTYPE, TYPE_COPY_ACTION, TYPE_PASTE_ACTION, TYPE_CUT_ACTION, TYPE_SHARE_ACTION, TYPE_SMART_ACTION, TYPE_SELECTION_DRAG, TYPE_SELECTION_DESTROYED, TYPE_OTHER_ACTION, TYPE_SELECT_ALL, TYPE_SELECTION_RESET, TYPE_MANUAL_REPLY}) TYPE_SELECTION_RESET, TYPE_MANUAL_REPLY, TYPE_ACTIONS_GENERATED}) public @interface Type { // For custom event types, use range 1,000,000+. } Loading Loading @@ -121,7 +121,7 @@ public final class TextClassifierEvent implements Parcelable { @Category private final int mEventCategory; @Type private final int mEventType; @Nullable private final String mEntityType; @Nullable private final String[] mEntityTypes; @Nullable private final TextClassificationContext mEventContext; @Nullable private final String mResultId; private final int mEventIndex; Loading @@ -139,11 +139,12 @@ public final class TextClassifierEvent implements Parcelable { // Language detection. @Nullable private final String mLanguage; private final float mScore; private TextClassifierEvent( int eventCategory, int eventType, String entityType, String[] entityTypes, TextClassificationContext eventContext, String resultId, int eventIndex, Loading @@ -154,10 +155,11 @@ public final class TextClassifierEvent implements Parcelable { int relativeSuggestedWordStartIndex, int relativeSuggestedWordEndIndex, int[] actionIndex, String language) { String language, float score) { mEventCategory = eventCategory; mEventType = eventType; mEntityType = entityType; mEntityTypes = entityTypes; mEventContext = eventContext; mResultId = resultId; mEventIndex = eventIndex; Loading @@ -169,6 +171,7 @@ public final class TextClassifierEvent implements Parcelable { mRelativeSuggestedWordEndIndex = relativeSuggestedWordEndIndex; mActionIndices = actionIndex; mLanguage = language; mScore = score; } @Override Loading @@ -180,7 +183,7 @@ public final class TextClassifierEvent implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mEventCategory); dest.writeInt(mEventType); dest.writeString(mEntityType); dest.writeStringArray(mEntityTypes); dest.writeParcelable(mEventContext, flags); dest.writeString(mResultId); dest.writeInt(mEventIndex); Loading @@ -192,13 +195,14 @@ public final class TextClassifierEvent implements Parcelable { dest.writeInt(mRelativeSuggestedWordEndIndex); dest.writeIntArray(mActionIndices); dest.writeString(mLanguage); dest.writeFloat(mScore); } private static TextClassifierEvent readFromParcel(Parcel in) { return new TextClassifierEvent( /* eventCategory= */ in.readInt(), /* eventType= */ in.readInt(), /* entityType= */ in.readString(), /* entityTypes=*/ in.readStringArray(), /* eventContext= */ in.readParcelable(null), /* resultId= */ in.readString(), /* eventIndex= */ in.readInt(), Loading @@ -209,7 +213,8 @@ public final class TextClassifierEvent implements Parcelable { /* relativeSuggestedWordStartIndex= */ in.readInt(), /* relativeSuggestedWordEndIndex= */ in.readInt(), /* actionIndices= */ in.createIntArray(), /* language= */ in.readString()); /* language= */ in.readString(), /* score= */ in.readFloat()); } /** Loading @@ -229,11 +234,11 @@ public final class TextClassifierEvent implements Parcelable { } /** * Returns the entity type. e.g. {@link TextClassifier#TYPE_ADDRESS}. * Returns an array of entity types. e.g. {@link TextClassifier#TYPE_ADDRESS}. */ @Nullable public String getEntityType() { return mEntityType; @NonNull public String[] getEntityTypes() { return mEntityTypes; } /** Loading Loading @@ -326,6 +331,13 @@ public final class TextClassifierEvent implements Parcelable { return mLanguage; } /** * Returns the score of the suggestion. */ public float getScore() { return mScore; } /** * Builder to build a text classifier event. */ Loading @@ -333,7 +345,7 @@ public final class TextClassifierEvent implements Parcelable { private final int mEventCategory; private final int mEventType; @Nullable private String mEntityType; private String[] mEntityTypes = new String[0]; @Nullable private TextClassificationContext mEventContext; @Nullable private String mResultId; private int mEventIndex; Loading @@ -345,6 +357,7 @@ public final class TextClassifierEvent implements Parcelable { private int mRelativeSuggestedWordEndIndex; private int[] mActionIndices = new int[0]; @Nullable private String mLanguage; private float mScore; /** * Creates a builder for building {@link TextClassifierEvent}s. Loading @@ -358,11 +371,12 @@ public final class TextClassifierEvent implements Parcelable { } /** * Sets the entity type. e.g. {@link TextClassifier#TYPE_ADDRESS}. * Sets the entity types. e.g. {@link TextClassifier#TYPE_ADDRESS}. */ @NonNull public Builder setEntityType(@Nullable String entityType) { mEntityType = entityType; public Builder setEntityTypes(@NonNull String... entityTypes) { mEntityTypes = new String[entityTypes.length]; System.arraycopy(entityTypes, 0, mEntityTypes, 0, entityTypes.length); return this; } Loading Loading @@ -477,6 +491,15 @@ public final class TextClassifierEvent implements Parcelable { return this; } /** * Sets the score of the suggestion. */ @NonNull public Builder setScore(float score) { mScore = score; return this; } /** * Builds and returns a text classifier event. */ Loading @@ -486,7 +509,7 @@ public final class TextClassifierEvent implements Parcelable { return new TextClassifierEvent( mEventCategory, mEventType, mEntityType, mEntityTypes, mEventContext, mResultId, mEventIndex, Loading @@ -497,7 +520,8 @@ public final class TextClassifierEvent implements Parcelable { mRelativeSuggestedWordStartIndex, mRelativeSuggestedWordEndIndex, mActionIndices, mLanguage); mLanguage, mScore); } // TODO: Add build(boolean validate). } Loading @@ -507,7 +531,7 @@ public final class TextClassifierEvent implements Parcelable { StringBuilder out = new StringBuilder(128); out.append("TextClassifierEvent{"); out.append("mEventCategory=").append(mEventCategory); out.append(", mEventType=").append(mEventType); out.append(", mEventTypes=").append(Arrays.toString(mEntityTypes)); out.append(", mEventContext=").append(mEventContext); out.append(", mResultId=").append(mResultId); out.append(", mEventIndex=").append(mEventIndex); Loading @@ -519,6 +543,7 @@ public final class TextClassifierEvent implements Parcelable { out.append(", mRelativeSuggestedWordEndIndex=").append(mRelativeSuggestedWordEndIndex); out.append(", mActionIndices=").append(Arrays.toString(mActionIndices)); out.append(", mLanguage=").append(mLanguage); out.append(", mScore=").append(mScore); out.append("}"); return out.toString(); } Loading core/java/android/view/textclassifier/TextClassifierEventTronLogger.java +45 −15 Original line number Diff line number Diff line Loading @@ -15,12 +15,15 @@ */ package android.view.textclassifier; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_ENTITY_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_SESSION_ID; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_WIDGET_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_WIDGET_VERSION; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXTCLASSIFIER_MODEL; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_EVENT_TIME; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_FIRST_ENTITY_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_SCORE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_SECOND_ENTITY_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_SESSION_ID; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_THIRD_ENTITY_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_WIDGET_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_WIDGET_VERSION; import android.metrics.LogMaker; Loading Loading @@ -60,16 +63,30 @@ public final class TextClassifierEventTronLogger { return; } final LogMaker log = new LogMaker(category) .setType(getLogType(event)) .addTaggedData(FIELD_SELECTION_SESSION_ID, event.getResultId()) .setSubtype(getLogType(event)) .addTaggedData(FIELD_TEXT_CLASSIFIER_SESSION_ID, event.getResultId()) .addTaggedData(FIELD_TEXT_CLASSIFIER_EVENT_TIME, event.getEventTime()) .addTaggedData(FIELD_TEXTCLASSIFIER_MODEL, SelectionSessionLogger.SignatureParser.getModelName(event.getResultId())) .addTaggedData(FIELD_SELECTION_ENTITY_TYPE, event.getEntityType()); .addTaggedData(FIELD_TEXT_CLASSIFIER_SCORE, event.getScore()); String[] entityTypes = event.getEntityTypes(); // TRON does not support a field of list type, and thus workaround by store them // in three separate fields. This is no longer an issue once we have moved to Westworld. if (entityTypes.length >= 1) { log.addTaggedData(FIELD_TEXT_CLASSIFIER_FIRST_ENTITY_TYPE, entityTypes[0]); } if (entityTypes.length >= 2) { log.addTaggedData(FIELD_TEXT_CLASSIFIER_SECOND_ENTITY_TYPE, entityTypes[1]); } if (entityTypes.length >= 3) { log.addTaggedData(FIELD_TEXT_CLASSIFIER_THIRD_ENTITY_TYPE, entityTypes[2]); } TextClassificationContext eventContext = event.getEventContext(); if (eventContext != null) { log.addTaggedData(FIELD_SELECTION_WIDGET_TYPE, eventContext.getWidgetType()); log.addTaggedData(FIELD_SELECTION_WIDGET_VERSION, eventContext.getWidgetVersion()); log.addTaggedData(FIELD_TEXT_CLASSIFIER_WIDGET_TYPE, eventContext.getWidgetType()); log.addTaggedData(FIELD_TEXT_CLASSIFIER_WIDGET_VERSION, eventContext.getWidgetVersion()); log.setPackageName(eventContext.getPackageName()); } mMetricsLogger.write(log); Loading @@ -94,6 +111,8 @@ public final class TextClassifierEventTronLogger { return MetricsEvent.ACTION_TEXT_CLASSIFIER_ACTIONS_SHOWN; case TextClassifierEvent.TYPE_MANUAL_REPLY: return MetricsEvent.ACTION_TEXT_CLASSIFIER_MANUAL_REPLY; case TextClassifierEvent.TYPE_ACTIONS_GENERATED: return MetricsEvent.ACTION_TEXT_CLASSIFIER_ACTIONS_GENERATED; default: return MetricsEvent.VIEW_UNKNOWN; } Loading Loading @@ -127,14 +146,22 @@ public final class TextClassifierEventTronLogger { if (!Log.ENABLE_FULL_LOGGING) { return; } final String id = String.valueOf(log.getTaggedData(FIELD_SELECTION_SESSION_ID)); final String id = String.valueOf(log.getTaggedData(FIELD_TEXT_CLASSIFIER_SESSION_ID)); final String categoryName = toCategoryName(log.getCategory()); final String eventName = toEventName(log.getType()); final String widgetType = String.valueOf(log.getTaggedData(FIELD_SELECTION_WIDGET_TYPE)); final String eventName = toEventName(log.getSubtype()); final String widgetType = String.valueOf(log.getTaggedData(FIELD_TEXT_CLASSIFIER_WIDGET_TYPE)); final String widgetVersion = String.valueOf(log.getTaggedData(FIELD_SELECTION_WIDGET_VERSION)); String.valueOf(log.getTaggedData(FIELD_TEXT_CLASSIFIER_WIDGET_VERSION)); final String model = String.valueOf(log.getTaggedData(FIELD_TEXTCLASSIFIER_MODEL)); final String entityType = String.valueOf(log.getTaggedData(FIELD_SELECTION_ENTITY_TYPE)); final String firstEntityType = String.valueOf(log.getTaggedData(FIELD_TEXT_CLASSIFIER_FIRST_ENTITY_TYPE)); final String secondEntityType = String.valueOf(log.getTaggedData(FIELD_TEXT_CLASSIFIER_SECOND_ENTITY_TYPE)); final String thirdEntityType = String.valueOf(log.getTaggedData(FIELD_TEXT_CLASSIFIER_THIRD_ENTITY_TYPE)); final String score = String.valueOf(log.getTaggedData(FIELD_TEXT_CLASSIFIER_SCORE)); StringBuilder builder = new StringBuilder(); builder.append("writeEvent: "); Loading @@ -144,7 +171,10 @@ public final class TextClassifierEventTronLogger { builder.append(", widgetType=").append(widgetType); builder.append(", widgetVersion=").append(widgetVersion); builder.append(", model=").append(model); builder.append(", entityType=").append(entityType); builder.append(", firstEntityType=").append(firstEntityType); builder.append(", secondEntityType=").append(secondEntityType); builder.append(", thirdEntityType=").append(thirdEntityType); builder.append(", score=").append(score); Log.v(TAG, builder.toString()); } Loading core/tests/coretests/src/android/view/textclassifier/logging/TextClassifierEventTronLoggerTest.java +11 −6 Original line number Diff line number Diff line Loading @@ -18,9 +18,10 @@ package android.view.textclassifier.logging; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_TEXT_SELECTION_SMART_SHARE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.CONVERSATION_ACTIONS; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_ENTITY_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_WIDGET_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_EVENT_TIME; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_FIRST_ENTITY_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_SCORE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_WIDGET_TYPE; import static com.google.common.truth.Truth.assertThat; Loading Loading @@ -71,7 +72,8 @@ public class TextClassifierEventTronLoggerTest { new TextClassifierEvent.Builder( TextClassifierEvent.CATEGORY_CONVERSATION_ACTIONS, TextClassifierEvent.TYPE_SMART_ACTION) .setEntityType(ConversationAction.TYPE_CALL_PHONE) .setEntityTypes(ConversationAction.TYPE_CALL_PHONE) .setScore(0.5f) .setEventTime(EVENT_TIME) .setEventContext(textClassificationContext) .build(); Loading @@ -83,15 +85,18 @@ public class TextClassifierEventTronLoggerTest { LogMaker logMaker = captor.getValue(); assertThat(logMaker.getCategory()).isEqualTo( CONVERSATION_ACTIONS); assertThat(logMaker.getType()).isEqualTo( assertThat(logMaker.getSubtype()).isEqualTo( ACTION_TEXT_SELECTION_SMART_SHARE); assertThat(logMaker.getTaggedData(FIELD_SELECTION_ENTITY_TYPE)) assertThat(logMaker.getTaggedData(FIELD_TEXT_CLASSIFIER_FIRST_ENTITY_TYPE)) .isEqualTo(ConversationAction.TYPE_CALL_PHONE); assertThat((float) logMaker.getTaggedData(FIELD_TEXT_CLASSIFIER_SCORE)) .isWithin(0.00001f).of(0.5f); assertThat(logMaker.getTaggedData(FIELD_TEXT_CLASSIFIER_EVENT_TIME)) .isEqualTo(EVENT_TIME); assertThat(logMaker.getPackageName()).isEqualTo(PACKAGE_NAME); assertThat(logMaker.getTaggedData(FIELD_SELECTION_WIDGET_TYPE)) assertThat(logMaker.getTaggedData(FIELD_TEXT_CLASSIFIER_WIDGET_TYPE)) .isEqualTo(WIDGET_TYPE); } @Test Loading Loading
api/current.txt +4 −2 Original line number Diff line number Diff line Loading @@ -53573,7 +53573,7 @@ package android.view.textclassifier { public final class TextClassifierEvent implements android.os.Parcelable { method public int describeContents(); method @NonNull public int[] getActionIndices(); method @Nullable public String getEntityType(); method @NonNull public String[] getEntityTypes(); method public int getEventCategory(); method @Nullable public android.view.textclassifier.TextClassificationContext getEventContext(); method public int getEventIndex(); Loading @@ -53586,6 +53586,7 @@ package android.view.textclassifier { method public int getRelativeWordEndIndex(); method public int getRelativeWordStartIndex(); method @Nullable public String getResultId(); method public float getScore(); method public void writeToParcel(android.os.Parcel, int); field public static final int CATEGORY_CONVERSATION_ACTIONS = 3; // 0x3 field public static final int CATEGORY_LANGUAGE_DETECTION = 4; // 0x4 Loading Loading @@ -53620,7 +53621,7 @@ package android.view.textclassifier { ctor public TextClassifierEvent.Builder(int, int); method @NonNull public android.view.textclassifier.TextClassifierEvent build(); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setActionIndices(@NonNull int...); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setEntityType(@Nullable String); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setEntityTypes(@NonNull java.lang.String...); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setEventContext(@Nullable android.view.textclassifier.TextClassificationContext); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setEventIndex(int); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setEventTime(long); Loading @@ -53631,6 +53632,7 @@ package android.view.textclassifier { method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setRelativeWordEndIndex(int); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setRelativeWordStartIndex(int); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setResultId(@Nullable String); method @NonNull public android.view.textclassifier.TextClassifierEvent.Builder setScore(float); } public final class TextLanguage implements android.os.Parcelable {
core/java/android/view/textclassifier/ActionsSuggestionsHelper.java +7 −4 Original line number Diff line number Diff line Loading @@ -103,10 +103,9 @@ public final class ActionsSuggestionsHelper { final String modelName = String.format( Locale.US, "%s_v%d", localesJoiner.toString(), modelVersion); final int hash = Objects.hash( messages.stream() .map(ConversationActions.Message::getText) .collect(Collectors.toList()), context.getPackageName()); messages.stream().mapToInt(ActionsSuggestionsHelper::hashMessage), context.getPackageName(), System.currentTimeMillis()); return SelectionSessionLogger.SignatureParser.createSignature( SelectionSessionLogger.CLASSIFIER_ID, modelName, hash); } Loading @@ -128,4 +127,8 @@ public final class ActionsSuggestionsHelper { return result; } } private static int hashMessage(ConversationActions.Message message) { return Objects.hash(message.getAuthor(), message.getText(), message.getReferenceTime()); } }
core/java/android/view/textclassifier/TextClassifierEvent.java +44 −19 Original line number Diff line number Diff line Loading @@ -72,7 +72,7 @@ public final class TextClassifierEvent implements Parcelable { TYPE_ACTIONS_SHOWN, TYPE_LINK_CLICKED, TYPE_OVERTYPE, TYPE_COPY_ACTION, TYPE_PASTE_ACTION, TYPE_CUT_ACTION, TYPE_SHARE_ACTION, TYPE_SMART_ACTION, TYPE_SELECTION_DRAG, TYPE_SELECTION_DESTROYED, TYPE_OTHER_ACTION, TYPE_SELECT_ALL, TYPE_SELECTION_RESET, TYPE_MANUAL_REPLY}) TYPE_SELECTION_RESET, TYPE_MANUAL_REPLY, TYPE_ACTIONS_GENERATED}) public @interface Type { // For custom event types, use range 1,000,000+. } Loading Loading @@ -121,7 +121,7 @@ public final class TextClassifierEvent implements Parcelable { @Category private final int mEventCategory; @Type private final int mEventType; @Nullable private final String mEntityType; @Nullable private final String[] mEntityTypes; @Nullable private final TextClassificationContext mEventContext; @Nullable private final String mResultId; private final int mEventIndex; Loading @@ -139,11 +139,12 @@ public final class TextClassifierEvent implements Parcelable { // Language detection. @Nullable private final String mLanguage; private final float mScore; private TextClassifierEvent( int eventCategory, int eventType, String entityType, String[] entityTypes, TextClassificationContext eventContext, String resultId, int eventIndex, Loading @@ -154,10 +155,11 @@ public final class TextClassifierEvent implements Parcelable { int relativeSuggestedWordStartIndex, int relativeSuggestedWordEndIndex, int[] actionIndex, String language) { String language, float score) { mEventCategory = eventCategory; mEventType = eventType; mEntityType = entityType; mEntityTypes = entityTypes; mEventContext = eventContext; mResultId = resultId; mEventIndex = eventIndex; Loading @@ -169,6 +171,7 @@ public final class TextClassifierEvent implements Parcelable { mRelativeSuggestedWordEndIndex = relativeSuggestedWordEndIndex; mActionIndices = actionIndex; mLanguage = language; mScore = score; } @Override Loading @@ -180,7 +183,7 @@ public final class TextClassifierEvent implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mEventCategory); dest.writeInt(mEventType); dest.writeString(mEntityType); dest.writeStringArray(mEntityTypes); dest.writeParcelable(mEventContext, flags); dest.writeString(mResultId); dest.writeInt(mEventIndex); Loading @@ -192,13 +195,14 @@ public final class TextClassifierEvent implements Parcelable { dest.writeInt(mRelativeSuggestedWordEndIndex); dest.writeIntArray(mActionIndices); dest.writeString(mLanguage); dest.writeFloat(mScore); } private static TextClassifierEvent readFromParcel(Parcel in) { return new TextClassifierEvent( /* eventCategory= */ in.readInt(), /* eventType= */ in.readInt(), /* entityType= */ in.readString(), /* entityTypes=*/ in.readStringArray(), /* eventContext= */ in.readParcelable(null), /* resultId= */ in.readString(), /* eventIndex= */ in.readInt(), Loading @@ -209,7 +213,8 @@ public final class TextClassifierEvent implements Parcelable { /* relativeSuggestedWordStartIndex= */ in.readInt(), /* relativeSuggestedWordEndIndex= */ in.readInt(), /* actionIndices= */ in.createIntArray(), /* language= */ in.readString()); /* language= */ in.readString(), /* score= */ in.readFloat()); } /** Loading @@ -229,11 +234,11 @@ public final class TextClassifierEvent implements Parcelable { } /** * Returns the entity type. e.g. {@link TextClassifier#TYPE_ADDRESS}. * Returns an array of entity types. e.g. {@link TextClassifier#TYPE_ADDRESS}. */ @Nullable public String getEntityType() { return mEntityType; @NonNull public String[] getEntityTypes() { return mEntityTypes; } /** Loading Loading @@ -326,6 +331,13 @@ public final class TextClassifierEvent implements Parcelable { return mLanguage; } /** * Returns the score of the suggestion. */ public float getScore() { return mScore; } /** * Builder to build a text classifier event. */ Loading @@ -333,7 +345,7 @@ public final class TextClassifierEvent implements Parcelable { private final int mEventCategory; private final int mEventType; @Nullable private String mEntityType; private String[] mEntityTypes = new String[0]; @Nullable private TextClassificationContext mEventContext; @Nullable private String mResultId; private int mEventIndex; Loading @@ -345,6 +357,7 @@ public final class TextClassifierEvent implements Parcelable { private int mRelativeSuggestedWordEndIndex; private int[] mActionIndices = new int[0]; @Nullable private String mLanguage; private float mScore; /** * Creates a builder for building {@link TextClassifierEvent}s. Loading @@ -358,11 +371,12 @@ public final class TextClassifierEvent implements Parcelable { } /** * Sets the entity type. e.g. {@link TextClassifier#TYPE_ADDRESS}. * Sets the entity types. e.g. {@link TextClassifier#TYPE_ADDRESS}. */ @NonNull public Builder setEntityType(@Nullable String entityType) { mEntityType = entityType; public Builder setEntityTypes(@NonNull String... entityTypes) { mEntityTypes = new String[entityTypes.length]; System.arraycopy(entityTypes, 0, mEntityTypes, 0, entityTypes.length); return this; } Loading Loading @@ -477,6 +491,15 @@ public final class TextClassifierEvent implements Parcelable { return this; } /** * Sets the score of the suggestion. */ @NonNull public Builder setScore(float score) { mScore = score; return this; } /** * Builds and returns a text classifier event. */ Loading @@ -486,7 +509,7 @@ public final class TextClassifierEvent implements Parcelable { return new TextClassifierEvent( mEventCategory, mEventType, mEntityType, mEntityTypes, mEventContext, mResultId, mEventIndex, Loading @@ -497,7 +520,8 @@ public final class TextClassifierEvent implements Parcelable { mRelativeSuggestedWordStartIndex, mRelativeSuggestedWordEndIndex, mActionIndices, mLanguage); mLanguage, mScore); } // TODO: Add build(boolean validate). } Loading @@ -507,7 +531,7 @@ public final class TextClassifierEvent implements Parcelable { StringBuilder out = new StringBuilder(128); out.append("TextClassifierEvent{"); out.append("mEventCategory=").append(mEventCategory); out.append(", mEventType=").append(mEventType); out.append(", mEventTypes=").append(Arrays.toString(mEntityTypes)); out.append(", mEventContext=").append(mEventContext); out.append(", mResultId=").append(mResultId); out.append(", mEventIndex=").append(mEventIndex); Loading @@ -519,6 +543,7 @@ public final class TextClassifierEvent implements Parcelable { out.append(", mRelativeSuggestedWordEndIndex=").append(mRelativeSuggestedWordEndIndex); out.append(", mActionIndices=").append(Arrays.toString(mActionIndices)); out.append(", mLanguage=").append(mLanguage); out.append(", mScore=").append(mScore); out.append("}"); return out.toString(); } Loading
core/java/android/view/textclassifier/TextClassifierEventTronLogger.java +45 −15 Original line number Diff line number Diff line Loading @@ -15,12 +15,15 @@ */ package android.view.textclassifier; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_ENTITY_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_SESSION_ID; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_WIDGET_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_WIDGET_VERSION; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXTCLASSIFIER_MODEL; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_EVENT_TIME; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_FIRST_ENTITY_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_SCORE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_SECOND_ENTITY_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_SESSION_ID; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_THIRD_ENTITY_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_WIDGET_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_WIDGET_VERSION; import android.metrics.LogMaker; Loading Loading @@ -60,16 +63,30 @@ public final class TextClassifierEventTronLogger { return; } final LogMaker log = new LogMaker(category) .setType(getLogType(event)) .addTaggedData(FIELD_SELECTION_SESSION_ID, event.getResultId()) .setSubtype(getLogType(event)) .addTaggedData(FIELD_TEXT_CLASSIFIER_SESSION_ID, event.getResultId()) .addTaggedData(FIELD_TEXT_CLASSIFIER_EVENT_TIME, event.getEventTime()) .addTaggedData(FIELD_TEXTCLASSIFIER_MODEL, SelectionSessionLogger.SignatureParser.getModelName(event.getResultId())) .addTaggedData(FIELD_SELECTION_ENTITY_TYPE, event.getEntityType()); .addTaggedData(FIELD_TEXT_CLASSIFIER_SCORE, event.getScore()); String[] entityTypes = event.getEntityTypes(); // TRON does not support a field of list type, and thus workaround by store them // in three separate fields. This is no longer an issue once we have moved to Westworld. if (entityTypes.length >= 1) { log.addTaggedData(FIELD_TEXT_CLASSIFIER_FIRST_ENTITY_TYPE, entityTypes[0]); } if (entityTypes.length >= 2) { log.addTaggedData(FIELD_TEXT_CLASSIFIER_SECOND_ENTITY_TYPE, entityTypes[1]); } if (entityTypes.length >= 3) { log.addTaggedData(FIELD_TEXT_CLASSIFIER_THIRD_ENTITY_TYPE, entityTypes[2]); } TextClassificationContext eventContext = event.getEventContext(); if (eventContext != null) { log.addTaggedData(FIELD_SELECTION_WIDGET_TYPE, eventContext.getWidgetType()); log.addTaggedData(FIELD_SELECTION_WIDGET_VERSION, eventContext.getWidgetVersion()); log.addTaggedData(FIELD_TEXT_CLASSIFIER_WIDGET_TYPE, eventContext.getWidgetType()); log.addTaggedData(FIELD_TEXT_CLASSIFIER_WIDGET_VERSION, eventContext.getWidgetVersion()); log.setPackageName(eventContext.getPackageName()); } mMetricsLogger.write(log); Loading @@ -94,6 +111,8 @@ public final class TextClassifierEventTronLogger { return MetricsEvent.ACTION_TEXT_CLASSIFIER_ACTIONS_SHOWN; case TextClassifierEvent.TYPE_MANUAL_REPLY: return MetricsEvent.ACTION_TEXT_CLASSIFIER_MANUAL_REPLY; case TextClassifierEvent.TYPE_ACTIONS_GENERATED: return MetricsEvent.ACTION_TEXT_CLASSIFIER_ACTIONS_GENERATED; default: return MetricsEvent.VIEW_UNKNOWN; } Loading Loading @@ -127,14 +146,22 @@ public final class TextClassifierEventTronLogger { if (!Log.ENABLE_FULL_LOGGING) { return; } final String id = String.valueOf(log.getTaggedData(FIELD_SELECTION_SESSION_ID)); final String id = String.valueOf(log.getTaggedData(FIELD_TEXT_CLASSIFIER_SESSION_ID)); final String categoryName = toCategoryName(log.getCategory()); final String eventName = toEventName(log.getType()); final String widgetType = String.valueOf(log.getTaggedData(FIELD_SELECTION_WIDGET_TYPE)); final String eventName = toEventName(log.getSubtype()); final String widgetType = String.valueOf(log.getTaggedData(FIELD_TEXT_CLASSIFIER_WIDGET_TYPE)); final String widgetVersion = String.valueOf(log.getTaggedData(FIELD_SELECTION_WIDGET_VERSION)); String.valueOf(log.getTaggedData(FIELD_TEXT_CLASSIFIER_WIDGET_VERSION)); final String model = String.valueOf(log.getTaggedData(FIELD_TEXTCLASSIFIER_MODEL)); final String entityType = String.valueOf(log.getTaggedData(FIELD_SELECTION_ENTITY_TYPE)); final String firstEntityType = String.valueOf(log.getTaggedData(FIELD_TEXT_CLASSIFIER_FIRST_ENTITY_TYPE)); final String secondEntityType = String.valueOf(log.getTaggedData(FIELD_TEXT_CLASSIFIER_SECOND_ENTITY_TYPE)); final String thirdEntityType = String.valueOf(log.getTaggedData(FIELD_TEXT_CLASSIFIER_THIRD_ENTITY_TYPE)); final String score = String.valueOf(log.getTaggedData(FIELD_TEXT_CLASSIFIER_SCORE)); StringBuilder builder = new StringBuilder(); builder.append("writeEvent: "); Loading @@ -144,7 +171,10 @@ public final class TextClassifierEventTronLogger { builder.append(", widgetType=").append(widgetType); builder.append(", widgetVersion=").append(widgetVersion); builder.append(", model=").append(model); builder.append(", entityType=").append(entityType); builder.append(", firstEntityType=").append(firstEntityType); builder.append(", secondEntityType=").append(secondEntityType); builder.append(", thirdEntityType=").append(thirdEntityType); builder.append(", score=").append(score); Log.v(TAG, builder.toString()); } Loading
core/tests/coretests/src/android/view/textclassifier/logging/TextClassifierEventTronLoggerTest.java +11 −6 Original line number Diff line number Diff line Loading @@ -18,9 +18,10 @@ package android.view.textclassifier.logging; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_TEXT_SELECTION_SMART_SHARE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.CONVERSATION_ACTIONS; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_ENTITY_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_SELECTION_WIDGET_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_EVENT_TIME; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_FIRST_ENTITY_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_SCORE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_WIDGET_TYPE; import static com.google.common.truth.Truth.assertThat; Loading Loading @@ -71,7 +72,8 @@ public class TextClassifierEventTronLoggerTest { new TextClassifierEvent.Builder( TextClassifierEvent.CATEGORY_CONVERSATION_ACTIONS, TextClassifierEvent.TYPE_SMART_ACTION) .setEntityType(ConversationAction.TYPE_CALL_PHONE) .setEntityTypes(ConversationAction.TYPE_CALL_PHONE) .setScore(0.5f) .setEventTime(EVENT_TIME) .setEventContext(textClassificationContext) .build(); Loading @@ -83,15 +85,18 @@ public class TextClassifierEventTronLoggerTest { LogMaker logMaker = captor.getValue(); assertThat(logMaker.getCategory()).isEqualTo( CONVERSATION_ACTIONS); assertThat(logMaker.getType()).isEqualTo( assertThat(logMaker.getSubtype()).isEqualTo( ACTION_TEXT_SELECTION_SMART_SHARE); assertThat(logMaker.getTaggedData(FIELD_SELECTION_ENTITY_TYPE)) assertThat(logMaker.getTaggedData(FIELD_TEXT_CLASSIFIER_FIRST_ENTITY_TYPE)) .isEqualTo(ConversationAction.TYPE_CALL_PHONE); assertThat((float) logMaker.getTaggedData(FIELD_TEXT_CLASSIFIER_SCORE)) .isWithin(0.00001f).of(0.5f); assertThat(logMaker.getTaggedData(FIELD_TEXT_CLASSIFIER_EVENT_TIME)) .isEqualTo(EVENT_TIME); assertThat(logMaker.getPackageName()).isEqualTo(PACKAGE_NAME); assertThat(logMaker.getTaggedData(FIELD_SELECTION_WIDGET_TYPE)) assertThat(logMaker.getTaggedData(FIELD_TEXT_CLASSIFIER_WIDGET_TYPE)) .isEqualTo(WIDGET_TYPE); } @Test Loading