diff --git a/api/current.txt b/api/current.txt
index 1623bb8..44b11e1 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -53407,7 +53407,7 @@
     method @Nullable public String getCallingPackageName();
     method @NonNull public java.util.List<android.view.textclassifier.ConversationActions.Message> getConversation();
     method @NonNull public android.os.Bundle getExtras();
-    method @Nullable public java.util.List<java.lang.String> getHints();
+    method @NonNull public java.util.List<java.lang.String> getHints();
     method @IntRange(from=0xffffffff) public int getMaxSuggestions();
     method @NonNull public android.view.textclassifier.TextClassifier.EntityConfig getTypeConfig();
     method public void writeToParcel(android.os.Parcel, int);
@@ -53625,6 +53625,7 @@
     method public int getEventIndex();
     method public int getEventType();
     method @NonNull public android.os.Bundle getExtras();
+    method @Nullable public android.icu.util.ULocale getLocale();
     method @Nullable public String getModelName();
     method @Nullable public String getResultId();
     method @NonNull public float[] getScores();
@@ -53662,6 +53663,7 @@
     method @NonNull public T setEventContext(@Nullable android.view.textclassifier.TextClassificationContext);
     method @NonNull public T setEventIndex(int);
     method @NonNull public T setExtras(@NonNull android.os.Bundle);
+    method @NonNull public T setLocale(@Nullable android.icu.util.ULocale);
     method @NonNull public T setModelName(@Nullable String);
     method @NonNull public T setResultId(@Nullable String);
     method @NonNull public T setScores(@NonNull float...);
@@ -53677,14 +53679,12 @@
   }
 
   public static final class TextClassifierEvent.LanguageDetectionEvent extends android.view.textclassifier.TextClassifierEvent implements android.os.Parcelable {
-    method @Nullable public android.icu.util.ULocale getLocale();
     field @NonNull public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassifierEvent.LanguageDetectionEvent> CREATOR;
   }
 
   public static final class TextClassifierEvent.LanguageDetectionEvent.Builder extends android.view.textclassifier.TextClassifierEvent.Builder<android.view.textclassifier.TextClassifierEvent.LanguageDetectionEvent.Builder> {
     ctor public TextClassifierEvent.LanguageDetectionEvent.Builder(int);
     method @NonNull public android.view.textclassifier.TextClassifierEvent.LanguageDetectionEvent build();
-    method @NonNull public android.view.textclassifier.TextClassifierEvent.LanguageDetectionEvent.Builder setLocale(@Nullable android.icu.util.ULocale);
   }
 
   public static final class TextClassifierEvent.TextLinkifyEvent extends android.view.textclassifier.TextClassifierEvent implements android.os.Parcelable {
diff --git a/core/java/android/view/textclassifier/ConversationActions.java b/core/java/android/view/textclassifier/ConversationActions.java
index f2fa67d..aeb99b8 100644
--- a/core/java/android/view/textclassifier/ConversationActions.java
+++ b/core/java/android/view/textclassifier/ConversationActions.java
@@ -401,7 +401,7 @@
         }
 
         /** Returns an immutable list of hints */
-        @Nullable
+        @NonNull
         @Hint
         public List<String> getHints() {
             return mHints;
diff --git a/core/java/android/view/textclassifier/TextClassifierEvent.java b/core/java/android/view/textclassifier/TextClassifierEvent.java
index d3d61a7..7b623e9 100644
--- a/core/java/android/view/textclassifier/TextClassifierEvent.java
+++ b/core/java/android/view/textclassifier/TextClassifierEvent.java
@@ -35,8 +35,8 @@
  * something of note that relates to a feature powered by the TextClassifier. The TextClassifier may
  * log these events or use them to improve future responses to queries.
  * <p>
- * Each categories of the events have their own subclass. Events of each types has an associated
- * set of related properties. You can find the specification of them in the subclasses.
+ * Each category of events has its their own subclass. Events of each type have an associated
+ * set of related properties. You can find their specification in the subclasses.
  */
 public abstract class TextClassifierEvent implements Parcelable {
 
@@ -146,6 +146,8 @@
     @Nullable
     private final String mModelName;
     private final int[] mActionIndices;
+    @Nullable
+    private final ULocale mLocale;
     private final Bundle mExtras;
 
     private TextClassifierEvent(Builder builder) {
@@ -158,6 +160,7 @@
         mScores = builder.mScores;
         mModelName = builder.mModelName;
         mActionIndices = builder.mActionIndices;
+        mLocale = builder.mLocale;
         mExtras = builder.mExtras == null ? Bundle.EMPTY : builder.mExtras;
     }
 
@@ -173,6 +176,8 @@
         in.readFloatArray(mScores);
         mModelName = in.readString();
         mActionIndices = in.createIntArray();
+        final String languageTag = in.readString();
+        mLocale = languageTag == null ? null : ULocale.forLanguageTag(languageTag);
         mExtras = in.readBundle();
     }
 
@@ -220,6 +225,7 @@
         dest.writeFloatArray(mScores);
         dest.writeString(mModelName);
         dest.writeIntArray(mActionIndices);
+        dest.writeString(mLocale == null ? null : mLocale.toLanguageTag());
         dest.writeBundle(mExtras);
     }
 
@@ -318,6 +324,14 @@
     }
 
     /**
+     * Returns the detected locale.
+     */
+    @Nullable
+    public ULocale getLocale() {
+        return mLocale;
+    }
+
+    /**
      * Returns a bundle containing non-structured extra information about this event.
      *
      * <p><b>NOTE: </b>Do not modify this bundle.
@@ -365,6 +379,8 @@
         private String mModelName;
         private int[] mActionIndices = new int[0];
         @Nullable
+        private ULocale mLocale;
+        @Nullable
         private Bundle mExtras;
 
         /**
@@ -473,6 +489,15 @@
         }
 
         /**
+         * Sets the detected locale.
+         */
+        @NonNull
+        public T setLocale(@Nullable ULocale locale) {
+            mLocale = locale;
+            return self();
+        }
+
+        /**
          * Sets a bundle containing non-structured extra information about the event.
          *
          * <p><b>NOTE: </b>Prefer to set only immutable values on the bundle otherwise, avoid
@@ -858,26 +883,12 @@
                     }
                 };
 
-        @Nullable
-        private final ULocale mLocale;
-
         private LanguageDetectionEvent(Parcel in) {
             super(in);
-            final String languageTag = in.readString();
-            mLocale = languageTag == null ? null : ULocale.forLanguageTag(languageTag);
         }
 
         private LanguageDetectionEvent(LanguageDetectionEvent.Builder builder) {
             super(builder);
-            mLocale = builder.mLocale;
-        }
-
-        /**
-         * Returns the detected locale.
-         */
-        @Nullable
-        public ULocale getLocale() {
-            return mLocale;
         }
 
         /**
@@ -885,8 +896,6 @@
          */
         public static final class Builder
                 extends TextClassifierEvent.Builder<LanguageDetectionEvent.Builder> {
-            @Nullable
-            private ULocale mLocale;
 
             /**
              * Creates a builder for building {@link TextSelectionEvent}s.
@@ -897,15 +906,6 @@
                 super(TextClassifierEvent.CATEGORY_LANGUAGE_DETECTION, eventType);
             }
 
-            /**
-             * Sets the detected locale.
-             */
-            @NonNull
-            public Builder setLocale(@Nullable ULocale locale) {
-                mLocale = locale;
-                return this;
-            }
-
             @Override
             Builder self() {
                 return this;
@@ -919,12 +919,6 @@
                 return new LanguageDetectionEvent(this);
             }
         }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            super.writeToParcel(dest, flags);
-            dest.writeString(mLocale == null ? null : mLocale.toLanguageTag());
-        }
     }
 
     /**
