From 03a1d0338dee9787852440e1663260c28d9cd885 Mon Sep 17 00:00:00 2001 From: Tony Mak Date: Thu, 24 Jan 2019 15:12:00 +0000 Subject: [PATCH] Add g/setScore and g/setEntityTypes to TextClassifierEvent 1. Add get/setScore, so we can see how do scores affect the CTR and eventually tune the threshold based on it. 2. Convert get/setEntity to get/setEntityTypes. Some events like TYPE_ACTIONS_GENERATED and TYPE_ACTIONS_SHOWN will need to have a list of entity types. Also, as TRON does not support a field of list type. And thus workaround this by having 3 separate fields in TRON. 4. The result id of action is too easy to clash now as only messages are taking into account. Use timestamp and the person object as the input to the hash now. 5. Changes in TRON: a) We will put conversation_action / language detection, etc to category. And we will put the views to subtype. b) As suggested by the TRON team, we should not reuse existing fields in the clients directly. But we should rather introduce new fields, and map them to existing fields in the server. So, TRON team could suppress just the new logging if it goes wrong and not affect existing loggings. Test: atest TextClassifierEventTest.java Tests: atest TextClassifierEventTronLoggerTest.java BUG: 120803809 Change-Id: I2e71436b323a200beec57ea7c1a8bcc96c9c552f --- api/current.txt | 6 +- .../ActionsSuggestionsHelper.java | 11 ++-- .../textclassifier/TextClassifierEvent.java | 63 +++++++++++++------ .../TextClassifierEventTronLogger.java | 60 +++++++++++++----- .../TextClassifierEventTronLoggerTest.java | 17 +++-- .../notification/SmartActionsHelper.java | 4 +- .../metrics_constants/metrics_constants.proto | 46 ++++++++++++-- 7 files changed, 153 insertions(+), 54 deletions(-) diff --git a/api/current.txt b/api/current.txt index 55f5a6d7fdba4..26946e7340f0e 100644 --- a/api/current.txt +++ b/api/current.txt @@ -53560,7 +53560,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(); @@ -53573,6 +53573,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 @@ -53607,7 +53608,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); @@ -53618,6 +53619,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 { diff --git a/core/java/android/view/textclassifier/ActionsSuggestionsHelper.java b/core/java/android/view/textclassifier/ActionsSuggestionsHelper.java index 77cb4cd28763b..fdc34b3f68d04 100644 --- a/core/java/android/view/textclassifier/ActionsSuggestionsHelper.java +++ b/core/java/android/view/textclassifier/ActionsSuggestionsHelper.java @@ -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); } @@ -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()); + } } diff --git a/core/java/android/view/textclassifier/TextClassifierEvent.java b/core/java/android/view/textclassifier/TextClassifierEvent.java index b84f6f07e4147..cd13cc0ec5774 100644 --- a/core/java/android/view/textclassifier/TextClassifierEvent.java +++ b/core/java/android/view/textclassifier/TextClassifierEvent.java @@ -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+. } @@ -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; @@ -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, @@ -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; @@ -169,6 +171,7 @@ public final class TextClassifierEvent implements Parcelable { mRelativeSuggestedWordEndIndex = relativeSuggestedWordEndIndex; mActionIndices = actionIndex; mLanguage = language; + mScore = score; } @Override @@ -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); @@ -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(), @@ -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()); } /** @@ -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; } /** @@ -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. */ @@ -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; @@ -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. @@ -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; } @@ -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. */ @@ -486,7 +509,7 @@ public final class TextClassifierEvent implements Parcelable { return new TextClassifierEvent( mEventCategory, mEventType, - mEntityType, + mEntityTypes, mEventContext, mResultId, mEventIndex, @@ -497,7 +520,8 @@ public final class TextClassifierEvent implements Parcelable { mRelativeSuggestedWordStartIndex, mRelativeSuggestedWordEndIndex, mActionIndices, - mLanguage); + mLanguage, + mScore); } // TODO: Add build(boolean validate). } @@ -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); @@ -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(); } diff --git a/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java b/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java index 439e594cc8fed..5563dfc2eee53 100644 --- a/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java +++ b/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java @@ -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; @@ -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); @@ -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; } @@ -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: "); @@ -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()); } diff --git a/core/tests/coretests/src/android/view/textclassifier/logging/TextClassifierEventTronLoggerTest.java b/core/tests/coretests/src/android/view/textclassifier/logging/TextClassifierEventTronLoggerTest.java index b1b74160ecd5c..73af56743b5f1 100644 --- a/core/tests/coretests/src/android/view/textclassifier/logging/TextClassifierEventTronLoggerTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/logging/TextClassifierEventTronLoggerTest.java @@ -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; @@ -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(); @@ -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 diff --git a/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java b/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java index 0d528e7078f8a..bc6e2fc7fc48c 100644 --- a/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java +++ b/packages/ExtServices/src/android/ext/services/notification/SmartActionsHelper.java @@ -202,7 +202,7 @@ public class SmartActionsHelper { } TextClassifierEvent textClassifierEvent = createTextClassifierEventBuilder(TextClassifierEvent.TYPE_SMART_ACTION, resultId) - .setEntityType(ConversationAction.TYPE_TEXT_REPLY) + .setEntityTypes(ConversationAction.TYPE_TEXT_REPLY) .build(); mTextClassifier.onTextClassifierEvent(textClassifierEvent); } @@ -225,7 +225,7 @@ public class SmartActionsHelper { } TextClassifierEvent textClassifierEvent = createTextClassifierEventBuilder(TextClassifierEvent.TYPE_SMART_ACTION, resultId) - .setEntityType(actionType) + .setEntityTypes(actionType) .build(); mTextClassifier.onTextClassifierEvent(textClassifierEvent); } diff --git a/proto/src/metrics_constants/metrics_constants.proto b/proto/src/metrics_constants/metrics_constants.proto index d1aa84fe31336..73fcb0150a9ec 100644 --- a/proto/src/metrics_constants/metrics_constants.proto +++ b/proto/src/metrics_constants/metrics_constants.proto @@ -6780,22 +6780,22 @@ message MetricsEvent { CONVERSATION_ACTIONS = 1615; // ACTION: Actions from a text classifier are shown to user. - // CATEGORY: CONVERSATION_ACTIONS + // CATEGORY: LANGUAGE_DETECTION, CONVERSATION_ACTIONS // OS: Q ACTION_TEXT_CLASSIFIER_ACTIONS_SHOWN = 1616; - // ACTION: Event time of a text classifier event in unix timestamp. - // CATEGORY: CONVERSATION_ACTIONS, LANGUAGE_DETECTION + // FIELD: Event time of a text classifier event in unix timestamp. + // CATEGORY: LANGUAGE_DETECTION, CONVERSATION_ACTIONS // OS: Q FIELD_TEXT_CLASSIFIER_EVENT_TIME = 1617; // ACTION: Users compose their own replies instead of using suggested ones. - // CATEGORY: CONVERSATION_ACTIONS + // CATEGORY: LANGUAGE_DETECTION, CONVERSATION_ACTIONS // OS: Q ACTION_TEXT_CLASSIFIER_MANUAL_REPLY = 1618; // ACTION: Text classifier generates an action. - // CATEGORY: CONVERSATION_ACTIONS + // CATEGORY: LANGUAGE_DETECTION, CONVERSATION_ACTIONS // OS: Q ACTION_TEXT_CLASSIFIER_ACTIONS_GENERATED = 1619; @@ -6840,7 +6840,7 @@ message MetricsEvent { // OPEN: Settings > Display > Adaptive sleep // OS: Q SETTINGS_ADAPTIVE_SLEEP = 1628; - + // Tagged data for SMART_REPLY_VISIBLE and NOTIFICATION_ITEM_ACTION. // The UI location of the notification containing the smart suggestions. // This is a NotificationLocation object (see the NotificationLocation @@ -6870,6 +6870,40 @@ message MetricsEvent { // OS: Q DIALOG_AWARE_DISABLE = 1633; + // FIELD: Session ID of TextClassifierEvent. + // CATEGORY: LANGUAGE_DETECTION, CONVERSATION_ACTIONS + // OS: Q + FIELD_TEXT_CLASSIFIER_SESSION_ID = 1634; + + // FIELD: First entity type. + // CATEGORY: LANGUAGE_DETECTION, CONVERSATION_ACTIONS + // OS: Q + FIELD_TEXT_CLASSIFIER_FIRST_ENTITY_TYPE = 1635; + // FIELD: Second entity type. + // CATEGORY: LANGUAGE_DETECTION, CONVERSATION_ACTIONS + // OS: Q + FIELD_TEXT_CLASSIFIER_SECOND_ENTITY_TYPE = 1636; + + // FIELD: Third entity type. + // CATEGORY: LANGUAGE_DETECTION, CONVERSATION_ACTIONS + // OS: Q + FIELD_TEXT_CLASSIFIER_THIRD_ENTITY_TYPE = 1637; + + // FIELD: Score of the suggestion. + // CATEGORY: LANGUAGE_DETECTION, CONVERSATION_ACTIONS + // OS: Q + FIELD_TEXT_CLASSIFIER_SCORE = 1638; + + // FIELD: widget type, e.g: notification, textview + // CATEGORY: LANGUAGE_DETECTION, CONVERSATION_ACTIONS + // OS: Q + FIELD_TEXT_CLASSIFIER_WIDGET_TYPE = 1639; + + // FIELD: version of the widget. + // CATEGORY: LANGUAGE_DETECTION, CONVERSATION_ACTIONS + // OS: Q + FIELD_TEXT_CLASSIFIER_WIDGET_VERSION = 1640; + // ---- End Q Constants, all Q constants go above this line ---- // Add new aosp constants above this line. // END OF AOSP CONSTANTS