Merge "Fixing fast_scroll_with_fling test to be launched only on devices with rotary" into androidx-main
diff --git a/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/AppSearchImplTest.java b/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/AppSearchImplTest.java
index 3967751..c8ac003 100644
--- a/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/AppSearchImplTest.java
+++ b/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/AppSearchImplTest.java
@@ -53,6 +53,7 @@
 import androidx.appsearch.app.SetSchemaResponse;
 import androidx.appsearch.app.StorageInfo;
 import androidx.appsearch.exceptions.AppSearchException;
+import androidx.appsearch.flags.Flags;
 import androidx.appsearch.localstorage.stats.InitializeStats;
 import androidx.appsearch.localstorage.stats.OptimizeStats;
 import androidx.appsearch.localstorage.util.PrefixUtil;
@@ -64,6 +65,9 @@
 import androidx.appsearch.observer.ObserverSpec;
 import androidx.appsearch.observer.SchemaChangeInfo;
 import androidx.appsearch.testutil.TestObserverCallback;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 import androidx.collection.ArrayMap;
 import androidx.collection.ArraySet;
 import androidx.test.core.app.ApplicationProvider;
@@ -115,6 +119,10 @@
      * Always trigger optimize in this class. OptimizeStrategy will be tested in its own test class.
      */
     private static final OptimizeStrategy ALWAYS_OPTIMIZE = optimizeInfo -> true;
+
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
     @Rule
     public TemporaryFolder mTemporaryFolder = new TemporaryFolder();
     private File mAppSearchDir;
@@ -2253,6 +2261,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
     public void testWriteAndReadBlob() throws Exception {
         mAppSearchImpl = AppSearchImpl.create(
                 mAppSearchDir,
@@ -2284,6 +2293,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
     public void testOpenReadForWrite_notAllowed() throws Exception {
         mAppSearchImpl = AppSearchImpl.create(
                 mAppSearchDir,
@@ -2319,6 +2329,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
     public void testOpenWriteForRead_allowed() throws Exception {
         mAppSearchImpl = AppSearchImpl.create(
                 mAppSearchDir,
@@ -2341,6 +2352,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
     public void testOptimizeBlob() throws Exception {
         // Create a new AppSearchImpl with lower orphan blob time to live.
         mAppSearchImpl.close();
@@ -2384,6 +2396,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
     public void testOptimizeBlobWithDocument() throws Exception {
         // Create a new AppSearchImpl with lower orphan blob time to live.
         mAppSearchImpl.close();
@@ -2463,6 +2476,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
     public void testRevokeFileDescriptor() throws Exception {
         mAppSearchImpl = AppSearchImpl.create(
                 mAppSearchDir,
@@ -2507,6 +2521,8 @@
         }
     }
 
+    // Verify the blob handle won't sent request to Icing. So no need to enable
+    // FLAG_ENABLE_BLOB_STORE.
     @Test
     public void testInvalidBlobHandle() throws Exception {
         mAppSearchImpl = AppSearchImpl.create(
diff --git a/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/converter/SchemaToProtoConverterTest.java b/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/converter/SchemaToProtoConverterTest.java
index 59d50a5..41bd101 100644
--- a/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/converter/SchemaToProtoConverterTest.java
+++ b/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/converter/SchemaToProtoConverterTest.java
@@ -554,6 +554,7 @@
                 .isEqualTo(emailSchema);
     }
 
+    @Test
     public void testGetProto_withScorablePropertyEnabled() {
         AppSearchSchema emailSchema = new AppSearchSchema.Builder("Email")
                 .addProperty(new AppSearchSchema.LongPropertyConfig.Builder("viewTimes")
diff --git a/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/converter/SearchResultToProtoConverterTest.java b/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/converter/SearchResultToProtoConverterTest.java
index 2560643..1576821 100644
--- a/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/converter/SearchResultToProtoConverterTest.java
+++ b/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/converter/SearchResultToProtoConverterTest.java
@@ -120,10 +120,18 @@
         if (Flags.enableSearchResultParentTypes()) {
             assertThat(result.getParentTypeMap()).isEqualTo(
                     ImmutableMap.of(schemaType, ImmutableList.of(parentSchemaType)));
+// @exportToFramework:startStrip()
+            // TODO(b/371610934): Remove this once GenericDocument#getParentTypes is fully
+            //  deprecated.
+            // GenericDocument#getParentTypes is annotated with @hide in platform and will be
+            // removed after deprecation.
             assertThat(result.getGenericDocument().getParentTypes()).isNull();
+// @exportToFramework:endStrip()
         } else {
             assertThat(result.getParentTypeMap()).isEmpty();
+// @exportToFramework:startStrip()
             assertThat(result.getGenericDocument().getParentTypes()).contains(parentSchemaType);
+// @exportToFramework:endStrip()
         }
     }
 
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchConfigImpl.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchConfigImpl.java
index b8f5e22..40447a1 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchConfigImpl.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchConfigImpl.java
@@ -124,11 +124,6 @@
     }
 
     @Override
-    public boolean getEnableBlobStore() {
-        return mIcingOptionsConfig.getEnableBlobStore();
-    }
-
-    @Override
     public int getMaxDocumentSizeBytes() {
         return mLimitConfig.getMaxDocumentSizeBytes();
     }
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchImpl.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchImpl.java
index 66018fc..9c58fac 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchImpl.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchImpl.java
@@ -247,7 +247,7 @@
     private int mOptimizeIntervalCountLocked = 0;
 
     @Nullable
-    private AppSearchRevocableFileDescriptorStore mRevocableFileDescriptorStore;
+    private RevocableFileDescriptorStore mRevocableFileDescriptorStore;
 
     /** Whether this instance has been closed, and therefore unusable. */
     @GuardedBy("mReadWriteLock")
@@ -275,7 +275,7 @@
             @NonNull AppSearchConfig config,
             @Nullable InitializeStats.Builder initStatsBuilder,
             @Nullable VisibilityChecker visibilityChecker,
-            @Nullable AppSearchRevocableFileDescriptorStore revocableFileDescriptorStore,
+            @Nullable RevocableFileDescriptorStore revocableFileDescriptorStore,
             @NonNull OptimizeStrategy optimizeStrategy)
             throws AppSearchException {
         return new AppSearchImpl(icingDir, config, initStatsBuilder, visibilityChecker,
@@ -290,7 +290,7 @@
             @NonNull AppSearchConfig config,
             @Nullable InitializeStats.Builder initStatsBuilder,
             @Nullable VisibilityChecker visibilityChecker,
-            @Nullable AppSearchRevocableFileDescriptorStore revocableFileDescriptorStore,
+            @Nullable RevocableFileDescriptorStore revocableFileDescriptorStore,
             @NonNull OptimizeStrategy optimizeStrategy)
             throws AppSearchException {
         Preconditions.checkNotNull(icingDir);
@@ -323,7 +323,7 @@
                     .setUseNewQualifiedIdJoinIndex(mConfig.getUseNewQualifiedIdJoinIndex())
                     .setBuildPropertyExistenceMetadataHits(
                             mConfig.getBuildPropertyExistenceMetadataHits())
-                    .setEnableBlobStore(mConfig.getEnableBlobStore())
+                    .setEnableBlobStore(Flags.enableBlobStore())
                     .setOrphanBlobTimeToLiveMs(mConfig.getOrphanBlobTimeToLiveMs())
                     .setEnableEmbeddingIndex(Flags.enableSchemaEmbeddingPropertyConfig())
                     .setEnableEmbeddingQuantization(Flags.enableSchemaEmbeddingQuantization())
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/IcingOptionsConfig.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/IcingOptionsConfig.java
index bdc2da2..2f1c5711 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/IcingOptionsConfig.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/IcingOptionsConfig.java
@@ -229,14 +229,6 @@
     boolean getBuildPropertyExistenceMetadataHits();
 
     /**
-     * Flag for {@link com.google.android.icing.proto.IcingSearchEngineOptions}.
-     *
-     * <p>Whether to enable the blob store. If set to true, the BlobStore will be created to store
-     * and retrieve blobs.
-     */
-    boolean getEnableBlobStore();
-
-    /**
      * Config for {@link com.google.android.icing.proto.IcingSearchEngineOptions}.
      *
      * <p>The maximum time in millisecond for a orphan blob to get recycled and deleted if there is
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/JetpackRevocableFileDescriptorStore.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/JetpackRevocableFileDescriptorStore.java
index 7fccab8..0edee8b 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/JetpackRevocableFileDescriptorStore.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/JetpackRevocableFileDescriptorStore.java
@@ -33,7 +33,7 @@
 import java.util.Map;
 
 /**
- * The local storage implementation of {@link AppSearchRevocableFileDescriptorStore}.
+ * The local storage implementation of {@link RevocableFileDescriptorStore}.
  *
  * <p> The {@link ParcelFileDescriptor} sent to the client side from the local storage won't cross
  * the binder, we could revoke the {@link ParcelFileDescriptor} in the client side by directly close
@@ -46,7 +46,7 @@
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public class JetpackRevocableFileDescriptorStore implements
-        AppSearchRevocableFileDescriptorStore {
+        RevocableFileDescriptorStore {
 
     private final Object mLock  = new Object();
     private final AppSearchConfig mConfig;
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorage.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorage.java
index 4263ec1..b5fe923 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorage.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorage.java
@@ -360,7 +360,7 @@
                 /* storeParentInfoAsSyntheticProperty= */ false,
                 /* shouldRetrieveParentInfo= */ true
         );
-        AppSearchRevocableFileDescriptorStore revocableFileDescriptorStore = null;
+        RevocableFileDescriptorStore revocableFileDescriptorStore = null;
         if (Flags.enableBlobStore()) {
             revocableFileDescriptorStore = new JetpackRevocableFileDescriptorStore(config);
         }
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorageIcingOptionsConfig.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorageIcingOptionsConfig.java
index 51e1125..d0837fd 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorageIcingOptionsConfig.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorageIcingOptionsConfig.java
@@ -100,11 +100,6 @@
     }
 
     @Override
-    public boolean getEnableBlobStore() {
-        return true;
-    }
-
-    @Override
     public long getOrphanBlobTimeToLiveMs() {
         return DEFAULT_ORPHAN_BLOB_TIME_TO_LIVE_MS;
     }
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchRevocableFileDescriptorStore.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/RevocableFileDescriptorStore.java
similarity index 98%
rename from appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchRevocableFileDescriptorStore.java
rename to appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/RevocableFileDescriptorStore.java
index 86bcc64..fa8cfc1 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchRevocableFileDescriptorStore.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/RevocableFileDescriptorStore.java
@@ -38,7 +38,7 @@
  * @exportToFramework:hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public interface AppSearchRevocableFileDescriptorStore {
+public interface RevocableFileDescriptorStore {
 
     /**
      * Wraps the provided ParcelFileDescriptor into a revocable file descriptor.
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/SearchSpecToProtoConverter.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/SearchSpecToProtoConverter.java
index 4f80e5a..2c81868 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/SearchSpecToProtoConverter.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/SearchSpecToProtoConverter.java
@@ -541,6 +541,8 @@
         protoBuilder.addAllAdditionalAdvancedScoringExpressions(
                 mSearchSpec.getInformationalRankingExpressions());
 
+        // TODO(b/380924970): create extractEnabledScoringFeatures() for populating scorable
+        // features
         if (mSearchSpec.isScorablePropertyRankingEnabled()) {
             protoBuilder.addScoringFeatureTypesEnabled(
                     ScoringFeatureType.SCORABLE_PROPERTY_RANKING);
@@ -1110,8 +1112,17 @@
 
     List<String> extractEnabledSearchFeatures(List<String> allEnabledFeatures) {
         List<String> searchFeatures = new ArrayList<>();
-        for (String feature : allEnabledFeatures) {
+        for (int i = 0; i < allEnabledFeatures.size(); ++i) {
+            String feature = allEnabledFeatures.get(i);
             if (FeatureConstants.SCORABLE_FEATURE_SET.contains(feature)) {
+                // The `allEnabledFeatures` set contains both scorable features and search features.
+                // Here, we extract the search related features and populate them to
+                // `SearchSpecProto`. The scoring related features are later populated to the
+                // `ScoringSpecProto` individually in `toScoringSpecProto()`.
+                // - This is because in Icing, the search expression and scoring expression are
+                //   parsed separately, and the enforcement of these enabled features are separate.
+                //   Icing needs the two different proto messages to distinguish between
+                //   features in the search expression and features in the scoring expression.
                 continue;
             }
             searchFeatures.add(feature);
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/stats/CallStats.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/stats/CallStats.java
index 5f28ea0..e8c3199 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/stats/CallStats.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/stats/CallStats.java
@@ -78,7 +78,10 @@
             CALL_TYPE_REGISTER_OBSERVER_CALLBACK,
             CALL_TYPE_UNREGISTER_OBSERVER_CALLBACK,
             CALL_TYPE_GLOBAL_GET_NEXT_PAGE,
-            CALL_TYPE_EXECUTE_APP_FUNCTION
+            CALL_TYPE_EXECUTE_APP_FUNCTION,
+            CALL_TYPE_OPEN_WRITE_BLOB,
+            CALL_TYPE_COMMIT_BLOB,
+            CALL_TYPE_OPEN_READ_BLOB
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface CallType {
@@ -116,6 +119,9 @@
     public static final int CALL_TYPE_UNREGISTER_OBSERVER_CALLBACK = 29;
     public static final int CALL_TYPE_GLOBAL_GET_NEXT_PAGE = 30;
     public static final int CALL_TYPE_EXECUTE_APP_FUNCTION = 31;
+    public static final int CALL_TYPE_OPEN_WRITE_BLOB = 32;
+    public static final int CALL_TYPE_COMMIT_BLOB = 33;
+    public static final int CALL_TYPE_OPEN_READ_BLOB = 34;
 
     // These strings are for the subset of call types that correspond to an AppSearchManager API
     private static final String CALL_TYPE_STRING_INITIALIZE = "initialize";
@@ -148,6 +154,9 @@
             "globalUnregisterObserverCallback";
     private static final String CALL_TYPE_STRING_GLOBAL_GET_NEXT_PAGE = "globalGetNextPage";
     private static final String CALL_TYPE_STRING_EXECUTE_APP_FUNCTION = "executeAppFunction";
+    private static final String CALL_TYPE_STRING_OPEN_WRITE_BLOB = "openWriteBlob";
+    private static final String CALL_TYPE_STRING_COMMIT_BLOB = "commitBlob";
+    private static final String CALL_TYPE_STRING_OPEN_READ_BLOB = "openReadBlob";
 
     @Nullable
     private final String mPackageName;
@@ -416,6 +425,12 @@
                 return CALL_TYPE_GLOBAL_GET_NEXT_PAGE;
             case CALL_TYPE_STRING_EXECUTE_APP_FUNCTION:
                 return CALL_TYPE_EXECUTE_APP_FUNCTION;
+            case CALL_TYPE_STRING_OPEN_WRITE_BLOB:
+                return CALL_TYPE_OPEN_WRITE_BLOB;
+            case CALL_TYPE_STRING_COMMIT_BLOB:
+                return CALL_TYPE_COMMIT_BLOB;
+            case CALL_TYPE_STRING_OPEN_READ_BLOB:
+                return CALL_TYPE_OPEN_READ_BLOB;
             default:
                 return CALL_TYPE_UNKNOWN;
         }
@@ -452,6 +467,9 @@
                 CALL_TYPE_REGISTER_OBSERVER_CALLBACK,
                 CALL_TYPE_UNREGISTER_OBSERVER_CALLBACK,
                 CALL_TYPE_GLOBAL_GET_NEXT_PAGE,
-                CALL_TYPE_EXECUTE_APP_FUNCTION));
+                CALL_TYPE_EXECUTE_APP_FUNCTION,
+                CALL_TYPE_OPEN_WRITE_BLOB,
+                CALL_TYPE_COMMIT_BLOB,
+                CALL_TYPE_OPEN_READ_BLOB));
     }
 }
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/CheckFlagsRule.java b/appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/CheckFlagsRule.java
similarity index 81%
rename from appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/CheckFlagsRule.java
rename to appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/CheckFlagsRule.java
index 3ec5386..fd57f25 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/CheckFlagsRule.java
+++ b/appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/CheckFlagsRule.java
@@ -14,7 +14,10 @@
  * limitations under the License.
  */
 // @exportToFramework:skipFile()
-package androidx.appsearch.flags;
+package androidx.appsearch.testutil.flags;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import org.junit.rules.TestRule;
 import org.junit.runner.Description;
@@ -27,7 +30,8 @@
  */
 public final class CheckFlagsRule implements TestRule {
     @Override
-    public Statement apply(Statement base, Description description) {
+    @NonNull
+    public Statement apply(@NonNull Statement base, @Nullable Description description) {
         return base;
     }
 }
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/DeviceFlagsValueProvider.java b/appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/DeviceFlagsValueProvider.java
similarity index 91%
rename from appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/DeviceFlagsValueProvider.java
rename to appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/DeviceFlagsValueProvider.java
index 1a2858a..0b3dc81 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/DeviceFlagsValueProvider.java
+++ b/appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/DeviceFlagsValueProvider.java
@@ -14,7 +14,9 @@
  * limitations under the License.
  */
 // @exportToFramework:skipFile()
-package androidx.appsearch.flags;
+package androidx.appsearch.testutil.flags;
+
+import androidx.annotation.NonNull;
 
 /**
  * Shim for real DeviceFlagsValueProvider defined in Framework.
@@ -25,6 +27,7 @@
     private DeviceFlagsValueProvider() {}
 
     /** Provides a shim rule that can be used to check the status of flags on device */
+    @NonNull
     public static CheckFlagsRule createCheckFlagsRule() {
         return new CheckFlagsRule();
     }
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/RequiresFlagsEnabled.java b/appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/RequiresFlagsEnabled.java
similarity index 97%
rename from appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/RequiresFlagsEnabled.java
rename to appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/RequiresFlagsEnabled.java
index d4f3bf0..47b3ae1 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/RequiresFlagsEnabled.java
+++ b/appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/RequiresFlagsEnabled.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 // @exportToFramework:skipFile()
-package androidx.appsearch.flags;
+package androidx.appsearch.testutil.flags;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
diff --git a/appsearch/appsearch/api/current.txt b/appsearch/appsearch/api/current.txt
index 918091b8..bc6ded2 100644
--- a/appsearch/appsearch/api/current.txt
+++ b/appsearch/appsearch/api/current.txt
@@ -357,7 +357,7 @@
     field public static final String GLOBAL_SEARCH_SESSION_REGISTER_OBSERVER_CALLBACK = "GLOBAL_SEARCH_SESSION_REGISTER_OBSERVER_CALLBACK";
     field public static final String JOIN_SPEC_AND_QUALIFIED_ID = "JOIN_SPEC_AND_QUALIFIED_ID";
     field public static final String LIST_FILTER_HAS_PROPERTY_FUNCTION = "LIST_FILTER_HAS_PROPERTY_FUNCTION";
-    field public static final String LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION = "LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION";
+    field @SuppressCompatibility @androidx.appsearch.app.ExperimentalAppSearchApi public static final String LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION = "LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION";
     field public static final String LIST_FILTER_QUERY_LANGUAGE = "LIST_FILTER_QUERY_LANGUAGE";
     field public static final String NUMERIC_SEARCH = "NUMERIC_SEARCH";
     field public static final String SCHEMA_ADD_INDEXABLE_NESTED_PROPERTIES = "SCHEMA_ADD_INDEXABLE_NESTED_PROPERTIES";
diff --git a/appsearch/appsearch/api/restricted_current.txt b/appsearch/appsearch/api/restricted_current.txt
index 918091b8..bc6ded2 100644
--- a/appsearch/appsearch/api/restricted_current.txt
+++ b/appsearch/appsearch/api/restricted_current.txt
@@ -357,7 +357,7 @@
     field public static final String GLOBAL_SEARCH_SESSION_REGISTER_OBSERVER_CALLBACK = "GLOBAL_SEARCH_SESSION_REGISTER_OBSERVER_CALLBACK";
     field public static final String JOIN_SPEC_AND_QUALIFIED_ID = "JOIN_SPEC_AND_QUALIFIED_ID";
     field public static final String LIST_FILTER_HAS_PROPERTY_FUNCTION = "LIST_FILTER_HAS_PROPERTY_FUNCTION";
-    field public static final String LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION = "LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION";
+    field @SuppressCompatibility @androidx.appsearch.app.ExperimentalAppSearchApi public static final String LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION = "LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION";
     field public static final String LIST_FILTER_QUERY_LANGUAGE = "LIST_FILTER_QUERY_LANGUAGE";
     field public static final String NUMERIC_SEARCH = "NUMERIC_SEARCH";
     field public static final String SCHEMA_ADD_INDEXABLE_NESTED_PROPERTIES = "SCHEMA_ADD_INDEXABLE_NESTED_PROPERTIES";
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/SearchSpecInternalTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/SearchSpecInternalTest.java
index 0fce1ed..e983429 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/SearchSpecInternalTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/SearchSpecInternalTest.java
@@ -19,7 +19,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import com.google.common.collect.ImmutableMap;
 
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/aidl/AppSearchBatchResultGeneralKeyParcelTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/aidl/AppSearchBatchResultParcelV2Test.java
similarity index 90%
rename from appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/aidl/AppSearchBatchResultGeneralKeyParcelTest.java
rename to appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/aidl/AppSearchBatchResultParcelV2Test.java
index d2dd377..1d10dc8 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/aidl/AppSearchBatchResultGeneralKeyParcelTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/aidl/AppSearchBatchResultParcelV2Test.java
@@ -33,7 +33,7 @@
 
 import java.io.File;
 
-public class AppSearchBatchResultGeneralKeyParcelTest {
+public class AppSearchBatchResultParcelV2Test {
 
     @Test
     public void testFromBlobHandleToPfd() throws Exception {
@@ -56,8 +56,8 @@
                         .setResult(blobHandle1, successResult)
                         .setResult(blobHandle2, failureResult)
                         .build();
-        AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, ParcelFileDescriptor>
-                resultParcel = AppSearchBatchResultGeneralKeyParcel.fromBlobHandleToPfd(result);
+        AppSearchBatchResultParcelV2<AppSearchBlobHandle, ParcelFileDescriptor>
+                resultParcel = AppSearchBatchResultParcelV2.fromBlobHandleToPfd(result);
 
         AppSearchBatchResult<AppSearchBlobHandle, ParcelFileDescriptor> outResult =
                 resultParcel.getResult();
@@ -84,8 +84,8 @@
                         .setResult(blobHandle1, successResult)
                         .setResult(blobHandle2, failureResult)
                         .build();
-        AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, Void>
-                resultParcel = AppSearchBatchResultGeneralKeyParcel.fromBlobHandleToVoid(result);
+        AppSearchBatchResultParcelV2<AppSearchBlobHandle, Void> resultParcel =
+                AppSearchBatchResultParcelV2.fromBlobHandleToVoid(result);
 
         AppSearchBatchResult<AppSearchBlobHandle, Void> outResult = resultParcel.getResult();
 
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchBatchResultCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchBatchResultCtsTest.java
index 0852d6f..83b04c8 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchBatchResultCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchBatchResultCtsTest.java
@@ -20,10 +20,10 @@
 
 import androidx.appsearch.app.AppSearchBatchResult;
 import androidx.appsearch.app.AppSearchResult;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchBlobHandleCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchBlobHandleCtsTest.java
index b294eac..9e14154 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchBlobHandleCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchBlobHandleCtsTest.java
@@ -24,10 +24,10 @@
 import static org.junit.Assert.assertThrows;
 
 import androidx.appsearch.app.AppSearchBlobHandle;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSchemaCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSchemaCtsTest.java
index e728048..8401565 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSchemaCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSchemaCtsTest.java
@@ -28,11 +28,11 @@
 import androidx.appsearch.app.AppSearchSchema.PropertyConfig;
 import androidx.appsearch.app.AppSearchSchema.StringPropertyConfig;
 import androidx.appsearch.app.PropertyPath;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
 import androidx.appsearch.testutil.AppSearchEmail;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
@@ -78,6 +78,14 @@
         LongPropertyConfig builder = new LongPropertyConfig.Builder("test").build();
         assertThat(builder.getIndexingType()).isEqualTo(LongPropertyConfig.INDEXING_TYPE_NONE);
         assertThat(builder.getCardinality()).isEqualTo(PropertyConfig.CARDINALITY_OPTIONAL);
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_SCORABLE_PROPERTY)
+    public void testLongPropertyConfigDefaultValuesWithScorableConfig() {
+        LongPropertyConfig builder = new LongPropertyConfig.Builder("test").build();
+        assertThat(builder.getIndexingType()).isEqualTo(LongPropertyConfig.INDEXING_TYPE_NONE);
+        assertThat(builder.getCardinality()).isEqualTo(PropertyConfig.CARDINALITY_OPTIONAL);
         assertThat(builder.isScoringEnabled()).isEqualTo(false);
     }
 
@@ -206,6 +214,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_SCORABLE_PROPERTY)
     public void testEquals_failWithDifferentScorableTypes() {
         AppSearchSchema schema1 = new AppSearchSchema.Builder("Email")
                 .addProperty(new LongPropertyConfig.Builder("id")
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobCtsTestBase.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobCtsTestBase.java
index f271597..91ab2d4 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobCtsTestBase.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobCtsTestBase.java
@@ -45,10 +45,10 @@
 import androidx.appsearch.app.OpenBlobForWriteResponse;
 import androidx.appsearch.app.PutDocumentsRequest;
 import androidx.appsearch.app.SetSchemaRequest;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 import androidx.test.core.app.ApplicationProvider;
 
 import com.google.common.collect.ImmutableSet;
@@ -63,7 +63,6 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 
-@RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
 public abstract class AppSearchSessionBlobCtsTestBase {
     static final String DB_NAME_1 = "";
 
@@ -97,6 +96,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
     public void testWriteAndReadBlob() throws Exception {
         assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
         mDb1.setSchemaAsync(new SetSchemaRequest.Builder().setForceOverride(true).build()).get();
@@ -159,6 +159,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
     public void testWriteAndReadBlob_withoutCommit() throws Exception {
         assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
         mDb1.setSchemaAsync(new SetSchemaRequest.Builder().setForceOverride(true).build()).get();
@@ -197,6 +198,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
     public void testRewrite_notAllowed() throws Exception {
         assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
         mDb1.setSchemaAsync(new SetSchemaRequest.Builder().setForceOverride(true).build()).get();
@@ -249,6 +251,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
     public void testOpenWriteForRead_allowed() throws Exception {
         assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
         mDb1.setSchemaAsync(new SetSchemaRequest.Builder().setForceOverride(true).build()).get();
@@ -274,6 +277,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
     public void testOpenReadForWrite_notAllowed() throws Exception {
         assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
         mDb1.setSchemaAsync(new SetSchemaRequest.Builder().setForceOverride(true).build()).get();
@@ -316,6 +320,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
     public void testCommitBlobWithWrongDigest() throws Exception {
         assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
         mDb1.setSchemaAsync(new SetSchemaRequest.Builder().setForceOverride(true).build()).get();
@@ -353,6 +358,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
     public void testCloseWriteResponse() throws Exception {
         assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
         mDb1.setSchemaAsync(new SetSchemaRequest.Builder().setForceOverride(true).build()).get();
@@ -389,6 +395,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
     public void testCloseReadResponse() throws Exception {
         assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
         mDb1.setSchemaAsync(new SetSchemaRequest.Builder().setForceOverride(true).build()).get();
@@ -452,6 +459,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
     public void testSetBlobSchema() throws Exception {
         assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
         AppSearchSchema schema = new AppSearchSchema.Builder("Type")
@@ -467,6 +475,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
     public void testPutDocumentWithBlobProperty() throws Exception {
         assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
         AppSearchSchema schema = new AppSearchSchema.Builder("Type")
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobGmsCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobGmsCtsTest.java
index 05428ce..672137a 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobGmsCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobGmsCtsTest.java
@@ -13,6 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+// @exportToFramework:skipFile()
 
 package androidx.appsearch.cts.app;
 
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobPlatformCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobPlatformCtsTest.java
index d8a8f0c..4e0a746 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobPlatformCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobPlatformCtsTest.java
@@ -13,6 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+// @exportToFramework:skipFile()
 
 package androidx.appsearch.cts.app;
 
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
index 627af56..edea125 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
@@ -64,11 +64,11 @@
 import androidx.appsearch.app.StorageInfo;
 import androidx.appsearch.cts.app.customer.EmailDocument;
 import androidx.appsearch.exceptions.AppSearchException;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
 import androidx.appsearch.testutil.AppSearchEmail;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 import androidx.appsearch.usagereporting.ClickAction;
 import androidx.appsearch.usagereporting.DismissAction;
 import androidx.appsearch.usagereporting.ImpressionAction;
@@ -11544,22 +11544,6 @@
         mDb1.setSchemaAsync(new SetSchemaRequest.Builder()
                 .addSchemas(schemaWithPropertyNotScorable).build()).get();
 
-        // Ranking with the property will return an error, and the scorable cache will also be
-        // erased.
-        ExecutionException exception = assertThrows(ExecutionException.class,
-                () -> {
-                    SearchSpec invalidSearchSpec = new SearchSpec.Builder()
-                            .setScorablePropertyRankingEnabled(true)
-                            .setRankingStrategy(
-                                    "sum(getScorableProperty(\"Gmail\", \"important\"))")
-                            .build();
-                    SearchResults invalidSearchResults =
-                            mDb1.search("", invalidSearchSpec);
-                    retrieveAllSearchResults(invalidSearchResults);
-                });
-        assertThat(exception.getMessage()).matches(
-                ".*\'important\' is not defined as a scorable property under schema type.*");
-
         // Update the schema by updating the property to scorable again.
         mDb1.setSchemaAsync(new SetSchemaRequest.Builder()
                 .addSchemas(schemaWithPropertyScorable).build()).get();
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/CommitBlobResponseTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/CommitBlobResponseTest.java
index fe851aaf..366f189 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/CommitBlobResponseTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/CommitBlobResponseTest.java
@@ -25,10 +25,10 @@
 import androidx.appsearch.app.AppSearchBlobHandle;
 import androidx.appsearch.app.AppSearchResult;
 import androidx.appsearch.app.CommitBlobResponse;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/EnterpriseGlobalSearchSessionCtsTestBase.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/EnterpriseGlobalSearchSessionCtsTestBase.java
index 2c9bf17..1b2c9be 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/EnterpriseGlobalSearchSessionCtsTestBase.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/EnterpriseGlobalSearchSessionCtsTestBase.java
@@ -25,10 +25,10 @@
 import androidx.appsearch.app.EnterpriseGlobalSearchSession;
 import androidx.appsearch.app.GenericDocument;
 import androidx.appsearch.app.GetByDocumentIdRequest;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GenericDocumentCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GenericDocumentCtsTest.java
index 475d33d..6bfea59 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GenericDocumentCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GenericDocumentCtsTest.java
@@ -28,10 +28,10 @@
 import androidx.appsearch.app.AppSearchBlobHandle;
 import androidx.appsearch.app.EmbeddingVector;
 import androidx.appsearch.app.GenericDocument;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GetSchemaResponseCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GetSchemaResponseCtsTest.java
index c4a7722..98573bb 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GetSchemaResponseCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GetSchemaResponseCtsTest.java
@@ -25,10 +25,10 @@
 import androidx.appsearch.app.PackageIdentifier;
 import androidx.appsearch.app.SchemaVisibilityConfig;
 import androidx.appsearch.app.SetSchemaRequest;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import com.google.common.collect.ImmutableSet;
 
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GlobalSearchSessionCtsTestBase.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GlobalSearchSessionCtsTestBase.java
index 3a35de1..9d5fe3d 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GlobalSearchSessionCtsTestBase.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GlobalSearchSessionCtsTestBase.java
@@ -49,12 +49,14 @@
 import androidx.appsearch.app.SetSchemaRequest;
 import androidx.appsearch.exceptions.AppSearchException;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
 import androidx.appsearch.observer.DocumentChangeInfo;
 import androidx.appsearch.observer.ObserverSpec;
 import androidx.appsearch.observer.SchemaChangeInfo;
 import androidx.appsearch.testutil.AppSearchEmail;
 import androidx.appsearch.testutil.TestObserverCallback;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 import androidx.test.core.app.ApplicationProvider;
 
 import com.google.common.collect.ImmutableList;
@@ -64,6 +66,7 @@
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 
 import java.util.ArrayList;
@@ -85,6 +88,9 @@
 
     protected GlobalSearchSession mGlobalSearchSession;
 
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
     protected abstract ListenableFuture<AppSearchSession> createSearchSessionAsync(
             @NonNull String dbName) throws Exception;
 
@@ -2028,6 +2034,7 @@
     }
 
     @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_SCORABLE_PROPERTY)
     public void testRankWithScorableProperty_searchFromMultipleDbs() throws Exception {
         assumeTrue(mGlobalSearchSession.getFeatures()
                 .isFeatureSupported(Features.SCHEMA_SCORABLE_PROPERTY_CONFIG));
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/JoinSpecCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/JoinSpecCtsTest.java
index a307a22..8bb5e1b 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/JoinSpecCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/JoinSpecCtsTest.java
@@ -20,10 +20,10 @@
 
 import androidx.appsearch.app.JoinSpec;
 import androidx.appsearch.app.SearchSpec;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/OpenBlobForReadResponseTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/OpenBlobForReadResponseTest.java
index 1378e7c..24d85cb 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/OpenBlobForReadResponseTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/OpenBlobForReadResponseTest.java
@@ -31,10 +31,10 @@
 import androidx.appsearch.app.AppSearchBlobHandle;
 import androidx.appsearch.app.AppSearchResult;
 import androidx.appsearch.app.OpenBlobForReadResponse;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.After;
 import org.junit.Before;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/OpenBlobForWriteResponseTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/OpenBlobForWriteResponseTest.java
index a9f4bfc..8481aab 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/OpenBlobForWriteResponseTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/OpenBlobForWriteResponseTest.java
@@ -31,10 +31,10 @@
 import androidx.appsearch.app.AppSearchBlobHandle;
 import androidx.appsearch.app.AppSearchResult;
 import androidx.appsearch.app.OpenBlobForWriteResponse;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.After;
 import org.junit.Before;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchResultCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchResultCtsTest.java
index 3761d6f..322b898 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchResultCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchResultCtsTest.java
@@ -22,11 +22,11 @@
 
 import androidx.appsearch.app.PropertyPath;
 import androidx.appsearch.app.SearchResult;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
 import androidx.appsearch.testutil.AppSearchEmail;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchSpecCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchSpecCtsTest.java
index 9b13d2c..444d67a 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchSpecCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchSpecCtsTest.java
@@ -28,10 +28,10 @@
 import androidx.appsearch.app.JoinSpec;
 import androidx.appsearch.app.PropertyPath;
 import androidx.appsearch.app.SearchSpec;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -88,6 +88,78 @@
                 .setNumericSearchEnabled(true)
                 .setVerbatimSearchEnabled(true)
                 .setListFilterQueryLanguageEnabled(true)
+                .build();
+
+        assertThat(searchSpec.getTermMatch()).isEqualTo(SearchSpec.TERM_MATCH_PREFIX);
+        assertThat(searchSpec.getFilterNamespaces())
+                .containsExactly("namespace1", "namespace2", "namespace3").inOrder();
+        assertThat(searchSpec.getFilterSchemas())
+                .containsExactly("schemaTypes1", "schemaTypes2", "schemaTypes3").inOrder();
+        assertThat(searchSpec.getFilterPackageNames())
+                .containsExactly("package1", "package2", "package3").inOrder();
+        assertThat(searchSpec.getSnippetCount()).isEqualTo(5);
+        assertThat(searchSpec.getSnippetCountPerProperty()).isEqualTo(10);
+        assertThat(searchSpec.getMaxSnippetSize()).isEqualTo(15);
+        assertThat(searchSpec.getResultCountPerPage()).isEqualTo(42);
+        assertThat(searchSpec.getOrder()).isEqualTo(SearchSpec.ORDER_ASCENDING);
+        assertThat(searchSpec.getRankingStrategy())
+                .isEqualTo(SearchSpec.RANKING_STRATEGY_RELEVANCE_SCORE);
+        assertThat(searchSpec.getResultGroupingTypeFlags())
+                .isEqualTo(SearchSpec.GROUPING_TYPE_PER_NAMESPACE
+                        | SearchSpec.GROUPING_TYPE_PER_PACKAGE);
+        assertThat(searchSpec.getProjections())
+                .containsExactly("schemaTypes1", expectedPropertyPaths1, "schemaTypes2",
+                        expectedPropertyPaths2);
+        assertThat(searchSpec.getResultGroupingLimit()).isEqualTo(37);
+        assertThat(searchSpec.getPropertyWeights().keySet()).containsExactly("schemaTypes1",
+                "schemaTypes2");
+        assertThat(searchSpec.getPropertyWeights().get("schemaTypes1"))
+                .containsExactly("property1", 1.0, "property2", 2.0);
+        assertThat(searchSpec.getPropertyWeights().get("schemaTypes2"))
+                .containsExactly("property1.nested", 1.0);
+        assertThat(searchSpec.getPropertyWeightPaths().get("schemaTypes1"))
+                .containsExactly(new PropertyPath("property1"), 1.0,
+                        new PropertyPath("property2"), 2.0);
+        assertThat(searchSpec.getPropertyWeightPaths().get("schemaTypes2"))
+                .containsExactly(new PropertyPath("property1.nested"), 1.0);
+        assertThat(searchSpec.isNumericSearchEnabled()).isTrue();
+        assertThat(searchSpec.isVerbatimSearchEnabled()).isTrue();
+        assertThat(searchSpec.isListFilterQueryLanguageEnabled()).isTrue();
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_ENABLE_SCORABLE_PROPERTY)
+    public void testBuildSearchSpec_scorablePropertyRanking() {
+        List<String> expectedPropertyPaths1 = ImmutableList.of("path1", "path2");
+        List<String> expectedPropertyPaths2 = ImmutableList.of("path3", "path4");
+        Map<String, Double> expectedPropertyWeights = ImmutableMap.of("property1", 1.0,
+                "property2", 2.0);
+        Map<PropertyPath, Double> expectedPropertyWeightPaths =
+                ImmutableMap.of(new PropertyPath("property1.nested"), 1.0);
+
+        SearchSpec searchSpec = new SearchSpec.Builder()
+                .setTermMatch(SearchSpec.TERM_MATCH_PREFIX)
+                .addFilterNamespaces("namespace1", "namespace2")
+                .addFilterNamespaces(ImmutableList.of("namespace3"))
+                .addFilterSchemas("schemaTypes1", "schemaTypes2")
+                .addFilterSchemas(ImmutableList.of("schemaTypes3"))
+                .addFilterPackageNames("package1", "package2")
+                .addFilterPackageNames(ImmutableList.of("package3"))
+                .setSnippetCount(5)
+                .setSnippetCountPerProperty(10)
+                .setMaxSnippetSize(15)
+                .setResultCountPerPage(42)
+                .setOrder(SearchSpec.ORDER_ASCENDING)
+                .setRankingStrategy(SearchSpec.RANKING_STRATEGY_RELEVANCE_SCORE)
+                .setResultGrouping(SearchSpec.GROUPING_TYPE_PER_NAMESPACE
+                        | SearchSpec.GROUPING_TYPE_PER_PACKAGE, /*limit=*/ 37)
+                .addProjection("schemaTypes1", expectedPropertyPaths1)
+                .addProjection("schemaTypes2", expectedPropertyPaths2)
+                .setPropertyWeights("schemaTypes1", expectedPropertyWeights)
+                .setPropertyWeightPaths("schemaTypes2", expectedPropertyWeightPaths)
+                .setNumericSearchEnabled(true)
+                .setVerbatimSearchEnabled(true)
+                .setListFilterQueryLanguageEnabled(true)
                 .setScorablePropertyRankingEnabled(true)
                 .build();
 
@@ -940,6 +1012,74 @@
                 .setNumericSearchEnabled(true)
                 .setVerbatimSearchEnabled(true)
                 .setListFilterQueryLanguageEnabled(true)
+                .build();
+        SearchSpec searchSpecCopy = new SearchSpec.Builder(searchSpec).build();
+        assertThat(searchSpecCopy.getTermMatch()).isEqualTo(searchSpec.getTermMatch());
+        assertThat(searchSpecCopy.getFilterNamespaces()).isEqualTo(
+                searchSpec.getFilterNamespaces());
+        assertThat(searchSpecCopy.getFilterSchemas()).isEqualTo(searchSpec.getFilterSchemas());
+        assertThat(searchSpecCopy.getFilterPackageNames()).isEqualTo(
+                searchSpec.getFilterPackageNames());
+        assertThat(searchSpecCopy.getSnippetCount()).isEqualTo(searchSpec.getSnippetCount());
+        assertThat(searchSpecCopy.getSnippetCountPerProperty()).isEqualTo(
+                searchSpec.getSnippetCountPerProperty());
+        assertThat(searchSpecCopy.getMaxSnippetSize()).isEqualTo(searchSpec.getMaxSnippetSize());
+        assertThat(searchSpecCopy.getResultCountPerPage()).isEqualTo(
+                searchSpec.getResultCountPerPage());
+        assertThat(searchSpecCopy.getOrder()).isEqualTo(searchSpec.getOrder());
+        assertThat(searchSpecCopy.getRankingStrategy()).isEqualTo(searchSpec.getRankingStrategy());
+        assertThat(searchSpecCopy.getResultGroupingTypeFlags()).isEqualTo(
+                searchSpec.getResultGroupingTypeFlags());
+        assertThat(searchSpecCopy.getProjections()).isEqualTo(searchSpec.getProjections());
+        assertThat(searchSpecCopy.getResultGroupingLimit()).isEqualTo(
+                searchSpec.getResultGroupingLimit());
+        assertThat(searchSpecCopy.getPropertyWeights()).isEqualTo(searchSpec.getPropertyWeights());
+        assertThat(searchSpecCopy.getPropertyWeightPaths()).isEqualTo(
+                searchSpec.getPropertyWeightPaths());
+        assertThat(searchSpecCopy.isNumericSearchEnabled()).isEqualTo(
+                searchSpec.isNumericSearchEnabled());
+        assertThat(searchSpecCopy.isVerbatimSearchEnabled()).isEqualTo(
+                searchSpec.isVerbatimSearchEnabled());
+        assertThat(searchSpecCopy.isListFilterQueryLanguageEnabled()).isEqualTo(
+                searchSpec.isListFilterQueryLanguageEnabled());
+    }
+
+    @Test
+    @RequiresFlagsEnabled({
+            Flags.FLAG_ENABLE_ADDITIONAL_BUILDER_COPY_CONSTRUCTORS,
+            Flags.FLAG_ENABLE_SCORABLE_PROPERTY
+    })
+    public void testSearchSpecBuilder_copyConstructorWithScorableProperty() {
+        List<String> expectedPropertyPaths1 = ImmutableList.of("path1", "path2");
+        List<String> expectedPropertyPaths2 = ImmutableList.of("path3", "path4");
+        Map<String, Double> expectedPropertyWeights = ImmutableMap.of("property1", 1.0,
+                "property2", 2.0);
+        Map<PropertyPath, Double> expectedPropertyWeightPaths =
+                ImmutableMap.of(new PropertyPath("property1.nested"), 1.0);
+
+        SearchSpec searchSpec = new SearchSpec.Builder()
+                .setTermMatch(SearchSpec.TERM_MATCH_PREFIX)
+                .addFilterNamespaces("namespace1", "namespace2")
+                .addFilterNamespaces(ImmutableList.of("namespace3"))
+                .addFilterSchemas("schemaTypes1", "schemaTypes2")
+                .addFilterSchemas(ImmutableList.of("schemaTypes3"))
+                .addFilterPackageNames("package1", "package2")
+                .addFilterPackageNames(ImmutableList.of("package3"))
+                .setSnippetCount(5)
+                .setSnippetCountPerProperty(10)
+                .setMaxSnippetSize(15)
+                .setResultCountPerPage(42)
+                .setOrder(SearchSpec.ORDER_ASCENDING)
+                .setRankingStrategy(SearchSpec.RANKING_STRATEGY_RELEVANCE_SCORE)
+                .setResultGrouping(SearchSpec.GROUPING_TYPE_PER_NAMESPACE
+                        | SearchSpec.GROUPING_TYPE_PER_PACKAGE, /*limit=*/ 37)
+                .addProjection("schemaTypes1", expectedPropertyPaths1)
+                .addProjection("schemaTypes2", expectedPropertyPaths2)
+                .setPropertyWeights("schemaTypes1", expectedPropertyWeights)
+                .setPropertyWeightPaths("schemaTypes2", expectedPropertyWeightPaths)
+                .setNumericSearchEnabled(true)
+                .setVerbatimSearchEnabled(true)
+                .setListFilterQueryLanguageEnabled(true)
                 .setScorablePropertyRankingEnabled(true)
                 .build();
         SearchSpec searchSpecCopy = new SearchSpec.Builder(searchSpec).build();
@@ -1121,6 +1261,7 @@
         assertThat(searchSpec.getFilterDocumentIds()).isEmpty();
     }
 
+    @Test
     @RequiresFlagsEnabled(Flags.FLAG_ENABLE_SCORABLE_PROPERTY)
     public void testSetAndGetEnableScorablePropertyRanking() {
         SearchSpec defaultSearchSpec = new SearchSpec.Builder().build();
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SetSchemaRequestCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SetSchemaRequestCtsTest.java
index 315b037..2151dd7 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SetSchemaRequestCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SetSchemaRequestCtsTest.java
@@ -33,11 +33,11 @@
 import androidx.appsearch.app.SchemaVisibilityConfig;
 import androidx.appsearch.app.SetSchemaRequest;
 import androidx.appsearch.exceptions.AppSearchException;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
 import androidx.appsearch.testutil.AppSearchEmail;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 import androidx.collection.ArrayMap;
 
 import com.google.common.collect.ImmutableSet;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/NegationNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/NegationNodeCtsTest.java
index 0ed9372..40c4d19 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/NegationNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/NegationNodeCtsTest.java
@@ -23,10 +23,10 @@
 import androidx.appsearch.ast.NegationNode;
 import androidx.appsearch.ast.Node;
 import androidx.appsearch.ast.TextNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/TextNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/TextNodeCtsTest.java
index 574a49f..d7335e4 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/TextNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/TextNodeCtsTest.java
@@ -21,10 +21,10 @@
 import static org.junit.Assert.assertThrows;
 
 import androidx.appsearch.ast.TextNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/AndNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/AndNodeCtsTest.java
index c61a6fe..122ecb2 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/AndNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/AndNodeCtsTest.java
@@ -25,10 +25,10 @@
 import androidx.appsearch.ast.TextNode;
 import androidx.appsearch.ast.operators.AndNode;
 import androidx.appsearch.ast.operators.OrNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/ComparatorNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/ComparatorNodeCtsTest.java
index 5c2d32c..f4a8480 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/ComparatorNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/ComparatorNodeCtsTest.java
@@ -22,10 +22,10 @@
 
 import androidx.appsearch.app.PropertyPath;
 import androidx.appsearch.ast.operators.ComparatorNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/OrNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/OrNodeCtsTest.java
index 574134e..0cfbc0b 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/OrNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/OrNodeCtsTest.java
@@ -25,10 +25,10 @@
 import androidx.appsearch.ast.TextNode;
 import androidx.appsearch.ast.operators.AndNode;
 import androidx.appsearch.ast.operators.OrNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/PropertyRestrictNodeTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/PropertyRestrictNodeTest.java
index 806e317..1e3fc4e 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/PropertyRestrictNodeTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/PropertyRestrictNodeTest.java
@@ -24,10 +24,10 @@
 import androidx.appsearch.ast.Node;
 import androidx.appsearch.ast.TextNode;
 import androidx.appsearch.ast.operators.PropertyRestrictNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/GetSearchStringParameterNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/GetSearchStringParameterNodeCtsTest.java
index 3628fe2..b564377 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/GetSearchStringParameterNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/GetSearchStringParameterNodeCtsTest.java
@@ -21,10 +21,10 @@
 import static org.junit.Assert.assertThrows;
 
 import androidx.appsearch.ast.query.GetSearchStringParameterNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/HasPropertyNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/HasPropertyNodeCtsTest.java
index 345081f..4d77b00 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/HasPropertyNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/HasPropertyNodeCtsTest.java
@@ -22,10 +22,10 @@
 
 import androidx.appsearch.app.PropertyPath;
 import androidx.appsearch.ast.query.HasPropertyNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/PropertyDefinedNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/PropertyDefinedNodeCtsTest.java
index a4cd6ba..1b7901f 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/PropertyDefinedNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/PropertyDefinedNodeCtsTest.java
@@ -22,10 +22,10 @@
 
 import androidx.appsearch.app.PropertyPath;
 import androidx.appsearch.ast.query.PropertyDefinedNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/SearchNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/SearchNodeCtsTest.java
index 041af4e..14559e6 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/SearchNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/SearchNodeCtsTest.java
@@ -24,10 +24,10 @@
 import androidx.appsearch.ast.Node;
 import androidx.appsearch.ast.TextNode;
 import androidx.appsearch.ast.query.SearchNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/SemanticSearchNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/SemanticSearchNodeCtsTest.java
index b76f036..c532d57 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/SemanticSearchNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/SemanticSearchNodeCtsTest.java
@@ -22,10 +22,10 @@
 
 import androidx.appsearch.app.SearchSpec;
 import androidx.appsearch.ast.query.SemanticSearchNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/searchtest/AbstractSyntaxTreeSearchCtsTestBase.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/searchtest/AbstractSyntaxTreeSearchCtsTestBase.java
index 8fb2cd9..1eead7f 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/searchtest/AbstractSyntaxTreeSearchCtsTestBase.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/searchtest/AbstractSyntaxTreeSearchCtsTestBase.java
@@ -48,11 +48,11 @@
 import androidx.appsearch.ast.query.PropertyDefinedNode;
 import androidx.appsearch.ast.query.SearchNode;
 import androidx.appsearch.ast.query.SemanticSearchNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
 import androidx.appsearch.testutil.AppSearchEmail;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/searchtest/AbstractSyntaxTreeSearchLocalCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/searchtest/AbstractSyntaxTreeSearchLocalCtsTest.java
index d7620a2..88775a7 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/searchtest/AbstractSyntaxTreeSearchLocalCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/searchtest/AbstractSyntaxTreeSearchLocalCtsTest.java
@@ -22,8 +22,8 @@
 import androidx.annotation.NonNull;
 import androidx.appsearch.app.AppSearchSession;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
 import androidx.appsearch.localstorage.LocalStorage;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 import androidx.test.core.app.ApplicationProvider;
 
 import com.google.common.util.concurrent.ListenableFuture;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/FlagsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/FlagsTest.java
index 6c7023a..bd8d8ac 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/FlagsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/FlagsTest.java
@@ -35,8 +35,10 @@
 
     @Test
     public void testFlagValue_enableListFilterMatchScoreExpressionFunction() {
-        assertThat(Flags.FLAG_ENABLE_LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION).isEqualTo(
-                "com.android.appsearch.flags.enable_list_filter_match_score_expression_function");
+        assertThat(Flags.FLAG_ENABLE_LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION)
+                .isEqualTo(
+                        "com.android.appsearch"
+                                + ".flags.enable_list_filter_match_score_expression_function");
     }
 
     @Test
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/safeparcel/GenericDocumentParcelTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/safeparcel/GenericDocumentParcelTest.java
index 0a463e9..c6e1304 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/safeparcel/GenericDocumentParcelTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/safeparcel/GenericDocumentParcelTest.java
@@ -28,7 +28,7 @@
 import androidx.appsearch.app.AppSearchBlobHandle;
 import androidx.appsearch.app.EmbeddingVector;
 import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
 
 import org.junit.Test;
 
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSchema.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSchema.java
index 4918ecf..e5860c7 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSchema.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSchema.java
@@ -1588,9 +1588,8 @@
             @ExperimentalAppSearchApi
             @FlaggedApi(Flags.FLAG_ENABLE_SCORABLE_PROPERTY)
             @NonNull
-            public BooleanPropertyConfig.Builder setScoringEnabled(
-                    boolean ScoringEnabled) {
-                mScoringEnabled = ScoringEnabled;
+            public BooleanPropertyConfig.Builder setScoringEnabled(boolean scoringEnabled) {
+                mScoringEnabled = scoringEnabled;
                 return this;
             }
 
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSession.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSession.java
index b9fe4d4..a28a3a5 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSession.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSession.java
@@ -176,6 +176,11 @@
      * {@link AppSearchResult} with error code {@link AppSearchResult#RESULT_ALREADY_EXISTS} will be
      * associated with the {@link AppSearchBlobHandle}.
      *
+     * <p>If the blob content doesn't match the digest in {@link AppSearchBlobHandle}, a failed
+     * {@link AppSearchResult} with error code {@link AppSearchResult#RESULT_INVALID_ARGUMENT} will
+     * be associated with the {@link AppSearchBlobHandle}. The pending Blob file will be removed
+     * from AppSearch.
+     *
      * <p> Pending blobs won't be lost or auto-commit if {@link AppSearchSession} closed.
      * Pending blobs will store in disk rather than memory. You can re-open {@link AppSearchSession}
      * and re-write the pending blobs.
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/CommitBlobResponse.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/CommitBlobResponse.java
index d363476..a95508f 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/CommitBlobResponse.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/CommitBlobResponse.java
@@ -20,7 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
-import androidx.appsearch.app.aidl.AppSearchBatchResultGeneralKeyParcel;
+import androidx.appsearch.app.aidl.AppSearchBatchResultParcelV2;
 import androidx.appsearch.flags.FlaggedApi;
 import androidx.appsearch.flags.Flags;
 import androidx.appsearch.safeparcel.AbstractSafeParcelable;
@@ -46,19 +46,19 @@
             new CommitBlobResponseCreator();
 
     @Field(id = 1, getter = "getResponseParcel")
-    private final AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, Void> mResultParcel;
+    private final AppSearchBatchResultParcelV2<AppSearchBlobHandle, Void> mResultParcel;
 
     /**
      * Creates a {@link CommitBlobResponse} with given {@link AppSearchBatchResult}.
      */
     public CommitBlobResponse(
             @NonNull AppSearchBatchResult<AppSearchBlobHandle, Void> result) {
-        this(AppSearchBatchResultGeneralKeyParcel.fromBlobHandleToVoid(result));
+        this(AppSearchBatchResultParcelV2.fromBlobHandleToVoid(result));
     }
 
     @Constructor
     CommitBlobResponse(
-            @Param(id = 1) @NonNull AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, Void>
+            @Param(id = 1) @NonNull AppSearchBatchResultParcelV2<AppSearchBlobHandle, Void>
                     resultParcel) {
         mResultParcel = Preconditions.checkNotNull(resultParcel);
     }
@@ -83,7 +83,7 @@
      */
     @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
     @NonNull
-    public AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, Void> getResponseParcel() {
+    public AppSearchBatchResultParcelV2<AppSearchBlobHandle, Void> getResponseParcel() {
         return mResultParcel;
     }
 
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/Features.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/Features.java
index 08b6ceb..7f6c575 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/Features.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/Features.java
@@ -127,6 +127,7 @@
      * <p>For details on the "matchScoreExpression" function in the query language, see
      * {@link AppSearchSession#search}.
      */
+    @ExperimentalAppSearchApi
     String LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION =
             FeatureConstants.LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION;
 
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/OpenBlobForReadResponse.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/OpenBlobForReadResponse.java
index 95bbdad..3bf2cd9 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/OpenBlobForReadResponse.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/OpenBlobForReadResponse.java
@@ -20,7 +20,7 @@
 import android.os.Parcelable;
 
 import androidx.annotation.NonNull;
-import androidx.appsearch.app.aidl.AppSearchBatchResultGeneralKeyParcel;
+import androidx.appsearch.app.aidl.AppSearchBatchResultParcelV2;
 import androidx.appsearch.flags.FlaggedApi;
 import androidx.appsearch.flags.Flags;
 import androidx.appsearch.safeparcel.AbstractSafeParcelable;
@@ -56,7 +56,7 @@
             new OpenBlobForReadResponseCreator();
 
     @Field(id = 1)
-    final AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, ParcelFileDescriptor>
+    final AppSearchBatchResultParcelV2<AppSearchBlobHandle, ParcelFileDescriptor>
             mResultParcel;
 
     /**
@@ -64,13 +64,13 @@
      */
     public OpenBlobForReadResponse(
             @NonNull AppSearchBatchResult<AppSearchBlobHandle, ParcelFileDescriptor> result) {
-        this(AppSearchBatchResultGeneralKeyParcel.fromBlobHandleToPfd(result));
+        this(AppSearchBatchResultParcelV2.fromBlobHandleToPfd(result));
     }
 
     @Constructor
     OpenBlobForReadResponse(
             @AbstractSafeParcelable.Param(id = 1)
-            @NonNull AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, ParcelFileDescriptor>
+            @NonNull AppSearchBatchResultParcelV2<AppSearchBlobHandle, ParcelFileDescriptor>
                     resultParcel) {
         mResultParcel = Preconditions.checkNotNull(resultParcel);
     }
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/OpenBlobForWriteResponse.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/OpenBlobForWriteResponse.java
index 1ee1b0a..935e473 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/OpenBlobForWriteResponse.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/OpenBlobForWriteResponse.java
@@ -20,7 +20,7 @@
 import android.os.Parcelable;
 
 import androidx.annotation.NonNull;
-import androidx.appsearch.app.aidl.AppSearchBatchResultGeneralKeyParcel;
+import androidx.appsearch.app.aidl.AppSearchBatchResultParcelV2;
 import androidx.appsearch.flags.FlaggedApi;
 import androidx.appsearch.flags.Flags;
 import androidx.appsearch.safeparcel.AbstractSafeParcelable;
@@ -56,7 +56,7 @@
             new OpenBlobForWriteResponseCreator();
 
     @Field(id = 1)
-    final AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, ParcelFileDescriptor>
+    final AppSearchBatchResultParcelV2<AppSearchBlobHandle, ParcelFileDescriptor>
             mResultParcel;
 
     /**
@@ -64,13 +64,13 @@
      */
     public OpenBlobForWriteResponse(
             @NonNull AppSearchBatchResult<AppSearchBlobHandle, ParcelFileDescriptor> result) {
-        this(AppSearchBatchResultGeneralKeyParcel.fromBlobHandleToPfd(result));
+        this(AppSearchBatchResultParcelV2.fromBlobHandleToPfd(result));
     }
 
     @Constructor
     OpenBlobForWriteResponse(
             @AbstractSafeParcelable.Param(id = 1)
-            @NonNull AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, ParcelFileDescriptor>
+            @NonNull AppSearchBatchResultParcelV2<AppSearchBlobHandle, ParcelFileDescriptor>
                     resultParcel) {
         mResultParcel = Preconditions.checkNotNull(resultParcel);
     }
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchResult.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchResult.java
index 736b84e..c2f447f5 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchResult.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchResult.java
@@ -95,8 +95,8 @@
      * <p>All schema names in this map are un-prefixed, for both keys and values.
      */
     @NonNull
-    @Field(id = 8, getter = "getParentTypeMap")
-    private final Bundle mParentTypeMap;
+    @Field(id = 8)
+    final Bundle mParentTypeMap;
 
 
     /** Cache of the {@link GenericDocument}. Comes from mDocument at first use. */
@@ -454,14 +454,18 @@
          * <p>The map should include entries for the {@link GenericDocument}'s own type and all
          * of the nested documents' types.
          *
-         * <p>Child types must appear before parent types in each list. Otherwise, the
          *  <!--@exportToFramework:ifJetpack()-->
-         *  {@link GenericDocument#toDocumentClass(java.lang.Class, DocumentClassMappingContext)}
-         *  <!--@exportToFramework:else()
-         *  GenericDocument's toDocumentClass
-         *  -->
+         * <p>Child types must appear before parent types in each list. Otherwise, the
+         * {@link GenericDocument#toDocumentClass(java.lang.Class, DocumentClassMappingContext)}
          * method may not correctly identify the most concrete type. This could lead to unintended
          * deserialization into a more general type instead of a more specific type.
+         *  <!--@exportToFramework:else()
+         * <p>Child types must appear before parent types in each list. Otherwise, the
+         * GenericDocument's toDocumentClass method (an AndroidX-only API) may not correctly
+         * identify the most concrete type. This could lead to unintended deserialization into a
+         * more general type instead of a
+         * more specific type.
+         *  -->
          *
          * <p>Parent types should include transitive parents.
          */
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/aidl/AppSearchBatchResultGeneralKeyParcel.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/aidl/AppSearchBatchResultParcelV2.java
similarity index 74%
rename from appsearch/appsearch/src/main/java/androidx/appsearch/app/aidl/AppSearchBatchResultGeneralKeyParcel.java
rename to appsearch/appsearch/src/main/java/androidx/appsearch/app/aidl/AppSearchBatchResultParcelV2.java
index 238f9c7..980aae7 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/aidl/AppSearchBatchResultGeneralKeyParcel.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/aidl/AppSearchBatchResultParcelV2.java
@@ -26,40 +26,40 @@
 import androidx.core.util.Preconditions;
 
 /**
- * A dummy version of AppSearchBatchResultGeneralKeyParcel in jetpack.
+ * A dummy version of AppSearchBatchResultParcelV2 in jetpack.
  * @param <KeyType> The type of keys in the batch result, such as {@link AppSearchBlobHandle}.
  * @param <ValueType> The type of values in the batch result, such as {@link ParcelFileDescriptor}
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 @ExperimentalAppSearchApi
-public final class AppSearchBatchResultGeneralKeyParcel<KeyType, ValueType> {
+public final class AppSearchBatchResultParcelV2<KeyType, ValueType> {
     private final AppSearchBatchResult<KeyType, ValueType> mResult;
 
-    private AppSearchBatchResultGeneralKeyParcel(
+    private AppSearchBatchResultParcelV2(
             @NonNull AppSearchBatchResult<KeyType, ValueType> result) {
         mResult = Preconditions.checkNotNull(result);
     }
 
     /**
-     * Creates an instance of {@link AppSearchBatchResultGeneralKeyParcel} with key type
+     * Creates an instance of {@link AppSearchBatchResultParcelV2} with key type
      * {@link AppSearchBlobHandle} and value type {@link ParcelFileDescriptor}.
      */
     @NonNull
-    public static AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, ParcelFileDescriptor>
+    public static AppSearchBatchResultParcelV2<AppSearchBlobHandle, ParcelFileDescriptor>
             fromBlobHandleToPfd(
             @NonNull AppSearchBatchResult<AppSearchBlobHandle, ParcelFileDescriptor> result) {
-        return new AppSearchBatchResultGeneralKeyParcel<>(result);
+        return new AppSearchBatchResultParcelV2<>(result);
     }
 
     /**
-     * Creates an instance of {@link AppSearchBatchResultGeneralKeyParcel} with key type
+     * Creates an instance of {@link AppSearchBatchResultParcelV2} with key type
      * {@link AppSearchBlobHandle} and value type {@link Void}.
      */
     @NonNull
-    public static AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, Void>
+    public static AppSearchBatchResultParcelV2<AppSearchBlobHandle, Void>
             fromBlobHandleToVoid(
             @NonNull AppSearchBatchResult<AppSearchBlobHandle, Void> result) {
-        return new AppSearchBatchResultGeneralKeyParcel<>(result);
+        return new AppSearchBatchResultParcelV2<>(result);
     }
 
     /** Returns the wrapped batch result.  */
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/safeparcel/PropertyConfigParcel.java b/appsearch/appsearch/src/main/java/androidx/appsearch/safeparcel/PropertyConfigParcel.java
index 17bc08c..4ee703f 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/safeparcel/PropertyConfigParcel.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/safeparcel/PropertyConfigParcel.java
@@ -388,7 +388,7 @@
                 mJoinableConfigParcel, otherProperty.mJoinableConfigParcel)
                 && ObjectsCompat.equals(
                 mEmbeddingIndexingConfigParcel, otherProperty.mEmbeddingIndexingConfigParcel)
-                && ObjectsCompat.equals(mScoringEnabled, otherProperty.mScoringEnabled);
+                && mScoringEnabled == otherProperty.mScoringEnabled;
     }
 
     @Override
@@ -483,8 +483,7 @@
             }
             JoinableConfigParcel otherObject = (JoinableConfigParcel) other;
             return ObjectsCompat.equals(mJoinableValueType, otherObject.mJoinableValueType)
-                    && ObjectsCompat.equals(
-                            mDeletePropagationType, otherObject.mDeletePropagationType);
+                    && mDeletePropagationType == otherObject.mDeletePropagationType;
         }
 
         @Override
@@ -550,7 +549,7 @@
                 return false;
             }
             StringIndexingConfigParcel otherObject = (StringIndexingConfigParcel) other;
-            return ObjectsCompat.equals(mIndexingType, otherObject.mIndexingType)
+            return mIndexingType == otherObject.mIndexingType
                     && ObjectsCompat.equals(mTokenizerType, otherObject.mTokenizerType);
         }
 
@@ -605,7 +604,7 @@
                 return false;
             }
             IntegerIndexingConfigParcel otherObject = (IntegerIndexingConfigParcel) other;
-            return ObjectsCompat.equals(mIndexingType, otherObject.mIndexingType);
+            return mIndexingType == otherObject.mIndexingType;
         }
 
         @Override
@@ -739,8 +738,8 @@
                 return false;
             }
             EmbeddingIndexingConfigParcel otherObject = (EmbeddingIndexingConfigParcel) other;
-            return ObjectsCompat.equals(mIndexingType, otherObject.mIndexingType)
-                    && ObjectsCompat.equals(mQuantizationType, otherObject.mQuantizationType);
+            return mIndexingType == otherObject.mIndexingType
+                    && mQuantizationType == otherObject.mQuantizationType;
         }
 
         @Override
diff --git a/appsearch/exportToFramework.py b/appsearch/exportToFramework.py
index c23398a..eb6423d 100755
--- a/appsearch/exportToFramework.py
+++ b/appsearch/exportToFramework.py
@@ -209,13 +209,13 @@
     def _TransformTestCode(self, contents):
         contents = (contents
             .replace(
-                    'androidx.appsearch.flags.CheckFlagsRule',
+                    'androidx.appsearch.testutil.CheckFlagsRule',
                     'android.platform.test.flag.junit.CheckFlagsRule')
             .replace(
-                    'androidx.appsearch.flags.DeviceFlagsValueProvider',
+                    'androidx.appsearch.testutil.DeviceFlagsValueProvider',
                     'android.platform.test.flag.junit.DeviceFlagsValueProvider')
             .replace(
-                    'androidx.appsearch.flags.RequiresFlagsEnabled',
+                    'androidx.appsearch.testutil.RequiresFlagsEnabled',
                     'android.platform.test.annotations.RequiresFlagsEnabled')
             .replace('androidx.appsearch.testutil.', 'android.app.appsearch.testutil.')
             .replace(
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-af/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-af/strings.xml
index 352c09a..f3ec77f 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-af/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-af/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Net die sekondêre handeling kan gekies word"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Versieringtoets"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekondêre handelinge en versiering"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Ry met sekondêre handelinge en versiering wat ’n baie lang titel het"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Die ry kan ook gekies word"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Sekondêre handeling is gekies"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Primêre handeling vir ry is gekies"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-am/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-am/strings.xml
index c177f54..2e43ab6 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-am/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-am/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"መመረጥ የሚችለው ሁለተኛው እርምጃ ብቻ ነው"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"የማስዋቢያ ሙከራ"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"ሁለተኛ እርምጃዎች እና ማስዋብ"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"ሁለተኛ እርምጃዎች ያሉት ረድፍ እና በጣም ረዥም ርዕስ ያለው ማስዋቢያ"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"እንዲሁም ረድፉ መመረጥ ይችላል"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"ሁለተኛ እርምጃ ተመርጧል"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"የረድፍ አንደኛ እርምጃ ተመርጧል"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ar/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ar/strings.xml
index 5bd36dd..f6fb1cc 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ar/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ar/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"يمكن اختيار الإجراء الثانوي فقط."</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"تصميم تجريبي"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"الإجراءات الثانوية والتصميم"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"صف يتضمن \"الإجراءات الثانوية\" و\"التصميم\" وله عنوان طويل جدًا"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"يمكن أيضًا اختيار الصف."</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"تم اختيار إجراء ثانوي للصف."</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"تم اختيار إجراء أساسي للصف."</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-as/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-as/strings.xml
index f4e9b53..548a2ee 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-as/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-as/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"কেৱল গৌণ কাৰ্যটোও বাছনি কৰিব পৰা যায়"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"সজোৱা কাৰ্য"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"গৌণ কাৰ্য আৰু সজোৱা কাৰ্য"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"এটা সঁচাকৈয়ে দীঘল শিৰোনামৰ সৈতে গৌণ কাৰ্য আৰু সজোৱা কাৰ্যসমূহ থকা শাৰী"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"শাৰীটোও বাছনি কৰিব পৰা যায়"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"গৌণ কাৰ্য বাছনি কৰা হৈছে"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"শাৰীৰ প্ৰাথমিক কাৰ্য বাছনি কৰা হৈছে"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-az/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-az/strings.xml
index a165ae5..757edef 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-az/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-az/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Yalnız ikinci dərəcəli əməliyyat seçilə bilər"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Dekorasiya Testi"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"İkinci Dərəcəli Əməliyyatlar və Dekorasiya"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Həqiqətən uzun başlığa sahib İkincil Fəaliyyətlər və Dekorasiya olan sətir"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Sıra da seçilə bilər"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"İkinci Dərəcəli Əməliyyat seçilib"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Sıra üzrə əsas əməliyyat seçilib"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-b+sr+Latn/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-b+sr+Latn/strings.xml
index 072729c..3e1a9ed 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-b+sr+Latn/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-b+sr+Latn/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Može da se izabere samo sekundarna radnja"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Test dekoracije"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundarne radnje i dekoracija"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Red sa sekundarnim radnjama i dekoracijom sa veoma dugim naslovom"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Može da se izabere i red"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Sekundarna radnja je izabrana"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Primarna radnja reda je izabrana"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-be/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-be/strings.xml
index b070966..9d37bb1 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-be/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-be/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Можна выбраць толькі другаснае дзеянне"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Тэст элементаў аздаблення"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Другасныя дзеянні і аздабленне"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Радок з другаснымі дзеяннямі і аздабленнем з вельмі доўгай назвай"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Таксама можна выбраць радок"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Выбрана другаснае дзеянне"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Выбрана галоўнае дзеянне для радка"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-bg/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-bg/strings.xml
index e4604b0..9d1ac46 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-bg/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-bg/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Само алтернативното действие може да бъде избрано"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Тестване на декоративен елемент"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Алтернативни действия и декоративни елементи"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Ред с алтернативни действия и декоративни елементи с много дълго заглавие"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Редът може също да бъде избран"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Избрано е алтернативното действие"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Избрано е основното действие за реда"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-bn/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-bn/strings.xml
index 0e64f6b..a5a729b 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-bn/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-bn/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"শুধুমাত্র সেকেন্ডারি অ্যাকশন বেছে নেওয়া যেতে পারে"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"ডেকরেশন টেস্ট"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"সেকেন্ডারি অ্যাকশন ও ডেকরেশন"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"সেকেন্ডারি অ্যাকশন ও ডেকরেশনের দীর্ঘ টাইটেল আছে এমন সারি"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"সারিও বেছে নেওয়া যেতে পারে"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"সেকেন্ডারি অ্যাকশন বেছে নেওয়া হয়েছে"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"সারির প্রাইমারি অ্যাকশন বেছে নেওয়া হয়েছে"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-bs/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-bs/strings.xml
index fa47207..d1ac68f 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-bs/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-bs/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Moguće je odabrati samo sekundarnu radnju"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Test dekoracije"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundarne radnje i dekoracija"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Red sa sekundarnim radnjama i dekoracijom s veoma dugim naslovom"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Moguće je odabrati i red"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Odabrana je sekundarna radnja"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Odabrana je primarna radnja reda"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ca/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ca/strings.xml
index 17ceb5b..e25a8de 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ca/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ca/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Només es pot seleccionar l\'acció secundària"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Prova de decoració"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Accions secundàries i decoració"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Fila amb accions secundàries i decoració amb un títol molt llarg"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"La fila també es pot seleccionar"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"S\'ha seleccionat l\'acció secundària"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"S\'ha seleccionat l\'acció principal de la fila"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-cs/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-cs/strings.xml
index 5657fa0..9618bca 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-cs/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-cs/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Lze vybrat pouze sekundární akci"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Zkouška dekorace"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundární akce a dekorace"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Řádek se sekundárními akcemi a dekorace s opravdu dlouhým názvem"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Řádek lze také vybrat"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Je vybrána sekundární akce"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Je vybrána primární akce řádku"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-da/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-da/strings.xml
index 0c962df..721a67a 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-da/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-da/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Det er kun den sekundære handling, der kan vælges"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Dekorationstest"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundære handlinger og dekoration"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Række med sekundære handlinger og dekoration med en meget lang titel"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Rækken kan også vælges"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Sekundær handling er valgt"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Primær handling for rækken er valgt"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-de/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-de/strings.xml
index 68c8836..2cb4991 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-de/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-de/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Nur die sekundäre Aktion kann ausgewählt werden"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Dekorationstest"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundäre Aktionen und Dekoration"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Zeile mit sekundären Aktionen und Dekoration mit einem sehr langen Titel"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Auch diese Zeile kann ausgewählt werden"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Sekundäre Aktion ist ausgewählt"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Zeile mit der primären Aktion ist ausgewählt"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-el/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-el/strings.xml
index 0461d8d..053faa4 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-el/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-el/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Μόνο η δευτερεύουσα ενέργεια μπορεί να επιλεγεί"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Δοκιμή διακόσμησης"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Δευτερεύουσες ενέργειες και διακόσμηση"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Σειρά με δευτερεύουσες ενέργειες και διακόσμηση με πολύ μεγάλο τίτλο"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Η σειρά μπορεί επίσης να επιλεγεί"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Επιλέχθηκε η δευτερεύουσα ενέργεια σειράς"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Επιλέχθηκε η κύρια ενέργεια σειράς"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-en-rAU/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-en-rAU/strings.xml
index 39f6518..63d6e89 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-en-rAU/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-en-rAU/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Only the secondary action can be selected"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Decoration test"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Secondary actions and decoration"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Row with Secondary Actions and Decoration with a really long title"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"The row can also be selected"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Secondary action is selected"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Row primary action is selected"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-en-rGB/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-en-rGB/strings.xml
index 39f6518..63d6e89 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-en-rGB/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-en-rGB/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Only the secondary action can be selected"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Decoration test"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Secondary actions and decoration"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Row with Secondary Actions and Decoration with a really long title"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"The row can also be selected"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Secondary action is selected"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Row primary action is selected"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-en-rIN/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-en-rIN/strings.xml
index 39f6518..63d6e89 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-en-rIN/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-en-rIN/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Only the secondary action can be selected"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Decoration test"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Secondary actions and decoration"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Row with Secondary Actions and Decoration with a really long title"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"The row can also be selected"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Secondary action is selected"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Row primary action is selected"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-es-rUS/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-es-rUS/strings.xml
index 290e04a..cfeddbac 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-es-rUS/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-es-rUS/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Sólo puede seleccionarse la acción secundaria"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Prueba de decoración"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Acciones secundarias y decoraciones"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Fila con acciones secundarias y decoración con un título muy largo"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"También se puede seleccionar la fila"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Se seleccionó una acción secundaria"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Se seleccionó una acción de fila principal"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-es/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-es/strings.xml
index c21e4c6..2dffac1 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-es/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-es/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Solo se puede seleccionar la acción secundaria"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Prueba de decoración"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Acciones secundarias y decoración"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Fila con acciones secundarias y decoración con un título muy largo"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"También se puede seleccionar la fila"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Se ha seleccionado la acción secundaria"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Se ha seleccionado la acción principal de la fila"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-et/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-et/strings.xml
index fd8b184..8e69ee8 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-et/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-et/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Valida saab ainult teisese toimingu"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Dekoratsiooni test"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Teisesed toimingud ja dekoratsioon"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rida tõeliselt pika pealkirjaga teiseste toimingute ja dekoratsiooniga"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Rea saab samuti valida"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Valitud on teisene toiming"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Valitud on rea peamine toiming"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml
index e09a079..07c63dc 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Bigarren mailako ekintza soilik hauta daiteke"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Apainketaren proba"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Bigarren mailako ekintzak eta apainketa"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Bigarren mailako ekintzak eta apainketak dituen errenkada, oso izen luzearekin"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Errenkada ere hauta daiteke"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Bigarren mailako ekintza hautatuta dago"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Errenkadari dagokion ekintza nagusia hautatuta dago"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-fa/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-fa/strings.xml
index e839771..e15e53f 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-fa/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-fa/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"فقط کنش فرعی را می‌توان انتخاب کرد"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"آزمایش آرایه‌گری"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"کنش‌های فرعی و آرایه‌گری"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"ردیفی با «کنش‌های فرعی» و «آرایه‌گری» با عنوان بسیار طولانی"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"ردیف را هم می‌توان انتخاب کرد"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"کنش فرعی انتخاب شده است"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"کنش اصلی ردیف انتخاب شده است"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-fi/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-fi/strings.xml
index 8bde3c0..a2fe340 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-fi/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-fi/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Voit valita vain toissijaisen toiminnon"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Kuviotesti"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Toissijaiset toiminnot ja kuvio"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rivi, jossa on toissijaiset toiminnot ja kuvio, jolla on todella pitkä nimi"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Voit valita myös rivin"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Toissijainen toiminto on valittu"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Rivin ensisijainen toiminto on valittu"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-fr-rCA/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-fr-rCA/strings.xml
index badf7e0..43192a4 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-fr-rCA/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-fr-rCA/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Seule l\'action secondaire peut être sélectionnée"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Test de décoration"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Actions secondaires et décoration"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rangée avec Actions secondaires et Décoration avec un titre très long"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Cette ligne peut également être sélectionnée"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"L\'action secondaire est sélectionnée"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"L\'action primaire de la ligne est sélectionnée"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-fr/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-fr/strings.xml
index e4d2a31..f497c3f 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-fr/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-fr/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Seule l\'action secondaire peut être sélectionnée"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Test de la décoration"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Actions secondaires et décoration"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Ligne contenant des actions secondaires et une décoration comportant un titre très long"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"La ligne peut également être sélectionnée"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"L\'action secondaire est sélectionnée"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"L\'action principale de la ligne est sélectionnée"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-gl/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-gl/strings.xml
index f624e35..3b68f403 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-gl/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-gl/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Só se pode seleccionar a acción secundaria"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Proba de decoración"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Accións secundarias e decoración"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Fila con accións secundarias e decoración cun título moi longo"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Tamén se pode seleccionar a fila"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Seleccionouse a acción secundaria"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Seleccionouse a acción principal da fila"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-gu/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-gu/strings.xml
index a8fc6b4..9a42507 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-gu/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-gu/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"માત્ર ગૌણ ઍક્શન પસંદ કરી શકાય છે"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"ડેકોરેશન પરીક્ષણ"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"ગૌણ ઍક્શન અને ડેકોરેશન"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"સેકન્ડરી ઍક્શન અને ડેકોરેશનની ઘણા લાંબા શીર્ષકવાળી પંક્તિ"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"પંક્તિ પણ પસંદ કરી શકાય છે"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"ગૌણ ઍક્શન પસંદ કરી"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"પ્રાથમિક ઍક્શન પંક્તિ પસંદ કરી"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-hi/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-hi/strings.xml
index ebda291..bbee798 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-hi/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-hi/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"सिर्फ़ सेकंडरी ऐक्शन को चुना जा सकता है"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"डेकोरेशन टेस्ट"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"सेकंडरी ऐक्शन और डेकोरेशन"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"सेकंडरी ऐक्शन और डेकोरेशन के लंबे टाइटल वाली लाइन"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"पंक्ति को भी चुना जा सकता है"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"सेकंडरी ऐक्शन चुना गया"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"पंक्ति से जुड़ा प्राइमरी ऐक्शन चुना गया"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-hr/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-hr/strings.xml
index fd52ccae..770e9db 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-hr/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-hr/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Može se odabrati samo sekundarna radnja"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Test dekoracije"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundarne radnje i dekoracija"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Redak sa sekundarnim radnjama i dekoracijom s vrlo dugim naslovom"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Može se odabrati i redak"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Odabrana je sekundarna radnja"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Odabran je redak primarne radnje"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-hu/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-hu/strings.xml
index 46d3c07..f17a127 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-hu/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-hu/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Csak a másodlagos művelet választható ki"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Dekoráció tesztelése"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Másodlagos műveletek és dekorációk"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Másodlagos műveletekkel és dekorációval rendelkező sor nagyon hosszú címmel"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"A sor is kiválasztható"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Másodlagos művelet kiválasztva"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Sor elsődleges művelete kiválasztva"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-in/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-in/strings.xml
index bb53c17..f38edf5 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-in/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-in/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Hanya tindakan sekunder yang dapat dipilih"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Pengujian Dekorasi"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Tindakan Sekunder dan Dekorasi"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Baris dengan Tindakan Sekunder dan Dekorasi dengan judul yang sangat panjang"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Baris juga dapat dipilih"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Tindakan Sekunder dipilih"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Tindakan utama baris dipilih"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-is/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-is/strings.xml
index f2d4365..b0f3d7f 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-is/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-is/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Aðeins er hægt að velja aukaaðgerð"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Prufuskreyting"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Aukaaðgerðir og skreyting"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Lína með aukaaðgerðum, skreytingum og mjög löngum titli"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Einnig er hægt að velja línuna"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Aukaaðgerð er valin"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Aðalaðgerð línu er valin"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-it/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-it/strings.xml
index 8d06a75..4aa203d 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-it/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-it/strings.xml
@@ -38,7 +38,7 @@
     <string name="settings_action_title" msgid="8616900063253887861">"Impostazioni"</string>
     <string name="accept_action_title" msgid="4899660585470647578">"Accetta"</string>
     <string name="reject_action_title" msgid="6730366705938402668">"Rifiuta"</string>
-    <string name="ok_action_title" msgid="7128494973966098611">"OK"</string>
+    <string name="ok_action_title" msgid="7128494973966098611">"Ok"</string>
     <string name="throw_action_title" msgid="7163710562670220163">"Genera"</string>
     <string name="commute_action_title" msgid="2585755255290185096">"Tragitto giornaliero"</string>
     <string name="sign_out_action_title" msgid="1653943000866713010">"Esci"</string>
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Solo l\'azione secondaria può essere selezionata"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Test decorazione"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Azioni secondarie e decorazione"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Riga con Azioni secondarie e decorazione con un titolo molto lungo"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Anche la riga può essere selezionata"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"È stata selezionata l\'azione secondaria"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"È stata selezionata l\'azione principale della riga"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-iw/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-iw/strings.xml
index 9bd0fbd..1a89e7e9 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-iw/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-iw/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"ניתן לבחור רק את הפעולה המשנית"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"בדיקת עיצוב"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"פעולות משניות ועיצוב"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"שורה עם פעולות משניות ועיצוב עם כותרת ארוכה מאוד"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"ניתן לבחור גם את השורה"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"נבחרה פעולה משנית"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"נבחרה פעולה ראשית בשורה"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ka/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ka/strings.xml
index be42714..9ff7c3e 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ka/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ka/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"შესაძლებელია მხოლოდ მეორადი მოქმედების არჩევა"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"დეკორაციის ტესტი"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"მეორადი მოქმედებები და დეკორაცია"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"დამატებითი აქტივობების მწკრივი და გაფორმება ძალიან გრძელი სათაურით"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"ასევე შეიძლება მწკრივის არჩევა"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"არჩეულია მეორადი მოქმედება"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"არჩეულია მწკრივის პირველადი მოქმედება"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-kk/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-kk/strings.xml
index 7be8e7c..95d6393 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-kk/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-kk/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Қосымша әрекет қана таңдалады."</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Безендіруді сынау"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Қосымша әрекеттер және безендіру"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Қосымша әрекеттерден және декорациядан тұратын, ұзын тақырыпты жол"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Жолды да таңдауға болады."</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Қосымша әрекет таңдалды."</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Жол үшін негізгі әрекет таңдалды."</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-km/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-km/strings.xml
index a41d2e7..0eb3cfc 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-km/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-km/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"អាចជ្រើសរើសបានតែសកម្មភាពបន្ទាប់បន្សំប៉ុណ្ណោះ"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"តេស្តនៃការតុបតែង"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"ការតុបតែង និងសកម្មភាពបន្ទាប់បន្សំ"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"ជួរដេកដែលមានសកម្មភាពបន្ទាប់បន្សំ និងការតុបតែងដែលមានចំណងជើងវែងខ្លាំង"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"ជួរដេកក៏អាចត្រូវបានជ្រើសរើសផងដែរ"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"សកម្មភាពបន្ទាប់បន្សំត្រូវបានជ្រើសរើស"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"សកម្មភាពចម្បងជួរដេកត្រូវបានជ្រើសរើស"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ko/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ko/strings.xml
index 1d27f9d..6da438e1 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ko/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ko/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"보조 작업만 선택할 수 있습니다."</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"장식 테스트"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"보조 작업 및 장식"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"제목이 매우 긴 보조 작업 및 장식이 있는 행"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"행도 선택할 수 있습니다."</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"보조 작업 선택됨"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"행 기본 작업 선택됨"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ky/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ky/strings.xml
index 3fbeef2..c54ddf8 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ky/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ky/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Кошумча аракетти гана тандоого болот"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Жасалгалоону сыноо"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Кошумча аракеттер жана Жасалгалоо"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Кошумча аракеттер жана Жасалгалоонун аталышы өтө узун болгон сап"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Сапты да тандоого болот"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Кошумча аракет тандалды"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Негизги аракет сабы тандалды"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-lo/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-lo/strings.xml
index cfc8724..76c1de3 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-lo/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-lo/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"ສາມາດເລືອກໄດ້ສະເພາະຄຳສັ່ງສຳຮອງເທົ່ານັ້ນ"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"ການທົດສອບການຕົກແຕ່ງ"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"ຄຳສັ່ງສຳຮອງ ແລະ ການຕົກແຕ່ງ"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"ແຖວທີ່ມີຄຳສັ່ງສຳຮອງ ແລະ ການຕົກແຕ່ງທີ່ມີຊື່ທີ່ຍາວຫຼາຍ"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"ນອກຈາກນັ້ນຍັງເລືອກແຖວໄດ້ນຳ"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"ເລືອກຄຳສັ່ງສຳຮອງຂອງແຖວແລ້ວ"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"ເລືອກຄຳສັ່ງຫຼັກຂອງແຖວແລ້ວ"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-lt/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-lt/strings.xml
index aa6e83c..b50c0f3 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-lt/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-lt/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Galima pasirinkti tik antrinį veiksmą"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Dekoracijų bandymas"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Antriniai veiksmai ir dekoracijos"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Eilutė su antriniais veiksmais ir dekoracijomis su tikrai ilgu pavadinimu"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Taip pat galima pasirinkti eilutę"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Pasirinktas antrinis veiksmas"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Pasirinktas pagrindinis eilutės veiksmas"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-lv/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-lv/strings.xml
index b7c3701..33a267e 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-lv/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-lv/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Atlasīt var tikai sekundāro darbību"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Noformējuma tests"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundārās darbības un noformējums"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rindiņa ar sekundārajām darbībām un noformējumu, kam ir ļoti garš nosaukums"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Arī rindu var atlasīt"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Atlasīta sekundārā darbība"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Atlasīta rindas primārā darbība"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-mk/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-mk/strings.xml
index a65e36e..9bbcfbf 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-mk/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-mk/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Само секундарното дејство може да се избере"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Проба за украсување"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Секундарни дејства и украсување"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Ред со секундарни дејства и украсување со навистина долг наслов"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Редот исто така може да се избере"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Избрано е секундарно дејство"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Избрано е примарно дејство на ред"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ml/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ml/strings.xml
index 2f1533f..4faf21d 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ml/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ml/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"സെക്കൻഡറി പ്രവർത്തനം മാത്രമേ തിരഞ്ഞെടുക്കാനാകൂ"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"ഡെക്കറേഷൻ ടെസ്റ്റ്"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"സെക്കൻഡറി പ്രവർത്തനങ്ങളും ഡെക്കറേഷനും"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"സെക്കൻഡറി നടപടികളുള്ള വരി, വളരെ നീളമുള്ള പേരുള്ള ഡെക്കറേഷൻ"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"വരിയും തിരഞ്ഞെടുക്കാവുന്നതാണ്"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"സെക്കൻഡറി പ്രവർത്തനം തിരഞ്ഞെടുത്തു"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"വരിയുടെ പ്രാഥമിക പ്രവർത്തനം തിരഞ്ഞെടുത്തു"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-mn/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-mn/strings.xml
index 8de303c..c5c466e 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-mn/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-mn/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Зөвхөн хоёрдогч үйлдлийг сонгох боломжтой"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Чимэглэлийн туршилт"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Хоёрдогч үйлдлүүд ба чимэглэл"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Хоёрдогч үйлдлүүд, маш урт нэртэй чимэглэлийн мөр"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Мөрийг мөн сонгож болно"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Хоёрдогч үйлдлийг сонгосон"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Мөрийн үндсэн үйлдлийг сонгосон"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ms/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ms/strings.xml
index 61380fa..fd7401d 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ms/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ms/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Hanya tindakan sekunder boleh dipilih"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Ujian Perhiasan"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Tindakan Sekunder dan Perhiasan"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Baris dengan Tindakan Kedua dan Hiasan dengan tajuk yang benar-benar panjang"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Baris ini juga boleh dipilih"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Tindakan Sekunder dipilih"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Tindakan utama baris dipilih"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-my/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-my/strings.xml
index 886009b..40f6d21 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-my/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-my/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"ဒုတိယဦးစားပေးလုပ်ဆောင်ချက်ကိုသာ ရွေးနိုင်သည်"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"တန်ဆာဆင်မှု စမ်းသပ်ခြင်း"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"ဒုတိယဦးစားပေးလုပ်ဆောင်ချက်များနှင့် တန်ဆာဆင်ခြင်း"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"ဒုတိယလုပ်ဆောင်ချက်များပါဝင်သည့် အတန်းနှင့် အမှန်တကယ်ရှည်သောခေါင်းစဉ်ဖြင့် အလှဆင်ခြင်း"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"အတန်းကိုလည်း ရွေးနိုင်သည်"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"ဒုတိယဦးစားပေး လုပ်ဆောင်ချက်ကို ရွေးထားသည်"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"အတန်း၏ ပထမဦးစားပေး လုပ်ဆောင်ချက်ကို ရွေးထားသည်"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-nb/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-nb/strings.xml
index 74d3248..2cc0a0a 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-nb/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-nb/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Bare sekundærhandlingen kan velges"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Dekorasjonstest"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundærhandling og dekorasjon"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rad med sekundærhandlinger og dekorasjon med en veldig lang tittel"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Raden kan også velges"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Sekundærhandlingen er valgt"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Hovedhandlingen til raden er valgt"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ne/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ne/strings.xml
index fa6b8bb..9ee2aac 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ne/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ne/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"सेकेन्डरी एक्सन मात्र चयन गर्न सकिन्छ"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"डेकोरेसन टेस्ट"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"सेकेन्डरी एक्सन तथा डेकोरेसन"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"गौण कार्य र सजावटसम्बन्धी वास्तवमै लामो शीर्षक भएको रो"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"रो पनि चयन गर्न सकिन्छ"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"सेकेन्डरी एक्सन चयन गरिएको छ"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"रोको प्राइमरी एक्सन चयन गरिएको छ"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-nl/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-nl/strings.xml
index f50a354..f56e84c 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-nl/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-nl/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Alleen de secundaire actie kan worden geselecteerd"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Test voor decoratie"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Secundaire acties en decoratie"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rij met secundaire acties en decoratie met een heel lange titel"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"De rij kan ook worden geselecteerd"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Secundaire actie is geselecteerd"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Rij voor primaire actie is geselecteerd"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-or/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-or/strings.xml
index 8f69dde..f0413e9 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-or/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-or/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"କେବଳ ଦ୍ୱିତୀୟ କାର୍ଯ୍ୟକୁ ଚୟନ କରାଯାଇପାରିବ"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"ଡେକୋରେସନ ଟେଷ୍ଟ"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"ଦ୍ୱିତୀୟ କାର୍ଯ୍ୟ ଏବଂ ଡେକୋରେସନ"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"ପ୍ରକୃତରେ ଏକ ବଡ଼ ଟାଇଟେଲ ସହ ସେକେଣ୍ଡାରୀ ଆକ୍ସନ ଏବଂ ଡେକୋରେସନ ଥିବା ଧାଡ଼ି"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"ଏହି ଧାଡ଼ିଟିକୁ ମଧ୍ୟ ଚୟନ କରାଯାଇପାରିବ"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"ଦ୍ୱିତୀୟ କାର୍ଯ୍ୟ ଚୟନ କରାଯାଇଛି"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"ଧାଡ଼ିର ପ୍ରାଥମିକ କାର୍ଯ୍ୟ ଚୟନ କରାଯାଇଛି"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-pl/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-pl/strings.xml
index 9ad149a..2f48974 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-pl/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-pl/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Można wybrać tylko działanie alternatywne"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Test dekoracji"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Działania alternatywne i dekoracja"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Wiersz z działaniami alternatywnymi i dekoracją o bardzo długim tytule"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Można wybrać również wiersz"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Wybrano działanie alternatywne"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Wybrano wiersz z działaniem głównym"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-pt-rBR/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-pt-rBR/strings.xml
index fa55a9a..8f2bcc6 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-pt-rBR/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-pt-rBR/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Apenas a ação secundária pode ser selecionada"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Teste de decoração"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Ações secundárias e decoração"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Linha com ações secundárias e decoração com um título muito longo"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"A linha também pode ser selecionada"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"A ação secundária está selecionada"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"A ação principal da linha está selecionada"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-pt/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-pt/strings.xml
index fa55a9a..8f2bcc6 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-pt/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-pt/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Apenas a ação secundária pode ser selecionada"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Teste de decoração"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Ações secundárias e decoração"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Linha com ações secundárias e decoração com um título muito longo"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"A linha também pode ser selecionada"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"A ação secundária está selecionada"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"A ação principal da linha está selecionada"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ro/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ro/strings.xml
index 7233bfa..72b5c28 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ro/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ro/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Numai acțiunea secundară poate fi selectată"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Test pentru decorație"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Acțiuni secundare și decorație"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rând cu acțiuni secundare și element decorativ cu un titlu foarte lung"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Și rândul poate fi selectat"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Acțiunea secundară a fost selectată"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Acțiunea principală de pe rând a fost selectată"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ru/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ru/strings.xml
index 157fa2a..9c88c83 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ru/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ru/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Можно выбрать только второстепенное действие"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Тест оформления"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Второстепенные действия и оформление"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Строка со второстепенными действиями и оформлением, у которых очень длинные названия"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Можно также выбрать строку"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Выбрано второстепенное действие."</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Выбрано главное действие для строки."</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-si/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-si/strings.xml
index fc5bbbb..9287572 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-si/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-si/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"ද්විතියික ක්‍රියාව පමණක් තෝරා ගත හැක"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"සැරසිලි පරීක්ෂණය"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"ද්විතියික ක්‍රියා සහ සැරසිලි"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"ද්විතීයික ක්‍රියා සහිත පේළිය සහ ඇත්තෙන්ම දිගු මාතෘකාවක් සහිත සැරසිලි"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"පේළිය ද තෝරා ගත හැක"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"ද්විතියික ක්‍රියාව තෝරා ඇත"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"පේළියේ මූලික ක්‍රියාව තෝරා ඇත"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-sk/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-sk/strings.xml
index a2d26f2..7722b84 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-sk/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-sk/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Vybrať sa dá iba sekundárna akcia"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Test dekorácie"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundárne akcie a dekorácia"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Riadok so sekundárnymi akciami a dekoráciou s veľmi dlhým názvom"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Môžete vybrať aj daný riadok"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Bola vybraná sekundárna akcia"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Bola vybraná primárna akcia riadka"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-sq/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-sq/strings.xml
index 165afd2..3010d7d 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-sq/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-sq/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Mund të zgjidhet vetëm veprimi dytësor"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Testimi i dekorimit"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Veprimet dytësore dhe dekorimi"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rreshti me veprimet dytësore dhe zbukurime me një titull vërtet të gjatë"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Rreshti mund të zgjidhet gjithashtu"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"U zgjodh veprimi dytësor"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"U zgjodh veprimi kryesor i rreshtit"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-sr/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-sr/strings.xml
index 4ef599d..c7443dd 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-sr/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-sr/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Може да се изабере само секундарна радња"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Тест декорације"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Секундарне радње и декорација"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Ред са секундарним радњама и декорацијом са веома дугим насловом"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Може да се изабере и ред"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Секундарна радња је изабрана"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Примарна радња реда је изабрана"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-sv/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-sv/strings.xml
index 8efbfec..5ca6aee 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-sv/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-sv/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Det går endast att välja den sekundära åtgärden"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Dekorationstest"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundära åtgärder och dekoration"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rad med sekundära åtgärder och dekoration med en väldigt lång titel"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Det går även att välja raden"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Den sekundära åtgärden har valts"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Radens primära åtgärd har valts"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-sw/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-sw/strings.xml
index 07b6998..d1b91b7 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-sw/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-sw/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Kitendo cha upili tu ndiyo kinaweza kuchaguliwa"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Jaribio la Usanifu"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Matendo ya Upili na Usanifu"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Safu Mlalo yenye Vitendo vya Ziada na Mapambo yenye jina refu zaidi"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Safu mlalo pia inaweza kuchaguliwa"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Kitendo cha Upili kimechaguliwa"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Kitendo cha msingi cha safu mlalo kimechaguliwa"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-th/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-th/strings.xml
index fdaf343..f3e29cd 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-th/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-th/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"เลือกได้เฉพาะการดำเนินการสำรอง"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"การทดสอบการตกแต่ง"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"การดำเนินการสำรองและการตกแต่ง"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"แถวที่มีการดำเนินการสำรองและการตกแต่งซึ่งมีชื่อที่ยาวมาก"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"เลือกแถวได้ด้วย"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"เลือกการดำเนินการสำรองแล้ว"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"เลือกการดำเนินการหลักของแถวแล้ว"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-tr/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-tr/strings.xml
index 06791fad..af20358 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-tr/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-tr/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Yalnızca ikincil işlem seçilebilir"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Süsleme Testi"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"İkincil İşlemler ve Süsleme"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Çok uzun bir başlığa sahip İkincil İşlemler ve Süsleme içeren satır"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Satır da seçilebilir"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"İkincil işlem seçildi"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Satırdaki birincil işlem seçildi"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-uk/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-uk/strings.xml
index 8db2abc..75ab546 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-uk/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-uk/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Можна вибрати лише додаткову дію"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Перевірка оформлення"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Додаткові дії й оформлення"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Рядок із додатковими діями й оформленням із дуже довгою назвою"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Рядок також можна вибрати"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Вибрано додаткову дію"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Вибрано основну дію рядка"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-vi/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-vi/strings.xml
index 9d3c9fa..45397e6 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-vi/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-vi/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Bạn chỉ có thể chọn hành động phụ"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Thử nghiệm phần trang trí"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Phần trang trí và hành động phụ"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Hàng có Phần trang trí và hành động phụ với tiêu đề rất dài"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Bạn cũng có thể chọn hàng"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Đã chọn hành động phụ"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Đã chọn hành động chính cho hàng"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-zh-rCN/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-zh-rCN/strings.xml
index 4e9fa74..4176a6f 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-zh-rCN/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-zh-rCN/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"只能选择次要操作"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"装饰测试"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"次要操作和装饰"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"包含次要操作和装饰以及长标题的行"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"也可以选择行"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"次要操作处于选中状态"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"行主要操作处于选中状态"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-zh-rHK/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-zh-rHK/strings.xml
index 96c5f99..d3bf08c 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-zh-rHK/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-zh-rHK/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"只可選取次要動作"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"裝飾測試"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"次要動作及裝飾"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"含有次要動作及修飾設定的列,且標題非常長"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"亦可選取列"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"已選取次要動作"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"已選取列的主要動作"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-zh-rTW/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-zh-rTW/strings.xml
index d6318e1..c6f9b78 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-zh-rTW/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-zh-rTW/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"只可以選取次要動作"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"裝飾測試"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"次要動作與裝飾"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"含有次要動作與修飾設定的列,且標題非常長"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"也可以選取列"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"已選取次要動作"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"已選取列的主要動作"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-zu/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-zu/strings.xml
index c4b8273..cc8df31 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-zu/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-zu/strings.xml
@@ -321,8 +321,7 @@
     <string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Isenzo sesibili kuphela esingakhethwa"</string>
     <string name="decoration_test_title" msgid="8450127046762442244">"Ukuhlolwa Kokuhlobisa"</string>
     <string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Izenzo Zesibili Nokuhlobisa"</string>
-    <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
-    <skip />
+    <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Umugqa Unezenzo Zesibili Nokuhlotshiswa ngesihloko eside kakhulu"</string>
     <string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Umugqa ungabuye ukhethwe"</string>
     <string name="secondary_action_toast" msgid="5076434693504006565">"Isenzo Sesibili Sikhethiwe"</string>
     <string name="row_primary_action_toast" msgid="756516694751965204">"Isenzo esiyinhloko somugqa sikhethiwe"</string>
diff --git a/compose/foundation/foundation/api/current.txt b/compose/foundation/foundation/api/current.txt
index c166a14..6c0ed18 100644
--- a/compose/foundation/foundation/api/current.txt
+++ b/compose/foundation/foundation/api/current.txt
@@ -110,11 +110,9 @@
   @SuppressCompatibility @androidx.compose.foundation.ExperimentalFoundationApi public final class ComposeFoundationFlags {
     property public final boolean DragGesturePickUpEnabled;
     property public final boolean NewNestedFlingPropagationEnabled;
-    property public final boolean RemoveBasicTextGraphicsLayerEnabled;
     field public static boolean DragGesturePickUpEnabled;
     field public static final androidx.compose.foundation.ComposeFoundationFlags INSTANCE;
     field public static boolean NewNestedFlingPropagationEnabled;
-    field public static boolean RemoveBasicTextGraphicsLayerEnabled;
   }
 
   public final class DarkThemeKt {
diff --git a/compose/foundation/foundation/api/restricted_current.txt b/compose/foundation/foundation/api/restricted_current.txt
index 61f6ee4..4aaf099 100644
--- a/compose/foundation/foundation/api/restricted_current.txt
+++ b/compose/foundation/foundation/api/restricted_current.txt
@@ -110,11 +110,9 @@
   @SuppressCompatibility @androidx.compose.foundation.ExperimentalFoundationApi public final class ComposeFoundationFlags {
     property public final boolean DragGesturePickUpEnabled;
     property public final boolean NewNestedFlingPropagationEnabled;
-    property public final boolean RemoveBasicTextGraphicsLayerEnabled;
     field public static boolean DragGesturePickUpEnabled;
     field public static final androidx.compose.foundation.ComposeFoundationFlags INSTANCE;
     field public static boolean NewNestedFlingPropagationEnabled;
-    field public static boolean RemoveBasicTextGraphicsLayerEnabled;
   }
 
   public final class DarkThemeKt {
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveCompositionCountTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveCompositionCountTest.kt
index f714583..1292d4a 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveCompositionCountTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveCompositionCountTest.kt
@@ -74,6 +74,93 @@
     }
 
     @Test
+    fun moveFocus_shouldCreateLimitedNumberOfItems() {
+        // Arrange.
+        val (rowSize, itemSize) = with(rule.density) { Pair(50.toDp(), 10.toDp()) }
+        lateinit var focusManager: FocusManager
+        rule.setContent {
+            focusManager = LocalFocusManager.current
+            LazyRow(Modifier.size(rowSize), state) {
+                items(100) { index ->
+                    Box(
+                        Modifier.size(itemSize)
+                            .testTag("$index")
+                            .then(if (index == 0 || index > 50) Modifier.focusable() else Modifier)
+                    )
+                    SideEffect { composedItems.add(index) }
+                }
+            }
+        }
+        rule.onNodeWithTag("0").requestFocus()
+        rule.runOnIdle { composedItems.clear() }
+
+        // Act.
+        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Right) }
+
+        // Assert we composed only up to visible item count * BeyondBoundsViewportFactor
+        // (10 in this case).
+        rule.runOnIdle {
+            assertThat(composedItems).containsExactly(5, 6, 7, 8, 9, 10, 11, 12, 13, 14)
+        }
+    }
+
+    @Test
+    fun moveFocus_shouldCreateLimitedNumberOfItems_largeItems() {
+        // Arrange.
+        val (rowSize, itemSize) = with(rule.density) { Pair(50.toDp(), 50.toDp()) }
+        lateinit var focusManager: FocusManager
+        rule.setContent {
+            focusManager = LocalFocusManager.current
+            LazyRow(Modifier.size(rowSize), state) {
+                items(100) { index ->
+                    Box(
+                        Modifier.size(itemSize)
+                            .testTag("$index")
+                            .then(if (index == 0 || index > 50) Modifier.focusable() else Modifier)
+                    )
+                    SideEffect { composedItems.add(index) }
+                }
+            }
+        }
+        rule.onNodeWithTag("0").requestFocus()
+        rule.runOnIdle { composedItems.clear() }
+
+        // Act.
+        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Right) }
+
+        // Assert we only compose visibleCount * BeyondBoundsViewportFactor items. (2 in this case).
+        rule.runOnIdle { assertThat(composedItems).containsExactly(1, 2) }
+    }
+
+    @Test
+    fun moveFocus_shouldCreateLimitedNumberOfItems_differentSizedItems() {
+        // Arrange.
+        val rowSize = with(rule.density) { 50.toDp() }
+        lateinit var focusManager: FocusManager
+        rule.setContent {
+            focusManager = LocalFocusManager.current
+            LazyRow(Modifier.size(rowSize), state) {
+                items(100) { index ->
+                    Box(
+                        Modifier.size(with(rule.density) { ((index % 10) * 10 + 10).toDp() })
+                            .testTag("$index")
+                            .then(if (index == 0 || index > 50) Modifier.focusable() else Modifier)
+                    )
+                    SideEffect { composedItems.add(index) }
+                }
+            }
+        }
+        rule.onNodeWithTag("0").requestFocus()
+        rule.runOnIdle { composedItems.clear() }
+
+        // Act.
+        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Right) }
+
+        // Assert we only compose visibleCount * BeyondBoundsViewportFactor items. (2 in this case).
+        rule.runOnIdle { assertThat(composedItems).containsExactly(3, 4, 5, 6) }
+    }
+
+    @Test
     fun moveFocus_nestedFocusable() {
         // Arrange.
         val (rowSize, itemSize) = with(rule.density) { Pair(50.toDp(), 10.toDp()) }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveTest.kt
index 0302ffa..9daa391 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveTest.kt
@@ -343,74 +343,101 @@
     }
 
     @Test
-    fun moveFocusToItemThatIsFarBeyondBounds() {
+    fun moveFocusToItemThatIsWithinOneViewport() {
         // Arrange.
         rule.setTestContent {
-            lazyList(30.dp, it, lazyListState) {
-                items(5) { FocusableBox(it) }
-                items(100) { Box(Modifier.size(10.dp)) }
-                item { FocusableBox(105) }
-                item { FocusableBox(106, initiallyFocused) }
-                item { FocusableBox(107) }
-                items(100) { Box(Modifier.size(10.dp)) }
-                items(5) { FocusableBox(it + 208) }
+            lazyList(100.dp, it, lazyListState) {
+                item { FocusableBox(0, initiallyFocused) }
+                items(6) { Box(Modifier.size(10.dp)) }
+                item { FocusableBox(7) }
             }
         }
         with(rule) {
             forEachParameter(ParamsToRun) { param ->
-                runOnIdle {
-                    // Scroll so that the focused item is in the middle.
-                    runBlocking { lazyListState.scrollToItem(105) }
-                    initiallyFocused.requestFocus()
-
-                    // Move focus to the last visible item.
-                    when (focusDirection) {
-                        Left,
-                        Right,
-                        Up,
-                        Down,
-                        Previous,
-                        Next -> focusManager.moveFocus(focusDirection)
-                        Enter,
-                        Exit -> {
-                            // Do nothing
-                        }
-                        else -> unsupportedDirection()
-                    }
-                }
+                runOnIdle { initiallyFocused.requestFocus() }
 
                 // Act.
-                val success = runOnIdle { focusManager.moveFocus(focusDirection) }
+                runOnIdle { focusManager.moveFocus(focusDirection) }
 
                 // Assert.
                 runOnIdle {
-                    assertThat(success).apply {
-                        if (focusDirection == Enter) isFalse() else isTrue()
-                    }
                     when (focusDirection) {
                         Left ->
                             when (param.layoutDirection) {
                                 Ltr ->
-                                    assertThat(isFocused[if (param.reverseLayout) 208 else 4])
+                                    assertThat(isFocused[if (param.reverseLayout) 7 else 0])
                                         .isTrue()
                                 Rtl ->
-                                    assertThat(isFocused[if (param.reverseLayout) 4 else 208])
+                                    assertThat(isFocused[if (param.reverseLayout) 0 else 7])
                                         .isTrue()
                             }
                         Right ->
                             when (param.layoutDirection) {
                                 Ltr ->
-                                    assertThat(isFocused[if (param.reverseLayout) 4 else 208])
+                                    assertThat(isFocused[if (param.reverseLayout) 0 else 7])
                                         .isTrue()
                                 Rtl ->
-                                    assertThat(isFocused[if (param.reverseLayout) 208 else 4])
+                                    assertThat(isFocused[if (param.reverseLayout) 7 else 0])
                                         .isTrue()
                             }
-                        Up -> assertThat(isFocused[if (param.reverseLayout) 208 else 4]).isTrue()
-                        Down -> assertThat(isFocused[if (param.reverseLayout) 4 else 208]).isTrue()
-                        Previous -> assertThat(isFocused[4]).isTrue()
-                        Next -> assertThat(isFocused[208]).isTrue()
-                        Enter -> assertThat(isFocused[106]).isTrue()
+                        Up -> assertThat(isFocused[if (param.reverseLayout) 7 else 0]).isTrue()
+                        Down -> assertThat(isFocused[if (param.reverseLayout) 0 else 7]).isTrue()
+                        Previous -> assertThat(isFocused[0]).isFalse()
+                        Next -> assertThat(isFocused[7]).isTrue()
+                        Enter -> assertThat(isFocused[0]).isTrue()
+                        Exit -> assertThat(isLazyListFocused).isTrue()
+                        else -> unsupportedDirection()
+                    }
+                }
+                runOnIdle { runBlocking { lazyListState.scrollToItem(0) } }
+                resetTestCase()
+            }
+        }
+    }
+
+    @Test
+    fun moveFocusToItemThatIsBeyondOneViewport() {
+        // Arrange.
+        rule.setTestContent {
+            lazyList(100.dp, it, lazyListState) {
+                item { FocusableBox(0, initiallyFocused) }
+                items(6) { Box(Modifier.size(10.dp)) }
+                item { FocusableBox(7) }
+            }
+        }
+        with(rule) {
+            forEachParameter(ParamsToRun) { param ->
+                runOnIdle { initiallyFocused.requestFocus() }
+
+                // Act.
+                runOnIdle { focusManager.moveFocus(focusDirection) }
+
+                // Assert.
+                runOnIdle {
+                    when (focusDirection) {
+                        Left ->
+                            when (param.layoutDirection) {
+                                Ltr ->
+                                    assertThat(isFocused[if (param.reverseLayout) 7 else 0])
+                                        .isTrue()
+                                Rtl ->
+                                    assertThat(isFocused[if (param.reverseLayout) 0 else 7])
+                                        .isTrue()
+                            }
+                        Right ->
+                            when (param.layoutDirection) {
+                                Rtl ->
+                                    assertThat(isFocused[if (param.reverseLayout) 7 else 0])
+                                        .isTrue()
+                                Ltr ->
+                                    assertThat(isFocused[if (param.reverseLayout) 0 else 7])
+                                        .isTrue()
+                            }
+                        Up -> assertThat(isFocused[if (param.reverseLayout) 7 else 0]).isTrue()
+                        Down -> assertThat(isFocused[if (param.reverseLayout) 0 else 7]).isTrue()
+                        Previous -> assertThat(isFocused[0]).isFalse()
+                        Next -> assertThat(isFocused[7]).isTrue()
+                        Enter -> assertThat(isFocused[0]).isTrue()
                         Exit -> assertThat(isLazyListFocused).isTrue()
                         else -> unsupportedDirection()
                     }
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Magnifier.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Magnifier.android.kt
index d8c9e95..45cee2f 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Magnifier.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Magnifier.android.kt
@@ -50,6 +50,7 @@
 import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.unit.toSize
+import kotlinx.coroutines.CoroutineStart
 import kotlinx.coroutines.channels.Channel
 import kotlinx.coroutines.launch
 
@@ -375,7 +376,8 @@
     override fun onAttach() {
         onObservedReadsChanged()
         drawSignalChannel = Channel()
-        coroutineScope.launch {
+        // Launch undispatched, otherwise we could miss the first draw signal
+        coroutineScope.launch(start = CoroutineStart.UNDISPATCHED) {
             while (true) {
                 drawSignalChannel?.receive()
                 // don't update the magnifier immediately, actual frame draw happens right after
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ComposeFoundationFlags.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ComposeFoundationFlags.kt
index 7cae901..e541fe3 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ComposeFoundationFlags.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ComposeFoundationFlags.kt
@@ -16,8 +16,6 @@
 
 package androidx.compose.foundation
 
-import androidx.compose.foundation.text.BasicText
-import androidx.compose.ui.graphics.graphicsLayer
 import kotlin.jvm.JvmField
 
 /**
@@ -66,16 +64,6 @@
     @Suppress("MutableBareField") @JvmField var NewNestedFlingPropagationEnabled = true
 
     /**
-     * We have removed the implicit [graphicsLayer] from [BasicText]. This also affects the `Text`
-     * composable in material modules.
-     *
-     * This change ideally improves the initial rendering performance of [BasicText] but it may have
-     * negative effect on recomposition or redraw since [BasicText]s draw operations would not be
-     * cached in a separate layer.
-     */
-    @JvmField @Suppress("MutableBareField") var RemoveBasicTextGraphicsLayerEnabled: Boolean = true
-
-    /**
      * Selecting flag to enable Drag Gesture "Pick-up" on drag gesture detectors. This also applies
      * to Draggables and Scrollables which use gesture detectors as well. Any parent drag detector
      * will continue to monitor the event stream until the gesture terminates (all pointers are
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListBeyondBoundsModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListBeyondBoundsModifier.kt
index 11d3c6b..a21b4e3 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListBeyondBoundsModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListBeyondBoundsModifier.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.foundation.lazy
 
+import androidx.compose.foundation.gestures.snapping.singleAxisViewportSize
 import androidx.compose.foundation.lazy.layout.LazyLayoutBeyondBoundsState
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
@@ -48,4 +49,11 @@
                 itemCount - 1,
                 state.layoutInfo.visibleItemsInfo.last().index + beyondBoundsItemCount
             )
+
+    override fun itemsPerViewport(): Int {
+        if (state.layoutInfo.visibleItemsInfo.isEmpty()) return 0
+        val viewportSize = state.layoutInfo.singleAxisViewportSize
+        val averageItemSize = state.layoutInfo.visibleItemsAverageSize()
+        return (viewportSize / averageItemSize).coerceAtLeast(1)
+    }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListLayoutInfo.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListLayoutInfo.kt
index eb2bf7f..fe338be 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListLayoutInfo.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListLayoutInfo.kt
@@ -19,6 +19,7 @@
 import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.internal.JvmDefaultWithCompatibility
 import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.util.fastSumBy
 
 /**
  * Contains useful information about the currently displayed layout state of lazy lists like
@@ -85,3 +86,9 @@
     val mainAxisItemSpacing: Int
         get() = 0
 }
+
+internal fun LazyListLayoutInfo.visibleItemsAverageSize(): Int {
+    val visibleItems = visibleItemsInfo
+    val itemsSum = visibleItems.fastSumBy { it.size }
+    return itemsSum / visibleItems.size + mainAxisItemSpacing
+}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListScrollScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListScrollScope.kt
index 812f04a..a945df0 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListScrollScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListScrollScope.kt
@@ -19,7 +19,6 @@
 import androidx.compose.foundation.gestures.ScrollScope
 import androidx.compose.foundation.lazy.layout.LazyLayoutScrollScope
 import androidx.compose.ui.util.fastFirstOrNull
-import androidx.compose.ui.util.fastSumBy
 
 /**
  * An implementation of [LazyLayoutScrollScope] that can be used with LazyLists. Please refer to the
@@ -54,7 +53,7 @@
             val layoutInfo = state.layoutInfo
             if (layoutInfo.visibleItemsInfo.isEmpty()) return 0
             return if (targetIndex !in firstVisibleItemIndex..lastVisibleItemIndex) {
-                val averageSize = calculateVisibleItemsAverageSize(layoutInfo)
+                val averageSize = layoutInfo.visibleItemsAverageSize()
                 val indexesDiff = targetIndex - firstVisibleItemIndex
                 (averageSize * indexesDiff) - firstVisibleItemScrollOffset
             } else {
@@ -63,11 +62,5 @@
                 visibleItem?.offset ?: 0
             } + targetOffset
         }
-
-        private fun calculateVisibleItemsAverageSize(layoutInfo: LazyListLayoutInfo): Int {
-            val visibleItems = layoutInfo.visibleItemsInfo
-            val itemsSum = visibleItems.fastSumBy { it.size }
-            return itemsSum / visibleItems.size + layoutInfo.mainAxisItemSpacing
-        }
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridBeyondBoundsModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridBeyondBoundsModifier.kt
index da43aa2..593597c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridBeyondBoundsModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridBeyondBoundsModifier.kt
@@ -16,6 +16,7 @@
 
 package androidx.compose.foundation.lazy.grid
 
+import androidx.compose.foundation.gestures.snapping.singleAxisViewportSize
 import androidx.compose.foundation.lazy.layout.LazyLayoutBeyondBoundsState
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember
@@ -40,4 +41,12 @@
 
     override val lastPlacedIndex: Int
         get() = state.layoutInfo.visibleItemsInfo.last().index
+
+    /** In grids this is lines per viewport */
+    override fun itemsPerViewport(): Int {
+        if (state.layoutInfo.visibleItemsInfo.isEmpty()) return 0
+        val viewportSize = state.layoutInfo.singleAxisViewportSize
+        val lineAverageSize = state.layoutInfo.visibleLinesAverageMainAxisSize()
+        return (viewportSize / lineAverageSize).coerceAtLeast(1)
+    }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfo.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfo.kt
index d971eab..bdff83b 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfo.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfo.kt
@@ -18,6 +18,7 @@
 
 import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.ui.unit.IntSize
+import kotlin.math.max
 
 /**
  * Contains useful information about the currently displayed layout state of lazy grids like
@@ -87,3 +88,45 @@
      */
     val maxSpan: Int
 }
+
+internal fun LazyGridLayoutInfo.visibleLinesAverageMainAxisSize(): Int {
+    val isVertical = orientation == Orientation.Vertical
+    val visibleItems = visibleItemsInfo
+    fun lineOf(index: Int): Int =
+        if (isVertical) visibleItemsInfo[index].row else visibleItemsInfo[index].column
+
+    var totalLinesMainAxisSize = 0
+    var linesCount = 0
+
+    var lineStartIndex = 0
+    while (lineStartIndex < visibleItems.size) {
+        val currentLine = lineOf(lineStartIndex)
+        if (currentLine == -1) {
+            // Filter out exiting items.
+            ++lineStartIndex
+            continue
+        }
+
+        var lineMainAxisSize = 0
+        var lineEndIndex = lineStartIndex
+        while (lineEndIndex < visibleItems.size && lineOf(lineEndIndex) == currentLine) {
+            lineMainAxisSize =
+                max(
+                    lineMainAxisSize,
+                    if (isVertical) {
+                        visibleItems[lineEndIndex].size.height
+                    } else {
+                        visibleItems[lineEndIndex].size.width
+                    }
+                )
+            ++lineEndIndex
+        }
+
+        totalLinesMainAxisSize += lineMainAxisSize
+        ++linesCount
+
+        lineStartIndex = lineEndIndex
+    }
+
+    return totalLinesMainAxisSize / linesCount + mainAxisItemSpacing
+}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScrollScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScrollScope.kt
index 7174f5c..81b5104 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScrollScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScrollScope.kt
@@ -20,7 +20,6 @@
 import androidx.compose.foundation.gestures.ScrollScope
 import androidx.compose.foundation.lazy.layout.LazyLayoutScrollScope
 import androidx.compose.ui.util.fastFirstOrNull
-import kotlin.math.max
 
 /**
  * An implementation of [LazyLayoutScrollScope] that can be used with LazyGrids.
@@ -55,7 +54,7 @@
             if (layoutInfo.visibleItemsInfo.isEmpty()) return 0
             return if (targetIndex !in firstVisibleItemIndex..lastVisibleItemIndex) {
                 val slotsPerLine = state.slotsPerLine
-                val averageLineMainAxisSize = calculateLineAverageMainAxisSize(layoutInfo)
+                val averageLineMainAxisSize = layoutInfo.visibleLinesAverageMainAxisSize()
                 val before = targetIndex < firstVisibleItemIndex
                 val linesDiff =
                     (targetIndex - firstVisibleItemIndex +
@@ -71,48 +70,5 @@
                 } ?: 0
             } + targetOffset
         }
-
-        private fun calculateLineAverageMainAxisSize(layoutInfo: LazyGridLayoutInfo): Int {
-            val isVertical = layoutInfo.orientation == Orientation.Vertical
-            val visibleItems = layoutInfo.visibleItemsInfo
-            val lineOf: (Int) -> Int = {
-                if (isVertical) visibleItems[it].row else visibleItems[it].column
-            }
-
-            var totalLinesMainAxisSize = 0
-            var linesCount = 0
-
-            var lineStartIndex = 0
-            while (lineStartIndex < visibleItems.size) {
-                val currentLine = lineOf(lineStartIndex)
-                if (currentLine == -1) {
-                    // Filter out exiting items.
-                    ++lineStartIndex
-                    continue
-                }
-
-                var lineMainAxisSize = 0
-                var lineEndIndex = lineStartIndex
-                while (lineEndIndex < visibleItems.size && lineOf(lineEndIndex) == currentLine) {
-                    lineMainAxisSize =
-                        max(
-                            lineMainAxisSize,
-                            if (isVertical) {
-                                visibleItems[lineEndIndex].size.height
-                            } else {
-                                visibleItems[lineEndIndex].size.width
-                            }
-                        )
-                    ++lineEndIndex
-                }
-
-                totalLinesMainAxisSize += lineMainAxisSize
-                ++linesCount
-
-                lineStartIndex = lineEndIndex
-            }
-
-            return totalLinesMainAxisSize / linesCount + layoutInfo.mainAxisItemSpacing
-        }
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal.kt
index 93084ad..de6de83 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal.kt
@@ -46,6 +46,9 @@
 /**
  * This modifier is used to measure and place additional items when the lazy layout receives a
  * request to layout items beyond the visible bounds.
+ *
+ * We will layout a limited number of items (currently the number of items in the viewport times a
+ * constant) so the focus search may give up if focusable items are too far apart.
  */
 internal fun Modifier.lazyLayoutBeyondBoundsModifier(
     state: LazyLayoutBeyondBoundsState,
@@ -146,12 +149,21 @@
             }
         var interval = beyondBoundsInfo.addInterval(startIndex, startIndex)
         var found: T? = null
-        while (found == null && interval.hasMoreContent(direction)) {
+        // Layout at most one viewport worth of items (times BeyondBoundsViewportFactor).
+        val maxItemsToLayout =
+            (BeyondBoundsViewportFactor * state.itemsPerViewport()).coerceAtMost(state.itemCount)
+        var itemsCreatedSoFar = 0
+        while (
+            found == null &&
+                interval.hasMoreContent(direction) &&
+                itemsCreatedSoFar < maxItemsToLayout
+        ) {
             // Add one extra beyond bounds item.
             interval =
                 addNextInterval(interval, direction).also {
                     beyondBoundsInfo.removeInterval(interval)
                 }
+            itemsCreatedSoFar++
             remeasureSync()
 
             // When we invoke this block, the beyond bounds items are present.
@@ -235,3 +247,5 @@
 
 private fun unsupportedDirection(): Nothing =
     error("Lazy list does not support beyond bounds layout for the specified direction")
+
+private const val BeyondBoundsViewportFactor = 2
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState.kt
index c0dbc69..1eaeccb 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState.kt
@@ -29,6 +29,8 @@
     val firstPlacedIndex: Int
 
     val lastPlacedIndex: Int
+
+    fun itemsPerViewport(): Int
 }
 
 @OptIn(ExperimentalFoundationApi::class)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridBeyondBoundsModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridBeyondBoundsModifier.kt
index c29f54c..36c72d4 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridBeyondBoundsModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridBeyondBoundsModifier.kt
@@ -42,4 +42,11 @@
 
     override val lastPlacedIndex: Int
         get() = state.layoutInfo.visibleItemsInfo.last().index
+
+    override fun itemsPerViewport(): Int {
+        if (state.layoutInfo.visibleItemsInfo.isEmpty()) return 0
+        val viewportSize = state.layoutInfo.singleAxisViewportSize
+        val lineAverageSize = state.layoutInfo.visibleItemsAverageSize()
+        return (viewportSize / lineAverageSize).coerceAtLeast(1)
+    }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt
index 85ec1fc..c62ec47 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt
@@ -24,6 +24,7 @@
 import androidx.compose.ui.unit.IntOffset
 import androidx.compose.ui.unit.IntSize
 import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastSumBy
 import kotlin.coroutines.EmptyCoroutineContext
 import kotlinx.coroutines.CoroutineScope
 
@@ -271,3 +272,25 @@
         scrollBackAmount = 0f,
         coroutineScope = CoroutineScope(EmptyCoroutineContext)
     )
+
+internal fun LazyStaggeredGridLayoutInfo.visibleItemsAverageSize(): Int {
+    val visibleItems = visibleItemsInfo
+    if (visibleItems.isEmpty()) return 0
+    val itemSizeSum =
+        visibleItems.fastSumBy {
+            if (orientation == Orientation.Vertical) {
+                it.size.height
+            } else {
+                it.size.width
+            }
+        }
+    return itemSizeSum / visibleItems.size + mainAxisItemSpacing
+}
+
+internal val LazyStaggeredGridLayoutInfo.singleAxisViewportSize: Int
+    get() =
+        if (orientation == Orientation.Vertical) {
+            viewportSize.height
+        } else {
+            viewportSize.width
+        }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollScope.kt
index c0ed4b2..aa6e2e1 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollScope.kt
@@ -20,7 +20,6 @@
 import androidx.compose.foundation.gestures.ScrollScope
 import androidx.compose.foundation.lazy.layout.LazyLayoutScrollScope
 import androidx.compose.ui.util.fastFirstOrNull
-import androidx.compose.ui.util.fastSumBy
 
 /**
  * An implementation of [LazyLayoutScrollScope] that can be used with LazyStaggeredGrids.
@@ -60,8 +59,7 @@
             val visibleItem =
                 layoutInfo.visibleItemsInfo.fastFirstOrNull { it.index == targetIndex }
             return if (visibleItem == null) {
-                val averageMainAxisItemSize = calculateVisibleItemsAverageSize(layoutInfo)
-
+                val averageMainAxisItemSize = layoutInfo.visibleItemsAverageSize()
                 val laneCount = state.laneCount
                 val lineDiff = targetIndex / laneCount - firstVisibleItemIndex / laneCount
                 averageMainAxisItemSize * lineDiff - firstVisibleItemScrollOffset
@@ -73,18 +71,5 @@
                 }
             } + targetOffset
         }
-
-        private fun calculateVisibleItemsAverageSize(layoutInfo: LazyStaggeredGridLayoutInfo): Int {
-            val visibleItems = layoutInfo.visibleItemsInfo
-            val itemSizeSum =
-                visibleItems.fastSumBy {
-                    if (layoutInfo.orientation == Orientation.Vertical) {
-                        it.size.height
-                    } else {
-                        it.size.width
-                    }
-                }
-            return itemSizeSum / visibleItems.size + layoutInfo.mainAxisItemSpacing
-        }
     }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerBeyondBoundsModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerBeyondBoundsModifier.kt
index 0be75d97..7d37386 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerBeyondBoundsModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerBeyondBoundsModifier.kt
@@ -49,4 +49,12 @@
                 itemCount - 1,
                 state.layoutInfo.visiblePagesInfo.last().index + beyondViewportPageCount
             )
+
+    override fun itemsPerViewport(): Int {
+        val visibleItemCount = state.layoutInfo.visiblePagesInfo.size
+        if (visibleItemCount == 0) return 0
+        val viewportSize = state.layoutInfo.mainAxisViewportSize
+        val averageItemSize = state.layoutInfo.pageSize + state.layoutInfo.pageSpacing
+        return (viewportSize / averageItemSize).coerceAtLeast(1)
+    }
 }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicText.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicText.kt
index 56e2025..372f73d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicText.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicText.kt
@@ -16,8 +16,6 @@
 
 package androidx.compose.foundation.text
 
-import androidx.compose.foundation.ComposeFoundationFlags
-import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.text.modifiers.SelectableTextAnnotatedStringElement
 import androidx.compose.foundation.text.modifiers.SelectionController
 import androidx.compose.foundation.text.modifiers.TextAnnotatedStringElement
@@ -39,7 +37,6 @@
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Rect
 import androidx.compose.ui.graphics.ColorProducer
-import androidx.compose.ui.graphics.graphicsLayer
 import androidx.compose.ui.layout.Layout
 import androidx.compose.ui.layout.Measurable
 import androidx.compose.ui.layout.MeasurePolicy
@@ -119,26 +116,24 @@
         }
     val finalModifier =
         if (selectionController != null || onTextLayout != null) {
-            modifier
-                .optionalGraphicsLayer()
-                .textModifier(
-                    AnnotatedString(text = text),
-                    style = style,
-                    onTextLayout = onTextLayout,
-                    overflow = overflow,
-                    softWrap = softWrap,
-                    maxLines = maxLines,
-                    minLines = minLines,
-                    fontFamilyResolver = LocalFontFamilyResolver.current,
-                    placeholders = null,
-                    onPlaceholderLayout = null,
-                    selectionController = selectionController,
-                    color = color,
-                    onShowTranslation = null,
-                    autoSize = requireAutoSizeInternalImplementationOrNull(autoSize)
-                )
+            modifier.textModifier(
+                AnnotatedString(text = text),
+                style = style,
+                onTextLayout = onTextLayout,
+                overflow = overflow,
+                softWrap = softWrap,
+                maxLines = maxLines,
+                minLines = minLines,
+                fontFamilyResolver = LocalFontFamilyResolver.current,
+                placeholders = null,
+                onPlaceholderLayout = null,
+                selectionController = selectionController,
+                color = color,
+                onShowTranslation = null,
+                autoSize = requireAutoSizeInternalImplementationOrNull(autoSize)
+            )
         } else {
-            modifier.optionalGraphicsLayer() then
+            modifier then
                 TextStringSimpleElement(
                     text = text,
                     style = style,
@@ -218,24 +213,22 @@
         // this is the same as text: String, use all the early exits
         Layout(
             modifier =
-                modifier
-                    .optionalGraphicsLayer()
-                    .textModifier(
-                        text = text,
-                        style = style,
-                        onTextLayout = onTextLayout,
-                        overflow = overflow,
-                        softWrap = softWrap,
-                        maxLines = maxLines,
-                        minLines = minLines,
-                        fontFamilyResolver = LocalFontFamilyResolver.current,
-                        placeholders = null,
-                        onPlaceholderLayout = null,
-                        selectionController = selectionController,
-                        color = color,
-                        onShowTranslation = null,
-                        autoSize = requireAutoSizeInternalImplementationOrNull(autoSize)
-                    ),
+                modifier.textModifier(
+                    text = text,
+                    style = style,
+                    onTextLayout = onTextLayout,
+                    overflow = overflow,
+                    softWrap = softWrap,
+                    maxLines = maxLines,
+                    minLines = minLines,
+                    fontFamilyResolver = LocalFontFamilyResolver.current,
+                    placeholders = null,
+                    onPlaceholderLayout = null,
+                    selectionController = selectionController,
+                    color = color,
+                    onShowTranslation = null,
+                    autoSize = requireAutoSizeInternalImplementationOrNull(autoSize)
+                ),
             EmptyMeasurePolicy
         )
     } else {
@@ -672,27 +665,25 @@
             inlineComposables?.let { InlineChildren(text = text, inlineContents = it) }
         },
         modifier =
-            modifier
-                .optionalGraphicsLayer()
-                .textModifier(
-                    text = styledText(),
-                    style = style,
-                    onTextLayout = {
-                        textScope?.textLayoutResult = it
-                        onTextLayout?.invoke(it)
-                    },
-                    overflow = overflow,
-                    softWrap = softWrap,
-                    maxLines = maxLines,
-                    minLines = minLines,
-                    fontFamilyResolver = fontFamilyResolver,
-                    placeholders = placeholders,
-                    onPlaceholderLayout = onPlaceholderLayout,
-                    selectionController = selectionController,
-                    color = color,
-                    onShowTranslation = onShowTranslation,
-                    autoSize = autoSize
-                ),
+            modifier.textModifier(
+                text = styledText(),
+                style = style,
+                onTextLayout = {
+                    textScope?.textLayoutResult = it
+                    onTextLayout?.invoke(it)
+                },
+                overflow = overflow,
+                softWrap = softWrap,
+                maxLines = maxLines,
+                minLines = minLines,
+                fontFamilyResolver = fontFamilyResolver,
+                placeholders = placeholders,
+                onPlaceholderLayout = onPlaceholderLayout,
+                selectionController = selectionController,
+                color = color,
+                onShowTranslation = onShowTranslation,
+                autoSize = autoSize
+            ),
         measurePolicy =
             if (!hasInlineContent) {
                 LinksTextMeasurePolicy(
@@ -708,18 +699,6 @@
 }
 
 /**
- * Applies a full [graphicsLayer] modifier only if the associated flag
- * [ComposeFoundationFlags.RemoveBasicTextGraphicsLayerEnabled] is disabled.
- */
-@OptIn(ExperimentalFoundationApi::class)
-private fun Modifier.optionalGraphicsLayer() =
-    if (ComposeFoundationFlags.RemoveBasicTextGraphicsLayerEnabled) {
-        this
-    } else {
-        this.graphicsLayer()
-    }
-
-/**
  * [AutoSize], our public type, is a sealed interface. Our internal representation is not sealed.
  * This is an extra validity check to ensure we are receiving the correct type; in practice it
  * should never happen.
diff --git a/compose/material3/material3/api/current.txt b/compose/material3/material3/api/current.txt
index 69ea89f..84aafba 100644
--- a/compose/material3/material3/api/current.txt
+++ b/compose/material3/material3/api/current.txt
@@ -702,11 +702,6 @@
     field public static final androidx.compose.material3.DefaultNavigationBarComponentOverride INSTANCE;
   }
 
-  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public final class DefaultNavigationBarItemComponentOverride implements androidx.compose.material3.NavigationBarItemComponentOverride {
-    method @androidx.compose.runtime.Composable public void NavigationBarItem(androidx.compose.material3.NavigationBarItemComponentOverrideContext);
-    field public static final androidx.compose.material3.DefaultNavigationBarItemComponentOverride INSTANCE;
-  }
-
   @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public final class DefaultNavigationRailComponentOverride implements androidx.compose.material3.NavigationRailComponentOverride {
     method @androidx.compose.runtime.Composable public void NavigationRail(androidx.compose.material3.NavigationRailComponentOverrideContext);
     field public static final androidx.compose.material3.DefaultNavigationRailComponentOverride INSTANCE;
@@ -1541,31 +1536,6 @@
     property public final long unselectedTextColor;
   }
 
-  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public interface NavigationBarItemComponentOverride {
-    method @androidx.compose.runtime.Composable public void NavigationBarItem(androidx.compose.material3.NavigationBarItemComponentOverrideContext);
-  }
-
-  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public final class NavigationBarItemComponentOverrideContext implements androidx.compose.foundation.layout.RowScope {
-    method public androidx.compose.material3.NavigationBarItemColors getColors();
-    method public kotlin.jvm.functions.Function0<kotlin.Unit> getIcon();
-    method public androidx.compose.foundation.interaction.MutableInteractionSource? getInteractionSource();
-    method public kotlin.jvm.functions.Function0<kotlin.Unit>? getLabel();
-    method public androidx.compose.ui.Modifier getModifier();
-    method public kotlin.jvm.functions.Function0<kotlin.Unit> getOnClick();
-    method public boolean getShouldAlwaysShowLabel();
-    method public boolean isEnabled();
-    method public boolean isSelected();
-    property public final androidx.compose.material3.NavigationBarItemColors colors;
-    property public final kotlin.jvm.functions.Function0<kotlin.Unit> icon;
-    property public final androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource;
-    property public final boolean isEnabled;
-    property public final boolean isSelected;
-    property public final kotlin.jvm.functions.Function0<kotlin.Unit>? label;
-    property public final androidx.compose.ui.Modifier modifier;
-    property public final kotlin.jvm.functions.Function0<kotlin.Unit> onClick;
-    property public final boolean shouldAlwaysShowLabel;
-  }
-
   public final class NavigationBarItemDefaults {
     method @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationBarItemColors colors();
     method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationBarItemColors colors(optional long selectedIconColor, optional long selectedTextColor, optional long indicatorColor, optional long unselectedIconColor, optional long unselectedTextColor);
@@ -1577,9 +1547,7 @@
     method @androidx.compose.runtime.Composable public static void NavigationBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void NavigationBarItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.material3.NavigationBarItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource);
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.NavigationBarComponentOverride> getLocalNavigationBarComponentOverride();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.NavigationBarItemComponentOverride> getLocalNavigationBarItemComponentOverride();
     property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.NavigationBarComponentOverride> LocalNavigationBarComponentOverride;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.NavigationBarItemComponentOverride> LocalNavigationBarItemComponentOverride;
   }
 
   @androidx.compose.runtime.Stable public interface NavigationDrawerItemColors {
diff --git a/compose/material3/material3/api/restricted_current.txt b/compose/material3/material3/api/restricted_current.txt
index 69ea89f..84aafba 100644
--- a/compose/material3/material3/api/restricted_current.txt
+++ b/compose/material3/material3/api/restricted_current.txt
@@ -702,11 +702,6 @@
     field public static final androidx.compose.material3.DefaultNavigationBarComponentOverride INSTANCE;
   }
 
-  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public final class DefaultNavigationBarItemComponentOverride implements androidx.compose.material3.NavigationBarItemComponentOverride {
-    method @androidx.compose.runtime.Composable public void NavigationBarItem(androidx.compose.material3.NavigationBarItemComponentOverrideContext);
-    field public static final androidx.compose.material3.DefaultNavigationBarItemComponentOverride INSTANCE;
-  }
-
   @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public final class DefaultNavigationRailComponentOverride implements androidx.compose.material3.NavigationRailComponentOverride {
     method @androidx.compose.runtime.Composable public void NavigationRail(androidx.compose.material3.NavigationRailComponentOverrideContext);
     field public static final androidx.compose.material3.DefaultNavigationRailComponentOverride INSTANCE;
@@ -1541,31 +1536,6 @@
     property public final long unselectedTextColor;
   }
 
-  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public interface NavigationBarItemComponentOverride {
-    method @androidx.compose.runtime.Composable public void NavigationBarItem(androidx.compose.material3.NavigationBarItemComponentOverrideContext);
-  }
-
-  @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public final class NavigationBarItemComponentOverrideContext implements androidx.compose.foundation.layout.RowScope {
-    method public androidx.compose.material3.NavigationBarItemColors getColors();
-    method public kotlin.jvm.functions.Function0<kotlin.Unit> getIcon();
-    method public androidx.compose.foundation.interaction.MutableInteractionSource? getInteractionSource();
-    method public kotlin.jvm.functions.Function0<kotlin.Unit>? getLabel();
-    method public androidx.compose.ui.Modifier getModifier();
-    method public kotlin.jvm.functions.Function0<kotlin.Unit> getOnClick();
-    method public boolean getShouldAlwaysShowLabel();
-    method public boolean isEnabled();
-    method public boolean isSelected();
-    property public final androidx.compose.material3.NavigationBarItemColors colors;
-    property public final kotlin.jvm.functions.Function0<kotlin.Unit> icon;
-    property public final androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource;
-    property public final boolean isEnabled;
-    property public final boolean isSelected;
-    property public final kotlin.jvm.functions.Function0<kotlin.Unit>? label;
-    property public final androidx.compose.ui.Modifier modifier;
-    property public final kotlin.jvm.functions.Function0<kotlin.Unit> onClick;
-    property public final boolean shouldAlwaysShowLabel;
-  }
-
   public final class NavigationBarItemDefaults {
     method @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationBarItemColors colors();
     method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationBarItemColors colors(optional long selectedIconColor, optional long selectedTextColor, optional long indicatorColor, optional long unselectedIconColor, optional long unselectedTextColor);
@@ -1577,9 +1547,7 @@
     method @androidx.compose.runtime.Composable public static void NavigationBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
     method @androidx.compose.runtime.Composable public static void NavigationBarItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.material3.NavigationBarItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource);
     method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.NavigationBarComponentOverride> getLocalNavigationBarComponentOverride();
-    method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.NavigationBarItemComponentOverride> getLocalNavigationBarItemComponentOverride();
     property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.NavigationBarComponentOverride> LocalNavigationBarComponentOverride;
-    property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.NavigationBarItemComponentOverride> LocalNavigationBarItemComponentOverride;
   }
 
   @androidx.compose.runtime.Stable public interface NavigationDrawerItemColors {
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SplitButtonTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SplitButtonTest.kt
index e11e8ad..1029be4 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SplitButtonTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SplitButtonTest.kt
@@ -20,28 +20,38 @@
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.outlined.Edit
 import androidx.compose.material.icons.outlined.KeyboardArrowDown
+import androidx.compose.material3.SplitButtonDefaults.InnerCornerSize
+import androidx.compose.material3.SplitButtonDefaults.OuterCornerSize
+import androidx.compose.material3.tokens.SplitButtonSmallTokens
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.layout.layout
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.testTag
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.semantics.semantics
 import androidx.compose.ui.test.SemanticsMatcher
 import androidx.compose.ui.test.assert
 import androidx.compose.ui.test.assertHasClickAction
 import androidx.compose.ui.test.assertIsDisplayed
 import androidx.compose.ui.test.assertIsEnabled
+import androidx.compose.ui.test.assertIsEqualTo
 import androidx.compose.ui.test.assertIsNotEnabled
 import androidx.compose.ui.test.assertIsOff
 import androidx.compose.ui.test.assertIsOn
+import androidx.compose.ui.test.getUnclippedBoundsInRoot
 import androidx.compose.ui.test.isToggleable
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithContentDescription
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.onNodeWithText
 import androidx.compose.ui.test.performClick
+import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.dp
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
@@ -303,4 +313,96 @@
         rule.onNodeWithContentDescription("Leading Icon").assertIsDisplayed()
         rule.onNodeWithContentDescription("Trailing Icon").assertIsDisplayed()
     }
+
+    @Test
+    fun FilledSplitButton_contentPadding() {
+        lateinit var density: Density
+        var trailingButtonSize by mutableStateOf(Size(0f, 0f))
+
+        rule.setMaterialContent(lightColorScheme()) {
+            density = LocalDensity.current
+            SplitButtonLayout(
+                leadingButton = {
+                    SplitButtonDefaults.LeadingButton(
+                        onClick = { /* Do Nothing */ },
+                        modifier = Modifier.testTag("leading button"),
+                        enabled = false
+                    ) {
+                        Text(
+                            "My Button",
+                            modifier =
+                                Modifier.testTag(TextTag).semantics(mergeDescendants = true) {}
+                        )
+                    }
+                },
+                trailingButton = {
+                    SplitButtonDefaults.TrailingButton(
+                        onCheckedChange = {},
+                        checked = false,
+                        modifier =
+                            Modifier.layout { measurable, constraints ->
+                                    val placeable = measurable.measure(constraints)
+                                    val width = placeable.width
+                                    val height = placeable.height
+                                    trailingButtonSize = Size(width.toFloat(), height.toFloat())
+                                    layout(width, height) { placeable.place(0, 0) }
+                                }
+                                .testTag("trailing button"),
+                        enabled = false,
+                    ) {
+                        Icon(
+                            Icons.Outlined.KeyboardArrowDown,
+                            contentDescription = "Trailing Icon",
+                            modifier =
+                                Modifier.testTag(IconTag).semantics(mergeDescendants = true) {}
+                        )
+                    }
+                }
+            )
+        }
+
+        val trailingButtonTopStartPx = InnerCornerSize.toPx(trailingButtonSize, density)
+        val trailingButtonTopEndPx = OuterCornerSize.toPx(trailingButtonSize, density) / 2
+
+        val paddingPxCorrection =
+            CenterOpticallyCoefficient * (trailingButtonTopStartPx - trailingButtonTopEndPx)
+
+        val expectedTrailingButtonStartPadding =
+            with(density) {
+                SplitButtonSmallTokens.TrailingButtonLeadingSpace + paddingPxCorrection.toDp()
+            }
+
+        val expectedTrailingButtonEndPadding =
+            with(density) {
+                SplitButtonSmallTokens.TrailingButtonTrailingSpace - paddingPxCorrection.toDp()
+            }
+
+        val leadingButtonBounds = rule.onNodeWithTag("leading button").getUnclippedBoundsInRoot()
+
+        val textBounds = rule.onNodeWithTag(TextTag).getUnclippedBoundsInRoot()
+
+        val trailingButtonBounds = rule.onNodeWithTag("trailing button").getUnclippedBoundsInRoot()
+
+        val iconBounds = rule.onNodeWithTag(IconTag).getUnclippedBoundsInRoot()
+
+        (textBounds.left - leadingButtonBounds.left).assertIsEqualTo(
+            SplitButtonSmallTokens.LeadingButtonLeadingSpace,
+            "start padding for leading button"
+        )
+        (leadingButtonBounds.right - textBounds.right).assertIsEqualTo(
+            SplitButtonSmallTokens.LeadingButtonTrailingSpace,
+            "end padding for leading button"
+        )
+        (iconBounds.left - trailingButtonBounds.left).assertIsEqualTo(
+            expectedTrailingButtonStartPadding,
+            "start padding for trailing button"
+        )
+        (trailingButtonBounds.right - iconBounds.right).assertIsEqualTo(
+            expectedTrailingButtonEndPadding,
+            "end padding for trailing button"
+        )
+    }
 }
+
+private const val TextTag = "text tag"
+private const val IconTag = "icon tag"
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
index 286b0150..de92be1 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
@@ -2226,18 +2226,19 @@
             ): Offset {
                 if (!canScroll()) return Offset.Zero
                 state.contentOffset += consumed.y
-                if (state.heightOffset == 0f || state.heightOffset == state.heightOffsetLimit) {
-                    if (consumed.y == 0f && available.y > 0f) {
-                        // Reset the total content offset to zero when scrolling all the way down.
-                        // This will eliminate some float precision inaccuracies.
-                        state.contentOffset = 0f
-                    }
-                }
                 state.heightOffset = state.heightOffset + consumed.y
                 return Offset.Zero
             }
 
             override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+                if (
+                    available.y > 0f &&
+                        (state.heightOffset == 0f || state.heightOffset == state.heightOffsetLimit)
+                ) {
+                    // Reset the total content offset to zero when scrolling all the way down.
+                    // This will eliminate some float precision inaccuracies.
+                    state.contentOffset = 0f
+                }
                 val superConsumed = super.onPostFling(consumed, available)
                 return superConsumed +
                     settleAppBarBottom(state, available.y, flingAnimationSpec, snapAnimationSpec)
@@ -2837,14 +2838,17 @@
                 source: NestedScrollSource
             ): Offset {
                 if (!canScroll()) return Offset.Zero
-                if (consumed.y == 0f && available.y > 0f) {
+                state.contentOffset += consumed.y
+                return Offset.Zero
+            }
+
+            override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+                if (available.y > 0f) {
                     // Reset the total content offset to zero when scrolling all the way down.
                     // This will eliminate some float precision inaccuracies.
                     state.contentOffset = 0f
-                } else {
-                    state.contentOffset += consumed.y
                 }
-                return Offset.Zero
+                return super.onPostFling(consumed, available)
             }
         }
 }
@@ -2904,18 +2908,19 @@
             ): Offset {
                 if (!canScroll()) return Offset.Zero
                 state.contentOffset += consumed.y
-                if (state.heightOffset == 0f || state.heightOffset == state.heightOffsetLimit) {
-                    if (consumed.y == 0f && available.y > 0f) {
-                        // Reset the total content offset to zero when scrolling all the way down.
-                        // This will eliminate some float precision inaccuracies.
-                        state.contentOffset = 0f
-                    }
-                }
                 if (!reverseLayout) state.heightOffset += consumed.y
                 return Offset.Zero
             }
 
             override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+                if (
+                    available.y > 0f &&
+                        (state.heightOffset == 0f || state.heightOffset == state.heightOffsetLimit)
+                ) {
+                    // Reset the total content offset to zero when scrolling all the way down.
+                    // This will eliminate some float precision inaccuracies.
+                    state.contentOffset = 0f
+                }
                 val superConsumed = super.onPostFling(consumed, available)
                 return superConsumed +
                     settleAppBar(state, available.y, flingAnimationSpec, snapAnimationSpec)
@@ -2980,12 +2985,6 @@
                     return Offset(0f, state.heightOffset - oldHeightOffset)
                 }
 
-                if (consumed.y == 0f && available.y > 0) {
-                    // Reset the total content offset to zero when scrolling all the way down. This
-                    // will eliminate some float precision inaccuracies.
-                    state.contentOffset = 0f
-                }
-
                 if (available.y > 0f) {
                     // Adjust the height offset in case the consumed delta Y is less than what was
                     // recorded as available delta Y in the pre-scroll.
@@ -2997,6 +2996,11 @@
             }
 
             override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+                if (available.y > 0) {
+                    // Reset the total content offset to zero when scrolling all the way down. This
+                    // will eliminate some float precision inaccuracies.
+                    state.contentOffset = 0f
+                }
                 val superConsumed = super.onPostFling(consumed, available)
                 return superConsumed +
                     settleAppBar(state, available.y, flingAnimationSpec, snapAnimationSpec)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
index 659ea38..8c95113 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
@@ -165,7 +165,6 @@
  *   preview the item in different states. Note that if `null` is provided, interactions will still
  *   happen internally.
  */
-@OptIn(ExperimentalMaterial3Api::class)
 @Composable
 fun RowScope.NavigationBarItem(
     selected: Boolean,
@@ -178,20 +177,117 @@
     colors: NavigationBarItemColors = NavigationBarItemDefaults.colors(),
     interactionSource: MutableInteractionSource? = null
 ) {
-    val context =
-        NavigationBarItemComponentOverrideContext(
-            isSelected = selected,
-            onClick = onClick,
-            icon = icon,
-            modifier = modifier,
-            isEnabled = enabled,
-            label = label,
-            shouldAlwaysShowLabel = alwaysShowLabel,
-            colors = colors,
-            interactionSource = interactionSource,
-            scope = this
+    @Suppress("NAME_SHADOWING")
+    val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
+    // TODO Load the motionScheme tokens from the component tokens file
+    val colorAnimationSpec = MotionSchemeKeyTokens.DefaultEffects.value<Color>()
+    val styledIcon =
+        @Composable {
+            val iconColor by
+                animateColorAsState(
+                    targetValue = colors.iconColor(selected = selected, enabled = enabled),
+                    animationSpec = colorAnimationSpec
+                )
+            // If there's a label, don't have a11y services repeat the icon description.
+            val clearSemantics = label != null && (alwaysShowLabel || selected)
+            Box(modifier = if (clearSemantics) Modifier.clearAndSetSemantics {} else Modifier) {
+                CompositionLocalProvider(LocalContentColor provides iconColor, content = icon)
+            }
+        }
+
+    val styledLabel: @Composable (() -> Unit)? =
+        label?.let {
+            @Composable {
+                val style = NavigationBarTokens.LabelTextFont.value
+                val textColor by
+                    animateColorAsState(
+                        targetValue = colors.textColor(selected = selected, enabled = enabled),
+                        animationSpec = colorAnimationSpec
+                    )
+                ProvideContentColorTextStyle(
+                    contentColor = textColor,
+                    textStyle = style,
+                    content = label
+                )
+            }
+        }
+
+    var itemWidth by remember { mutableIntStateOf(0) }
+
+    Box(
+        modifier
+            .selectable(
+                selected = selected,
+                onClick = onClick,
+                enabled = enabled,
+                role = Role.Tab,
+                interactionSource = interactionSource,
+                indication = null,
+            )
+            .defaultMinSize(minHeight = NavigationBarHeight)
+            .weight(1f)
+            .onSizeChanged { itemWidth = it.width },
+        contentAlignment = Alignment.Center,
+        propagateMinConstraints = true,
+    ) {
+        val alphaAnimationProgress: State<Float> =
+            animateFloatAsState(
+                targetValue = if (selected) 1f else 0f,
+                // TODO Load the motionScheme tokens from the component tokens file
+                animationSpec = MotionSchemeKeyTokens.DefaultEffects.value()
+            )
+        val sizeAnimationProgress: State<Float> =
+            animateFloatAsState(
+                targetValue = if (selected) 1f else 0f,
+                // TODO Load the motionScheme tokens from the component tokens file
+                animationSpec = MotionSchemeKeyTokens.FastSpatial.value()
+            )
+        // The entire item is selectable, but only the indicator pill shows the ripple. To achieve
+        // this, we re-map the coordinates of the item's InteractionSource into the coordinates of
+        // the indicator.
+        val deltaOffset: Offset
+        with(LocalDensity.current) {
+            val indicatorWidth = NavigationBarVerticalItemTokens.ActiveIndicatorWidth.roundToPx()
+            deltaOffset =
+                Offset((itemWidth - indicatorWidth).toFloat() / 2, IndicatorVerticalOffset.toPx())
+        }
+        val offsetInteractionSource =
+            remember(interactionSource, deltaOffset) {
+                MappedInteractionSource(interactionSource, deltaOffset)
+            }
+
+        // The indicator has a width-expansion animation which interferes with the timing of the
+        // ripple, which is why they are separate composables
+        val indicatorRipple =
+            @Composable {
+                Box(
+                    Modifier.layoutId(IndicatorRippleLayoutIdTag)
+                        .clip(NavigationBarTokens.ItemActiveIndicatorShape.value)
+                        .indication(offsetInteractionSource, ripple())
+                )
+            }
+        val indicator =
+            @Composable {
+                Box(
+                    Modifier.layoutId(IndicatorLayoutIdTag)
+                        .graphicsLayer { alpha = alphaAnimationProgress.value }
+                        .background(
+                            color = colors.indicatorColor,
+                            shape = NavigationBarTokens.ItemActiveIndicatorShape.value,
+                        )
+                )
+            }
+
+        NavigationBarItemLayout(
+            indicatorRipple = indicatorRipple,
+            indicator = indicator,
+            icon = styledIcon,
+            label = styledLabel,
+            alwaysShowLabel = alwaysShowLabel,
+            alphaAnimationProgress = { alphaAnimationProgress.value },
+            sizeAnimationProgress = { sizeAnimationProgress.value }
         )
-    with(LocalNavigationBarItemComponentOverride.current) { context.NavigationBarItem() }
+    }
 }
 
 /** Defaults used in [NavigationBar]. */
@@ -637,187 +733,6 @@
 
 private val IndicatorVerticalOffset: Dp = 12.dp
 
-/* Interface that allows libraries to override the behavior of the [NavigationBarItem] component. */
-@ExperimentalMaterial3Api
-interface NavigationBarItemComponentOverride {
-    /** Behavior function that is called by the [NavigationBarItem] component. */
-    @Composable fun NavigationBarItemComponentOverrideContext.NavigationBarItem()
-}
-
-/**
- * Parameters available to [NavigationBarItem].
- *
- * @param isSelected whether this item is selected
- * @param onClick called when this item is clicked
- * @param icon icon for this item, typically an [Icon]
- * @param modifier the [Modifier] to be applied to this item
- * @param isEnabled controls the enabled state of this item. When `false`, this component will not
- *   respond to user input, and it will appear visually disabled and disabled to accessibility
- *   services.
- * @param label optional text label for this item
- * @param shouldAlwaysShowLabel whether to always show the label for this item. If `false`, the
- *   label will only be shown when this item is selected.
- * @param colors [NavigationBarItemColors] that will be used to resolve the colors used for this
- *   item in different states. See [NavigationBarItemDefaults.colors].
- * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- *   emitting [Interaction]s for this item. You can use this to change the item's appearance or
- *   preview the item in different states. Note that if `null` is provided, interactions will still
- *   happen internally.
- */
-@ExperimentalMaterial3Api
-class NavigationBarItemComponentOverrideContext
-internal constructor(
-    val isSelected: Boolean,
-    val onClick: () -> Unit,
-    val icon: @Composable () -> Unit,
-    val modifier: Modifier,
-    val isEnabled: Boolean,
-    val label: @Composable (() -> Unit)?,
-    val shouldAlwaysShowLabel: Boolean,
-    val colors: NavigationBarItemColors,
-    val interactionSource: MutableInteractionSource?,
-    scope: RowScope
-) : RowScope by scope
-
-/** [NavigationBarItemComponentOverride] used when no override is specified. */
-@ExperimentalMaterial3Api
-object DefaultNavigationBarItemComponentOverride : NavigationBarItemComponentOverride {
-    @Composable
-    override fun NavigationBarItemComponentOverrideContext.NavigationBarItem() {
-        @Suppress("NAME_SHADOWING")
-        val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
-        // TODO Load the motionScheme tokens from the component tokens file
-        val colorAnimationSpec = MotionSchemeKeyTokens.DefaultEffects.value<Color>()
-        val styledIcon =
-            @Composable {
-                val iconColor by
-                    animateColorAsState(
-                        targetValue = colors.iconColor(selected = isSelected, enabled = isEnabled),
-                        animationSpec = colorAnimationSpec
-                    )
-                // If there's a label, don't have a11y services repeat the icon description.
-                val clearSemantics = label != null && (shouldAlwaysShowLabel || isSelected)
-                Box(modifier = if (clearSemantics) Modifier.clearAndSetSemantics {} else Modifier) {
-                    CompositionLocalProvider(
-                        LocalContentColor provides iconColor,
-                        content = [email protected]
-                    )
-                }
-            }
-
-        val styledLabel: @Composable (() -> Unit)? =
-            label?.let {
-                @Composable {
-                    val style = NavigationBarTokens.LabelTextFont.value
-                    val textColor by
-                        animateColorAsState(
-                            targetValue =
-                                colors.textColor(selected = isSelected, enabled = isEnabled),
-                            animationSpec = colorAnimationSpec
-                        )
-                    ProvideContentColorTextStyle(
-                        contentColor = textColor,
-                        textStyle = style,
-                        content = label
-                    )
-                }
-            }
-
-        var itemWidth by remember { mutableIntStateOf(0) }
-
-        Box(
-            modifier
-                .selectable(
-                    selected = isSelected,
-                    onClick = onClick,
-                    enabled = isEnabled,
-                    role = Role.Tab,
-                    interactionSource = interactionSource,
-                    indication = null,
-                )
-                .defaultMinSize(minHeight = NavigationBarHeight)
-                .weight(1f)
-                .onSizeChanged { itemWidth = it.width },
-            contentAlignment = Alignment.Center,
-            propagateMinConstraints = true,
-        ) {
-            val alphaAnimationProgress: State<Float> =
-                animateFloatAsState(
-                    targetValue = if ([email protected]) 1f else 0f,
-                    // TODO Load the motionScheme tokens from the component tokens file
-                    animationSpec = MotionSchemeKeyTokens.DefaultEffects.value()
-                )
-            val sizeAnimationProgress: State<Float> =
-                animateFloatAsState(
-                    targetValue = if ([email protected]) 1f else 0f,
-                    // TODO Load the motionScheme tokens from the component tokens file
-                    animationSpec = MotionSchemeKeyTokens.FastSpatial.value()
-                )
-            // The entire item is selectable, but only the indicator pill shows the ripple. To
-            // achieve
-            // this, we re-map the coordinates of the item's InteractionSource into the coordinates
-            // of
-            // the indicator.
-            val deltaOffset: Offset
-            with(LocalDensity.current) {
-                val indicatorWidth =
-                    NavigationBarVerticalItemTokens.ActiveIndicatorWidth.roundToPx()
-                deltaOffset =
-                    Offset(
-                        (itemWidth - indicatorWidth).toFloat() / 2,
-                        IndicatorVerticalOffset.toPx()
-                    )
-            }
-            val offsetInteractionSource =
-                remember(interactionSource, deltaOffset) {
-                    MappedInteractionSource(interactionSource, deltaOffset)
-                }
-
-            // The indicator has a width-expansion animation which interferes with the timing of the
-            // ripple, which is why they are separate composables
-            val indicatorRipple =
-                @Composable {
-                    Box(
-                        Modifier.layoutId(IndicatorRippleLayoutIdTag)
-                            .clip(NavigationBarTokens.ItemActiveIndicatorShape.value)
-                            .indication(offsetInteractionSource, ripple())
-                    )
-                }
-            val indicator =
-                @Composable {
-                    Box(
-                        Modifier.layoutId(IndicatorLayoutIdTag)
-                            .graphicsLayer { alpha = alphaAnimationProgress.value }
-                            .background(
-                                color = [email protected],
-                                shape = NavigationBarTokens.ItemActiveIndicatorShape.value,
-                            )
-                    )
-                }
-
-            NavigationBarItemLayout(
-                indicatorRipple = indicatorRipple,
-                indicator = indicator,
-                icon = styledIcon,
-                label = styledLabel,
-                alwaysShowLabel = [email protected],
-                alphaAnimationProgress = { alphaAnimationProgress.value },
-                sizeAnimationProgress = { sizeAnimationProgress.value }
-            )
-        }
-    }
-}
-
-/** CompositionLocal containing the currently-selected [NavigationBarItemComponentOverride]. */
-@Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
-@get:ExperimentalMaterial3Api
-@ExperimentalMaterial3Api
-val LocalNavigationBarItemComponentOverride:
-    ProvidableCompositionLocal<NavigationBarItemComponentOverride> =
-    compositionLocalOf {
-        DefaultNavigationBarItemComponentOverride
-    }
-
 /** Interface that allows libraries to override the behavior of the [NavigationBar] component. */
 @ExperimentalMaterial3Api
 interface NavigationBarComponentOverride {
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SplitButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SplitButton.kt
index aa113e2..d4c416f 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SplitButton.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SplitButton.kt
@@ -445,10 +445,11 @@
                                     )
                                 }
                                 else -> {
-                                    Modifier.padding(contentPadding)
+                                    Modifier
                                 }
                             }
-                        ),
+                        )
+                        .padding(contentPadding),
                     horizontalArrangement = Arrangement.Center,
                     verticalAlignment = Alignment.CenterVertically,
                     content = content
@@ -570,10 +571,11 @@
                                     )
                                 }
                                 else -> {
-                                    Modifier.padding(contentPadding)
+                                    Modifier
                                 }
                             }
-                        ),
+                        )
+                        .padding(contentPadding),
                     horizontalArrangement = Arrangement.Center,
                     verticalAlignment = Alignment.CenterVertically,
                     content = content
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusViewInteropTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusViewInteropTest.kt
index f2e5f03..68e69ae 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusViewInteropTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusViewInteropTest.kt
@@ -20,7 +20,6 @@
 import android.graphics.Rect as AndroidRect
 import android.view.View
 import android.widget.EditText
-import android.widget.LinearLayout
 import androidx.compose.foundation.focusGroup
 import androidx.compose.foundation.focusable
 import androidx.compose.foundation.layout.Box
@@ -43,17 +42,13 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.platform.ComposeView
 import androidx.compose.ui.platform.LocalDensity
-import androidx.compose.ui.platform.LocalFocusManager
 import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.platform.LocalViewConfiguration
 import androidx.compose.ui.platform.testTag
-import androidx.compose.ui.test.assertIsFocused
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.test.performTouchInput
-import androidx.compose.ui.test.requestFocus
 import androidx.compose.ui.unit.Density
 import androidx.compose.ui.unit.IntRect
 import androidx.compose.ui.unit.dp
@@ -212,212 +207,6 @@
         assertThat(thirdFocused).isTrue()
     }
 
-    @Test
-    fun moveFocusThroughUnfocusableComposeViewNext() {
-        lateinit var topEditText: EditText
-        lateinit var composeView: ComposeView
-        lateinit var bottomEditText: EditText
-        lateinit var focusManager: FocusManager
-
-        rule.setContent {
-            focusManager = LocalFocusManager.current
-            AndroidView(
-                modifier = Modifier.fillMaxSize(),
-                factory = { context ->
-                    LinearLayout(context).also { linearLayout ->
-                        linearLayout.orientation = LinearLayout.VERTICAL
-                        EditText(context).also {
-                            linearLayout.addView(it)
-                            topEditText = it
-                        }
-                        ComposeView(context).also {
-                            it.setContent { Box(Modifier.size(10.dp)) }
-                            linearLayout.addView(it)
-                            composeView = it
-                        }
-                        EditText(context).also {
-                            linearLayout.addView(it)
-                            bottomEditText = it
-                        }
-                    }
-                }
-            )
-        }
-
-        rule.runOnIdle { topEditText.requestFocus() }
-
-        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Next) }
-
-        rule.runOnIdle {
-            assertThat(topEditText.isFocused).isFalse()
-            assertThat(composeView.isFocused).isFalse()
-            assertThat(bottomEditText.isFocused).isTrue()
-        }
-    }
-
-    @Test
-    fun moveFocusThroughUnfocusableComposeViewDown() {
-        lateinit var topEditText: EditText
-        lateinit var composeView: ComposeView
-        lateinit var bottomEditText: EditText
-        lateinit var focusManager: FocusManager
-
-        rule.setContent {
-            focusManager = LocalFocusManager.current
-            AndroidView(
-                modifier = Modifier.fillMaxSize(),
-                factory = { context ->
-                    LinearLayout(context).also { linearLayout ->
-                        linearLayout.orientation = LinearLayout.VERTICAL
-                        EditText(context).also {
-                            linearLayout.addView(it)
-                            topEditText = it
-                        }
-                        ComposeView(context).also {
-                            it.setContent { Box(Modifier.size(10.dp)) }
-                            linearLayout.addView(it)
-                            composeView = it
-                        }
-                        EditText(context).also {
-                            linearLayout.addView(it)
-                            bottomEditText = it
-                        }
-                    }
-                }
-            )
-        }
-
-        rule.runOnIdle { topEditText.requestFocus() }
-
-        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Down) }
-
-        rule.runOnIdle {
-            assertThat(topEditText.isFocused).isFalse()
-            assertThat(composeView.isFocused).isFalse()
-            assertThat(bottomEditText.isFocused).isTrue()
-        }
-    }
-
-    @Test
-    fun focusBetweenComposeViews_NextPrevious() {
-        lateinit var focusManager: FocusManager
-
-        rule.setContent {
-            focusManager = LocalFocusManager.current
-            AndroidView(
-                modifier = Modifier.fillMaxSize(),
-                factory = { context ->
-                    LinearLayout(context).also { linearLayout ->
-                        linearLayout.orientation = LinearLayout.VERTICAL
-                        ComposeView(context).also {
-                            it.setContent {
-                                Box(
-                                    Modifier.size(10.dp)
-                                        .focusProperties { canFocus = true }
-                                        .focusable()
-                                        .testTag("button1")
-                                )
-                            }
-                            linearLayout.addView(it)
-                        }
-                        ComposeView(context).also {
-                            it.setContent {
-                                Box(
-                                    Modifier.size(10.dp)
-                                        .focusProperties { canFocus = true }
-                                        .focusable()
-                                        .testTag("button2")
-                                )
-                            }
-                            linearLayout.addView(it)
-                        }
-                        ComposeView(context).also {
-                            it.setContent {
-                                Box(
-                                    Modifier.size(10.dp)
-                                        .focusProperties { canFocus = true }
-                                        .focusable()
-                                        .testTag("button3")
-                                )
-                            }
-                            linearLayout.addView(it)
-                        }
-                    }
-                }
-            )
-        }
-        rule.onNodeWithTag("button1").requestFocus()
-        rule.onNodeWithTag("button1").assertIsFocused()
-        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Next) }
-        rule.onNodeWithTag("button2").assertIsFocused()
-        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Next) }
-        rule.onNodeWithTag("button3").assertIsFocused()
-        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Previous) }
-        rule.onNodeWithTag("button2").assertIsFocused()
-        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Previous) }
-        rule.onNodeWithTag("button1").assertIsFocused()
-    }
-
-    @Test
-    fun focusBetweenComposeViews_DownUp() {
-        lateinit var focusManager: FocusManager
-
-        rule.setContent {
-            focusManager = LocalFocusManager.current
-            AndroidView(
-                modifier = Modifier.fillMaxSize(),
-                factory = { context ->
-                    LinearLayout(context).also { linearLayout ->
-                        linearLayout.orientation = LinearLayout.VERTICAL
-                        ComposeView(context).also {
-                            it.setContent {
-                                Box(
-                                    Modifier.size(10.dp)
-                                        .focusProperties { canFocus = true }
-                                        .focusable()
-                                        .testTag("button1")
-                                )
-                            }
-                            linearLayout.addView(it)
-                        }
-                        ComposeView(context).also {
-                            it.setContent {
-                                Box(
-                                    Modifier.size(10.dp)
-                                        .focusProperties { canFocus = true }
-                                        .focusable()
-                                        .testTag("button2")
-                                )
-                            }
-                            linearLayout.addView(it)
-                        }
-                        ComposeView(context).also {
-                            it.setContent {
-                                Box(
-                                    Modifier.size(10.dp)
-                                        .focusProperties { canFocus = true }
-                                        .focusable()
-                                        .testTag("button3")
-                                )
-                            }
-                            linearLayout.addView(it)
-                        }
-                    }
-                }
-            )
-        }
-        rule.onNodeWithTag("button1").requestFocus()
-        rule.onNodeWithTag("button1").assertIsFocused()
-        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Down) }
-        rule.onNodeWithTag("button2").assertIsFocused()
-        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Down) }
-        rule.onNodeWithTag("button3").assertIsFocused()
-        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Up) }
-        rule.onNodeWithTag("button2").assertIsFocused()
-        rule.runOnIdle { focusManager.moveFocus(FocusDirection.Up) }
-        rule.onNodeWithTag("button1").assertIsFocused()
-    }
-
     private fun View.getFocusedRect() =
         AndroidRect().run {
             rule.runOnIdle { getFocusedRect(this) }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt
index 334d095..71f1d7e 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt
@@ -248,8 +248,7 @@
 
         // Assert.
         rule.runOnIdle {
-            // b/369256395 we must return true when we advertise that we're focusable
-            assertThat(success).isTrue()
+            assertThat(success).isFalse()
             assertThat(ownerView.isFocused).isFalse()
         }
     }
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
index abb6040..84d116a 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
@@ -107,6 +107,7 @@
 import androidx.compose.ui.focus.focusRect
 import androidx.compose.ui.focus.is1dFocusSearch
 import androidx.compose.ui.focus.isBetterCandidate
+import androidx.compose.ui.focus.requestFocus
 import androidx.compose.ui.focus.requestInteropFocus
 import androidx.compose.ui.focus.toAndroidFocusDirection
 import androidx.compose.ui.focus.toFocusDirection
@@ -325,73 +326,28 @@
     override val windowInfo: WindowInfo
         get() = _windowInfo
 
-    /**
-     * Because AndroidComposeView always accepts focus, we have to divert focus to another View if
-     * there is nothing focusable within. However, if there are only nonfocusable ComposeViews, then
-     * the redirection can recurse infinitely. This makes sure that if that happens, then it can
-     * bail when it is detected
-     */
-    private var isInRequestFocus = false
-
     // When move focus is triggered by a key event, and move focus does not cause any focus change,
     // we return the key event to the view system if focus search finds a suitable view which is not
     // a compose sub-view. However if move focus is triggered programmatically, we have to manually
     // implement this behavior because the view system does not have a moveFocus API.
     private fun onMoveFocusInChildren(focusDirection: FocusDirection): Boolean {
+
         // The view system does not have an API corresponding to Enter/Exit.
         if (focusDirection == Enter || focusDirection == Exit) return false
 
-        val androidViewsHandler = _androidViewsHandler ?: return false
-
         val direction =
             checkNotNull(focusDirection.toAndroidFocusDirection()) { "Invalid focus direction" }
+        val focusedRect = onFetchFocusRect()?.toAndroidRect()
 
-        val root = rootView as ViewGroup
-
-        val currentFocus = root.findFocus()
-
-        val focusFinder = FocusFinder.getInstance()
-        val nextView: View?
-        val focusedRect: Rect?
-        if (currentFocus == null) {
-            focusedRect = null
-            nextView = focusFinder.findNextFocus(root, null, direction)
-        } else if (focusDirection.is1dFocusSearch() && androidViewsHandler.hasFocus()) {
-            focusedRect = null
-            if (SDK_INT >= O) {
-                // On newer devices, the focus is normal and we can expect forward/next to work
-                nextView = focusFinder.findNextFocus(root, currentFocus, direction)
-            } else {
-                // On older devices, FocusFinder doesn't properly order Views, so we have to use
-                // a copy of the focus finder the corrects the order
-                nextView = FocusFinderCompat.instance.findNextFocus1d(root, currentFocus, direction)
+        val nextView =
+            FocusFinder.getInstance().let {
+                if (focusedRect == null) {
+                    it.findNextFocus(this, findFocus(), direction)
+                } else {
+                    it.findNextFocusFromRect(this, focusedRect, direction)
+                }
             }
-        } else {
-            focusedRect = onFetchFocusRect()?.toAndroidRect()
-            nextView = focusFinder.findNextFocusFromRect(root, focusedRect, direction)
-            nextView?.getLocationInWindow(tmpPositionArray)
-            val nextPositionX = tmpPositionArray[0]
-            val nextPositionY = tmpPositionArray[1]
-            getLocationInWindow(tmpPositionArray)
-            focusedRect!!.offset(
-                tmpPositionArray[0] - nextPositionX,
-                tmpPositionArray[1] - nextPositionY
-            )
-        }
-
-        // is it part of the compose hierarchy?
-        if (nextView == null || nextView === currentFocus) {
-            return false
-        }
-
-        var nextParent = nextView.parent
-        while (nextParent != null && nextParent !== androidViewsHandler) {
-            nextParent = nextParent.parent
-        }
-        if (nextParent == null) {
-            return false // not a part of the compose hierarchy
-        }
-        return nextView.requestInteropFocus(direction, focusedRect)
+        return nextView?.requestInteropFocus(direction, focusedRect) ?: false
     }
 
     // If this root view is focused, we can get the focus rect from focusOwner. But if a sub-view
@@ -434,20 +390,11 @@
             // instead be visited when the AndroidView around them gets a moveFocus(Enter)).
             val androidDirection =
                 checkNotNull(focusDirection.toAndroidFocusDirection()) { "Invalid focus direction" }
+            val androidRect = checkNotNull(focusedRect?.toAndroidRect()) { "Invalid rect" }
 
             val nextView = findNextNonChildView(androidDirection).takeIf { it != this }
-            if (nextView != null) {
-                val androidRect = checkNotNull(focusedRect?.toAndroidRect()) { "Invalid rect" }
-                nextView.getLocationInWindow(tmpPositionArray)
-                val nextX = tmpPositionArray[0]
-                val nextY = tmpPositionArray[1]
-                getLocationInWindow(tmpPositionArray)
-                val currentX = tmpPositionArray[0]
-                val currentY = tmpPositionArray[1]
-                androidRect.offset(currentX - nextX, currentY - nextY)
-                if (nextView.requestInteropFocus(androidDirection, androidRect)) {
-                    return@onKeyEvent true
-                }
+            if (nextView != null && nextView.requestInteropFocus(androidDirection, androidRect)) {
+                return@onKeyEvent true
             }
 
             // Focus finder couldn't find another view. We manually wrap around since focus remained
@@ -471,9 +418,10 @@
 
     private fun findNextNonChildView(direction: Int): View? {
         var currentView: View? = this
-        val focusFinder = FocusFinder.getInstance()
         while (currentView != null) {
-            currentView = focusFinder.findNextFocus(rootView as ViewGroup, currentView, direction)
+            currentView =
+                FocusFinder.getInstance()
+                    .findNextFocus(rootView as ViewGroup, currentView, direction)
             if (currentView != null && !containsDescendant(currentView)) return currentView
         }
         return null
@@ -986,10 +934,6 @@
         // This view is already focused.
         if (isFocused) return true
 
-        // There is nothing focusable and we've looped around all Views back to this one, so
-        // we just return false to indicate that nothing can be focused.
-        if (isInRequestFocus) return false
-
         // If the root has focus, it means a sub-view is focused,
         // and is trying to move focus within itself.
         if (focusOwner.rootState.hasFocus) {
@@ -997,41 +941,12 @@
         }
 
         val focusDirection = toFocusDirection(direction) ?: Enter
-        var foundFocusable = false
-        val focusSearchResult =
-            focusOwner.focusSearch(
-                focusDirection = focusDirection,
-                focusedRect = previouslyFocusedRect?.toComposeRect()
-            ) {
-                foundFocusable = true
-                it.requestFocus(focusDirection)
-            }
-        if (focusSearchResult == null) {
-            return false // The focus search was canceled
-        }
-        if (focusSearchResult) {
-            return true // We found something to focus on
-        }
-        if (foundFocusable) {
-            return false // The requestFocus() from within the focusSearch was canceled
-        }
-
-        // We advertised ourselves as focusable, but we aren't. Try to just move the focus to the
-        // next item.
-        val nextFocusedView = findNextNonChildView(direction)
-
-        // Can crash if we return false when we've advertised ourselves as focusable and we aren't
-        // b/369256395
-        if (nextFocusedView == null || nextFocusedView === this) {
-            // There is no next View, so just return true so we don't cause a crash
-            return true
-        }
-
-        // Try to focus on the next focusable View
-        isInRequestFocus = true
-        val requestFocusResult = nextFocusedView.requestFocus(direction)
-        isInRequestFocus = false
-        return requestFocusResult
+        return focusOwner.focusSearch(
+            focusDirection = focusDirection,
+            focusedRect = previouslyFocusedRect?.toComposeRect()
+        ) {
+            it.requestFocus(focusDirection)
+        } ?: false
     }
 
     private fun onRequestFocusForOwner(
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/FocusFinderCompat.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/FocusFinderCompat.android.kt
deleted file mode 100644
index 9a42b02..0000000
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/FocusFinderCompat.android.kt
+++ /dev/null
@@ -1,462 +0,0 @@
-/*
- * Copyright 2024 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 androidx.compose.ui.platform
-
-import android.annotation.SuppressLint
-import android.content.pm.PackageManager
-import android.graphics.Rect
-import android.os.Build
-import android.view.View
-import android.view.View.FOCUS_BACKWARD
-import android.view.View.FOCUS_FORWARD
-import android.view.ViewGroup
-import androidx.collection.MutableObjectList
-import androidx.collection.ObjectList
-import androidx.collection.mutableObjectIntMapOf
-import androidx.collection.mutableScatterMapOf
-import androidx.collection.mutableScatterSetOf
-import androidx.core.view.isVisible
-import java.util.Collections
-
-/**
- * On devices before [Build.VERSION_CODES.O], [FocusFinder] orders Views incorrectly. This
- * implementation uses the current [FocusFinder] behavior, ordering Views correctly for
- * one-dimensional focus searches.
- *
- * This is copied and simplified from FocusFinder's source. There may be some code that doesn't look
- * quite right in Kotlin as it was copy/pasted with auto-translation.
- */
-internal class FocusFinderCompat {
-    companion object {
-        private val FocusFinderThreadLocal =
-            object : ThreadLocal<FocusFinderCompat>() {
-                override fun initialValue(): FocusFinderCompat {
-                    return FocusFinderCompat()
-                }
-            }
-
-        /** Get the focus finder for this thread. */
-        val instance: FocusFinderCompat
-            get() = FocusFinderThreadLocal.get()!!
-    }
-
-    private val focusedRect: Rect = Rect()
-
-    private val userSpecifiedFocusComparator =
-        UserSpecifiedFocusComparator({ r, v ->
-            if (isValidId(v.nextFocusForwardId)) v.findUserSetNextFocus(r, FOCUS_FORWARD) else null
-        })
-
-    private val tmpList = MutableObjectList<View>()
-
-    // enforce thread local access
-    private fun FocusFinder() {}
-
-    /**
-     * Find the next view to take focus in root's descendants, starting from the view that currently
-     * is focused.
-     *
-     * @param root Contains focused. Cannot be null.
-     * @param focused Has focus now.
-     * @param direction Direction to look.
-     * @return The next focusable view, or null if none exists.
-     */
-    fun findNextFocus1d(root: ViewGroup, focused: View, direction: Int): View? {
-        val effectiveRoot = getEffectiveRoot(root, focused)
-        var next = findNextUserSpecifiedFocus(effectiveRoot, focused, direction)
-        if (next != null) {
-            return next
-        }
-        val focusables = tmpList
-        try {
-            focusables.clear()
-            effectiveRoot.addFocusableViews(focusables, direction)
-            if (!focusables.isEmpty()) {
-                next = findNextFocus(effectiveRoot, focused, direction, focusables)
-            }
-        } finally {
-            focusables.clear()
-        }
-        return next
-    }
-
-    /**
-     * Returns the "effective" root of a view. The "effective" root is the closest ancestor
-     * within-which focus should cycle.
-     *
-     * For example: normal focus navigation would stay within a ViewGroup marked as
-     * touchscreenBlocksFocus and keyboardNavigationCluster until a cluster-jump out.
-     *
-     * @return the "effective" root of {@param focused}
-     */
-    private fun getEffectiveRoot(root: ViewGroup, focused: View?): ViewGroup {
-        if (focused == null || focused === root) {
-            return root
-        }
-        var effective: ViewGroup? = null
-        var nextParent = focused.parent
-        while (nextParent is ViewGroup) {
-            if (nextParent === root) {
-                return effective ?: root
-            }
-            val vg = nextParent
-            if (
-                vg.touchscreenBlocksFocus &&
-                    focused.context.packageManager.hasSystemFeature(
-                        PackageManager.FEATURE_TOUCHSCREEN
-                    )
-            ) {
-                // Don't stop and return here because the cluster could be nested and we only
-                // care about the top-most one.
-                effective = vg
-            }
-            nextParent = nextParent.parent
-        }
-        return root
-    }
-
-    private fun findNextUserSpecifiedFocus(root: ViewGroup, focused: View, direction: Int): View? {
-        // check for user specified next focus
-        var userSetNextFocus: View? = focused.findUserSetNextFocus(root, direction)
-        var cycleCheck = userSetNextFocus
-        var cycleStep = true // we want the first toggle to yield false
-        while (userSetNextFocus != null) {
-            if (
-                userSetNextFocus.isFocusable &&
-                    userSetNextFocus.visibility == View.VISIBLE &&
-                    (!userSetNextFocus.isInTouchMode || userSetNextFocus.isFocusableInTouchMode)
-            ) {
-                return userSetNextFocus
-            }
-            userSetNextFocus = userSetNextFocus.findUserSetNextFocus(root, direction)
-            if ((!cycleStep).also { cycleStep = it }) {
-                cycleCheck = cycleCheck?.findUserSetNextFocus(root, direction)
-                if (cycleCheck === userSetNextFocus) {
-                    // found a cycle, user-specified focus forms a loop and none of the views
-                    // are currently focusable.
-                    break
-                }
-            }
-        }
-        return null
-    }
-
-    private fun findNextFocus(
-        root: ViewGroup,
-        focused: View,
-        direction: Int,
-        focusables: MutableObjectList<View>
-    ): View? {
-        val focusedRect = focusedRect
-        // fill in interesting rect from focused
-        focused.getFocusedRect(focusedRect)
-        root.offsetDescendantRectToMyCoords(focused, focusedRect)
-
-        return findNextFocusInRelativeDirection(focusables, root, focused, direction)
-    }
-
-    @SuppressLint("AsCollectionCall")
-    private fun findNextFocusInRelativeDirection(
-        focusables: MutableObjectList<View>,
-        root: ViewGroup?,
-        focused: View,
-        direction: Int
-    ): View? {
-        try {
-            // Note: This sort is stable.
-            userSpecifiedFocusComparator.setFocusables(focusables, root!!)
-            Collections.sort(focusables.asMutableList(), userSpecifiedFocusComparator)
-        } finally {
-            userSpecifiedFocusComparator.recycle()
-        }
-
-        val count = focusables.size
-        if (count < 2) {
-            return null
-        }
-        var next: View? = null
-        val looped = BooleanArray(1)
-        when (direction) {
-            FOCUS_FORWARD -> next = getNextFocusable(focused, focusables, count, looped)
-            FOCUS_BACKWARD -> next = getPreviousFocusable(focused, focusables, count, looped)
-        }
-        return next ?: focusables[count - 1]
-    }
-
-    private fun getNextFocusable(
-        focused: View,
-        focusables: ObjectList<View>,
-        count: Int,
-        outLooped: BooleanArray
-    ): View? {
-        if (count < 2) {
-            return null
-        }
-        val position = focusables.lastIndexOf(focused)
-        if (position >= 0 && position + 1 < count) {
-            return focusables[position + 1]
-        }
-        outLooped[0] = true
-        return focusables[0]
-    }
-
-    private fun getPreviousFocusable(
-        focused: View?,
-        focusables: ObjectList<View>,
-        count: Int,
-        outLooped: BooleanArray
-    ): View? {
-        if (count < 2) {
-            return null
-        }
-        if (focused != null) {
-            val position = focusables.indexOf(focused)
-            if (position > 0) {
-                return focusables[position - 1]
-            }
-        }
-        outLooped[0] = true
-        return focusables[count - 1]
-    }
-
-    private fun isValidId(id: Int): Boolean {
-        return id != 0 && id != View.NO_ID
-    }
-
-    /**
-     * Sorts views according to any explicitly-specified focus-chains. If there are no explicitly
-     * specified focus chains (eg. no nextFocusForward attributes defined), this should be a no-op.
-     */
-    private class UserSpecifiedFocusComparator(private val mNextFocusGetter: NextFocusGetter) :
-        Comparator<View?> {
-        private val nextFoci = mutableScatterMapOf<View, View>()
-        private val isConnectedTo = mutableScatterSetOf<View>()
-        private val headsOfChains = mutableScatterMapOf<View, View>()
-        private val originalOrdinal = mutableObjectIntMapOf<View>()
-        private var root: View? = null
-
-        fun interface NextFocusGetter {
-            fun get(root: View, view: View): View?
-        }
-
-        fun recycle() {
-            root = null
-            headsOfChains.clear()
-            isConnectedTo.clear()
-            originalOrdinal.clear()
-            nextFoci.clear()
-        }
-
-        fun setFocusables(focusables: ObjectList<View>, root: View) {
-            this.root = root
-            focusables.forEachIndexed { index, view -> originalOrdinal[view] = index }
-
-            for (i in focusables.indices.reversed()) {
-                val view = focusables[i]
-                val next = mNextFocusGetter.get(root, view)
-                if (next != null && originalOrdinal.containsKey(next)) {
-                    nextFoci[view] = next
-                    isConnectedTo.add(next)
-                }
-            }
-
-            for (i in focusables.indices.reversed()) {
-                val view = focusables[i]
-                val next = nextFoci[view]
-                if (next != null && !isConnectedTo.contains(view)) {
-                    setHeadOfChain(view)
-                }
-            }
-        }
-
-        fun setHeadOfChain(head: View) {
-            var newHead = head
-            var view: View? = newHead
-            while (view != null) {
-                val otherHead = headsOfChains[view]
-                if (otherHead != null) {
-                    if (otherHead === newHead) {
-                        return // This view has already had its head set properly
-                    }
-                    // A hydra -- multi-headed focus chain (e.g. A->C and B->C)
-                    // Use the one we've already chosen instead and reset this chain.
-                    view = newHead
-                    newHead = otherHead
-                }
-                headsOfChains[view] = newHead
-                view = nextFoci[view]
-            }
-        }
-
-        override fun compare(first: View?, second: View?): Int {
-            if (first === second) {
-                return 0
-            }
-            if (first == null) {
-                return -1
-            }
-            if (second == null) {
-                return 1
-            }
-            // Order between views within a chain is immaterial -- next/previous is
-            // within a chain is handled elsewhere.
-            val firstHead = headsOfChains[first]
-            val secondHead = headsOfChains[second]
-            if (firstHead === secondHead && firstHead != null) {
-                return if (first === firstHead) {
-                    -1 // first is the head, it should be first
-                } else if (second === firstHead) {
-                    1 // second is the head, it should be first
-                } else if (nextFoci[first] != null) {
-                    -1 // first is not the end of the chain
-                } else {
-                    1 // first is end of chain
-                }
-            }
-            val chainedFirst = firstHead ?: first
-            val chainedSecond = secondHead ?: second
-
-            return if (firstHead != null || secondHead != null) {
-                // keep original order between chains
-                if (originalOrdinal[chainedFirst] < originalOrdinal[chainedSecond]) -1 else 1
-            } else {
-                0
-            }
-        }
-    }
-}
-
-/**
- * If a user manually specified the next view id for a particular direction, use the root to look up
- * the view.
- *
- * @param root The root view of the hierarchy containing this view.
- * @param direction One of FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT, FOCUS_FORWARD, or
- *   FOCUS_BACKWARD.
- * @return The user specified next view, or null if there is none.
- */
-private fun View.findUserSetNextFocus(root: View, direction: Int): View? {
-    when (direction) {
-        FOCUS_FORWARD -> {
-            val next = nextFocusForwardId
-            if (next == View.NO_ID) return null
-            return findViewInsideOutShouldExist(root, this, next)
-        }
-        FOCUS_BACKWARD -> {
-            if (id == View.NO_ID) return null
-            val startView: View = this
-            // Since we have forward links but no backward links, we need to find the view that
-            // forward links to this view. We can't just find the view with the specified ID
-            // because view IDs need not be unique throughout the tree.
-            return root.findViewByPredicateInsideOut(startView) { t ->
-                (findViewInsideOutShouldExist(root, t, t.nextFocusForwardId) === startView)
-            }
-        }
-    }
-    return null
-}
-
-private fun findViewInsideOutShouldExist(root: View, start: View, id: Int): View? {
-    return root.findViewByPredicateInsideOut(start) { it.id == id }
-}
-
-/**
- * Look for a child view that matches the specified predicate, starting with the specified view and
- * its descendants and then recursively searching the ancestors and siblings of that view until this
- * view is reached.
- *
- * This method is useful in cases where the predicate does not match a single unique view (perhaps
- * multiple views use the same id) and we are trying to find the view that is "closest" in scope to
- * the starting view.
- *
- * @param start The view to start from.
- * @param predicate The predicate to evaluate.
- * @return The first view that matches the predicate or null.
- */
-private fun View.findViewByPredicateInsideOut(start: View, predicate: (View) -> Boolean): View? {
-    var next = start
-    var childToSkip: View? = null
-    while (true) {
-        val view = next.findViewByPredicateTraversal(predicate, childToSkip)
-        if (view != null || next === this) {
-            return view
-        }
-
-        val parent = next.parent
-        if (parent == null || parent !is View) {
-            return null
-        }
-
-        childToSkip = next
-        next = parent
-    }
-}
-
-/**
- * @param predicate The predicate to evaluate.
- * @param childToSkip If not null, ignores this child during the recursive traversal.
- * @return The first view that matches the predicate or null.
- */
-private fun View.findViewByPredicateTraversal(
-    predicate: (View) -> Boolean,
-    childToSkip: View?
-): View? {
-    if (predicate(this)) {
-        return this
-    }
-    if (this is ViewGroup) {
-        for (i in 0 until childCount) {
-            val child = getChildAt(i)
-            if (child !== childToSkip) {
-                val v = child.findViewByPredicateTraversal(predicate, childToSkip)
-                if (v != null) {
-                    return v
-                }
-            }
-        }
-    }
-    return null
-}
-
-private fun View.addFocusableViews(views: MutableObjectList<View>, direction: Int) {
-    addFocusableViews(views, direction, isInTouchMode)
-}
-
-/**
- * Older versions of View don't add focusable Views in order. This is a corrected version that adds
- * them in the right order.
- */
-private fun View.addFocusableViews(
-    views: MutableObjectList<View>,
-    direction: Int,
-    inTouchMode: Boolean
-) {
-    if (
-        isVisible &&
-            isFocusable &&
-            isEnabled &&
-            width > 0 &&
-            height > 0 &&
-            (!inTouchMode || isFocusableInTouchMode)
-    ) {
-        views += this
-    }
-    if (this is ViewGroup) {
-        for (i in 0 until childCount) {
-            getChildAt(i).addFocusableViews(views, direction, inTouchMode)
-        }
-    }
-}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwnerImpl.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwnerImpl.kt
index 56e3cba..8741918 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwnerImpl.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwnerImpl.kt
@@ -222,12 +222,8 @@
         // If focus search and request focus succeeded, move focus succeeded.
         if (focusSearchSuccess == true && requestFocusSuccess == true) return true
 
-        // If we couldn't move focus within compose, we attempt to move focus within embedded views.
-        val moveFocusInteropResult = onMoveFocusInterop(focusDirection)
-
-        // If there is no View to be focused on and it is Next or Previous direction, wrap
-        // around.
-        if (!moveFocusInteropResult && focusDirection.is1dFocusSearch()) {
+        // To wrap focus around, we clear focus and request initial focus.
+        if (focusDirection.is1dFocusSearch()) {
             val clearFocus =
                 clearFocus(
                     force = false,
@@ -237,7 +233,11 @@
                 )
             return clearFocus && takeFocus(focusDirection, previouslyFocusedRect = null)
         }
-        return moveFocusInteropResult
+
+        // If we couldn't move focus within compose, we attempt to move focus within embedded views.
+        // We don't need this for 1D focus search because the wrap-around logic triggers a
+        // focus exit which will perform a focus search among the subviews.
+        return onMoveFocusInterop(focusDirection)
     }
 
     override fun focusSearch(
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/TestUtils.kt b/credentials/credentials/src/androidTest/java/androidx/credentials/TestUtils.kt
index 1c6aa3f..402df12 100644
--- a/credentials/credentials/src/androidTest/java/androidx/credentials/TestUtils.kt
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/TestUtils.kt
@@ -494,6 +494,28 @@
     equals(getCredentialResponse1.credential, getCredentialResponse2.credential)
 }
 
+@RequiresApi(34)
+fun assertEquals(
+    actual: android.credentials.CreateCredentialResponse,
+    expected: CreatePasswordResponse
+) {
+    assertEquals(actual.data, expected.data)
+}
+
+@RequiresApi(34)
+fun assertEquals(
+    actual: android.credentials.GetCredentialResponse,
+    expected: GetCredentialResponse
+) {
+    equals(actual.credential, expected.credential)
+}
+
+@RequiresApi(34)
+fun equals(actual: android.credentials.Credential, expected: Credential) {
+    assertThat(actual.type).isEqualTo(expected.type)
+    equals(actual.data, expected.data)
+}
+
 fun equals(credential1: Credential, credential2: Credential) {
     assertThat(credential1.type).isEqualTo(credential2.type)
     equals(credential1.data, credential2.data)
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/PendingIntentHandlerApi34JavaTest.java b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/PendingIntentHandlerApi34JavaTest.java
index 031750f..d1d5a32 100644
--- a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/PendingIntentHandlerApi34JavaTest.java
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/PendingIntentHandlerApi34JavaTest.java
@@ -21,6 +21,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
+import android.content.Context;
 import android.content.Intent;
 import android.content.pm.SigningInfo;
 import android.credentials.CredentialOption;
@@ -38,6 +39,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -69,6 +71,8 @@
 
     private static final String BIOMETRIC_AUTHENTICATOR_ERROR_MSG = "error";
 
+    private final Context mContext = InstrumentationRegistry.getInstrumentation().getContext();
+
     @Test
     public void test_retrieveProviderCreateCredReqWithSuccessBpAuthJetpack_retrieveJetpackResult() {
         for (int jetpackResult :
@@ -292,12 +296,7 @@
 
     @Test
     public void test_setGetCreateCredentialException() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return;
-        }
-
         Intent intent = new Intent();
-
         CreateCredentialInterruptedException initialException =
                 new CreateCredentialInterruptedException("message");
 
@@ -307,26 +306,16 @@
                 IntentHandlerConverters.getCreateCredentialException(intent);
         assertThat(finalException).isNotNull();
         assertThat(finalException.getMessage()).isEqualTo(initialException.getMessage());
+        assertThat(finalException.getType()).isEqualTo(initialException.getType());
     }
 
     @Test
-    public void test_setGetCreateCredentialException_throwsWhenEmptyIntent() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return;
-        }
-
-        assertThat(
-                        IntentHandlerConverters.getCreateCredentialException(
-                                BLANK_INTENT))
-                .isNull();
+    public void test_setGetCreateCredentialException_nullWhenEmptyIntent() {
+        assertThat(IntentHandlerConverters.getCreateCredentialException(BLANK_INTENT)).isNull();
     }
 
     @Test
     public void test_credentialException() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return;
-        }
-
         Intent intent = new Intent();
         GetCredentialInterruptedException initialException =
                 new GetCredentialInterruptedException("message");
@@ -336,25 +325,17 @@
         android.credentials.GetCredentialException finalException =
                 IntentHandlerConverters.getGetCredentialException(intent);
         assertThat(finalException).isNotNull();
-        assertThat(finalException).isEqualTo(initialException);
+        assertThat(finalException.getMessage()).isEqualTo(initialException.getMessage());
+        assertThat(finalException.getType()).isEqualTo(initialException.getType());
     }
 
     @Test
-    public void test_credentialException_throwsWhenEmptyIntent() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return;
-        }
-
-        assertThat(IntentHandlerConverters.getGetCredentialException(BLANK_INTENT))
-                .isNull();
+    public void test_credentialException_nullWhenEmptyIntent() {
+        assertThat(IntentHandlerConverters.getGetCredentialException(BLANK_INTENT)).isNull();
     }
 
     @Test
     public void test_beginGetResponse() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return;
-        }
-
         Intent intent = new Intent();
         BeginGetCredentialResponse initialResponse =
                 new BeginGetCredentialResponse.Builder().build();
@@ -364,25 +345,17 @@
         BeginGetCredentialResponse finalResponse =
                 IntentHandlerConverters.getBeginGetResponse(intent);
         assertThat(finalResponse).isNotNull();
-        assertThat(finalResponse).isEqualTo(initialResponse);
+        TestUtilsKt.assertEquals(mContext, finalResponse, initialResponse);
     }
 
     @Test
     public void test_beginGetResponse_throwsWhenEmptyIntent() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return;
-        }
-
         assertThat(IntentHandlerConverters.getBeginGetResponse(BLANK_INTENT))
                 .isNull();
     }
 
     @Test
     public void test_credentialResponse() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return;
-        }
-
         Intent intent = new Intent();
         PasswordCredential credential = new PasswordCredential("a", "b");
         GetCredentialResponse initialResponse = new GetCredentialResponse(credential);
@@ -392,15 +365,11 @@
         android.credentials.GetCredentialResponse finalResponse =
                 IntentHandlerConverters.getGetCredentialResponse(intent);
         assertThat(finalResponse).isNotNull();
-        assertThat(finalResponse).isEqualTo(initialResponse);
+        TestUtilsKt.assertEquals(finalResponse, initialResponse);
     }
 
     @Test
-    public void test_credentialResponse_throwsWhenEmptyIntent() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return;
-        }
-
+    public void test_credentialResponse_nullWhenEmptyIntent() {
         assertThat(IntentHandlerConverters.getGetCredentialResponse(BLANK_INTENT))
                 .isNull();
     }
@@ -519,10 +488,6 @@
 
     @Test
     public void test_createCredentialCredentialResponse() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return;
-        }
-
         Intent intent = new Intent();
         CreatePasswordResponse initialResponse = new CreatePasswordResponse();
 
@@ -532,18 +497,12 @@
                 IntentHandlerConverters.getCreateCredentialCredentialResponse(
                         intent);
         assertThat(finalResponse).isNotNull();
-        assertThat(finalResponse).isEqualTo(initialResponse);
+        TestUtilsKt.assertEquals(finalResponse, initialResponse);
     }
 
     @Test
-    public void test_createCredentialCredentialResponse_throwsWhenEmptyIntent() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return;
-        }
-
-        assertThat(
-                        IntentHandlerConverters
-                                .getCreateCredentialCredentialResponse(BLANK_INTENT))
+    public void test_createCredentialCredentialResponse_nullWhenEmptyIntent() {
+        assertThat(IntentHandlerConverters.getCreateCredentialCredentialResponse(BLANK_INTENT))
                 .isNull();
     }
 }
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/PendingIntentHandlerApi34Test.kt b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/PendingIntentHandlerApi34Test.kt
index 9d9daee..59acd5d 100644
--- a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/PendingIntentHandlerApi34Test.kt
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/PendingIntentHandlerApi34Test.kt
@@ -18,7 +18,6 @@
 import android.content.Intent
 import android.content.pm.SigningInfo
 import android.credentials.CredentialOption
-import android.os.Build
 import android.os.Bundle
 import android.service.credentials.CallingAppInfo
 import android.service.credentials.CreateCredentialRequest
@@ -27,6 +26,7 @@
 import androidx.credentials.CreatePasswordResponse
 import androidx.credentials.GetCredentialResponse
 import androidx.credentials.PasswordCredential
+import androidx.credentials.assertEquals
 import androidx.credentials.equals
 import androidx.credentials.exceptions.CreateCredentialInterruptedException
 import androidx.credentials.exceptions.GetCredentialInterruptedException
@@ -34,6 +34,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
 import org.junit.Assert
 import org.junit.Test
@@ -68,6 +69,8 @@
 
         private const val FRAMEWORK_EXPECTED_CONSTANT_AUTH_RESULT =
             "androidx.credentials.provider.BIOMETRIC_AUTH_RESULT"
+
+        private val context = InstrumentationRegistry.getInstrumentation().context
     }
 
     @Test
@@ -278,10 +281,6 @@
 
     @Test
     fun test_createCredentialException() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return
-        }
-
         val intent = Intent()
         val initialException = CreateCredentialInterruptedException("message")
 
@@ -289,16 +288,14 @@
 
         val finalException = intent.getCreateCredentialException()
         assertThat(finalException).isNotNull()
-        assertThat(finalException).isEqualTo(initialException)
+        assertThat(finalException!!.type).isEqualTo(initialException.type)
+        assertThat(finalException.message).isEqualTo(initialException.message)
     }
 
     @Test
-    fun test_createCredentialException_throwsWhenEmptyIntent() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return
-        }
-
+    fun test_createCredentialException_nullExceptionWhenEmptyIntent() {
         val intent = Intent()
+
         assertThat(intent.getCreateCredentialException()).isNull()
     }
 
@@ -417,10 +414,6 @@
 
     @Test
     fun test_credentialException() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return
-        }
-
         val intent = Intent()
         val initialException = GetCredentialInterruptedException("message")
 
@@ -428,25 +421,19 @@
 
         val finalException = intent.getGetCredentialException()
         assertThat(finalException).isNotNull()
-        assertThat(finalException).isEqualTo(initialException)
+        assertThat(finalException!!.type).isEqualTo(initialException.type)
+        assertThat(finalException.message).isEqualTo(initialException.message)
     }
 
     @Test
-    fun test_credentialException_throwsWhenEmptyIntent() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return
-        }
-
+    fun test_credentialException_nullWhenEmptyIntent() {
         val intent = Intent()
+
         assertThat(intent.getGetCredentialException()).isNull()
     }
 
     @Test
     fun test_beginGetResponse() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return
-        }
-
         val intent = Intent()
         val initialResponse = BeginGetCredentialResponse.Builder().build()
 
@@ -454,25 +441,18 @@
 
         val finalResponse = intent.getBeginGetResponse()
         assertThat(finalResponse).isNotNull()
-        assertThat(finalResponse).isEqualTo(initialResponse)
+        assertEquals(context, finalResponse!!, initialResponse)
     }
 
     @Test
-    fun test_beginGetResponse_throwsWhenEmptyIntent() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return
-        }
-
+    fun test_beginGetResponse_nullWhenEmptyIntent() {
         val intent = Intent()
+
         assertThat(intent.getBeginGetResponse()).isNull()
     }
 
     @Test
     fun test_credentialResponse() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return
-        }
-
         val intent = Intent()
         val credential = PasswordCredential("a", "b")
         val initialResponse = GetCredentialResponse(credential)
@@ -481,25 +461,18 @@
 
         val finalResponse = intent.getGetCredentialResponse()
         assertThat(finalResponse).isNotNull()
-        assertThat(finalResponse).isEqualTo(initialResponse)
+        assertEquals(finalResponse!!, initialResponse)
     }
 
     @Test
-    fun test_credentialResponse_throwsWhenEmptyIntent() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return
-        }
-
+    fun test_credentialResponse_nullWhenEmptyIntent() {
         val intent = Intent()
+
         assertThat(intent.getGetCredentialResponse()).isNull()
     }
 
     @Test
     fun test_createCredentialCredentialResponse() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return
-        }
-
         val intent = Intent()
         val initialResponse = CreatePasswordResponse()
 
@@ -507,17 +480,13 @@
 
         val finalResponse = intent.getCreateCredentialCredentialResponse()
         assertThat(finalResponse).isNotNull()
-        assertThat(finalResponse).isEqualTo(initialResponse)
+        assertThat(equals(finalResponse!!.data, initialResponse.data))
     }
 
     @Test
-    fun test_createCredentialCredentialResponse_throwsWhenEmptyIntent() {
-        if (Build.VERSION.SDK_INT >= 34) {
-            return
-        }
-
+    fun test_createCredentialCredentialResponse_nullWhenEmptyIntent() {
         val intent = Intent()
-        val r = intent.getCreateCredentialCredentialResponse()
-        assertThat(r).isNull()
+
+        assertThat(intent.getCreateCredentialCredentialResponse()).isNull()
     }
 }
diff --git a/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/MaterialShapes.kt b/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/MaterialShapes.kt
index 96dc524..d4a6aba 100644
--- a/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/MaterialShapes.kt
+++ b/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/MaterialShapes.kt
@@ -641,27 +641,27 @@
          * use. Refer to [FeatureSerializer] for proper usage of svg path import.
          * *************************************************************************************
          */
-        CustomShapeParameters("1") {
+        CustomShapeParameters("Park") {
             val svgPathNotSuitableForProductionCodeImport =
-                "M -327.65 -440 h -24.31 q -25.95 0 -43.93 -17.98 q -17.98 -17.97 -17.98 -43.93 t 17.98 -43.93 q 17.98 -17.98 43.93 -17.98 h 102.63 q 19.16 0 32.33 13.17 q 13.17 13.17 13.17 32.33 V -260 q 0 25.96 -17.98 43.93 q -17.97 17.98 -43.93 17.98 t -43.93 -17.98 q -17.98 -17.97 -17.98 -43.93 Z"
+                "M 397.93 -231.87 H 190.22 q -27.35 0 -40.79 -23.87 q -13.43 -23.87 2.24 -46.74 l 113.26 -169.39 h -2.28 q -24.48 0 -36.1 -21.74 q -11.62 -21.74 2.62 -41.98 l 213.29 -304.82 q 6.95 -9.44 17.03 -14.42 q 10.08 -4.97 20.51 -4.97 q 10.43 0 20.51 4.97 q 10.08 4.98 17.03 14.42 l 213.29 304.82 q 14.24 20.24 2.62 41.98 q -11.62 21.74 -36.1 21.74 h -2.28 l 113.26 169.39 q 15.67 22.87 2.24 46.74 q -13.44 23.87 -40.79 23.87 H 562.07 v 114.5 q 0 19.15 -13.18 32.33 q -13.17 13.17 -32.32 13.17 h -73.14 q -19.15 0 -32.32 -13.17 q -13.18 -13.18 -13.18 -32.33 v -114.5 Z"
             RoundedPolygon(SvgPathParser.parseFeatures(svgPathNotSuitableForProductionCodeImport))
                 .normalized()
         },
-        CustomShapeParameters("2") {
+        CustomShapeParameters("Bedtime") {
             val svgPathNotSuitableForProductionCodeImport =
-                "M 801.2 -192.59 H 511.33 q -12.8 0 -21.86 -9.06 q -9.06 -9.06 -9.06 -21.85 v -47.25 q 0 -3.29 8.24 -22.01 l 192.96 -201.22 q 32.52 -35 45.66 -57.42 q 13.14 -22.43 13.14 -50.51 q 0 -27.45 -20.94 -49.69 q -20.95 -22.25 -62.84 -22.25 q -24.62 0 -42.13 9.9 q -17.52 9.91 -30.04 26.19 q -11.2 15.43 -28.37 21.03 q -17.18 5.6 -34.01 -1.09 q -19.07 -7.79 -27.49 -25.06 q -8.42 -17.27 0.78 -32.95 q 22.43 -37.39 63.25 -64.49 q 40.81 -27.09 99.8 -27.09 q 84.41 0 131.98 48.92 q 47.58 48.92 47.58 115.86 q 0 46.67 -21.72 84.51 t -65.72 84.27 l -139.3 148.42 l 1.52 3.28 H 801.2 q 19.03 0 31.9 12.87 q 12.88 12.88 12.88 31.91 t -12.88 31.91 q -12.87 12.87 -31.9 12.87"
+                "M 484 -75.22 q -84.96 0 -159.29 -32.36 q -74.34 -32.35 -129.56 -87.57 q -55.22 -55.22 -87.57 -129.56 Q 75.22 -399.04 75.22 -484 q 0 -126.8 70.44 -230.57 q 70.45 -103.76 189.06 -148.86 q 26.06 -10.87 49.49 4.54 q 23.42 15.41 23.62 43.43 q -0.61 82.61 28.79 157.7 q 29.4 75.09 87.73 133.41 q 58.32 58.33 133.29 87.61 t 157.34 28.91 q 30.06 0.44 45.31 22.41 q 15.25 21.96 5.34 47.83 q -45.91 119.05 -149.77 190.71 Q 612 -75.22 484 -75.22 Z"
             RoundedPolygon(SvgPathParser.parseFeatures(svgPathNotSuitableForProductionCodeImport))
                 .normalized()
         },
-        CustomShapeParameters("Thin 3") {
+        CustomShapeParameters("Send") {
             val svgPathNotSuitableForProductionCodeImport =
-                "M 570.77 -235.38 H 380 q -10.38 0 -17.5 -7.12 q -7.12 -7.12 -7.12 -17.5 q 0 -10.38 7.12 -17.5 q 7.12 -7.12 17.5 -7.12 h 190.77 q 10.77 0 17.69 -6.92 q 6.92 -6.92 6.92 -17.69 v -121.54 q 0 -10.77 -6.92 -17.69 q -6.92 -6.92 -17.69 -6.92 H 420 q -10.38 0 -17.5 -7.12 q -7.12 -7.12 -7.12 -17.5 q 0 -10.38 7.12 -17.5 q 7.12 -7.12 17.5 -7.12 h 150.77 q 10.77 0 17.69 -6.92 q 6.92 -6.92 6.92 -17.69 v -121.54 q 0 -10.77 -6.92 -17.69 q -6.92 -6.92 -17.69 -6.92 H 380 q -10.38 0 -17.5 -7.12 q -7.12 -7.12 -7.12 -17.5 q 0 -10.38 7.12 -17.5 q 7.12 -7.12 17.5 -7.12 h 190.77 q 30.77 0 52.31 21.54 q 21.54 21.54 21.54 52.31 v 122.15 q 0 19.62 -12.2 34.12 q -12.19 14.5 -31.04 14.5 q 18.85 0 31.04 14.5 q 12.2 14.5 12.2 34.12 v 122.15 q 0 30.77 -21.54 52.31 q -21.54 21.54 -52.31 21.54 Z"
+                "M 176.24 -178.7 q -22.87 9.44 -43.26 -3.85 q -20.39 -13.3 -20.39 -38.17 V -393.3 l 331 -86.7 l -331 -86.7 v -172.58 q 0 -24.87 20.39 -38.17 q 20.39 -13.29 43.26 -3.85 l 613.61 259.28 q 28.11 12.43 28.11 42.02 q 0 29.59 -28.11 42.02 L 176.24 -178.7 Z"
             RoundedPolygon(SvgPathParser.parseFeatures(svgPathNotSuitableForProductionCodeImport))
                 .normalized()
         },
-        CustomShapeParameters("Thick 3") {
+        CustomShapeParameters("Humidity") {
             val svgPathNotSuitableForProductionCodeImport =
-                "M 558.33 -198.09 H 380 q -25.96 0 -43.82 -17.98 q -17.85 -17.97 -17.85 -43.93 t 17.97 -43.93 q 17.98 -17.98 43.94 -17.98 h 177.85 v -96.18 H 420 q -25.96 0 -43.82 -17.98 q -17.85 -17.97 -17.85 -43.93 t 17.97 -43.93 q 17.98 -17.98 43.94 -17.98 h 137.85 v -96.18 H 380 q -25.96 0 -43.82 -17.98 q -17.85 -17.97 -17.85 -43.93 t 17.97 -43.93 q 17.98 -17.98 43.94 -17.98 h 178.09 q 51.67 0 87.63 36.11 q 35.95 36.12 35.95 87.71 V -564 q 0 33.57 -22.34 57.83 q -22.35 24.26 -55.68 26.17 q 33.33 1.91 55.68 26.17 q 22.34 24.26 22.34 57.83 v 74.09 q 0 51.59 -35.95 87.71 q -35.96 36.11 -87.63 36.11 Z"
+                "M 480 -91.87 q -136.11 0 -232.12 -94.15 q -96.01 -94.15 -96.01 -229.5 q 0 -64.91 25.1 -124.09 q 25.1 -59.17 71.53 -104.37 l 167.85 -164.85 q 13.67 -12.67 30.08 -19.39 q 16.42 -6.71 33.57 -6.71 t 33.57 6.71 q 16.41 6.72 30.08 19.39 L 711.5 -643.98 q 46.43 45.2 71.53 104.37 q 25.1 59.18 25.1 124.09 q 0 135.35 -96.01 229.5 T 480 -91.87 Z"
             RoundedPolygon(SvgPathParser.parseFeatures(svgPathNotSuitableForProductionCodeImport))
                 .normalized()
         },
diff --git a/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/ShapeParameters.kt b/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/ShapeParameters.kt
index d989266..74560e3 100644
--- a/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/ShapeParameters.kt
+++ b/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/ShapeParameters.kt
@@ -432,7 +432,7 @@
     fun serialized(): String =
         """
             val features: List<Feature> = FeatureSerializer.parse("${FeatureSerializer.serialize(genShape().features)}")
-            val triangle: RoundedPolygon = RoundedPolygon(features, centerX = <recommended to add>, centerY = <recommended to add>)
+            val shape: RoundedPolygon = RoundedPolygon(features, centerX = <recommended to add>, centerY = <recommended to add>)
         """
             .trimIndent()
 
diff --git a/health/connect/connect-testing/api/current.txt b/health/connect/connect-testing/api/current.txt
index df213f9..8a08ff1 100644
--- a/health/connect/connect-testing/api/current.txt
+++ b/health/connect/connect-testing/api/current.txt
@@ -40,36 +40,36 @@
 
   public final class FakeHealthConnectClientOverrides {
     ctor public FakeHealthConnectClientOverrides();
-    ctor public FakeHealthConnectClientOverrides(optional androidx.health.connect.client.testing.stubs.Stub? getChanges, optional androidx.health.connect.client.testing.stubs.Stub? getChangesToken, optional androidx.health.connect.client.testing.stubs.Stub? readRecords, optional androidx.health.connect.client.testing.stubs.Stub? readRecord, optional androidx.health.connect.client.testing.stubs.Stub? insertRecords, optional androidx.health.connect.client.testing.stubs.Stub? updateRecords, optional androidx.health.connect.client.testing.stubs.Stub? deleteRecords, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>? aggregate, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByDurationRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>? aggregateGroupByDuration, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByPeriodRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>? aggregateGroupByPeriod);
+    ctor public FakeHealthConnectClientOverrides(optional androidx.health.connect.client.testing.stubs.Stub<? super java.lang.String,androidx.health.connect.client.response.ChangesResponse>? getChanges, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.ChangesTokenRequest,java.lang.String>? getChangesToken, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.ReadRecordsRequest<? extends java.lang.Object?>,? extends androidx.health.connect.client.response.ReadRecordsResponse<? extends java.lang.Object?>>? readRecords, optional androidx.health.connect.client.testing.stubs.Stub<? super java.lang.String,? extends androidx.health.connect.client.response.ReadRecordResponse<? extends java.lang.Object?>>? readRecord, optional androidx.health.connect.client.testing.stubs.Stub<? super java.util.List<? extends java.lang.Object?>,androidx.health.connect.client.response.InsertRecordsResponse>? insertRecords, optional androidx.health.connect.client.testing.stubs.Stub? updateRecords, optional androidx.health.connect.client.testing.stubs.Stub? deleteRecords, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>? aggregate, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByDurationRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>? aggregateGroupByDuration, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByPeriodRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>? aggregateGroupByPeriod);
     method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>? getAggregate();
     method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateGroupByDurationRequest,java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>? getAggregateGroupByDuration();
     method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateGroupByPeriodRequest,java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>? getAggregateGroupByPeriod();
     method public androidx.health.connect.client.testing.stubs.Stub? getDeleteRecords();
-    method public androidx.health.connect.client.testing.stubs.Stub? getGetChanges();
-    method public androidx.health.connect.client.testing.stubs.Stub? getGetChangesToken();
-    method public androidx.health.connect.client.testing.stubs.Stub? getInsertRecords();
-    method public androidx.health.connect.client.testing.stubs.Stub? getReadRecord();
-    method public androidx.health.connect.client.testing.stubs.Stub? getReadRecords();
+    method public androidx.health.connect.client.testing.stubs.Stub<java.lang.String,androidx.health.connect.client.response.ChangesResponse>? getGetChanges();
+    method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.ChangesTokenRequest,java.lang.String>? getGetChangesToken();
+    method public androidx.health.connect.client.testing.stubs.Stub<java.util.List<? extends java.lang.Object?>,androidx.health.connect.client.response.InsertRecordsResponse>? getInsertRecords();
+    method public androidx.health.connect.client.testing.stubs.Stub<java.lang.String,androidx.health.connect.client.response.ReadRecordResponse<? extends java.lang.Object?>>? getReadRecord();
+    method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.ReadRecordsRequest<? extends java.lang.Object?>,androidx.health.connect.client.response.ReadRecordsResponse<? extends java.lang.Object?>>? getReadRecords();
     method public androidx.health.connect.client.testing.stubs.Stub? getUpdateRecords();
     method public void setAggregate(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>?);
     method public void setAggregateGroupByDuration(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByDurationRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>?);
     method public void setAggregateGroupByPeriod(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByPeriodRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>?);
     method public void setDeleteRecords(androidx.health.connect.client.testing.stubs.Stub?);
-    method public void setGetChanges(androidx.health.connect.client.testing.stubs.Stub?);
-    method public void setGetChangesToken(androidx.health.connect.client.testing.stubs.Stub?);
-    method public void setInsertRecords(androidx.health.connect.client.testing.stubs.Stub?);
-    method public void setReadRecord(androidx.health.connect.client.testing.stubs.Stub?);
-    method public void setReadRecords(androidx.health.connect.client.testing.stubs.Stub?);
+    method public void setGetChanges(androidx.health.connect.client.testing.stubs.Stub<? super java.lang.String,androidx.health.connect.client.response.ChangesResponse>?);
+    method public void setGetChangesToken(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.ChangesTokenRequest,java.lang.String>?);
+    method public void setInsertRecords(androidx.health.connect.client.testing.stubs.Stub<? super java.util.List<? extends java.lang.Object?>,androidx.health.connect.client.response.InsertRecordsResponse>?);
+    method public void setReadRecord(androidx.health.connect.client.testing.stubs.Stub<? super java.lang.String,? extends androidx.health.connect.client.response.ReadRecordResponse<? extends java.lang.Object?>>?);
+    method public void setReadRecords(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.ReadRecordsRequest<? extends java.lang.Object?>,? extends androidx.health.connect.client.response.ReadRecordsResponse<? extends java.lang.Object?>>?);
     method public void setUpdateRecords(androidx.health.connect.client.testing.stubs.Stub?);
     property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>? aggregate;
     property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateGroupByDurationRequest,java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>? aggregateGroupByDuration;
     property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateGroupByPeriodRequest,java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>? aggregateGroupByPeriod;
     property public final androidx.health.connect.client.testing.stubs.Stub? deleteRecords;
-    property public final androidx.health.connect.client.testing.stubs.Stub? getChanges;
-    property public final androidx.health.connect.client.testing.stubs.Stub? getChangesToken;
-    property public final androidx.health.connect.client.testing.stubs.Stub? insertRecords;
-    property public final androidx.health.connect.client.testing.stubs.Stub? readRecord;
-    property public final androidx.health.connect.client.testing.stubs.Stub? readRecords;
+    property public final androidx.health.connect.client.testing.stubs.Stub<java.lang.String,androidx.health.connect.client.response.ChangesResponse>? getChanges;
+    property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.ChangesTokenRequest,java.lang.String>? getChangesToken;
+    property public final androidx.health.connect.client.testing.stubs.Stub<java.util.List<? extends java.lang.Object?>,androidx.health.connect.client.response.InsertRecordsResponse>? insertRecords;
+    property public final androidx.health.connect.client.testing.stubs.Stub<java.lang.String,androidx.health.connect.client.response.ReadRecordResponse<? extends java.lang.Object?>>? readRecord;
+    property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.ReadRecordsRequest<? extends java.lang.Object?>,androidx.health.connect.client.response.ReadRecordsResponse<? extends java.lang.Object?>>? readRecords;
     property public final androidx.health.connect.client.testing.stubs.Stub? updateRecords;
   }
 
diff --git a/health/connect/connect-testing/api/restricted_current.txt b/health/connect/connect-testing/api/restricted_current.txt
index df213f9..8a08ff1 100644
--- a/health/connect/connect-testing/api/restricted_current.txt
+++ b/health/connect/connect-testing/api/restricted_current.txt
@@ -40,36 +40,36 @@
 
   public final class FakeHealthConnectClientOverrides {
     ctor public FakeHealthConnectClientOverrides();
-    ctor public FakeHealthConnectClientOverrides(optional androidx.health.connect.client.testing.stubs.Stub? getChanges, optional androidx.health.connect.client.testing.stubs.Stub? getChangesToken, optional androidx.health.connect.client.testing.stubs.Stub? readRecords, optional androidx.health.connect.client.testing.stubs.Stub? readRecord, optional androidx.health.connect.client.testing.stubs.Stub? insertRecords, optional androidx.health.connect.client.testing.stubs.Stub? updateRecords, optional androidx.health.connect.client.testing.stubs.Stub? deleteRecords, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>? aggregate, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByDurationRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>? aggregateGroupByDuration, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByPeriodRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>? aggregateGroupByPeriod);
+    ctor public FakeHealthConnectClientOverrides(optional androidx.health.connect.client.testing.stubs.Stub<? super java.lang.String,androidx.health.connect.client.response.ChangesResponse>? getChanges, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.ChangesTokenRequest,java.lang.String>? getChangesToken, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.ReadRecordsRequest<? extends java.lang.Object?>,? extends androidx.health.connect.client.response.ReadRecordsResponse<? extends java.lang.Object?>>? readRecords, optional androidx.health.connect.client.testing.stubs.Stub<? super java.lang.String,? extends androidx.health.connect.client.response.ReadRecordResponse<? extends java.lang.Object?>>? readRecord, optional androidx.health.connect.client.testing.stubs.Stub<? super java.util.List<? extends java.lang.Object?>,androidx.health.connect.client.response.InsertRecordsResponse>? insertRecords, optional androidx.health.connect.client.testing.stubs.Stub? updateRecords, optional androidx.health.connect.client.testing.stubs.Stub? deleteRecords, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>? aggregate, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByDurationRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>? aggregateGroupByDuration, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByPeriodRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>? aggregateGroupByPeriod);
     method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>? getAggregate();
     method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateGroupByDurationRequest,java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>? getAggregateGroupByDuration();
     method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateGroupByPeriodRequest,java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>? getAggregateGroupByPeriod();
     method public androidx.health.connect.client.testing.stubs.Stub? getDeleteRecords();
-    method public androidx.health.connect.client.testing.stubs.Stub? getGetChanges();
-    method public androidx.health.connect.client.testing.stubs.Stub? getGetChangesToken();
-    method public androidx.health.connect.client.testing.stubs.Stub? getInsertRecords();
-    method public androidx.health.connect.client.testing.stubs.Stub? getReadRecord();
-    method public androidx.health.connect.client.testing.stubs.Stub? getReadRecords();
+    method public androidx.health.connect.client.testing.stubs.Stub<java.lang.String,androidx.health.connect.client.response.ChangesResponse>? getGetChanges();
+    method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.ChangesTokenRequest,java.lang.String>? getGetChangesToken();
+    method public androidx.health.connect.client.testing.stubs.Stub<java.util.List<? extends java.lang.Object?>,androidx.health.connect.client.response.InsertRecordsResponse>? getInsertRecords();
+    method public androidx.health.connect.client.testing.stubs.Stub<java.lang.String,androidx.health.connect.client.response.ReadRecordResponse<? extends java.lang.Object?>>? getReadRecord();
+    method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.ReadRecordsRequest<? extends java.lang.Object?>,androidx.health.connect.client.response.ReadRecordsResponse<? extends java.lang.Object?>>? getReadRecords();
     method public androidx.health.connect.client.testing.stubs.Stub? getUpdateRecords();
     method public void setAggregate(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>?);
     method public void setAggregateGroupByDuration(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByDurationRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>?);
     method public void setAggregateGroupByPeriod(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByPeriodRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>?);
     method public void setDeleteRecords(androidx.health.connect.client.testing.stubs.Stub?);
-    method public void setGetChanges(androidx.health.connect.client.testing.stubs.Stub?);
-    method public void setGetChangesToken(androidx.health.connect.client.testing.stubs.Stub?);
-    method public void setInsertRecords(androidx.health.connect.client.testing.stubs.Stub?);
-    method public void setReadRecord(androidx.health.connect.client.testing.stubs.Stub?);
-    method public void setReadRecords(androidx.health.connect.client.testing.stubs.Stub?);
+    method public void setGetChanges(androidx.health.connect.client.testing.stubs.Stub<? super java.lang.String,androidx.health.connect.client.response.ChangesResponse>?);
+    method public void setGetChangesToken(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.ChangesTokenRequest,java.lang.String>?);
+    method public void setInsertRecords(androidx.health.connect.client.testing.stubs.Stub<? super java.util.List<? extends java.lang.Object?>,androidx.health.connect.client.response.InsertRecordsResponse>?);
+    method public void setReadRecord(androidx.health.connect.client.testing.stubs.Stub<? super java.lang.String,? extends androidx.health.connect.client.response.ReadRecordResponse<? extends java.lang.Object?>>?);
+    method public void setReadRecords(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.ReadRecordsRequest<? extends java.lang.Object?>,? extends androidx.health.connect.client.response.ReadRecordsResponse<? extends java.lang.Object?>>?);
     method public void setUpdateRecords(androidx.health.connect.client.testing.stubs.Stub?);
     property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>? aggregate;
     property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateGroupByDurationRequest,java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>? aggregateGroupByDuration;
     property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateGroupByPeriodRequest,java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>? aggregateGroupByPeriod;
     property public final androidx.health.connect.client.testing.stubs.Stub? deleteRecords;
-    property public final androidx.health.connect.client.testing.stubs.Stub? getChanges;
-    property public final androidx.health.connect.client.testing.stubs.Stub? getChangesToken;
-    property public final androidx.health.connect.client.testing.stubs.Stub? insertRecords;
-    property public final androidx.health.connect.client.testing.stubs.Stub? readRecord;
-    property public final androidx.health.connect.client.testing.stubs.Stub? readRecords;
+    property public final androidx.health.connect.client.testing.stubs.Stub<java.lang.String,androidx.health.connect.client.response.ChangesResponse>? getChanges;
+    property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.ChangesTokenRequest,java.lang.String>? getChangesToken;
+    property public final androidx.health.connect.client.testing.stubs.Stub<java.util.List<? extends java.lang.Object?>,androidx.health.connect.client.response.InsertRecordsResponse>? insertRecords;
+    property public final androidx.health.connect.client.testing.stubs.Stub<java.lang.String,androidx.health.connect.client.response.ReadRecordResponse<? extends java.lang.Object?>>? readRecord;
+    property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.ReadRecordsRequest<? extends java.lang.Object?>,androidx.health.connect.client.response.ReadRecordsResponse<? extends java.lang.Object?>>? readRecords;
     property public final androidx.health.connect.client.testing.stubs.Stub? updateRecords;
   }
 
diff --git a/health/connect/connect-testing/src/main/java/androidx/health/connect/client/testing/FakeHealthConnectClient.kt b/health/connect/connect-testing/src/main/java/androidx/health/connect/client/testing/FakeHealthConnectClient.kt
index a3c359d2..c810147 100644
--- a/health/connect/connect-testing/src/main/java/androidx/health/connect/client/testing/FakeHealthConnectClient.kt
+++ b/health/connect/connect-testing/src/main/java/androidx/health/connect/client/testing/FakeHealthConnectClient.kt
@@ -40,7 +40,6 @@
 import androidx.health.connect.client.response.InsertRecordsResponse
 import androidx.health.connect.client.response.ReadRecordResponse
 import androidx.health.connect.client.response.ReadRecordsResponse
-import androidx.health.connect.client.testing.stubs.throwOrContinue
 import androidx.health.connect.client.time.TimeRangeFilter
 import java.time.Clock
 import kotlin.reflect.KClass
@@ -114,8 +113,10 @@
      * precedence.
      */
     override suspend fun insertRecords(records: List<Record>): InsertRecordsResponse {
-        // Stub that only throws
-        overrides.insertRecords?.throwOrContinue(null)
+        // Stubs
+        overrides.insertRecords?.next(records)?.let {
+            return it
+        }
 
         // Fake implementation
         val recordIdsList = mutableListOf<String>()
@@ -145,8 +146,8 @@
     }
 
     override suspend fun updateRecords(records: List<Record>) {
-        // Stub that throws if set
-        overrides.updateRecords?.throwOrContinue(null)
+        // Stubs
+        overrides.updateRecords?.next(records)
 
         // Check if all records belong to the package
         if (records.any { it.packageName != packageName }) {
@@ -171,8 +172,8 @@
         recordIdsList: List<String>,
         clientRecordIdsList: List<String>
     ) {
-        // Stub that throws if set
-        overrides.deleteRecords?.throwOrContinue(null)
+        // Stubs
+        overrides.deleteRecords?.next(Unit)
 
         // Check if all records belong to the package
         if (
@@ -213,8 +214,8 @@
         recordType: KClass<out Record>,
         timeRangeFilter: TimeRangeFilter
     ) {
-        // Stub that throws if set
-        overrides.deleteRecords?.throwOrContinue(null)
+        // Stubs
+        overrides.deleteRecords?.next(Unit)
 
         // Fake implementation
         val recordIdsToRemove =
@@ -237,7 +238,9 @@
         recordId: String
     ): ReadRecordResponse<T> {
         // Stubs
-        overrides.readRecord?.throwOrContinue(null)
+        overrides.readRecord?.next(recordId)?.let {
+            return it as ReadRecordResponse<T>
+        }
 
         // Fake implementation
         return ReadRecordResponse(idsToRecords[recordId.toRecordId(packageName)] as T)
@@ -258,7 +261,9 @@
             TODO("Not yet implemented")
         }
         // Stubs
-        overrides.readRecords?.throwOrContinue(null)
+        overrides.readRecords?.next(request)?.let {
+            return it as ReadRecordsResponse<T>
+        }
 
         // Fake implementation
         val startIndex = request.pageToken?.toIntOrNull() ?: 0
@@ -333,7 +338,10 @@
      * track changes from the moment this function is called.
      */
     override suspend fun getChangesToken(request: ChangesTokenRequest): String {
-        overrides.getChangesToken?.throwOrContinue(null)
+        // Stubs
+        overrides.getChangesToken?.next(request)?.let {
+            return it
+        }
 
         if (request.recordTypes.isEmpty()) {
             throw IllegalArgumentException("Record types must not be empty")
@@ -373,7 +381,9 @@
 
     override suspend fun getChanges(changesToken: String): ChangesResponse {
         // Stubs
-        overrides.getChanges?.throwOrContinue(null)
+        overrides.getChanges?.next(changesToken)?.let {
+            return it
+        }
 
         // Fake implementation
 
diff --git a/health/connect/connect-testing/src/main/java/androidx/health/connect/client/testing/FakeHealthConnectClientOverrides.kt b/health/connect/connect-testing/src/main/java/androidx/health/connect/client/testing/FakeHealthConnectClientOverrides.kt
index f41c46b..814a599 100644
--- a/health/connect/connect-testing/src/main/java/androidx/health/connect/client/testing/FakeHealthConnectClientOverrides.kt
+++ b/health/connect/connect-testing/src/main/java/androidx/health/connect/client/testing/FakeHealthConnectClientOverrides.kt
@@ -22,6 +22,12 @@
 import androidx.health.connect.client.request.AggregateGroupByDurationRequest
 import androidx.health.connect.client.request.AggregateGroupByPeriodRequest
 import androidx.health.connect.client.request.AggregateRequest
+import androidx.health.connect.client.request.ChangesTokenRequest
+import androidx.health.connect.client.request.ReadRecordsRequest
+import androidx.health.connect.client.response.ChangesResponse
+import androidx.health.connect.client.response.InsertRecordsResponse
+import androidx.health.connect.client.response.ReadRecordResponse
+import androidx.health.connect.client.response.ReadRecordsResponse
 import androidx.health.connect.client.testing.stubs.Stub
 
 /**
@@ -53,16 +59,29 @@
  *   [FakeHealthConnectClient.aggregateGroupByPeriod].
  */
 public class FakeHealthConnectClientOverrides(
-    /*  Changes stubs, only used to throw exceptions */
-    public var getChanges: Stub<Nothing?, Nothing>? = null,
-    public var getChangesToken: Stub<Nothing?, Nothing>? = null,
 
-    /*  Records stubs, only used to throw exceptions */
-    public var readRecords: Stub<Nothing?, Nothing>? = null,
-    public var readRecord: Stub<Nothing?, Nothing>? = null,
-    public var insertRecords: Stub<Nothing?, Nothing>? = null,
-    public var updateRecords: Stub<Nothing?, Nothing>? = null,
-    public var deleteRecords: Stub<Nothing?, Nothing>? = null,
+    /** A [Stub] used to set the next responses used in [getChanges]. */
+    public var getChanges: Stub<String, ChangesResponse>? = null,
+
+    /** A [Stub] used to set the next responses used in [getChangesToken]. */
+    public var getChangesToken: Stub<ChangesTokenRequest, String>? = null,
+
+    /*  Records stubs */
+
+    /** A [Stub] used to set the next responses used in [readRecords]. */
+    public var readRecords: Stub<ReadRecordsRequest<*>, ReadRecordsResponse<*>>? = null,
+
+    /** A [Stub] used to set the next responses used in [readRecord]. */
+    public var readRecord: Stub<String, ReadRecordResponse<*>>? = null,
+
+    /** A [Stub] used to set the next responses used in [insertRecords]. */
+    public var insertRecords: Stub<List<*>, InsertRecordsResponse>? = null,
+
+    /** A [Stub] used only to throw exceptions in [updateRecords]. */
+    public var updateRecords: Stub<Any, Nothing>? = null,
+
+    /** A [Stub] used only to throw exceptions in [deleteRecords]. */
+    public var deleteRecords: Stub<Any, Nothing>? = null,
 
     /*  Aggregation stubs */
     /**
diff --git a/health/connect/connect-testing/src/test/java/androidx/health/connect/client/testing/FakeHealthConnectClientOverridesTest.kt b/health/connect/connect-testing/src/test/java/androidx/health/connect/client/testing/FakeHealthConnectClientOverridesTest.kt
index 48c17d1..cbea9a0 100644
--- a/health/connect/connect-testing/src/test/java/androidx/health/connect/client/testing/FakeHealthConnectClientOverridesTest.kt
+++ b/health/connect/connect-testing/src/test/java/androidx/health/connect/client/testing/FakeHealthConnectClientOverridesTest.kt
@@ -18,9 +18,16 @@
 
 import androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration
 import androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod
+import androidx.health.connect.client.changes.UpsertionChange
 import androidx.health.connect.client.records.HeartRateRecord
 import androidx.health.connect.client.records.StepsCadenceRecord
+import androidx.health.connect.client.records.StepsRecord
 import androidx.health.connect.client.request.ChangesTokenRequest
+import androidx.health.connect.client.response.ChangesResponse
+import androidx.health.connect.client.response.InsertRecordsResponse
+import androidx.health.connect.client.response.ReadRecordResponse
+import androidx.health.connect.client.response.ReadRecordsResponse
+import androidx.health.connect.client.testing.stubs.Stub
 import androidx.health.connect.client.testing.stubs.stub
 import androidx.health.connect.client.testing.testdata.dummyAggregateGbdRequest
 import androidx.health.connect.client.testing.testdata.dummyAggregateGbpRequest
@@ -60,6 +67,32 @@
         }
     }
 
+    /* Records stubbed elements */
+
+    @Test
+    fun readRecord_stubbedElement() = runTest {
+        fake.overrides.readRecord = stub(ReadRecordResponse(runRecord1))
+        val response =
+            fake.readRecord(recordType = runRecord1::class, recordId = runRecord1.metadata.id)
+        assertThat(response.record).isEqualTo(runRecord1)
+    }
+
+    @Test
+    fun readRecords_stubbedElement() = runTest {
+        fake.overrides.readRecords =
+            stub(ReadRecordsResponse(records = listOf(runRecord1), pageToken = "test"))
+        val response = fake.readRecords(dummyReadRecordsRequest)
+        assertThat(response.records).hasSize(1)
+        assertThat(response.records.first().title).isEqualTo(runRecord1.title)
+    }
+
+    @Test
+    fun insertRecords_stubbedElement() = runTest {
+        fake.overrides.insertRecords = stub(InsertRecordsResponse(listOf("test")))
+        val response = fake.insertRecords(emptyList())
+        assertThat(response.recordIdsList.first()).isEqualTo("test")
+    }
+
     /* Record exceptions */
 
     @Test
@@ -118,6 +151,22 @@
         }
     }
 
+    @Test
+    fun deleteRecordsIds_stubbedException_throws() = runTest {
+        val expectedException = Exception()
+        fake.overrides.deleteRecords = stub { throw expectedException }
+
+        assertThrows(expectedException::class.java) {
+            runBlocking {
+                fake.deleteRecords(
+                    recordType = runRecord1::class,
+                    recordIdsList = emptyList(),
+                    clientRecordIdsList = emptyList()
+                )
+            }
+        }
+    }
+
     /* Aggregation exceptions */
 
     @Test
@@ -241,4 +290,34 @@
             runBlocking { fake.getChangesToken(ChangesTokenRequest(recordTypes = emptySet())) }
         }
     }
+
+    @Test
+    fun getChangesToken_stubbedElement() = runTest {
+        val changesToken = "test_token"
+        fake.overrides.getChangesToken = stub(changesToken)
+        val response = fake.getChangesToken(ChangesTokenRequest(setOf(StepsRecord::class)))
+
+        assertThat(response).isEqualTo(changesToken)
+    }
+
+    @Test
+    fun getChanges_stubbedElement() = runTest {
+        val changesToken = "test_token"
+        fake.overrides.getChanges = Stub { token ->
+            if (token == changesToken) {
+                ChangesResponse(
+                    changes = listOf(UpsertionChange(runRecord1)),
+                    hasMore = true,
+                    changesTokenExpired = false,
+                    nextChangesToken = "next"
+                )
+            } else {
+                throw IllegalStateException()
+            }
+        }
+        val response = fake.getChanges(changesToken)
+
+        assertThat(response.changes).hasSize(1)
+        assertThat(response.nextChangesToken).isEqualTo("next")
+    }
 }
diff --git a/lifecycle/lifecycle-viewmodel-testing/bcv/native/current.txt b/lifecycle/lifecycle-viewmodel-testing/bcv/native/current.txt
index 23fa7e1..887b927 100644
--- a/lifecycle/lifecycle-viewmodel-testing/bcv/native/current.txt
+++ b/lifecycle/lifecycle-viewmodel-testing/bcv/native/current.txt
@@ -16,5 +16,6 @@
 }
 
 final fun androidx.lifecycle.viewmodel.testing/DefaultCreationExtras(): androidx.lifecycle.viewmodel/CreationExtras // androidx.lifecycle.viewmodel.testing/DefaultCreationExtras|DefaultCreationExtras(){}[0]
+final fun androidx.lifecycle.viewmodel.testing/DefaultCreationExtras(androidx.savedstate/SavedState): androidx.lifecycle.viewmodel/CreationExtras // androidx.lifecycle.viewmodel.testing/DefaultCreationExtras|DefaultCreationExtras(androidx.savedstate.SavedState){}[0]
 final inline fun <#A: reified androidx.lifecycle/ViewModel> androidx.lifecycle.viewmodel.testing/viewModelScenario(androidx.lifecycle.viewmodel/CreationExtras = ..., noinline kotlin/Function1<androidx.lifecycle.viewmodel/CreationExtras, #A>): androidx.lifecycle.viewmodel.testing/ViewModelScenario<#A> // androidx.lifecycle.viewmodel.testing/viewModelScenario|viewModelScenario(androidx.lifecycle.viewmodel.CreationExtras;kotlin.Function1<androidx.lifecycle.viewmodel.CreationExtras,0:0>){0§<androidx.lifecycle.ViewModel>}[0]
 final inline fun <#A: reified androidx.lifecycle/ViewModel> androidx.lifecycle.viewmodel.testing/viewModelScenario(androidx.lifecycle/ViewModelProvider.Factory, androidx.lifecycle.viewmodel/CreationExtras = ...): androidx.lifecycle.viewmodel.testing/ViewModelScenario<#A> // androidx.lifecycle.viewmodel.testing/viewModelScenario|viewModelScenario(androidx.lifecycle.ViewModelProvider.Factory;androidx.lifecycle.viewmodel.CreationExtras){0§<androidx.lifecycle.ViewModel>}[0]
diff --git a/lifecycle/lifecycle-viewmodel-testing/build.gradle b/lifecycle/lifecycle-viewmodel-testing/build.gradle
index 6c99a18a..7b8469f 100644
--- a/lifecycle/lifecycle-viewmodel-testing/build.gradle
+++ b/lifecycle/lifecycle-viewmodel-testing/build.gradle
@@ -58,6 +58,9 @@
                 api(project(":lifecycle:lifecycle-viewmodel"))
                 api(libs.kotlinStdlib)
                 api(libs.kotlinCoroutinesCore)
+                implementation(project(":lifecycle:lifecycle-runtime"))
+                implementation(project(":lifecycle:lifecycle-runtime-testing"))
+                implementation(project(":lifecycle:lifecycle-viewmodel-savedstate"))
             }
         }
 
@@ -71,11 +74,6 @@
 
         androidMain {
             dependsOn(commonMain)
-            dependencies {
-                implementation(project(":lifecycle:lifecycle-runtime"))
-                implementation(project(":lifecycle:lifecycle-runtime-testing"))
-                implementation(project(":lifecycle:lifecycle-viewmodel-savedstate"))
-            }
         }
 
         androidInstrumentedTest {
diff --git a/lifecycle/lifecycle-viewmodel-testing/src/androidMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.android.kt b/lifecycle/lifecycle-viewmodel-testing/src/androidMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.android.kt
deleted file mode 100644
index 6e5a48c..0000000
--- a/lifecycle/lifecycle-viewmodel-testing/src/androidMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.android.kt
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 2024 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.
- */
-@file:JvmName("DefaultCreationExtrasKt")
-
-package androidx.lifecycle.viewmodel.testing
-
-import android.os.Bundle
-import androidx.lifecycle.DEFAULT_ARGS_KEY
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.LifecycleOwner
-import androidx.lifecycle.LifecycleRegistry
-import androidx.lifecycle.SAVED_STATE_REGISTRY_OWNER_KEY
-import androidx.lifecycle.SavedStateHandle
-import androidx.lifecycle.VIEW_MODEL_STORE_OWNER_KEY
-import androidx.lifecycle.ViewModelStore
-import androidx.lifecycle.ViewModelStoreOwner
-import androidx.lifecycle.enableSavedStateHandles
-import androidx.lifecycle.testing.TestLifecycleOwner
-import androidx.lifecycle.viewmodel.CreationExtras
-import androidx.lifecycle.viewmodel.MutableCreationExtras
-import androidx.savedstate.SavedStateRegistryController
-import androidx.savedstate.SavedStateRegistryOwner
-
-/**
- * Creates a default instance of [CreationExtras] pre-configured with all keys required to use
- * [SavedStateHandle].
- *
- * This function sets up the instance with:
- * - A fake [SavedStateRegistryOwner] assigned to [SAVED_STATE_REGISTRY_OWNER_KEY], delegating the
- *   [LifecycleOwner] to a [TestLifecycleOwner].
- * - A fake [ViewModelStoreOwner] assigned to [VIEW_MODEL_STORE_OWNER_KEY], containing an empty
- *   [ViewModelStore].
- */
-@Suppress("FunctionName")
-public actual fun DefaultCreationExtras(): CreationExtras {
-    return DefaultCreationExtras(defaultArgs = Bundle())
-}
-
-/**
- * Creates a default instance of [CreationExtras] pre-configured with all keys required to use
- * [SavedStateHandle], with the specified [defaultArgs] as the [DEFAULT_ARGS_KEY].
- *
- * This function sets up the instance with:
- * - A fake [SavedStateRegistryOwner] assigned to [SAVED_STATE_REGISTRY_OWNER_KEY], delegating the
- *   [LifecycleOwner] to a [TestLifecycleOwner].
- * - A fake [ViewModelStoreOwner] assigned to [VIEW_MODEL_STORE_OWNER_KEY], containing an empty
- *   [ViewModelStore].
- */
-@Suppress("FunctionName")
-public fun DefaultCreationExtras(defaultArgs: Bundle): CreationExtras {
-    val owner =
-        object : ViewModelStoreOwner, LifecycleOwner, SavedStateRegistryOwner {
-            override val viewModelStore = ViewModelStore()
-
-            val lifecycleRegistry = LifecycleRegistry.createUnsafe(owner = this)
-            override val lifecycle: Lifecycle = lifecycleRegistry
-
-            val savedStateRegistryController = SavedStateRegistryController.create(owner = this)
-            override val savedStateRegistry = savedStateRegistryController.savedStateRegistry
-        }
-
-    owner.savedStateRegistryController.performAttach()
-    owner.savedStateRegistryController.performRestore(savedState = null)
-    owner.enableSavedStateHandles()
-
-    owner.lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
-
-    return MutableCreationExtras().apply {
-        this[SAVED_STATE_REGISTRY_OWNER_KEY] = owner
-        this[VIEW_MODEL_STORE_OWNER_KEY] = owner
-        this[DEFAULT_ARGS_KEY] = defaultArgs
-    }
-}
diff --git a/lifecycle/lifecycle-viewmodel-testing/src/commonMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.kt b/lifecycle/lifecycle-viewmodel-testing/src/commonMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.kt
index 5ca4b56..ca17de5 100644
--- a/lifecycle/lifecycle-viewmodel-testing/src/commonMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.kt
+++ b/lifecycle/lifecycle-viewmodel-testing/src/commonMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.kt
@@ -16,7 +16,71 @@
 
 package androidx.lifecycle.viewmodel.testing
 
+import androidx.lifecycle.DEFAULT_ARGS_KEY
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.LifecycleRegistry
+import androidx.lifecycle.SAVED_STATE_REGISTRY_OWNER_KEY
+import androidx.lifecycle.SavedStateHandle
+import androidx.lifecycle.VIEW_MODEL_STORE_OWNER_KEY
+import androidx.lifecycle.ViewModelStore
+import androidx.lifecycle.ViewModelStoreOwner
+import androidx.lifecycle.enableSavedStateHandles
+import androidx.lifecycle.testing.TestLifecycleOwner
 import androidx.lifecycle.viewmodel.CreationExtras
+import androidx.lifecycle.viewmodel.MutableCreationExtras
+import androidx.savedstate.SavedState
+import androidx.savedstate.SavedStateRegistryController
+import androidx.savedstate.SavedStateRegistryOwner
+import androidx.savedstate.savedState
 
-/** Creates a default instance of [CreationExtras]. */
-@Suppress("FunctionName") public expect fun DefaultCreationExtras(): CreationExtras
+/**
+ * Creates a default instance of [CreationExtras] pre-configured with all keys required to use
+ * [SavedStateHandle].
+ *
+ * This function sets up the instance with:
+ * - A fake [SavedStateRegistryOwner] assigned to [SAVED_STATE_REGISTRY_OWNER_KEY], delegating the
+ *   [LifecycleOwner] to a [TestLifecycleOwner].
+ * - A fake [ViewModelStoreOwner] assigned to [VIEW_MODEL_STORE_OWNER_KEY], containing an empty
+ *   [ViewModelStore].
+ */
+@Suppress("FunctionName")
+public fun DefaultCreationExtras(): CreationExtras {
+    return DefaultCreationExtras(defaultArgs = savedState())
+}
+
+/**
+ * Creates a default instance of [CreationExtras] pre-configured with all keys required to use
+ * [SavedStateHandle], with the specified [defaultArgs] as the [DEFAULT_ARGS_KEY].
+ *
+ * This function sets up the instance with:
+ * - A fake [SavedStateRegistryOwner] assigned to [SAVED_STATE_REGISTRY_OWNER_KEY], delegating the
+ *   [LifecycleOwner] to a [TestLifecycleOwner].
+ * - A fake [ViewModelStoreOwner] assigned to [VIEW_MODEL_STORE_OWNER_KEY], containing an empty
+ *   [ViewModelStore].
+ */
+@Suppress("FunctionName")
+public fun DefaultCreationExtras(defaultArgs: SavedState): CreationExtras {
+    val owner =
+        object : ViewModelStoreOwner, LifecycleOwner, SavedStateRegistryOwner {
+            override val viewModelStore = ViewModelStore()
+
+            val lifecycleRegistry = LifecycleRegistry.createUnsafe(owner = this)
+            override val lifecycle: Lifecycle = lifecycleRegistry
+
+            val savedStateRegistryController = SavedStateRegistryController.create(owner = this)
+            override val savedStateRegistry = savedStateRegistryController.savedStateRegistry
+        }
+
+    owner.savedStateRegistryController.performAttach()
+    owner.savedStateRegistryController.performRestore(savedState = null)
+    owner.enableSavedStateHandles()
+
+    owner.lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
+
+    return MutableCreationExtras().apply {
+        this[SAVED_STATE_REGISTRY_OWNER_KEY] = owner
+        this[VIEW_MODEL_STORE_OWNER_KEY] = owner
+        this[DEFAULT_ARGS_KEY] = defaultArgs
+    }
+}
diff --git a/lifecycle/lifecycle-viewmodel-testing/src/desktopMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.desktop.kt b/lifecycle/lifecycle-viewmodel-testing/src/desktopMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.desktop.kt
deleted file mode 100644
index 43f80b4..0000000
--- a/lifecycle/lifecycle-viewmodel-testing/src/desktopMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.desktop.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2024 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.
- */
-@file:JvmName("DefaultCreationExtrasKt")
-
-package androidx.lifecycle.viewmodel.testing
-
-import androidx.lifecycle.viewmodel.CreationExtras
-import androidx.lifecycle.viewmodel.CreationExtras.Empty
-
-@Suppress("FunctionName") public actual fun DefaultCreationExtras(): CreationExtras = Empty
diff --git a/lifecycle/lifecycle-viewmodel-testing/src/nonJvmCommonMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.nonJvm.kt b/lifecycle/lifecycle-viewmodel-testing/src/nonJvmCommonMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.nonJvm.kt
deleted file mode 100644
index e220c67..0000000
--- a/lifecycle/lifecycle-viewmodel-testing/src/nonJvmCommonMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.nonJvm.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright 2024 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 androidx.lifecycle.viewmodel.testing
-
-import androidx.lifecycle.viewmodel.CreationExtras
-import androidx.lifecycle.viewmodel.CreationExtras.Empty
-
-@Suppress("FunctionName") public actual fun DefaultCreationExtras(): CreationExtras = Empty
diff --git a/mediarouter/mediarouter/build.gradle b/mediarouter/mediarouter/build.gradle
index be4e538..cf66748 100644
--- a/mediarouter/mediarouter/build.gradle
+++ b/mediarouter/mediarouter/build.gradle
@@ -29,7 +29,6 @@
 }
 
 dependencies {
-    api(libs.jspecify)
     api("androidx.media:media:1.4.1")
     api(libs.guavaListenableFuture)
 
diff --git a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouteProviderTest.java b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouteProviderTest.java
index b08bbb7..d4655d9 100644
--- a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouteProviderTest.java
+++ b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouteProviderTest.java
@@ -23,14 +23,14 @@
 import android.content.Context;
 import android.os.Bundle;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.mediarouter.media.MediaRouteProvider.RouteControllerOptions;
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -100,7 +100,8 @@
         }
 
         @Override
-        public @Nullable DynamicGroupRouteController onCreateDynamicGroupRouteController(
+        @Nullable
+        public DynamicGroupRouteController onCreateDynamicGroupRouteController(
                 @NonNull String initialMemberRouteId,
                 @NonNull RouteControllerOptions routeControllerOptions) {
             return new TestDynamicGroupRouteController(
@@ -115,7 +116,8 @@
         }
 
         @Override
-        public @Nullable DynamicGroupRouteController onCreateDynamicGroupRouteController(
+        @Nullable
+        public DynamicGroupRouteController onCreateDynamicGroupRouteController(
                 @NonNull String initialMemberRouteId) {
             return new TestDynamicGroupRouteController(
                     initialMemberRouteId, /* routeControllerOptions= */ null);
@@ -126,20 +128,22 @@
             extends MediaRouteProvider.DynamicGroupRouteController {
 
         private final String mInitialMemberRouteId;
-        private final MediaRouteProvider.@NonNull RouteControllerOptions mRouteControllerOptions;
+        @NonNull private final MediaRouteProvider.RouteControllerOptions mRouteControllerOptions;
 
         private TestDynamicGroupRouteController(
                 String initialMemberRouteId,
-                MediaRouteProvider.@NonNull RouteControllerOptions routeControllerOptions) {
+                @NonNull MediaRouteProvider.RouteControllerOptions routeControllerOptions) {
             mInitialMemberRouteId = initialMemberRouteId;
             mRouteControllerOptions = routeControllerOptions;
         }
 
-        public @NonNull String getInitialMemberRouteId() {
+        @NonNull
+        public String getInitialMemberRouteId() {
             return mInitialMemberRouteId;
         }
 
-        public @NonNull RouteControllerOptions getRouteControllerOptions() {
+        @NonNull
+        public RouteControllerOptions getRouteControllerOptions() {
             return mRouteControllerOptions;
         }
 
diff --git a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2Test.java b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2Test.java
index 979dee5..ba339c6 100644
--- a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2Test.java
+++ b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2Test.java
@@ -33,6 +33,7 @@
 import android.support.mediacompat.testlib.util.PollingCheck;
 import android.text.TextUtils;
 
+import androidx.annotation.NonNull;
 import androidx.mediarouter.media.MediaRouter.RouteInfo;
 import androidx.mediarouter.testing.MediaRouterTestHelper;
 import androidx.test.core.app.ApplicationProvider;
@@ -41,7 +42,6 @@
 import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
-import org.jspecify.annotations.NonNull;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
diff --git a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouterDynamicProviderTest.java b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouterDynamicProviderTest.java
index 58b9133..f1a83ab 100644
--- a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouterDynamicProviderTest.java
+++ b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouterDynamicProviderTest.java
@@ -29,11 +29,11 @@
 import android.os.ConditionVariable;
 import android.os.Looper;
 
+import androidx.annotation.NonNull;
 import androidx.mediarouter.testing.MediaRouterTestHelper;
 import androidx.test.filters.SdkSuppress;
 import androidx.test.filters.SmallTest;
 
-import org.jspecify.annotations.NonNull;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -170,15 +170,15 @@
         @Override
         public void onRouteSelected(
                 @NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo selectedRoute,
+                @NonNull MediaRouter.RouteInfo selectedRoute,
                 int reason,
-                MediaRouter.@NonNull RouteInfo requestedRoute) {
+                @NonNull MediaRouter.RouteInfo requestedRoute) {
             mSelectedRouteChangeConditionVariable.open();
         }
 
         @Override
         public void onRouteAdded(
-                @NonNull MediaRouter router, MediaRouter.@NonNull RouteInfo route) {
+                @NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo route) {
             if (getCurrentRoutesAsMap().keySet().containsAll(mRouteIdsPending)) {
                 mPendingRoutesConditionVariable.open();
             }
diff --git a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/StubDynamicMediaRouteProviderService.java b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/StubDynamicMediaRouteProviderService.java
index 93c99ea..fac64ed 100644
--- a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/StubDynamicMediaRouteProviderService.java
+++ b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/StubDynamicMediaRouteProviderService.java
@@ -18,12 +18,11 @@
 import android.content.Context;
 import android.content.IntentFilter;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.collection.ArrayMap;
 import androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
@@ -62,7 +61,7 @@
         private final MediaRouteDescriptor mGroupDescriptor;
         private final Set<String> mCurrentSelectedRouteIds = new HashSet<>();
         private boolean mCurrentlyScanning = false;
-        private @Nullable DynamicGroupRouteController mGroupController;
+        @Nullable private DynamicGroupRouteController mGroupController;
 
         Provider(@NonNull Context context) {
             super(context);
@@ -101,8 +100,9 @@
             return newController;
         }
 
+        @Nullable
         @Override
-        public @Nullable DynamicGroupRouteController onCreateDynamicGroupRouteController(
+        public DynamicGroupRouteController onCreateDynamicGroupRouteController(
                 @NonNull String initialMemberRouteId,
                 @NonNull RouteControllerOptions routeControllerOptions) {
             mGroupController = new StubDynamicRouteController();
diff --git a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/StubMediaRouteProviderService.java b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/StubMediaRouteProviderService.java
index 7ca69e7..97a2e83 100644
--- a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/StubMediaRouteProviderService.java
+++ b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/StubMediaRouteProviderService.java
@@ -20,11 +20,10 @@
 import android.content.IntentFilter;
 
 import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.collection.ArrayMap;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/DeviceUtils.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/DeviceUtils.java
index 32863ed..8c37529 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/DeviceUtils.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/DeviceUtils.java
@@ -25,20 +25,26 @@
 import android.os.Build;
 
 import androidx.annotation.Dimension;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.mediarouter.R;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 /** Utility methods for checking properties of the current device. */
 final class DeviceUtils {
-    private static @Nullable Boolean sIsPhone;
-    private static @Nullable Boolean sIsTablet;
-    private static @Nullable Boolean sIsFoldable;
-    private static @Nullable Boolean sIsSevenInchTablet;
-    private static @Nullable Boolean sIsWearable;
-    private static @Nullable Boolean sIsAuto;
-    private static @Nullable Boolean sIsTv;
+    @Nullable
+    private static Boolean sIsPhone;
+    @Nullable
+    private static Boolean sIsTablet;
+    @Nullable
+    private static Boolean sIsFoldable;
+    @Nullable
+    private static Boolean sIsSevenInchTablet;
+    @Nullable
+    private static Boolean sIsWearable;
+    @Nullable
+    private static Boolean sIsAuto;
+    @Nullable
+    private static Boolean sIsTv;
 
     /** The feature name for Auto devices. */
     private static final String FEATURE_AUTO = "android.hardware.type.automotive";
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteActionProvider.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteActionProvider.java
index 93f7535..ad40b81 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteActionProvider.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteActionProvider.java
@@ -21,6 +21,8 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.core.view.ActionProvider;
@@ -28,9 +30,6 @@
 import androidx.mediarouter.media.MediaRouter;
 import androidx.mediarouter.media.MediaRouterParams;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 /**
  * The media route action provider displays a {@link MediaRouteButton media route button}
  * in the application's {@link ActionBar} to allow the user to select routes and
@@ -158,7 +157,8 @@
      *
      * @return The selector, never null.
      */
-    public @NonNull MediaRouteSelector getRouteSelector() {
+    @NonNull
+    public MediaRouteSelector getRouteSelector() {
         return mSelector;
     }
 
@@ -221,7 +221,8 @@
      *
      * @return The dialog factory, never null.
      */
-    public @NonNull MediaRouteDialogFactory getDialogFactory() {
+    @NonNull
+    public MediaRouteDialogFactory getDialogFactory() {
         return mDialogFactory;
     }
 
@@ -248,7 +249,8 @@
     /**
      * Gets the associated media route button, or null if it has not yet been created.
      */
-    public @Nullable MediaRouteButton getMediaRouteButton() {
+    @Nullable
+    public MediaRouteButton getMediaRouteButton() {
         return mButton;
     }
 
@@ -258,12 +260,14 @@
      * Subclasses may override this method to customize the button.
      * </p>
      */
-    public @NonNull MediaRouteButton onCreateMediaRouteButton() {
+    @NonNull
+    public MediaRouteButton onCreateMediaRouteButton() {
         return new MediaRouteButton(getContext());
     }
 
     @Override
-    public @NonNull View onCreateActionView() {
+    @NonNull
+    public View onCreateActionView() {
         if (mButton != null) {
             Log.e(TAG, "onCreateActionView: this ActionProvider is already associated " +
                     "with a menu item. Don't reuse MediaRouteActionProvider instances! " +
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
index 76b367d..fb1942a 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
@@ -31,6 +31,8 @@
 import android.view.SoundEffectConstants;
 import android.view.View;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.appcompat.widget.TooltipCompat;
 import androidx.core.graphics.drawable.DrawableCompat;
@@ -43,9 +45,6 @@
 import androidx.mediarouter.media.MediaRouter;
 import androidx.mediarouter.media.MediaRouterParams;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 /**
  * The media route button allows the user to select routes and to control the currently selected
  * route.
@@ -202,7 +201,8 @@
      *
      * @return The selector, never null.
      */
-    public @NonNull MediaRouteSelector getRouteSelector() {
+    @NonNull
+    public MediaRouteSelector getRouteSelector() {
         return mSelector;
     }
 
@@ -237,7 +237,8 @@
      *
      * @return The dialog factory, never null.
      */
-    public @NonNull MediaRouteDialogFactory getDialogFactory() {
+    @NonNull
+    public MediaRouteDialogFactory getDialogFactory() {
         return mDialogFactory;
     }
 
@@ -407,7 +408,8 @@
     }
 
     @Override
-    protected int @NonNull [] onCreateDrawableState(int extraSpace) {
+    @NonNull
+    protected int[] onCreateDrawableState(int extraSpace) {
         final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
 
         // Technically we should be handling this more completely, but these
@@ -675,49 +677,49 @@
         }
 
         @Override
-        public void onRouteAdded(@NonNull MediaRouter router, MediaRouter.@NonNull RouteInfo info) {
+        public void onRouteAdded(@NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo info) {
             refreshRoute();
         }
 
         @Override
         public void onRouteRemoved(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo info) {
+                @NonNull MediaRouter.RouteInfo info) {
             refreshRoute();
         }
 
         @Override
         public void onRouteChanged(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo info) {
+                @NonNull MediaRouter.RouteInfo info) {
             refreshRoute();
         }
 
         @Override
         public void onRouteSelected(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo info) {
+                @NonNull MediaRouter.RouteInfo info) {
             refreshRoute();
         }
 
         @Override
         public void onRouteUnselected(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo info) {
+                @NonNull MediaRouter.RouteInfo info) {
             refreshRoute();
         }
 
         @Override
         public void onProviderAdded(@NonNull MediaRouter router,
-                MediaRouter.@NonNull ProviderInfo provider) {
+                @NonNull MediaRouter.ProviderInfo provider) {
             refreshRoute();
         }
 
         @Override
         public void onProviderRemoved(@NonNull MediaRouter router,
-                MediaRouter.@NonNull ProviderInfo provider) {
+                @NonNull MediaRouter.ProviderInfo provider) {
             refreshRoute();
         }
 
         @Override
         public void onProviderChanged(@NonNull MediaRouter router,
-                MediaRouter.@NonNull ProviderInfo provider) {
+                @NonNull MediaRouter.ProviderInfo provider) {
             refreshRoute();
         }
 
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialog.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialog.java
index 88e7cf8..1ab6667 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialog.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialog.java
@@ -48,15 +48,14 @@
 import android.widget.TextView;
 
 import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatDialog;
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.mediarouter.R;
 import androidx.mediarouter.media.MediaRouteSelector;
 import androidx.mediarouter.media.MediaRouter;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.annotation.Retention;
@@ -153,7 +152,8 @@
      *
      * @return The selector, never null.
      */
-    public @NonNull MediaRouteSelector getRouteSelector() {
+    @NonNull
+    public MediaRouteSelector getRouteSelector() {
         return mSelector;
     }
 
@@ -208,7 +208,7 @@
      * @param route The route to consider, never null.
      * @return True if the route should be included in the chooser dialog.
      */
-    public boolean onFilterRoute(MediaRouter.@NonNull RouteInfo route) {
+    public boolean onFilterRoute(@NonNull MediaRouter.RouteInfo route) {
         return !route.isDefaultOrBluetooth() && route.isEnabled()
                 && route.matchesSelector(mSelector);
     }
@@ -469,8 +469,9 @@
             return getItem(position).isEnabled();
         }
 
+        @NonNull
         @Override
-        public @NonNull View getView(int position, View convertView, @NonNull ViewGroup parent) {
+        public View getView(int position, View convertView, @NonNull ViewGroup parent) {
             View view = convertView;
             if (view == null) {
                 view = mInflater.inflate(R.layout.mr_chooser_list_item, parent, false);
@@ -555,25 +556,25 @@
         }
 
         @Override
-        public void onRouteAdded(@NonNull MediaRouter router, MediaRouter.@NonNull RouteInfo info) {
+        public void onRouteAdded(@NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo info) {
             refreshRoutes();
         }
 
         @Override
         public void onRouteRemoved(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo info) {
+                @NonNull MediaRouter.RouteInfo info) {
             refreshRoutes();
         }
 
         @Override
         public void onRouteChanged(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo info) {
+                @NonNull MediaRouter.RouteInfo info) {
             refreshRoutes();
         }
 
         @Override
         public void onRouteSelected(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo route) {
+                @NonNull MediaRouter.RouteInfo route) {
             dismiss();
         }
     }
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialogFragment.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialogFragment.java
index d0ca4b1..5bbe5f6 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialogFragment.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialogFragment.java
@@ -23,13 +23,12 @@
 import android.content.res.Configuration;
 import android.os.Bundle;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.fragment.app.DialogFragment;
 import androidx.mediarouter.media.MediaRouteSelector;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 /**
  * Media route chooser dialog fragment.
  * <p>
@@ -58,7 +57,8 @@
      *
      * @return The selector, never null.
      */
-    public @NonNull MediaRouteSelector getRouteSelector() {
+    @NonNull
+    public MediaRouteSelector getRouteSelector() {
         ensureRouteSelector();
         return mSelector;
     }
@@ -125,8 +125,8 @@
      * Called when the device picker dialog is being created.
      */
     @RestrictTo(LIBRARY)
-    public @NonNull MediaRouteDynamicChooserDialog onCreateDynamicChooserDialog(
-            @NonNull Context context) {
+    @NonNull
+    public MediaRouteDynamicChooserDialog onCreateDynamicChooserDialog(@NonNull Context context) {
         return new MediaRouteDynamicChooserDialog(context);
     }
 
@@ -136,13 +136,15 @@
      * Subclasses may override this method to customize the dialog.
      * </p>
      */
-    public @NonNull MediaRouteChooserDialog onCreateChooserDialog(
+    @NonNull
+    public MediaRouteChooserDialog onCreateChooserDialog(
             @NonNull Context context, @Nullable Bundle savedInstanceState) {
         return new MediaRouteChooserDialog(context);
     }
 
     @Override
-    public @NonNull Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+    @NonNull
+    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
         if (mUseDynamicGroup) {
             mDialog = onCreateDynamicChooserDialog(getContext());
             ((MediaRouteDynamicChooserDialog) mDialog).setRouteSelector(getRouteSelector());
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialog.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialog.java
index 3c6d12d..cc391a4 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialog.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialog.java
@@ -64,6 +64,8 @@
 import android.widget.SeekBar;
 import android.widget.TextView;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
 import androidx.core.util.ObjectsCompat;
 import androidx.core.view.accessibility.AccessibilityEventCompat;
@@ -72,9 +74,6 @@
 import androidx.mediarouter.media.MediaRouter;
 import androidx.palette.graphics.Palette;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -227,7 +226,8 @@
     /**
      * Gets the route that this dialog is controlling.
      */
-    public MediaRouter.@NonNull RouteInfo getRoute() {
+    @NonNull
+    public MediaRouter.RouteInfo getRoute() {
         return mRoute;
     }
 
@@ -242,7 +242,8 @@
      * @param savedInstanceState The dialog's saved instance state.
      * @return The media control view, or null if none.
      */
-    public @Nullable View onCreateMediaControlView(@Nullable Bundle savedInstanceState) {
+    @Nullable
+    public View onCreateMediaControlView(@Nullable Bundle savedInstanceState) {
         return null;
     }
 
@@ -251,7 +252,8 @@
      *
      * @return The media control view, or null if none.
      */
-    public @Nullable View getMediaControlView() {
+    @Nullable
+    public View getMediaControlView() {
         return mCustomControlView;
     }
 
@@ -311,7 +313,8 @@
      *
      * @return The token for the session to use or null if none.
      */
-    public MediaSessionCompat.@Nullable Token getMediaSession() {
+    @Nullable
+    public MediaSessionCompat.Token getMediaSession() {
         return mMediaController == null ? null : mMediaController.getSessionToken();
     }
 
@@ -1134,19 +1137,19 @@
 
         @Override
         public void onRouteUnselected(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo route) {
+                @NonNull MediaRouter.RouteInfo route) {
             update(false);
         }
 
         @Override
         public void onRouteChanged(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo route) {
+                @NonNull MediaRouter.RouteInfo route) {
             update(true);
         }
 
         @Override
         public void onRouteVolumeChanged(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo route) {
+                @NonNull MediaRouter.RouteInfo route) {
             SeekBar volumeSlider = mVolumeSliderMap.get(route);
             int volume = route.getVolume();
             if (DEBUG) {
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialogFragment.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialogFragment.java
index 72c6e05..10d1b28 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialogFragment.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialogFragment.java
@@ -23,13 +23,12 @@
 import android.content.res.Configuration;
 import android.os.Bundle;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.fragment.app.DialogFragment;
 import androidx.mediarouter.media.MediaRouteSelector;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 /**
  * Media route controller dialog fragment.
  * <p>
@@ -59,7 +58,8 @@
      * @return The selector, never null.
      */
     @RestrictTo(LIBRARY)
-    public @NonNull MediaRouteSelector getRouteSelector() {
+    @NonNull
+    public MediaRouteSelector getRouteSelector() {
         ensureRouteSelector();
         return mSelector;
     }
@@ -125,7 +125,8 @@
      * Called when the cast dialog is being created.
      */
     @RestrictTo(LIBRARY)
-    public @NonNull MediaRouteDynamicControllerDialog onCreateDynamicControllerDialog(
+    @NonNull
+    public MediaRouteDynamicControllerDialog onCreateDynamicControllerDialog(
             @NonNull Context context) {
         return new MediaRouteDynamicControllerDialog(context);
     }
@@ -136,13 +137,15 @@
      * Subclasses may override this method to customize the dialog.
      * </p>
      */
-    public @NonNull MediaRouteControllerDialog onCreateControllerDialog(
+    @NonNull
+    public MediaRouteControllerDialog onCreateControllerDialog(
             @NonNull Context context, @Nullable Bundle savedInstanceState) {
         return new MediaRouteControllerDialog(context);
     }
 
     @Override
-    public @NonNull Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+    @NonNull
+    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
         if (mUseDynamicGroup) {
             mDialog = onCreateDynamicControllerDialog(getContext());
             ((MediaRouteDynamicControllerDialog) mDialog).setRouteSelector(mSelector);
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDialogFactory.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDialogFactory.java
index fff584b..43c06c3 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDialogFactory.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDialogFactory.java
@@ -16,7 +16,7 @@
 
 package androidx.mediarouter.app;
 
-import org.jspecify.annotations.NonNull;
+import androidx.annotation.NonNull;
 
 /**
  * The media route dialog factory is responsible for creating the media route
@@ -41,7 +41,8 @@
      *
      * @return The default media route dialog factory, never null.
      */
-    public static @NonNull MediaRouteDialogFactory getDefault() {
+    @NonNull
+    public static MediaRouteDialogFactory getDefault() {
         return sDefault;
     }
 
@@ -53,7 +54,8 @@
      *
      * @return The media route chooser dialog fragment, must not be null.
      */
-    public @NonNull MediaRouteChooserDialogFragment onCreateChooserDialogFragment() {
+    @NonNull
+    public MediaRouteChooserDialogFragment onCreateChooserDialogFragment() {
         return new MediaRouteChooserDialogFragment();
     }
 
@@ -65,7 +67,8 @@
      *
      * @return The media route controller dialog fragment, must not be null.
      */
-    public @NonNull MediaRouteControllerDialogFragment onCreateControllerDialogFragment() {
+    @NonNull
+    public MediaRouteControllerDialogFragment onCreateControllerDialogFragment() {
         return new MediaRouteControllerDialogFragment();
     }
 }
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDiscoveryFragment.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDiscoveryFragment.java
index 618d6a3..df0e5f2 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDiscoveryFragment.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDiscoveryFragment.java
@@ -18,13 +18,12 @@
 
 import android.os.Bundle;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
 import androidx.mediarouter.media.MediaRouteSelector;
 import androidx.mediarouter.media.MediaRouter;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 /**
  * Media route discovery fragment.
  * <p>
@@ -58,7 +57,8 @@
     /**
      * Gets the media router instance.
      */
-    public @NonNull MediaRouter getMediaRouter() {
+    @NonNull
+    public MediaRouter getMediaRouter() {
         ensureRouter();
         return mRouter;
     }
@@ -74,7 +74,8 @@
      *
      * @return The selector, never null.
      */
-    public @NonNull MediaRouteSelector getRouteSelector() {
+    @NonNull
+    public MediaRouteSelector getRouteSelector() {
         ensureRouteSelector();
         return mSelector;
     }
@@ -130,7 +131,8 @@
      *
      * @return The new callback, or null if no callback should be registered.
      */
-    public MediaRouter.@Nullable Callback onCreateCallback() {
+    @Nullable
+    public MediaRouter.Callback onCreateCallback() {
         return new MediaRouter.Callback() { };
     }
 
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDynamicChooserDialog.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDynamicChooserDialog.java
index db84bc9..c2819e7 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDynamicChooserDialog.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDynamicChooserDialog.java
@@ -35,6 +35,8 @@
 import android.widget.TextView;
 
 import androidx.annotation.CallSuper;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.app.AppCompatDialog;
 import androidx.mediarouter.R;
@@ -43,9 +45,6 @@
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -116,7 +115,8 @@
      *
      * @return The selector, never null.
      */
-    public @NonNull MediaRouteSelector getRouteSelector() {
+    @NonNull
+    public MediaRouteSelector getRouteSelector() {
         return mSelector;
     }
 
@@ -169,7 +169,7 @@
      * @param route The route to consider, never null.
      * @return {@code true} if the route should be included in the device picker dialog.
      */
-    public boolean onFilterRoute(MediaRouter.@NonNull RouteInfo route) {
+    public boolean onFilterRoute(@NonNull MediaRouter.RouteInfo route) {
         return !route.isDefaultOrBluetooth() && route.isEnabled()
                 && route.matchesSelector(mSelector);
     }
@@ -261,25 +261,25 @@
         }
 
         @Override
-        public void onRouteAdded(@NonNull MediaRouter router, MediaRouter.@NonNull RouteInfo info) {
+        public void onRouteAdded(@NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo info) {
             refreshRoutes();
         }
 
         @Override
         public void onRouteRemoved(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo info) {
+                @NonNull MediaRouter.RouteInfo info) {
             refreshRoutes();
         }
 
         @Override
         public void onRouteChanged(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo info) {
+                @NonNull MediaRouter.RouteInfo info) {
             refreshRoutes();
         }
 
         @Override
         public void onRouteSelected(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo route) {
+                @NonNull MediaRouter.RouteInfo route) {
             dismiss();
         }
     }
@@ -331,8 +331,8 @@
         }
 
         @Override
-        public RecyclerView.@NonNull ViewHolder onCreateViewHolder(
-                @NonNull ViewGroup parent, int viewType) {
+        @NonNull
+        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
             View view;
 
             switch (viewType) {
@@ -349,7 +349,7 @@
         }
 
         @Override
-        public void onBindViewHolder(RecyclerView.@NonNull ViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
             int viewType = getItemViewType(position);
             Item item = getItem(position);
 
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java
index 41c4270..07891df 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java
@@ -59,6 +59,8 @@
 import android.widget.TextView;
 
 import androidx.annotation.CallSuper;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.app.AppCompatDialog;
 import androidx.core.util.ObjectsCompat;
@@ -70,9 +72,6 @@
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -258,7 +257,8 @@
      *
      * @return The token for the session to use or null if none.
      */
-    public MediaSessionCompat.@Nullable Token getMediaSession() {
+    @Nullable
+    public MediaSessionCompat.Token getMediaSession() {
         return mMediaController == null ? null : mMediaController.getSessionToken();
     }
 
@@ -267,7 +267,8 @@
      *
      * @return The selector, never null.
      */
-    public @NonNull MediaRouteSelector getRouteSelector() {
+    @NonNull
+    public MediaRouteSelector getRouteSelector() {
         return mSelector;
     }
 
@@ -320,7 +321,7 @@
      * @param route The route to consider, never null.
      * @return True if the route should be included in the chooser dialog.
      */
-    public boolean onFilterRoute(MediaRouter.@NonNull RouteInfo route) {
+    public boolean onFilterRoute(@NonNull MediaRouter.RouteInfo route) {
         return !route.isDefaultOrBluetooth() && route.isEnabled()
                 && route.matchesSelector(mSelector) && !(mSelectedRoute == route);
     }
@@ -921,8 +922,8 @@
         }
 
         @Override
-        public RecyclerView.@NonNull ViewHolder onCreateViewHolder(
-                @NonNull ViewGroup parent, int viewType) {
+        @NonNull
+        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
             View view;
 
             switch (viewType) {
@@ -945,7 +946,7 @@
         }
 
         @Override
-        public void onBindViewHolder(RecyclerView.@NonNull ViewHolder holder, int position) {
+        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
             int viewType = getItemViewType(position);
             Item item = getItem(position);
 
@@ -980,7 +981,7 @@
         }
 
         @Override
-        public void onViewRecycled(RecyclerView.@NonNull ViewHolder holder) {
+        public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
             super.onViewRecycled(holder);
             mVolumeSliderHolderMap.values().remove(holder);
         }
@@ -1322,19 +1323,19 @@
         }
 
         @Override
-        public void onRouteAdded(@NonNull MediaRouter router, MediaRouter.@NonNull RouteInfo info) {
+        public void onRouteAdded(@NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo info) {
             updateRoutesView();
         }
 
         @Override
         public void onRouteRemoved(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo info) {
+                @NonNull MediaRouter.RouteInfo info) {
             updateRoutesView();
         }
 
         @Override
         public void onRouteSelected(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo route) {
+                @NonNull MediaRouter.RouteInfo route) {
             mSelectedRoute = route;
 
             mIsSelectingRoute = false;
@@ -1346,13 +1347,13 @@
 
         @Override
         public void onRouteUnselected(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo route) {
+                @NonNull MediaRouter.RouteInfo route) {
             updateRoutesView();
         }
 
         @Override
         public void onRouteChanged(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo route) {
+                @NonNull MediaRouter.RouteInfo route) {
             boolean shouldRefreshRoute = false;
             if (route == mSelectedRoute && route.getDynamicGroupController() != null) {
                 for (MediaRouter.RouteInfo memberRoute : route.getProvider().getRoutes()) {
@@ -1381,7 +1382,7 @@
 
         @Override
         public void onRouteVolumeChanged(@NonNull MediaRouter router,
-                MediaRouter.@NonNull RouteInfo route) {
+                @NonNull MediaRouter.RouteInfo route) {
             int volume = route.getVolume();
             if (DEBUG) {
                 Log.d(TAG, "onRouteVolumeChanged(), route.getVolume:" + volume);
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/OverlayListView.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/OverlayListView.java
index fa34fe7..3d6632e 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/OverlayListView.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/OverlayListView.java
@@ -24,8 +24,8 @@
 import android.view.animation.Interpolator;
 import android.widget.ListView;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -130,7 +130,8 @@
          *
          * @return BitmapDrawable that this object has.
          */
-        public @Nullable BitmapDrawable getBitmapDrawable() {
+        @Nullable
+        public BitmapDrawable getBitmapDrawable() {
             return mBitmap;
         }
 
@@ -151,7 +152,8 @@
          * @param endAlpha Ending alpha value for the animation.
          * @return This OverlayObject to allow for chaining of calls.
          */
-        public @NonNull OverlayObject setAlphaAnimation(float startAlpha, float endAlpha) {
+        @NonNull
+        public OverlayObject setAlphaAnimation(float startAlpha, float endAlpha) {
             mStartAlpha = startAlpha;
             mEndAlpha = endAlpha;
             return this;
@@ -163,7 +165,8 @@
          * @param deltaY Distance to move in pixels.
          * @return This OverlayObject to allow for chaining of calls.
          */
-        public @NonNull OverlayObject setTranslateYAnimation(int deltaY) {
+        @NonNull
+        public OverlayObject setTranslateYAnimation(int deltaY) {
             mDeltaY = deltaY;
             return this;
         }
@@ -174,7 +177,8 @@
          * @param duration Duration in milliseconds
          * @return This OverlayObject to allow for chaining of calls.
          */
-        public @NonNull OverlayObject setDuration(long duration) {
+        @NonNull
+        public OverlayObject setDuration(long duration) {
             mDuration = duration;
             return this;
         }
@@ -185,7 +189,8 @@
          * @param interpolator The interpolator which defines the acceleration curve
          * @return This OverlayObject to allow for chaining of calls.
          */
-        public @NonNull OverlayObject setInterpolator(@Nullable Interpolator interpolator) {
+        @NonNull
+        public OverlayObject setInterpolator(@Nullable Interpolator interpolator) {
             mInterpolator = interpolator;
             return this;
         }
@@ -196,8 +201,8 @@
          * @param listener the animation end listener to be notified.
          * @return This OverlayObject to allow for chaining of calls.
          */
-        public @NonNull OverlayObject setAnimationEndListener(
-                @Nullable OnAnimationEndListener listener) {
+        @NonNull
+        public OverlayObject setAnimationEndListener(@Nullable OnAnimationEndListener listener) {
             mListener = listener;
             return this;
         }
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/SystemOutputSwitcherDialogController.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/SystemOutputSwitcherDialogController.java
index 9395dc6..e88cc01 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/SystemOutputSwitcherDialogController.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/SystemOutputSwitcherDialogController.java
@@ -28,10 +28,9 @@
 import android.os.Build;
 import android.provider.Settings;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 
-import org.jspecify.annotations.NonNull;
-
 import java.util.List;
 
 /**
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/GlobalMediaRouter.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/GlobalMediaRouter.java
index 03352b8..2cfa782 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/GlobalMediaRouter.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/GlobalMediaRouter.java
@@ -38,6 +38,8 @@
 import android.util.Log;
 import android.view.Display;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.VisibleForTesting;
 import androidx.core.app.ActivityManagerCompat;
@@ -48,9 +50,6 @@
 
 import com.google.common.util.concurrent.ListenableFuture;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -268,7 +267,8 @@
         return mRoutes;
     }
 
-        /* package */ @Nullable MediaRouterParams getRouterParams() {
+    @Nullable
+        /* package */ MediaRouterParams getRouterParams() {
         return mRouterParams;
     }
 
@@ -319,11 +319,13 @@
         }
     }
 
-        /* package */ @NonNull List<MediaRouter.ProviderInfo> getProviders() {
+    @NonNull
+        /* package */ List<MediaRouter.ProviderInfo> getProviders() {
         return mProviders;
     }
 
-        /* package */ MediaRouter.@NonNull RouteInfo getDefaultRoute() {
+    @NonNull
+        /* package */ MediaRouter.RouteInfo getDefaultRoute() {
         if (mDefaultRoute == null) {
             // This should never happen once the media router has been fully
             // initialized but it is good to check for the error in case there
@@ -339,7 +341,8 @@
         return mBluetoothRoute;
     }
 
-        /* package */ MediaRouter.@NonNull RouteInfo getSelectedRoute() {
+    @NonNull
+        /* package */ MediaRouter.RouteInfo getSelectedRoute() {
         if (mSelectedRoute == null) {
             // This should never happen once the media router has been fully
             // initialized but it is good to check for the error in case there
@@ -351,12 +354,13 @@
         return mSelectedRoute;
     }
 
-        /* package */ MediaRouter.RouteInfo.@Nullable DynamicGroupState getDynamicGroupState(
+    @Nullable
+        /* package */ MediaRouter.RouteInfo.DynamicGroupState getDynamicGroupState(
             MediaRouter.RouteInfo route) {
         return mSelectedRoute.getDynamicGroupState(route);
     }
 
-    /* package */ void addMemberToDynamicGroup(MediaRouter.@NonNull RouteInfo route) {
+    /* package */ void addMemberToDynamicGroup(@NonNull MediaRouter.RouteInfo route) {
         if (!(mSelectedRouteController instanceof MediaRouteProvider.DynamicGroupRouteController)) {
             throw new IllegalStateException("There is no currently selected dynamic group route.");
         }
@@ -371,7 +375,7 @@
                 .onAddMemberRoute(route.getDescriptorId());
     }
 
-    /* package */ void removeMemberFromDynamicGroup(MediaRouter.@NonNull RouteInfo route) {
+    /* package */ void removeMemberFromDynamicGroup(@NonNull MediaRouter.RouteInfo route) {
         if (!(mSelectedRouteController instanceof MediaRouteProvider.DynamicGroupRouteController)) {
             throw new IllegalStateException("There is no currently selected dynamic group route.");
         }
@@ -390,7 +394,7 @@
                 .onRemoveMemberRoute(route.getDescriptorId());
     }
 
-    /* package */ void transferToRoute(MediaRouter.@NonNull RouteInfo route) {
+    /* package */ void transferToRoute(@NonNull MediaRouter.RouteInfo route) {
         if (!(mSelectedRouteController instanceof MediaRouteProvider.DynamicGroupRouteController)) {
             throw new IllegalStateException("There is no currently selected dynamic group route.");
         }
@@ -424,7 +428,7 @@
      *     explicit application route selection.
      */
     /* package */ void selectRoute(
-            MediaRouter.@NonNull RouteInfo route,
+            @NonNull MediaRouter.RouteInfo route,
             @MediaRouter.UnselectReason int unselectReason,
             boolean syncMediaRoute1Provider) {
         if (!mRoutes.contains(route)) {
@@ -673,7 +677,7 @@
     @Override
     public void releaseProviderController(
             @NonNull RegisteredMediaRouteProvider provider,
-            MediaRouteProvider.@NonNull RouteController controller) {
+            @NonNull MediaRouteProvider.RouteController controller) {
         if (mSelectedRouteController == controller) {
             selectRoute(
                     chooseFallbackRoute(),
@@ -992,7 +996,7 @@
     }
 
     /* package */ void selectRouteInternal(
-            MediaRouter.@NonNull RouteInfo route,
+            @NonNull MediaRouter.RouteInfo route,
             @MediaRouter.UnselectReason int unselectReason,
             boolean syncMediaRoute1Provider) {
         if (mSelectedRoute == route) {
@@ -1145,11 +1149,12 @@
     /* package */ void notifyTransfer(
             GlobalMediaRouter router,
             MediaRouter.RouteInfo route,
-            MediaRouteProvider.@Nullable RouteController routeController,
+            @Nullable MediaRouteProvider.RouteController routeController,
             @MediaRouter.UnselectReason int reason,
             boolean syncMediaRoute1Provider,
-            MediaRouter.@Nullable RouteInfo requestedRoute,
-                                @Nullable Collection<
+            @Nullable MediaRouter.RouteInfo requestedRoute,
+            @Nullable
+                    Collection<
                                     MediaRouteProvider.DynamicGroupRouteController
                                             .DynamicRouteDescriptor>
                             memberRoutes) {
@@ -1188,9 +1193,10 @@
                             .OnDynamicRoutesChangedListener() {
                         @Override
                         public void onRoutesChanged(
-                                MediaRouteProvider.@NonNull DynamicGroupRouteController controller,
+                                @NonNull MediaRouteProvider.DynamicGroupRouteController controller,
                                 @Nullable MediaRouteDescriptor groupRouteDescriptor,
-                                                                        @NonNull Collection<
+                                @NonNull
+                                        Collection<
                                                         MediaRouteProvider
                                                                 .DynamicGroupRouteController
                                                                 .DynamicRouteDescriptor>
@@ -1395,7 +1401,7 @@
         }
 
         @Override
-        public void onReleaseController(MediaRouteProvider.@NonNull RouteController controller) {
+        public void onReleaseController(@NonNull MediaRouteProvider.RouteController controller) {
             if (controller == mSelectedRouteController) {
                 // Stop casting
                 selectRouteToFallbackRoute(UNSELECT_REASON_STOPPED);
@@ -1555,8 +1561,8 @@
         public static final int MSG_ROUTER_PARAMS_CHANGED = MSG_TYPE_ROUTER | 1;
 
         /* package */ void postRouteSelectedMessage(
-                MediaRouter.@Nullable RouteInfo fromRoute,
-                MediaRouter.@NonNull RouteInfo targetRoute,
+                @Nullable MediaRouter.RouteInfo fromRoute,
+                @NonNull MediaRouter.RouteInfo targetRoute,
                 int reason,
                 boolean syncMediaRoute1Provider) {
             RouteSelectedMessageParams params =
@@ -1567,8 +1573,8 @@
         }
 
         /* package */ void postAnotherRouteSelectedMessage(
-                MediaRouter.@Nullable RouteInfo requestedRoute,
-                MediaRouter.@NonNull RouteInfo targetRoute,
+                @Nullable MediaRouter.RouteInfo requestedRoute,
+                @NonNull MediaRouter.RouteInfo targetRoute,
                 int reason,
                 boolean syncMediaRoute1Provider) {
             RouteSelectedMessageParams params =
@@ -1755,15 +1761,15 @@
          * Holds the origin route for {@link CallbackHandler#MSG_ROUTE_SELECTED}, or the originally
          * requested route for {@link CallbackHandler#MSG_ROUTE_ANOTHER_SELECTED}.
          */
-        public final MediaRouter.@Nullable RouteInfo mFromOrRequestedRoute;
+        @Nullable public final MediaRouter.RouteInfo mFromOrRequestedRoute;
 
-        public final MediaRouter.@NonNull RouteInfo mTargetRoute;
+        @NonNull public final MediaRouter.RouteInfo mTargetRoute;
 
         public final boolean mSyncMediaRoute1Provider;
 
         private RouteSelectedMessageParams(
-                MediaRouter.@Nullable RouteInfo fromOrRequestedRoute,
-                MediaRouter.@NonNull RouteInfo targetRoute,
+                @Nullable MediaRouter.RouteInfo fromOrRequestedRoute,
+                @NonNull MediaRouter.RouteInfo targetRoute,
                 boolean syncMediaRoute1Provider) {
             mFromOrRequestedRoute = fromOrRequestedRoute;
             mTargetRoute = targetRoute;
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaItemStatus.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaItemStatus.java
index b001a78..a01fb65 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaItemStatus.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaItemStatus.java
@@ -20,11 +20,10 @@
 import android.os.Bundle;
 import android.os.SystemClock;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.core.util.TimeUtils;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 /**
  * Describes the playback status of a media item.
  * <p>
@@ -251,12 +250,14 @@
      * The extras will be ignored by the media router but they may be used
      * by applications.
      */
-    public @Nullable Bundle getExtras() {
+    @Nullable
+    public Bundle getExtras() {
         return mBundle.getBundle(KEY_EXTRAS);
     }
 
+    @NonNull
     @Override
-    public @NonNull String toString() {
+    public String toString() {
         StringBuilder result = new StringBuilder();
         result.append("MediaItemStatus{ ");
         result.append("timestamp=");
@@ -297,7 +298,8 @@
      *
      * @return The contents of the object represented as a bundle.
      */
-    public @NonNull Bundle asBundle() {
+    @NonNull
+    public Bundle asBundle() {
         return mBundle;
     }
 
@@ -307,7 +309,8 @@
      * @param bundle The bundle, or null if none.
      * @return The new instance, or null if the bundle was null.
      */
-    public static @Nullable MediaItemStatus fromBundle(@Nullable Bundle bundle) {
+    @Nullable
+    public static MediaItemStatus fromBundle(@Nullable Bundle bundle) {
         return bundle != null ? new MediaItemStatus(bundle) : null;
     }
 
@@ -345,7 +348,8 @@
          * Sets the timestamp associated with the status information in
          * milliseconds since boot in the {@link SystemClock#elapsedRealtime} time base.
          */
-        public @NonNull Builder setTimestamp(long elapsedRealtimeTimestamp) {
+        @NonNull
+        public Builder setTimestamp(long elapsedRealtimeTimestamp) {
             mBundle.putLong(KEY_TIMESTAMP, elapsedRealtimeTimestamp);
             return this;
         }
@@ -353,7 +357,8 @@
         /**
          * Sets the playback state of the media item.
          */
-        public @NonNull Builder setPlaybackState(int playbackState) {
+        @NonNull
+        public Builder setPlaybackState(int playbackState) {
             mBundle.putInt(KEY_PLAYBACK_STATE, playbackState);
             return this;
         }
@@ -362,7 +367,8 @@
          * Sets the content playback position as a long integer number of milliseconds
          * from the beginning of the content.
          */
-        public @NonNull Builder setContentPosition(long positionMilliseconds) {
+        @NonNull
+        public Builder setContentPosition(long positionMilliseconds) {
             mBundle.putLong(KEY_CONTENT_POSITION, positionMilliseconds);
             return this;
         }
@@ -371,7 +377,8 @@
          * Sets the total duration of the content to be played as a long integer number
          * of milliseconds.
          */
-        public @NonNull Builder setContentDuration(long durationMilliseconds) {
+        @NonNull
+        public Builder setContentDuration(long durationMilliseconds) {
             mBundle.putLong(KEY_CONTENT_DURATION, durationMilliseconds);
             return this;
         }
@@ -381,7 +388,8 @@
          * The extras will be ignored by the media router but they may be used
          * by applications.
          */
-        public @NonNull Builder setExtras(@Nullable Bundle extras) {
+        @NonNull
+        public Builder setExtras(@Nullable Bundle extras) {
             if (extras == null) {
                 mBundle.putBundle(KEY_EXTRAS, null);
             } else {
@@ -393,7 +401,8 @@
         /**
          * Builds the {@link MediaItemStatus media item status object}.
          */
-        public @NonNull MediaItemStatus build() {
+        @NonNull
+        public MediaItemStatus build() {
             return new MediaItemStatus(mBundle);
         }
     }
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2Provider.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2Provider.java
index d6ffed2..8d3eae2 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2Provider.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2Provider.java
@@ -44,15 +44,14 @@
 import android.util.Log;
 import android.util.SparseArray;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.VisibleForTesting;
 import androidx.mediarouter.R;
 import androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor;
 import androidx.mediarouter.media.MediaRouter.ControlRequestCallback;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -116,14 +115,16 @@
         }
     }
 
+    @Nullable
     @Override
-    public @Nullable RouteController onCreateRouteController(@NonNull String routeId) {
+    public RouteController onCreateRouteController(@NonNull String routeId) {
         String originalRouteId = mRouteIdToOriginalRouteIdMap.get(routeId);
         return new MemberRouteController(originalRouteId, null);
     }
 
+    @Nullable
     @Override
-    public @Nullable RouteController onCreateRouteController(@NonNull String routeId,
+    public RouteController onCreateRouteController(@NonNull String routeId,
             @NonNull String routeGroupId) {
         String originalRouteId = mRouteIdToOriginalRouteIdMap.get(routeId);
 
@@ -137,8 +138,9 @@
         return new MemberRouteController(originalRouteId, null);
     }
 
+    @Nullable
     @Override
-    public @Nullable DynamicGroupRouteController onCreateDynamicGroupRouteController(
+    public DynamicGroupRouteController onCreateDynamicGroupRouteController(
             @NonNull String initialMemberRouteId,
             @NonNull RouteControllerOptions routeControllerOptions) {
         // The parent implementation of onCreateDynamicGroupRouteController(String,
@@ -231,7 +233,8 @@
         setDescriptor(descriptor);
     }
 
-    @Nullable MediaRoute2Info getRouteById(@Nullable String routeId) {
+    @Nullable
+    MediaRoute2Info getRouteById(@Nullable String routeId) {
         if (routeId == null) {
             return null;
         }
@@ -243,8 +246,9 @@
         return null;
     }
 
-    static @Nullable Messenger getMessengerFromRoutingController(
-            MediaRouter2.@Nullable RoutingController controller) {
+    @Nullable
+    static Messenger getMessengerFromRoutingController(
+            @Nullable MediaRouter2.RoutingController controller) {
         if (controller == null) {
             return null;
         }
@@ -254,7 +258,8 @@
                 MediaRouter2Utils.KEY_MESSENGER);
     }
 
-    static @Nullable String getSessionIdForRouteController(@Nullable RouteController controller) {
+    @Nullable
+    static String getSessionIdForRouteController(@Nullable RouteController controller) {
         if (!(controller instanceof GroupRouteController)) {
             return null;
         }
@@ -431,8 +436,8 @@
     private class TransferCallback extends MediaRouter2.TransferCallback {
 
         @Override
-        public void onTransfer(MediaRouter2.@NonNull RoutingController oldController,
-                MediaRouter2.@NonNull RoutingController newController) {
+        public void onTransfer(@NonNull MediaRouter2.RoutingController oldController,
+                @NonNull MediaRouter2.RoutingController newController) {
             mControllerMap.remove(oldController);
             if (newController == mMediaRouter2.getSystemController()) {
                 mCallback.onSelectFallbackRoute(UNSELECT_REASON_ROUTE_CHANGED);
@@ -457,7 +462,7 @@
         }
 
         @Override
-        public void onStop(MediaRouter2.@NonNull RoutingController routingController) {
+        public void onStop(@NonNull MediaRouter2.RoutingController routingController) {
             RouteController routeController = mControllerMap.remove(routingController);
             if (routeController != null) {
                 mCallback.onReleaseController(routeController);
@@ -472,7 +477,7 @@
         ControllerCallback() {}
 
         @Override
-        public void onControllerUpdated(MediaRouter2.@NonNull RoutingController routingController) {
+        public void onControllerUpdated(@NonNull MediaRouter2.RoutingController routingController) {
             setDynamicRouteDescriptors(routingController);
         }
     }
@@ -512,8 +517,10 @@
 
         final String mInitialMemberRouteId;
         final MediaRouter2.RoutingController mRoutingController;
-        final @Nullable Messenger mServiceMessenger;
-        final @Nullable Messenger mReceiveMessenger;
+        @Nullable
+        final Messenger mServiceMessenger;
+        @Nullable
+        final Messenger mReceiveMessenger;
         final SparseArray<ControlRequestCallback> mPendingCallbacks = new SparseArray<>();
         final Handler mControllerHandler;
         AtomicInteger mNextRequestId = new AtomicInteger(1);
@@ -521,9 +528,10 @@
         private final Runnable mClearOptimisticVolumeRunnable = () -> mOptimisticVolume = -1;
         // The possible current volume set by the user recently or -1 if not.
         int mOptimisticVolume = -1;
-        @Nullable MediaRouteDescriptor mGroupRouteDescriptor;
+        @Nullable
+        MediaRouteDescriptor mGroupRouteDescriptor;
 
-        GroupRouteController(MediaRouter2.@NonNull RoutingController routingController,
+        GroupRouteController(@NonNull MediaRouter2.RoutingController routingController,
                 @NonNull String initialMemberRouteId) {
             mRoutingController = routingController;
             mInitialMemberRouteId = initialMemberRouteId;
@@ -748,7 +756,7 @@
 
         static void setPlatformRouteListingPreference(
                 @NonNull MediaRouter2 mediaRouter2,
-                android.media.@Nullable RouteListingPreference routeListingPreference) {
+                @Nullable android.media.RouteListingPreference routeListingPreference) {
             mediaRouter2.setRouteListingPreference(routeListingPreference);
         }
     }
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2ProviderServiceAdapter.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2ProviderServiceAdapter.java
index 5bb54ba..97b110b 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2ProviderServiceAdapter.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2ProviderServiceAdapter.java
@@ -46,6 +46,8 @@
 import android.util.SparseArray;
 
 import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.collection.ArrayMap;
 import androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController;
@@ -55,9 +57,6 @@
 import androidx.mediarouter.media.MediaRouteProviderService.MediaRouteProviderServiceImplApi30;
 import androidx.mediarouter.media.MediaRouteProviderService.MediaRouteProviderServiceImplApi30.ClientRecord;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDescriptor.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDescriptor.java
index 169f863..c6c99afc 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDescriptor.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDescriptor.java
@@ -25,11 +25,10 @@
 import android.os.Bundle;
 import android.text.TextUtils;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -89,7 +88,8 @@
      * by the provider.
      * </p>
      */
-    public @NonNull String getId() {
+    @NonNull
+    public String getId() {
         return mBundle.getString(KEY_ID);
     }
 
@@ -101,7 +101,8 @@
      * </p>
      */
     @RestrictTo(LIBRARY)
-    public @NonNull List<String> getGroupMemberIds() {
+    @NonNull
+    public List<String> getGroupMemberIds() {
         if (!mBundle.containsKey(KEY_GROUP_MEMBER_IDS)) {
             return new ArrayList<>();
         }
@@ -115,7 +116,8 @@
      * It may be a user-supplied name, an alias, or device serial number.
      * </p>
      */
-    public @NonNull String getName() {
+    @NonNull
+    public String getName() {
         return mBundle.getString(KEY_NAME);
     }
 
@@ -126,7 +128,8 @@
      * It may be a user-supplied string, a model number or brand of device.
      * </p>
      */
-    public @Nullable String getDescription() {
+    @Nullable
+    public String getDescription() {
         return mBundle.getString(KEY_DESCRIPTION);
     }
 
@@ -136,7 +139,8 @@
      * This icon will be used in picker UIs if available.
      * </p>
      */
-    public @Nullable Uri getIconUri() {
+    @Nullable
+    public Uri getIconUri() {
         String iconUri = mBundle.getString(KEY_ICON_URI);
         return iconUri == null ? null : Uri.parse(iconUri);
     }
@@ -228,14 +232,16 @@
      *
      * @return An {@link IntentSender} to start a settings activity.
      */
-    public @Nullable IntentSender getSettingsActivity() {
+    @Nullable
+    public IntentSender getSettingsActivity() {
         return mBundle.getParcelable(KEY_SETTINGS_INTENT);
     }
 
     /**
      * Gets the route's {@link MediaControlIntent media control intent} filters.
      */
-    public @NonNull List<IntentFilter> getControlFilters() {
+    @NonNull
+    public List<IntentFilter> getControlFilters() {
         if (!mBundle.containsKey(KEY_CONTROL_FILTERS)) {
             return new ArrayList<>();
         }
@@ -302,7 +308,8 @@
      * <p>Two routes are considered to come from the same receiver device if any of their respective
      * deduplication ids match.
      */
-    public @NonNull Set<String> getDeduplicationIds() {
+    @NonNull
+    public Set<String> getDeduplicationIds() {
         ArrayList<String> deduplicationIds = mBundle.getStringArrayList(KEY_DEDUPLICATION_IDS);
         return deduplicationIds != null
                 ? Collections.unmodifiableSet(new HashSet<>(deduplicationIds))
@@ -322,7 +329,8 @@
      * The extras will be ignored by the media router but they may be used
      * by applications.
      */
-    public @Nullable Bundle getExtras() {
+    @Nullable
+    public Bundle getExtras() {
         return mBundle.getBundle(KEY_EXTRAS);
     }
 
@@ -355,7 +363,8 @@
      * the route provider's package is allowed to see this route. This applies only when
      * {@link #isVisibilityPublic} returns {@code false}.
      */
-    public @NonNull Set<String> getAllowedPackages() {
+    @NonNull
+    public Set<String> getAllowedPackages() {
         if (!mBundle.containsKey(KEY_ALLOWED_PACKAGES)) {
             return new HashSet<>();
         }
@@ -374,8 +383,9 @@
         return true;
     }
 
+    @NonNull
     @Override
-    public @NonNull String toString() {
+    public String toString() {
         return "MediaRouteDescriptor{ "
                 + "id=" + getId()
                 + ", groupMemberIds=" + getGroupMemberIds()
@@ -407,7 +417,8 @@
      *
      * @return The contents of the object represented as a bundle.
      */
-    public @NonNull Bundle asBundle() {
+    @NonNull
+    public Bundle asBundle() {
         return mBundle;
     }
 
@@ -417,7 +428,8 @@
      * @param bundle The bundle, or null if none.
      * @return The new instance, or null if the bundle was null.
      */
-    public static @Nullable MediaRouteDescriptor fromBundle(@Nullable Bundle bundle) {
+    @Nullable
+    public static MediaRouteDescriptor fromBundle(@Nullable Bundle bundle) {
         return bundle != null ? new MediaRouteDescriptor(bundle) : null;
     }
 
@@ -467,7 +479,8 @@
          * by the provider.
          * </p>
          */
-        public @NonNull Builder setId(@NonNull String id) {
+        @NonNull
+        public Builder setId(@NonNull String id) {
             if (id == null) {
                 throw new NullPointerException("id must not be null");
             }
@@ -479,7 +492,8 @@
          * Clears the group member IDs of the route.
          */
         @RestrictTo(LIBRARY)
-        public @NonNull Builder clearGroupMemberIds() {
+        @NonNull
+        public Builder clearGroupMemberIds() {
             mGroupMemberIds.clear();
             return this;
         }
@@ -492,7 +506,8 @@
          * </p>
          */
         @RestrictTo(LIBRARY)
-        public @NonNull Builder addGroupMemberId(@NonNull String groupMemberId) {
+        @NonNull
+        public Builder addGroupMemberId(@NonNull String groupMemberId) {
             if (TextUtils.isEmpty(groupMemberId)) {
                 throw new IllegalArgumentException("groupMemberId must not be empty");
             }
@@ -511,7 +526,8 @@
          * </p>
          */
         @RestrictTo(LIBRARY)
-        public @NonNull Builder addGroupMemberIds(@NonNull Collection<String> groupMemberIds) {
+        @NonNull
+        public Builder addGroupMemberIds(@NonNull Collection<String> groupMemberIds) {
             if (groupMemberIds == null) {
                 throw new IllegalArgumentException("groupMemberIds must not be null");
             }
@@ -532,7 +548,8 @@
          * </p>
          */
         @RestrictTo(LIBRARY)
-        public @NonNull Builder removeGroupMemberId(@NonNull String memberRouteId) {
+        @NonNull
+        public Builder removeGroupMemberId(@NonNull String memberRouteId) {
             if (TextUtils.isEmpty(memberRouteId)) {
                 throw new IllegalArgumentException("memberRouteId must not be empty");
             }
@@ -547,7 +564,8 @@
          * It may be a user-supplied name, an alias, or device serial number.
          * </p>
          */
-        public @NonNull Builder setName(@NonNull String name) {
+        @NonNull
+        public Builder setName(@NonNull String name) {
             if (name == null) {
                 throw new NullPointerException("name must not be null");
             }
@@ -562,7 +580,8 @@
          * It may be a user-supplied string, a model number or brand of device.
          * </p>
          */
-        public @NonNull Builder setDescription(@Nullable String description) {
+        @NonNull
+        public Builder setDescription(@Nullable String description) {
             mBundle.putString(KEY_DESCRIPTION, description);
             return this;
         }
@@ -581,7 +600,8 @@
          * </ul>
          * </p>
          */
-        public @NonNull Builder setIconUri(@NonNull Uri iconUri) {
+        @NonNull
+        public Builder setIconUri(@NonNull Uri iconUri) {
             if (iconUri == null) {
                 throw new IllegalArgumentException("iconUri must not be null");
             }
@@ -596,7 +616,8 @@
          * Wifi Display receivers, but that are not currently available for use.
          * </p>
          */
-        public @NonNull Builder setEnabled(boolean enabled) {
+        @NonNull
+        public Builder setEnabled(boolean enabled) {
             mBundle.putBoolean(KEY_ENABLED, enabled);
             return this;
         }
@@ -607,7 +628,8 @@
          * @see MediaRouteDescriptor#isSystemRoute()
          */
         @RestrictTo(LIBRARY)
-        public @NonNull Builder setIsSystemRoute(boolean isSystemRoute) {
+        @NonNull
+        public Builder setIsSystemRoute(boolean isSystemRoute) {
             mBundle.putBoolean(KEY_IS_SYSTEM_ROUTE, isSystemRoute);
             return this;
         }
@@ -616,7 +638,8 @@
          * Sets whether the route is a dynamic group route.
          * @see #isDynamicGroupRoute()
          */
-        public @NonNull Builder setIsDynamicGroupRoute(boolean isDynamicGroupRoute) {
+        @NonNull
+        public Builder setIsDynamicGroupRoute(boolean isDynamicGroupRoute) {
             mBundle.putBoolean(IS_DYNAMIC_GROUP_ROUTE, isDynamicGroupRoute);
             return this;
         }
@@ -627,7 +650,8 @@
          * @deprecated Use {@link #setConnectionState} instead.
          */
         @Deprecated
-        public @NonNull Builder setConnecting(boolean connecting) {
+        @NonNull
+        public Builder setConnecting(boolean connecting) {
             mBundle.putBoolean(KEY_CONNECTING, connecting);
             return this;
         }
@@ -640,7 +664,8 @@
          * {@link MediaRouter.RouteInfo#CONNECTION_STATE_CONNECTING}, or
          * {@link MediaRouter.RouteInfo#CONNECTION_STATE_CONNECTED}.
          */
-        public @NonNull Builder setConnectionState(int connectionState) {
+        @NonNull
+        public Builder setConnectionState(int connectionState) {
             mBundle.putInt(KEY_CONNECTION_STATE, connectionState);
             return this;
         }
@@ -648,7 +673,8 @@
         /**
          * Sets whether the route can be disconnected without stopping playback.
          */
-        public @NonNull Builder setCanDisconnect(boolean canDisconnect) {
+        @NonNull
+        public Builder setCanDisconnect(boolean canDisconnect) {
             mBundle.putBoolean(KEY_CAN_DISCONNECT, canDisconnect);
             return this;
         }
@@ -657,7 +683,8 @@
          * Sets an intent sender for launching the settings activity for this
          * route.
          */
-        public @NonNull Builder setSettingsActivity(@Nullable IntentSender is) {
+        @NonNull
+        public Builder setSettingsActivity(@Nullable IntentSender is) {
             mBundle.putParcelable(KEY_SETTINGS_INTENT, is);
             return this;
         }
@@ -665,7 +692,8 @@
         /**
          * Clears {@link MediaControlIntent media control intent} filters for the route.
          */
-        public @NonNull Builder clearControlFilters() {
+        @NonNull
+        public Builder clearControlFilters() {
             mControlFilters.clear();
             return this;
         }
@@ -673,7 +701,8 @@
         /**
          * Adds a {@link MediaControlIntent media control intent} filter for the route.
          */
-        public @NonNull Builder addControlFilter(@NonNull IntentFilter filter) {
+        @NonNull
+        public Builder addControlFilter(@NonNull IntentFilter filter) {
             if (filter == null) {
                 throw new IllegalArgumentException("filter must not be null");
             }
@@ -687,7 +716,8 @@
         /**
          * Adds a list of {@link MediaControlIntent media control intent} filters for the route.
          */
-        public @NonNull Builder addControlFilters(@NonNull Collection<IntentFilter> filters) {
+        @NonNull
+        public Builder addControlFilters(@NonNull Collection<IntentFilter> filters) {
             if (filters == null) {
                 throw new IllegalArgumentException("filters must not be null");
             }
@@ -709,7 +739,8 @@
          * {@link MediaRouter.RouteInfo#PLAYBACK_TYPE_LOCAL} or
          * {@link MediaRouter.RouteInfo#PLAYBACK_TYPE_REMOTE}.
          */
-        public @NonNull Builder setPlaybackType(int playbackType) {
+        @NonNull
+        public Builder setPlaybackType(int playbackType) {
             mBundle.putInt(KEY_PLAYBACK_TYPE, playbackType);
             return this;
         }
@@ -717,7 +748,8 @@
         /**
          * Sets the route's playback stream.
          */
-        public @NonNull Builder setPlaybackStream(int playbackStream) {
+        @NonNull
+        public Builder setPlaybackStream(int playbackStream) {
             mBundle.putInt(KEY_PLAYBACK_STREAM, playbackStream);
             return this;
         }
@@ -727,7 +759,8 @@
          *
          * @param deviceType The type of the receiver device.
          */
-        public @NonNull Builder setDeviceType(@MediaRouter.RouteInfo.DeviceType int deviceType) {
+        @NonNull
+        public Builder setDeviceType(@MediaRouter.RouteInfo.DeviceType int deviceType) {
             mBundle.putInt(KEY_DEVICE_TYPE, deviceType);
             return this;
         }
@@ -735,7 +768,8 @@
         /**
          * Sets the route's current volume, or 0 if unknown.
          */
-        public @NonNull Builder setVolume(int volume) {
+        @NonNull
+        public Builder setVolume(int volume) {
             mBundle.putInt(KEY_VOLUME, volume);
             return this;
         }
@@ -743,7 +777,8 @@
         /**
          * Sets the route's maximum volume, or 0 if unknown.
          */
-        public @NonNull Builder setVolumeMax(int volumeMax) {
+        @NonNull
+        public Builder setVolumeMax(int volumeMax) {
             mBundle.putInt(KEY_VOLUME_MAX, volumeMax);
             return this;
         }
@@ -755,7 +790,8 @@
          * {@link MediaRouter.RouteInfo#PLAYBACK_VOLUME_FIXED} or
          * {@link MediaRouter.RouteInfo#PLAYBACK_VOLUME_VARIABLE}.
          */
-        public @NonNull Builder setVolumeHandling(int volumeHandling) {
+        @NonNull
+        public Builder setVolumeHandling(int volumeHandling) {
             mBundle.putInt(KEY_VOLUME_HANDLING, volumeHandling);
             return this;
         }
@@ -769,7 +805,8 @@
          * @param deduplicationIds A set of strings that uniquely identify the receiver device that
          *     backs this route.
          */
-        public @NonNull Builder setDeduplicationIds(@NonNull Set<String> deduplicationIds) {
+        @NonNull
+        public Builder setDeduplicationIds(@NonNull Set<String> deduplicationIds) {
             mBundle.putStringArrayList(KEY_DEDUPLICATION_IDS, new ArrayList<>(deduplicationIds));
             return this;
         }
@@ -777,7 +814,8 @@
         /**
          * Sets the route's presentation display id, or -1 if none.
          */
-        public @NonNull Builder setPresentationDisplayId(int presentationDisplayId) {
+        @NonNull
+        public Builder setPresentationDisplayId(int presentationDisplayId) {
             mBundle.putInt(KEY_PRESENTATION_DISPLAY_ID, presentationDisplayId);
             return this;
         }
@@ -787,7 +825,8 @@
          * The extras will be ignored by the media router but they may be used
          * by applications.
          */
-        public @NonNull Builder setExtras(@Nullable Bundle extras) {
+        @NonNull
+        public Builder setExtras(@Nullable Bundle extras) {
             if (extras == null) {
                 mBundle.putBundle(KEY_EXTRAS, null);
             } else {
@@ -801,7 +840,8 @@
          * A router whose version is lower than this will not be able to connect to this route.
          */
         @RestrictTo(LIBRARY)
-        public @NonNull Builder setMinClientVersion(int minVersion) {
+        @NonNull
+        public Builder setMinClientVersion(int minVersion) {
             mBundle.putInt(KEY_MIN_CLIENT_VERSION, minVersion);
             return this;
         }
@@ -811,7 +851,8 @@
          * A router whose version is higher than this will not be able to connect to this route.
          */
         @RestrictTo(LIBRARY)
-        public @NonNull Builder setMaxClientVersion(int maxVersion) {
+        @NonNull
+        public Builder setMaxClientVersion(int maxVersion) {
             mBundle.putInt(KEY_MAX_CLIENT_VERSION, maxVersion);
             return this;
         }
@@ -828,8 +869,9 @@
          * <p>Calls to this method override previous calls to {@link #setVisibilityPublic} and
          * {@link #setVisibilityRestricted}.
          */
+        @NonNull
         @SuppressLint({"MissingGetterMatchingBuilder"})
-        public @NonNull Builder setVisibilityPublic() {
+        public Builder setVisibilityPublic() {
             mBundle.putBoolean(KEY_IS_VISIBILITY_PUBLIC, true);
             mAllowedPackages.clear();
             return this;
@@ -848,8 +890,9 @@
          * @see #setVisibilityPublic
          * @param allowedPackages set of package names which are allowed to see this route.
          */
+        @NonNull
         @SuppressLint({"MissingGetterMatchingBuilder"})
-        public @NonNull Builder setVisibilityRestricted(@NonNull Set<String> allowedPackages) {
+        public Builder setVisibilityRestricted(@NonNull Set<String> allowedPackages) {
             mBundle.putBoolean(KEY_IS_VISIBILITY_PUBLIC, false);
             mAllowedPackages = new HashSet<>(allowedPackages);
             return this;
@@ -858,7 +901,8 @@
         /**
          * Builds the {@link MediaRouteDescriptor media route descriptor}.
          */
-        public @NonNull MediaRouteDescriptor build() {
+        @NonNull
+        public MediaRouteDescriptor build() {
             mBundle.putParcelableArrayList(KEY_CONTROL_FILTERS, new ArrayList<>(mControlFilters));
             mBundle.putStringArrayList(KEY_GROUP_MEMBER_IDS, new ArrayList<>(mGroupMemberIds));
             mBundle.putStringArrayList(KEY_ALLOWED_PACKAGES, new ArrayList<>(mAllowedPackages));
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDiscoveryRequest.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDiscoveryRequest.java
index 91a2bb2..c0188ab 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDiscoveryRequest.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDiscoveryRequest.java
@@ -17,8 +17,8 @@
 
 import android.os.Bundle;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 /**
  * Describes the kinds of routes that the media router would like to discover
@@ -58,7 +58,8 @@
     /**
      * Gets the route selector that specifies the kinds of routes to discover.
      */
-    public @NonNull MediaRouteSelector getSelector() {
+    @NonNull
+    public MediaRouteSelector getSelector() {
         ensureSelector();
         return mSelector;
     }
@@ -104,8 +105,9 @@
         return getSelector().hashCode() ^ (isActiveScan() ? 1 : 0);
     }
 
+    @NonNull
     @Override
-    public @NonNull String toString() {
+    public String toString() {
         return "DiscoveryRequest{ selector=" + getSelector()
                 + ", activeScan=" + isActiveScan()
                 + ", isValid=" + isValid()
@@ -117,7 +119,8 @@
      *
      * @return The contents of the object represented as a bundle.
      */
-    public @NonNull Bundle asBundle() {
+    @NonNull
+    public Bundle asBundle() {
         return mBundle;
     }
 
@@ -127,7 +130,8 @@
      * @param bundle The bundle, or null if none.
      * @return The new instance, or null if the bundle was null.
      */
-    public static @Nullable MediaRouteDiscoveryRequest fromBundle(@Nullable Bundle bundle) {
+    @Nullable
+    public static MediaRouteDiscoveryRequest fromBundle(@Nullable Bundle bundle) {
         return bundle != null ? new MediaRouteDiscoveryRequest(bundle) : null;
     }
 }
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProvider.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProvider.java
index a814852..174169b 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProvider.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProvider.java
@@ -27,13 +27,12 @@
 
 import androidx.annotation.GuardedBy;
 import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.core.util.ObjectsCompat;
 import androidx.mediarouter.media.MediaRouter.ControlRequestCallback;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
@@ -117,21 +116,24 @@
     /**
      * Gets the context of the media route provider.
      */
-    public final @NonNull Context getContext() {
+    @NonNull
+    public final Context getContext() {
         return mContext;
     }
 
     /**
      * Gets the provider's handler which is associated with the main thread.
      */
-    public final @NonNull Handler getHandler() {
+    @NonNull
+    public final Handler getHandler() {
         return mHandler;
     }
 
     /**
      * Gets some metadata about the provider's implementation.
      */
-    public final @NonNull ProviderMetadata getMetadata() {
+    @NonNull
+    public final ProviderMetadata getMetadata() {
         return mMetadata;
     }
 
@@ -153,7 +155,8 @@
      *
      * @see #onDiscoveryRequestChanged
      */
-    public final @Nullable MediaRouteDiscoveryRequest getDiscoveryRequest() {
+    @Nullable
+    public final MediaRouteDiscoveryRequest getDiscoveryRequest() {
         return mDiscoveryRequest;
     }
 
@@ -226,7 +229,8 @@
      *
      * @see Callback#onDescriptorChanged
      */
-    public final @Nullable MediaRouteProviderDescriptor getDescriptor() {
+    @Nullable
+    public final MediaRouteProviderDescriptor getDescriptor() {
         return mDescriptor;
     }
 
@@ -272,7 +276,8 @@
      * @return The route controller.  Returns null if there is no such route or if the route
      * cannot be controlled using the route controller interface.
      */
-    public @Nullable RouteController onCreateRouteController(@NonNull String routeId) {
+    @Nullable
+    public RouteController onCreateRouteController(@NonNull String routeId) {
         if (routeId == null) {
             throw new IllegalArgumentException("routeId cannot be null");
         }
@@ -293,7 +298,8 @@
      * cannot be controlled using the route controller interface.
      */
     @RestrictTo(LIBRARY)
-    public @Nullable RouteController onCreateRouteController(@NonNull String routeId,
+    @Nullable
+    public RouteController onCreateRouteController(@NonNull String routeId,
             @NonNull String routeGroupId) {
         if (routeId == null) {
             throw new IllegalArgumentException("routeId cannot be null");
@@ -315,7 +321,8 @@
      * @return {@link DynamicGroupRouteController}. Returns null if there is no such route or if the
      *     route cannot be controlled using the {@link DynamicGroupRouteController} interface.
      */
-    public @Nullable DynamicGroupRouteController onCreateDynamicGroupRouteController(
+    @Nullable
+    public DynamicGroupRouteController onCreateDynamicGroupRouteController(
             @NonNull String initialMemberRouteId,
             @NonNull RouteControllerOptions routeControllerOptions) {
         return onCreateDynamicGroupRouteController(initialMemberRouteId);
@@ -334,7 +341,8 @@
      * @return {@link DynamicGroupRouteController}. Returns null if there is no such route or if the
      *     route cannot be controlled using the {@link DynamicGroupRouteController} interface.
      */
-    public @Nullable DynamicGroupRouteController onCreateDynamicGroupRouteController(
+    @Nullable
+    public DynamicGroupRouteController onCreateDynamicGroupRouteController(
             @NonNull String initialMemberRouteId) {
         if (initialMemberRouteId == null) {
             throw new IllegalArgumentException("initialMemberRouteId cannot be null.");
@@ -361,19 +369,22 @@
         /**
          * Gets the provider's package name.
          */
-        public @NonNull String getPackageName() {
+        @NonNull
+        public String getPackageName() {
             return mComponentName.getPackageName();
         }
 
         /**
          * Gets the provider's component name.
          */
-        public @NonNull ComponentName getComponentName() {
+        @NonNull
+        public ComponentName getComponentName() {
             return mComponentName;
         }
 
+        @NonNull
         @Override
-        public @NonNull String toString() {
+        public String toString() {
             return "ProviderMetadata{ componentName="
                     + mComponentName.flattenToShortString() + " }";
         }
@@ -497,7 +508,8 @@
          * It is provided by {@link MediaRouteProvider}.
          * e.g. "Add a device."
          */
-        public @Nullable String getGroupableSelectionTitle() {
+        @Nullable
+        public String getGroupableSelectionTitle() {
             return null;
         }
 
@@ -507,7 +519,8 @@
          * {@link MediaRouteProvider}.
          * e.g. "Play on group."
          */
-        public @Nullable String getTransferableSectionTitle() {
+        @Nullable
+        public String getTransferableSectionTitle() {
             return null;
         }
 
@@ -568,7 +581,7 @@
          */
         @Deprecated
         public final void notifyDynamicRoutesChanged(
-                final @NonNull Collection<DynamicRouteDescriptor> routes) {
+                @NonNull final Collection<DynamicRouteDescriptor> routes) {
             if (routes == null) {
                 throw new NullPointerException("routes must not be null");
             }
@@ -733,7 +746,8 @@
             /**
              * Gets this route's {@link MediaRouteDescriptor}. i.e. which route this info is for.
              */
-            public @NonNull MediaRouteDescriptor getRouteDescriptor() {
+            @NonNull
+            public MediaRouteDescriptor getRouteDescriptor() {
                 return mMediaRouteDescriptor;
             }
 
@@ -843,7 +857,8 @@
                 /**
                  * Sets the selection state of this route within the associated dynamic group route.
                  */
-                public @NonNull Builder setSelectionState(@SelectionState int state) {
+                @NonNull
+                public Builder setSelectionState(@SelectionState int state) {
                     mSelectionState = state;
                     return this;
                 }
@@ -851,7 +866,8 @@
                 /**
                  * Sets if this route can be unselected.
                  */
-                public @NonNull Builder setIsUnselectable(boolean value) {
+                @NonNull
+                public Builder setIsUnselectable(boolean value) {
                     mIsUnselectable = value;
                     return this;
                 }
@@ -860,7 +876,8 @@
                  * Sets if this route can be a selected as a member of the associated dynamic
                  * group route.
                  */
-                public @NonNull Builder setIsGroupable(boolean value) {
+                @NonNull
+                public Builder setIsGroupable(boolean value) {
                     mIsGroupable = value;
                     return this;
                 }
@@ -868,7 +885,8 @@
                 /**
                  * Sets if the associated dynamic group route can be transferred to this route.
                  */
-                public @NonNull Builder setIsTransferable(boolean value) {
+                @NonNull
+                public Builder setIsTransferable(boolean value) {
                     mIsTransferable = value;
                     return this;
                 }
@@ -876,7 +894,8 @@
                 /**
                  * Builds the {@link DynamicRouteDescriptor}.
                  */
-                public @NonNull DynamicRouteDescriptor build() {
+                @NonNull
+                public DynamicRouteDescriptor build() {
                     return new DynamicRouteDescriptor(
                             mRouteDescriptor, mSelectionState, mIsUnselectable, mIsGroupable,
                             mIsTransferable);
@@ -906,7 +925,8 @@
             return mBundle;
         }
 
-        public @NonNull Bundle getControlHints() {
+        @NonNull
+        public Bundle getControlHints() {
             return mControlHints;
         }
 
@@ -915,13 +935,15 @@
             private final Bundle mBundle = new Bundle();
 
             /** Sets controlHints passed by the client application. */
-            public @NonNull Builder setControlHints(@Nullable Bundle controlHints) {
+            @NonNull
+            public Builder setControlHints(@Nullable Bundle controlHints) {
                 mBundle.putParcelable(KEY_CONTROL_HINTS, controlHints);
                 return this;
             }
 
             /** Builds the {@link RouteControllerOptions}. */
-            public @NonNull RouteControllerOptions build() {
+            @NonNull
+            public  RouteControllerOptions build() {
                 return new RouteControllerOptions(mBundle);
             }
         }
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderDescriptor.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderDescriptor.java
index 6c810cd..ee1b64a 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderDescriptor.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderDescriptor.java
@@ -17,8 +17,8 @@
 
 import android.os.Bundle;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -58,7 +58,8 @@
      * If it doesn't have any routes, it returns an empty list.
      * </p>
      */
-    public @NonNull List<MediaRouteDescriptor> getRoutes() {
+    @NonNull
+    public List<MediaRouteDescriptor> getRoutes() {
         return mRoutes;
     }
 
@@ -90,8 +91,9 @@
         return mSupportsDynamicGroupRoute;
     }
 
+    @NonNull
     @Override
-    public @NonNull String toString() {
+    public String toString() {
         return "MediaRouteProviderDescriptor{ "
                 + "routes="
                 + Arrays.toString(getRoutes().toArray())
@@ -104,7 +106,8 @@
      *
      * @return The contents of the object represented as a bundle.
      */
-    public @NonNull Bundle asBundle() {
+    @NonNull
+    public Bundle asBundle() {
         if (mBundle != null) {
             return mBundle;
         }
@@ -127,7 +130,8 @@
      * @param bundle The bundle, or null if none.
      * @return The new instance, or null if the bundle was null.
      */
-    public static @Nullable MediaRouteProviderDescriptor fromBundle(@Nullable Bundle bundle) {
+    @Nullable
+    public static MediaRouteProviderDescriptor fromBundle(@Nullable Bundle bundle) {
         if (bundle == null) {
             return null;
         }
@@ -171,7 +175,8 @@
         /**
          * Adds a route.
          */
-        public @NonNull Builder addRoute(@NonNull MediaRouteDescriptor route) {
+        @NonNull
+        public Builder addRoute(@NonNull MediaRouteDescriptor route) {
             if (route == null) {
                 throw new IllegalArgumentException("route must not be null");
             }
@@ -186,7 +191,8 @@
         /**
          * Adds a list of routes.
          */
-        public @NonNull Builder addRoutes(@NonNull Collection<MediaRouteDescriptor> routes) {
+        @NonNull
+        public Builder addRoutes(@NonNull Collection<MediaRouteDescriptor> routes) {
             if (routes == null) {
                 throw new IllegalArgumentException("routes must not be null");
             }
@@ -202,7 +208,8 @@
         /**
          * Sets the list of routes.
          */
-        @NonNull Builder setRoutes(@Nullable Collection<MediaRouteDescriptor> routes) {
+        @NonNull
+        Builder setRoutes(@Nullable Collection<MediaRouteDescriptor> routes) {
             mRoutes.clear();
             if (routes != null) {
                 mRoutes.addAll(routes);
@@ -213,7 +220,8 @@
         /**
          * Sets if this provider supports dynamic group route.
          */
-        public @NonNull Builder setSupportsDynamicGroupRoute(boolean value) {
+        @NonNull
+        public Builder setSupportsDynamicGroupRoute(boolean value) {
             mSupportsDynamicGroupRoute = value;
             return this;
         }
@@ -222,7 +230,8 @@
         /**
          * Builds the {@link MediaRouteProviderDescriptor}.
          */
-        public @NonNull MediaRouteProviderDescriptor build() {
+        @NonNull
+        public MediaRouteProviderDescriptor build() {
             return new MediaRouteProviderDescriptor(mRoutes, mSupportsDynamicGroupRoute);
         }
     }
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderService.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderService.java
index a87d143..eac2b09 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderService.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderService.java
@@ -74,6 +74,8 @@
 import android.util.Log;
 import android.util.SparseArray;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.VisibleForTesting;
 import androidx.collection.ArrayMap;
@@ -86,9 +88,6 @@
 import androidx.mediarouter.media.MediaRouteProvider.RouteController;
 import androidx.mediarouter.media.MediaRouteProvider.RouteControllerOptions;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -217,7 +216,7 @@
      * @param listener a @code{@link Consumer} that takes a list of {@link ClientInfo}
      */
     public void addClientInfoListener(
-            /* @CallbackExecutor */ @NonNull Executor listenerExecutor,
+            @NonNull /* @CallbackExecutor */ Executor listenerExecutor,
             @NonNull Consumer<List<ClientInfo>> listener) {
         mImpl.addClientInfoListener(listenerExecutor, listener);
     }
@@ -238,10 +237,12 @@
      * @return The media route provider offered by this service, or null if
      * this service has decided not to offer a media route provider.
      */
-    public abstract @Nullable MediaRouteProvider onCreateMediaRouteProvider();
+    @Nullable
+    public abstract MediaRouteProvider onCreateMediaRouteProvider();
 
     @Override
-    public @Nullable IBinder onBind(@NonNull Intent intent) {
+    @Nullable
+    public IBinder onBind(@NonNull Intent intent) {
         return mImpl.onBind(intent);
     }
 
@@ -259,7 +260,8 @@
      *
      * @see #onCreateMediaRouteProvider()
      */
-    public @Nullable MediaRouteProvider getMediaRouteProvider() {
+    @Nullable
+    public MediaRouteProvider getMediaRouteProvider() {
         return mProvider;
     }
 
@@ -362,7 +364,8 @@
          *
          * @return The package name of the client
          */
-        public @NonNull String getPackageName() {
+        @NonNull
+        public String getPackageName() {
             return packageName;
         }
 
@@ -375,7 +378,8 @@
             }
 
             /** Builds and returns the {@link ClientInfo} object. */
-            public @NonNull ClientInfo build() {
+            @NonNull
+            public ClientInfo build() {
                 return new ClientInfo(packageName);
             }
         }
@@ -577,7 +581,8 @@
         MediaRouteDiscoveryRequest mCompositeDiscoveryRequest;
         MediaRouteDiscoveryRequest mBaseDiscoveryRequest;
         long mBaseDiscoveryRequestTimestamp;
-        private final @Nullable Map<Consumer<List<ClientInfo>>, Executor> mClientInfoListeners =
+        @Nullable
+        private final Map<Consumer<List<ClientInfo>>, Executor> mClientInfoListeners =
                 new HashMap<>();
         private final Object mClientInfoListenersLock = new Object();
         private final MediaRouterActiveScanThrottlingHelper mActiveScanThrottlingHelper =
@@ -1170,8 +1175,9 @@
                         .obtainMessage(PRIVATE_MSG_CLIENT_DIED, mMessenger).sendToTarget();
             }
 
+            @NonNull
             @Override
-            public @NonNull String toString() {
+            public String toString() {
                 return getClientId(mMessenger);
             }
 
@@ -1222,7 +1228,7 @@
 
         @Override
         public void addClientInfoListener (
-                /* @CallbackExecutor */ @NonNull Executor listenerExecutor,
+                @NonNull /* @CallbackExecutor */ Executor listenerExecutor,
                 @NonNull Consumer<List<ClientInfo>> listener) {
             synchronized (mClientInfoListenersLock) {
                 mClientInfoListeners.put(listener, listenerExecutor);
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteSelector.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteSelector.java
index 965dd2f..bc78b74 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteSelector.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteSelector.java
@@ -18,8 +18,8 @@
 import android.content.IntentFilter;
 import android.os.Bundle;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -65,7 +65,8 @@
      *
      * @return The list of categories.
      */
-    public @NonNull List<String> getControlCategories() {
+    @NonNull
+    public List<String> getControlCategories() {
         ensureControlCategories();
         return new ArrayList<>(mControlCategories);
     }
@@ -179,8 +180,9 @@
         return mControlCategories.hashCode();
     }
 
+    @NonNull
     @Override
-    public @NonNull String toString() {
+    public String toString() {
         return "MediaRouteSelector{ "
                 + "controlCategories="
                 + Arrays.toString(getControlCategories().toArray())
@@ -192,7 +194,8 @@
      *
      * @return The contents of the object represented as a bundle.
      */
-    public @NonNull Bundle asBundle() {
+    @NonNull
+    public Bundle asBundle() {
         return mBundle;
     }
 
@@ -202,7 +205,8 @@
      * @param bundle The bundle, or null if none.
      * @return The new instance, or null if the bundle was null.
      */
-    public static @Nullable MediaRouteSelector fromBundle(@Nullable Bundle bundle) {
+    @Nullable
+    public static MediaRouteSelector fromBundle(@Nullable Bundle bundle) {
         return bundle != null ? new MediaRouteSelector(bundle, null) : null;
     }
 
@@ -240,7 +244,8 @@
          * {@link MediaControlIntent#CATEGORY_LIVE_AUDIO}.
          * @return The builder instance for chaining.
          */
-        public @NonNull Builder addControlCategory(@NonNull String category) {
+        @NonNull
+        public Builder addControlCategory(@NonNull String category) {
             if (category == null) {
                 throw new IllegalArgumentException("category must not be null");
             }
@@ -261,7 +266,8 @@
          * such as {@link MediaControlIntent#CATEGORY_LIVE_AUDIO}.
          * @return The builder instance for chaining.
          */
-        public @NonNull Builder addControlCategories(@NonNull Collection<String> categories) {
+        @NonNull
+        public Builder addControlCategories(@NonNull Collection<String> categories) {
             if (categories == null) {
                 throw new IllegalArgumentException("categories must not be null");
             }
@@ -280,7 +286,8 @@
          * @param selector The media route selector whose contents are to be added.
          * @return The builder instance for chaining.
          */
-        public @NonNull Builder addSelector(@NonNull MediaRouteSelector selector) {
+        @NonNull
+        public Builder addSelector(@NonNull MediaRouteSelector selector) {
             if (selector == null) {
                 throw new IllegalArgumentException("selector must not be null");
             }
@@ -292,7 +299,8 @@
         /**
          * Builds the {@link MediaRouteSelector media route selector}.
          */
-        public @NonNull MediaRouteSelector build() {
+        @NonNull
+        public MediaRouteSelector build() {
             if (mControlCategories == null) {
                 return EMPTY;
             }
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
index 09acc6d..f4b39f0 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
@@ -38,6 +38,8 @@
 
 import androidx.annotation.IntDef;
 import androidx.annotation.MainThread;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.collection.ArrayMap;
 import androidx.core.util.ObjectsCompat;
@@ -49,9 +51,6 @@
 
 import com.google.common.util.concurrent.ListenableFuture;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.ref.WeakReference;
@@ -270,7 +269,8 @@
      * a strong reference to this object as long as it is in use.
      */
     @MainThread
-    public static @NonNull MediaRouter getInstance(@NonNull Context context) {
+    @NonNull
+    public static MediaRouter getInstance(@NonNull Context context) {
         if (context == null) {
             throw new IllegalArgumentException("context must not be null");
         }
@@ -311,7 +311,8 @@
 
     /** Gets the initialized global router. */
     @RestrictTo(LIBRARY_GROUP)
-    static @NonNull GlobalMediaRouter getGlobalRouter() {
+    @NonNull
+    static GlobalMediaRouter getGlobalRouter() {
         if (sGlobal == null) {
             throw new IllegalStateException(
                     "getGlobalRouter cannot be called when sGlobal is " + "null");
@@ -326,7 +327,8 @@
      * <p>Must be called on the main thread.
      */
     @MainThread
-    public @NonNull List<RouteInfo> getRoutes() {
+    @NonNull
+    public List<RouteInfo> getRoutes() {
         checkCallingThread();
         return getGlobalRouter().getRoutes();
     }
@@ -338,7 +340,8 @@
      * <p>Must be called on the main thread.
      */
     @MainThread
-    public @NonNull List<ProviderInfo> getProviders() {
+    @NonNull
+    public List<ProviderInfo> getProviders() {
         checkCallingThread();
         return getGlobalRouter().getProviders();
     }
@@ -354,7 +357,8 @@
      * @return The default route, which is guaranteed to never be null.
      */
     @MainThread
-    public @NonNull RouteInfo getDefaultRoute() {
+    @NonNull
+    public RouteInfo getDefaultRoute() {
         checkCallingThread();
         return getGlobalRouter().getDefaultRoute();
     }
@@ -367,7 +371,8 @@
      * @return A bluetooth route, if exist, otherwise null.
      */
     @MainThread
-    public @Nullable RouteInfo getBluetoothRoute() {
+    @Nullable
+    public RouteInfo getBluetoothRoute() {
         checkCallingThread();
         return getGlobalRouter().getBluetoothRoute();
     }
@@ -419,7 +424,8 @@
      * @see RouteInfo#supportsControlRequest
      */
     @MainThread
-    public @NonNull RouteInfo getSelectedRoute() {
+    @NonNull
+    public RouteInfo getSelectedRoute() {
         checkCallingThread();
         return getGlobalRouter().getSelectedRoute();
     }
@@ -438,7 +444,8 @@
      * @see RouteInfo#matchesSelector
      */
     @MainThread
-    public @NonNull RouteInfo updateSelectedRoute(@NonNull MediaRouteSelector selector) {
+    @NonNull
+    public RouteInfo updateSelectedRoute(@NonNull MediaRouteSelector selector) {
         if (selector == null) {
             throw new IllegalArgumentException("selector must not be null");
         }
@@ -933,7 +940,8 @@
         getGlobalRouter().setMediaSessionCompat(mediaSession);
     }
 
-    public MediaSessionCompat.@Nullable Token getMediaSessionToken() {
+    @Nullable
+    public MediaSessionCompat.Token getMediaSessionToken() {
         return sGlobal == null ? null : sGlobal.getMediaSessionToken();
         // Use sGlobal exceptionally due to unchecked thread.
     }
@@ -945,7 +953,8 @@
      * <p>Must be called on the main thread.
      */
     @MainThread
-    public @Nullable MediaRouterParams getRouterParams() {
+    @Nullable
+    public MediaRouterParams getRouterParams() {
         checkCallingThread();
         return getGlobalRouter().getRouterParams();
     }
@@ -1424,7 +1433,8 @@
         /**
          * Gets information about the provider of this media route.
          */
-        public @NonNull ProviderInfo getProvider() {
+        @NonNull
+        public ProviderInfo getProvider() {
             return mProvider;
         }
 
@@ -1438,7 +1448,8 @@
          *
          * @return The unique id of the route, never null.
          */
-        public @NonNull String getId() {
+        @NonNull
+        public String getId() {
             return mUniqueId;
         }
 
@@ -1452,7 +1463,8 @@
          * @return The user-visible name of a media route.  This is the string presented
          * to users who may select this as the active route.
          */
-        public @NonNull String getName() {
+        @NonNull
+        public String getName() {
             return mName;
         }
 
@@ -1465,7 +1477,8 @@
          *
          * @return The description of the route, or null if none.
          */
-        public @Nullable String getDescription() {
+        @Nullable
+        public String getDescription() {
             return mDescription;
         }
 
@@ -1477,7 +1490,8 @@
          *
          * @return The URI of the icon representing this route, or null if none.
          */
-        public @Nullable Uri getIconUri() {
+        @Nullable
+        public Uri getIconUri() {
             return mIconUri;
         }
 
@@ -1596,7 +1610,8 @@
          * @see #supportsControlCategory
          * @see #supportsControlRequest
          */
-        public @NonNull List<IntentFilter> getControlFilters() {
+        @NonNull
+        public List<IntentFilter> getControlFilters() {
             return mControlFilters;
         }
 
@@ -1916,7 +1931,8 @@
          * @see android.app.Presentation
          */
         @MainThread
-        public @Nullable Display getPresentationDisplay() {
+        @Nullable
+        public Display getPresentationDisplay() {
             checkCallingThread();
             if (mPresentationDisplayId >= 0 && mPresentationDisplay == null) {
                 mPresentationDisplay = getGlobalRouter().getDisplay(mPresentationDisplayId);
@@ -1936,7 +1952,8 @@
          * Gets a collection of extra properties about this route that were supplied
          * by its media route provider, or null if none.
          */
-        public @Nullable Bundle getExtras() {
+        @Nullable
+        public Bundle getExtras() {
             return mExtras;
         }
 
@@ -1944,7 +1961,8 @@
          * Gets an intent sender for launching a settings activity for this
          * route.
          */
-        public @Nullable IntentSender getSettingsIntent() {
+        @Nullable
+        public IntentSender getSettingsIntent() {
             return mSettingsIntent;
         }
 
@@ -1983,7 +2001,8 @@
          * Gets the dynamic group state of the given route.
          */
         @RestrictTo(LIBRARY)
-        public @Nullable DynamicGroupState getDynamicGroupState(@NonNull RouteInfo route) {
+        @Nullable
+        public DynamicGroupState getDynamicGroupState(@NonNull RouteInfo route) {
             if (route == null) {
                 throw new NullPointerException("route must not be null");
             }
@@ -2000,7 +2019,8 @@
          * @return The list of the routes in this group
          */
         @RestrictTo(LIBRARY)
-        public @NonNull List<RouteInfo> getMemberRoutes() {
+        @NonNull
+        public List<RouteInfo> getMemberRoutes() {
             return Collections.unmodifiableList(mMemberRoutes);
         }
 
@@ -2009,7 +2029,8 @@
          */
         @MainThread
         @RestrictTo(LIBRARY)
-        public @Nullable DynamicGroupRouteController getDynamicGroupController() {
+        @Nullable
+        public DynamicGroupRouteController getDynamicGroupController() {
             checkCallingThread();
             //TODO: handle multiple controllers case
             RouteController controller = getGlobalRouter().mSelectedRouteController;
@@ -2020,7 +2041,8 @@
         }
 
         @Override
-        public @NonNull String toString() {
+        @NonNull
+        public String toString() {
             StringBuilder sb = new StringBuilder();
 
             sb.append("MediaRouter.RouteInfo{ uniqueId=").append(mUniqueId)
@@ -2219,7 +2241,8 @@
         }
 
         @RestrictTo(LIBRARY)
-        public @NonNull MediaRouteProvider getProviderInstance() {
+        @NonNull
+        public MediaRouteProvider getProviderInstance() {
             return mProvider.getProviderInstance();
         }
 
@@ -2321,8 +2344,9 @@
          *
          * <p>Must be called on the main thread.
          */
+        @NonNull
         @MainThread
-        public @NonNull MediaRouteProvider getProviderInstance() {
+        public MediaRouteProvider getProviderInstance() {
             checkCallingThread();
             return mProviderInstance;
         }
@@ -2330,14 +2354,16 @@
         /**
          * Gets the package name of the media route provider.
          */
-        public @NonNull String getPackageName() {
+        @NonNull
+        public String getPackageName() {
             return mMetadata.getPackageName();
         }
 
         /**
          * Gets the component name of the media route provider.
          */
-        public @NonNull ComponentName getComponentName() {
+        @NonNull
+        public ComponentName getComponentName() {
             return mMetadata.getComponentName();
         }
 
@@ -2347,7 +2373,8 @@
          * <p>Must be called on the main thread.
          */
         @MainThread
-        public @NonNull List<RouteInfo> getRoutes() {
+        @NonNull
+        public List<RouteInfo> getRoutes() {
             checkCallingThread();
             return Collections.unmodifiableList(mRoutes);
         }
@@ -2383,8 +2410,9 @@
             return mDescriptor != null && mDescriptor.supportsDynamicGroupRoute();
         }
 
+        @NonNull
         @Override
-        public @NonNull String toString() {
+        public String toString() {
             return "MediaRouter.RouteProviderInfo{ packageName=" + getPackageName() + " }";
         }
     }
@@ -2592,7 +2620,8 @@
          *     previous route.
          */
         @MainThread
-        @Nullable ListenableFuture<Void> onPrepareTransfer(
+        @Nullable
+        ListenableFuture<Void> onPrepareTransfer(
                 @NonNull RouteInfo fromRoute, @NonNull RouteInfo toRoute);
     }
 
@@ -2668,7 +2697,8 @@
         private final RouteInfo mFromRoute;
         final RouteInfo mToRoute;
         private final RouteInfo mRequestedRoute;
-        final @Nullable List<DynamicRouteDescriptor> mMemberRoutes;
+        @Nullable
+        final List<DynamicRouteDescriptor> mMemberRoutes;
         private final WeakReference<GlobalMediaRouter> mRouter;
 
         private ListenableFuture<Void> mFuture = null;
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter2Utils.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter2Utils.java
index 9d7f60b..40c5b79 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter2Utils.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter2Utils.java
@@ -73,13 +73,12 @@
 import android.text.TextUtils;
 import android.util.ArraySet;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.OptIn;
 import androidx.annotation.RequiresApi;
 import androidx.mediarouter.media.MediaRouter.RouteInfo;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
@@ -119,8 +118,8 @@
     private MediaRouter2Utils() {}
 
     @OptIn(markerClass = androidx.core.os.BuildCompat.PrereleaseSdkCheck.class)
-    public static @Nullable MediaRoute2Info toFwkMediaRoute2Info(
-            @Nullable MediaRouteDescriptor descriptor) {
+    @Nullable
+    public static MediaRoute2Info toFwkMediaRoute2Info(@Nullable MediaRouteDescriptor descriptor) {
         if (descriptor == null) {
             return null;
         } else if (TextUtils.isEmpty(descriptor.getId())
@@ -179,7 +178,8 @@
         return builder.build();
     }
 
-    public static @Nullable MediaRouteDescriptor toMediaRouteDescriptor(
+    @Nullable
+    public static MediaRouteDescriptor toMediaRouteDescriptor(
             @Nullable MediaRoute2Info fwkMediaRoute2Info) {
         if (fwkMediaRoute2Info == null) {
             return null;
@@ -250,7 +250,8 @@
         return features;
     }
 
-    static @NonNull List<IntentFilter> toControlFilters(@Nullable Collection<String> features) {
+    @NonNull
+    static List<IntentFilter> toControlFilters(@Nullable Collection<String> features) {
         if (features == null) {
             return new ArrayList<>();
         }
@@ -276,7 +277,8 @@
         return controlFilters;
     }
 
-    static @NonNull List<String> getRouteIds(@Nullable List<MediaRoute2Info> routes) {
+    @NonNull
+    static List<String> getRouteIds(@Nullable List<MediaRoute2Info> routes) {
         if (routes == null) {
             return new ArrayList<>();
         }
@@ -291,7 +293,8 @@
         return routeIds;
     }
 
-    static @NonNull MediaRouteDiscoveryRequest toMediaRouteDiscoveryRequest(
+    @NonNull
+    static MediaRouteDiscoveryRequest toMediaRouteDiscoveryRequest(
             @NonNull RouteDiscoveryPreference preference) {
         List<String> controlCategories = new ArrayList<>();
         for (String feature : preference.getPreferredFeatures()) {
@@ -304,7 +307,8 @@
         return new MediaRouteDiscoveryRequest(selector, preference.shouldPerformActiveScan());
     }
 
-    static @NonNull RouteDiscoveryPreference toDiscoveryPreference(
+    @NonNull
+    static RouteDiscoveryPreference toDiscoveryPreference(
             @Nullable MediaRouteDiscoveryRequest discoveryRequest) {
         if (discoveryRequest == null || !discoveryRequest.isValid()) {
             return new RouteDiscoveryPreference.Builder(new ArrayList<>(), false).build();
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterParams.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterParams.java
index 5cf763c..30c78c1 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterParams.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterParams.java
@@ -22,11 +22,10 @@
 import android.os.Bundle;
 
 import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -143,8 +142,9 @@
 
     /**
      */
+    @NonNull
     @RestrictTo(RestrictTo.Scope.LIBRARY)
-    public @NonNull Bundle getExtras() {
+    public Bundle getExtras() {
         return mExtras;
     }
 
@@ -197,7 +197,8 @@
          * @see #DIALOG_TYPE_DEFAULT
          * @see #DIALOG_TYPE_DYNAMIC_GROUP
          */
-        public @NonNull Builder setDialogType(@DialogType int dialogType) {
+        @NonNull
+        public Builder setDialogType(@DialogType int dialogType) {
             mDialogType = dialogType;
             return this;
         }
@@ -216,7 +217,8 @@
          * It could result in getting invalid routes.
          * @see MediaTransferReceiver
          */
-        public @NonNull Builder setMediaTransferReceiverEnabled(boolean enabled) {
+        @NonNull
+        public Builder setMediaTransferReceiverEnabled(boolean enabled) {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                 mMediaTransferEnabled = enabled;
             }
@@ -235,7 +237,8 @@
          * If set to {@code false}, {@link androidx.mediarouter.app.MediaRouteButton
          * MediaRouteButton} will show the dialog type which is set by {@link #setDialogType(int)}.
          */
-        public @NonNull Builder setOutputSwitcherEnabled(boolean enabled) {
+        @NonNull
+        public Builder setOutputSwitcherEnabled(boolean enabled) {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                 mOutputSwitcherEnabled = enabled;
             }
@@ -256,7 +259,8 @@
          * Note: This method will be no-op for Android versions earlier than Android R. It has
          * effect only when {@link MediaTransferReceiver media transfer is enabled}.
          */
-        public @NonNull Builder setTransferToLocalEnabled(boolean enabled) {
+        @NonNull
+        public Builder setTransferToLocalEnabled(boolean enabled) {
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                 mTransferToLocalEnabled = enabled;
             }
@@ -289,13 +293,17 @@
 
         /** Set extras. Default value is {@link Bundle#EMPTY} if not set. */
         @RestrictTo(RestrictTo.Scope.LIBRARY)
-        public @NonNull Builder setExtras(@Nullable Bundle extras) {
+        @NonNull
+        public Builder setExtras(@Nullable Bundle extras) {
             mExtras = (extras == null) ? null : new Bundle(extras);
             return this;
         }
 
-        /** Builds the {@link MediaRouterParams} instance. */
-        public @NonNull MediaRouterParams build() {
+        /**
+         * Builds the {@link MediaRouterParams} instance.
+         */
+        @NonNull
+        public MediaRouterParams build() {
             return new MediaRouterParams(this);
         }
     }
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterUtils.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterUtils.java
index eb612a5..095aa65 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterUtils.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterUtils.java
@@ -16,7 +16,7 @@
 
 package androidx.mediarouter.media;
 
-import org.jspecify.annotations.NonNull;
+import androidx.annotation.NonNull;
 
 /** Utils for usage with platform {@link android.media.MediaRouter} */
 class MediaRouterUtils {
@@ -33,31 +33,31 @@
     }
 
     public interface Callback {
-        void onRouteSelected(int type, android.media.MediaRouter.@NonNull RouteInfo route);
+        void onRouteSelected(int type, @NonNull android.media.MediaRouter.RouteInfo route);
 
-        void onRouteUnselected(int type, android.media.MediaRouter.@NonNull RouteInfo route);
+        void onRouteUnselected(int type, @NonNull android.media.MediaRouter.RouteInfo route);
 
-        void onRouteAdded(android.media.MediaRouter.@NonNull RouteInfo route);
+        void onRouteAdded(@NonNull android.media.MediaRouter.RouteInfo route);
 
-        void onRouteRemoved(android.media.MediaRouter.@NonNull RouteInfo route);
+        void onRouteRemoved(@NonNull android.media.MediaRouter.RouteInfo route);
 
-        void onRouteChanged(android.media.MediaRouter.@NonNull RouteInfo route);
+        void onRouteChanged(@NonNull android.media.MediaRouter.RouteInfo route);
 
-        void onRouteGrouped(android.media.MediaRouter.@NonNull RouteInfo route,
-                android.media.MediaRouter.@NonNull RouteGroup group, int index);
+        void onRouteGrouped(@NonNull android.media.MediaRouter.RouteInfo route,
+                @NonNull android.media.MediaRouter.RouteGroup group, int index);
 
-        void onRouteUngrouped(android.media.MediaRouter.@NonNull RouteInfo route,
-                android.media.MediaRouter.@NonNull RouteGroup group);
+        void onRouteUngrouped(@NonNull android.media.MediaRouter.RouteInfo route,
+                @NonNull android.media.MediaRouter.RouteGroup group);
 
-        void onRouteVolumeChanged(android.media.MediaRouter.@NonNull RouteInfo route);
+        void onRouteVolumeChanged(@NonNull android.media.MediaRouter.RouteInfo route);
 
-        void onRoutePresentationDisplayChanged(android.media.MediaRouter.@NonNull RouteInfo route);
+        void onRoutePresentationDisplayChanged(@NonNull android.media.MediaRouter.RouteInfo route);
     }
 
     public interface VolumeCallback {
-        void onVolumeSetRequest(android.media.MediaRouter.@NonNull RouteInfo route, int volume);
+        void onVolumeSetRequest(@NonNull android.media.MediaRouter.RouteInfo route, int volume);
 
-        void onVolumeUpdateRequest(android.media.MediaRouter.@NonNull RouteInfo route,
+        void onVolumeUpdateRequest(@NonNull android.media.MediaRouter.RouteInfo route,
                 int direction);
     }
 
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaSessionStatus.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaSessionStatus.java
index 34f198f..820982db 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaSessionStatus.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaSessionStatus.java
@@ -20,11 +20,10 @@
 import android.os.Bundle;
 import android.os.SystemClock;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.core.util.TimeUtils;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 /**
  * Describes the playback status of a media session.
  * <p>
@@ -124,12 +123,14 @@
      * The extras will be ignored by the media router but they may be used
      * by applications.
      */
-    public @Nullable Bundle getExtras() {
+    @Nullable
+    public Bundle getExtras() {
         return mBundle.getBundle(KEY_EXTRAS);
     }
 
+    @NonNull
     @Override
-    public @NonNull String toString() {
+    public String toString() {
         StringBuilder result = new StringBuilder();
         result.append("MediaSessionStatus{ ");
         result.append("timestamp=");
@@ -159,7 +160,8 @@
      *
      * @return The contents of the object represented as a bundle.
      */
-    public @NonNull Bundle asBundle() {
+    @NonNull
+    public Bundle asBundle() {
         return mBundle;
     }
 
@@ -169,7 +171,8 @@
      * @param bundle The bundle, or null if none.
      * @return The new instance, or null if the bundle was null.
      */
-    public static @Nullable MediaSessionStatus fromBundle(@Nullable Bundle bundle) {
+    @Nullable
+    public static MediaSessionStatus fromBundle(@Nullable Bundle bundle) {
         return bundle != null ? new MediaSessionStatus(bundle) : null;
     }
 
@@ -207,7 +210,8 @@
          * Sets the timestamp associated with the status information in
          * milliseconds since boot in the {@link SystemClock#elapsedRealtime} time base.
          */
-        public @NonNull Builder setTimestamp(long elapsedRealtimeTimestamp) {
+        @NonNull
+        public Builder setTimestamp(long elapsedRealtimeTimestamp) {
             mBundle.putLong(KEY_TIMESTAMP, elapsedRealtimeTimestamp);
             return this;
         }
@@ -215,7 +219,8 @@
         /**
          * Sets the session state.
          */
-        public @NonNull Builder setSessionState(int sessionState) {
+        @NonNull
+        public Builder setSessionState(int sessionState) {
             mBundle.putInt(KEY_SESSION_STATE, sessionState);
             return this;
         }
@@ -223,7 +228,8 @@
         /**
          * Sets whether the queue is paused.
          */
-        public @NonNull Builder setQueuePaused(boolean queuePaused) {
+        @NonNull
+        public Builder setQueuePaused(boolean queuePaused) {
             mBundle.putBoolean(KEY_QUEUE_PAUSED, queuePaused);
             return this;
         }
@@ -233,7 +239,8 @@
          * The extras will be ignored by the media router but they may be used
          * by applications.
          */
-        public @NonNull Builder setExtras(@Nullable Bundle extras) {
+        @NonNull
+        public Builder setExtras(@Nullable Bundle extras) {
             if (extras == null) {
                 mBundle.putBundle(KEY_EXTRAS, null);
             } else {
@@ -245,7 +252,8 @@
         /**
          * Builds the {@link MediaSessionStatus media session status object}.
          */
-        public @NonNull MediaSessionStatus build() {
+        @NonNull
+        public MediaSessionStatus build() {
             return new MediaSessionStatus(mBundle);
         }
     }
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaTransferReceiver.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaTransferReceiver.java
index d690709..8ed2a5f 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaTransferReceiver.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaTransferReceiver.java
@@ -25,10 +25,9 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
-import org.jspecify.annotations.NonNull;
-
 import java.util.List;
 
 /**
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/PlatformMediaRouter1RouteProvider.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/PlatformMediaRouter1RouteProvider.java
index 1c02db3..89d4178 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/PlatformMediaRouter1RouteProvider.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/PlatformMediaRouter1RouteProvider.java
@@ -31,11 +31,10 @@
 import android.util.Log;
 import android.view.Display;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.mediarouter.R;
 
-import org.jspecify.annotations.NonNull;
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
@@ -206,7 +205,7 @@
         }
 
         @Override
-        public void onRouteAdded(android.media.MediaRouter.@NonNull RouteInfo route) {
+        public void onRouteAdded(@NonNull android.media.MediaRouter.RouteInfo route) {
             if (addSystemRouteNoPublish(route)) {
                 publishRoutes();
             }
@@ -262,7 +261,7 @@
         }
 
         @Override
-        public void onRouteRemoved(android.media.MediaRouter.@NonNull RouteInfo route) {
+        public void onRouteRemoved(@NonNull android.media.MediaRouter.RouteInfo route) {
             if (getUserRouteRecord(route) == null) {
                 int index = findSystemRouteRecord(route);
                 if (index >= 0) {
@@ -273,7 +272,7 @@
         }
 
         @Override
-        public void onRouteChanged(android.media.MediaRouter.@NonNull RouteInfo route) {
+        public void onRouteChanged(@NonNull android.media.MediaRouter.RouteInfo route) {
             if (getUserRouteRecord(route) == null) {
                 int index = findSystemRouteRecord(route);
                 if (index >= 0) {
@@ -285,7 +284,7 @@
         }
 
         @Override
-        public void onRouteVolumeChanged(android.media.MediaRouter.@NonNull RouteInfo route) {
+        public void onRouteVolumeChanged(@NonNull android.media.MediaRouter.RouteInfo route) {
             if (getUserRouteRecord(route) == null) {
                 int index = findSystemRouteRecord(route);
                 if (index >= 0) {
@@ -304,7 +303,7 @@
 
         @Override
         public void onRouteSelected(int type,
-                android.media.MediaRouter.@NonNull RouteInfo route) {
+                @NonNull android.media.MediaRouter.RouteInfo route) {
             if (route != mRouter.getSelectedRoute(ALL_ROUTE_TYPES)) {
                 // The currently selected route has already changed so this callback
                 // is stale.  Drop it to prevent getting into sync loops.
@@ -327,25 +326,25 @@
 
         @Override
         public void onRouteUnselected(int type,
-                android.media.MediaRouter.@NonNull RouteInfo route) {
+                @NonNull android.media.MediaRouter.RouteInfo route) {
             // Nothing to do when a route is unselected.
             // We only need to handle when a route is selected.
         }
 
         @Override
-        public void onRouteGrouped(android.media.MediaRouter.@NonNull RouteInfo route,
-                android.media.MediaRouter.@NonNull RouteGroup group, int index) {
+        public void onRouteGrouped(@NonNull android.media.MediaRouter.RouteInfo route,
+                @NonNull android.media.MediaRouter.RouteGroup group, int index) {
             // Route grouping is deprecated and no longer supported.
         }
 
         @Override
-        public void onRouteUngrouped(android.media.MediaRouter.@NonNull RouteInfo route,
-                android.media.MediaRouter.@NonNull RouteGroup group) {
+        public void onRouteUngrouped(@NonNull android.media.MediaRouter.RouteInfo route,
+                @NonNull android.media.MediaRouter.RouteGroup group) {
             // Route grouping is deprecated and no longer supported.
         }
 
         @Override
-        public void onVolumeSetRequest(android.media.MediaRouter.@NonNull RouteInfo route,
+        public void onVolumeSetRequest(@NonNull android.media.MediaRouter.RouteInfo route,
                 int volume) {
             UserRouteRecord record = getUserRouteRecord(route);
             if (record != null) {
@@ -354,7 +353,7 @@
         }
 
         @Override
-        public void onVolumeUpdateRequest(android.media.MediaRouter.@NonNull RouteInfo route,
+        public void onVolumeUpdateRequest(@NonNull android.media.MediaRouter.RouteInfo route,
                 int direction) {
             UserRouteRecord record = getUserRouteRecord(route);
             if (record != null) {
@@ -571,7 +570,7 @@
 
         @Override
         public void onRoutePresentationDisplayChanged(
-                android.media.MediaRouter.@NonNull RouteInfo route) {
+                @NonNull android.media.MediaRouter.RouteInfo route) {
             int index = findSystemRouteRecord(route);
             if (index >= 0) {
                 SystemRouteRecord record = mSystemRouteRecords.get(index);
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RegisteredMediaRouteProvider.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RegisteredMediaRouteProvider.java
index a29f4c1..5074a7e 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RegisteredMediaRouteProvider.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RegisteredMediaRouteProvider.java
@@ -71,12 +71,11 @@
 import android.util.Log;
 import android.util.SparseArray;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor;
 import androidx.mediarouter.media.MediaRouter.ControlRequestCallback;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.List;
@@ -181,8 +180,9 @@
         disconnect();
     }
 
+    @NonNull
     @Override
-    public @NonNull String toString() {
+    public String toString() {
         return "Service connection " + mComponentName.flattenToShortString();
     }
 
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RegisteredMediaRouteProviderWatcher.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RegisteredMediaRouteProviderWatcher.java
index 78be4fc..82c5ca3 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RegisteredMediaRouteProviderWatcher.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RegisteredMediaRouteProviderWatcher.java
@@ -29,11 +29,10 @@
 import android.os.Handler;
 import android.text.TextUtils;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.VisibleForTesting;
 
-import org.jspecify.annotations.NonNull;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -180,7 +179,8 @@
     }
 
     @RequiresApi(Build.VERSION_CODES.R)
-    @NonNull List<ServiceInfo> getMediaRoute2ProviderServices() {
+    @NonNull
+    List<ServiceInfo> getMediaRoute2ProviderServices() {
         Intent intent = new Intent(MediaRoute2ProviderService.SERVICE_INTERFACE);
 
         List<ServiceInfo> serviceInfoList = new ArrayList<>();
@@ -227,6 +227,6 @@
         void removeProvider(@NonNull MediaRouteProvider provider);
 
         void releaseProviderController(@NonNull RegisteredMediaRouteProvider provider,
-                MediaRouteProvider.@NonNull RouteController controller);
+                @NonNull MediaRouteProvider.RouteController controller);
     }
 }
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RemoteControlClientCompat.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RemoteControlClientCompat.java
index 33ec00b..290c9cb 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RemoteControlClientCompat.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RemoteControlClientCompat.java
@@ -19,8 +19,8 @@
 import android.content.Context;
 import android.media.AudioManager;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import java.lang.ref.WeakReference;
 
@@ -76,7 +76,8 @@
         public int volumeHandling = MediaRouter.RouteInfo.PLAYBACK_VOLUME_FIXED;
         public int playbackStream = AudioManager.STREAM_MUSIC;
         public int playbackType = MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE;
-        public @Nullable String volumeControlId;
+        @Nullable
+        public String volumeControlId;
     }
 
     /**
@@ -157,7 +158,7 @@
             }
 
             @Override
-            public void onVolumeUpdateRequest(android.media.MediaRouter.@NonNull RouteInfo route,
+            public void onVolumeUpdateRequest(@NonNull android.media.MediaRouter.RouteInfo route,
                     int direction) {
                 JellybeanImpl impl = mImplWeak.get();
                 if (impl != null && impl.mVolumeCallback != null) {
@@ -166,7 +167,7 @@
             }
 
             @Override
-            public void onVolumeSetRequest(android.media.MediaRouter.@NonNull RouteInfo route,
+            public void onVolumeSetRequest(@NonNull android.media.MediaRouter.RouteInfo route,
                     int volume) {
                 JellybeanImpl impl = mImplWeak.get();
                 if (impl != null && impl.mVolumeCallback != null) {
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RemotePlaybackClient.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RemotePlaybackClient.java
index 744679f..937a1de 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RemotePlaybackClient.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RemotePlaybackClient.java
@@ -25,12 +25,11 @@
 import android.os.Bundle;
 import android.util.Log;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.core.util.ObjectsCompat;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 /**
  * A helper class for playing media on remote routes using the remote playback protocol
  * defined by {@link MediaControlIntent}.
@@ -65,7 +64,7 @@
      * @param context The {@link Context}.
      * @param route The media route.
      */
-    public RemotePlaybackClient(@NonNull Context context, MediaRouter.@NonNull RouteInfo route) {
+    public RemotePlaybackClient(@NonNull Context context, @NonNull MediaRouter.RouteInfo route) {
         if (context == null) {
             throw new IllegalArgumentException("context must not be null");
         }
@@ -201,7 +200,8 @@
      *
      * @return The current session id, or null if none.
      */
-    public @Nullable String getSessionId() {
+    @Nullable
+    public String getSessionId() {
         return mSessionId;
     }
 
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RouteListingPreference.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RouteListingPreference.java
index d5ac610..a6827e4 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RouteListingPreference.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RouteListingPreference.java
@@ -21,13 +21,12 @@
 import android.text.TextUtils;
 
 import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.core.util.Preconditions;
 
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
@@ -72,9 +71,9 @@
     @SuppressLint("ActionValue") // Field & value copied from android.media.RouteListingPreference.
     public static final String EXTRA_ROUTE_ID = android.media.RouteListingPreference.EXTRA_ROUTE_ID;
 
-    private final @NonNull List<RouteListingPreference.Item> mItems;
+    @NonNull private final List<RouteListingPreference.Item> mItems;
     private final boolean mIsSystemOrderingEnabled;
-    private final @Nullable ComponentName mLinkedItemComponentName;
+    @Nullable private final ComponentName mLinkedItemComponentName;
 
     // Must be package private to avoid a synthetic accessor for the builder.
     /* package */ RouteListingPreference(RouteListingPreference.Builder builder) {
@@ -87,7 +86,8 @@
      * Returns an unmodifiable list containing the {@link RouteListingPreference.Item items} that
      * the app wants to be listed for media routing.
      */
-    public @NonNull List<RouteListingPreference.Item> getItems() {
+    @NonNull
+    public List<RouteListingPreference.Item> getItems() {
         return mItems;
     }
 
@@ -116,7 +116,8 @@
      * returned {@link ComponentName}, using action {@link #ACTION_TRANSFER_MEDIA}, with the extra
      * {@link #EXTRA_ROUTE_ID}.
      */
-    public @Nullable ComponentName getLinkedItemComponentName() {
+    @Nullable
+    public ComponentName getLinkedItemComponentName() {
         return mLinkedItemComponentName;
     }
 
@@ -144,8 +145,8 @@
     // Internal methods.
 
     @RequiresApi(api = 34)
-/* package */
-    android.media.@NonNull RouteListingPreference toPlatformRouteListingPreference() {
+    @NonNull /* package */
+    android.media.RouteListingPreference toPlatformRouteListingPreference() {
         return Api34Impl.toPlatformRouteListingPreference(this);
     }
 
@@ -170,7 +171,8 @@
          *
          * <p>The default value is an empty list.
          */
-        public RouteListingPreference.@NonNull Builder setItems(
+        @NonNull
+        public RouteListingPreference.Builder setItems(
                 @NonNull List<RouteListingPreference.Item> items) {
             mItems = Collections.unmodifiableList(new ArrayList<>(Objects.requireNonNull(items)));
             return this;
@@ -181,7 +183,8 @@
          *
          * <p>The default value is {@code true}.
          */
-        public RouteListingPreference.@NonNull Builder setSystemOrderingEnabled(
+        @NonNull
+        public RouteListingPreference.Builder setSystemOrderingEnabled(
                 boolean systemOrderingEnabled) {
             mIsSystemOrderingEnabled = systemOrderingEnabled;
             return this;
@@ -192,7 +195,8 @@
          *
          * <p>The default value is {@code null}.
          */
-        public RouteListingPreference.@NonNull Builder setLinkedItemComponentName(
+        @NonNull
+        public RouteListingPreference.Builder setLinkedItemComponentName(
                 @Nullable ComponentName linkedItemComponentName) {
             mLinkedItemComponentName = linkedItemComponentName;
             return this;
@@ -202,7 +206,8 @@
          * Creates and returns a new {@link RouteListingPreference} instance with the given
          * parameters.
          */
-        public @NonNull RouteListingPreference build() {
+        @NonNull
+        public RouteListingPreference build() {
             return new RouteListingPreference(this);
         }
     }
@@ -345,15 +350,15 @@
         public static final int SUBTEXT_CUSTOM =
                 android.media.RouteListingPreference.Item.SUBTEXT_CUSTOM;
 
-        private final @NonNull String mRouteId;
+        @NonNull private final String mRouteId;
         @SelectionBehavior private final int mSelectionBehavior;
         @Flags private final int mFlags;
         @SubText private final int mSubText;
 
-        private final @Nullable CharSequence mCustomSubtextMessage;
+        @Nullable private final CharSequence mCustomSubtextMessage;
 
         // Must be package private to avoid a synthetic accessor for the builder.
-        /* package */ Item(RouteListingPreference.Item.@NonNull Builder builder) {
+        /* package */ Item(@NonNull RouteListingPreference.Item.Builder builder) {
             mRouteId = builder.mRouteId;
             mSelectionBehavior = builder.mSelectionBehavior;
             mFlags = builder.mFlags;
@@ -367,7 +372,8 @@
          *
          * @see MediaRouter.RouteInfo#getId()
          */
-        public @NonNull String getRouteId() {
+        @NonNull
+        public String getRouteId() {
             return mRouteId;
         }
 
@@ -432,7 +438,8 @@
          * subtexts listed in {@link #getSubText()} in order to guarantee correct visual
          * representation and localization on all form factors.
          */
-        public @Nullable CharSequence getCustomSubtextMessage() {
+        @Nullable
+        public CharSequence getCustomSubtextMessage() {
             return mCustomSubtextMessage;
         }
 
@@ -497,8 +504,8 @@
              *
              * <p>The default value is {@link #ACTION_TRANSFER_MEDIA}.
              */
-            public RouteListingPreference.Item.@NonNull Builder setSelectionBehavior(
-                    int selectionBehavior) {
+            @NonNull
+            public RouteListingPreference.Item.Builder setSelectionBehavior(int selectionBehavior) {
                 mSelectionBehavior = selectionBehavior;
                 return this;
             }
@@ -508,7 +515,8 @@
              *
              * <p>The default value is zero (no flags).
              */
-            public RouteListingPreference.Item.@NonNull Builder setFlags(int flags) {
+            @NonNull
+            public RouteListingPreference.Item.Builder setFlags(int flags) {
                 mFlags = flags;
                 return this;
             }
@@ -518,7 +526,8 @@
              *
              * <p>The default value is {@link #SUBTEXT_NONE}.
              */
-            public RouteListingPreference.Item.@NonNull Builder setSubText(int subText) {
+            @NonNull
+            public RouteListingPreference.Item.Builder setSubText(int subText) {
                 mSubText = subText;
                 return this;
             }
@@ -528,7 +537,8 @@
              *
              * <p>The default value is {@code null}.
              */
-            public RouteListingPreference.Item.@NonNull Builder setCustomSubtextMessage(
+            @NonNull
+            public RouteListingPreference.Item.Builder setCustomSubtextMessage(
                     @Nullable CharSequence customSubtextMessage) {
                 mCustomSubtextMessage = customSubtextMessage;
                 return this;
@@ -538,7 +548,8 @@
              * Creates and returns a new {@link RouteListingPreference.Item} with the given
              * parameters.
              */
-            public RouteListingPreference.@NonNull Item build() {
+            @NonNull
+            public RouteListingPreference.Item build() {
                 return new RouteListingPreference.Item(this);
             }
         }
@@ -550,8 +561,8 @@
             // This class is not instantiable.
         }
 
-        public static android.media.@NonNull RouteListingPreference
-                toPlatformRouteListingPreference(
+        @NonNull
+        public static android.media.RouteListingPreference toPlatformRouteListingPreference(
                 RouteListingPreference routeListingPreference) {
             ArrayList<android.media.RouteListingPreference.Item> platformRlpItems =
                     new ArrayList<>();
@@ -566,7 +577,8 @@
                     .build();
         }
 
-        public static android.media.RouteListingPreference.@NonNull Item toPlatformItem(Item item) {
+        @NonNull
+        public static android.media.RouteListingPreference.Item toPlatformItem(Item item) {
             return new android.media.RouteListingPreference.Item.Builder(item.getRouteId())
                     .setFlags(item.getFlags())
                     .setSubText(item.getSubText())
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/SystemRoutingUsingMediaRouter2Receiver.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/SystemRoutingUsingMediaRouter2Receiver.java
index 892c5ea..ecc6df6 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/SystemRoutingUsingMediaRouter2Receiver.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/SystemRoutingUsingMediaRouter2Receiver.java
@@ -24,10 +24,9 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
-import org.jspecify.annotations.NonNull;
-
 import java.util.List;
 
 /**
diff --git a/mediarouter/mediarouter/src/main/res/values-ja/strings.xml b/mediarouter/mediarouter/src/main/res/values-ja/strings.xml
index d1589d9..75786f1 100644
--- a/mediarouter/mediarouter/src/main/res/values-ja/strings.xml
+++ b/mediarouter/mediarouter/src/main/res/values-ja/strings.xml
@@ -43,7 +43,7 @@
     <string name="mr_dialog_transferable_header" msgid="6068257520605505468">"グループで再生"</string>
     <string name="mr_cast_dialog_title_view_placeholder" msgid="2175930138959078155">"情報がありません"</string>
     <string name="mr_chooser_zero_routes_found_title" msgid="5213435473397442608">"利用可能なデバイスがありません"</string>
-    <string name="mr_chooser_wifi_warning_description_phone" msgid="2555886884770958244">"他のデバイスがこのスマートフォンと同じ Wi-Fi ネットワークに接続していることを確認してください"</string>
+    <string name="mr_chooser_wifi_warning_description_phone" msgid="2555886884770958244">"もう一方のデバイスがこのスマートフォンと同じ Wi-Fi ネットワークに接続していることを確認してください"</string>
     <string name="mr_chooser_wifi_warning_description_tablet" msgid="6038748488793588164">"他のデバイスがこのタブレットと同じ Wi-Fi ネットワークに接続していることを確認してください"</string>
     <string name="mr_chooser_wifi_warning_description_tv" msgid="5845921667085074878">"他のデバイスがこのテレビと同じ Wi-Fi ネットワークに接続していることを確認してください"</string>
     <string name="mr_chooser_wifi_warning_description_watch" msgid="5255021372884233706">"もう一方のデバイスがこのスマートウォッチと同じ Wi-Fi ネットワークに接続していることを確認してください"</string>
diff --git a/mediarouter/mediarouter/src/main/res/values-pl/strings.xml b/mediarouter/mediarouter/src/main/res/values-pl/strings.xml
index ced7b9e..4db44b8 100644
--- a/mediarouter/mediarouter/src/main/res/values-pl/strings.xml
+++ b/mediarouter/mediarouter/src/main/res/values-pl/strings.xml
@@ -43,7 +43,7 @@
     <string name="mr_dialog_transferable_header" msgid="6068257520605505468">"Odtwórz w grupie"</string>
     <string name="mr_cast_dialog_title_view_placeholder" msgid="2175930138959078155">"Brak informacji"</string>
     <string name="mr_chooser_zero_routes_found_title" msgid="5213435473397442608">"Brak dostępnych urządzeń"</string>
-    <string name="mr_chooser_wifi_warning_description_phone" msgid="2555886884770958244">"Sprawdź, czy drugie urządzenie jest połączone z tą samą siecią Wi-Fi co telefon"</string>
+    <string name="mr_chooser_wifi_warning_description_phone" msgid="2555886884770958244">"Upewnij się, że drugie urządzenie jest połączone z tą samą siecią Wi-Fi co ten telefon"</string>
     <string name="mr_chooser_wifi_warning_description_tablet" msgid="6038748488793588164">"Sprawdź, czy drugie urządzenie jest połączone z tą samą siecią Wi-Fi co tablet"</string>
     <string name="mr_chooser_wifi_warning_description_tv" msgid="5845921667085074878">"Sprawdź, czy drugie urządzenie jest połączone z tą samą siecią Wi-Fi co telewizor"</string>
     <string name="mr_chooser_wifi_warning_description_watch" msgid="5255021372884233706">"Sprawdź, czy drugie urządzenie jest połączone z tą samą siecią Wi-Fi co zegarek"</string>
diff --git a/mediarouter/mediarouter/src/test/java/androidx/mediarouter/app/SystemOutputSwitcherDialogControllerTest.java b/mediarouter/mediarouter/src/test/java/androidx/mediarouter/app/SystemOutputSwitcherDialogControllerTest.java
index 5ba5b18..66554c9 100644
--- a/mediarouter/mediarouter/src/test/java/androidx/mediarouter/app/SystemOutputSwitcherDialogControllerTest.java
+++ b/mediarouter/mediarouter/src/test/java/androidx/mediarouter/app/SystemOutputSwitcherDialogControllerTest.java
@@ -34,12 +34,12 @@
 import android.os.Build;
 import android.provider.Settings;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.test.core.app.ApplicationProvider;
 
 import com.google.common.collect.ImmutableList;
 
-import org.jspecify.annotations.NonNull;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.experimental.runners.Enclosed;
diff --git a/navigation/navigation-dynamic-features-fragment/src/main/res/values-it/strings.xml b/navigation/navigation-dynamic-features-fragment/src/main/res/values-it/strings.xml
index 62c3d78..b64b779 100644
--- a/navigation/navigation-dynamic-features-fragment/src/main/res/values-it/strings.xml
+++ b/navigation/navigation-dynamic-features-fragment/src/main/res/values-it/strings.xml
@@ -22,5 +22,5 @@
     <string name="installing_module" msgid="5968445461040787716">"Modulo di installazione:"</string>
     <string name="progress" msgid="8366783942222789124">"Avanzamento:"</string>
     <string name="retry" msgid="1065327189183624288">"Riprova"</string>
-    <string name="ok" msgid="4702104660890557116">"OK"</string>
+    <string name="ok" msgid="4702104660890557116">"Ok"</string>
 </resources>
diff --git a/pdf/integration-tests/testapp/src/main/AndroidManifest.xml b/pdf/integration-tests/testapp/src/main/AndroidManifest.xml
index 04f1cba1..f155b14 100644
--- a/pdf/integration-tests/testapp/src/main/AndroidManifest.xml
+++ b/pdf/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -27,6 +27,7 @@
         android:theme="@style/AppTheme">
         <activity
             android:name=".MainActivity"
+            android:configChanges="orientation|screenSize"
             android:exported="true">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
diff --git a/pdf/pdf-viewer/src/main/res/values-af/strings.xml b/pdf/pdf-viewer/src/main/res/values-af/strings.xml
index 9c529a2..0b88922 100644
--- a/pdf/pdf-viewer/src/main/res/values-af/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-af/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> van <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Geen passende resultate nie"</string>
     <string name="action_edit" msgid="5882082700509010966">"Wysig lêer"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Deursoek lêer"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Rolbalk"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Voer wagwoord in om te ontsluit"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Probeer weer"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Kon nie die PDF-dokument verwerk nie!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-am/strings.xml b/pdf/pdf-viewer/src/main/res/values-am/strings.xml
index c7b82bc..596cd36 100644
--- a/pdf/pdf-viewer/src/main/res/values-am/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-am/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> ከ<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"ምንም የሚመሳሰሉ ውጤቶች የሉም"</string>
     <string name="action_edit" msgid="5882082700509010966">"ፋይል አርትዕ"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"ፋይል ፈልግ"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"መሸብለያ አሞሌ"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"ለመክፈት የይለፍ ቃል ያስገቡ"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"እንደገና ሞክር"</string>
     <string name="pdf_error" msgid="3287950599604474450">"የPDF ሰነዱን ማሰናዳት አልተሳካም!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ar/strings.xml b/pdf/pdf-viewer/src/main/res/values-ar/strings.xml
index 41bf466..63c38fa 100644
--- a/pdf/pdf-viewer/src/main/res/values-ar/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ar/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"‫<xliff:g id="POSITION">%1$d</xliff:g> من إجمالي <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"ما مِن نتائج مطابقة"</string>
     <string name="action_edit" msgid="5882082700509010966">"تعديل الملف"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"البحث في الملف"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"شريط التمرير"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"يجب إدخال كلمة المرور لفتح القفل"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"إعادة المحاولة"</string>
     <string name="pdf_error" msgid="3287950599604474450">"‏تعذّرت معالجة مستند PDF."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-as/strings.xml b/pdf/pdf-viewer/src/main/res/values-as/strings.xml
index 641ff3d..12fa623 100644
--- a/pdf/pdf-viewer/src/main/res/values-as/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-as/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> খনৰ ভিতৰত <xliff:g id="POSITION">%1$d</xliff:g>তম"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"কোনো মিল থকা ফলাফল নাই"</string>
     <string name="action_edit" msgid="5882082700509010966">"ফাইল সম্পাদনা কৰক"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"ফাইল সন্ধান কৰক"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"স্ক্ৰ’ল কৰা দণ্ড"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"আনলক কৰিবলৈ পাছৱৰ্ড দিয়ক"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"পুনৰ চেষ্টা কৰক"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF নথিখন প্ৰক্ৰিয়াকৰণ কৰিব পৰা নগ’ল!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-az/strings.xml b/pdf/pdf-viewer/src/main/res/values-az/strings.xml
index 6898e3f..88851a7 100644
--- a/pdf/pdf-viewer/src/main/res/values-az/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-az/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Uyğun gələn nəticə yoxdur"</string>
     <string name="action_edit" msgid="5882082700509010966">"Faylı redaktə edin"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Fayl axtarın"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Sürüşdürmə paneli"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Kiliddən çıxarmaq üçün parol daxil edin"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Yenə cəhd edin"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF sənədi emal edilmədi!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-b+sr+Latn/strings.xml b/pdf/pdf-viewer/src/main/res/values-b+sr+Latn/strings.xml
index a2e554d..c12a6df 100644
--- a/pdf/pdf-viewer/src/main/res/values-b+sr+Latn/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-b+sr+Latn/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> od <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Nema podudarnih rezultata"</string>
     <string name="action_edit" msgid="5882082700509010966">"Izmeni fajl"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Pretraži fajl"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Traka za skrolovanje"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Unesite lozinku za otključavanje"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Probaj ponovo"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Obrada PDF dokumenta nije uspela."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-be/strings.xml b/pdf/pdf-viewer/src/main/res/values-be/strings.xml
index 67efe42..e2005e4ee 100644
--- a/pdf/pdf-viewer/src/main/res/values-be/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-be/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> з <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Супадзенняў няма"</string>
     <string name="action_edit" msgid="5882082700509010966">"Рэдагаваць файл"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Шукаць файл"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Паласа прагорткі"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Увядзіце пароль для разблакіроўкі"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Паўтарыць"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Не ўдалося апрацаваць дакумент PDF."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-bg/strings.xml b/pdf/pdf-viewer/src/main/res/values-bg/strings.xml
index 4faa5a4..a796d4ce 100644
--- a/pdf/pdf-viewer/src/main/res/values-bg/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-bg/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> от <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Няма съответстващи резултати"</string>
     <string name="action_edit" msgid="5882082700509010966">"Редактиране на файла"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Търсене на файл"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Лента за превъртане"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Въведете паролата, за да отключите"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Нов опит"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF документът не бе обработен."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-bn/strings.xml b/pdf/pdf-viewer/src/main/res/values-bn/strings.xml
index 14179f82..dba4b38 100644
--- a/pdf/pdf-viewer/src/main/res/values-bn/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-bn/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>-এর মধ্যে <xliff:g id="POSITION">%1$d</xliff:g> নম্বর"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"কোনও ফলাফল মিলছে না"</string>
     <string name="action_edit" msgid="5882082700509010966">"ফাইল এডিট করুন"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"ফাইলে খুঁজুন"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"স্ক্রলবার"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"আনলক করতে পাসওয়ার্ড লিখুন"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"আবার চেষ্টা করুন"</string>
     <string name="pdf_error" msgid="3287950599604474450">"পিডিএফ ডকুমেন্ট প্রসেস করা যায়নি!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-bs/strings.xml b/pdf/pdf-viewer/src/main/res/values-bs/strings.xml
index 6806368..b1b25bf 100644
--- a/pdf/pdf-viewer/src/main/res/values-bs/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-bs/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> od <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Nema podudarnih rezultata"</string>
     <string name="action_edit" msgid="5882082700509010966">"Uredite fajl"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Pretraživanje fajla"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Traka za pomicanje"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Unesite lozinku da otključate fajl"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Pokušajte ponovo"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Obrada PDF dokumenta nije uspjela!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ca/strings.xml b/pdf/pdf-viewer/src/main/res/values-ca/strings.xml
index efd93eb..627423f 100644
--- a/pdf/pdf-viewer/src/main/res/values-ca/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ca/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> de <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"No hi ha cap resultat coincident"</string>
     <string name="action_edit" msgid="5882082700509010966">"Edita el fitxer"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Cerca un fitxer"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Barra de desplaçament"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Introdueix la contrasenya per desbloquejar-lo"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Torna-ho a provar"</string>
     <string name="pdf_error" msgid="3287950599604474450">"No s\'ha pogut processar el document PDF."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-cs/strings.xml b/pdf/pdf-viewer/src/main/res/values-cs/strings.xml
index 2879722..876efa9 100644
--- a/pdf/pdf-viewer/src/main/res/values-cs/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-cs/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> z <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Žádné výsledky neodpovídají"</string>
     <string name="action_edit" msgid="5882082700509010966">"Upravit soubor"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Prohledat soubor"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Posuvník"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"K odemknutí zadejte heslo"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Zkusit znovu"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Dokument PDF se nepodařilo zpracovat"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-da/strings.xml b/pdf/pdf-viewer/src/main/res/values-da/strings.xml
index c518c091..ea0c1c3 100644
--- a/pdf/pdf-viewer/src/main/res/values-da/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-da/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> af <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Ingen matchende resultater"</string>
     <string name="action_edit" msgid="5882082700509010966">"Rediger fil"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Søg i fil"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Rullepanel"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Angiv adgangskode for at låse op"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Prøv igen"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF-dokumentet kunne ikke behandles"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-de/strings.xml b/pdf/pdf-viewer/src/main/res/values-de/strings.xml
index 9b67e36..03afba8 100644
--- a/pdf/pdf-viewer/src/main/res/values-de/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-de/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> von <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Keine passenden Ergebnisse"</string>
     <string name="action_edit" msgid="5882082700509010966">"Datei bearbeiten"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Datei suchen"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Bildlaufleiste"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Gib zum Entsperren ein Passwort ein"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Wiederholen"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF-Dokument konnte nicht verarbeitet werden."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-el/strings.xml b/pdf/pdf-viewer/src/main/res/values-el/strings.xml
index 1990732..16c9fcf 100644
--- a/pdf/pdf-viewer/src/main/res/values-el/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-el/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> από <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Δεν υπάρχουν αντίστοιχα αποτελέσματα"</string>
     <string name="action_edit" msgid="5882082700509010966">"Επεξεργασία αρχείου"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Αναζήτηση αρχείου"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Γραμμή κύλισης"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Εισαγάγετε τον κωδικό πρόσβασης για ξεκλείδωμα"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Επανάληψη"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Δεν ήταν δυνατή η επεξεργασία του εγγράφου PDF!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-en-rAU/strings.xml b/pdf/pdf-viewer/src/main/res/values-en-rAU/strings.xml
index de428f4..535c6f8 100644
--- a/pdf/pdf-viewer/src/main/res/values-en-rAU/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-en-rAU/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> of <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"No matching results"</string>
     <string name="action_edit" msgid="5882082700509010966">"Edit file"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Search file"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Scroll bar"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Enter password to unlock"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Retry"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Failed to process the PDF document!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-en-rGB/strings.xml b/pdf/pdf-viewer/src/main/res/values-en-rGB/strings.xml
index de428f4..535c6f8 100644
--- a/pdf/pdf-viewer/src/main/res/values-en-rGB/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-en-rGB/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> of <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"No matching results"</string>
     <string name="action_edit" msgid="5882082700509010966">"Edit file"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Search file"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Scroll bar"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Enter password to unlock"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Retry"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Failed to process the PDF document!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-en-rIN/strings.xml b/pdf/pdf-viewer/src/main/res/values-en-rIN/strings.xml
index de428f4..535c6f8 100644
--- a/pdf/pdf-viewer/src/main/res/values-en-rIN/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-en-rIN/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> of <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"No matching results"</string>
     <string name="action_edit" msgid="5882082700509010966">"Edit file"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Search file"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Scroll bar"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Enter password to unlock"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Retry"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Failed to process the PDF document!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-es/strings.xml b/pdf/pdf-viewer/src/main/res/values-es/strings.xml
index 420f7af..6d0b1ee 100644
--- a/pdf/pdf-viewer/src/main/res/values-es/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-es/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> de <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"No hay coincidencias"</string>
     <string name="action_edit" msgid="5882082700509010966">"Editar archivo"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Buscar archivo"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Barra de desplazamiento"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Introduce la contraseña para desbloquear"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Reintentar"</string>
     <string name="pdf_error" msgid="3287950599604474450">"No se ha podido procesar el documento PDF"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-et/strings.xml b/pdf/pdf-viewer/src/main/res/values-et/strings.xml
index ad36fa9..68a9e65 100644
--- a/pdf/pdf-viewer/src/main/res/values-et/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-et/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Päringule vastavaid tulemusi pole"</string>
     <string name="action_edit" msgid="5882082700509010966">"Faili muutmine"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Otsige failist"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Kerimisriba"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Avamiseks sisestage parool"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Proovi uuesti"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF-dokumendi töötlemine nurjus!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-eu/strings.xml b/pdf/pdf-viewer/src/main/res/values-eu/strings.xml
index 8224f3f..ca00340 100644
--- a/pdf/pdf-viewer/src/main/res/values-eu/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-eu/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> bat-etortzetatik <xliff:g id="POSITION">%1$d</xliff:g>.a"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Ez dago bat datorren emaitzarik"</string>
     <string name="action_edit" msgid="5882082700509010966">"Editatu fitxategia"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Bilatu fitxategian"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Korritze-barra"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Idatzi pasahitza desblokeatzeko"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Saiatu berriro"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Ezin izan da prozesatu PDF dokumentua!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-fa/strings.xml b/pdf/pdf-viewer/src/main/res/values-fa/strings.xml
index 0d718a96..6773303 100644
--- a/pdf/pdf-viewer/src/main/res/values-fa/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-fa/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"‫<xliff:g id="POSITION">%1$d</xliff:g> از <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"نتیجه منطبقی پیدا نشد"</string>
     <string name="action_edit" msgid="5882082700509010966">"ویرایش فایل"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"جستجوی فایل"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"نوار پیمایش"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"گذرواژه را برای بازگشایی قفل وارد کنید"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"امتحان مجدد"</string>
     <string name="pdf_error" msgid="3287950599604474450">"‏سند PDF پردازش نشد!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-fi/strings.xml b/pdf/pdf-viewer/src/main/res/values-fi/strings.xml
index ebbd3e5..728a103 100644
--- a/pdf/pdf-viewer/src/main/res/values-fi/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-fi/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Ei tuloksia"</string>
     <string name="action_edit" msgid="5882082700509010966">"Muokkaa tiedostoa"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Hae tiedostoa"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Vierityspalkki"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Poista lukitus lisäämällä salasana"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Yritä uudelleen"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF-dokumentin käsittely epäonnistui."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-fr-rCA/strings.xml b/pdf/pdf-viewer/src/main/res/values-fr-rCA/strings.xml
index f394aa6..a92cfb5 100644
--- a/pdf/pdf-viewer/src/main/res/values-fr-rCA/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-fr-rCA/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> de <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Aucun résultat correspondant"</string>
     <string name="action_edit" msgid="5882082700509010966">"Modifier le fichier"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Rechercher un fichier"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Barre de défilement"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Entrez le mot de passe pour déverrouiller le fichier"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Réessayer"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Échec du traitement du document PDF!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-fr/strings.xml b/pdf/pdf-viewer/src/main/res/values-fr/strings.xml
index 0b21387..c5d1e23 100644
--- a/pdf/pdf-viewer/src/main/res/values-fr/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-fr/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> sur <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Aucun résultat"</string>
     <string name="action_edit" msgid="5882082700509010966">"Modifier le fichier"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Rechercher un fichier"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Barre de défilement"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Saisissez le mot de passe pour procéder au déverrouillage"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Réessayer"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Échec du traitement du document PDF."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-gl/strings.xml b/pdf/pdf-viewer/src/main/res/values-gl/strings.xml
index 69958ec..c817be5 100644
--- a/pdf/pdf-viewer/src/main/res/values-gl/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-gl/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> de <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Non hai ningún resultado que coincida"</string>
     <string name="action_edit" msgid="5882082700509010966">"Editar o ficheiro"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Buscar un ficheiro"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Barra de desprazamento"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Introduce o contrasinal para desbloquear o ficheiro"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Tentar de novo"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Produciuse un erro ao procesar o documento PDF"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-gu/strings.xml b/pdf/pdf-viewer/src/main/res/values-gu/strings.xml
index b94915b..2d2982b 100644
--- a/pdf/pdf-viewer/src/main/res/values-gu/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-gu/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>માંથી <xliff:g id="POSITION">%1$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"કોઈ મેળ ખાતું પરિણામ નથી"</string>
     <string name="action_edit" msgid="5882082700509010966">"ફાઇલમાં ફેરફાર કરો"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"ફાઇલ શોધો"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"સ્ક્રોલ બાર"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"અનલૉક કરવા માટે પાસવર્ડ દાખલ કરો"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"ફરી પ્રયાસ કરો"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF દસ્તાવેજ પર પ્રક્રિયા કરવામાં નિષ્ફળ રહ્યાં!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-hi/strings.xml b/pdf/pdf-viewer/src/main/res/values-hi/strings.xml
index eabf6fe..a3d7265 100644
--- a/pdf/pdf-viewer/src/main/res/values-hi/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-hi/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> में से <xliff:g id="POSITION">%1$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"कोई मिलता-जुलता नतीजा नहीं मिला"</string>
     <string name="action_edit" msgid="5882082700509010966">"फ़ाइल में बदलाव करें"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"फ़ाइल खोजें"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"स्क्रोलबार"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"अनलॉक करने के लिए पासवर्ड डालें"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"फिर कोशिश करें"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF दस्तावेज़ को प्रोसेस नहीं किया जा सका!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-hr/strings.xml b/pdf/pdf-viewer/src/main/res/values-hr/strings.xml
index 390d30b..b76882b 100644
--- a/pdf/pdf-viewer/src/main/res/values-hr/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-hr/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> od <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Nema podudarnih rezultata"</string>
     <string name="action_edit" msgid="5882082700509010966">"Uređivanje datoteke"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Pretraži datoteku"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Klizač"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Unesite zaporku za otključavanje"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Pokušaj ponovo"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Obrada PDF dokumenta nije uspjela!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-hu/strings.xml b/pdf/pdf-viewer/src/main/res/values-hu/strings.xml
index a6808f9..0bc634e 100644
--- a/pdf/pdf-viewer/src/main/res/values-hu/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-hu/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>/<xliff:g id="POSITION">%1$d</xliff:g>."</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Nincs találat"</string>
     <string name="action_edit" msgid="5882082700509010966">"Fájl szerkesztése"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Fájl keresése"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Görgetősáv"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"A feloldáshoz írja be a jelszót"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Újra"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Nem sikerült feldolgozni a PDF-dokumentumot!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-hy/strings.xml b/pdf/pdf-viewer/src/main/res/values-hy/strings.xml
index 74d5da8..46c6900 100644
--- a/pdf/pdf-viewer/src/main/res/values-hy/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-hy/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>՝ <xliff:g id="TOTAL">%2$d</xliff:g>-ից"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Համապատասխանող արդյունքներ չկան"</string>
     <string name="action_edit" msgid="5882082700509010966">"Փոփոխել ֆայլը"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Որոնել ֆայլ"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Ոլորագոտի"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Մուտքագրեք գաղտնաբառը՝ ապակողպելու համար"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Նորից փորձել"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Չհաջողվեց մշակել PDF փաստաթուղթը"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-in/strings.xml b/pdf/pdf-viewer/src/main/res/values-in/strings.xml
index 3ac1e7e..416db41 100644
--- a/pdf/pdf-viewer/src/main/res/values-in/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-in/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> dari <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Tidak ada hasil yang cocok"</string>
     <string name="action_edit" msgid="5882082700509010966">"Edit file"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Telusuri file"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Scroll bar"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Masukkan sandi untuk membuka kunci"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Coba lagi"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Gagal memproses dokumen PDF"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-is/strings.xml b/pdf/pdf-viewer/src/main/res/values-is/strings.xml
index ec413bc..c2ec3ad 100644
--- a/pdf/pdf-viewer/src/main/res/values-is/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-is/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> af <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Engar samsvarandi niðurstöður fundust"</string>
     <string name="action_edit" msgid="5882082700509010966">"Breyta skrá"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Leita í skrá"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Flettistika"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Sláðu inn aðgangsorð til að opna"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Reyna aftur"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Ekki tókst að vinna úr PDF-skjalinu!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-it/strings.xml b/pdf/pdf-viewer/src/main/res/values-it/strings.xml
index a8ecaae..4e15da5 100644
--- a/pdf/pdf-viewer/src/main/res/values-it/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-it/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> di <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Nessun risultato corrispondente"</string>
     <string name="action_edit" msgid="5882082700509010966">"Modifica file"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Cerca file"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Barra di scorrimento"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Inserisci la password per sbloccare il file"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Riprova"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Impossibile elaborare il documento PDF"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-iw/strings.xml b/pdf/pdf-viewer/src/main/res/values-iw/strings.xml
index 8b52a43c..4fb87c6 100644
--- a/pdf/pdf-viewer/src/main/res/values-iw/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-iw/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"‫<xliff:g id="POSITION">%1$d</xliff:g> מתוך <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"לא נמצאו תוצאות תואמות"</string>
     <string name="action_edit" msgid="5882082700509010966">"עריכת הקובץ"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"חיפוש קובץ"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"סרגל הגלילה"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"צריך להזין סיסמה לביטול הנעילה"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"ניסיון חוזר"</string>
     <string name="pdf_error" msgid="3287950599604474450">"‏לא ניתן לעבד את מסמך ה-PDF"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ja/strings.xml b/pdf/pdf-viewer/src/main/res/values-ja/strings.xml
index 0ffb53c..f425a9b 100644
--- a/pdf/pdf-viewer/src/main/res/values-ja/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ja/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"一致する結果がありません"</string>
     <string name="action_edit" msgid="5882082700509010966">"ファイルを編集"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"ファイルを検索"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"スクロールバー"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"ロックを解除するには、パスワードを入力してください"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"再試行"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF ドキュメントを処理できませんでした"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ka/strings.xml b/pdf/pdf-viewer/src/main/res/values-ka/strings.xml
index 2e61dea..66633eb 100644
--- a/pdf/pdf-viewer/src/main/res/values-ka/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ka/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>-დან <xliff:g id="POSITION">%1$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"შედეგებში არ არის დამთხვევა"</string>
     <string name="action_edit" msgid="5882082700509010966">"ფაილის რედაქტირება"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"ფაილის ძიება"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"გადაადგილების ზოლი"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"პაროლის შეყვანა განბლოკვისთვის"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"ხელახლა ცდა"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF დოკუმენტის დამუშავება ვერ მოხერხდა!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-kk/strings.xml b/pdf/pdf-viewer/src/main/res/values-kk/strings.xml
index 4fec50e..2806893 100644
--- a/pdf/pdf-viewer/src/main/res/values-kk/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-kk/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Сәйкес нәтижелер табылмады."</string>
     <string name="action_edit" msgid="5882082700509010966">"Файлды өңдеу"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Файлды іздеу"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Жылжыту жолағы"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Құлыпты ашу үшін құпия сөзді енгізіңіз."</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Қайталау"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF құжаты өңделмеді."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-km/strings.xml b/pdf/pdf-viewer/src/main/res/values-km/strings.xml
index 2a3fbf4..738de11 100644
--- a/pdf/pdf-viewer/src/main/res/values-km/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-km/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> នៃ <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"គ្មានលទ្ធផល​ត្រូវគ្នាទេ"</string>
     <string name="action_edit" msgid="5882082700509010966">"កែ​ឯកសារ"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"ស្វែងរកឯកសារ"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"របារ​រមូរ"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"បញ្ចូល​ពាក្យ​សម្ងាត់ ដើម្បី​ដោះ​សោ"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"ព្យាយាមម្ដងទៀត"</string>
     <string name="pdf_error" msgid="3287950599604474450">"មិនអាច​ដំណើរការ​ឯកសារ PDF បានទេ!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-kn/strings.xml b/pdf/pdf-viewer/src/main/res/values-kn/strings.xml
index 3ec09eb..d10e9b3e 100644
--- a/pdf/pdf-viewer/src/main/res/values-kn/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-kn/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> ರಲ್ಲಿ <xliff:g id="POSITION">%1$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"ಯಾವುದೇ ಹೊಂದಾಣಿಕೆಯ ಫಲಿತಾಂಶಗಳಿಲ್ಲ"</string>
     <string name="action_edit" msgid="5882082700509010966">"ಫೈಲ್ ಎಡಿಟ್‌ ಮಾಡಿ"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"ಫೈಲ್ ಅನ್ನು ಹುಡುಕಿ"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"ಸ್ಕ್ರಾಲ್‌ಬಾರ್"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"ಅನ್‌ಲಾಕ್‌ ಮಾಡಲು ಪಾಸವರ್ಡ್‌ ಅನ್ನು ನಮೂದಿಸಿ"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"ಪುನಃ ಪ್ರಯತ್ನಿಸಿ"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF ಡಾಕ್ಯುಮೆಂಟ್ ಅನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ವಿಫಲವಾಗಿದೆ!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ko/strings.xml b/pdf/pdf-viewer/src/main/res/values-ko/strings.xml
index a5d7657..2e8e44b 100644
--- a/pdf/pdf-viewer/src/main/res/values-ko/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ko/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"일치하는 결과 없음"</string>
     <string name="action_edit" msgid="5882082700509010966">"파일 수정"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"파일 검색"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"스크롤바"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"잠금 해제하려면 비밀번호 입력"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"재시도"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF 문서를 처리할 수 없습니다."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ky/strings.xml b/pdf/pdf-viewer/src/main/res/values-ky/strings.xml
index 27b2b2e..fe3fcfd 100644
--- a/pdf/pdf-viewer/src/main/res/values-ky/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ky/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> ичинен <xliff:g id="POSITION">%1$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Эч нерсе табылган жок"</string>
     <string name="action_edit" msgid="5882082700509010966">"Файлды түзөтүү"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Файл издөө"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Сыдыруу тилкеси"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Кулпусун ачуу үчүн сырсөздү териңиз"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Кайталоо"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF документи иштетилген жок."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-lo/strings.xml b/pdf/pdf-viewer/src/main/res/values-lo/strings.xml
index 8e87d25..3a3bee3 100644
--- a/pdf/pdf-viewer/src/main/res/values-lo/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-lo/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> ຈາກທັງໝົດ <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"ບໍ່ມີຜົນໄດ້ຮັບທີ່ກົງກັນ"</string>
     <string name="action_edit" msgid="5882082700509010966">"ແກ້ໄຂໄຟລ໌"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"ຊອກຫາໄຟລ໌"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"ແຖບເລື່ອນ"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"ໃສ່ລະຫັດເພື່ອປົດລັອກ"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"ລອງໃໝ່"</string>
     <string name="pdf_error" msgid="3287950599604474450">"ປະມວນຜົນເອກະສານ PDF ບໍ່ສຳເລັດ!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-lt/strings.xml b/pdf/pdf-viewer/src/main/res/values-lt/strings.xml
index bef118f..b8d14c1 100644
--- a/pdf/pdf-viewer/src/main/res/values-lt/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-lt/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> iš <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Atitikusių rezultatų nerasta"</string>
     <string name="action_edit" msgid="5882082700509010966">"Redaguoti failą"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Ieškoti failo"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Slinkties juosta"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Įveskite slaptažodį, kad atrakintumėte"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Bandyti dar kartą"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Nepavyko apdoroti PDF dokumento!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-lv/strings.xml b/pdf/pdf-viewer/src/main/res/values-lv/strings.xml
index a505bb5..78627b9 100644
--- a/pdf/pdf-viewer/src/main/res/values-lv/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-lv/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"numur <xliff:g id="POSITION">%1$d</xliff:g>, kopējais skaits ir <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Nav atbilstošu rezultātu."</string>
     <string name="action_edit" msgid="5882082700509010966">"Rediģēt failu"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Meklēt failu"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Ritjosla"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Lai atbloķētu, ievadiet paroli."</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Mēģināt vēlreiz"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Neizdevās apstrādāt PDF dokumentu."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-mk/strings.xml b/pdf/pdf-viewer/src/main/res/values-mk/strings.xml
index 8beedf2..4dff3bb 100644
--- a/pdf/pdf-viewer/src/main/res/values-mk/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-mk/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> од <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Нема резултати што се совпаѓаат"</string>
     <string name="action_edit" msgid="5882082700509010966">"Изменете ја датотеката"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Пребарувај датотеки"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Лента за лизгање"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Внесете лозинка за да отклучите"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Обидете се пoвторно"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Не можеше да се обработи PDF-документот!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ml/strings.xml b/pdf/pdf-viewer/src/main/res/values-ml/strings.xml
index e7cedf6..b2236c3 100644
--- a/pdf/pdf-viewer/src/main/res/values-ml/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ml/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>-ൽ <xliff:g id="POSITION">%1$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"പൊരുത്തപ്പെടുന്ന ഫലങ്ങളൊന്നുമില്ല"</string>
     <string name="action_edit" msgid="5882082700509010966">"ഫയൽ എഡിറ്റ് ചെയ്യുക"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"ഫയൽ തിരയുക"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"സ്‌ക്രോൾബാർ"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"അൺലോക്ക് ചെയ്യാൻ പാസ്‌വേഡ് നൽകുക"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"വീണ്ടും ശ്രമിക്കുക"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF ഡോക്യുമെന്റ് പ്രോസസ് ചെയ്യാനായില്ല!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-mn/strings.xml b/pdf/pdf-viewer/src/main/res/values-mn/strings.xml
index efdc55b..384ea73 100644
--- a/pdf/pdf-viewer/src/main/res/values-mn/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-mn/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>-н <xliff:g id="POSITION">%1$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Ямар ч тохирох илэрц байхгүй"</string>
     <string name="action_edit" msgid="5882082700509010966">"Файлыг засах"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Файлаас хайх"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Гүйлгэгч"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Түгжээг тайлахын тулд нууц үг оруулна уу"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Дахин оролдох"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF баримт бичгийг боловсруулж чадсангүй!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-mr/strings.xml b/pdf/pdf-viewer/src/main/res/values-mr/strings.xml
index 80fd8db..27e5a18 100644
--- a/pdf/pdf-viewer/src/main/res/values-mr/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-mr/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> पैकी <xliff:g id="POSITION">%1$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"कोणतेही जुळणारे परिणाम नाहीत"</string>
     <string name="action_edit" msgid="5882082700509010966">"फाइल संपादित करा"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"फाइल शोधा"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"स्क्रोलबार"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"अनलॉक करण्यासाठी पासवर्ड एंटर करा"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"पुन्हा प्रयत्न करा"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF दस्तऐवजावर प्रक्रिया करता आली नाही!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ms/strings.xml b/pdf/pdf-viewer/src/main/res/values-ms/strings.xml
index 9b02c62..4b9c099 100644
--- a/pdf/pdf-viewer/src/main/res/values-ms/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ms/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> daripada <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Tiada hasil carian yang sepadan"</string>
     <string name="action_edit" msgid="5882082700509010966">"Edit fail"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Cari fail"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Bar tatal"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Masukkan kata laluan untuk membuka kunci"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Cuba lagi"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Gagal memproses dokumen PDF!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-my/strings.xml b/pdf/pdf-viewer/src/main/res/values-my/strings.xml
index 19f625c..e0f6586 100644
--- a/pdf/pdf-viewer/src/main/res/values-my/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-my/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> အနက် <xliff:g id="POSITION">%1$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"ကိုက်ညီသောရလဒ် မရှိပါ"</string>
     <string name="action_edit" msgid="5882082700509010966">"ဖိုင် တည်းဖြတ်ရန်"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"ဖိုင်ရှာရန်"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"လှိမ့်ဘား"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"ဖွင့်ရန် စကားဝှက်ထည့်ပါ"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"ထပ်စမ်းရန်"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF မှတ်တမ်း လုပ်ဆောင်၍မရလိုက်ပါ။"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-nb/strings.xml b/pdf/pdf-viewer/src/main/res/values-nb/strings.xml
index 2bac600..fe27e60 100644
--- a/pdf/pdf-viewer/src/main/res/values-nb/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-nb/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> av <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Ingen treff"</string>
     <string name="action_edit" msgid="5882082700509010966">"Endre filen"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Søk i filen"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Rullefelt"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Skriv inn passordet for å låse opp"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Prøv på nytt"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Kunne ikke behandle PDF-dokumentet"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ne/strings.xml b/pdf/pdf-viewer/src/main/res/values-ne/strings.xml
index 997e9a1..1ee8978 100644
--- a/pdf/pdf-viewer/src/main/res/values-ne/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ne/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> मध्ये <xliff:g id="POSITION">%1$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"कुनै पनि मिल्दोजुल्दो परिणाम भेटिएन"</string>
     <string name="action_edit" msgid="5882082700509010966">"फाइल सम्पादन गर्नुहोस्"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"फाइल खोज्नुहोस्"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"स्क्रोल बार"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"अनलक गर्न पासवर्ड हाल्नुहोस्"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"फेरि प्रयास गर्नुहोस्"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF डकुमेन्ट प्रोसेस गर्न सकिएन!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-nl/strings.xml b/pdf/pdf-viewer/src/main/res/values-nl/strings.xml
index 841f887..454b2df 100644
--- a/pdf/pdf-viewer/src/main/res/values-nl/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-nl/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> van <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Geen overeenkomende resultaten"</string>
     <string name="action_edit" msgid="5882082700509010966">"Bestand bewerken"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Bestand doorzoeken"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Scrollbar"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Voer het wachtwoord in om te ontgrendelen"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Opnieuw proberen"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Kan het pdf-document niet verwerken"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-or/strings.xml b/pdf/pdf-viewer/src/main/res/values-or/strings.xml
index 09c03ee..e88085f 100644
--- a/pdf/pdf-viewer/src/main/res/values-or/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-or/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>ର <xliff:g id="POSITION">%1$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"ମେଳ ହେଉଥିବା କୌଣସି ଫଳାଫଳ ନାହିଁ"</string>
     <string name="action_edit" msgid="5882082700509010966">"ଫାଇଲକୁ ଏଡିଟ କରନ୍ତୁ"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"ଫାଇଲ ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"ସ୍କ୍ରୋଲବାର"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"ଅନଲକ କରିବା ପାଇଁ ପାସୱାର୍ଡ ଲେଖନ୍ତୁ"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF ଡକ୍ୟୁମେଣ୍ଟକୁ ପ୍ରକ୍ୱିୟାନ୍ୱିତ କରିବାରେ ବିଫଳ ହୋଇଛି!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-pa/strings.xml b/pdf/pdf-viewer/src/main/res/values-pa/strings.xml
index 71b4098..6c4be6e 100644
--- a/pdf/pdf-viewer/src/main/res/values-pa/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-pa/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> ਵਿੱਚੋਂ <xliff:g id="POSITION">%1$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"ਕੋਈ ਮੇਲ ਖਾਂਦਾ ਨਤੀਜਾ ਨਹੀਂ"</string>
     <string name="action_edit" msgid="5882082700509010966">"ਫ਼ਾਈਲ ਦਾ ਸੰਪਾਦਨ ਕਰੋ"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"ਫ਼ਾਈਲ ਖੋਜੋ"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"ਸਕ੍ਰੋਲ ਬਾਰ"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"ਅਣਲਾਕ ਕਰਨ ਲਈ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF ਦਸਤਾਵੇਜ਼ \'ਤੇ ਪ੍ਰਕਿਰਿਆ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-pl/strings.xml b/pdf/pdf-viewer/src/main/res/values-pl/strings.xml
index f9eff9a..4d4937f 100644
--- a/pdf/pdf-viewer/src/main/res/values-pl/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-pl/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> z <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Brak pasujących wyników"</string>
     <string name="action_edit" msgid="5882082700509010966">"Edytuj plik"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Wyszukaj plik"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Pasek przewijania"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Podaj hasło, aby odblokować"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Spróbuj jeszcze raz"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Nie udało się przetworzyć dokumentu PDF."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-pt-rBR/strings.xml b/pdf/pdf-viewer/src/main/res/values-pt-rBR/strings.xml
index 0e4c04d..4eda3cd 100644
--- a/pdf/pdf-viewer/src/main/res/values-pt-rBR/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-pt-rBR/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> de <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Nenhum resultado encontrado"</string>
     <string name="action_edit" msgid="5882082700509010966">"Editar arquivo"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Pesquisar no arquivo"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Barra de rolagem"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Digite a senha para desbloquear"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Tentar de novo"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Falha no processamento do documento PDF"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-pt-rPT/strings.xml b/pdf/pdf-viewer/src/main/res/values-pt-rPT/strings.xml
index 18081de..7b5d664 100644
--- a/pdf/pdf-viewer/src/main/res/values-pt-rPT/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-pt-rPT/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> de <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Sem resultados correspondentes"</string>
     <string name="action_edit" msgid="5882082700509010966">"Editar ficheiro"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Pesquisar ficheiro"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Barra de deslocamento"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Introduza a palavra-passe para desbloquear"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Tentar novamente"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Falha ao processar o documento PDF!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-pt/strings.xml b/pdf/pdf-viewer/src/main/res/values-pt/strings.xml
index 0e4c04d..4eda3cd 100644
--- a/pdf/pdf-viewer/src/main/res/values-pt/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-pt/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> de <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Nenhum resultado encontrado"</string>
     <string name="action_edit" msgid="5882082700509010966">"Editar arquivo"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Pesquisar no arquivo"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Barra de rolagem"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Digite a senha para desbloquear"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Tentar de novo"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Falha no processamento do documento PDF"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ro/strings.xml b/pdf/pdf-viewer/src/main/res/values-ro/strings.xml
index d3f7a36..7ed5c68 100644
--- a/pdf/pdf-viewer/src/main/res/values-ro/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ro/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> din <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Niciun rezultat"</string>
     <string name="action_edit" msgid="5882082700509010966">"Editează fișierul"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Caută fișierul"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Bară de derulare"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Introdu parola pentru a debloca"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Reîncearcă"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Nu s-a putut procesa documentul PDF!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ru/strings.xml b/pdf/pdf-viewer/src/main/res/values-ru/strings.xml
index 6734347..0921947 100644
--- a/pdf/pdf-viewer/src/main/res/values-ru/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ru/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> из <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Ничего не найдено."</string>
     <string name="action_edit" msgid="5882082700509010966">"Редактировать файл"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Найти файл"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Полоса прокрутки"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Введите пароль для разблокировки."</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Повторить попытку"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Не удалось обработать документ PDF"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-si/strings.xml b/pdf/pdf-viewer/src/main/res/values-si/strings.xml
index bd4fdc7..d72aa11 100644
--- a/pdf/pdf-viewer/src/main/res/values-si/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-si/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>න් <xliff:g id="POSITION">%1$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"ගැළපෙන ප්‍රතිඵල නැත"</string>
     <string name="action_edit" msgid="5882082700509010966">"ගොනුව සංස්කරණ කරන්න"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"සෙවීම් ගොනුව"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"අනුචලන තීරුව"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"අගුලු හැරීමට මුරපදය ඇතුළත් කරන්න"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"යළි උත්සාහ කරන්න"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF ලේඛනය සැකසීමට අසමත් විය!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-sk/strings.xml b/pdf/pdf-viewer/src/main/res/values-sk/strings.xml
index 4458e20..7978936 100644
--- a/pdf/pdf-viewer/src/main/res/values-sk/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-sk/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> z <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Žiadne zodpovedajúce výsledky"</string>
     <string name="action_edit" msgid="5882082700509010966">"Upraviť súbor"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Vyhľadať súbor"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Posúvač"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Zadajte heslo na odomknutie"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Skúsiť znova"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Dokument vo formáte PDF sa nepodarilo spracovať."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-sl/strings.xml b/pdf/pdf-viewer/src/main/res/values-sl/strings.xml
index d23cae0..3723865 100644
--- a/pdf/pdf-viewer/src/main/res/values-sl/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-sl/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> od <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Ni ustreznih rezultatov"</string>
     <string name="action_edit" msgid="5882082700509010966">"Urejanje datoteke"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Iskanje po datoteki"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Drsni trak"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Vnesite geslo za odklepanje"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Poskusi znova"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Obdelava dokumenta PDF ni uspela."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-sq/strings.xml b/pdf/pdf-viewer/src/main/res/values-sq/strings.xml
index 5c02c72..ac85bd2 100644
--- a/pdf/pdf-viewer/src/main/res/values-sq/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-sq/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> nga <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Nuk përputhet asnjë rezultat"</string>
     <string name="action_edit" msgid="5882082700509010966">"Modifiko skedarin"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Kërko në skedar"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Shiriti i lëvizjes"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Fut fjalëkalimin për ta shkyçur"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Riprovo"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Përpunimi i dokumentit PDF dështoi"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-sr/strings.xml b/pdf/pdf-viewer/src/main/res/values-sr/strings.xml
index 6669a2a..2dc9aee5 100644
--- a/pdf/pdf-viewer/src/main/res/values-sr/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-sr/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> од <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Нема подударних резултата"</string>
     <string name="action_edit" msgid="5882082700509010966">"Измени фајл"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Претражи фајл"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Трака за скроловање"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Унесите лозинку за откључавање"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Пробај поново"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Обрада PDF документа није успела."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-sv/strings.xml b/pdf/pdf-viewer/src/main/res/values-sv/strings.xml
index 6d1b22a..9768715 100644
--- a/pdf/pdf-viewer/src/main/res/values-sv/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-sv/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> av <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Det finns inga matchande resultat"</string>
     <string name="action_edit" msgid="5882082700509010966">"Redigera fil"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Sök i fil"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Scrollningslist"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Ange lösenord för att låsa upp"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Försök igen"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Det gick inte att bearbeta PDF-dokumentet"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-sw/strings.xml b/pdf/pdf-viewer/src/main/res/values-sw/strings.xml
index a667e4b..e3f5682 100644
--- a/pdf/pdf-viewer/src/main/res/values-sw/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-sw/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> kati ya <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Hakuna matokeo yanayolingana"</string>
     <string name="action_edit" msgid="5882082700509010966">"Badilisha faili"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Tafuta faili"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Sehemu ya kusogeza"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Weka nenosiri ili ufungue"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Jaribu tena"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Imeshindwa kuchakata hati ya PDF!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ta/strings.xml b/pdf/pdf-viewer/src/main/res/values-ta/strings.xml
index 4d8e030..4352dd7 100644
--- a/pdf/pdf-viewer/src/main/res/values-ta/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ta/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"பொருந்தும் முடிவுகள் எதுவுமில்லை"</string>
     <string name="action_edit" msgid="5882082700509010966">"ஃபைலைத் திருத்து"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"ஃபைலைத் தேடும்"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"ஸ்க்ரோல் பார்"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"அன்லாக் செய்ய கடவுச்சொல்லை டைப் செய்யவும்"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"மீண்டும் முயலுங்கள்"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF ஆவணத்தைச் செயலாக்க முடியவில்லை!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-te/strings.xml b/pdf/pdf-viewer/src/main/res/values-te/strings.xml
index 93a40f2..5e63dad 100644
--- a/pdf/pdf-viewer/src/main/res/values-te/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-te/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>లో <xliff:g id="POSITION">%1$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"మ్యాచ్ అయ్యే ఫలితాలు ఏవీ లేవు"</string>
     <string name="action_edit" msgid="5882082700509010966">"ఫైల్‌ను ఎడిట్ చేయండి"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"ఫైల్‌ను సెర్చ్ చేయండి"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"స్క్రోల్ బార్"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"అన్‌లాక్ చేయడానికి పాస్‌వర్డ్‌ను నమోదు చేయండి"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"మళ్లీ ట్రై చేయండి"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF డాక్యుమెంట్‌ను ప్రాసెస్ చేయడం విఫలమైంది!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-th/strings.xml b/pdf/pdf-viewer/src/main/res/values-th/strings.xml
index dc3da5a..521cd13 100644
--- a/pdf/pdf-viewer/src/main/res/values-th/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-th/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> จาก <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"ไม่มีผลลัพธ์ที่ตรงกัน"</string>
     <string name="action_edit" msgid="5882082700509010966">"แก้ไขไฟล์"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"ค้นหาไฟล์"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"แถบเลื่อน"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"ป้อนรหัสผ่านเพื่อปลดล็อก"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"ลองอีกครั้ง"</string>
     <string name="pdf_error" msgid="3287950599604474450">"ประมวลผลเอกสาร PDF ไม่สำเร็จ"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-tl/strings.xml b/pdf/pdf-viewer/src/main/res/values-tl/strings.xml
index 1a077e8..f10fa14 100644
--- a/pdf/pdf-viewer/src/main/res/values-tl/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-tl/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> sa <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Walang tumutugmang resulta"</string>
     <string name="action_edit" msgid="5882082700509010966">"I-edit ang file"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Maghanap ng file"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Scrollbar"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Ilagay ang password para i-unlock"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Subukan ulit"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Hindi naproseso ang PDF na dokumento!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-tr/strings.xml b/pdf/pdf-viewer/src/main/res/values-tr/strings.xml
index 4ef25c3..60fed2c 100644
--- a/pdf/pdf-viewer/src/main/res/values-tr/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-tr/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Eşleşen sonuç yok"</string>
     <string name="action_edit" msgid="5882082700509010966">"Dosyayı düzenle"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Dosya ara"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Kaydırma çubuğu"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Kilidi açmak için şifreyi girin"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Tekrar dene"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF dokümanı işlenemedi."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-uk/strings.xml b/pdf/pdf-viewer/src/main/res/values-uk/strings.xml
index 8774d93..d8e7b7f 100644
--- a/pdf/pdf-viewer/src/main/res/values-uk/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-uk/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> з <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Немає результатів"</string>
     <string name="action_edit" msgid="5882082700509010966">"Редагувати файл"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Пошук файлу"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Смуга прокручування"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Введіть пароль, щоб розблокувати"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Повторити"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Не вдалось обробити документ PDF."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ur/strings.xml b/pdf/pdf-viewer/src/main/res/values-ur/strings.xml
index 9e3b4be..fe78124 100644
--- a/pdf/pdf-viewer/src/main/res/values-ur/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ur/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> از <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"کوئی مماثل نتائج نہیں ہیں"</string>
     <string name="action_edit" msgid="5882082700509010966">"فائل میں ترمیم کریں"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"فائل تلاش کریں"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"اسکرول بار"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"غیر مقفل کرنے کیلئے پاس ورڈ درج کریں"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"پھر کوشش کریں"</string>
     <string name="pdf_error" msgid="3287950599604474450">"‏‫PDF دستاویز پر کارروائی کرنے میں ناکام!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-uz/strings.xml b/pdf/pdf-viewer/src/main/res/values-uz/strings.xml
index 65f2fa9..4820c65 100644
--- a/pdf/pdf-viewer/src/main/res/values-uz/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-uz/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> / <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Mos keladigani topilmadi"</string>
     <string name="action_edit" msgid="5882082700509010966">"Faylni tahrirlash"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Faylni qidirish"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Aylantirish yoʻli"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Ochish uchun parolni kiriting"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Qayta urinish"</string>
     <string name="pdf_error" msgid="3287950599604474450">"PDF hujjat qayta ishlanmadi!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-vi/strings.xml b/pdf/pdf-viewer/src/main/res/values-vi/strings.xml
index 03ff8c5..a9f802a 100644
--- a/pdf/pdf-viewer/src/main/res/values-vi/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-vi/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Không có kết quả phù hợp"</string>
     <string name="action_edit" msgid="5882082700509010966">"Chỉnh sửa tệp"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Tìm tệp"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Thanh cuộn"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Nhập mật khẩu để mở khoá"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Thử lại"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Không xử lý được tài liệu PDF này!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-zh-rCN/strings.xml b/pdf/pdf-viewer/src/main/res/values-zh-rCN/strings.xml
index fdbce8b..17c14af 100644
--- a/pdf/pdf-viewer/src/main/res/values-zh-rCN/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-zh-rCN/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"第 <xliff:g id="POSITION">%1$d</xliff:g> 个(共 <xliff:g id="TOTAL">%2$d</xliff:g> 个)"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"没有符合条件的结果"</string>
     <string name="action_edit" msgid="5882082700509010966">"编辑文件"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"搜索文件"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"滚动条"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"请输入密码进行解锁"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"重试"</string>
     <string name="pdf_error" msgid="3287950599604474450">"无法处理 PDF 文档!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-zh-rHK/strings.xml b/pdf/pdf-viewer/src/main/res/values-zh-rHK/strings.xml
index e503236..b3c3658 100644
--- a/pdf/pdf-viewer/src/main/res/values-zh-rHK/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-zh-rHK/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"第 <xliff:g id="POSITION">%1$d</xliff:g> 個,共 <xliff:g id="TOTAL">%2$d</xliff:g> 個"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"找不到相符的結果"</string>
     <string name="action_edit" msgid="5882082700509010966">"編輯檔案"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"搵檔案"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"捲軸"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"輸入密碼即可解鎖"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"重試"</string>
     <string name="pdf_error" msgid="3287950599604474450">"無法處理 PDF 文件!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-zh-rTW/strings.xml b/pdf/pdf-viewer/src/main/res/values-zh-rTW/strings.xml
index b6561b8..1e16247 100644
--- a/pdf/pdf-viewer/src/main/res/values-zh-rTW/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-zh-rTW/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"第 <xliff:g id="POSITION">%1$d</xliff:g> 個,共 <xliff:g id="TOTAL">%2$d</xliff:g> 個"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"找不到相符的結果"</string>
     <string name="action_edit" msgid="5882082700509010966">"編輯檔案"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"搜尋檔案"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"捲軸"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"輸入密碼即可解鎖"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"重試"</string>
     <string name="pdf_error" msgid="3287950599604474450">"無法處理此 PDF 文件!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-zu/strings.xml b/pdf/pdf-viewer/src/main/res/values-zu/strings.xml
index 64c11c5..4492469 100644
--- a/pdf/pdf-viewer/src/main/res/values-zu/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-zu/strings.xml
@@ -50,10 +50,8 @@
     <string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> ku-<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
     <string name="message_no_match_status" msgid="5929387004361286433">"Ayikho imiphumela efanayo"</string>
     <string name="action_edit" msgid="5882082700509010966">"Hlela ifayela"</string>
-    <!-- no translation found for action_search (1044074359976464346) -->
-    <skip />
-    <!-- no translation found for scrollbar_description (5720892205323882483) -->
-    <skip />
+    <string name="action_search" msgid="1044074359976464346">"Sesha ifayela"</string>
+    <string name="scrollbar_description" msgid="5720892205323882483">"Ibha yokuskrola"</string>
     <string name="password_not_entered" msgid="8875370870743585303">"Faka iphasiwedi ukuvula"</string>
     <string name="retry_button_text" msgid="3443862378337999137">"Zama futhi"</string>
     <string name="pdf_error" msgid="3287950599604474450">"Yehlulekile ukucubungula idokhumenti ye-PDF!"</string>
diff --git a/samples/MediaRoutingDemo/build.gradle b/samples/MediaRoutingDemo/build.gradle
index d2974d8..7a56a07 100644
--- a/samples/MediaRoutingDemo/build.gradle
+++ b/samples/MediaRoutingDemo/build.gradle
@@ -11,6 +11,7 @@
 }
 
 dependencies {
+    api(libs.jspecify)
     implementation(project(":appcompat:appcompat"))
     implementation(project(":mediarouter:mediarouter"))
     implementation(project(":preference:preference"))
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/MyMediaRouteControllerDialog.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/MyMediaRouteControllerDialog.java
index 8051d4a7..0185867 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/MyMediaRouteControllerDialog.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/MyMediaRouteControllerDialog.java
@@ -22,9 +22,10 @@
 import android.view.View;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
 import androidx.mediarouter.app.MediaRouteControllerDialog;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * An example MediaRouteControllerDialog for demonstrating
  * {@link androidx.mediarouter.app.MediaRouteControllerDialog#onCreateMediaControlView}.
@@ -34,9 +35,8 @@
         super(context);
     }
 
-    @NonNull
     @Override
-    public View onCreateMediaControlView(@NonNull Bundle savedInstanceState) {
+    public @NonNull View onCreateMediaControlView(@NonNull Bundle savedInstanceState) {
         TextView view = new TextView(getContext());
         view.setText(R.string.my_media_control_text);
         view.setBackgroundColor(Color.GRAY);
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/OverlayDisplayWindow.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/OverlayDisplayWindow.java
index 44d7985..f005665 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/OverlayDisplayWindow.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/OverlayDisplayWindow.java
@@ -37,8 +37,8 @@
 import android.view.WindowManager;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 
 /**
  * Manages an overlay display window, used for simulating remote playback.
@@ -57,8 +57,7 @@
     protected final int mWidth;
     protected final int mHeight;
     protected final int mGravity;
-    @Nullable
-    protected OverlayWindowListener mListener;
+    protected @Nullable OverlayWindowListener mListener;
 
     protected OverlayDisplayWindow(@NonNull Context context, @NonNull String name, int width,
             int height, int gravity) {
@@ -74,9 +73,8 @@
      *
      * @return the created overlay window.
      */
-    @NonNull
-    public static OverlayDisplayWindow create(@NonNull Context context, @NonNull String name,
-            int width, int height, int gravity) {
+    public static @NonNull OverlayDisplayWindow create(@NonNull Context context,
+            @NonNull String name, int width, int height, int gravity) {
         return new JellybeanMr1Impl(context, name, width, height, gravity);
     }
 
@@ -84,8 +82,7 @@
         mListener = listener;
     }
 
-    @NonNull
-    public Context getContext() {
+    public @NonNull Context getContext() {
         return mContext;
     }
 
@@ -109,8 +106,7 @@
      *
      * @return a bitmap representing the snapshot of the window.
      */
-    @Nullable
-    public abstract Bitmap getSnapshot();
+    public abstract @Nullable Bitmap getSnapshot();
 
     /**
      * Watches for significant changes in the overlay display window lifecycle.
@@ -214,9 +210,8 @@
             relayout();
         }
 
-        @NonNull
         @Override
-        public Bitmap getSnapshot() {
+        public @NonNull Bitmap getSnapshot() {
             return mTextureView.getBitmap();
         }
 
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/RoutesManager.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/RoutesManager.java
index fff9c40..0cddd62 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/RoutesManager.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/RoutesManager.java
@@ -27,8 +27,6 @@
 import android.content.Context;
 import android.content.res.Resources;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.mediarouter.media.MediaRouter;
 import androidx.mediarouter.media.MediaRouterParams;
 import androidx.mediarouter.media.RouteListingPreference;
@@ -36,6 +34,9 @@
 import com.example.androidx.mediarouting.activities.MainActivity;
 import com.example.androidx.mediarouting.data.RouteItem;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -72,8 +73,7 @@
     }
 
     /** Singleton method. */
-    @NonNull
-    public static RoutesManager getInstance(@NonNull Context context) {
+    public static @NonNull RoutesManager getInstance(@NonNull Context context) {
         synchronized (RoutesManager.class) {
             if (sInstance == null) {
                 sInstance = new RoutesManager(context);
@@ -82,8 +82,7 @@
         return sInstance;
     }
 
-    @NonNull
-    public List<RouteItem> getRouteItems() {
+    public @NonNull List<RouteItem> getRouteItems() {
         return new ArrayList<>(mRouteItems.values());
     }
 
@@ -114,8 +113,7 @@
      * @param id of the route to search for.
      * @return the route with the passed id, or null if it does not exist.
      */
-    @Nullable
-    public RouteItem getRouteWithId(@Nullable String id) {
+    public @Nullable RouteItem getRouteWithId(@Nullable String id) {
         return mRouteItems.get(id);
     }
 
@@ -172,8 +170,7 @@
      * The current list of route listing preference items, as set via {@link
      * #setRouteListingPreferenceItems}.
      */
-    @NonNull
-    public List<RouteListingPreferenceItemHolder> getRouteListingPreferenceItems() {
+    public @NonNull List<RouteListingPreferenceItemHolder> getRouteListingPreferenceItems() {
         return mRouteListingPreferenceItems;
     }
 
@@ -338,19 +335,18 @@
      */
     public static final class RouteListingPreferenceItemHolder {
 
-        @NonNull public final RouteListingPreference.Item mItem;
-        @NonNull public final String mRouteName;
+        public final RouteListingPreference.@NonNull Item mItem;
+        public final @NonNull String mRouteName;
 
         public RouteListingPreferenceItemHolder(
-                @NonNull RouteListingPreference.Item item, @NonNull String routeName) {
+                RouteListingPreference.@NonNull Item item, @NonNull String routeName) {
             mItem = item;
             mRouteName = routeName;
         }
 
         /** Returns the name of the corresponding route. */
         @Override
-        @NonNull
-        public String toString() {
+        public @NonNull String toString() {
             return mRouteName;
         }
 
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/AddEditRouteActivity.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/AddEditRouteActivity.java
index cb1f13b..d01b97d 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/AddEditRouteActivity.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/AddEditRouteActivity.java
@@ -30,8 +30,6 @@
 import android.widget.EditText;
 import android.widget.Switch;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.core.util.Consumer;
 
@@ -40,11 +38,14 @@
 import com.example.androidx.mediarouting.data.RouteItem;
 import com.example.androidx.mediarouting.services.SampleDynamicGroupMediaRouteProviderService;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /** Allows the user to add and edit routes. */
 public class AddEditRouteActivity extends AppCompatActivity {
     private static final String EXTRA_ROUTE_ID_KEY = "routeId";
 
-    @Nullable private SampleDynamicGroupMediaRouteProviderService mService;
+    private @Nullable SampleDynamicGroupMediaRouteProviderService mService;
     private ServiceConnection mConnection;
     private RoutesManager mRoutesManager;
     private RouteItem mRouteItem;
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/MainActivity.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/MainActivity.java
index c4e0ab4..8786631 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/MainActivity.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/MainActivity.java
@@ -47,8 +47,6 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.core.content.ContextCompat;
@@ -85,6 +83,9 @@
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.io.File;
 import java.util.List;
 
@@ -318,9 +319,9 @@
         if (mediaRouteActionProvider != null) {
             mediaRouteActionProvider.setRouteSelector(mSelector);
             mediaRouteActionProvider.setDialogFactory(new MediaRouteDialogFactory() {
-                @NonNull
                 @Override
-                public MediaRouteControllerDialogFragment onCreateControllerDialogFragment() {
+                public @NonNull MediaRouteControllerDialogFragment
+                        onCreateControllerDialogFragment() {
                     return new ControllerDialogFragment(MainActivity.this,
                             mUseDefaultControlCheckBox);
                 }
@@ -545,8 +546,7 @@
         mSeekBar.setEnabled(item != null && item.getDuration() > 0);
     }
 
-    @Nullable
-    private PlaylistItem getCheckedPlaylistItem() {
+    private @Nullable PlaylistItem getCheckedPlaylistItem() {
         int count = mPlayListView.getCount();
         int index = mPlayListView.getCheckedItemPosition();
         if (count > 0) {
@@ -564,8 +564,7 @@
                 ? 0 : (SystemClock.elapsedRealtime() - item.getTimestamp()));
     }
 
-    @NonNull
-    private MediaRouterParams getRouterParams() {
+    private @NonNull MediaRouterParams getRouterParams() {
         MediaRouterParams.Builder routerParams =
                 new MediaRouterParams.Builder()
                         .setDialogType(MediaRouterParams.DIALOG_TYPE_DEFAULT)
@@ -592,13 +591,12 @@
     public static final class DiscoveryFragment extends MediaRouteDiscoveryFragment {
         private MediaRouter.Callback mCallback;
 
-        public void setCallback(@Nullable MediaRouter.Callback cb) {
+        public void setCallback(MediaRouter.@Nullable Callback cb) {
             mCallback = cb;
         }
 
-        @Nullable
         @Override
-        public MediaRouter.Callback onCreateCallback() {
+        public MediaRouter.@Nullable Callback onCreateCallback() {
             return mCallback;
         }
 
@@ -761,9 +759,8 @@
             mUseDefaultControlCheckBox = customControlViewCheckBox;
         }
 
-        @NonNull
         @Override
-        public MediaRouteControllerDialog onCreateControllerDialog(
+        public @NonNull MediaRouteControllerDialog onCreateControllerDialog(
                 @NonNull Context context, @Nullable Bundle savedInstanceState) {
             mMainActivity.updateStatusFromSessionManager();
             mControllerDialog =
@@ -818,9 +815,8 @@
 
     @RequiresApi(30)
     private class TransferListener implements MediaRouter.OnPrepareTransferListener {
-        @Nullable
         @Override
-        public ListenableFuture<Void> onPrepareTransfer(@NonNull RouteInfo fromRoute,
+        public @Nullable ListenableFuture<Void> onPrepareTransfer(@NonNull RouteInfo fromRoute,
                 @NonNull RouteInfo toRoute) {
             Log.d(TAG, "onPrepareTransfer: from=" + fromRoute.getId()
                     + ", to=" + toRoute.getId());
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/RouteListingPreferenceActivity.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/RouteListingPreferenceActivity.java
index 94ac61d..56efb701 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/RouteListingPreferenceActivity.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/RouteListingPreferenceActivity.java
@@ -35,8 +35,6 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.core.view.MenuItemCompat;
@@ -57,6 +55,9 @@
 import com.google.android.material.floatingactionbutton.FloatingActionButton;
 import com.google.common.collect.ImmutableList;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -280,8 +281,8 @@
         mRoutesManager.setRouteListingPreferenceItems(newRouteListingPreference);
     }
 
-    @NonNull
-    private ImmutableList<MediaRouter.RouteInfo> getRoutesWithNoAssociatedListingPreferenceItem() {
+    private @NonNull ImmutableList<MediaRouter.RouteInfo>
+            getRoutesWithNoAssociatedListingPreferenceItem() {
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
             return ImmutableList.of();
         }
@@ -319,8 +320,8 @@
         @Override
         public boolean onMove(
                 @NonNull RecyclerView recyclerView,
-                @NonNull RecyclerView.ViewHolder origin,
-                @NonNull RecyclerView.ViewHolder target) {
+                RecyclerView.@NonNull ViewHolder origin,
+                RecyclerView.@NonNull ViewHolder target) {
             int fromPosition = origin.getBindingAdapterPosition();
             int toPosition = target.getBindingAdapterPosition();
             if (mDraggingFromPosition == INDEX_UNSET) {
@@ -334,7 +335,7 @@
         }
 
         @Override
-        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
+        public void onSwiped(RecyclerView.@NonNull ViewHolder viewHolder, int direction) {
             ArrayList<RouteListingPreferenceItemHolder> newRouteListingPreference =
                     new ArrayList<>(mRoutesManager.getRouteListingPreferenceItems());
             int itemPosition = viewHolder.getBindingAdapterPosition();
@@ -345,7 +346,7 @@
 
         @Override
         public void clearView(
-                @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
+                @NonNull RecyclerView recyclerView, RecyclerView.@NonNull ViewHolder viewHolder) {
             super.clearView(recyclerView, viewHolder);
             if (mDraggingFromPosition != INDEX_UNSET) {
                 ArrayList<RouteListingPreferenceItemHolder> newRouteListingPreference =
@@ -362,9 +363,8 @@
 
     private class RouteListingPreferenceRecyclerViewAdapter
             extends RecyclerView.Adapter<RecyclerViewItemViewHolder> {
-        @NonNull
         @Override
-        public RecyclerViewItemViewHolder onCreateViewHolder(
+        public @NonNull RecyclerViewItemViewHolder onCreateViewHolder(
                 @NonNull ViewGroup parent, int viewType) {
             TextView textView =
                     (TextView)
@@ -421,9 +421,8 @@
             mHumanReadableString = humanReadableString;
         }
 
-        @NonNull
         @Override
-        public String toString() {
+        public @NonNull String toString() {
             return mHumanReadableString;
         }
 
@@ -460,16 +459,15 @@
                 RouteListingPreference.Item.SUBTEXT_CUSTOM, "Custom text (placeholder value)");
 
         public final int mConstant;
-        @NonNull public final String mHumanReadableString;
+        public final @NonNull String mHumanReadableString;
 
         RouteListingPreferenceItemSubtext(int constant, @NonNull String humanReadableString) {
             mConstant = constant;
             mHumanReadableString = humanReadableString;
         }
 
-        @NonNull
         @Override
-        public String toString() {
+        public @NonNull String toString() {
             return mHumanReadableString;
         }
 
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsActivity.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsActivity.java
index 34621c4..9ac8a2b 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsActivity.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsActivity.java
@@ -31,8 +31,6 @@
 import android.widget.Spinner;
 import android.widget.Switch;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.widget.AppCompatButton;
 import androidx.mediarouter.media.MediaRouter;
@@ -47,6 +45,9 @@
 import com.example.androidx.mediarouting.ui.RoutesAdapter;
 import com.google.android.material.floatingactionbutton.FloatingActionButton;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Allows the user to control dialog types, enabling or disabling Dynamic Groups, enabling or
  * disabling transfer to local and customize the routes exposed by {@link
@@ -247,7 +248,7 @@
 
     private static class ProviderServiceConnection implements ServiceConnection {
 
-        @Nullable private SampleDynamicGroupMediaRouteProviderService mService;
+        private @Nullable SampleDynamicGroupMediaRouteProviderService mService;
 
         @Override
         public void onServiceConnected(ComponentName className, IBinder service) {
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsPreferenceFragment.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsPreferenceFragment.java
index 8f2fbb0..a42933c 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsPreferenceFragment.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsPreferenceFragment.java
@@ -20,14 +20,15 @@
 import android.content.SharedPreferences;
 import android.os.Bundle;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.preference.PreferenceFragmentCompat;
 import androidx.preference.PreferenceManager;
 
 import com.example.androidx.mediarouting.R;
 import com.example.androidx.mediarouting.util.Utils;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /** The preference fragment to show the switch settings. */
 public class SettingsPreferenceFragment extends PreferenceFragmentCompat
         implements SharedPreferences.OnSharedPreferenceChangeListener {
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRouteItem.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRouteItem.java
index 0f331cd..bb7b8b8 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRouteItem.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRouteItem.java
@@ -18,11 +18,11 @@
 
 import android.text.TextUtils;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
 import com.example.androidx.mediarouting.activities.systemrouting.source.SystemRoutesSource;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.Objects;
 
 /** Holds information about a system route. */
@@ -50,24 +50,24 @@
     }
 
     /** The {@link SystemRoutesSource#getSourceId()} of the source that created this item. */
-    @NonNull public final String mSourceId;
+    public final @NonNull String mSourceId;
 
     /** An id that uniquely identifies this route item within the source. */
-    @NonNull public final String mId;
+    public final @NonNull String mId;
 
-    @NonNull public final String mName;
+    public final @NonNull String mName;
 
-    @Nullable public final String mAddress;
+    public final @Nullable String mAddress;
 
-    @Nullable public final String mDescription;
+    public final @Nullable String mDescription;
 
-    @Nullable public final String mSuitabilityStatus;
+    public final @Nullable String mSuitabilityStatus;
 
-    @Nullable public final Boolean mTransferInitiatedBySelf;
+    public final @Nullable Boolean mTransferInitiatedBySelf;
 
-    @Nullable public final String mTransferReason;
+    public final @Nullable String mTransferReason;
 
-    @NonNull public final SelectionSupportState mSelectionSupportState;
+    public final @NonNull SelectionSupportState mSelectionSupportState;
 
     private SystemRouteItem(@NonNull Builder builder) {
         mSourceId = Objects.requireNonNull(builder.mSourceId);
@@ -116,15 +116,15 @@
      */
     public static final class Builder {
 
-        @NonNull private String mSourceId;
-        @NonNull private final String mId;
-        @NonNull private String mName;
-        @Nullable private String mAddress;
-        @Nullable private String mDescription;
-        @Nullable private String mSuitabilityStatus;
-        @Nullable private Boolean mTransferInitiatedBySelf;
-        @Nullable private String mTransferReason;
-        @NonNull public SelectionSupportState mSelectionSupportState;
+        private @NonNull String mSourceId;
+        private final @NonNull String mId;
+        private @NonNull String mName;
+        private @Nullable String mAddress;
+        private @Nullable String mDescription;
+        private @Nullable String mSuitabilityStatus;
+        private @Nullable Boolean mTransferInitiatedBySelf;
+        private @Nullable String mTransferReason;
+        public @NonNull SelectionSupportState mSelectionSupportState;
 
         /**
          * Creates a builder with the mandatory properties.
@@ -141,8 +141,7 @@
         /**
          * Sets a route name.
          */
-        @NonNull
-        public Builder setName(@NonNull String name) {
+        public @NonNull Builder setName(@NonNull String name) {
             mName = name;
             return this;
         }
@@ -150,8 +149,7 @@
         /**
          * Sets an address for the route.
          */
-        @NonNull
-        public Builder setAddress(@NonNull String address) {
+        public @NonNull Builder setAddress(@NonNull String address) {
             if (!TextUtils.isEmpty(address)) {
                 mAddress = address;
             }
@@ -161,8 +159,7 @@
         /**
          * Sets a description for the route.
          */
-        @NonNull
-        public Builder setDescription(@NonNull String description) {
+        public @NonNull Builder setDescription(@NonNull String description) {
             if (!TextUtils.isEmpty(description)) {
                 mDescription = description;
             }
@@ -173,8 +170,7 @@
          * Sets a human-readable string describing the transfer suitability of the route, or null if
          * not applicable.
          */
-        @NonNull
-        public Builder setSuitabilityStatus(@Nullable String suitabilityStatus) {
+        public @NonNull Builder setSuitabilityStatus(@Nullable String suitabilityStatus) {
             mSuitabilityStatus = suitabilityStatus;
             return this;
         }
@@ -183,8 +179,8 @@
          * Sets whether the corresponding route's selection is the result of an action of this app,
          * or null if not applicable.
          */
-        @NonNull
-        public Builder setTransferInitiatedBySelf(@Nullable Boolean transferInitiatedBySelf) {
+        public @NonNull Builder setTransferInitiatedBySelf(
+                @Nullable Boolean transferInitiatedBySelf) {
             mTransferInitiatedBySelf = transferInitiatedBySelf;
             return this;
         }
@@ -192,15 +188,13 @@
         /**
          * Sets a human-readable string describing the transfer reason, or null if not applicable.
          */
-        @NonNull
-        public Builder setTransferReason(@Nullable String transferReason) {
+        public @NonNull Builder setTransferReason(@Nullable String transferReason) {
             mTransferReason = transferReason;
             return this;
         }
 
         /** Sets the {@link SelectionSupportState} for the corresponding route. */
-        @NonNull
-        public Builder setSelectionSupportState(
+        public @NonNull Builder setSelectionSupportState(
                 @NonNull SelectionSupportState selectionSupportState) {
             mSelectionSupportState = Objects.requireNonNull(selectionSupportState);
             return this;
@@ -209,8 +203,7 @@
         /**
          * Builds {@link SystemRouteItem}.
          */
-        @NonNull
-        public SystemRouteItem build() {
+        public @NonNull SystemRouteItem build() {
             return new SystemRouteItem(this);
         }
     }
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutesAdapter.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutesAdapter.java
index 764c050..22b6c57 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutesAdapter.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutesAdapter.java
@@ -26,8 +26,6 @@
 import android.view.ViewGroup;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.widget.AppCompatButton;
 import androidx.appcompat.widget.AppCompatTextView;
 import androidx.core.util.Consumer;
@@ -37,6 +35,9 @@
 
 import com.example.androidx.mediarouting.R;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.List;
 
 /** {@link RecyclerView.Adapter} for showing system route sources and their corresponding routes. */
@@ -57,14 +58,13 @@
         mListDiffer.submitList(newItems);
     }
 
-    @NonNull
-    public List<SystemRoutesAdapterItem> getItems() {
+    public @NonNull List<SystemRoutesAdapterItem> getItems() {
         return mListDiffer.getCurrentList();
     }
 
-    @NonNull
     @Override
-    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+    public RecyclerView.@NonNull ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
+            int viewType) {
         Context context = parent.getContext();
         if (viewType == VIEW_TYPE_HEADER) {
             View view = LayoutInflater.from(context).inflate(R.layout.item_system_route_header,
@@ -78,7 +78,7 @@
     }
 
     @Override
-    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+    public void onBindViewHolder(RecyclerView.@NonNull ViewHolder holder, int position) {
         SystemRoutesAdapterItem routeItem = getItems().get(position);
         if (routeItem instanceof SystemRoutesSourceItem && holder instanceof HeaderViewHolder) {
             ((HeaderViewHolder) holder).bind((SystemRoutesSourceItem) routeItem);
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutesSourceItem.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutesSourceItem.java
index 9a5129e..9d97e01 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutesSourceItem.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutesSourceItem.java
@@ -18,7 +18,7 @@
 
 import android.text.TextUtils;
 
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
 
 import java.util.Objects;
 
@@ -27,14 +27,13 @@
  */
 public final class SystemRoutesSourceItem implements SystemRoutesAdapterItem {
 
-    @NonNull private final String mName;
+    private final @NonNull String mName;
 
     public SystemRoutesSourceItem(@NonNull String name) {
         mName = name;
     }
 
-    @NonNull
-    public String getSourceName() {
+    public @NonNull String getSourceName() {
         return mName;
     }
 
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutingActivity.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutingActivity.java
index 6f18b57..efde5a5 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutingActivity.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutingActivity.java
@@ -26,8 +26,6 @@
 import android.os.Bundle;
 import android.widget.Toast;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.core.app.ActivityCompat;
 import androidx.core.content.ContextCompat;
@@ -43,6 +41,9 @@
 import com.example.androidx.mediarouting.activities.systemrouting.source.MediaRouterSystemRoutesSource;
 import com.example.androidx.mediarouting.activities.systemrouting.source.SystemRoutesSource;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -55,12 +56,11 @@
 
     private static final int REQUEST_CODE_BLUETOOTH_CONNECT = 4199;
 
-    @NonNull
-    private final SystemRoutesAdapter mSystemRoutesAdapter =
+    private final @NonNull SystemRoutesAdapter mSystemRoutesAdapter =
             new SystemRoutesAdapter(this::onRouteItemClicked);
 
-    @NonNull private final Map<String, SystemRoutesSource> mSystemRoutesSources = new HashMap<>();
-    @NonNull private SwipeRefreshLayout mSwipeRefreshLayout;
+    private final @NonNull Map<String, SystemRoutesSource> mSystemRoutesSources = new HashMap<>();
+    private @NonNull SwipeRefreshLayout mSwipeRefreshLayout;
 
     /**
      * Creates and launches an intent to start current activity.
@@ -101,8 +101,8 @@
     }
 
     @Override
-    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
-            @NonNull int[] grantResults) {
+    public void onRequestPermissionsResult(int requestCode, String @NonNull [] permissions,
+            int @NonNull [] grantResults) {
         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 
         if (requestCode == REQUEST_CODE_BLUETOOTH_CONNECT
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AndroidXMediaRouterSystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AndroidXMediaRouterSystemRoutesSource.java
index d7763d0..ee3896b 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AndroidXMediaRouterSystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AndroidXMediaRouterSystemRoutesSource.java
@@ -18,7 +18,6 @@
 
 import android.content.Context;
 
-import androidx.annotation.NonNull;
 import androidx.mediarouter.media.MediaControlIntent;
 import androidx.mediarouter.media.MediaRouteSelector;
 import androidx.mediarouter.media.MediaRouter;
@@ -26,57 +25,56 @@
 import com.example.androidx.mediarouting.activities.systemrouting.SystemRouteItem;
 import com.example.androidx.mediarouting.activities.systemrouting.SystemRoutesSourceItem;
 
+import org.jspecify.annotations.NonNull;
+
 import java.util.ArrayList;
 import java.util.List;
 
 /** Implements {@link SystemRoutesSource} using {@link MediaRouter}. */
 public final class AndroidXMediaRouterSystemRoutesSource extends SystemRoutesSource {
 
-    @NonNull
-    private final MediaRouter mMediaRouter;
+    private final @NonNull MediaRouter mMediaRouter;
 
-    @NonNull
-    private final MediaRouter.Callback mMediaRouterCallback =
+    private final MediaRouter.@NonNull Callback mMediaRouterCallback =
             new MediaRouter.Callback() {
                 @Override
                 public void onRouteAdded(
-                        @NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo route) {
+                        @NonNull MediaRouter router, MediaRouter.@NonNull RouteInfo route) {
                     mOnRoutesChangedListener.run();
                 }
 
                 @Override
                 public void onRouteRemoved(
-                        @NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo route) {
+                        @NonNull MediaRouter router, MediaRouter.@NonNull RouteInfo route) {
                     mOnRoutesChangedListener.run();
                 }
 
                 @Override
                 public void onRouteSelected(
                         @NonNull MediaRouter router,
-                        @NonNull MediaRouter.RouteInfo selectedRoute,
+                        MediaRouter.@NonNull RouteInfo selectedRoute,
                         int reason,
-                        @NonNull MediaRouter.RouteInfo requestedRoute) {
+                        MediaRouter.@NonNull RouteInfo requestedRoute) {
                     mOnRoutesChangedListener.run();
                 }
 
                 @Override
                 public void onRouteUnselected(
                         @NonNull MediaRouter router,
-                        @NonNull MediaRouter.RouteInfo route,
+                        MediaRouter.@NonNull RouteInfo route,
                         int reason) {
                     mOnRoutesChangedListener.run();
                 }
 
                 @Override
                 public void onRouteChanged(
-                        @NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo route) {
+                        @NonNull MediaRouter router, MediaRouter.@NonNull RouteInfo route) {
                     mOnRoutesChangedListener.run();
                 }
             };
 
     /** Returns a new instance. */
-    @NonNull
-    public static AndroidXMediaRouterSystemRoutesSource create(@NonNull Context context) {
+    public static @NonNull AndroidXMediaRouterSystemRoutesSource create(@NonNull Context context) {
         MediaRouter mediaRouter = MediaRouter.getInstance(context);
         return new AndroidXMediaRouterSystemRoutesSource(mediaRouter);
     }
@@ -100,15 +98,13 @@
         mMediaRouter.removeCallback(mMediaRouterCallback);
     }
 
-    @NonNull
     @Override
-    public SystemRoutesSourceItem getSourceItem() {
+    public @NonNull SystemRoutesSourceItem getSourceItem() {
         return new SystemRoutesSourceItem(/* name= */ "AndroidX MediaRouter");
     }
 
-    @NonNull
     @Override
-    public List<SystemRouteItem> fetchSourceRouteItems() {
+    public @NonNull List<SystemRouteItem> fetchSourceRouteItems() {
         List<SystemRouteItem> out = new ArrayList<>();
 
         for (MediaRouter.RouteInfo routeInfo : mMediaRouter.getRoutes()) {
@@ -133,8 +129,7 @@
         return false;
     }
 
-    @NonNull
-    private SystemRouteItem createRouteItemFor(@NonNull MediaRouter.RouteInfo routeInfo) {
+    private @NonNull SystemRouteItem createRouteItemFor(MediaRouter.@NonNull RouteInfo routeInfo) {
         SystemRouteItem.Builder builder =
                 new SystemRouteItem.Builder(getSourceId(), routeInfo.getId())
                         .setName(routeInfo.getName());
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AudioManagerSystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AudioManagerSystemRoutesSource.java
index 9e7b67a..e3d708a 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AudioManagerSystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AudioManagerSystemRoutesSource.java
@@ -22,12 +22,13 @@
 import android.media.AudioManager;
 import android.os.Build;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 
 import com.example.androidx.mediarouting.activities.systemrouting.SystemRouteItem;
 import com.example.androidx.mediarouting.activities.systemrouting.SystemRoutesSourceItem;
 
+import org.jspecify.annotations.NonNull;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -35,11 +36,9 @@
 @RequiresApi(Build.VERSION_CODES.M)
 public final class AudioManagerSystemRoutesSource extends SystemRoutesSource {
 
-    @NonNull
-    private final AudioManager mAudioManager;
+    private final @NonNull AudioManager mAudioManager;
 
-    @NonNull
-    private final AudioDeviceCallback mAudioDeviceCallback =
+    private final @NonNull AudioDeviceCallback mAudioDeviceCallback =
             new AudioDeviceCallback() {
                 @Override
                 public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
@@ -53,8 +52,7 @@
             };
 
     /** Returns a new instance. */
-    @NonNull
-    public static AudioManagerSystemRoutesSource create(@NonNull Context context) {
+    public static @NonNull AudioManagerSystemRoutesSource create(@NonNull Context context) {
         AudioManager audioManager = context.getSystemService(AudioManager.class);
         return new AudioManagerSystemRoutesSource(audioManager);
     }
@@ -73,15 +71,13 @@
         mAudioManager.unregisterAudioDeviceCallback(mAudioDeviceCallback);
     }
 
-    @NonNull
     @Override
-    public SystemRoutesSourceItem getSourceItem() {
+    public @NonNull SystemRoutesSourceItem getSourceItem() {
         return new SystemRoutesSourceItem(/* name= */ "AudioManager");
     }
 
-    @NonNull
     @Override
-    public List<SystemRouteItem> fetchSourceRouteItems() {
+    public @NonNull List<SystemRouteItem> fetchSourceRouteItems() {
         List<SystemRouteItem> out = new ArrayList<>();
 
         AudioDeviceInfo[] deviceInfos = mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
@@ -97,8 +93,7 @@
         throw new UnsupportedOperationException();
     }
 
-    @NonNull
-    private SystemRouteItem createRouteItemFor(@NonNull AudioDeviceInfo audioDeviceInfo) {
+    private @NonNull SystemRouteItem createRouteItemFor(@NonNull AudioDeviceInfo audioDeviceInfo) {
         SystemRouteItem.Builder builder =
                 new SystemRouteItem.Builder(getSourceId(), String.valueOf(audioDeviceInfo.getId()))
                         .setName(audioDeviceInfo.getProductName().toString());
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/BluetoothManagerSystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/BluetoothManagerSystemRoutesSource.java
index 7bc34d7..c024e65 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/BluetoothManagerSystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/BluetoothManagerSystemRoutesSource.java
@@ -28,31 +28,27 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RequiresPermission;
 
 import com.example.androidx.mediarouting.activities.systemrouting.SystemRouteItem;
 import com.example.androidx.mediarouting.activities.systemrouting.SystemRoutesSourceItem;
 
+import org.jspecify.annotations.NonNull;
+
 import java.util.ArrayList;
 import java.util.List;
 
 /** Implements {@link SystemRoutesSource} using {@link BluetoothManager}. */
 public final class BluetoothManagerSystemRoutesSource extends SystemRoutesSource {
 
-    @NonNull
-    private final Context mContext;
-    @NonNull
-    private final BluetoothManager mBluetoothManager;
-    @NonNull
-    private final BluetoothAdapter mBluetoothAdapter;
-    @NonNull
-    private final DeviceStateChangedReceiver mDeviceStateChangedReceiver =
+    private final @NonNull Context mContext;
+    private final @NonNull BluetoothManager mBluetoothManager;
+    private final @NonNull BluetoothAdapter mBluetoothAdapter;
+    private final @NonNull DeviceStateChangedReceiver mDeviceStateChangedReceiver =
             new DeviceStateChangedReceiver();
 
     /** Returns a new instance. */
-    @NonNull
-    public static BluetoothManagerSystemRoutesSource create(@NonNull Context context) {
+    public static @NonNull BluetoothManagerSystemRoutesSource create(@NonNull Context context) {
         BluetoothManager bluetoothManager =
                 (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
         return new BluetoothManagerSystemRoutesSource(context, bluetoothManager);
@@ -83,16 +79,14 @@
         mContext.unregisterReceiver(mDeviceStateChangedReceiver);
     }
 
-    @NonNull
     @Override
-    public SystemRoutesSourceItem getSourceItem() {
+    public @NonNull SystemRoutesSourceItem getSourceItem() {
         return new SystemRoutesSourceItem(/* name= */ "BluetoothManager");
     }
 
-    @NonNull
     @RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
     @Override
-    public List<SystemRouteItem> fetchSourceRouteItems() {
+    public @NonNull List<SystemRouteItem> fetchSourceRouteItems() {
         List<SystemRouteItem> out = new ArrayList<>();
 
         for (BluetoothDevice device : mBluetoothAdapter.getBondedDevices()) {
@@ -107,9 +101,8 @@
         throw new UnsupportedOperationException();
     }
 
-    @NonNull
     @RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
-    private SystemRouteItem createRouteItemFor(@NonNull BluetoothDevice device) {
+    private @NonNull SystemRouteItem createRouteItemFor(@NonNull BluetoothDevice device) {
         return new SystemRouteItem.Builder(getSourceId(), /* id= */ device.getAddress())
                 .setName(device.getName())
                 .setAddress(device.getAddress())
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouter2SystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouter2SystemRoutesSource.java
index 1c85f85..828eef4 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouter2SystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouter2SystemRoutesSource.java
@@ -25,13 +25,14 @@
 import android.os.Build;
 
 import androidx.annotation.DoNotInline;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 
 import com.example.androidx.mediarouting.activities.systemrouting.SystemRouteItem;
 import com.example.androidx.mediarouting.activities.systemrouting.SystemRoutesSourceItem;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -46,15 +47,14 @@
 @RequiresApi(Build.VERSION_CODES.R)
 public final class MediaRouter2SystemRoutesSource extends SystemRoutesSource {
 
-    @NonNull private final Context mContext;
-    @NonNull private final MediaRouter2 mMediaRouter2;
-    @Nullable private final Method mSuitabilityStatusMethod;
-    @Nullable private final Method mWasTransferInitiatedBySelfMethod;
-    @Nullable private final Method mTransferReasonMethod;
-    @NonNull private final ArrayList<SystemRouteItem> mRouteItems = new ArrayList<>();
+    private final @NonNull Context mContext;
+    private final @NonNull MediaRouter2 mMediaRouter2;
+    private final @Nullable Method mSuitabilityStatusMethod;
+    private final @Nullable Method mWasTransferInitiatedBySelfMethod;
+    private final @Nullable Method mTransferReasonMethod;
+    private final @NonNull ArrayList<SystemRouteItem> mRouteItems = new ArrayList<>();
 
-    @NonNull
-    private final MediaRouter2.RouteCallback mRouteCallback =
+    private final MediaRouter2.@NonNull RouteCallback mRouteCallback =
             new MediaRouter2.RouteCallback() {
                 @Override
                 public void onRoutesUpdated(@NonNull List<MediaRoute2Info> routes) {
@@ -62,19 +62,17 @@
                 }
             };
 
-    @NonNull
-    private final MediaRouter2.ControllerCallback mControllerCallback =
+    private final MediaRouter2.@NonNull ControllerCallback mControllerCallback =
             new MediaRouter2.ControllerCallback() {
                 @Override
                 public void onControllerUpdated(
-                        @NonNull MediaRouter2.RoutingController unusedController) {
+                        MediaRouter2.@NonNull RoutingController unusedController) {
                     populateRouteItems(mMediaRouter2.getRoutes());
                 }
             };
 
     /** Returns a new instance. */
-    @NonNull
-    public static MediaRouter2SystemRoutesSource create(@NonNull Context context) {
+    public static @NonNull MediaRouter2SystemRoutesSource create(@NonNull Context context) {
         MediaRouter2 mediaRouter2 = MediaRouter2.getInstance(context);
         return new MediaRouter2SystemRoutesSource(context, mediaRouter2);
     }
@@ -125,15 +123,13 @@
         mMediaRouter2.unregisterRouteCallback(mRouteCallback);
     }
 
-    @NonNull
     @Override
-    public SystemRoutesSourceItem getSourceItem() {
+    public @NonNull SystemRoutesSourceItem getSourceItem() {
         return new SystemRoutesSourceItem(/* name= */ "MediaRouter2");
     }
 
-    @NonNull
     @Override
-    public List<SystemRouteItem> fetchSourceRouteItems() {
+    public @NonNull List<SystemRouteItem> fetchSourceRouteItems() {
         return mRouteItems;
     }
 
@@ -193,8 +189,7 @@
         mOnRoutesChangedListener.run();
     }
 
-    @NonNull
-    private SystemRouteItem createRouteItemFor(
+    private @NonNull SystemRouteItem createRouteItemFor(
             @NonNull MediaRoute2Info routeInfo,
             boolean isSelectedRoute,
             @Nullable Boolean wasTransferredBySelf,
@@ -224,8 +219,7 @@
         return builder.build();
     }
 
-    @NonNull
-    private String getHumanReadableSuitabilityStatus(@Nullable Integer status) {
+    private @NonNull String getHumanReadableSuitabilityStatus(@Nullable Integer status) {
         if (status == null) {
             // The route is not selected, or this Android version doesn't support suitability
             // status.
@@ -243,8 +237,7 @@
         }
     }
 
-    @NonNull
-    private String getHumanReadableTransferReason(@Nullable Integer transferReason) {
+    private @NonNull String getHumanReadableTransferReason(@Nullable Integer transferReason) {
         if (transferReason == null) {
             // The route is not selected, or this Android version doesn't support transfer reason.
             return null;
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouterSystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouterSystemRoutesSource.java
index 21d112f..bbcf097 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouterSystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouterSystemRoutesSource.java
@@ -20,22 +20,20 @@
 import android.media.MediaRouter;
 import android.text.TextUtils;
 
-import androidx.annotation.NonNull;
-
 import com.example.androidx.mediarouting.activities.systemrouting.SystemRouteItem;
 import com.example.androidx.mediarouting.activities.systemrouting.SystemRoutesSourceItem;
 
+import org.jspecify.annotations.NonNull;
+
 import java.util.ArrayList;
 import java.util.List;
 
 /** Implements {@link SystemRoutesSource} using {@link MediaRouter}. */
 public final class MediaRouterSystemRoutesSource extends SystemRoutesSource {
 
-    @NonNull
-    private final MediaRouter mMediaRouter;
+    private final @NonNull MediaRouter mMediaRouter;
 
-    @NonNull
-    private final MediaRouter.Callback mCallback =
+    private final MediaRouter.@NonNull Callback mCallback =
             new MediaRouter.SimpleCallback() {
                 @Override
                 public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo info) {
@@ -66,8 +64,7 @@
             };
 
     /** Returns a new instance. */
-    @NonNull
-    public static MediaRouterSystemRoutesSource create(@NonNull Context context) {
+    public static @NonNull MediaRouterSystemRoutesSource create(@NonNull Context context) {
         MediaRouter mediaRouter =
                 (MediaRouter) context.getSystemService(Context.MEDIA_ROUTER_SERVICE);
         return new MediaRouterSystemRoutesSource(mediaRouter);
@@ -87,15 +84,13 @@
         mMediaRouter.removeCallback(mCallback);
     }
 
-    @NonNull
     @Override
-    public SystemRoutesSourceItem getSourceItem() {
+    public @NonNull SystemRoutesSourceItem getSourceItem() {
         return new SystemRoutesSourceItem(/* name= */ "Legacy MediaRouter");
     }
 
-    @NonNull
     @Override
-    public List<SystemRouteItem> fetchSourceRouteItems() {
+    public @NonNull List<SystemRouteItem> fetchSourceRouteItems() {
         int count = mMediaRouter.getRouteCount();
 
         List<SystemRouteItem> out = new ArrayList<>();
@@ -126,9 +121,8 @@
         return false;
     }
 
-    @NonNull
-    private SystemRouteItem createRouteItemFor(
-            @NonNull MediaRouter.RouteInfo routeInfo, boolean isSelected) {
+    private @NonNull SystemRouteItem createRouteItemFor(
+            MediaRouter.@NonNull RouteInfo routeInfo, boolean isSelected) {
         SystemRouteItem.Builder builder =
                 new SystemRouteItem.Builder(getSourceId(), /* id= */ routeInfo.getName().toString())
                         .setName(routeInfo.getName().toString());
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/SystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/SystemRoutesSource.java
index bad6317..d6fe390 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/SystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/SystemRoutesSource.java
@@ -16,11 +16,11 @@
 
 package com.example.androidx.mediarouting.activities.systemrouting.source;
 
-import androidx.annotation.NonNull;
-
 import com.example.androidx.mediarouting.activities.systemrouting.SystemRouteItem;
 import com.example.androidx.mediarouting.activities.systemrouting.SystemRoutesSourceItem;
 
+import org.jspecify.annotations.NonNull;
+
 import java.util.List;
 
 /**
@@ -28,7 +28,7 @@
  */
 public abstract class SystemRoutesSource {
 
-    @NonNull protected Runnable mOnRoutesChangedListener = () -> {};
+    protected @NonNull Runnable mOnRoutesChangedListener = () -> {};
 
     /** Sets a {@link Runnable} to invoke whenever routes change. */
     public void setOnRoutesChangedListener(@NonNull Runnable onRoutesChangedListener) {
@@ -51,22 +51,19 @@
     }
 
     /** Returns a string that uniquely identifies this source. */
-    @NonNull
-    public final String getSourceId() {
+    public final @NonNull String getSourceId() {
         return getClass().getSimpleName();
     }
 
     /**
      * Gets a source item containing source type.
      */
-    @NonNull
-    public abstract SystemRoutesSourceItem getSourceItem();
+    public abstract @NonNull SystemRoutesSourceItem getSourceItem();
 
     /**
      * Fetches a list of {@link SystemRouteItem} discovered by this source.
      */
-    @NonNull
-    public abstract List<SystemRouteItem> fetchSourceRouteItems();
+    public abstract @NonNull List<SystemRouteItem> fetchSourceRouteItems();
 
     /**
      * Selects the route that corresponds to the given item.
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/MediaItem.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/MediaItem.java
index 40f1172..506c114 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/MediaItem.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/MediaItem.java
@@ -18,7 +18,7 @@
 
 import android.net.Uri;
 
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
 
 /**
  * MediaItem helps keep track of the media items before adding to playlist.
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/PlaylistItem.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/PlaylistItem.java
index c111b2f..a7cb608 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/PlaylistItem.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/PlaylistItem.java
@@ -20,9 +20,10 @@
 import android.net.Uri;
 import android.os.SystemClock;
 
-import androidx.annotation.NonNull;
 import androidx.mediarouter.media.MediaItemStatus;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * PlaylistItem helps keep track of the current status of an media item.
  */
@@ -87,38 +88,31 @@
         mContentDuration = duration;
     }
 
-    @NonNull
-    public String getSessionId() {
+    public @NonNull String getSessionId() {
         return mSessionId;
     }
 
-    @NonNull
-    public String getItemId() {
+    public @NonNull String getItemId() {
         return mItemId;
     }
 
-    @NonNull
-    public String getRemoteItemId() {
+    public @NonNull String getRemoteItemId() {
         return mRemoteItemId;
     }
 
-    @NonNull
-    public String getTitle() {
+    public @NonNull String getTitle() {
         return mTitle;
     }
 
-    @NonNull
-    public Uri getUri() {
+    public @NonNull Uri getUri() {
         return mUri;
     }
 
-    @NonNull
-    public String getMime() {
+    public @NonNull String getMime() {
         return mMime;
     }
 
-    @NonNull
-    public PendingIntent getUpdateReceiver() {
+    public @NonNull PendingIntent getUpdateReceiver() {
         return mUpdateReceiver;
     }
 
@@ -138,8 +132,7 @@
         return mTimestamp;
     }
 
-    @NonNull
-    public MediaItemStatus getStatus() {
+    public @NonNull MediaItemStatus getStatus() {
         return new MediaItemStatus.Builder(mPlaybackState)
                 .setContentPosition(mContentPosition)
                 .setContentDuration(mContentDuration)
@@ -147,9 +140,8 @@
                 .build();
     }
 
-    @NonNull
     @Override
-    public String toString() {
+    public @NonNull String toString() {
         String[] state = {
                 "PENDING",
                 "PLAYING",
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/RouteItem.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/RouteItem.java
index b093db9..6dc9c48 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/RouteItem.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/RouteItem.java
@@ -18,9 +18,10 @@
 
 import android.media.AudioManager;
 
-import androidx.annotation.NonNull;
 import androidx.mediarouter.media.MediaRouter;
 
+import org.jspecify.annotations.NonNull;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
@@ -88,8 +89,7 @@
     }
 
     /** Returns a deep copy of an existing {@link RouteItem}. */
-    @NonNull
-    public static RouteItem copyOf(@NonNull RouteItem routeItem) {
+    public static @NonNull RouteItem copyOf(@NonNull RouteItem routeItem) {
         return new RouteItem(
                 routeItem.getId(),
                 routeItem.getName(),
@@ -173,8 +173,7 @@
         }
     }
 
-    @NonNull
-    public String getId() {
+    public @NonNull String getId() {
         return mId;
     }
 
@@ -182,8 +181,7 @@
         mId = id;
     }
 
-    @NonNull
-    public String getName() {
+    public @NonNull String getName() {
         return mName;
     }
 
@@ -191,8 +189,7 @@
         mName = name;
     }
 
-    @NonNull
-    public String getDescription() {
+    public @NonNull String getDescription() {
         return mDescription;
     }
 
@@ -200,8 +197,7 @@
         mDescription = description;
     }
 
-    @NonNull
-    public ControlFilter getControlFilter() {
+    public @NonNull ControlFilter getControlFilter() {
         return mControlFilter;
     }
 
@@ -209,8 +205,7 @@
         mControlFilter = controlFilter;
     }
 
-    @NonNull
-    public PlaybackStream getPlaybackStream() {
+    public @NonNull PlaybackStream getPlaybackStream() {
         return mPlaybackStream;
     }
 
@@ -218,8 +213,7 @@
         mPlaybackStream = playbackStream;
     }
 
-    @NonNull
-    public PlaybackType getPlaybackType() {
+    public @NonNull PlaybackType getPlaybackType() {
         return mPlaybackType;
     }
 
@@ -235,8 +229,7 @@
         mCanDisconnect = canDisconnect;
     }
 
-    @NonNull
-    public VolumeHandling getVolumeHandling() {
+    public @NonNull VolumeHandling getVolumeHandling() {
         return mVolumeHandling;
     }
 
@@ -260,8 +253,7 @@
         mVolumeMax = volumeMax;
     }
 
-    @NonNull
-    public DeviceType getDeviceType() {
+    public @NonNull DeviceType getDeviceType() {
         return mDeviceType;
     }
 
@@ -269,8 +261,7 @@
         mDeviceType = deviceType;
     }
 
-    @NonNull
-    public List<String> getGroupMemberIds() {
+    public @NonNull List<String> getGroupMemberIds() {
         return mGroupMemberIds;
     }
 
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java
index 89456df..d65d346 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java
@@ -36,8 +36,6 @@
 import android.view.WindowManager;
 import android.widget.FrameLayout;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.mediarouter.media.MediaItemStatus;
 import androidx.mediarouter.media.MediaRouter.RouteInfo;
 
@@ -45,6 +43,9 @@
 import com.example.androidx.mediarouting.R;
 import com.example.androidx.mediarouting.data.PlaylistItem;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.io.IOException;
 
 /**
@@ -107,7 +108,7 @@
 
     // Player
     @Override
-    public void play(@NonNull final PlaylistItem item) {
+    public void play(final @NonNull PlaylistItem item) {
         if (DEBUG) {
             Log.d(TAG, "play: item=" + item);
         }
@@ -133,7 +134,7 @@
     }
 
     @Override
-    public void seek(@NonNull final PlaylistItem item) {
+    public void seek(final @NonNull PlaylistItem item) {
         if (DEBUG) {
             Log.d(TAG, "seek: item=" + item);
         }
@@ -151,7 +152,7 @@
 
     @Override
     public void getPlaylistItemStatus(
-            @NonNull final PlaylistItem item, final boolean shouldUpdate) {
+            final @NonNull PlaylistItem item, final boolean shouldUpdate) {
         if (mState == STATE_PLAYING || mState == STATE_PAUSED) {
             item.setDuration(mMediaPlayer.getDuration());
             item.setPosition(getCurrentPosition());
@@ -205,13 +206,12 @@
     }
 
     @Override
-    public void enqueue(@NonNull final PlaylistItem item) {
+    public void enqueue(final @NonNull PlaylistItem item) {
         throw new UnsupportedOperationException("LocalPlayer doesn't support enqueue!");
     }
 
-    @NonNull
     @Override
-    public PlaylistItem remove(@NonNull String iid) {
+    public @NonNull PlaylistItem remove(@NonNull String iid) {
         throw new UnsupportedOperationException("LocalPlayer doesn't support remove!");
     }
 
@@ -297,13 +297,11 @@
         });
     }
 
-    @NonNull
-    protected Context getContext() {
+    protected @NonNull Context getContext() {
         return mContext;
     }
 
-    @NonNull
-    protected MediaPlayer getMediaPlayer() {
+    protected @NonNull MediaPlayer getMediaPlayer() {
         return mMediaPlayer;
     }
 
@@ -657,9 +655,8 @@
             setSurface((SurfaceHolder) null);
         }
 
-        @Nullable
         @Override
-        public Bitmap getSnapshot() {
+        public @Nullable Bitmap getSnapshot() {
             if (getState() == STATE_PLAYING || getState() == STATE_PAUSED) {
                 return mOverlay.getSnapshot();
             }
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/Player.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/Player.java
index 8701350..033684d 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/Player.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/Player.java
@@ -39,8 +39,6 @@
 import android.widget.Toast;
 
 import androidx.annotation.CallSuper;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.core.app.ActivityCompat;
 import androidx.core.app.NotificationCompat;
@@ -51,6 +49,9 @@
 import com.example.androidx.mediarouting.R;
 import com.example.androidx.mediarouting.data.PlaylistItem;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Abstraction of common playback operations of media items, such as play,
  * seek, etc. Used by PlaybackManager as a backend to handle actual playback
@@ -77,15 +78,11 @@
     private static final PlaybackStateCompat INIT_PLAYBACK_STATE = new PlaybackStateCompat.Builder()
             .setState(PlaybackStateCompat.STATE_NONE, 0, .0f).build();
 
-    @NonNull
-    protected Context mContext;
-    @NonNull
-    protected Callback mCallback;
-    @NonNull
-    protected MediaSessionCompat mMediaSession;
+    protected @NonNull Context mContext;
+    protected @NonNull Callback mCallback;
+    protected @NonNull MediaSessionCompat mMediaSession;
 
-    @NonNull
-    protected String mNotificationChannelId;
+    protected @NonNull String mNotificationChannelId;
     private NotificationCompat.Action mPlayAction;
     private NotificationCompat.Action mPauseAction;
 
@@ -167,8 +164,7 @@
      * @param iid
      * @return
      */
-    @NonNull
-    public abstract PlaylistItem remove(@NonNull String iid);
+    public abstract @NonNull PlaylistItem remove(@NonNull String iid);
 
     /**
      * Takes player snapshot.
@@ -176,8 +172,7 @@
     public void takeSnapshot() {
     }
 
-    @Nullable
-    public Bitmap getSnapshot() {
+    public @Nullable Bitmap getSnapshot() {
         return null;
     }
 
@@ -195,8 +190,7 @@
      * Creates a {@link Player} for the given {@code route}, whose UI is hosted by the given {@code
      * activity}.
      */
-    @NonNull
-    public static Player createPlayerForActivity(
+    public static @NonNull Player createPlayerForActivity(
             @NonNull Activity activity,
             @NonNull RouteInfo route,
             @NonNull MediaSessionCompat session) {
@@ -214,8 +208,7 @@
     }
 
     /** Creates a {@link Player} for playback on an overlay. */
-    @NonNull
-    public static Player createPlayerForOverlay(@NonNull Context context) {
+    public static @NonNull Player createPlayerForOverlay(@NonNull Context context) {
         Player player = new LocalPlayer.OverlayPlayer(context);
         player.setPlayPauseNotificationAction();
         return player;
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/RemotePlayer.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/RemotePlayer.java
index 019ad8f..a7988b1 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/RemotePlayer.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/RemotePlayer.java
@@ -25,8 +25,6 @@
 import android.view.View;
 import android.widget.FrameLayout;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.mediarouter.media.MediaItemStatus;
 import androidx.mediarouter.media.MediaRouter.ControlRequestCallback;
@@ -44,6 +42,9 @@
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -328,9 +329,8 @@
         }
     }
 
-    @NonNull
     @Override
-    public PlaylistItem remove(@NonNull String itemId) {
+    public @NonNull PlaylistItem remove(@NonNull String itemId) {
         throwIfNoSession();
         throwIfQueuingUnsupported();
 
@@ -383,9 +383,8 @@
         }
     }
 
-    @NonNull
     @Override
-    public Bitmap getSnapshot() {
+    public @NonNull Bitmap getSnapshot() {
         return mSnapshot;
     }
 
@@ -393,8 +392,7 @@
      * Caches the remote state of the given playlist item and returns an updated copy through a
      * {@link ListenableFuture}.
      */
-    @NonNull
-    public ListenableFuture<PlaylistItem> cacheRemoteState(@NonNull PlaylistItem item) {
+    public @NonNull ListenableFuture<PlaylistItem> cacheRemoteState(@NonNull PlaylistItem item) {
         ListenableFuture<MediaItemStatus> remoteStatus = getRemoteItemStatus(item);
 
         return Futures.transform(
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleDynamicGroupMediaRouteProvider.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleDynamicGroupMediaRouteProvider.java
index a597796..758c965 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleDynamicGroupMediaRouteProvider.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleDynamicGroupMediaRouteProvider.java
@@ -24,8 +24,6 @@
 import android.media.MediaRouter;
 import android.util.Log;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.collection.ArrayMap;
 import androidx.mediarouter.media.MediaRouteDescriptor;
 import androidx.mediarouter.media.MediaRouteProvider;
@@ -38,6 +36,9 @@
 import com.example.androidx.mediarouting.data.RouteItem;
 import com.example.androidx.mediarouting.services.SampleDynamicGroupMediaRouteProviderService;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -63,9 +64,8 @@
         super(context);
     }
 
-    @Nullable
     @Override
-    public RouteController onCreateRouteController(@NonNull String routeId) {
+    public @Nullable RouteController onCreateRouteController(@NonNull String routeId) {
         if (!checkDrawOverlay()) return null;
 
         MediaRouteDescriptor routeDescriptor = mRouteDescriptors.get(routeId);
@@ -77,9 +77,8 @@
         return new SampleRouteController(routeId);
     }
 
-    @Nullable
     @Override
-    public RouteController onCreateRouteController(@NonNull String routeId,
+    public @Nullable RouteController onCreateRouteController(@NonNull String routeId,
             @NonNull String groupId) {
         // Handle a static group exceptionally
         if (groupId.equals(STATIC_GROUP_ROUTE_ID)) {
@@ -100,9 +99,8 @@
         return controller;
     }
 
-    @Nullable
     @Override
-    public DynamicGroupRouteController onCreateDynamicGroupRouteController(
+    public @Nullable DynamicGroupRouteController onCreateDynamicGroupRouteController(
             @NonNull String initialMemberRouteId) {
         if (!checkDrawOverlay()) return null;
 
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleMediaRouteProvider.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleMediaRouteProvider.java
index 7721f91..4be09b3 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleMediaRouteProvider.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleMediaRouteProvider.java
@@ -31,8 +31,6 @@
 import android.provider.Settings;
 import android.util.Log;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.collection.ArrayMap;
 import androidx.mediarouter.media.MediaControlIntent;
@@ -50,6 +48,9 @@
 import com.example.androidx.mediarouting.services.SampleMediaRouteProviderService;
 import com.example.androidx.mediarouting.session.SessionManager;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -160,10 +161,8 @@
         }
     }
 
-    @NonNull
-    protected Map<String, Integer> mVolumes = new ArrayMap<>();
-    @NonNull
-    protected Map<String, MediaRouteDescriptor> mRouteDescriptors = new HashMap<>();
+    protected @NonNull Map<String, Integer> mVolumes = new ArrayMap<>();
+    protected @NonNull Map<String, MediaRouteDescriptor> mRouteDescriptors = new HashMap<>();
 
     public SampleMediaRouteProvider(@NonNull Context context) {
         super(context);
@@ -171,9 +170,8 @@
         publishRoutes();
     }
 
-    @Nullable
     @Override
-    public RouteController onCreateRouteController(@NonNull String routeId) {
+    public @Nullable RouteController onCreateRouteController(@NonNull String routeId) {
         if (!checkDrawOverlay()) return null;
         return new SampleRouteController(routeId);
     }
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/WrapperMediaRouteProvider.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/WrapperMediaRouteProvider.java
index cbc870a..f02c38e 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/WrapperMediaRouteProvider.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/WrapperMediaRouteProvider.java
@@ -18,9 +18,10 @@
 
 import android.content.Context;
 
-import androidx.annotation.NonNull;
 import androidx.mediarouter.media.MediaRouteProvider;
 
+import org.jspecify.annotations.NonNull;
+
 public class WrapperMediaRouteProvider extends MediaRouteProvider {
     private static final String TAG = "WrapperMrp";
 
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleDynamicGroupMediaRouteProviderService.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleDynamicGroupMediaRouteProviderService.java
index abbfbf2..62c3852 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleDynamicGroupMediaRouteProviderService.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleDynamicGroupMediaRouteProviderService.java
@@ -20,13 +20,14 @@
 import android.os.Binder;
 import android.os.IBinder;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.mediarouter.media.MediaRouteProvider;
 import androidx.mediarouter.media.MediaRouteProviderService;
 
 import com.example.androidx.mediarouting.providers.SampleDynamicGroupMediaRouteProvider;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Demonstrates how to register a custom media route provider service
  * using the support library.
@@ -39,16 +40,14 @@
 
     private SampleDynamicGroupMediaRouteProvider mDynamicGroupMediaRouteProvider;
 
-    @NonNull
     @Override
-    public MediaRouteProvider onCreateMediaRouteProvider() {
+    public @NonNull MediaRouteProvider onCreateMediaRouteProvider() {
         mDynamicGroupMediaRouteProvider = new SampleDynamicGroupMediaRouteProvider(this);
         return mDynamicGroupMediaRouteProvider;
     }
 
-    @Nullable
     @Override
-    public IBinder onBind(@NonNull Intent intent) {
+    public @Nullable IBinder onBind(@NonNull Intent intent) {
         if (intent != null && ACTION_BIND_LOCAL.equals(intent.getAction())) {
             return new LocalBinder();
         } else {
@@ -75,8 +74,7 @@
      * bindings within the same process.
      */
     public class LocalBinder extends Binder {
-        @NonNull
-        public SampleDynamicGroupMediaRouteProviderService getService() {
+        public @NonNull SampleDynamicGroupMediaRouteProviderService getService() {
             return SampleDynamicGroupMediaRouteProviderService.this;
         }
     }
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleMediaRouteProviderService.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleMediaRouteProviderService.java
index 21c3e54..32acee4 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleMediaRouteProviderService.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleMediaRouteProviderService.java
@@ -16,12 +16,13 @@
 
 package com.example.androidx.mediarouting.services;
 
-import androidx.annotation.NonNull;
 import androidx.mediarouter.media.MediaRouteProvider;
 import androidx.mediarouter.media.MediaRouteProviderService;
 
 import com.example.androidx.mediarouting.providers.SampleMediaRouteProvider;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * Demonstrates how to register a custom media route provider service
  * using the support library.
@@ -29,9 +30,8 @@
  * @see SampleMediaRouteProvider
  */
 public class SampleMediaRouteProviderService extends MediaRouteProviderService {
-    @NonNull
     @Override
-    public MediaRouteProvider onCreateMediaRouteProvider() {
+    public @NonNull MediaRouteProvider onCreateMediaRouteProvider() {
         return new SampleMediaRouteProvider(this);
     }
 }
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/WrapperMediaRouteProviderService.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/WrapperMediaRouteProviderService.java
index 2895772..7da91bc 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/WrapperMediaRouteProviderService.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/WrapperMediaRouteProviderService.java
@@ -16,19 +16,19 @@
 
 package com.example.androidx.mediarouting.services;
 
-import androidx.annotation.NonNull;
 import androidx.mediarouter.media.MediaRouteProvider;
 import androidx.mediarouter.media.MediaRouteProviderService;
 
 import com.example.androidx.mediarouting.providers.WrapperMediaRouteProvider;
 
+import org.jspecify.annotations.NonNull;
+
 public class WrapperMediaRouteProviderService extends MediaRouteProviderService {
 
     private WrapperMediaRouteProvider mWrapperMediaRouteProvider;
 
-    @NonNull
     @Override
-    public MediaRouteProvider onCreateMediaRouteProvider() {
+    public @NonNull MediaRouteProvider onCreateMediaRouteProvider() {
         if (mWrapperMediaRouteProvider == null) {
             mWrapperMediaRouteProvider = new WrapperMediaRouteProvider(/* context= */ this);
         }
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/session/SessionManager.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/session/SessionManager.java
index 4b68110..bca2bb36 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/session/SessionManager.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/session/SessionManager.java
@@ -20,14 +20,15 @@
 import android.net.Uri;
 import android.util.Log;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.mediarouter.media.MediaItemStatus;
 import androidx.mediarouter.media.MediaSessionStatus;
 
 import com.example.androidx.mediarouting.data.PlaylistItem;
 import com.example.androidx.mediarouting.player.Player;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -67,19 +68,16 @@
         return mSessionValid;
     }
 
-    @Nullable
-    public String getSessionId() {
+    public @Nullable String getSessionId() {
         return mSessionValid ? Integer.toString(mSessionId) : null;
     }
 
-    @Nullable
-    public PlaylistItem getCurrentItem() {
+    public @Nullable PlaylistItem getCurrentItem() {
         return mPlaylist.isEmpty() ? null : mPlaylist.get(0);
     }
 
     // Returns the cached playlist (note this is not responsible for updating it)
-    @Nullable
-    public List<PlaylistItem> getPlaylist() {
+    public @Nullable List<PlaylistItem> getPlaylist() {
         return mPlaylist;
     }
 
@@ -118,16 +116,15 @@
     /**
      * Adds an item to the playlist.
      */
-    @NonNull
-    public PlaylistItem add(@NonNull String title, @NonNull Uri uri, @NonNull String mime) {
+    public @NonNull PlaylistItem add(@NonNull String title, @NonNull Uri uri,
+            @NonNull String mime) {
         return add(title, uri, mime, 0, null);
     }
 
     /**
      * Adds an item to the playlist.
      */
-    @NonNull
-    public PlaylistItem add(@NonNull String title, @NonNull Uri uri, @NonNull String mime,
+    public @NonNull PlaylistItem add(@NonNull String title, @NonNull Uri uri, @NonNull String mime,
             long startPosition, @Nullable PendingIntent receiver) {
         if (DEBUG) {
             log("add: title=" + title + ", uri=" + uri + ", receiver=" + receiver);
@@ -154,8 +151,7 @@
     /**
      * Removes an item from the playlist.
      */
-    @NonNull
-    public PlaylistItem remove(@NonNull String iid) {
+    public @NonNull PlaylistItem remove(@NonNull String iid) {
         if (DEBUG) {
             log("remove: iid=" + iid);
         }
@@ -166,8 +162,7 @@
     /**
      * Seeks a specific position for the current item.
      */
-    @NonNull
-    public PlaylistItem seek(@NonNull String iid, long pos) {
+    public @NonNull PlaylistItem seek(@NonNull String iid, long pos) {
         if (DEBUG) {
             log("seek: iid=" + iid + ", pos=" + pos);
         }
@@ -189,8 +184,7 @@
     /**
      * Returns the status for the current item.
      */
-    @NonNull
-    public PlaylistItem getStatus(@NonNull String iid) {
+    public @NonNull PlaylistItem getStatus(@NonNull String iid) {
         checkPlayerAndSession();
 
         // This should only be called for local player. Remote player is
@@ -261,8 +255,7 @@
     /**
      * Starts the current session.
      */
-    @Nullable
-    public String startSession() {
+    public @Nullable String startSession() {
         if (!mSessionValid) {
             mSessionId++;
             mItemId = 0;
@@ -307,8 +300,7 @@
     /**
      * Returns the current session status.
      */
-    @NonNull
-    public MediaSessionStatus getSessionStatus(@NonNull String sid) {
+    public @NonNull MediaSessionStatus getSessionStatus(@NonNull String sid) {
         int sessionState = (sid != null && sid.equals(Integer.toString(mSessionId)))
                 ? MediaSessionStatus.SESSION_STATE_ACTIVE
                 : MediaSessionStatus.SESSION_STATE_INVALIDATED;
@@ -493,9 +485,8 @@
         mCallback = callback;
     }
 
-    @NonNull
     @Override
-    public String toString() {
+    public @NonNull String toString() {
         String result = "Media Queue: ";
         if (!mPlaylist.isEmpty()) {
             for (PlaylistItem item : mPlaylist) {
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/LibraryAdapter.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/LibraryAdapter.java
index 33481f5..6be0261 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/LibraryAdapter.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/LibraryAdapter.java
@@ -24,13 +24,13 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
-
 import com.example.androidx.mediarouting.R;
 import com.example.androidx.mediarouting.activities.MainActivity;
 import com.example.androidx.mediarouting.data.MediaItem;
 import com.example.androidx.mediarouting.session.SessionManager;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * {@link ListView} {@link Adapter} for showing items before adding to the playlist.
  */
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/PlaylistAdapter.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/PlaylistAdapter.java
index b017bac..1ace89c 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/PlaylistAdapter.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/PlaylistAdapter.java
@@ -24,13 +24,13 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
-
 import com.example.androidx.mediarouting.R;
 import com.example.androidx.mediarouting.activities.MainActivity;
 import com.example.androidx.mediarouting.data.PlaylistItem;
 import com.example.androidx.mediarouting.session.SessionManager;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * {@link ListView} {@link Adapter} for showing items in the playlist listview.
  */
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/RoutesAdapter.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/RoutesAdapter.java
index bec91d6..9bf137f 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/RoutesAdapter.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/RoutesAdapter.java
@@ -22,12 +22,13 @@
 import android.widget.ImageButton;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.example.androidx.mediarouting.R;
 import com.example.androidx.mediarouting.data.RouteItem;
 
+import org.jspecify.annotations.NonNull;
+
 import java.util.List;
 
 /** {@link RecyclerView.Adapter} for showing routes in the settings screen */
@@ -42,9 +43,8 @@
         this.mRouteItemListener = routeItemListener;
     }
 
-    @NonNull
     @Override
-    public RouteViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+    public @NonNull RouteViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
         View view =
                 LayoutInflater.from(parent.getContext())
                         .inflate(R.layout.route_item, parent, false);
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/UiUtils.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/UiUtils.java
index 7d3ff97..dc293fb 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/UiUtils.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/UiUtils.java
@@ -21,9 +21,10 @@
 import android.widget.ArrayAdapter;
 import android.widget.Spinner;
 
-import androidx.annotation.NonNull;
 import androidx.core.util.Consumer;
 
+import org.jspecify.annotations.NonNull;
+
 /** Contains utility methods related to UI management. */
 public final class UiUtils {
 
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/util/Utils.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/util/Utils.java
index 03c9f8b..ee258f9 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/util/Utils.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/util/Utils.java
@@ -21,11 +21,11 @@
 import android.content.pm.PackageManager;
 import android.util.Log;
 
-import androidx.annotation.NonNull;
-
 import com.example.androidx.mediarouting.services.SampleMediaRouteProviderService;
 import com.example.androidx.mediarouting.services.WrapperMediaRouteProviderService;
 
+import org.jspecify.annotations.NonNull;
+
 public class Utils {
     private static final String TAG = "Utils";
 
diff --git a/versionedparcelable/versionedparcelable/build.gradle b/versionedparcelable/versionedparcelable/build.gradle
index abf8f79..a639726 100644
--- a/versionedparcelable/versionedparcelable/build.gradle
+++ b/versionedparcelable/versionedparcelable/build.gradle
@@ -30,6 +30,7 @@
 }
 
 dependencies {
+    api(libs.jspecify)
     api("androidx.annotation:annotation:1.8.1")
     implementation("androidx.collection:collection:1.4.2")
 
diff --git a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelField.java b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelField.java
index 0732df3..00510ad 100644
--- a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelField.java
+++ b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelField.java
@@ -16,9 +16,10 @@
 
 package androidx.versionedparcelable;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -36,6 +37,5 @@
     /**
      * Specifies the default value of this field.
      */
-    @NonNull
-    String defaultValue() default "";
+    @NonNull String defaultValue() default "";
 }
diff --git a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelImpl.java b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelImpl.java
index 7bec846..28eb96f 100644
--- a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelImpl.java
+++ b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelImpl.java
@@ -20,18 +20,18 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY)
 @SuppressLint("BanParcelableUsage")
 public class ParcelImpl implements Parcelable {
 
-    @Nullable
-    private final VersionedParcelable mParcel;
+    private final @Nullable VersionedParcelable mParcel;
 
     public ParcelImpl(@Nullable VersionedParcelable parcel) {
         mParcel = parcel;
@@ -44,8 +44,7 @@
     /**
      */
     @SuppressWarnings({"TypeParameterUnusedInFormals", "unchecked"})
-    @Nullable
-    public <T extends VersionedParcelable> T getVersionedParcel() {
+    public <T extends VersionedParcelable> @Nullable T getVersionedParcel() {
         return (T) mParcel;
     }
 
@@ -62,14 +61,12 @@
 
     public static final Creator<ParcelImpl> CREATOR = new Creator<ParcelImpl>() {
         @Override
-        @NonNull
-        public ParcelImpl createFromParcel(@NonNull Parcel in) {
+        public @NonNull ParcelImpl createFromParcel(@NonNull Parcel in) {
             return new ParcelImpl(in);
         }
 
         @Override
-        @NonNull
-        public ParcelImpl[] newArray(int size) {
+        public ParcelImpl @NonNull [] newArray(int size) {
             return new ParcelImpl[size];
         }
     };
diff --git a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelUtils.java b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelUtils.java
index 59acea2..e5b1640 100644
--- a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelUtils.java
+++ b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelUtils.java
@@ -21,10 +21,11 @@
 import android.os.Bundle;
 import android.os.Parcelable;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
@@ -35,8 +36,7 @@
  */
 public class ParcelUtils {
 
-    @NonNull
-    private static final String INNER_BUNDLE_KEY = "a";
+    private static final @NonNull String INNER_BUNDLE_KEY = "a";
 
     private ParcelUtils() { }
 
@@ -44,8 +44,7 @@
      * Turn a VersionedParcelable into a Parcelable
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    @NonNull
-    public static Parcelable toParcelable(@Nullable VersionedParcelable obj) {
+    public static @NonNull Parcelable toParcelable(@Nullable VersionedParcelable obj) {
         return new ParcelImpl(obj);
     }
 
@@ -54,8 +53,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @SuppressWarnings("TypeParameterUnusedInFormals")
-    @Nullable
-    public static <T extends VersionedParcelable> T fromParcelable(
+    public static <T extends VersionedParcelable> @Nullable T fromParcelable(
             @NonNull Parcelable p
     ) {
         if (!(p instanceof ParcelImpl)) {
@@ -82,8 +80,8 @@
      */
     @SuppressWarnings("TypeParameterUnusedInFormals")
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    @Nullable
-    public static <T extends VersionedParcelable> T fromInputStream(@NonNull InputStream input) {
+    public static <T extends VersionedParcelable> @Nullable T fromInputStream(
+            @NonNull InputStream input) {
         VersionedParcelStream stream = new VersionedParcelStream(input, null);
         return stream.readVersionedParcelable();
     }
@@ -107,9 +105,8 @@
      *
      * Returns null if the bundle isn't present or ClassLoader issues occur.
      */
-    @Nullable
     @SuppressWarnings({"TypeParameterUnusedInFormals", "deprecation"})
-    public static <T extends VersionedParcelable> T getVersionedParcelable(
+    public static <T extends VersionedParcelable> @Nullable T getVersionedParcelable(
             @NonNull Bundle bundle, @NonNull String key) {
         try {
             Bundle innerBundle = bundle.getParcelable(key);
@@ -144,8 +141,7 @@
      * Returns an empty list if the bundle isn't present or ClassLoader issues occur.
      */
     @SuppressWarnings({"TypeParameterUnusedInFormals", "unchecked", "deprecation"})
-    @NonNull
-    public static <T extends VersionedParcelable> List<T> getVersionedParcelableList(
+    public static <T extends VersionedParcelable> @NonNull List<T> getVersionedParcelableList(
             @NonNull Bundle bundle,
             @Nullable String key
     ) {
diff --git a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcel.java b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcel.java
index b796da3..809c0ab 100644
--- a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcel.java
+++ b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcel.java
@@ -29,14 +29,15 @@
 import android.util.SizeF;
 import android.util.SparseBooleanArray;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.collection.ArrayMap;
 import androidx.collection.ArraySet;
 import androidx.collection.SimpleArrayMap;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -57,8 +58,7 @@
 @RestrictTo(LIBRARY_GROUP_PREFIX)
 public abstract class VersionedParcel {
 
-    @NonNull
-    private static final String TAG = "VersionedParcel";
+    private static final @NonNull String TAG = "VersionedParcel";
 
     // These constants cannot change once shipped.
     private static final int EX_SECURITY = -1;
@@ -78,12 +78,9 @@
     private static final int TYPE_INTEGER = 7;
     private static final int TYPE_FLOAT = 8;
 
-    @NonNull
-    final SimpleArrayMap<String, Method> mReadCache;
-    @NonNull
-    final SimpleArrayMap<String, Method> mWriteCache;
-    @NonNull
-    final SimpleArrayMap<String, Class<?>> mParcelizerCache;
+    final @NonNull SimpleArrayMap<String, Method> mReadCache;
+    final @NonNull SimpleArrayMap<String, Method> mWriteCache;
+    final @NonNull SimpleArrayMap<String, Class<?>> mParcelizerCache;
 
     VersionedParcel(
             @NonNull SimpleArrayMap<String, Method> readCache,
@@ -110,15 +107,14 @@
     /**
      * Create a sub-parcel to be used for a child VersionedParcelable
      */
-    @NonNull
-    protected abstract VersionedParcel createSubParcel();
+    protected abstract @NonNull VersionedParcel createSubParcel();
 
     /**
      * Write a byte array into the parcel.
      *
      * @param b Bytes to place into the parcel.
      */
-    protected abstract void writeByteArray(@Nullable byte[] b);
+    protected abstract void writeByteArray(byte @Nullable [] b);
 
     /**
      * Write a byte array into the parcel.
@@ -127,7 +123,7 @@
      * @param offset Index of first byte to be written.
      * @param len    Number of bytes to write.
      */
-    protected abstract void writeByteArray(@Nullable byte[] b, int offset, int len);
+    protected abstract void writeByteArray(byte @Nullable [] b, int offset, int len);
 
     /**
      * Write a CharSequence into the parcel.
@@ -222,40 +218,34 @@
     /**
      * Read a string value from the parcel at the current dataPosition().
      */
-    @Nullable
-    protected abstract String readString();
+    protected abstract @Nullable String readString();
 
     /**
      * Read an object from the parcel at the current dataPosition().
      */
-    @Nullable
-    protected abstract IBinder readStrongBinder();
+    protected abstract @Nullable IBinder readStrongBinder();
 
     /**
      * Read a byte[] object from the parcel.
      */
-    @Nullable
-    protected abstract byte[] readByteArray();
+    protected abstract byte @Nullable [] readByteArray();
 
     /**
      * Read a CharSequence from the parcel
      */
-    @Nullable
-    protected abstract CharSequence readCharSequence();
+    protected abstract @Nullable CharSequence readCharSequence();
 
     /**
      */
     @SuppressWarnings({"unchecked", "TypeParameterUnusedInFormals"})
-    @Nullable
-    protected abstract <T extends Parcelable> T readParcelable();
+    protected abstract <T extends Parcelable> @Nullable T readParcelable();
 
     /**
      * Read and return a new Bundle object from the parcel at the current
      * dataPosition().  Returns null if the previously written Bundle object was
      * null.
      */
-    @Nullable
-    protected abstract Bundle readBundle();
+    protected abstract @Nullable Bundle readBundle();
 
     /**
      * Read a boolean value from the parcel at the current dataPosition().
@@ -313,7 +303,7 @@
      *
      * @param b Bytes to place into the parcel.
      */
-    public void writeByteArray(@Nullable byte[] b, int fieldId) {
+    public void writeByteArray(byte @Nullable [] b, int fieldId) {
         setOutputField(fieldId);
         writeByteArray(b);
     }
@@ -325,7 +315,7 @@
      * @param offset Index of first byte to be written.
      * @param len    Number of bytes to write.
      */
-    public void writeByteArray(@Nullable byte[] b, int offset, int len, int fieldId) {
+    public void writeByteArray(byte @Nullable [] b, int offset, int len, int fieldId) {
         setOutputField(fieldId);
         writeByteArray(b, offset, len);
     }
@@ -460,8 +450,7 @@
     /**
      * Read a string value from the parcel at the current dataPosition().
      */
-    @Nullable
-    public String readString(@Nullable String def, int fieldId) {
+    public @Nullable String readString(@Nullable String def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -471,8 +460,7 @@
     /**
      * Read an object from the parcel at the current dataPosition().
      */
-    @Nullable
-    public IBinder readStrongBinder(@Nullable IBinder def, int fieldId) {
+    public @Nullable IBinder readStrongBinder(@Nullable IBinder def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -483,8 +471,7 @@
      * Read a byte[] object from the parcel and copy it into the
      * given byte array.
      */
-    @Nullable
-    public byte[] readByteArray(@Nullable byte[] def, int fieldId) {
+    public byte @Nullable [] readByteArray(byte @Nullable [] def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -493,8 +480,7 @@
 
     /**
      */
-    @Nullable
-    public <T extends Parcelable> T readParcelable(@Nullable T def, int fieldId) {
+    public <T extends Parcelable> @Nullable T readParcelable(@Nullable T def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -506,8 +492,7 @@
      * dataPosition().  Returns null if the previously written Bundle object was
      * null.
      */
-    @Nullable
-    public Bundle readBundle(@Nullable Bundle def, int fieldId) {
+    public @Nullable Bundle readBundle(@Nullable Bundle def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -563,14 +548,14 @@
 
     /**
      */
-    public void writeBooleanArray(@Nullable boolean[] val, int fieldId) {
+    public void writeBooleanArray(boolean @Nullable [] val, int fieldId) {
         setOutputField(fieldId);
         writeBooleanArray(val);
     }
 
     /**
      */
-    protected void writeBooleanArray(@Nullable boolean[] val) {
+    protected void writeBooleanArray(boolean @Nullable [] val) {
         if (val != null) {
             int n = val.length;
             writeInt(n);
@@ -584,8 +569,7 @@
 
     /**
      */
-    @Nullable
-    public boolean[] readBooleanArray(@Nullable boolean[] def, int fieldId) {
+    public boolean @Nullable [] readBooleanArray(boolean @Nullable [] def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -594,8 +578,7 @@
 
     /**
      */
-    @Nullable
-    protected boolean[] readBooleanArray() {
+    protected boolean @Nullable [] readBooleanArray() {
         int n = readInt();
         if (n < 0) {
             return null;
@@ -609,7 +592,7 @@
 
     /**
      */
-    public void writeCharArray(@Nullable char[] val, int fieldId) {
+    public void writeCharArray(char @Nullable [] val, int fieldId) {
         setOutputField(fieldId);
         if (val != null) {
             int n = val.length;
@@ -624,8 +607,7 @@
 
     /**
      */
-    @Nullable
-    public CharSequence readCharSequence(@Nullable CharSequence def, int fieldId) {
+    public @Nullable CharSequence readCharSequence(@Nullable CharSequence def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -634,8 +616,7 @@
 
     /**
      */
-    @Nullable
-    public char[] readCharArray(@Nullable char[] def, int fieldId) {
+    public char @Nullable [] readCharArray(char @Nullable [] def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -652,14 +633,14 @@
 
     /**
      */
-    public void writeIntArray(@Nullable int[] val, int fieldId) {
+    public void writeIntArray(int @Nullable [] val, int fieldId) {
         setOutputField(fieldId);
         writeIntArray(val);
     }
 
     /**
      */
-    protected void writeIntArray(@Nullable int[] val) {
+    protected void writeIntArray(int @Nullable [] val) {
         if (val != null) {
             int n = val.length;
             writeInt(n);
@@ -673,8 +654,7 @@
 
     /**
      */
-    @Nullable
-    public int[] readIntArray(@Nullable int[] def, int fieldId) {
+    public int @Nullable [] readIntArray(int @Nullable [] def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -683,8 +663,7 @@
 
     /**
      */
-    @Nullable
-    protected int[] readIntArray() {
+    protected int @Nullable [] readIntArray() {
         int n = readInt();
         if (n < 0) {
             return null;
@@ -698,14 +677,14 @@
 
     /**
      */
-    public void writeLongArray(@Nullable long[] val, int fieldId) {
+    public void writeLongArray(long @Nullable [] val, int fieldId) {
         setOutputField(fieldId);
         writeLongArray(val);
     }
 
     /**
      */
-    protected void writeLongArray(@Nullable long[] val) {
+    protected void writeLongArray(long @Nullable [] val) {
         if (val != null) {
             int n = val.length;
             writeInt(n);
@@ -719,8 +698,7 @@
 
     /**
      */
-    @Nullable
-    public long[] readLongArray(@Nullable long[] def, int fieldId) {
+    public long @Nullable [] readLongArray(long @Nullable [] def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -729,8 +707,7 @@
 
     /**
      */
-    @Nullable
-    protected long[] readLongArray() {
+    protected long @Nullable [] readLongArray() {
         int n = readInt();
         if (n < 0) {
             return null;
@@ -744,14 +721,14 @@
 
     /**
      */
-    public void writeFloatArray(@Nullable float[] val, int fieldId) {
+    public void writeFloatArray(float @Nullable [] val, int fieldId) {
         setOutputField(fieldId);
         writeFloatArray(val);
     }
 
     /**
      */
-    protected void writeFloatArray(@Nullable float[] val) {
+    protected void writeFloatArray(float @Nullable [] val) {
         if (val != null) {
             int n = val.length;
             writeInt(n);
@@ -765,8 +742,7 @@
 
     /**
      */
-    @Nullable
-    public float[] readFloatArray(@Nullable float[] def, int fieldId) {
+    public float @Nullable [] readFloatArray(float @Nullable [] def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -775,8 +751,7 @@
 
     /**
      */
-    @Nullable
-    protected float[] readFloatArray() {
+    protected float @Nullable [] readFloatArray() {
         int n = readInt();
         if (n < 0) {
             return null;
@@ -790,14 +765,14 @@
 
     /**
      */
-    public void writeDoubleArray(@Nullable double[] val, int fieldId) {
+    public void writeDoubleArray(double @Nullable [] val, int fieldId) {
         setOutputField(fieldId);
         writeDoubleArray(val);
     }
 
     /**
      */
-    protected void writeDoubleArray(@Nullable double[] val) {
+    protected void writeDoubleArray(double @Nullable [] val) {
         if (val != null) {
             int n = val.length;
             writeInt(n);
@@ -811,8 +786,7 @@
 
     /**
      */
-    @Nullable
-    public double[] readDoubleArray(@Nullable double[] def, int fieldId) {
+    public double @Nullable [] readDoubleArray(double @Nullable [] def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -821,8 +795,7 @@
 
     /**
      */
-    @Nullable
-    protected double[] readDoubleArray() {
+    protected double @Nullable [] readDoubleArray() {
         int n = readInt();
         if (n < 0) {
             return null;
@@ -959,14 +932,14 @@
      * @see #readList
      * @see VersionedParcelable
      */
-    public <T> void writeArray(@Nullable T[] val, int fieldId) {
+    public <T> void writeArray(T @Nullable [] val, int fieldId) {
         setOutputField(fieldId);
         writeArray(val);
     }
 
     /**
      */
-    protected <T> void writeArray(@Nullable T[] val) {
+    protected <T> void writeArray(T @Nullable [] val) {
         if (val == null) {
             writeInt(-1);
             return;
@@ -1188,8 +1161,7 @@
      * @see #writeException
      * @see #writeNoException
      */
-    @Nullable
-    public Exception readException(@Nullable Exception def, int fieldId) {
+    public @Nullable Exception readException(@Nullable Exception def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -1220,8 +1192,7 @@
     /**
      * Gets the root {@link Throwable#getCause() cause} of {@code t}
      */
-    @NonNull
-    protected static Throwable getRootCause(@NonNull Throwable t) {
+    protected static @NonNull Throwable getRootCause(@NonNull Throwable t) {
         while (t.getCause() != null) t = t.getCause();
         return t;
     }
@@ -1232,8 +1203,7 @@
      * @param code Used to determine which exception class to throw.
      * @param msg  The exception message.
      */
-    @NonNull
-    private Exception createException(int code, String msg) {
+    private @NonNull Exception createException(int code, String msg) {
         switch (code) {
             case EX_PARCELABLE:
                 return (Exception) readParcelable();
@@ -1270,8 +1240,7 @@
      * Read a Size from the parcel at the current dataPosition().
      */
     @RequiresApi(21)
-    @Nullable
-    public Size readSize(@Nullable Size def, int fieldId) {
+    public @Nullable Size readSize(@Nullable Size def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -1282,8 +1251,7 @@
      * Read a SizeF from the parcel at the current dataPosition().
      */
     @RequiresApi(21)
-    @Nullable
-    public SizeF readSizeF(@Nullable SizeF def, int fieldId) {
+    public @Nullable SizeF readSizeF(@Nullable SizeF def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -1295,8 +1263,7 @@
      * dataPosition().  Returns null if the previously written list object was
      * null.
      */
-    @Nullable
-    public SparseBooleanArray readSparseBooleanArray(
+    public @Nullable SparseBooleanArray readSparseBooleanArray(
             @Nullable SparseBooleanArray def,
             int fieldId
     ) {
@@ -1328,8 +1295,7 @@
      * as those that were previously written.
      * @see #writeSet
      */
-    @Nullable
-    public <T> Set<T> readSet(@Nullable Set<T> def, int fieldId) {
+    public <T> @Nullable Set<T> readSet(@Nullable Set<T> def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -1348,8 +1314,7 @@
      * as those that were previously written.
      * @see #writeList
      */
-    @Nullable
-    public <T> List<T> readList(@Nullable List<T> def, int fieldId) {
+    public <T> @Nullable List<T> readList(@Nullable List<T> def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -1357,8 +1322,7 @@
     }
 
     @SuppressWarnings("unchecked")
-    @Nullable
-    private <T, S extends Collection<T>> S readCollection(@NonNull S list) {
+    private <T, S extends Collection<T>> @Nullable S readCollection(@NonNull S list) {
         int n = readInt();
         if (n < 0) {
             return null;
@@ -1415,8 +1379,7 @@
      * as those that were previously written.
      * @see #writeMap
      */
-    @Nullable
-    public <K, V> Map<K, V> readMap(@Nullable Map<K, V> def, int fieldId) {
+    public <K, V> @Nullable Map<K, V> readMap(@Nullable Map<K, V> def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -1450,8 +1413,7 @@
      * as those that were previously written.
      * @see #writeArray
      */
-    @Nullable
-    public <T> T[] readArray(@Nullable T[] def, int fieldId) {
+    public <T> T @Nullable [] readArray(T @Nullable [] def, int fieldId) {
         if (!readField(fieldId)) {
             return def;
         }
@@ -1461,8 +1423,7 @@
     /**
      */
     @SuppressWarnings("unchecked")
-    @Nullable
-    protected <T> T[] readArray(@Nullable T[] def) {
+    protected <T> T @Nullable [] readArray(T @Nullable [] def) {
         int n = readInt();
         if (n < 0) {
             return null;
@@ -1511,8 +1472,7 @@
 
     /**
      */
-    @Nullable
-    public <T extends VersionedParcelable> T readVersionedParcelable(
+    public <T extends VersionedParcelable> @Nullable T readVersionedParcelable(
             @Nullable T def,
             int fieldId
     ) {
@@ -1531,8 +1491,7 @@
      *                                was an error trying to instantiate the VersionedParcelable.
      */
     @SuppressWarnings("TypeParameterUnusedInFormals")
-    @Nullable
-    protected <T extends VersionedParcelable> T readVersionedParcelable() {
+    protected <T extends VersionedParcelable> @Nullable T readVersionedParcelable() {
         String name = readString();
         if (name == null) {
             return null;
@@ -1546,8 +1505,7 @@
      * @return the Serializable object, or null if the Serializable name
      * wasn't found in the parcel.
      */
-    @Nullable
-    protected Serializable readSerializable() {
+    protected @Nullable Serializable readSerializable() {
         String name = readString();
         if (name == null) {
             // For some reason we were unable to read the name of the Serializable (either there
@@ -1585,8 +1543,7 @@
     /**
      */
     @SuppressWarnings({"unchecked", "TypeParameterUnusedInFormals"})
-    @NonNull
-    protected <T extends VersionedParcelable> T readFromParcel(
+    protected <T extends VersionedParcelable> @NonNull T readFromParcel(
             @NonNull String parcelCls,
             @NonNull VersionedParcel versionedParcel
     ) {
@@ -1638,8 +1595,7 @@
         }
     }
 
-    @NonNull
-    private Method getReadMethod(@NonNull String parcelCls) throws IllegalAccessException,
+    private @NonNull Method getReadMethod(@NonNull String parcelCls) throws IllegalAccessException,
             NoSuchMethodException, ClassNotFoundException {
         Method m = mReadCache.get(parcelCls);
         if (m == null) {
@@ -1650,8 +1606,7 @@
         return m;
     }
 
-    @NonNull
-    private Method getWriteMethod(@NonNull Class<?> baseCls) throws IllegalAccessException,
+    private @NonNull Method getWriteMethod(@NonNull Class<?> baseCls) throws IllegalAccessException,
             NoSuchMethodException, ClassNotFoundException {
         Method m = mWriteCache.get(baseCls.getName());
         if (m == null) {
@@ -1662,8 +1617,7 @@
         return m;
     }
 
-    @NonNull
-    private Class<?> findParcelClass(@NonNull Class<?> cls)
+    private @NonNull Class<?> findParcelClass(@NonNull Class<?> cls)
             throws ClassNotFoundException {
         Class<?> ret = mParcelizerCache.get(cls.getName());
         if (ret == null) {
@@ -1701,8 +1655,7 @@
             }
         }
 
-        @Nullable
-        static Size readSize(@NonNull VersionedParcel self) {
+        static @Nullable Size readSize(@NonNull VersionedParcel self) {
             if (self.readBoolean()) {
                 int width = self.readInt();
                 int height = self.readInt();
@@ -1711,8 +1664,7 @@
             return null;
         }
 
-        @Nullable
-        static SizeF readSizeF(@NonNull VersionedParcel self) {
+        static @Nullable SizeF readSizeF(@NonNull VersionedParcel self) {
             if (self.readBoolean()) {
                 float width = self.readFloat();
                 float height = self.readFloat();
diff --git a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelParcel.java b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelParcel.java
index 5b40c60..a7f9b13 100644
--- a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelParcel.java
+++ b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelParcel.java
@@ -25,11 +25,12 @@
 import android.util.Log;
 import android.util.SparseIntArray;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.collection.SimpleArrayMap;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.reflect.Method;
 
 /**
@@ -37,17 +38,13 @@
 @RestrictTo(RestrictTo.Scope.LIBRARY)
 class VersionedParcelParcel extends VersionedParcel {
     private static final boolean DEBUG = false;
-    @NonNull
-    private static final String TAG = "VersionedParcelParcel";
+    private static final @NonNull String TAG = "VersionedParcelParcel";
 
-    @NonNull
-    private final SparseIntArray mPositionLookup = new SparseIntArray();
-    @NonNull
-    private final Parcel mParcel;
+    private final @NonNull SparseIntArray mPositionLookup = new SparseIntArray();
+    private final @NonNull Parcel mParcel;
     private final int mOffset;
     private final int mEnd;
-    @NonNull
-    private final String mPrefix;
+    private final @NonNull String mPrefix;
     private int mCurrentField = -1;
     private int mNextRead = 0;
     private int mFieldId = -1;
@@ -206,8 +203,7 @@
     }
 
     @Override
-    @Nullable
-    protected CharSequence readCharSequence() {
+    protected @Nullable CharSequence readCharSequence() {
         return TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(mParcel);
     }
 
@@ -232,20 +228,17 @@
     }
 
     @Override
-    @Nullable
-    public String readString() {
+    public @Nullable String readString() {
         return mParcel.readString();
     }
 
     @Override
-    @Nullable
-    public IBinder readStrongBinder() {
+    public @Nullable IBinder readStrongBinder() {
         return mParcel.readStrongBinder();
     }
 
     @Override
-    @Nullable
-    public byte[] readByteArray() {
+    public byte @Nullable [] readByteArray() {
         int len = mParcel.readInt();
         if (len < 0) {
             return null;
@@ -257,14 +250,12 @@
 
     @Override
     @SuppressWarnings({"TypeParameterUnusedInFormals", "deprecation"})
-    @Nullable
-    public <T extends Parcelable> T readParcelable() {
+    public <T extends Parcelable> @Nullable T readParcelable() {
         return mParcel.readParcelable(getClass().getClassLoader());
     }
 
     @Override
-    @Nullable
-    public Bundle readBundle() {
+    public @Nullable Bundle readBundle() {
         return mParcel.readBundle(getClass().getClassLoader());
     }
 
diff --git a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelStream.java b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelStream.java
index 4b0a20c..5c1edaf 100644
--- a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelStream.java
+++ b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelStream.java
@@ -21,11 +21,12 @@
 import android.os.IInterface;
 import android.os.Parcelable;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.collection.SimpleArrayMap;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
@@ -42,8 +43,7 @@
 @RestrictTo(RestrictTo.Scope.LIBRARY)
 class VersionedParcelStream extends VersionedParcel {
 
-    @NonNull
-    private static final Charset UTF_16 = Charset.forName("UTF-16");
+    private static final @NonNull Charset UTF_16 = Charset.forName("UTF-16");
 
     // Supported types held inside a bundle. These cannot be added to or changed once shipped.
     private static final int TYPE_NULL = 0;
@@ -62,17 +62,12 @@
     private static final int TYPE_FLOAT = 13;
     private static final int TYPE_FLOAT_ARRAY = 14;
 
-    @Nullable
-    private final DataInputStream mMasterInput;
-    @Nullable
-    private final DataOutputStream mMasterOutput;
+    private final @Nullable DataInputStream mMasterInput;
+    private final @Nullable DataOutputStream mMasterOutput;
 
-    @Nullable
-    private DataInputStream mCurrentInput;
-    @Nullable
-    private DataOutputStream mCurrentOutput;
-    @Nullable
-    private FieldBuffer mFieldBuffer;
+    private @Nullable DataInputStream mCurrentInput;
+    private @Nullable DataOutputStream mCurrentOutput;
+    private @Nullable FieldBuffer mFieldBuffer;
     private boolean mIgnoreParcelables;
 
     int mCount = 0;
@@ -204,7 +199,7 @@
     }
 
     @Override
-    public void writeByteArray(@Nullable byte[] b) {
+    public void writeByteArray(byte @Nullable [] b) {
         try {
             if (b != null) {
                 mCurrentOutput.writeInt(b.length);
@@ -218,7 +213,7 @@
     }
 
     @Override
-    public void writeByteArray(@Nullable byte[] b, int offset, int len) {
+    public void writeByteArray(byte @Nullable [] b, int offset, int len) {
         try {
             if (b != null) {
                 mCurrentOutput.writeInt(len);
@@ -323,15 +318,13 @@
     }
 
     @Override
-    @Nullable
-    public IBinder readStrongBinder() {
+    public @Nullable IBinder readStrongBinder() {
         return null;
     }
 
     @Override
     @SuppressWarnings("TypeParameterUnusedInFormals")
-    @Nullable
-    public <T extends Parcelable> T readParcelable() {
+    public <T extends Parcelable> @Nullable T readParcelable() {
         return null;
     }
 
@@ -372,8 +365,7 @@
     }
 
     @Override
-    @Nullable
-    public String readString() {
+    public @Nullable String readString() {
         try {
             int len = mCurrentInput.readInt();
             if (len > 0) {
@@ -389,8 +381,7 @@
     }
 
     @Override
-    @Nullable
-    public byte[] readByteArray() {
+    public byte @Nullable [] readByteArray() {
         try {
             int len = mCurrentInput.readInt();
             if (len > 0) {
@@ -406,8 +397,7 @@
     }
 
     @Override
-    @Nullable
-    protected CharSequence readCharSequence() {
+    protected @Nullable CharSequence readCharSequence() {
         return null;
     }
 
@@ -441,8 +431,7 @@
     }
 
     @Override
-    @Nullable
-    public Bundle readBundle() {
+    public @Nullable Bundle readBundle() {
         int size = readInt();
         if (size < 0) {
             return null;
@@ -558,13 +547,10 @@
     // TODO: Use less buffers
     private static class FieldBuffer {
 
-        @NonNull
-        final ByteArrayOutputStream mOutput = new ByteArrayOutputStream();
-        @NonNull
-        final DataOutputStream mDataStream = new DataOutputStream(mOutput);
+        final @NonNull ByteArrayOutputStream mOutput = new ByteArrayOutputStream();
+        final @NonNull DataOutputStream mDataStream = new DataOutputStream(mOutput);
         private final int mFieldId;
-        @NonNull
-        private final DataOutputStream mTarget;
+        private final @NonNull DataOutputStream mTarget;
 
         FieldBuffer(int fieldId, @NonNull DataOutputStream target) {
             mFieldId = fieldId;
diff --git a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelize.java b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelize.java
index c0edf43..e0427ce 100644
--- a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelize.java
+++ b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelize.java
@@ -22,9 +22,10 @@
 import android.os.IInterface;
 import android.os.Parcelable;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.lang.annotation.ElementType;
@@ -74,21 +75,18 @@
      * This can be filled with any ids that used to be contained within this VersionedParcelable,
      * but are no longer present. Ids listed here cannot be used by any fields within this class.
      */
-    @NonNull
-    int[] deprecatedIds() default {};
+    int @NonNull [] deprecatedIds() default {};
 
     /**
      * An alternate classname to also generate serialization for to support jetifier androidx
      * migration.
      */
-    @NonNull
-    String jetifyAs() default "";
+    @NonNull String jetifyAs() default "";
 
     /**
      * Specifies a class to use to get objects for instantiation rather than creating them
      * directly. The class must have an accessible empty constructor, and a get() method that
      * returns an instance of the class this annotation is on.
      */
-    @NonNull
-    Class<?> factory() default void.class;
+    @NonNull Class<?> factory() default void.class;
 }
diff --git a/wear/compose/compose-foundation/api/current.txt b/wear/compose/compose-foundation/api/current.txt
index 77936fe..c9f66cc 100644
--- a/wear/compose/compose-foundation/api/current.txt
+++ b/wear/compose/compose-foundation/api/current.txt
@@ -548,9 +548,13 @@
   }
 
   public sealed interface TransformingLazyColumnLayoutInfo {
+    method public int getAfterContentPadding();
+    method public int getBeforeContentPadding();
     method public int getTotalItemsCount();
     method public long getViewportSize();
     method public java.util.List<androidx.wear.compose.foundation.lazy.TransformingLazyColumnVisibleItemInfo> getVisibleItems();
+    property public abstract int afterContentPadding;
+    property public abstract int beforeContentPadding;
     property public abstract int totalItemsCount;
     property public abstract long viewportSize;
     property public abstract java.util.List<androidx.wear.compose.foundation.lazy.TransformingLazyColumnVisibleItemInfo> visibleItems;
diff --git a/wear/compose/compose-foundation/api/restricted_current.txt b/wear/compose/compose-foundation/api/restricted_current.txt
index 77936fe..c9f66cc 100644
--- a/wear/compose/compose-foundation/api/restricted_current.txt
+++ b/wear/compose/compose-foundation/api/restricted_current.txt
@@ -548,9 +548,13 @@
   }
 
   public sealed interface TransformingLazyColumnLayoutInfo {
+    method public int getAfterContentPadding();
+    method public int getBeforeContentPadding();
     method public int getTotalItemsCount();
     method public long getViewportSize();
     method public java.util.List<androidx.wear.compose.foundation.lazy.TransformingLazyColumnVisibleItemInfo> getVisibleItems();
+    property public abstract int afterContentPadding;
+    property public abstract int beforeContentPadding;
     property public abstract int totalItemsCount;
     property public abstract long viewportSize;
     property public abstract java.util.List<androidx.wear.compose.foundation.lazy.TransformingLazyColumnVisibleItemInfo> visibleItems;
diff --git a/wear/compose/compose-foundation/src/androidTest/kotlin/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategyTest.kt b/wear/compose/compose-foundation/src/androidTest/kotlin/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategyTest.kt
index e8679b9..ab26871 100644
--- a/wear/compose/compose-foundation/src/androidTest/kotlin/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategyTest.kt
+++ b/wear/compose/compose-foundation/src/androidTest/kotlin/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategyTest.kt
@@ -155,6 +155,25 @@
 
         assertThat(result.visibleItems.map { it.offset })
             .isEqualTo(listOf(0 + topPaddingPx, screenHeight / 2 + topPaddingPx))
+        assertThat(result.beforeContentPadding).isEqualTo(topPaddingPx)
+    }
+
+    @Test
+    fun twoItemsWithLastOneAlignedWithPadding_measuredWithCorrectOffsets() {
+        val bottomPadding = 5.dp
+        val bottomPaddingPx = with(measureScope) { bottomPadding.roundToPx() }
+        val strategy =
+            TransformingLazyColumnContentPaddingMeasurementStrategy(
+                PaddingValues(bottom = bottomPadding),
+                measureScope
+            )
+
+        val result = strategy.measure(listOf(screenHeight / 2, screenHeight / 2))
+
+        assertThat(result.visibleItems.size).isEqualTo(2)
+
+        assertThat(result.visibleItems.map { it.offset }).isEqualTo(listOf(0, screenHeight / 2))
+        assertThat(result.afterContentPadding).isEqualTo(bottomPaddingPx)
     }
 
     @Test
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategy.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategy.kt
index 7077c64..2843c16 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategy.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategy.kt
@@ -175,8 +175,8 @@
             coroutineScope = coroutineScope,
             density = density,
             itemSpacing = itemSpacing,
-            beforeContentPadding = 0,
-            afterContentPadding = 0,
+            beforeContentPadding = beforeContentPadding,
+            afterContentPadding = afterContentPadding,
             measureResult =
                 layout(containerConstraints.maxWidth, containerConstraints.maxHeight) {
                     visibleItems.fastForEach { it.place(this) }
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnLayoutInfo.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnLayoutInfo.kt
index 2d9c878..a1838833 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnLayoutInfo.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnLayoutInfo.kt
@@ -127,4 +127,12 @@
 
     /** The size of the viewport in pixels. */
     val viewportSize: IntSize
+
+    /**
+     * The content padding in pixels applied before the first item in the direction of scrolling.
+     */
+    val beforeContentPadding: Int
+
+    /** The content padding in pixels applied after the last item in the direction of scrolling. */
+    val afterContentPadding: Int
 }
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnMeasureResult.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnMeasureResult.kt
index 3a79e8d..6dd296b 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnMeasureResult.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnMeasureResult.kt
@@ -41,8 +41,8 @@
     val itemSpacing: Int,
     /** Density of the last measure. */
     val density: Density,
-    val beforeContentPadding: Int,
-    val afterContentPadding: Int,
+    override val beforeContentPadding: Int,
+    override val afterContentPadding: Int,
     /** True if there is some space available to continue scrolling in the forward direction. */
     var canScrollForward: Boolean,
     /** True if there is some space available to continue scrolling in the backward direction. */
diff --git a/wear/tiles/tiles-material/build.gradle b/wear/tiles/tiles-material/build.gradle
index 5a1fa54..f1afc74 100644
--- a/wear/tiles/tiles-material/build.gradle
+++ b/wear/tiles/tiles-material/build.gradle
@@ -32,6 +32,7 @@
 }
 
 dependencies {
+    api(libs.jspecify)
     api("androidx.annotation:annotation:1.8.1")
     api(project(":wear:tiles:tiles"))
     implementation(project(":wear:tiles:tiles-proto"))
diff --git a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/RunnerUtils.java b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/RunnerUtils.java
index f630834..a8cb5ea 100644
--- a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/RunnerUtils.java
+++ b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/RunnerUtils.java
@@ -22,13 +22,14 @@
 import android.graphics.Bitmap;
 import android.util.Log;
 
-import androidx.annotation.NonNull;
 import androidx.test.core.app.ActivityScenario;
 import androidx.test.platform.app.InstrumentationRegistry;
 import androidx.test.screenshot.AndroidXScreenshotTestRule;
 import androidx.test.screenshot.matchers.MSSIMMatcher;
 import androidx.wear.tiles.material.testapp.GoldenTestActivity;
 
+import org.jspecify.annotations.NonNull;
+
 @SuppressWarnings("deprecation")
 public class RunnerUtils {
     // This isn't totally ideal right now. The screenshot tests run on a phone, so emulate some
@@ -40,7 +41,7 @@
 
     public static void runSingleScreenshotTest(
             @NonNull AndroidXScreenshotTestRule rule,
-            @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement layoutElement,
+            androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement layoutElement,
             @NonNull String expected) {
         byte[] layoutElementPayload = layoutElement.toLayoutElementProto().toByteArray();
 
diff --git a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/TestCasesGenerator.java b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/TestCasesGenerator.java
index 50d9fb8..531d07f 100644
--- a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/TestCasesGenerator.java
+++ b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/TestCasesGenerator.java
@@ -19,7 +19,7 @@
 import android.content.Context;
 import android.graphics.Color;
 
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -38,11 +38,12 @@
      * different for different user font sizes. Note that some of the golden will have the same name
      * as it should point on the same size independent image.
      */
-    @NonNull
-    static Map<String, androidx.wear.tiles.LayoutElementBuilders.LayoutElement> generateTestCases(
-            @NonNull Context context,
-            @NonNull androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters deviceParameters,
-            @NonNull String goldenSuffix) {
+    static @NonNull Map<String, androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+            generateTestCases(
+                    @NonNull Context context,
+                    androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
+                            deviceParameters,
+                    @NonNull String goldenSuffix) {
         androidx.wear.tiles.ModifiersBuilders.Clickable clickable =
                 new androidx.wear.tiles.ModifiersBuilders.Clickable.Builder()
                         .setOnClick(
diff --git a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/layouts/TestCasesGenerator.java b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/layouts/TestCasesGenerator.java
index 5984524..342d482 100644
--- a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/layouts/TestCasesGenerator.java
+++ b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/layouts/TestCasesGenerator.java
@@ -20,7 +20,8 @@
 import android.graphics.Color;
 
 import androidx.annotation.Dimension;
-import androidx.annotation.NonNull;
+
+import org.jspecify.annotations.NonNull;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -37,11 +38,12 @@
      * different for different user font sizes. Note that some of the golden will have the same name
      * as it should point on the same size independent image.
      */
-    @NonNull
-    static Map<String, androidx.wear.tiles.LayoutElementBuilders.LayoutElement> generateTestCases(
-            @NonNull Context context,
-            @NonNull androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters deviceParameters,
-            @NonNull String goldenSuffix) {
+    static @NonNull Map<String, androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+            generateTestCases(
+                    @NonNull Context context,
+                    androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
+                            deviceParameters,
+                    @NonNull String goldenSuffix) {
         androidx.wear.tiles.ModifiersBuilders.Clickable clickable =
                 new androidx.wear.tiles.ModifiersBuilders.Clickable.Builder()
                         .setOnClick(
@@ -635,13 +637,11 @@
         return testCases;
     }
 
-    @NonNull
-    private static androidx.wear.tiles.ColorBuilders.ColorProp color(int yellow) {
+    private static androidx.wear.tiles.ColorBuilders.@NonNull ColorProp color(int yellow) {
         return androidx.wear.tiles.ColorBuilders.argb(yellow);
     }
 
-    @NonNull
-    private static androidx.wear.tiles.material.Text buildTextLabel(
+    private static androidx.wear.tiles.material.@NonNull Text buildTextLabel(
             @NonNull Context context, @NonNull String text) {
         return new androidx.wear.tiles.material.Text.Builder(context, text)
                 .setTypography(androidx.wear.tiles.material.Typography.TYPOGRAPHY_CAPTION1)
@@ -649,8 +649,8 @@
                 .build();
     }
 
-    @NonNull
-    private static androidx.wear.tiles.LayoutElementBuilders.Box buildColoredBoxMSL(int color) {
+    private static androidx.wear.tiles.LayoutElementBuilders.@NonNull Box buildColoredBoxMSL(
+            int color) {
         return new androidx.wear.tiles.LayoutElementBuilders.Box.Builder()
                 .setWidth(androidx.wear.tiles.DimensionBuilders.dp(60))
                 .setHeight(androidx.wear.tiles.DimensionBuilders.dp(60))
@@ -665,8 +665,8 @@
                 .build();
     }
 
-    @NonNull
-    private static androidx.wear.tiles.LayoutElementBuilders.Box buildColoredBoxPLL(int color) {
+    private static androidx.wear.tiles.LayoutElementBuilders.@NonNull Box buildColoredBoxPLL(
+            int color) {
         return new androidx.wear.tiles.LayoutElementBuilders.Box.Builder()
                 .setWidth(androidx.wear.tiles.DimensionBuilders.expand())
                 .setHeight(androidx.wear.tiles.DimensionBuilders.dp(60))
diff --git a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/testapp/GoldenTestActivity.java b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/testapp/GoldenTestActivity.java
index 8374563..6e4ea0c 100644
--- a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/testapp/GoldenTestActivity.java
+++ b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/testapp/GoldenTestActivity.java
@@ -31,7 +31,6 @@
 import android.widget.FrameLayout;
 import android.widget.FrameLayout.LayoutParams;
 
-import androidx.annotation.Nullable;
 import androidx.core.content.ContextCompat;
 import androidx.wear.protolayout.LayoutElementBuilders;
 import androidx.wear.protolayout.LayoutElementBuilders.Layout;
@@ -42,6 +41,8 @@
 import androidx.wear.tiles.material.R;
 import androidx.wear.tiles.renderer.TileRenderer;
 
+import org.jspecify.annotations.Nullable;
+
 import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Button.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Button.java
index b469d86..2689359 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Button.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Button.java
@@ -22,13 +22,14 @@
 
 import androidx.annotation.Dimension;
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
 import androidx.wear.protolayout.proto.LayoutElementProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.HashMap;
@@ -92,9 +93,9 @@
      */
     static final String METADATA_TAG_CUSTOM_CONTENT = "CSTBTN";
 
-    @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Box mElement;
+    private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Box mElement;
 
-    Button(@NonNull androidx.wear.tiles.LayoutElementBuilders.Box element) {
+    Button(androidx.wear.tiles.LayoutElementBuilders.@NonNull Box element) {
         mElement = element;
     }
 
@@ -107,27 +108,27 @@
         private static final int IMAGE = 2;
         private static final int CUSTOM_CONTENT = 3;
 
-        @NonNull static final Map<Integer, String> TYPE_TO_TAG = new HashMap<>();
+        static final @NonNull Map<Integer, String> TYPE_TO_TAG = new HashMap<>();
 
         @RestrictTo(RestrictTo.Scope.LIBRARY)
         @Retention(RetentionPolicy.SOURCE)
         @IntDef({NOT_SET, ICON, TEXT, IMAGE, CUSTOM_CONTENT})
         @interface ButtonType {}
 
-        @NonNull private final Context mContext;
-        @Nullable private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mCustomContent;
-        @NonNull private final androidx.wear.tiles.ModifiersBuilders.Clickable mClickable;
-        @NonNull private CharSequence mContentDescription = "";
+        private final @NonNull Context mContext;
+        private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement mCustomContent;
+        private final androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable mClickable;
+        private @NonNull CharSequence mContentDescription = "";
 
-        @NonNull
-        private androidx.wear.tiles.DimensionBuilders.DpProp mSize = ButtonDefaults.DEFAULT_SIZE;
+        private androidx.wear.tiles.DimensionBuilders.@NonNull DpProp mSize =
+                ButtonDefaults.DEFAULT_SIZE;
 
-        @Nullable private String mText = null;
-        @Nullable private Integer mTypographyName = null;
-        @Nullable private String mIcon = null;
-        @Nullable private androidx.wear.tiles.DimensionBuilders.DpProp mIconSize = null;
-        @Nullable private String mImage = null;
-        @NonNull private ButtonColors mButtonColors = ButtonDefaults.PRIMARY_COLORS;
+        private @Nullable String mText = null;
+        private @Nullable Integer mTypographyName = null;
+        private @Nullable String mIcon = null;
+        private androidx.wear.tiles.DimensionBuilders.@Nullable DpProp mIconSize = null;
+        private @Nullable String mImage = null;
+        private @NonNull ButtonColors mButtonColors = ButtonDefaults.PRIMARY_COLORS;
         @ButtonType private int mType = NOT_SET;
 
         static {
@@ -148,7 +149,7 @@
          */
         public Builder(
                 @NonNull Context context,
-                @NonNull androidx.wear.tiles.ModifiersBuilders.Clickable clickable) {
+                androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable clickable) {
             mClickable = clickable;
             mContext = context;
         }
@@ -157,8 +158,7 @@
          * Sets the content description for the {@link Button}. It is highly recommended to provide
          * this for button containing icon or image.
          */
-        @NonNull
-        public Builder setContentDescription(@NonNull CharSequence contentDescription) {
+        public @NonNull Builder setContentDescription(@NonNull CharSequence contentDescription) {
             this.mContentDescription = contentDescription;
             return this;
         }
@@ -169,8 +169,8 @@
          * ButtonDefaults#EXTRA_LARGE_SIZE}. If not set, {@link ButtonDefaults#DEFAULT_SIZE} will be
          * used.
          */
-        @NonNull
-        public Builder setSize(@NonNull androidx.wear.tiles.DimensionBuilders.DpProp size) {
+        public @NonNull Builder setSize(
+                androidx.wear.tiles.DimensionBuilders.@NonNull DpProp size) {
             mSize = size;
             return this;
         }
@@ -181,8 +181,7 @@
          * ButtonDefaults#EXTRA_LARGE_SIZE}. If not set, {@link ButtonDefaults#DEFAULT_SIZE} will be
          * used.
          */
-        @NonNull
-        public Builder setSize(@Dimension(unit = DP) float size) {
+        public @NonNull Builder setSize(@Dimension(unit = DP) float size) {
             mSize = androidx.wear.tiles.DimensionBuilders.dp(size);
             return this;
         }
@@ -191,8 +190,7 @@
          * Sets the colors for the {@link Button}. If not set, {@link ButtonDefaults#PRIMARY_COLORS}
          * will be used.
          */
-        @NonNull
-        public Builder setButtonColors(@NonNull ButtonColors buttonColors) {
+        public @NonNull Builder setButtonColors(@NonNull ButtonColors buttonColors) {
             mButtonColors = buttonColors;
             return this;
         }
@@ -200,9 +198,8 @@
         /**
          * Sets the custom content for this Button. Any previously added content will be overridden.
          */
-        @NonNull
-        public Builder setCustomContent(
-                @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement content) {
+        public @NonNull Builder setCustomContent(
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement content) {
             resetContent();
             this.mCustomContent = content;
             this.mType = CUSTOM_CONTENT;
@@ -215,10 +212,9 @@
          * from {@link ButtonColors} and with the given size. This icon should be image with chosen
          * alpha channel and not an actual image.
          */
-        @NonNull
-        public Builder setIconContent(
+        public @NonNull Builder setIconContent(
                 @NonNull String imageResourceId,
-                @NonNull androidx.wear.tiles.DimensionBuilders.DpProp size) {
+                androidx.wear.tiles.DimensionBuilders.@NonNull DpProp size) {
             resetContent();
             this.mIcon = imageResourceId;
             this.mType = ICON;
@@ -232,8 +228,7 @@
          * icon will be tinted to the given content color from {@link ButtonColors}. This icon
          * should be image with chosen alpha channel and not an actual image.
          */
-        @NonNull
-        public Builder setIconContent(@NonNull String imageResourceId) {
+        public @NonNull Builder setIconContent(@NonNull String imageResourceId) {
             resetContent();
             this.mIcon = imageResourceId;
             this.mType = ICON;
@@ -248,8 +243,7 @@
          * Any previously added content will be overridden. Text should contain no more than 3
          * characters, otherwise it will overflow from the edges.
          */
-        @NonNull
-        public Builder setTextContent(@NonNull String text) {
+        public @NonNull Builder setTextContent(@NonNull String text) {
             resetContent();
             this.mText = text;
             this.mType = TEXT;
@@ -262,8 +256,7 @@
          * Text} component. Any previously added content will be overridden. Text should contain no
          * more than 3 characters, otherwise it will overflow from the edges.
          */
-        @NonNull
-        public Builder setTextContent(
+        public @NonNull Builder setTextContent(
                 @NonNull String text, @Typography.TypographyName int typographyName) {
             resetContent();
             this.mText = text;
@@ -276,8 +269,7 @@
          * Sets the content of this Button to be the given image, i.e. contacts photo. Any
          * previously added content will be overridden.
          */
-        @NonNull
-        public Builder setImageContent(@NonNull String imageResourceId) {
+        public @NonNull Builder setImageContent(@NonNull String imageResourceId) {
             resetContent();
             this.mImage = imageResourceId;
             this.mType = IMAGE;
@@ -294,9 +286,8 @@
         }
 
         /** Constructs and returns {@link Button} with the provided field and look. */
-        @NonNull
         @Override
-        public Button build() {
+        public @NonNull Button build() {
             androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder modifiers =
                     new androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder()
                             .setClickable(mClickable)
@@ -335,8 +326,8 @@
             return new Button(element.build());
         }
 
-        @NonNull
-        private androidx.wear.tiles.LayoutElementBuilders.LayoutElement getCorrectContent() {
+        private androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement
+                getCorrectContent() {
             androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder content;
             switch (mType) {
                 case ICON:
@@ -399,7 +390,7 @@
         }
 
         private static @Typography.TypographyName int getDefaultTypographyForSize(
-                @NonNull androidx.wear.tiles.DimensionBuilders.DpProp size) {
+                androidx.wear.tiles.DimensionBuilders.@NonNull DpProp size) {
             if (size.getValue() == ButtonDefaults.LARGE_SIZE.getValue()) {
                 return Typography.TYPOGRAPHY_TITLE1;
             } else if (size.getValue() == ButtonDefaults.EXTRA_LARGE_SIZE.getValue()) {
@@ -413,8 +404,7 @@
     /**
      * Returns the custom content of this Button if it has been added. Otherwise, it returns null.
      */
-    @Nullable
-    public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getCustomContent() {
+    public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement getCustomContent() {
         if (!getMetadataTag().equals(METADATA_TAG_CUSTOM_CONTENT)) {
             return null;
         }
@@ -422,8 +412,7 @@
     }
 
     /** Returns the icon content of this Button if it has been added. Otherwise, it returns null. */
-    @Nullable
-    public String getIconContent() {
+    public @Nullable String getIconContent() {
         androidx.wear.tiles.LayoutElementBuilders.Image icon = getIconContentObject();
         return icon != null ? Helper.checkNotNull(icon.getResourceId()).getValue() : null;
     }
@@ -431,42 +420,36 @@
     /**
      * Returns the image content of this Button if it has been added. Otherwise, it returns null.
      */
-    @Nullable
-    public String getImageContent() {
+    public @Nullable String getImageContent() {
         androidx.wear.tiles.LayoutElementBuilders.Image image = getImageContentObject();
         return image != null ? Helper.checkNotNull(image.getResourceId()).getValue() : null;
     }
 
     /** Returns the text content of this Button if it has been added. Otherwise, it returns null. */
-    @Nullable
-    public String getTextContent() {
+    public @Nullable String getTextContent() {
         Text text = getTextContentObject();
         return text != null ? text.getText() : null;
     }
 
-    @NonNull
-    private androidx.wear.tiles.LayoutElementBuilders.LayoutElement getAnyContent() {
+    private androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement getAnyContent() {
         return Helper.checkNotNull(mElement.getContents().get(0));
     }
 
-    @Nullable
-    private androidx.wear.tiles.LayoutElementBuilders.Image getIconContentObject() {
+    private androidx.wear.tiles.LayoutElementBuilders.@Nullable Image getIconContentObject() {
         if (!getMetadataTag().equals(METADATA_TAG_ICON)) {
             return null;
         }
         return (androidx.wear.tiles.LayoutElementBuilders.Image) getAnyContent();
     }
 
-    @Nullable
-    private Text getTextContentObject() {
+    private @Nullable Text getTextContentObject() {
         if (!getMetadataTag().equals(METADATA_TAG_TEXT)) {
             return null;
         }
         return Text.fromLayoutElement(getAnyContent());
     }
 
-    @Nullable
-    private androidx.wear.tiles.LayoutElementBuilders.Image getImageContentObject() {
+    private androidx.wear.tiles.LayoutElementBuilders.@Nullable Image getImageContentObject() {
         if (!getMetadataTag().equals(METADATA_TAG_IMAGE)) {
             return null;
         }
@@ -474,14 +457,12 @@
     }
 
     /** Returns click event action associated with this Button. */
-    @NonNull
-    public androidx.wear.tiles.ModifiersBuilders.Clickable getClickable() {
+    public androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable getClickable() {
         return Helper.checkNotNull(Helper.checkNotNull(mElement.getModifiers()).getClickable());
     }
 
     /** Returns content description for this Button. */
-    @Nullable
-    public CharSequence getContentDescription() {
+    public @Nullable CharSequence getContentDescription() {
         androidx.wear.tiles.ModifiersBuilders.Semantics semantics =
                 Helper.checkNotNull(mElement.getModifiers()).getSemantics();
         if (semantics == null) {
@@ -491,8 +472,7 @@
     }
 
     /** Returns size for this Button. */
-    @NonNull
-    public androidx.wear.tiles.DimensionBuilders.ContainerDimension getSize() {
+    public androidx.wear.tiles.DimensionBuilders.@NonNull ContainerDimension getSize() {
         return Helper.checkNotNull(mElement.getWidth());
     }
 
@@ -503,8 +483,7 @@
     }
 
     /** Returns button color of this Button. */
-    @NonNull
-    public ButtonColors getButtonColors() {
+    public @NonNull ButtonColors getButtonColors() {
         androidx.wear.tiles.ColorBuilders.ColorProp backgroundColor = getBackgroundColor();
         androidx.wear.tiles.ColorBuilders.ColorProp contentColor = null;
 
@@ -538,8 +517,7 @@
     }
 
     /** Returns metadata tag set to this Button. */
-    @NonNull
-    String getMetadataTag() {
+    @NonNull String getMetadataTag() {
         return Helper.getMetadataTagName(
                 Helper.checkNotNull(Helper.checkNotNull(mElement.getModifiers()).getMetadata()));
     }
@@ -550,9 +528,8 @@
      * container.getContents().get(index)}) if that element can be converted to Button. Otherwise,
      * it will return null.
      */
-    @Nullable
-    public static Button fromLayoutElement(
-            @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+    public static @Nullable Button fromLayoutElement(
+            androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
         if (element instanceof Button) {
             return (Button) element;
         }
@@ -568,17 +545,15 @@
         return new Button(boxElement);
     }
 
-    @NonNull
     @Override
     @RestrictTo(Scope.LIBRARY_GROUP)
-    public LayoutElementProto.LayoutElement toLayoutElementProto() {
+    public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
         return Helper.checkNotNull(mElement.toLayoutElementProto());
     }
 
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @Nullable
     @Override
-    public Fingerprint getFingerprint() {
+    public @Nullable Fingerprint getFingerprint() {
         return mElement.getFingerprint();
     }
 }
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ButtonColors.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ButtonColors.java
index 23face2..e48335b6 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ButtonColors.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ButtonColors.java
@@ -17,7 +17,8 @@
 package androidx.wear.tiles.material;
 
 import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
+
+import org.jspecify.annotations.NonNull;
 
 /**
  * Represents the background and content colors used in a button Tiles component.
@@ -32,8 +33,8 @@
 @Deprecated
 @SuppressWarnings("deprecation")
 public class ButtonColors {
-    @NonNull private final androidx.wear.tiles.ColorBuilders.ColorProp mBackgroundColor;
-    @NonNull private final androidx.wear.tiles.ColorBuilders.ColorProp mContentColor;
+    private final androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mBackgroundColor;
+    private final androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mContentColor;
 
     /**
      * Constructor for {@link ButtonColors} object.
@@ -55,8 +56,8 @@
      * @param contentColor The content color or tint color to be used for a button.
      */
     public ButtonColors(
-            @NonNull androidx.wear.tiles.ColorBuilders.ColorProp backgroundColor,
-            @NonNull androidx.wear.tiles.ColorBuilders.ColorProp contentColor) {
+            androidx.wear.tiles.ColorBuilders.@NonNull ColorProp backgroundColor,
+            androidx.wear.tiles.ColorBuilders.@NonNull ColorProp contentColor) {
         mBackgroundColor = backgroundColor;
         mContentColor = contentColor;
     }
@@ -65,8 +66,7 @@
      * Returns a {@link ButtonColors} object, using the current Primary colors from the given {@link
      * Colors}.
      */
-    @NonNull
-    public static ButtonColors primaryButtonColors(@NonNull Colors colors) {
+    public static @NonNull ButtonColors primaryButtonColors(@NonNull Colors colors) {
         return new ButtonColors(colors.getPrimary(), colors.getOnPrimary());
     }
 
@@ -74,20 +74,17 @@
      * Returns a {@link ButtonColors} object, using the current Surface colors from the given {@link
      * Colors}.
      */
-    @NonNull
-    public static ButtonColors secondaryButtonColors(@NonNull Colors colors) {
+    public static @NonNull ButtonColors secondaryButtonColors(@NonNull Colors colors) {
         return new ButtonColors(colors.getSurface(), colors.getOnSurface());
     }
 
     /** The background color to be used on a button Tiles components. */
-    @NonNull
-    public androidx.wear.tiles.ColorBuilders.ColorProp getBackgroundColor() {
+    public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getBackgroundColor() {
         return mBackgroundColor;
     }
 
     /** The content or tint color to be used on a button Tiles components. */
-    @NonNull
-    public androidx.wear.tiles.ColorBuilders.ColorProp getContentColor() {
+    public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getContentColor() {
         return mContentColor;
     }
 }
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ButtonDefaults.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ButtonDefaults.java
index 3fa5303..6a38829 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ButtonDefaults.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ButtonDefaults.java
@@ -19,7 +19,8 @@
 import static androidx.annotation.Dimension.DP;
 
 import androidx.annotation.Dimension;
-import androidx.annotation.NonNull;
+
+import org.jspecify.annotations.NonNull;
 
 /**
  * Contains the default values used by button Tiles components.
@@ -33,41 +34,34 @@
     private ButtonDefaults() {}
 
     /** The default size for standard {@link Button}. */
-    @NonNull
-    public static final androidx.wear.tiles.DimensionBuilders.DpProp DEFAULT_SIZE =
+    public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp DEFAULT_SIZE =
             androidx.wear.tiles.DimensionBuilders.dp(52);
 
     /** The recommended size for large {@link Button}. */
-    @NonNull
-    public static final androidx.wear.tiles.DimensionBuilders.DpProp LARGE_SIZE =
+    public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp LARGE_SIZE =
             androidx.wear.tiles.DimensionBuilders.dp(60);
 
     /** The recommended size for extra large {@link Button}. */
-    @NonNull
-    public static final androidx.wear.tiles.DimensionBuilders.DpProp EXTRA_LARGE_SIZE =
+    public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp EXTRA_LARGE_SIZE =
             androidx.wear.tiles.DimensionBuilders.dp(88);
 
     /** Returns the recommended icon size for the given size of a {@link Button}. */
-    @NonNull
-    public static androidx.wear.tiles.DimensionBuilders.DpProp recommendedIconSize(
-            @NonNull androidx.wear.tiles.DimensionBuilders.DpProp buttonSize) {
+    public static androidx.wear.tiles.DimensionBuilders.@NonNull DpProp recommendedIconSize(
+            androidx.wear.tiles.DimensionBuilders.@NonNull DpProp buttonSize) {
         return recommendedIconSize(buttonSize.getValue());
     }
 
     /** Returns the recommended icon size for the given size of a {@link Button}. */
-    @NonNull
-    public static androidx.wear.tiles.DimensionBuilders.DpProp recommendedIconSize(
+    public static androidx.wear.tiles.DimensionBuilders.@NonNull DpProp recommendedIconSize(
             @Dimension(unit = DP) float buttonSize) {
         return androidx.wear.tiles.DimensionBuilders.dp(buttonSize / 2);
     }
 
     /** The recommended colors for a primary {@link Button}. */
-    @NonNull
-    public static final ButtonColors PRIMARY_COLORS =
+    public static final @NonNull ButtonColors PRIMARY_COLORS =
             ButtonColors.primaryButtonColors(Colors.DEFAULT);
 
     /** The recommended colors for a secondary {@link Button}. */
-    @NonNull
-    public static final ButtonColors SECONDARY_COLORS =
+    public static final @NonNull ButtonColors SECONDARY_COLORS =
             ButtonColors.secondaryButtonColors(Colors.DEFAULT);
 }
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Chip.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Chip.java
index 741a1a2..bef10f1 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Chip.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Chip.java
@@ -22,13 +22,14 @@
 
 import androidx.annotation.Dimension;
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
 import androidx.wear.protolayout.proto.LayoutElementProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.HashMap;
@@ -91,9 +92,9 @@
      */
     static final String METADATA_TAG_CUSTOM_CONTENT = "CSTCHP";
 
-    @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Box mElement;
+    private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Box mElement;
 
-    Chip(@NonNull androidx.wear.tiles.LayoutElementBuilders.Box element) {
+    Chip(androidx.wear.tiles.LayoutElementBuilders.@NonNull Box element) {
         mElement = element;
     }
 
@@ -110,19 +111,19 @@
         @IntDef({NOT_SET, TEXT, ICON, CUSTOM_CONTENT})
         @interface ChipType {}
 
-        @NonNull private final Context mContext;
-        @Nullable private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mCustomContent;
-        @Nullable private String mImageResourceId = null;
-        @Nullable private String mPrimaryLabel = null;
-        @Nullable private String mSecondaryLabel = null;
-        @NonNull private final androidx.wear.tiles.ModifiersBuilders.Clickable mClickable;
-        @NonNull private CharSequence mContentDescription = "";
-        @NonNull private androidx.wear.tiles.DimensionBuilders.ContainerDimension mWidth;
+        private final @NonNull Context mContext;
+        private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement mCustomContent;
+        private @Nullable String mImageResourceId = null;
+        private @Nullable String mPrimaryLabel = null;
+        private @Nullable String mSecondaryLabel = null;
+        private final androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable mClickable;
+        private @NonNull CharSequence mContentDescription = "";
+        private androidx.wear.tiles.DimensionBuilders.@NonNull ContainerDimension mWidth;
 
-        @NonNull
-        private androidx.wear.tiles.DimensionBuilders.DpProp mHeight = ChipDefaults.DEFAULT_HEIGHT;
+        private androidx.wear.tiles.DimensionBuilders.@NonNull DpProp mHeight =
+                ChipDefaults.DEFAULT_HEIGHT;
 
-        @NonNull private ChipColors mChipColors = ChipDefaults.PRIMARY_COLORS;
+        private @NonNull ChipColors mChipColors = ChipDefaults.PRIMARY_COLORS;
 
         @androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignment
         private int mHorizontalAlign =
@@ -130,15 +131,14 @@
 
         @Typography.TypographyName private int mPrimaryLabelTypography;
 
-        @NonNull
-        private androidx.wear.tiles.DimensionBuilders.DpProp mHorizontalPadding =
+        private androidx.wear.tiles.DimensionBuilders.@NonNull DpProp mHorizontalPadding =
                 ChipDefaults.HORIZONTAL_PADDING;
 
         private boolean mIsScalable = true;
         private int mMaxLines = 0; // 0 indicates that is not set.
-        @NonNull private String mMetadataTag = "";
+        private @NonNull String mMetadataTag = "";
 
-        @NonNull static final Map<Integer, String> TYPE_TO_TAG = new HashMap<>();
+        static final @NonNull Map<Integer, String> TYPE_TO_TAG = new HashMap<>();
 
         static {
             TYPE_TO_TAG.put(ICON, METADATA_TAG_ICON);
@@ -157,10 +157,9 @@
          */
         public Builder(
                 @NonNull Context context,
-                @NonNull androidx.wear.tiles.ModifiersBuilders.Clickable clickable,
-                @NonNull
-                        androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
-                                deviceParameters) {
+                androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable clickable,
+                androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
+                        deviceParameters) {
             mContext = context;
             mClickable = clickable;
             mWidth =
@@ -174,9 +173,8 @@
         /**
          * Sets the width of {@link Chip}. If not set, default value will be set to fill the screen.
          */
-        @NonNull
-        public Builder setWidth(
-                @NonNull androidx.wear.tiles.DimensionBuilders.ContainerDimension width) {
+        public @NonNull Builder setWidth(
+                androidx.wear.tiles.DimensionBuilders.@NonNull ContainerDimension width) {
             mWidth = width;
             return this;
         }
@@ -185,8 +183,7 @@
          * Sets the width of {@link TitleChip}. If not set, default value will be set to fill the
          * screen.
          */
-        @NonNull
-        public Builder setWidth(@Dimension(unit = DP) float width) {
+        public @NonNull Builder setWidth(@Dimension(unit = DP) float width) {
             mWidth = androidx.wear.tiles.DimensionBuilders.dp(width);
             return this;
         }
@@ -195,9 +192,8 @@
          * Sets the custom content for the {@link Chip}. Any previously added content will be
          * overridden.
          */
-        @NonNull
-        public Builder setCustomContent(
-                @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement content) {
+        public @NonNull Builder setCustomContent(
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement content) {
             this.mCustomContent = content;
             this.mPrimaryLabel = "";
             this.mSecondaryLabel = "";
@@ -209,8 +205,7 @@
          * Sets the content description for the {@link Chip}. It is highly recommended to provide
          * this for chip containing icon.
          */
-        @NonNull
-        public Builder setContentDescription(@NonNull CharSequence contentDescription) {
+        public @NonNull Builder setContentDescription(@NonNull CharSequence contentDescription) {
             this.mContentDescription = contentDescription;
             return this;
         }
@@ -220,8 +215,7 @@
          * overridden. Primary label can be on 1 or 2 lines, depending on the length and existence
          * of secondary label.
          */
-        @NonNull
-        public Builder setPrimaryLabelContent(@NonNull String primaryLabel) {
+        public @NonNull Builder setPrimaryLabelContent(@NonNull String primaryLabel) {
             this.mPrimaryLabel = primaryLabel;
             this.mCustomContent = null;
             return this;
@@ -232,8 +226,7 @@
          *
          * <p>Sets the font for the primary label and should only be used internally.
          */
-        @NonNull
-        Builder setPrimaryLabelTypography(@Typography.TypographyName int typography) {
+        @NonNull Builder setPrimaryLabelTypography(@Typography.TypographyName int typography) {
             this.mPrimaryLabelTypography = typography;
             return this;
         }
@@ -243,8 +236,7 @@
          *
          * <p>Sets whether the font for the primary label is scalable.
          */
-        @NonNull
-        Builder setIsPrimaryLabelScalable(boolean isScalable) {
+        @NonNull Builder setIsPrimaryLabelScalable(boolean isScalable) {
             this.mIsScalable = isScalable;
             return this;
         }
@@ -254,8 +246,7 @@
          * be overridden. If secondary label is set, primary label must be set too with {@link
          * #setPrimaryLabelContent}.
          */
-        @NonNull
-        public Builder setSecondaryLabelContent(@NonNull String secondaryLabel) {
+        public @NonNull Builder setSecondaryLabelContent(@NonNull String secondaryLabel) {
             this.mSecondaryLabel = secondaryLabel;
             this.mCustomContent = null;
             return this;
@@ -267,8 +258,7 @@
          * ChipColors}. This icon should be image with chosen alpha channel and not an actual image.
          * If icon is set, primary label must be set too with {@link #setPrimaryLabelContent}.
          */
-        @NonNull
-        public Builder setIconContent(@NonNull String imageResourceId) {
+        public @NonNull Builder setIconContent(@NonNull String imageResourceId) {
             this.mImageResourceId = imageResourceId;
             this.mCustomContent = null;
             return this;
@@ -281,8 +271,7 @@
          * ChipColors#getIconColor()} will be used as color for the icon itself. If not set, {@link
          * ChipDefaults#PRIMARY_COLORS} will be used.
          */
-        @NonNull
-        public Builder setChipColors(@NonNull ChipColors chipColors) {
+        public @NonNull Builder setChipColors(@NonNull ChipColors chipColors) {
             mChipColors = chipColors;
             return this;
         }
@@ -295,8 +284,7 @@
          * androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignment#HORIZONTAL_ALIGN_START}
          * will be used.
          */
-        @NonNull
-        public Builder setHorizontalAlignment(
+        public @NonNull Builder setHorizontalAlignment(
                 @androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignment
                         int horizontalAlignment) {
             mHorizontalAlign = horizontalAlignment;
@@ -304,38 +292,33 @@
         }
 
         /** Used for creating CompactChip and TitleChip. */
-        @NonNull
-        Builder setHorizontalPadding(
-                @NonNull androidx.wear.tiles.DimensionBuilders.DpProp horizontalPadding) {
+        @NonNull Builder setHorizontalPadding(
+                androidx.wear.tiles.DimensionBuilders.@NonNull DpProp horizontalPadding) {
             this.mHorizontalPadding = horizontalPadding;
             return this;
         }
 
         /** Used for creating CompactChip and TitleChip. */
-        @NonNull
-        Builder setHeight(@NonNull androidx.wear.tiles.DimensionBuilders.DpProp height) {
+        @NonNull Builder setHeight(androidx.wear.tiles.DimensionBuilders.@NonNull DpProp height) {
             this.mHeight = height;
             return this;
         }
 
         /** Used for creating CompactChip and TitleChip. */
-        @NonNull
-        Builder setMaxLines(int maxLines) {
+        @NonNull Builder setMaxLines(int maxLines) {
             this.mMaxLines = maxLines;
             return this;
         }
 
         /** Used for setting the correct tag in CompactChip and TitleChip. */
-        @NonNull
-        Builder setMetadataTag(@NonNull String metadataTag) {
+        @NonNull Builder setMetadataTag(@NonNull String metadataTag) {
             this.mMetadataTag = metadataTag;
             return this;
         }
 
         /** Constructs and returns {@link Chip} with the provided content and look. */
-        @NonNull
         @Override
-        public Chip build() {
+        public @NonNull Chip build() {
             androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder modifiers =
                     new androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder()
                             .setClickable(mClickable)
@@ -374,8 +357,7 @@
             return new Chip(element.build());
         }
 
-        @NonNull
-        private String getCorrectContentDescription() {
+        private @NonNull String getCorrectContentDescription() {
             if (mContentDescription.length() == 0) {
                 mContentDescription = "";
                 if (mPrimaryLabel != null) {
@@ -414,8 +396,8 @@
             return METADATA_TAG_TEXT;
         }
 
-        @NonNull
-        private androidx.wear.tiles.LayoutElementBuilders.LayoutElement getCorrectContent() {
+        private androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement
+                getCorrectContent() {
             if (mCustomContent != null) {
                 return mCustomContent;
             }
@@ -493,41 +475,36 @@
         }
 
         private androidx.wear.tiles.LayoutElementBuilders.Box.Builder putLayoutInBox(
-                @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
             // Wrapped and centered content are default.
             return new androidx.wear.tiles.LayoutElementBuilders.Box.Builder().addContent(element);
         }
     }
 
     /** Returns height of this Chip. */
-    @NonNull
-    public androidx.wear.tiles.DimensionBuilders.ContainerDimension getHeight() {
+    public androidx.wear.tiles.DimensionBuilders.@NonNull ContainerDimension getHeight() {
         return Helper.checkNotNull(mElement.getHeight());
     }
 
     /** Returns width of this Chip. */
-    @NonNull
-    public androidx.wear.tiles.DimensionBuilders.ContainerDimension getWidth() {
+    public androidx.wear.tiles.DimensionBuilders.@NonNull ContainerDimension getWidth() {
         return Helper.checkNotNull(mElement.getWidth());
     }
 
     /** Returns click event action associated with this Chip. */
-    @NonNull
-    public androidx.wear.tiles.ModifiersBuilders.Clickable getClickable() {
+    public androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable getClickable() {
         return Helper.checkNotNull(Helper.checkNotNull(mElement.getModifiers()).getClickable());
     }
 
     /** Returns background color of this Chip. */
-    @NonNull
-    private androidx.wear.tiles.ColorBuilders.ColorProp getBackgroundColor() {
+    private androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getBackgroundColor() {
         return Helper.checkNotNull(
                 Helper.checkNotNull(Helper.checkNotNull(mElement.getModifiers()).getBackground())
                         .getColor());
     }
 
     /** Returns chip colors of this Chip. */
-    @NonNull
-    public ChipColors getChipColors() {
+    public @NonNull ChipColors getChipColors() {
         androidx.wear.tiles.ColorBuilders.ColorProp backgroundColor = getBackgroundColor();
         androidx.wear.tiles.ColorBuilders.ColorProp contentColor = null;
         androidx.wear.tiles.ColorBuilders.ColorProp secondaryContentColor = null;
@@ -563,8 +540,7 @@
     }
 
     /** Returns content description of this Chip. */
-    @Nullable
-    public CharSequence getContentDescription() {
+    public @Nullable CharSequence getContentDescription() {
         androidx.wear.tiles.ModifiersBuilders.Semantics semantics =
                 Helper.checkNotNull(mElement.getModifiers()).getSemantics();
         if (semantics == null) {
@@ -574,8 +550,7 @@
     }
 
     /** Returns custom content from this Chip if it has been added. Otherwise, it returns null. */
-    @Nullable
-    public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getCustomContent() {
+    public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement getCustomContent() {
         if (getMetadataTag().equals(METADATA_TAG_CUSTOM_CONTENT)) {
             return Helper.checkNotNull(Helper.checkNotNull(mElement.getContents()).get(0));
         }
@@ -583,38 +558,32 @@
     }
 
     /** Returns primary label from this Chip if it has been added. Otherwise, it returns null. */
-    @Nullable
-    public String getPrimaryLabelContent() {
+    public @Nullable String getPrimaryLabelContent() {
         Text primaryLabel = getPrimaryLabelContentObject();
         return primaryLabel != null ? primaryLabel.getText() : null;
     }
 
     /** Returns secondary label from this Chip if it has been added. Otherwise, it returns null. */
-    @Nullable
-    public String getSecondaryLabelContent() {
+    public @Nullable String getSecondaryLabelContent() {
         Text label = getSecondaryLabelContentObject();
         return label != null ? label.getText() : null;
     }
 
     /** Returns icon id from this Chip if it has been added. Otherwise, it returns null. */
-    @Nullable
-    public String getIconContent() {
+    public @Nullable String getIconContent() {
         androidx.wear.tiles.LayoutElementBuilders.Image icon = getIconContentObject();
         return icon != null ? Helper.checkNotNull(icon.getResourceId()).getValue() : null;
     }
 
-    @Nullable
-    private Text getPrimaryLabelContentObject() {
+    private @Nullable Text getPrimaryLabelContentObject() {
         return getPrimaryOrSecondaryLabelContent(0);
     }
 
-    @Nullable
-    private Text getSecondaryLabelContentObject() {
+    private @Nullable Text getSecondaryLabelContentObject() {
         return getPrimaryOrSecondaryLabelContent(1);
     }
 
-    @Nullable
-    private androidx.wear.tiles.LayoutElementBuilders.Image getIconContentObject() {
+    private androidx.wear.tiles.LayoutElementBuilders.@Nullable Image getIconContentObject() {
         if (!getMetadataTag().equals(METADATA_TAG_ICON)) {
             return null;
         }
@@ -624,8 +593,7 @@
                         .get(0));
     }
 
-    @Nullable
-    private Text getPrimaryOrSecondaryLabelContent(int index) {
+    private @Nullable Text getPrimaryOrSecondaryLabelContent(int index) {
         String metadataTag = getMetadataTag();
         if (metadataTag.equals(METADATA_TAG_CUSTOM_CONTENT)) {
             return null;
@@ -669,8 +637,7 @@
     }
 
     /** Returns metadata tag set to this Chip. */
-    @NonNull
-    String getMetadataTag() {
+    @NonNull String getMetadataTag() {
         return Helper.getMetadataTagName(
                 Helper.checkNotNull(Helper.checkNotNull(mElement.getModifiers()).getMetadata()));
     }
@@ -681,9 +648,8 @@
      * container.getContents().get(index)}) if that element can be converted to Chip. Otherwise, it
      * will return null.
      */
-    @Nullable
-    public static Chip fromLayoutElement(
-            @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+    public static @Nullable Chip fromLayoutElement(
+            androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
         if (element instanceof Chip) {
             return (Chip) element;
         }
@@ -699,17 +665,15 @@
         return new Chip(boxElement);
     }
 
-    @NonNull
     @Override
     @RestrictTo(Scope.LIBRARY_GROUP)
-    public LayoutElementProto.LayoutElement toLayoutElementProto() {
+    public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
         return mElement.toLayoutElementProto();
     }
 
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @Nullable
     @Override
-    public Fingerprint getFingerprint() {
+    public @Nullable Fingerprint getFingerprint() {
         return mElement.getFingerprint();
     }
 }
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipColors.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipColors.java
index 18ae16e..8eb19b4 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipColors.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipColors.java
@@ -17,7 +17,8 @@
 package androidx.wear.tiles.material;
 
 import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
+
+import org.jspecify.annotations.NonNull;
 
 /**
  * Represents the background and content colors used in a chip Tiles component.
@@ -32,10 +33,10 @@
 @Deprecated
 @SuppressWarnings("deprecation")
 public class ChipColors {
-    @NonNull private final androidx.wear.tiles.ColorBuilders.ColorProp mBackgroundColor;
-    @NonNull private final androidx.wear.tiles.ColorBuilders.ColorProp mIconColor;
-    @NonNull private final androidx.wear.tiles.ColorBuilders.ColorProp mContentColor;
-    @NonNull private final androidx.wear.tiles.ColorBuilders.ColorProp mSecondaryContentColor;
+    private final androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mBackgroundColor;
+    private final androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mIconColor;
+    private final androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mContentColor;
+    private final androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mSecondaryContentColor;
 
     /**
      * Constructor for the {@link ChipColors} object.
@@ -85,10 +86,10 @@
      *     component.
      */
     public ChipColors(
-            @NonNull androidx.wear.tiles.ColorBuilders.ColorProp backgroundColor,
-            @NonNull androidx.wear.tiles.ColorBuilders.ColorProp iconColor,
-            @NonNull androidx.wear.tiles.ColorBuilders.ColorProp contentColor,
-            @NonNull androidx.wear.tiles.ColorBuilders.ColorProp secondaryContentColor) {
+            androidx.wear.tiles.ColorBuilders.@NonNull ColorProp backgroundColor,
+            androidx.wear.tiles.ColorBuilders.@NonNull ColorProp iconColor,
+            androidx.wear.tiles.ColorBuilders.@NonNull ColorProp contentColor,
+            androidx.wear.tiles.ColorBuilders.@NonNull ColorProp secondaryContentColor) {
         mBackgroundColor = backgroundColor;
         mIconColor = iconColor;
         mContentColor = contentColor;
@@ -102,8 +103,8 @@
      * @param contentColor The content color to be used for all items inside a chip Tiles component.
      */
     public ChipColors(
-            @NonNull androidx.wear.tiles.ColorBuilders.ColorProp backgroundColor,
-            @NonNull androidx.wear.tiles.ColorBuilders.ColorProp contentColor) {
+            androidx.wear.tiles.ColorBuilders.@NonNull ColorProp backgroundColor,
+            androidx.wear.tiles.ColorBuilders.@NonNull ColorProp contentColor) {
         mBackgroundColor = backgroundColor;
         mIconColor = contentColor;
         mContentColor = contentColor;
@@ -114,8 +115,7 @@
      * Returns a {@link ChipColors} object, using the current Primary colors from the given {@link
      * Colors}.
      */
-    @NonNull
-    public static ChipColors primaryChipColors(@NonNull Colors colors) {
+    public static @NonNull ChipColors primaryChipColors(@NonNull Colors colors) {
         return new ChipColors(colors.getPrimary(), colors.getOnPrimary());
     }
 
@@ -123,32 +123,27 @@
      * Returns a {@link ChipColors} object, using the current Surface colors from the given {@link
      * Colors}.
      */
-    @NonNull
-    public static ChipColors secondaryChipColors(@NonNull Colors colors) {
+    public static @NonNull ChipColors secondaryChipColors(@NonNull Colors colors) {
         return new ChipColors(colors.getSurface(), colors.getOnSurface());
     }
 
     /** The background color to be used on a chip Tiles components. */
-    @NonNull
-    public androidx.wear.tiles.ColorBuilders.ColorProp getBackgroundColor() {
+    public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getBackgroundColor() {
         return mBackgroundColor;
     }
 
     /** The icon color to be used on a chip Tiles components. */
-    @NonNull
-    public androidx.wear.tiles.ColorBuilders.ColorProp getIconColor() {
+    public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getIconColor() {
         return mIconColor;
     }
 
     /** The main text color to be used on a chip Tiles components. */
-    @NonNull
-    public androidx.wear.tiles.ColorBuilders.ColorProp getContentColor() {
+    public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getContentColor() {
         return mContentColor;
     }
 
     /** The label text color to be used on a chip Tiles components. */
-    @NonNull
-    public androidx.wear.tiles.ColorBuilders.ColorProp getSecondaryContentColor() {
+    public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getSecondaryContentColor() {
         return mSecondaryContentColor;
     }
 }
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipDefaults.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipDefaults.java
index ccdc94d..f848a1e 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipDefaults.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipDefaults.java
@@ -16,10 +16,11 @@
 
 package androidx.wear.tiles.material;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * Contains the default values used by chip Tiles components.
  *
@@ -33,26 +34,22 @@
 
     /** The default height for standard {@link Chip} */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
-    public static final androidx.wear.tiles.DimensionBuilders.DpProp DEFAULT_HEIGHT =
+    public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp DEFAULT_HEIGHT =
             androidx.wear.tiles.DimensionBuilders.dp(52);
 
     /** The default height for standard {@link CompactChip} */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
-    public static final androidx.wear.tiles.DimensionBuilders.DpProp COMPACT_HEIGHT =
+    public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp COMPACT_HEIGHT =
             androidx.wear.tiles.DimensionBuilders.dp(32);
 
     /** The default height of tappable area for standard {@link CompactChip} */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
-    public static final androidx.wear.tiles.DimensionBuilders.DpProp COMPACT_HEIGHT_TAPPABLE =
-            androidx.wear.tiles.DimensionBuilders.dp(48);
+    public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp
+            COMPACT_HEIGHT_TAPPABLE = androidx.wear.tiles.DimensionBuilders.dp(48);
 
     /** The default height for standard {@link TitleChip} */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
-    public static final androidx.wear.tiles.DimensionBuilders.DpProp TITLE_HEIGHT =
+    public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp TITLE_HEIGHT =
             androidx.wear.tiles.DimensionBuilders.dp(60);
 
     /** The recommended horizontal margin used for width for standard {@link Chip} */
@@ -61,60 +58,50 @@
 
     /** The recommended horizontal padding for standard {@link Chip} */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
-    public static final androidx.wear.tiles.DimensionBuilders.DpProp HORIZONTAL_PADDING =
+    public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp HORIZONTAL_PADDING =
             androidx.wear.tiles.DimensionBuilders.dp(14);
 
     /** The recommended horizontal padding for standard {@link CompactChip} */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
-    public static final androidx.wear.tiles.DimensionBuilders.DpProp COMPACT_HORIZONTAL_PADDING =
-            androidx.wear.tiles.DimensionBuilders.dp(12);
+    public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp
+            COMPACT_HORIZONTAL_PADDING = androidx.wear.tiles.DimensionBuilders.dp(12);
 
     /** The recommended horizontal padding for standard {@link TitleChip} */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
-    public static final androidx.wear.tiles.DimensionBuilders.DpProp TITLE_HORIZONTAL_PADDING =
-            androidx.wear.tiles.DimensionBuilders.dp(16);
+    public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp
+            TITLE_HORIZONTAL_PADDING = androidx.wear.tiles.DimensionBuilders.dp(16);
 
     /** The recommended vertical space between icon and text in standard {@link Chip} */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
-    public static final androidx.wear.tiles.DimensionBuilders.DpProp ICON_SPACER_WIDTH =
+    public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp ICON_SPACER_WIDTH =
             androidx.wear.tiles.DimensionBuilders.dp(6);
 
     /** The icon size used in standard {@link Chip} */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
-    public static final androidx.wear.tiles.DimensionBuilders.DpProp ICON_SIZE =
+    public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp ICON_SIZE =
             androidx.wear.tiles.DimensionBuilders.dp(24);
 
     /** The recommended colors for a primary {@link Chip}. */
-    @NonNull
-    public static final ChipColors PRIMARY_COLORS = ChipColors.primaryChipColors(Colors.DEFAULT);
+    public static final @NonNull ChipColors PRIMARY_COLORS =
+            ChipColors.primaryChipColors(Colors.DEFAULT);
 
     /** The recommended colors for a secondary {@link Chip}. */
-    @NonNull
-    public static final ChipColors SECONDARY_COLORS =
+    public static final @NonNull ChipColors SECONDARY_COLORS =
             ChipColors.secondaryChipColors(Colors.DEFAULT);
 
     /** The recommended colors for a primary {@link CompactChip}. */
-    @NonNull
-    public static final ChipColors COMPACT_PRIMARY_COLORS =
+    public static final @NonNull ChipColors COMPACT_PRIMARY_COLORS =
             ChipColors.primaryChipColors(Colors.DEFAULT);
 
     /** The recommended colors for a secondary {@link CompactChip}. */
-    @NonNull
-    public static final ChipColors COMPACT_SECONDARY_COLORS =
+    public static final @NonNull ChipColors COMPACT_SECONDARY_COLORS =
             ChipColors.secondaryChipColors(Colors.DEFAULT);
 
     /** The recommended colors for a primary {@link TitleChip}. */
-    @NonNull
-    public static final ChipColors TITLE_PRIMARY_COLORS =
+    public static final @NonNull ChipColors TITLE_PRIMARY_COLORS =
             ChipColors.primaryChipColors(Colors.DEFAULT);
 
     /** The recommended colors for a secondary {@link TitleChip}. */
-    @NonNull
-    public static final ChipColors TITLE_SECONDARY_COLORS =
+    public static final @NonNull ChipColors TITLE_SECONDARY_COLORS =
             ChipColors.secondaryChipColors(Colors.DEFAULT);
 }
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CircularProgressIndicator.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CircularProgressIndicator.java
index 4e83a9a..a417faf 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CircularProgressIndicator.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CircularProgressIndicator.java
@@ -20,13 +20,14 @@
 
 import androidx.annotation.Dimension;
 import androidx.annotation.FloatRange;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
 import androidx.wear.protolayout.proto.LayoutElementProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Tiles component {@link CircularProgressIndicator} that represents circular progress indicator
  * which supports a gap in the circular track between startAngle and endAngle. [Progress Indicator
@@ -76,11 +77,11 @@
      */
     static final String METADATA_TAG = "CPI";
 
-    @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Arc mElement;
-    @NonNull private final androidx.wear.tiles.LayoutElementBuilders.ArcLine mProgress;
-    @NonNull private final androidx.wear.tiles.LayoutElementBuilders.ArcLine mBackground;
+    private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Arc mElement;
+    private final androidx.wear.tiles.LayoutElementBuilders.@NonNull ArcLine mProgress;
+    private final androidx.wear.tiles.LayoutElementBuilders.@NonNull ArcLine mBackground;
 
-    CircularProgressIndicator(@NonNull androidx.wear.tiles.LayoutElementBuilders.Arc element) {
+    CircularProgressIndicator(androidx.wear.tiles.LayoutElementBuilders.@NonNull Arc element) {
         this.mElement = element;
         this.mBackground =
                 (androidx.wear.tiles.LayoutElementBuilders.ArcLine) element.getContents().get(0);
@@ -91,23 +92,19 @@
     /** Builder class for {@link CircularProgressIndicator} */
     public static final class Builder
             implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-        @NonNull
-        private ProgressIndicatorColors mCircularProgressIndicatorColors =
+        private @NonNull ProgressIndicatorColors mCircularProgressIndicatorColors =
                 ProgressIndicatorDefaults.DEFAULT_COLORS;
 
-        @NonNull
-        private androidx.wear.tiles.DimensionBuilders.DpProp mStrokeWidth =
+        private androidx.wear.tiles.DimensionBuilders.@NonNull DpProp mStrokeWidth =
                 ProgressIndicatorDefaults.DEFAULT_STROKE_WIDTH;
 
-        @NonNull private CharSequence mContentDescription = "";
+        private @NonNull CharSequence mContentDescription = "";
 
-        @NonNull
-        private androidx.wear.tiles.DimensionBuilders.DegreesProp mStartAngle =
+        private androidx.wear.tiles.DimensionBuilders.@NonNull DegreesProp mStartAngle =
                 androidx.wear.tiles.DimensionBuilders.degrees(
                         ProgressIndicatorDefaults.DEFAULT_START_ANGLE);
 
-        @NonNull
-        private androidx.wear.tiles.DimensionBuilders.DegreesProp mEndAngle =
+        private androidx.wear.tiles.DimensionBuilders.@NonNull DegreesProp mEndAngle =
                 androidx.wear.tiles.DimensionBuilders.degrees(
                         ProgressIndicatorDefaults.DEFAULT_END_ANGLE);
 
@@ -122,8 +119,8 @@
          * from 0 to 1. Progress will be colored in {@link ProgressIndicatorColors#getTrackColor}.
          * If not set, 0 will be used.
          */
-        @NonNull
-        public Builder setProgress(@FloatRange(from = 0, to = 1) float progressPercentage) {
+        public @NonNull Builder setProgress(
+                @FloatRange(from = 0, to = 1) float progressPercentage) {
             this.mProgress = progressPercentage;
             return this;
         }
@@ -134,8 +131,7 @@
          * start arc from the 9 o'clock. If not set 0 will be used and the indicator will have full
          * length.
          */
-        @NonNull
-        public Builder setStartAngle(float startAngle) {
+        public @NonNull Builder setStartAngle(float startAngle) {
             this.mStartAngle = androidx.wear.tiles.DimensionBuilders.degrees(startAngle);
             return this;
         }
@@ -145,8 +141,7 @@
          * 0 is 12 o'clock. End angle doesn't need to be within 0-360 range, but it must be larger
          * than start angle. If not set 360 will be used and the indicator will have full length.
          */
-        @NonNull
-        public Builder setEndAngle(float endAngle) {
+        public @NonNull Builder setEndAngle(float endAngle) {
             this.mEndAngle = androidx.wear.tiles.DimensionBuilders.degrees(endAngle);
             return this;
         }
@@ -155,8 +150,7 @@
          * Sets the content description of the {@link CircularProgressIndicator} to be used for
          * accessibility support.
          */
-        @NonNull
-        public Builder setContentDescription(@NonNull CharSequence contentDescription) {
+        public @NonNull Builder setContentDescription(@NonNull CharSequence contentDescription) {
             this.mContentDescription = contentDescription;
             return this;
         }
@@ -167,8 +161,7 @@
          * made, while {@link ProgressIndicatorColors#getTrackColor()} will be used for a background
          * full size arc. If not set, {@link ProgressIndicatorDefaults#DEFAULT_COLORS} will be used.
          */
-        @NonNull
-        public Builder setCircularProgressIndicatorColors(
+        public @NonNull Builder setCircularProgressIndicatorColors(
                 @NonNull ProgressIndicatorColors circularProgressIndicatorColors) {
             this.mCircularProgressIndicatorColors = circularProgressIndicatorColors;
             return this;
@@ -178,9 +171,8 @@
          * Sets the stroke width of the {@link CircularProgressIndicator}. Strongly recommended
          * value is {@link ProgressIndicatorDefaults#DEFAULT_STROKE_WIDTH}.
          */
-        @NonNull
-        public Builder setStrokeWidth(
-                @NonNull androidx.wear.tiles.DimensionBuilders.DpProp strokeWidth) {
+        public @NonNull Builder setStrokeWidth(
+                androidx.wear.tiles.DimensionBuilders.@NonNull DpProp strokeWidth) {
             this.mStrokeWidth = strokeWidth;
             return this;
         }
@@ -189,8 +181,7 @@
          * Sets the stroke width of the {@link CircularProgressIndicator}. Strongly recommended
          * value is {@link ProgressIndicatorDefaults#DEFAULT_STROKE_WIDTH}.
          */
-        @NonNull
-        public Builder setStrokeWidth(@Dimension(unit = DP) float strokeWidth) {
+        public @NonNull Builder setStrokeWidth(@Dimension(unit = DP) float strokeWidth) {
             this.mStrokeWidth = androidx.wear.tiles.DimensionBuilders.dp(strokeWidth);
             return this;
         }
@@ -199,9 +190,8 @@
          * Constructs and returns {@link CircularProgressIndicator} with the provided field and
          * look.
          */
-        @NonNull
         @Override
-        public CircularProgressIndicator build() {
+        public @NonNull CircularProgressIndicator build() {
             checkAngles();
 
             androidx.wear.tiles.DimensionBuilders.DegreesProp length = getLength();
@@ -268,8 +258,7 @@
             }
         }
 
-        @NonNull
-        private androidx.wear.tiles.DimensionBuilders.DegreesProp getLength() {
+        private androidx.wear.tiles.DimensionBuilders.@NonNull DegreesProp getLength() {
             float startAngle = mStartAngle.getValue();
             float endAngle = mEndAngle.getValue();
             if (endAngle <= startAngle) {
@@ -280,26 +269,22 @@
     }
 
     /** Returns angle representing progressed part of this CircularProgressIndicator. */
-    @NonNull
-    public androidx.wear.tiles.DimensionBuilders.DegreesProp getProgress() {
+    public androidx.wear.tiles.DimensionBuilders.@NonNull DegreesProp getProgress() {
         return androidx.wear.tiles.material.Helper.checkNotNull(mProgress.getLength());
     }
 
     /** Returns stroke width of this CircularProgressIndicator. */
-    @NonNull
-    public androidx.wear.tiles.DimensionBuilders.DpProp getStrokeWidth() {
+    public androidx.wear.tiles.DimensionBuilders.@NonNull DpProp getStrokeWidth() {
         return androidx.wear.tiles.material.Helper.checkNotNull(mProgress.getThickness());
     }
 
     /** Returns start angle of this CircularProgressIndicator. */
-    @NonNull
-    public androidx.wear.tiles.DimensionBuilders.DegreesProp getStartAngle() {
+    public androidx.wear.tiles.DimensionBuilders.@NonNull DegreesProp getStartAngle() {
         return androidx.wear.tiles.material.Helper.checkNotNull(mElement.getAnchorAngle());
     }
 
     /** Returns start angle of this CircularProgressIndicator. */
-    @NonNull
-    public androidx.wear.tiles.DimensionBuilders.DegreesProp getEndAngle() {
+    public androidx.wear.tiles.DimensionBuilders.@NonNull DegreesProp getEndAngle() {
         float backArcLength =
                 androidx.wear.tiles.material.Helper.checkNotNull(mBackground.getLength())
                         .getValue();
@@ -308,16 +293,14 @@
     }
 
     /** Returns main arc color of this CircularProgressIndicator. */
-    @NonNull
-    public ProgressIndicatorColors getCircularProgressIndicatorColors() {
+    public @NonNull ProgressIndicatorColors getCircularProgressIndicatorColors() {
         return new ProgressIndicatorColors(
                 androidx.wear.tiles.material.Helper.checkNotNull(mProgress.getColor()),
                 androidx.wear.tiles.material.Helper.checkNotNull(mBackground.getColor()));
     }
 
     /** Returns content description of this CircularProgressIndicator. */
-    @Nullable
-    public CharSequence getContentDescription() {
+    public @Nullable CharSequence getContentDescription() {
         androidx.wear.tiles.ModifiersBuilders.Semantics semantics =
                 androidx.wear.tiles.material.Helper.checkNotNull(mElement.getModifiers())
                         .getSemantics();
@@ -331,8 +314,7 @@
      * Returns metadata tag set to this CircularProgressIndicator, which should be {@link
      * #METADATA_TAG}.
      */
-    @NonNull
-    String getMetadataTag() {
+    @NonNull String getMetadataTag() {
         return androidx.wear.tiles.material.Helper.getMetadataTagName(
                 androidx.wear.tiles.material.Helper.checkNotNull(
                         androidx.wear.tiles.material.Helper.checkNotNull(mElement.getModifiers())
@@ -345,9 +327,8 @@
      * container's content with {@code container.getContents().get(index)}) if that element can be
      * converted to CircularProgressIndicator. Otherwise, it will return null.
      */
-    @Nullable
-    public static CircularProgressIndicator fromLayoutElement(
-            @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+    public static @Nullable CircularProgressIndicator fromLayoutElement(
+            androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
         if (element instanceof CircularProgressIndicator) {
             return (CircularProgressIndicator) element;
         }
@@ -364,17 +345,15 @@
         return new CircularProgressIndicator(arcElement);
     }
 
-    @NonNull
     @Override
     @RestrictTo(Scope.LIBRARY_GROUP)
-    public LayoutElementProto.LayoutElement toLayoutElementProto() {
+    public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
         return mElement.toLayoutElementProto();
     }
 
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @Nullable
     @Override
-    public Fingerprint getFingerprint() {
+    public @Nullable Fingerprint getFingerprint() {
         return mElement.getFingerprint();
     }
 }
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Colors.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Colors.java
index f638b1f..63af19d 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Colors.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Colors.java
@@ -17,10 +17,11 @@
 package androidx.wear.tiles.material;
 
 import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * Represent the container for default color scheme in your Tile, that can be used to create color
  * objects for all Material components.
@@ -55,8 +56,8 @@
     public static final int ON_SURFACE = 0xFFFFFFFF;
 
     /** The default color scheme to be used in Tiles Material components. */
-    @NonNull
-    public static final Colors DEFAULT = new Colors(PRIMARY, ON_PRIMARY, SURFACE, ON_SURFACE);
+    public static final @NonNull Colors DEFAULT =
+            new Colors(PRIMARY, ON_PRIMARY, SURFACE, ON_SURFACE);
 
     private @ColorInt final int mPrimary;
     private @ColorInt final int mOnPrimary;
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CompactChip.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CompactChip.java
index ef9e6ba..bde902d 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CompactChip.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CompactChip.java
@@ -18,13 +18,14 @@
 
 import android.content.Context;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
 import androidx.wear.protolayout.proto.LayoutElementProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Tiles component {@link CompactChip} that represents clickable object with the text.
  *
@@ -67,10 +68,10 @@
      */
     static final String METADATA_TAG = "CMPCHP";
 
-    @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Box mImpl;
-    @NonNull private final Chip mElement;
+    private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Box mImpl;
+    private final @NonNull Chip mElement;
 
-    CompactChip(@NonNull androidx.wear.tiles.LayoutElementBuilders.Box element) {
+    CompactChip(androidx.wear.tiles.LayoutElementBuilders.@NonNull Box element) {
         this.mImpl = element;
         // We know for sure that content of the androidx.wear.tiles.LayoutElementBuilders.Box is
         // Chip.
@@ -83,15 +84,14 @@
     /** Builder class for {@link androidx.wear.tiles.material.CompactChip}. */
     public static final class Builder
             implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-        @NonNull private final Context mContext;
-        @NonNull private final String mText;
-        @NonNull private final androidx.wear.tiles.ModifiersBuilders.Clickable mClickable;
+        private final @NonNull Context mContext;
+        private final @NonNull String mText;
+        private final androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable mClickable;
 
-        @NonNull
-        private final androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+        private final androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
                 mDeviceParameters;
 
-        @NonNull private ChipColors mChipColors = ChipDefaults.COMPACT_PRIMARY_COLORS;
+        private @NonNull ChipColors mChipColors = ChipDefaults.COMPACT_PRIMARY_COLORS;
 
         /**
          * Creates a builder for the {@link CompactChip} with associated action and the given text
@@ -105,9 +105,8 @@
         public Builder(
                 @NonNull Context context,
                 @NonNull String text,
-                @NonNull androidx.wear.tiles.ModifiersBuilders.Clickable clickable,
-                @NonNull
-                        androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+                androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable clickable,
+                androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
                                 deviceParameters) {
             this.mContext = context;
             this.mText = text;
@@ -121,16 +120,14 @@
          * ChipColors#getContentColor()} for the text. If not set, {@link
          * ChipDefaults#COMPACT_PRIMARY_COLORS} will be used.
          */
-        @NonNull
-        public Builder setChipColors(@NonNull ChipColors chipColors) {
+        public @NonNull Builder setChipColors(@NonNull ChipColors chipColors) {
             mChipColors = chipColors;
             return this;
         }
 
         /** Constructs and returns {@link CompactChip} with the provided content and look. */
-        @NonNull
         @Override
-        public CompactChip build() {
+        public @NonNull CompactChip build() {
             Chip.Builder chipBuilder =
                     new Chip.Builder(mContext, mClickable, mDeviceParameters)
                             .setMetadataTag(METADATA_TAG)
@@ -173,26 +170,22 @@
     }
 
     /** Returns click event action associated with this Chip. */
-    @NonNull
-    public androidx.wear.tiles.ModifiersBuilders.Clickable getClickable() {
+    public androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable getClickable() {
         return mElement.getClickable();
     }
 
     /** Returns chip color of this Chip. */
-    @NonNull
-    public ChipColors getChipColors() {
+    public @NonNull ChipColors getChipColors() {
         return mElement.getChipColors();
     }
 
     /** Returns text content of this Chip. */
-    @NonNull
-    public String getText() {
+    public @NonNull String getText() {
         return androidx.wear.tiles.material.Helper.checkNotNull(mElement.getPrimaryLabelContent());
     }
 
     /** Returns metadata tag set to this CompactChip, which should be {@link #METADATA_TAG}. */
-    @NonNull
-    String getMetadataTag() {
+    @NonNull String getMetadataTag() {
         return mElement.getMetadataTag();
     }
 
@@ -202,9 +195,8 @@
      * container's content with {@code container.getContents().get(index)}) if that element can be
      * converted to CompactChip. Otherwise, it will return null.
      */
-    @Nullable
-    public static CompactChip fromLayoutElement(
-            @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+    public static @Nullable CompactChip fromLayoutElement(
+            androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
         if (element instanceof CompactChip) {
             return (CompactChip) element;
         }
@@ -236,16 +228,14 @@
     }
 
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
     @Override
-    public LayoutElementProto.LayoutElement toLayoutElementProto() {
+    public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
         return mImpl.toLayoutElementProto();
     }
 
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @Nullable
     @Override
-    public Fingerprint getFingerprint() {
+    public @Nullable Fingerprint getFingerprint() {
         return mImpl.getFingerprint();
     }
 }
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Helper.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Helper.java
index d81e33f..8253cba 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Helper.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Helper.java
@@ -16,11 +16,12 @@
 
 package androidx.wear.tiles.material;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.Collection;
@@ -39,8 +40,7 @@
 
     /** Returns given value if not null or throws {@code NullPointerException} otherwise. */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
-    public static <T> T checkNotNull(@Nullable T value) {
+    public static <T> @NonNull T checkNotNull(@Nullable T value) {
         if (value == null) {
             throw new NullPointerException();
         }
@@ -50,8 +50,7 @@
     /**
      * Returns radius in {@link androidx.wear.tiles.DimensionBuilders.DpProp} of the given diameter.
      */
-    @NonNull
-    static androidx.wear.tiles.DimensionBuilders.DpProp radiusOf(
+    static androidx.wear.tiles.DimensionBuilders.@NonNull DpProp radiusOf(
             androidx.wear.tiles.DimensionBuilders.DpProp diameter) {
         return androidx.wear.tiles.DimensionBuilders.dp(diameter.getValue() / 2);
     }
@@ -62,8 +61,7 @@
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
     public static boolean isRoundDevice(
-            @NonNull
-                    androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+            androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
                             deviceParameters) {
         return deviceParameters.getScreenShape()
                 == androidx.wear.tiles.DeviceParametersBuilders.SCREEN_SHAPE_ROUND;
@@ -71,15 +69,13 @@
 
     /** Returns String representation of tag from byte array. */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
-    public static String getTagName(@NonNull byte[] tagData) {
+    public static @NonNull String getTagName(byte @NonNull [] tagData) {
         return new String(tagData, StandardCharsets.UTF_8);
     }
 
     /** Returns byte array representation of tag from String. */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
-    public static byte[] getTagBytes(@NonNull String tagName) {
+    public static byte @NonNull [] getTagBytes(@NonNull String tagName) {
         return tagName.getBytes(StandardCharsets.UTF_8);
     }
 
@@ -87,9 +83,8 @@
      * Returns the String representation of metadata tag from the given
      * androidx.wear.tiles.ModifiersBuilders.ElementMetadata.
      */
-    @NonNull
-    public static String getMetadataTagName(
-            @NonNull androidx.wear.tiles.ModifiersBuilders.ElementMetadata metadata) {
+    public static @NonNull String getMetadataTagName(
+            androidx.wear.tiles.ModifiersBuilders.@NonNull ElementMetadata metadata) {
         return getTagName(getMetadataTagBytes(metadata));
     }
 
@@ -97,9 +92,8 @@
      * Returns the metadata tag from the given
      * androidx.wear.tiles.ModifiersBuilders.ElementMetadata.
      */
-    @NonNull
-    public static byte[] getMetadataTagBytes(
-            @NonNull androidx.wear.tiles.ModifiersBuilders.ElementMetadata metadata) {
+    public static byte @NonNull [] getMetadataTagBytes(
+            androidx.wear.tiles.ModifiersBuilders.@NonNull ElementMetadata metadata) {
         return checkNotNull(metadata).getTagData();
     }
 
@@ -108,7 +102,7 @@
      * set to the given String value.
      */
     public static boolean checkTag(
-            @Nullable androidx.wear.tiles.ModifiersBuilders.Modifiers modifiers,
+            androidx.wear.tiles.ModifiersBuilders.@Nullable Modifiers modifiers,
             @NonNull String validTag) {
         return modifiers != null
                 && modifiers.getMetadata() != null
@@ -120,7 +114,7 @@
      * set to any of the value in the given String collection.
      */
     public static boolean checkTag(
-            @Nullable androidx.wear.tiles.ModifiersBuilders.Modifiers modifiers,
+            androidx.wear.tiles.ModifiersBuilders.@Nullable Modifiers modifiers,
             @NonNull Collection<String> validTags) {
         return modifiers != null
                 && modifiers.getMetadata() != null
@@ -132,9 +126,9 @@
      * set with prefix that is equal to the given String and its length is of the given base array.
      */
     public static boolean checkTag(
-            @Nullable androidx.wear.tiles.ModifiersBuilders.Modifiers modifiers,
+            androidx.wear.tiles.ModifiersBuilders.@Nullable Modifiers modifiers,
             @NonNull String validPrefix,
-            @NonNull byte[] validBase) {
+            byte @NonNull [] validBase) {
         if (modifiers == null || modifiers.getMetadata() == null) {
             return false;
         }
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ProgressIndicatorColors.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ProgressIndicatorColors.java
index 079f675f..04af668 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ProgressIndicatorColors.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ProgressIndicatorColors.java
@@ -17,7 +17,8 @@
 package androidx.wear.tiles.material;
 
 import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
+
+import org.jspecify.annotations.NonNull;
 
 /**
  * Represents the indicator and track colors used in a progress indicator Tiles component.
@@ -31,8 +32,8 @@
 @Deprecated
 @SuppressWarnings("deprecation")
 public class ProgressIndicatorColors {
-    @NonNull private final androidx.wear.tiles.ColorBuilders.ColorProp mIndicatorColor;
-    @NonNull private final androidx.wear.tiles.ColorBuilders.ColorProp mTrackColor;
+    private final androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mIndicatorColor;
+    private final androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mTrackColor;
 
     /**
      * Constructor for {@link ProgressIndicatorColors} object.
@@ -43,8 +44,8 @@
      *     component.
      */
     public ProgressIndicatorColors(
-            @NonNull androidx.wear.tiles.ColorBuilders.ColorProp indicatorColor,
-            @NonNull androidx.wear.tiles.ColorBuilders.ColorProp trackColor) {
+            androidx.wear.tiles.ColorBuilders.@NonNull ColorProp indicatorColor,
+            androidx.wear.tiles.ColorBuilders.@NonNull ColorProp trackColor) {
         this.mIndicatorColor = indicatorColor;
         this.mTrackColor = trackColor;
     }
@@ -67,20 +68,17 @@
      * indicator color and the current Surface color for the track color from the given {@link
      * Colors}.
      */
-    @NonNull
-    public static ProgressIndicatorColors progressIndicatorColors(@NonNull Colors colors) {
+    public static @NonNull ProgressIndicatorColors progressIndicatorColors(@NonNull Colors colors) {
         return new ProgressIndicatorColors(colors.getPrimary(), colors.getSurface());
     }
 
     /** The indicator color to be used for a progress indicator Tiles component. */
-    @NonNull
-    public androidx.wear.tiles.ColorBuilders.ColorProp getIndicatorColor() {
+    public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getIndicatorColor() {
         return mIndicatorColor;
     }
 
     /** The background track color to be used for a progress indicator Tiles component. */
-    @NonNull
-    public androidx.wear.tiles.ColorBuilders.ColorProp getTrackColor() {
+    public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getTrackColor() {
         return mTrackColor;
     }
 }
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ProgressIndicatorDefaults.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ProgressIndicatorDefaults.java
index ef92913..54c2c5b 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ProgressIndicatorDefaults.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ProgressIndicatorDefaults.java
@@ -16,10 +16,11 @@
 
 package androidx.wear.tiles.material;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * Contains the default values used by {@link CircularProgressIndicator} Tiles components.
  *
@@ -33,19 +34,16 @@
     private ProgressIndicatorDefaults() {}
 
     /** The default stroke width for {@link CircularProgressIndicator} */
-    @NonNull
-    public static final androidx.wear.tiles.DimensionBuilders.DpProp DEFAULT_STROKE_WIDTH =
+    public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp DEFAULT_STROKE_WIDTH =
             androidx.wear.tiles.DimensionBuilders.dp(8);
 
     /** The default padding for {@link CircularProgressIndicator} */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
-    public static final androidx.wear.tiles.DimensionBuilders.DpProp DEFAULT_PADDING =
+    public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp DEFAULT_PADDING =
             androidx.wear.tiles.DimensionBuilders.dp(6);
 
     /** The recommended colors for {@link CircularProgressIndicator}. */
-    @NonNull
-    public static final ProgressIndicatorColors DEFAULT_COLORS =
+    public static final @NonNull ProgressIndicatorColors DEFAULT_COLORS =
             ProgressIndicatorColors.progressIndicatorColors(Colors.DEFAULT);
 
     static final float DEFAULT_GAP_LENGTH = 47.8f;
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Text.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Text.java
index 2819794..ed5b641 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Text.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Text.java
@@ -19,14 +19,15 @@
 import android.content.Context;
 
 import androidx.annotation.IntRange;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
 import androidx.wear.protolayout.proto.LayoutElementProto;
 import androidx.wear.protolayout.proto.ModifiersProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Tiles component {@link Text} that represents text object holding any information.
  *
@@ -64,20 +65,19 @@
      */
     static final String METADATA_TAG = "TXT";
 
-    @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Text mText;
+    private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Text mText;
 
-    Text(@NonNull androidx.wear.tiles.LayoutElementBuilders.Text mText) {
+    Text(androidx.wear.tiles.LayoutElementBuilders.@NonNull Text mText) {
         this.mText = mText;
     }
 
     /** Builder class for {@link Text}. */
     public static final class Builder
             implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-        @NonNull private final Context mContext;
-        @NonNull private String mTextContent = "";
+        private final @NonNull Context mContext;
+        private @NonNull String mTextContent = "";
 
-        @NonNull
-        private androidx.wear.tiles.ColorBuilders.ColorProp mColor =
+        private androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mColor =
                 androidx.wear.tiles.ColorBuilders.argb(Colors.DEFAULT.getOnPrimary());
 
         private @Typography.TypographyName int mTypographyName = Typography.TYPOGRAPHY_DISPLAY1;
@@ -89,14 +89,13 @@
         private int mMultilineAlignment =
                 androidx.wear.tiles.LayoutElementBuilders.TEXT_ALIGN_CENTER;
 
-        @NonNull
-        private androidx.wear.tiles.ModifiersBuilders.Modifiers mModifiers =
+        private androidx.wear.tiles.ModifiersBuilders.@NonNull Modifiers mModifiers =
                 new androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder().build();
 
         private @androidx.wear.tiles.LayoutElementBuilders.TextOverflow int mOverflow =
                 androidx.wear.tiles.LayoutElementBuilders.TEXT_OVERFLOW_ELLIPSIZE_END;
         private boolean mIsScalable = true;
-        @Nullable private Integer mCustomWeight = null;
+        private @Nullable Integer mCustomWeight = null;
 
         /**
          * Creates a builder for {@link Text}.
@@ -113,12 +112,11 @@
          * Sets the typography for the {@link Text}. If not set, {@link
          * Typography#TYPOGRAPHY_DISPLAY1} will be used.
          */
-        @NonNull
         @SuppressWarnings("MissingGetterMatchingBuilder")
         // There is getFontStyle matching getter for this setter as the serialized format of the
         // Tiles do not allow for a direct reconstruction of the all arguments, but it has
         // androidx.wear.tiles.LayoutElementBuilders.FontStyle object of that text.
-        public Builder setTypography(@Typography.TypographyName int typography) {
+        public @NonNull Builder setTypography(@Typography.TypographyName int typography) {
             this.mTypographyName = typography;
             return this;
         }
@@ -136,29 +134,26 @@
          * Sets the color for the {@link Text}. If not set, onPrimary color from the {@link
          * Colors#DEFAULT} will be used.
          */
-        @NonNull
-        public Builder setColor(@NonNull androidx.wear.tiles.ColorBuilders.ColorProp color) {
+        public @NonNull Builder setColor(
+                androidx.wear.tiles.ColorBuilders.@NonNull ColorProp color) {
             this.mColor = color;
             return this;
         }
 
         /** Sets the text to be italic. If not set, false will be used. */
-        @NonNull
-        public Builder setItalic(boolean italic) {
+        public @NonNull Builder setItalic(boolean italic) {
             this.mItalic = italic;
             return this;
         }
 
         /** Sets the text to be underlined. If not set, false will be used. */
-        @NonNull
-        public Builder setUnderline(boolean underline) {
+        public @NonNull Builder setUnderline(boolean underline) {
             this.mUnderline = underline;
             return this;
         }
 
         /** Sets the maximum lines of text. If not set, 1 will be used. */
-        @NonNull
-        public Builder setMaxLines(@IntRange(from = 1) int maxLines) {
+        public @NonNull Builder setMaxLines(@IntRange(from = 1) int maxLines) {
             this.mMaxLines = maxLines;
             return this;
         }
@@ -169,17 +164,15 @@
          * container should be used. If not set, {@link
          * androidx.wear.tiles.LayoutElementBuilders.TextAlignment#TEXT_ALIGN_CENTER} will be used.
          */
-        @NonNull
-        public Builder setMultilineAlignment(
+        public @NonNull Builder setMultilineAlignment(
                 @androidx.wear.tiles.LayoutElementBuilders.TextAlignment int multilineAlignment) {
             this.mMultilineAlignment = multilineAlignment;
             return this;
         }
 
         /** Sets the modifiers of text. */
-        @NonNull
-        public Builder setModifiers(
-                @NonNull androidx.wear.tiles.ModifiersBuilders.Modifiers modifiers) {
+        public @NonNull Builder setModifiers(
+                androidx.wear.tiles.ModifiersBuilders.@NonNull Modifiers modifiers) {
             this.mModifiers = modifiers;
             return this;
         }
@@ -189,8 +182,7 @@
          * androidx.wear.tiles.LayoutElementBuilders.TextAlignment#TEXT_OVERFLOW_ELLIPSIZE_END} will
          * be used.
          */
-        @NonNull
-        public Builder setOverflow(
+        public @NonNull Builder setOverflow(
                 @androidx.wear.tiles.LayoutElementBuilders.TextOverflow int overflow) {
             this.mOverflow = overflow;
             return this;
@@ -200,16 +192,15 @@
          * Sets the weight of the font. If not set, default weight for the chosen Typography will be
          * used.
          */
-        @NonNull
-        public Builder setWeight(@androidx.wear.tiles.LayoutElementBuilders.FontWeight int weight) {
+        public @NonNull Builder setWeight(
+                @androidx.wear.tiles.LayoutElementBuilders.FontWeight int weight) {
             this.mCustomWeight = weight;
             return this;
         }
 
         /** Constructs and returns {@link Text} with the provided content and look. */
-        @NonNull
         @Override
-        public Text build() {
+        public @NonNull Text build() {
             androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder fontStyleBuilder =
                     Typography.getFontStyleBuilder(mTypographyName, mContext, mIsScalable)
                             .setColor(mColor)
@@ -231,8 +222,7 @@
             return new Text(text.build());
         }
 
-        @NonNull
-        static androidx.wear.tiles.ModifiersBuilders.Modifiers addTagToModifiers(
+        static androidx.wear.tiles.ModifiersBuilders.@NonNull Modifiers addTagToModifiers(
                 androidx.wear.tiles.ModifiersBuilders.Modifiers modifiers) {
             return androidx.wear.tiles.ModifiersBuilders.Modifiers.fromProto(
                     ModifiersProto.Modifiers.newBuilder(modifiers.toProto())
@@ -250,22 +240,19 @@
     }
 
     /** Returns the text of this Text element. */
-    @NonNull
-    public String getText() {
+    public @NonNull String getText() {
         return androidx.wear.tiles.material.Helper.checkNotNull(
                 androidx.wear.tiles.material.Helper.checkNotNull(mText.getText()).getValue());
     }
 
     /** Returns the color of this Text element. */
-    @NonNull
-    public androidx.wear.tiles.ColorBuilders.ColorProp getColor() {
+    public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getColor() {
         return androidx.wear.tiles.material.Helper.checkNotNull(
                 androidx.wear.tiles.material.Helper.checkNotNull(mText.getFontStyle()).getColor());
     }
 
     /** Returns the font style of this Text element. */
-    @NonNull
-    public androidx.wear.tiles.LayoutElementBuilders.FontStyle getFontStyle() {
+    public androidx.wear.tiles.LayoutElementBuilders.@NonNull FontStyle getFontStyle() {
         return androidx.wear.tiles.material.Helper.checkNotNull(mText.getFontStyle());
     }
 
@@ -287,8 +274,7 @@
     }
 
     /** Returns the modifiers of this Text element. */
-    @NonNull
-    public androidx.wear.tiles.ModifiersBuilders.Modifiers getModifiers() {
+    public androidx.wear.tiles.ModifiersBuilders.@NonNull Modifiers getModifiers() {
         return androidx.wear.tiles.material.Helper.checkNotNull(mText.getModifiers());
     }
 
@@ -324,8 +310,7 @@
     }
 
     /** Returns metadata tag set to this Text, which should be {@link #METADATA_TAG}. */
-    @NonNull
-    String getMetadataTag() {
+    @NonNull String getMetadataTag() {
         return androidx.wear.tiles.material.Helper.getMetadataTagName(
                 androidx.wear.tiles.material.Helper.checkNotNull(
                         androidx.wear.tiles.material.Helper.checkNotNull(getModifiers())
@@ -338,9 +323,8 @@
      * container's content with {@code container.getContents().get(index)}) if that element can be
      * converted to Material Text. Otherwise, it will return null.
      */
-    @Nullable
-    public static Text fromLayoutElement(
-            @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+    public static @Nullable Text fromLayoutElement(
+            androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
         if (element instanceof Text) {
             return (Text) element;
         }
@@ -357,17 +341,15 @@
         return new Text(textElement);
     }
 
-    @NonNull
     @Override
     @RestrictTo(Scope.LIBRARY_GROUP)
-    public LayoutElementProto.LayoutElement toLayoutElementProto() {
+    public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
         return mText.toLayoutElementProto();
     }
 
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @Nullable
     @Override
-    public Fingerprint getFingerprint() {
+    public @Nullable Fingerprint getFingerprint() {
         return mText.getFingerprint();
     }
 }
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/TitleChip.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/TitleChip.java
index 18cd2a1..3622bb2 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/TitleChip.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/TitleChip.java
@@ -21,13 +21,14 @@
 import android.content.Context;
 
 import androidx.annotation.Dimension;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
 import androidx.wear.protolayout.proto.LayoutElementProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Tiles component {@link TitleChip} that represents clickable object with the text.
  *
@@ -71,7 +72,7 @@
      */
     static final String METADATA_TAG = "TTLCHP";
 
-    @NonNull private final Chip mElement;
+    private final @NonNull Chip mElement;
 
     TitleChip(@NonNull Chip element) {
         this.mElement = element;
@@ -80,15 +81,14 @@
     /** Builder class for {@link TitleChip}. */
     public static final class Builder
             implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-        @NonNull private final Context mContext;
-        @NonNull private final String mText;
-        @NonNull private final androidx.wear.tiles.ModifiersBuilders.Clickable mClickable;
+        private final @NonNull Context mContext;
+        private final @NonNull String mText;
+        private final androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable mClickable;
 
-        @NonNull
-        private final androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+        private final androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
                 mDeviceParameters;
 
-        @NonNull private ChipColors mChipColors = ChipDefaults.TITLE_PRIMARY_COLORS;
+        private @NonNull ChipColors mChipColors = ChipDefaults.TITLE_PRIMARY_COLORS;
 
         @androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignment
         private int mHorizontalAlign =
@@ -96,7 +96,7 @@
 
         // Indicates that the width isn't set, so it will be automatically set by Chip.Builder
         // constructor.
-        @Nullable private androidx.wear.tiles.DimensionBuilders.ContainerDimension mWidth = null;
+        private androidx.wear.tiles.DimensionBuilders.@Nullable ContainerDimension mWidth = null;
 
         /**
          * Creates a builder for the {@link TitleChip} with associated action and the given text
@@ -111,9 +111,8 @@
         public Builder(
                 @NonNull Context context,
                 @NonNull String text,
-                @NonNull androidx.wear.tiles.ModifiersBuilders.Clickable clickable,
-                @NonNull
-                        androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+                androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable clickable,
+                androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
                                 deviceParameters) {
             this.mContext = context;
             this.mText = text;
@@ -127,15 +126,13 @@
          * ChipColors#getContentColor()} for the text. If not set, {@link
          * ChipDefaults#TITLE_PRIMARY_COLORS} will be used.
          */
-        @NonNull
-        public Builder setChipColors(@NonNull ChipColors chipColors) {
+        public @NonNull Builder setChipColors(@NonNull ChipColors chipColors) {
             mChipColors = chipColors;
             return this;
         }
 
         /** Sets the horizontal alignment in the chip. If not set, content will be centered. */
-        @NonNull
-        public Builder setHorizontalAlignment(
+        public @NonNull Builder setHorizontalAlignment(
                 @androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignment
                         int horizontalAlignment) {
             mHorizontalAlign = horizontalAlignment;
@@ -146,9 +143,8 @@
          * Sets the width of {@link TitleChip}. If not set, default value will be set to fill the
          * screen.
          */
-        @NonNull
-        public Builder setWidth(
-                @NonNull androidx.wear.tiles.DimensionBuilders.ContainerDimension width) {
+        public @NonNull Builder setWidth(
+                androidx.wear.tiles.DimensionBuilders.@NonNull ContainerDimension width) {
             mWidth = width;
             return this;
         }
@@ -157,16 +153,14 @@
          * Sets the width of {@link TitleChip}. If not set, default value will be set to fill the
          * screen.
          */
-        @NonNull
-        public Builder setWidth(@Dimension(unit = DP) float width) {
+        public @NonNull Builder setWidth(@Dimension(unit = DP) float width) {
             mWidth = androidx.wear.tiles.DimensionBuilders.dp(width);
             return this;
         }
 
         /** Constructs and returns {@link TitleChip} with the provided content and look. */
-        @NonNull
         @Override
-        public TitleChip build() {
+        public @NonNull TitleChip build() {
             Chip.Builder chipBuilder =
                     new Chip.Builder(mContext, mClickable, mDeviceParameters)
                             .setMetadataTag(METADATA_TAG)
@@ -189,26 +183,22 @@
     }
 
     /** Returns width of this Chip. */
-    @NonNull
-    public androidx.wear.tiles.DimensionBuilders.ContainerDimension getWidth() {
+    public androidx.wear.tiles.DimensionBuilders.@NonNull ContainerDimension getWidth() {
         return mElement.getWidth();
     }
 
     /** Returns click event action associated with this Chip. */
-    @NonNull
-    public androidx.wear.tiles.ModifiersBuilders.Clickable getClickable() {
+    public androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable getClickable() {
         return mElement.getClickable();
     }
 
     /** Returns chip color of this Chip. */
-    @NonNull
-    public ChipColors getChipColors() {
+    public @NonNull ChipColors getChipColors() {
         return mElement.getChipColors();
     }
 
     /** Returns text content of this Chip. */
-    @NonNull
-    public String getText() {
+    public @NonNull String getText() {
         return androidx.wear.tiles.material.Helper.checkNotNull(mElement.getPrimaryLabelContent());
     }
 
@@ -219,8 +209,7 @@
     }
 
     /** Returns metadata tag set to this TitleChip, which should be {@link #METADATA_TAG}. */
-    @NonNull
-    String getMetadataTag() {
+    @NonNull String getMetadataTag() {
         return mElement.getMetadataTag();
     }
 
@@ -230,9 +219,8 @@
      * container's content with {@code container.getContents().get(index)}) if that element can be
      * converted to TitleChip. Otherwise, it will return null.
      */
-    @Nullable
-    public static TitleChip fromLayoutElement(
-            @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+    public static @Nullable TitleChip fromLayoutElement(
+            androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
         if (element instanceof TitleChip) {
             return (TitleChip) element;
         }
@@ -250,16 +238,14 @@
     }
 
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
     @Override
-    public LayoutElementProto.LayoutElement toLayoutElementProto() {
+    public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
         return mElement.toLayoutElementProto();
     }
 
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @Nullable
     @Override
-    public Fingerprint getFingerprint() {
+    public @Nullable Fingerprint getFingerprint() {
         return mElement.getFingerprint();
     }
 }
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Typography.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Typography.java
index dd937c9..623b894 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Typography.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Typography.java
@@ -25,9 +25,10 @@
 
 import androidx.annotation.Dimension;
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.HashMap;
@@ -97,8 +98,8 @@
     @interface TypographyName {}
 
     /** Mapping for line height for different typography. */
-    @NonNull
-    private static final Map<Integer, Float> TYPOGRAPHY_TO_LINE_HEIGHT_SP = new HashMap<>();
+    private static final @NonNull Map<Integer, Float> TYPOGRAPHY_TO_LINE_HEIGHT_SP =
+            new HashMap<>();
 
     static {
         TYPOGRAPHY_TO_LINE_HEIGHT_SP.put(TYPOGRAPHY_DISPLAY1, 46f);
@@ -120,8 +121,7 @@
      * androidx.wear.tiles.LayoutElementBuilders.FontStyle code with the recommended size, weight
      * and letter spacing. Font will be scalable.
      */
-    @NonNull
-    static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder getFontStyleBuilder(
+    static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder getFontStyleBuilder(
             @TypographyName int fontStyleCode, @NonNull Context context) {
         return getFontStyleBuilder(fontStyleCode, context, true);
     }
@@ -133,8 +133,7 @@
      * Typography code with the recommended size, weight and letter spacing, with the option to make
      * this font not scalable.
      */
-    @NonNull
-    static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder getFontStyleBuilder(
+    static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder getFontStyleBuilder(
             @TypographyName int typographyCode, @NonNull Context context, boolean isScalable) {
         switch (typographyCode) {
             case TYPOGRAPHY_BODY1:
@@ -172,8 +171,7 @@
      * Returns the recommended line height for the given Typography to be added to the Text
      * component.
      */
-    @NonNull
-    static androidx.wear.tiles.DimensionBuilders.SpProp getLineHeightForTypography(
+    static androidx.wear.tiles.DimensionBuilders.@NonNull SpProp getLineHeightForTypography(
             @TypographyName int typography) {
         if (!TYPOGRAPHY_TO_LINE_HEIGHT_SP.containsKey(typography)) {
             throw new IllegalArgumentException("Typography " + typography + " doesn't exist.");
@@ -184,7 +182,6 @@
                         .intValue());
     }
 
-    @NonNull
     @SuppressLint("ResourceType")
     // This is a helper function to make the font not scalable. It should interpret in value as DP
     // and convert it to SP which is needed to be passed in as a font size. However, we will pass an
@@ -192,7 +189,7 @@
     // size on device in 1, so the DP is equal to SP.
     // TODO(b/267744228): Remove the warning suppression.
     @SuppressWarnings("deprecation")
-    private static androidx.wear.tiles.DimensionBuilders.SpProp dpToSp(
+    private static androidx.wear.tiles.DimensionBuilders.@NonNull SpProp dpToSp(
             @NonNull Context context, @Dimension(unit = DP) float valueDp) {
         DisplayMetrics metrics = context.getResources().getDisplayMetrics();
         float scaledSp = (valueDp / metrics.scaledDensity) * metrics.density;
@@ -222,8 +219,7 @@
     }
 
     /** Font style for large display text. */
-    @NonNull
-    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder display1(
+    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder display1(
             boolean isScalable, @NonNull Context context) {
         return createFontStyleBuilder(
                 40,
@@ -235,8 +231,7 @@
     }
 
     /** Font style for medium display text. */
-    @NonNull
-    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder display2(
+    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder display2(
             boolean isScalable, @NonNull Context context) {
         return createFontStyleBuilder(
                 34,
@@ -248,8 +243,7 @@
     }
 
     /** Font style for small display text. */
-    @NonNull
-    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder display3(
+    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder display3(
             boolean isScalable, @NonNull Context context) {
         return createFontStyleBuilder(
                 30,
@@ -261,8 +255,7 @@
     }
 
     /** Font style for large title text. */
-    @NonNull
-    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder title1(
+    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder title1(
             boolean isScalable, @NonNull Context context) {
         return createFontStyleBuilder(
                 24,
@@ -274,8 +267,7 @@
     }
 
     /** Font style for medium title text. */
-    @NonNull
-    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder title2(
+    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder title2(
             boolean isScalable, @NonNull Context context) {
         return createFontStyleBuilder(
                 20,
@@ -287,8 +279,7 @@
     }
 
     /** Font style for small title text. */
-    @NonNull
-    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder title3(
+    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder title3(
             boolean isScalable, @NonNull Context context) {
         return createFontStyleBuilder(
                 16,
@@ -300,8 +291,7 @@
     }
 
     /** Font style for normal body text. */
-    @NonNull
-    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder body1(
+    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder body1(
             boolean isScalable, @NonNull Context context) {
         return createFontStyleBuilder(
                 16,
@@ -313,8 +303,7 @@
     }
 
     /** Font style for small body text. */
-    @NonNull
-    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder body2(
+    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder body2(
             boolean isScalable, @NonNull Context context) {
         return createFontStyleBuilder(
                 14,
@@ -326,8 +315,7 @@
     }
 
     /** Font style for bold button text. */
-    @NonNull
-    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder button(
+    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder button(
             boolean isScalable, @NonNull Context context) {
         return createFontStyleBuilder(
                 15,
@@ -339,8 +327,7 @@
     }
 
     /** Font style for large caption text. */
-    @NonNull
-    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder caption1(
+    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder caption1(
             boolean isScalable, @NonNull Context context) {
         return createFontStyleBuilder(
                 14,
@@ -352,8 +339,7 @@
     }
 
     /** Font style for medium caption text. */
-    @NonNull
-    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder caption2(
+    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder caption2(
             boolean isScalable, @NonNull Context context) {
         return createFontStyleBuilder(
                 12,
@@ -365,8 +351,7 @@
     }
 
     /** Font style for small caption text. */
-    @NonNull
-    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder caption3(
+    private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder caption3(
             boolean isScalable, @NonNull Context context) {
         return createFontStyleBuilder(
                 10,
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/EdgeContentLayout.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/EdgeContentLayout.java
index 2f0c55c..c257513 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/EdgeContentLayout.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/EdgeContentLayout.java
@@ -17,13 +17,14 @@
 package androidx.wear.tiles.material.layouts;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
 import androidx.wear.protolayout.proto.LayoutElementProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.Arrays;
@@ -123,16 +124,16 @@
             })
     @interface ContentBits {}
 
-    @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Box mImpl;
+    private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Box mImpl;
 
     // This contains inner columns and edge content.
-    @NonNull private final List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> mContents;
+    private final @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> mContents;
 
     // This contains optional labels, spacers and main content.
-    @NonNull
-    private final List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> mInnerColumn;
+    private final @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+            mInnerColumn;
 
-    EdgeContentLayout(@NonNull androidx.wear.tiles.LayoutElementBuilders.Box layoutElement) {
+    EdgeContentLayout(androidx.wear.tiles.LayoutElementBuilders.@NonNull Box layoutElement) {
         this.mImpl = layoutElement;
         this.mContents = mImpl.getContents();
         this.mInnerColumn =
@@ -146,20 +147,19 @@
     /** Builder class for {@link EdgeContentLayout}. */
     public static final class Builder
             implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-        @NonNull
-        private final androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+        private final androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
                 mDeviceParameters;
 
-        @Nullable
-        private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mEdgeContent = null;
+        private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement mEdgeContent =
+                null;
 
-        @Nullable
-        private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mPrimaryLabelText = null;
+        private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+                mPrimaryLabelText = null;
 
-        @Nullable
-        private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mSecondaryLabelText = null;
+        private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+                mSecondaryLabelText = null;
 
-        @Nullable private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mContent = null;
+        private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement mContent = null;
         private byte mMetadataContentByte = 0;
 
         /**
@@ -167,8 +167,7 @@
          * later be set with ({@link #setContent}.
          */
         public Builder(
-                @NonNull
-                        androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+                androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
                                 deviceParameters) {
             this.mDeviceParameters = deviceParameters;
         }
@@ -176,18 +175,16 @@
         /**
          * Sets the content to be around the edges. This can be {@link CircularProgressIndicator}.
          */
-        @NonNull
-        public Builder setEdgeContent(
-                @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement edgeContent) {
+        public @NonNull Builder setEdgeContent(
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement edgeContent) {
             this.mEdgeContent = edgeContent;
             mMetadataContentByte = (byte) (mMetadataContentByte | EDGE_CONTENT_PRESENT);
             return this;
         }
 
         /** Sets the content in the primary label slot which will be above the main content. */
-        @NonNull
-        public Builder setPrimaryLabelTextContent(
-                @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement primaryLabelText) {
+        public @NonNull Builder setPrimaryLabelTextContent(
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement primaryLabelText) {
             this.mPrimaryLabelText = primaryLabelText;
             mMetadataContentByte = (byte) (mMetadataContentByte | PRIMARY_LABEL_PRESENT);
             return this;
@@ -197,10 +194,8 @@
          * Sets the content in the secondary label slot which will be below the main content. It is
          * highly recommended to have primary label set when having secondary label.
          */
-        @NonNull
-        public Builder setSecondaryLabelTextContent(
-                @NonNull
-                        androidx.wear.tiles.LayoutElementBuilders.LayoutElement
+        public @NonNull Builder setSecondaryLabelTextContent(
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement
                                 secondaryLabelText) {
             this.mSecondaryLabelText = secondaryLabelText;
             mMetadataContentByte = (byte) (mMetadataContentByte | SECONDARY_LABEL_PRESENT);
@@ -208,18 +203,16 @@
         }
 
         /** Sets the additional content to this layout, inside of the screen. */
-        @NonNull
-        public Builder setContent(
-                @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement content) {
+        public @NonNull Builder setContent(
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement content) {
             this.mContent = content;
             mMetadataContentByte = (byte) (mMetadataContentByte | CONTENT_PRESENT);
             return this;
         }
 
         /** Constructs and returns {@link EdgeContentLayout} with the provided content and look. */
-        @NonNull
         @Override
-        public EdgeContentLayout build() {
+        public @NonNull EdgeContentLayout build() {
             float thicknessDp =
                     mEdgeContent instanceof androidx.wear.tiles.material.CircularProgressIndicator
                             ? ((androidx.wear.tiles.material.CircularProgressIndicator)
@@ -345,8 +338,7 @@
     }
 
     /** Returns metadata tag set to this EdgeContentLayout. */
-    @NonNull
-    byte[] getMetadataTag() {
+    byte @NonNull [] getMetadataTag() {
         return androidx.wear.tiles.material.Helper.getMetadataTagBytes(
                 androidx.wear.tiles.material.Helper.checkNotNull(
                         androidx.wear.tiles.material.Helper.checkNotNull(mImpl.getModifiers())
@@ -354,8 +346,7 @@
     }
 
     /** Returns the inner content from this layout. */
-    @Nullable
-    public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getContent() {
+    public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement getContent() {
         if (!areElementsPresent(CONTENT_PRESENT)) {
             return null;
         }
@@ -368,8 +359,8 @@
     }
 
     /** Get the primary label content from this layout. */
-    @Nullable
-    public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getPrimaryLabelTextContent() {
+    public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+            getPrimaryLabelTextContent() {
         if (!areElementsPresent(PRIMARY_LABEL_PRESENT)) {
             return null;
         }
@@ -378,8 +369,8 @@
     }
 
     /** Get the secondary label content from this layout. */
-    @Nullable
-    public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getSecondaryLabelTextContent() {
+    public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+            getSecondaryLabelTextContent() {
         if (!areElementsPresent(SECONDARY_LABEL_PRESENT)) {
             return null;
         }
@@ -388,8 +379,7 @@
     }
 
     /** Returns the edge content from this layout. */
-    @Nullable
-    public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getEdgeContent() {
+    public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement getEdgeContent() {
         if (areElementsPresent(EDGE_CONTENT_PRESENT)) {
             return mContents.get(1);
         }
@@ -402,9 +392,8 @@
      * container's content with {@code container.getContents().get(index)}) if that element can be
      * converted to EdgeContentLayout. Otherwise, it will return null.
      */
-    @Nullable
-    public static EdgeContentLayout fromLayoutElement(
-            @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+    public static @Nullable EdgeContentLayout fromLayoutElement(
+            androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
         if (element instanceof EdgeContentLayout) {
             return (EdgeContentLayout) element;
         }
@@ -421,17 +410,15 @@
         return new EdgeContentLayout(boxElement);
     }
 
-    @NonNull
     @Override
     @RestrictTo(Scope.LIBRARY_GROUP)
-    public LayoutElementProto.LayoutElement toLayoutElementProto() {
+    public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
         return mImpl.toLayoutElementProto();
     }
 
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @Nullable
     @Override
-    public Fingerprint getFingerprint() {
+    public @Nullable Fingerprint getFingerprint() {
         return mImpl.getFingerprint();
     }
 }
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/LayoutDefaults.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/LayoutDefaults.java
index 40b9cb8..883114d 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/LayoutDefaults.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/LayoutDefaults.java
@@ -16,7 +16,7 @@
 
 package androidx.wear.tiles.material.layouts;
 
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
 
 /**
  * Contains the default values used by layout templates for Tiles.
@@ -110,13 +110,11 @@
     public static final float EDGE_CONTENT_LAYOUT_PADDING_BELOW_MAIN_CONTENT_DP = 8;
 
     /** The default spacer width for slots in a {@link MultiSlotLayout}. */
-    @NonNull
-    public static final androidx.wear.tiles.DimensionBuilders.DpProp
+    public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp
             MULTI_SLOT_LAYOUT_HORIZONTAL_SPACER_WIDTH = androidx.wear.tiles.DimensionBuilders.dp(8);
 
     /** The recommended space between the main content and additional labels in layouts. */
-    @NonNull
-    public static final androidx.wear.tiles.DimensionBuilders.DpProp
+    public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp
             DEFAULT_VERTICAL_SPACER_HEIGHT = androidx.wear.tiles.DimensionBuilders.dp(8);
 
     /** The maximum number of button that can be added to the {@link MultiButtonLayout}. */
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/MultiButtonLayout.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/MultiButtonLayout.java
index 4f521ce..f476080 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/MultiButtonLayout.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/MultiButtonLayout.java
@@ -17,13 +17,14 @@
 package androidx.wear.tiles.material.layouts;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
 import androidx.wear.protolayout.proto.LayoutElementProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
@@ -81,17 +82,16 @@
     @IntDef({FIVE_BUTTON_DISTRIBUTION_TOP_HEAVY, FIVE_BUTTON_DISTRIBUTION_BOTTOM_HEAVY})
     public @interface ButtonDistribution {}
 
-    @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Box mElement;
+    private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Box mElement;
 
-    MultiButtonLayout(@NonNull androidx.wear.tiles.LayoutElementBuilders.Box mElement) {
+    MultiButtonLayout(androidx.wear.tiles.LayoutElementBuilders.@NonNull Box mElement) {
         this.mElement = mElement;
     }
 
     /** Builder class for {@link MultiButtonLayout}. */
     public static final class Builder
             implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-        @NonNull
-        private final List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+        private final @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
                 mButtonsContent = new ArrayList<>();
 
         private @ButtonDistribution int mFiveButtonDistribution =
@@ -109,12 +109,11 @@
          * to add a {@link Button} as the layout is optimized for it. Any button added after {@link
          * LayoutDefaults#MULTI_BUTTON_MAX_NUMBER} is reached will be discarded.
          */
-        @NonNull
         @SuppressWarnings("MissingGetterMatchingBuilder")
         // There is no direct matching getter for this setter, but there is a getter that gets all
         // added buttons.
-        public Builder addButtonContent(
-                @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement buttonContent) {
+        public @NonNull Builder addButtonContent(
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement buttonContent) {
             mButtonsContent.add(buttonContent);
             return this;
         }
@@ -124,16 +123,15 @@
          * there is 5 buttons in the layout to determine whether the 3 buttons row is at the top or
          * bottom.
          */
-        @NonNull
-        public Builder setFiveButtonDistribution(@ButtonDistribution int fiveButtonDistribution) {
+        public @NonNull Builder setFiveButtonDistribution(
+                @ButtonDistribution int fiveButtonDistribution) {
             this.mFiveButtonDistribution = fiveButtonDistribution;
             return this;
         }
 
         /** Constructs and returns {@link MultiButtonLayout} with the provided content and look. */
-        @NonNull
         @Override
-        public MultiButtonLayout build() {
+        public @NonNull MultiButtonLayout build() {
             int buttonNum = mButtonsContent.size();
             if (buttonNum > LayoutDefaults.MULTI_BUTTON_MAX_NUMBER) {
                 throw new IllegalArgumentException(
@@ -162,8 +160,7 @@
             return new MultiButtonLayout(elementBuilder.build());
         }
 
-        @NonNull
-        private androidx.wear.tiles.LayoutElementBuilders.LayoutElement buildButtons(
+        private androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement buildButtons(
                 int buttonNum) {
             switch (buttonNum) {
                 case 1:
@@ -255,11 +252,10 @@
             return new androidx.wear.tiles.LayoutElementBuilders.Box.Builder().build();
         }
 
-        @NonNull
-        private androidx.wear.tiles.LayoutElementBuilders.Row build3ButtonRow(
-                @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement button1,
-                @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement button2,
-                @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement button3) {
+        private androidx.wear.tiles.LayoutElementBuilders.@NonNull Row build3ButtonRow(
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement button1,
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement button2,
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement button3) {
             return new androidx.wear.tiles.LayoutElementBuilders.Row.Builder()
                     .setWidth(androidx.wear.tiles.DimensionBuilders.wrap())
                     .setHeight(androidx.wear.tiles.DimensionBuilders.wrap())
@@ -271,11 +267,10 @@
                     .build();
         }
 
-        @NonNull
-        private androidx.wear.tiles.LayoutElementBuilders.Row build2ButtonRow(
-                @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement button1,
-                @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement button2,
-                @NonNull androidx.wear.tiles.DimensionBuilders.DpProp size) {
+        private androidx.wear.tiles.LayoutElementBuilders.@NonNull Row build2ButtonRow(
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement button1,
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement button2,
+                androidx.wear.tiles.DimensionBuilders.@NonNull DpProp size) {
             return new androidx.wear.tiles.LayoutElementBuilders.Row.Builder()
                     .setWidth(androidx.wear.tiles.DimensionBuilders.wrap())
                     .setHeight(androidx.wear.tiles.DimensionBuilders.wrap())
@@ -285,24 +280,21 @@
                     .build();
         }
 
-        @NonNull
-        private androidx.wear.tiles.LayoutElementBuilders.Spacer buildHorizontalSpacer() {
+        private androidx.wear.tiles.LayoutElementBuilders.@NonNull Spacer buildHorizontalSpacer() {
             return new androidx.wear.tiles.LayoutElementBuilders.Spacer.Builder()
                     .setWidth(LayoutDefaults.MULTI_BUTTON_SPACER_WIDTH)
                     .build();
         }
 
-        @NonNull
-        private androidx.wear.tiles.LayoutElementBuilders.Spacer buildVerticalSpacer() {
+        private androidx.wear.tiles.LayoutElementBuilders.@NonNull Spacer buildVerticalSpacer() {
             return new androidx.wear.tiles.LayoutElementBuilders.Spacer.Builder()
                     .setHeight(LayoutDefaults.MULTI_BUTTON_SPACER_HEIGHT)
                     .build();
         }
 
-        @NonNull
-        private androidx.wear.tiles.LayoutElementBuilders.Box wrapButton(
-                @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement button,
-                @NonNull androidx.wear.tiles.DimensionBuilders.DpProp size) {
+        private androidx.wear.tiles.LayoutElementBuilders.@NonNull Box wrapButton(
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement button,
+                androidx.wear.tiles.DimensionBuilders.@NonNull DpProp size) {
             return new androidx.wear.tiles.LayoutElementBuilders.Box.Builder()
                     .setWidth(size)
                     .setHeight(size)
@@ -312,8 +304,8 @@
     }
 
     /** Gets the content from this layout, containing all buttons that were added. */
-    @NonNull
-    public List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> getButtonContents() {
+    public @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+            getButtonContents() {
         List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> buttons = new ArrayList<>();
         List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> contents =
                 mElement.getContents();
@@ -343,8 +335,7 @@
     }
 
     /** Returns metadata tag set to this MultiButtonLayouts. */
-    @NonNull
-    String getMetadataTag() {
+    @NonNull String getMetadataTag() {
         return androidx.wear.tiles.material.Helper.getMetadataTagName(
                 androidx.wear.tiles.material.Helper.checkNotNull(
                         androidx.wear.tiles.material.Helper.checkNotNull(mElement.getModifiers())
@@ -405,9 +396,8 @@
      * container's content with {@code container.getContents().get(index)}) if that element can be
      * converted to MultiButtonLayout. Otherwise, it will return null.
      */
-    @Nullable
-    public static MultiButtonLayout fromLayoutElement(
-            @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+    public static @Nullable MultiButtonLayout fromLayoutElement(
+            androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
         if (element instanceof MultiButtonLayout) {
             return (MultiButtonLayout) element;
         }
@@ -424,17 +414,15 @@
         return new MultiButtonLayout(boxElement);
     }
 
-    @NonNull
     @Override
     @RestrictTo(Scope.LIBRARY_GROUP)
-    public LayoutElementProto.LayoutElement toLayoutElementProto() {
+    public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
         return mElement.toLayoutElementProto();
     }
 
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @Nullable
     @Override
-    public Fingerprint getFingerprint() {
+    public @Nullable Fingerprint getFingerprint() {
         return mElement.getFingerprint();
     }
 }
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/MultiSlotLayout.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/MultiSlotLayout.java
index 104e75e..7e8fe36d 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/MultiSlotLayout.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/MultiSlotLayout.java
@@ -21,13 +21,14 @@
 import android.annotation.SuppressLint;
 
 import androidx.annotation.Dimension;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
 import androidx.wear.protolayout.proto.LayoutElementProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -73,9 +74,9 @@
      */
     static final String METADATA_TAG = "MSL";
 
-    @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Row mElement;
+    private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Row mElement;
 
-    MultiSlotLayout(@NonNull androidx.wear.tiles.LayoutElementBuilders.Row mElement) {
+    MultiSlotLayout(androidx.wear.tiles.LayoutElementBuilders.@NonNull Row mElement) {
         this.mElement = mElement;
     }
 
@@ -83,12 +84,10 @@
     public static final class Builder
             implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
 
-        @NonNull
-        private final List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> mSlotsContent =
-                new ArrayList<>();
+        private final @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+                mSlotsContent = new ArrayList<>();
 
-        @NonNull
-        private androidx.wear.tiles.DimensionBuilders.DpProp mHorizontalSpacerWidth =
+        private androidx.wear.tiles.DimensionBuilders.@NonNull DpProp mHorizontalSpacerWidth =
                 LayoutDefaults.MULTI_SLOT_LAYOUT_HORIZONTAL_SPACER_WIDTH;
 
         /**
@@ -98,12 +97,11 @@
         public Builder() {}
 
         /** Add one new slot to the layout with the given content inside. */
-        @NonNull
         @SuppressWarnings("MissingGetterMatchingBuilder")
         // There is no direct matching getter for this setter, but there is a getter that gets all
         // added slots.
-        public Builder addSlotContent(
-                @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement slotContent) {
+        public @NonNull Builder addSlotContent(
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement slotContent) {
             mSlotsContent.add(slotContent);
             return this;
         }
@@ -113,20 +111,18 @@
          * than one slot. If not set, {@link
          * LayoutDefaults#MULTI_SLOT_LAYOUT_HORIZONTAL_SPACER_WIDTH} will be used.
          */
-        @NonNull
-        public Builder setHorizontalSpacerWidth(@Dimension(unit = DP) float width) {
+        public @NonNull Builder setHorizontalSpacerWidth(@Dimension(unit = DP) float width) {
             this.mHorizontalSpacerWidth = androidx.wear.tiles.DimensionBuilders.dp(width);
             return this;
         }
 
         /** Constructs and returns {@link MultiSlotLayout} with the provided content and look. */
-        @NonNull
         @Override
         // The @Dimension(unit = DP) on mVerticalSpacerHeight.getValue() is seemingly being ignored,
         // so lint complains that we're passing PX to something expecting DP. Just suppress the
         // warning for now.
         @SuppressLint("ResourceType")
-        public MultiSlotLayout build() {
+        public @NonNull MultiSlotLayout build() {
             androidx.wear.tiles.LayoutElementBuilders.Row.Builder rowBuilder =
                     new androidx.wear.tiles.LayoutElementBuilders.Row.Builder()
                             .setHeight(androidx.wear.tiles.DimensionBuilders.wrap())
@@ -170,8 +166,8 @@
     }
 
     /** Gets the content from this layout, containing all slots that were added. */
-    @NonNull
-    public List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> getSlotContents() {
+    public @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+            getSlotContents() {
         List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> slots = new ArrayList<>();
         for (androidx.wear.tiles.LayoutElementBuilders.LayoutElement slot :
                 mElement.getContents()) {
@@ -206,8 +202,7 @@
     }
 
     /** Returns metadata tag set to this MultiSlotLayout. */
-    @NonNull
-    String getMetadataTag() {
+    @NonNull String getMetadataTag() {
         return androidx.wear.tiles.material.Helper.getMetadataTagName(
                 androidx.wear.tiles.material.Helper.checkNotNull(
                         androidx.wear.tiles.material.Helper.checkNotNull(mElement.getModifiers())
@@ -220,9 +215,8 @@
      * container's content with {@code container.getContents().get(index)}) if that element can be
      * converted to MultiSlotLayout. Otherwise, it will return null.
      */
-    @Nullable
-    public static MultiSlotLayout fromLayoutElement(
-            @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+    public static @Nullable MultiSlotLayout fromLayoutElement(
+            androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
         if (element instanceof MultiSlotLayout) {
             return (MultiSlotLayout) element;
         }
@@ -239,17 +233,15 @@
         return new MultiSlotLayout(rowElement);
     }
 
-    @NonNull
     @Override
     @RestrictTo(Scope.LIBRARY_GROUP)
-    public LayoutElementProto.LayoutElement toLayoutElementProto() {
+    public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
         return mElement.toLayoutElementProto();
     }
 
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @Nullable
     @Override
-    public Fingerprint getFingerprint() {
+    public @Nullable Fingerprint getFingerprint() {
         return mElement.getFingerprint();
     }
 }
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/PrimaryLayout.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/PrimaryLayout.java
index 037ba46..f3f0e86 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/PrimaryLayout.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/PrimaryLayout.java
@@ -22,13 +22,14 @@
 
 import androidx.annotation.Dimension;
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
 import androidx.wear.protolayout.proto.LayoutElementProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.Arrays;
@@ -131,22 +132,21 @@
             value = {CHIP_PRESENT, PRIMARY_LABEL_PRESENT, SECONDARY_LABEL_PRESENT, CONTENT_PRESENT})
     @interface ContentBits {}
 
-    @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Box mImpl;
+    private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Box mImpl;
 
     // This contains inner columns and primary chip.
-    @NonNull
-    private final List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> mAllContent;
+    private final @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+            mAllContent;
 
     // This contains optional labels, spacers and main content.
-    @NonNull
-    private final List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> mPrimaryLabel;
+    private final @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+            mPrimaryLabel;
 
     // This contains optional labels, spacers and main content.
-    @NonNull
-    private final List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+    private final @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
             mContentAndSecondaryLabel;
 
-    PrimaryLayout(@NonNull androidx.wear.tiles.LayoutElementBuilders.Box layoutElement) {
+    PrimaryLayout(androidx.wear.tiles.LayoutElementBuilders.@NonNull Box layoutElement) {
         this.mImpl = layoutElement;
         this.mAllContent =
                 ((androidx.wear.tiles.LayoutElementBuilders.Column)
@@ -170,25 +170,22 @@
     /** Builder class for {@link PrimaryLayout}. */
     public static final class Builder
             implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
-        @NonNull
-        private final androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+        private final androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
                 mDeviceParameters;
 
-        @Nullable
-        private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mPrimaryChip = null;
+        private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement mPrimaryChip =
+                null;
 
-        @Nullable
-        private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mPrimaryLabelText = null;
+        private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+                mPrimaryLabelText = null;
 
-        @Nullable
-        private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mSecondaryLabelText = null;
+        private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+                mSecondaryLabelText = null;
 
-        @NonNull
-        private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mContent =
+        private androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement mContent =
                 new androidx.wear.tiles.LayoutElementBuilders.Box.Builder().build();
 
-        @NonNull
-        private androidx.wear.tiles.DimensionBuilders.DpProp mVerticalSpacerHeight =
+        private androidx.wear.tiles.DimensionBuilders.@NonNull DpProp mVerticalSpacerHeight =
                 LayoutDefaults.DEFAULT_VERTICAL_SPACER_HEIGHT;
 
         private byte mMetadataContentByte = 0;
@@ -199,8 +196,7 @@
          * #setPrimaryLabelTextContent} and {@link #setSecondaryLabelTextContent}.
          */
         public Builder(
-                @NonNull
-                        androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+                androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
                                 deviceParameters) {
             this.mDeviceParameters = deviceParameters;
         }
@@ -211,18 +207,16 @@
          * but it is strongly recommended to add a {@link CompactChip} as the layout is optimized
          * for it.
          */
-        @NonNull
-        public Builder setPrimaryChipContent(
-                @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement compactChip) {
+        public @NonNull Builder setPrimaryChipContent(
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement compactChip) {
             this.mPrimaryChip = compactChip;
             mMetadataContentByte = (byte) (mMetadataContentByte | CHIP_PRESENT);
             return this;
         }
 
         /** Sets the content in the primary label slot which will be above the main content. */
-        @NonNull
-        public Builder setPrimaryLabelTextContent(
-                @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement primaryLabelText) {
+        public @NonNull Builder setPrimaryLabelTextContent(
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement primaryLabelText) {
             this.mPrimaryLabelText = primaryLabelText;
             mMetadataContentByte = (byte) (mMetadataContentByte | PRIMARY_LABEL_PRESENT);
             return this;
@@ -232,10 +226,8 @@
          * Sets the content in the primary label slot which will be below the main content. It is
          * highly recommended to have primary label set when having secondary label.
          */
-        @NonNull
-        public Builder setSecondaryLabelTextContent(
-                @NonNull
-                        androidx.wear.tiles.LayoutElementBuilders.LayoutElement
+        public @NonNull Builder setSecondaryLabelTextContent(
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement
                                 secondaryLabelText) {
             this.mSecondaryLabelText = secondaryLabelText;
             mMetadataContentByte = (byte) (mMetadataContentByte | SECONDARY_LABEL_PRESENT);
@@ -252,9 +244,8 @@
          * set to {@code expand} to use all the available space, rather than an explicit width which
          * may lead to clipping.
          */
-        @NonNull
-        public Builder setContent(
-                @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement content) {
+        public @NonNull Builder setContent(
+                androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement content) {
             this.mContent = content;
             mMetadataContentByte = (byte) (mMetadataContentByte | CONTENT_PRESENT);
             return this;
@@ -265,11 +256,10 @@
          * secondary label if there is any. If not set, {@link
          * LayoutDefaults#DEFAULT_VERTICAL_SPACER_HEIGHT} will be used.
          */
-        @NonNull
         // The @Dimension(unit = DP) on dp() is seemingly being ignored, so lint complains that
         // we're passing PX to something expecting DP. Just suppress the warning for now.
         @SuppressLint("ResourceType")
-        public Builder setVerticalSpacerHeight(@Dimension(unit = DP) float height) {
+        public @NonNull Builder setVerticalSpacerHeight(@Dimension(unit = DP) float height) {
             this.mVerticalSpacerHeight = androidx.wear.tiles.DimensionBuilders.dp(height);
             return this;
         }
@@ -278,9 +268,8 @@
         // The @Dimension(unit = DP) on dp() is seemingly being ignored, so lint complains that
         // we're passing DP to something expecting PX. Just suppress the warning for now.
         @SuppressLint("ResourceType")
-        @NonNull
         @Override
-        public PrimaryLayout build() {
+        public @NonNull PrimaryLayout build() {
             float topPadding = getTopPadding();
             float bottomPadding = getBottomPadding();
             float horizontalPadding = getHorizontalPadding();
@@ -497,8 +486,8 @@
         }
 
         /** Returns the spacer height to be placed above primary label to accommodate Tile icon. */
-        @NonNull
-        private androidx.wear.tiles.DimensionBuilders.DpProp getPrimaryLabelTopSpacerHeight() {
+        private androidx.wear.tiles.DimensionBuilders.@NonNull DpProp
+                getPrimaryLabelTopSpacerHeight() {
             return androidx.wear.tiles.material.Helper.isRoundDevice(mDeviceParameters)
                     ? LayoutDefaults.PRIMARY_LAYOUT_PRIMARY_LABEL_SPACER_HEIGHT_ROUND_DP
                     : LayoutDefaults.PRIMARY_LAYOUT_PRIMARY_LABEL_SPACER_HEIGHT_SQUARE_DP;
@@ -506,8 +495,8 @@
     }
 
     /** Get the primary label content from this layout. */
-    @Nullable
-    public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getPrimaryLabelTextContent() {
+    public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+            getPrimaryLabelTextContent() {
         if (!areElementsPresent(PRIMARY_LABEL_PRESENT)) {
             return null;
         }
@@ -515,8 +504,8 @@
     }
 
     /** Get the secondary label content from this layout. */
-    @Nullable
-    public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getSecondaryLabelTextContent() {
+    public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+            getSecondaryLabelTextContent() {
         if (!areElementsPresent(SECONDARY_LABEL_PRESENT)) {
             return null;
         }
@@ -525,8 +514,7 @@
     }
 
     /** Get the inner content from this layout. */
-    @Nullable
-    public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getContent() {
+    public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement getContent() {
         if (!areElementsPresent(CONTENT_PRESENT)) {
             return null;
         }
@@ -537,8 +525,8 @@
     }
 
     /** Get the primary chip content from this layout. */
-    @Nullable
-    public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getPrimaryChipContent() {
+    public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+            getPrimaryChipContent() {
         if (areElementsPresent(CHIP_PRESENT)) {
             return ((androidx.wear.tiles.LayoutElementBuilders.Box)
                             mAllContent.get(PRIMARY_CHIP_POSITION))
@@ -573,8 +561,7 @@
     }
 
     /** Returns metadata tag set to this PrimaryLayout. */
-    @NonNull
-    byte[] getMetadataTag() {
+    byte @NonNull [] getMetadataTag() {
         return androidx.wear.tiles.material.Helper.getMetadataTagBytes(
                 androidx.wear.tiles.material.Helper.checkNotNull(
                         androidx.wear.tiles.material.Helper.checkNotNull(mImpl.getModifiers())
@@ -587,9 +574,8 @@
      * container's content with {@code container.getContents().get(index)}) if that element can be
      * converted to PrimaryLayout. Otherwise, it will return null.
      */
-    @Nullable
-    public static PrimaryLayout fromLayoutElement(
-            @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+    public static @Nullable PrimaryLayout fromLayoutElement(
+            androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
         if (element instanceof PrimaryLayout) {
             return (PrimaryLayout) element;
         }
@@ -606,17 +592,15 @@
         return new PrimaryLayout(boxElement);
     }
 
-    @NonNull
     @Override
     @RestrictTo(Scope.LIBRARY_GROUP)
-    public LayoutElementProto.LayoutElement toLayoutElementProto() {
+    public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
         return mImpl.toLayoutElementProto();
     }
 
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @Nullable
     @Override
-    public Fingerprint getFingerprint() {
+    public @Nullable Fingerprint getFingerprint() {
         return mImpl.getFingerprint();
     }
 }
diff --git a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/ButtonTest.java b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/ButtonTest.java
index 81ac645..7bc6c6a 100644
--- a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/ButtonTest.java
+++ b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/ButtonTest.java
@@ -22,11 +22,11 @@
 
 import android.content.Context;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.annotation.internal.DoNotInstrument;
@@ -232,15 +232,15 @@
 
     private void assertButton(
             @NonNull Button actualButton,
-            @NonNull androidx.wear.tiles.DimensionBuilders.DpProp expectedSize,
+            androidx.wear.tiles.DimensionBuilders.@NonNull DpProp expectedSize,
             @NonNull ButtonColors expectedButtonColors,
             @Nullable String expectedContentDescription,
             @NonNull String expectedMetadataTag,
             @Nullable String expectedTextContent,
             @Nullable String expectedIconContent,
             @Nullable String expectedImageContent,
-            @Nullable
-                    androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedCustomContent) {
+            androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+                    expectedCustomContent) {
         assertButtonIsEqual(
                 actualButton,
                 expectedSize,
@@ -268,15 +268,15 @@
 
     private void assertButtonIsEqual(
             @NonNull Button actualButton,
-            @NonNull androidx.wear.tiles.DimensionBuilders.DpProp expectedSize,
+            androidx.wear.tiles.DimensionBuilders.@NonNull DpProp expectedSize,
             @NonNull ButtonColors expectedButtonColors,
             @Nullable String expectedContentDescription,
             @NonNull String expectedMetadataTag,
             @Nullable String expectedTextContent,
             @Nullable String expectedIconContent,
             @Nullable String expectedImageContent,
-            @Nullable
-                    androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedCustomContent) {
+            androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+                    expectedCustomContent) {
         // Mandatory
         assertThat(actualButton.getMetadataTag()).isEqualTo(expectedMetadataTag);
         assertThat(actualButton.getClickable().toProto()).isEqualTo(CLICKABLE.toProto());
@@ -323,15 +323,15 @@
 
     private void assertFromLayoutElementButtonIsEqual(
             @NonNull Button button,
-            @NonNull androidx.wear.tiles.DimensionBuilders.DpProp expectedSize,
+            androidx.wear.tiles.DimensionBuilders.@NonNull DpProp expectedSize,
             @NonNull ButtonColors expectedButtonColors,
             @Nullable String expectedContentDescription,
             @NonNull String expectedMetadataTag,
             @Nullable String expectedTextContent,
             @Nullable String expectedIconContent,
             @Nullable String expectedImageContent,
-            @Nullable
-                    androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedCustomContent) {
+            androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+                    expectedCustomContent) {
         androidx.wear.tiles.LayoutElementBuilders.Box box =
                 new androidx.wear.tiles.LayoutElementBuilders.Box.Builder()
                         .addContent(button)
diff --git a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/ChipTest.java b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/ChipTest.java
index 3e96246..808ba0b 100644
--- a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/ChipTest.java
+++ b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/ChipTest.java
@@ -23,11 +23,11 @@
 import android.content.Context;
 import android.graphics.Color;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.annotation.internal.DoNotInstrument;
@@ -176,8 +176,8 @@
             @Nullable String expectedPrimaryText,
             @Nullable String expectedLabel,
             @Nullable String expectedIcon,
-            @Nullable
-                    androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedCustomContent) {
+            androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+                    expectedCustomContent) {
         assertChipIsEqual(
                 actualChip,
                 hAlign,
@@ -245,8 +245,8 @@
             @Nullable String expectedPrimaryText,
             @Nullable String expectedLabel,
             @Nullable String expectedIcon,
-            @Nullable
-                    androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedCustomContent) {
+            androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+                    expectedCustomContent) {
         androidx.wear.tiles.LayoutElementBuilders.Box box =
                 new androidx.wear.tiles.LayoutElementBuilders.Box.Builder()
                         .addContent(chip)
@@ -276,8 +276,8 @@
             @Nullable String expectedPrimaryText,
             @Nullable String expectedLabel,
             @Nullable String expectedIcon,
-            @Nullable
-                    androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedCustomContent) {
+            androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+                    expectedCustomContent) {
         assertThat(actualChip.getMetadataTag()).isEqualTo(expectedMetadata);
         assertThat(actualChip.getClickable().toProto()).isEqualTo(CLICKABLE.toProto());
         assertThat(actualChip.getWidth().toContainerDimensionProto())
diff --git a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/CircularProgressIndicatorTest.java b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/CircularProgressIndicatorTest.java
index f6b33f8..738ccf4e 100644
--- a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/CircularProgressIndicatorTest.java
+++ b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/CircularProgressIndicatorTest.java
@@ -22,10 +22,10 @@
 
 import android.graphics.Color;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.annotation.internal.DoNotInstrument;
diff --git a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/layouts/EdgeContentLayoutTest.java b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/layouts/EdgeContentLayoutTest.java
index f1b5e00..61f0949 100644
--- a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/layouts/EdgeContentLayoutTest.java
+++ b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/layouts/EdgeContentLayoutTest.java
@@ -22,11 +22,11 @@
 
 import android.content.Context;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.annotation.internal.DoNotInstrument;
@@ -148,13 +148,11 @@
 
     private void assertLayout(
             @NonNull EdgeContentLayout actualLayout,
-            @Nullable
-                    androidx.wear.tiles.LayoutElementBuilders.LayoutElement
+                                androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
                             expectedProgressIndicator,
-            @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedContent,
-            @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedPrimaryLabel,
-            @Nullable
-                    androidx.wear.tiles.LayoutElementBuilders.LayoutElement
+            androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedContent,
+            androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedPrimaryLabel,
+                                androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
                             expectedSecondaryLabel) {
         assertLayoutIsEqual(
                 actualLayout,
@@ -183,13 +181,11 @@
 
     private void assertLayoutIsEqual(
             @NonNull EdgeContentLayout actualLayout,
-            @Nullable
-                    androidx.wear.tiles.LayoutElementBuilders.LayoutElement
+                                androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
                             expectedProgressIndicator,
-            @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedContent,
-            @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedPrimaryLabel,
-            @Nullable
-                    androidx.wear.tiles.LayoutElementBuilders.LayoutElement
+            androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedContent,
+            androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedPrimaryLabel,
+                                androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
                             expectedSecondaryLabel) {
         byte[] expectedMetadata = EdgeContentLayout.METADATA_TAG_BASE.clone();
 
diff --git a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/layouts/PrimaryLayoutTest.java b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/layouts/PrimaryLayoutTest.java
index f2e689f..67eb223 100644
--- a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/layouts/PrimaryLayoutTest.java
+++ b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/layouts/PrimaryLayoutTest.java
@@ -22,11 +22,11 @@
 
 import android.content.Context;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.annotation.internal.DoNotInstrument;
@@ -194,11 +194,10 @@
     private void assertLayout(
             float height,
             @NonNull PrimaryLayout actualLayout,
-            @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedContent,
-            @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedPrimaryChip,
-            @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedPrimaryLabel,
-            @Nullable
-                    androidx.wear.tiles.LayoutElementBuilders.LayoutElement
+            androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedContent,
+            androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedPrimaryChip,
+            androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedPrimaryLabel,
+                                androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
                             expectedSecondaryLabel) {
         assertLayoutIsEqual(
                 height,
@@ -230,11 +229,10 @@
     private void assertLayoutIsEqual(
             float height,
             @NonNull PrimaryLayout actualLayout,
-            @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedContent,
-            @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedPrimaryChip,
-            @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedPrimaryLabel,
-            @Nullable
-                    androidx.wear.tiles.LayoutElementBuilders.LayoutElement
+            androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedContent,
+            androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedPrimaryChip,
+            androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedPrimaryLabel,
+                                androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
                             expectedSecondaryLabel) {
         byte[] expectedMetadata = PrimaryLayout.METADATA_TAG_BASE.clone();
 
diff --git a/wear/tiles/tiles-renderer/build.gradle b/wear/tiles/tiles-renderer/build.gradle
index 5c78299..8c21683 100644
--- a/wear/tiles/tiles-renderer/build.gradle
+++ b/wear/tiles/tiles-renderer/build.gradle
@@ -33,6 +33,7 @@
 }
 
 dependencies {
+    api(libs.jspecify)
     api("androidx.annotation:annotation:1.8.1")
     api(libs.guavaListenableFuture)
 
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/client/TileClient.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/client/TileClient.java
index bb730a1..cf7f642 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/client/TileClient.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/client/TileClient.java
@@ -18,7 +18,6 @@
 
 import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
 
-import androidx.annotation.NonNull;
 import androidx.wear.protolayout.ResourceBuilders;
 import androidx.wear.tiles.RequestBuilders;
 import androidx.wear.tiles.TileBuilders;
@@ -26,22 +25,21 @@
 import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.ListenableFuture;
 
+import org.jspecify.annotations.NonNull;
+
 /** Client to connect and interact with a TileService. */
 public interface TileClient {
     /** Gets the API version supported by the connected TileService. */
-    @NonNull
-    ListenableFuture<Integer> requestApiVersion();
+    @NonNull ListenableFuture<Integer> requestApiVersion();
 
     /** Request a tile payload from the connected TileService. */
-    @NonNull
-    ListenableFuture<TileBuilders.Tile> requestTile(
-            @NonNull RequestBuilders.TileRequest requestParams);
+    @NonNull ListenableFuture<TileBuilders.Tile> requestTile(
+            RequestBuilders.@NonNull TileRequest requestParams);
 
     /** Request a resource bundle from the connected TileService. */
-    @NonNull
     @SuppressWarnings("deprecation") // For backward compatibility
-    default ListenableFuture<ResourceBuilders.Resources> requestTileResourcesAsync(
-            @NonNull RequestBuilders.ResourcesRequest requestParams) {
+    default @NonNull ListenableFuture<ResourceBuilders.Resources> requestTileResourcesAsync(
+            RequestBuilders.@NonNull ResourcesRequest requestParams) {
         return FluentFuture.from(requestResources(requestParams))
                 .transform(
                         res -> ResourceBuilders.Resources.fromProto(res.toProto()),
@@ -53,24 +51,19 @@
      *
      * @deprecated Use {@link #requestTileResourcesAsync(RequestBuilders.ResourcesRequest)} instead.
      */
-    @NonNull
     @Deprecated
-    ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources> requestResources(
-            @NonNull RequestBuilders.ResourcesRequest requestParams);
+    @NonNull ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources> requestResources(
+            RequestBuilders.@NonNull ResourcesRequest requestParams);
 
     /** Send a Tile Added notification to the connected TileService. */
-    @NonNull
-    ListenableFuture<Void> sendOnTileAddedEvent();
+    @NonNull ListenableFuture<Void> sendOnTileAddedEvent();
 
     /** Send a Tile Removed notification to the connected TileService. */
-    @NonNull
-    ListenableFuture<Void> sendOnTileRemovedEvent();
+    @NonNull ListenableFuture<Void> sendOnTileRemovedEvent();
 
     /** Send a Tile Enter notification to the connected TileService. */
-    @NonNull
-    ListenableFuture<Void> sendOnTileEnterEvent();
+    @NonNull ListenableFuture<Void> sendOnTileEnterEvent();
 
     /** Send a Tile Leave notification to the connected TileService. */
-    @NonNull
-    ListenableFuture<Void> sendOnTileLeaveEvent();
+    @NonNull ListenableFuture<Void> sendOnTileLeaveEvent();
 }
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/TileRenderer.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/TileRenderer.java
index 89f6230..084841d 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/TileRenderer.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/TileRenderer.java
@@ -23,8 +23,6 @@
 import android.view.View;
 import android.view.ViewGroup;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.StyleRes;
 import androidx.wear.protolayout.LayoutElementBuilders;
@@ -49,6 +47,9 @@
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -81,24 +82,23 @@
          *
          * @param nextState The state that the next tile should be in.
          */
-        void onClick(@NonNull androidx.wear.tiles.StateBuilders.State nextState);
+        void onClick(androidx.wear.tiles.StateBuilders.@NonNull State nextState);
     }
 
-    @NonNull private final Context mUiContext;
-    @NonNull private final Executor mLoadActionExecutor;
-    @NonNull private final Consumer<StateBuilders.State> mLoadActionListener;
+    private final @NonNull Context mUiContext;
+    private final @NonNull Executor mLoadActionExecutor;
+    private final @NonNull Consumer<StateBuilders.State> mLoadActionListener;
 
     @StyleRes int mTilesTheme = 0; // Default theme.
 
-    @NonNull
-    private final Map<PlatformDataProvider, Set<PlatformDataKey<?>>> mPlatformDataProviders =
-            new ArrayMap<>();
+    private final @NonNull Map<PlatformDataProvider, Set<PlatformDataKey<?>>>
+            mPlatformDataProviders = new ArrayMap<>();
 
-    @NonNull private final ProtoLayoutViewInstance mInstance;
-    @Nullable private final LayoutElementProto.Layout mLayout;
-    @Nullable private final ResourceProto.Resources mResources;
-    @NonNull private final ListeningExecutorService mUiExecutor;
-    @NonNull private final StateStore mStateStore = new StateStore(ImmutableMap.of());
+    private final @NonNull ProtoLayoutViewInstance mInstance;
+    private final LayoutElementProto.@Nullable Layout mLayout;
+    private final ResourceProto.@Nullable Resources mResources;
+    private final @NonNull ListeningExecutorService mUiExecutor;
+    private final @NonNull StateStore mStateStore = new StateStore(ImmutableMap.of());
 
     /**
      * Default constructor.
@@ -115,8 +115,8 @@
     @Deprecated
     public TileRenderer(
             @NonNull Context uiContext,
-            @NonNull androidx.wear.tiles.LayoutElementBuilders.Layout layout,
-            @NonNull androidx.wear.tiles.ResourceBuilders.Resources resources,
+            androidx.wear.tiles.LayoutElementBuilders.@NonNull Layout layout,
+            androidx.wear.tiles.ResourceBuilders.@NonNull Resources resources,
             @NonNull Executor loadActionExecutor,
             @NonNull LoadActionListener loadActionListener) {
         this(
@@ -146,9 +146,9 @@
     @Deprecated
     public TileRenderer(
             @NonNull Context uiContext,
-            @NonNull androidx.wear.tiles.LayoutElementBuilders.Layout layout,
+            androidx.wear.tiles.LayoutElementBuilders.@NonNull Layout layout,
             @StyleRes int tilesTheme,
-            @NonNull androidx.wear.tiles.ResourceBuilders.Resources resources,
+            androidx.wear.tiles.ResourceBuilders.@NonNull Resources resources,
             @NonNull Executor loadActionExecutor,
             @NonNull LoadActionListener loadActionListener) {
         this(
@@ -189,8 +189,8 @@
             @StyleRes int tilesTheme,
             @NonNull Executor loadActionExecutor,
             @NonNull Consumer<StateBuilders.State> loadActionListener,
-            @Nullable LayoutElementProto.Layout layout,
-            @Nullable ResourceProto.Resources resources,
+            LayoutElementProto.@Nullable Layout layout,
+            ResourceProto.@Nullable Resources resources,
             @Nullable Map<PlatformDataProvider, Set<PlatformDataKey<?>>> platformDataProviders) {
 
         this.mUiContext = uiContext;
@@ -227,9 +227,8 @@
         this.mInstance = new ProtoLayoutViewInstance(config.build());
     }
 
-    @NonNull
     @SuppressWarnings("deprecation") // For backward compatibility
-    private static Consumer<StateBuilders.State> toStateConsumer(
+    private static @NonNull Consumer<StateBuilders.State> toStateConsumer(
             @NonNull LoadActionListener loadActionListener) {
         return nextState ->
                 loadActionListener.onClick(
@@ -253,8 +252,7 @@
      *     deprecated constructors that accept Layout and Resources.
      */
     @Deprecated
-    @Nullable
-    public View inflate(@NonNull ViewGroup parent) {
+    public @Nullable View inflate(@NonNull ViewGroup parent) {
         String errorMessage =
                 "This method only works with the deprecated constructors that accept Layout and"
                         + " Resources.";
@@ -298,38 +296,33 @@
      *     empty or the top-level LayoutElement has no inner set, or the top-level LayoutElement
      *     contains an unsupported inner type.
      */
-    @NonNull
-    public ListenableFuture<View> inflateAsync(
-            @NonNull LayoutElementBuilders.Layout layout,
-            @NonNull ResourceBuilders.Resources resources,
+    public @NonNull ListenableFuture<View> inflateAsync(
+            LayoutElementBuilders.@NonNull Layout layout,
+            ResourceBuilders.@NonNull Resources resources,
             @NonNull ViewGroup parent) {
         return inflateLayout(layout.toProto(), resources.toProto(), parent);
     }
 
-    @NonNull
-    private ListenableFuture<View> inflateLayout(
-            @NonNull LayoutElementProto.Layout layout,
-            @NonNull ResourceProto.Resources resources,
+    private @NonNull ListenableFuture<View> inflateLayout(
+            LayoutElementProto.@NonNull Layout layout,
+            ResourceProto.@NonNull Resources resources,
             @NonNull ViewGroup parent) {
         ListenableFuture<Void> result = mInstance.renderAndAttach(layout, resources, parent);
         return FluentFuture.from(result).transform(ignored -> parent.getChildAt(0), mUiExecutor);
     }
 
     /** Returns the {@link Context} suitable for interacting with the UI. */
-    @NonNull
-    public Context getUiContext() {
+    public @NonNull Context getUiContext() {
         return mUiContext;
     }
 
     /** Returns the {@link Executor} for {@code loadActionListener}. */
-    @NonNull
-    public Executor getLoadActionExecutor() {
+    public @NonNull Executor getLoadActionExecutor() {
         return mLoadActionExecutor;
     }
 
     /** Returns the Listener for clicks that will cause the contents to be reloaded. */
-    @NonNull
-    public Consumer<StateBuilders.State> getLoadActionListener() {
+    public @NonNull Consumer<StateBuilders.State> getLoadActionListener() {
         return mLoadActionListener;
     }
 
@@ -343,22 +336,20 @@
     }
 
     /** Returns the platform data providers that will be registered for this Tile instance. */
-    @NonNull
-    public Map<PlatformDataProvider, Set<PlatformDataKey<?>>> getPlatformDataProviders() {
+    public @NonNull Map<PlatformDataProvider, Set<PlatformDataKey<?>>> getPlatformDataProviders() {
         return Collections.unmodifiableMap(mPlatformDataProviders);
     }
 
     /** Builder for {@link TileRenderer}. */
     public static final class Builder {
-        @NonNull private final Context mUiContext;
-        @NonNull private final Executor mLoadActionExecutor;
-        @NonNull private final Consumer<StateBuilders.State> mLoadActionListener;
+        private final @NonNull Context mUiContext;
+        private final @NonNull Executor mLoadActionExecutor;
+        private final @NonNull Consumer<StateBuilders.State> mLoadActionListener;
 
         @StyleRes int mTilesTheme = 0; // Default theme.
 
-        @NonNull
-        private final Map<PlatformDataProvider, Set<PlatformDataKey<?>>> mPlatformDataProviders =
-                new ArrayMap<>();
+        private final @NonNull Map<PlatformDataProvider, Set<PlatformDataKey<?>>>
+                mPlatformDataProviders = new ArrayMap<>();
 
         /**
          * Builder for the {@link TileRenderer} class.
@@ -381,8 +372,7 @@
          * Sets the theme to use for this Tile instance. This can be used to customise things like
          * the default font family. If not set, zero (default theme) will be used.
          */
-        @NonNull
-        public Builder setTilesTheme(@StyleRes int tilesTheme) {
+        public @NonNull Builder setTilesTheme(@StyleRes int tilesTheme) {
             mTilesTheme = tilesTheme;
             return this;
         }
@@ -392,18 +382,16 @@
          * supportedKeys}. Adding the same {@link PlatformDataProvider} several times will override
          * previous entries instead of adding multiple entries.
          */
-        @NonNull
-        public Builder addPlatformDataProvider(
+        public @NonNull Builder addPlatformDataProvider(
                 @NonNull PlatformDataProvider platformDataProvider,
-                @NonNull PlatformDataKey<?>... supportedKeys) {
+                PlatformDataKey<?> @NonNull ... supportedKeys) {
             this.mPlatformDataProviders.put(
                     platformDataProvider, ImmutableSet.copyOf(supportedKeys));
             return this;
         }
 
         /** Builds {@link TileRenderer} object. */
-        @NonNull
-        public TileRenderer build() {
+        public @NonNull TileRenderer build() {
             return new TileRenderer(
                     mUiContext,
                     mTilesTheme,
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineCache.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineCache.java
index edfd08b..8592cae 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineCache.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineCache.java
@@ -17,12 +17,13 @@
 package androidx.wear.tiles.timeline;
 
 import androidx.annotation.MainThread;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.wear.protolayout.TimelineBuilders;
 import androidx.wear.protolayout.proto.TimelineProto.TimelineEntry;
 import androidx.wear.tiles.timeline.internal.TilesTimelineCacheInternal;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Timeline cache for Wear Tiles. This will take in a full timeline, and return the appropriate
  * entry for the given time from {@code findTimelineEntryForTime}.
@@ -36,12 +37,12 @@
      * @deprecated Use {@link #TilesTimelineCache(TimelineBuilders.Timeline)} instead.
      */
     @Deprecated
-    public TilesTimelineCache(@NonNull androidx.wear.tiles.TimelineBuilders.Timeline timeline) {
+    public TilesTimelineCache(androidx.wear.tiles.TimelineBuilders.@NonNull Timeline timeline) {
         mCache = new TilesTimelineCacheInternal(timeline.toProto());
     }
 
     /** Default constructor. */
-    public TilesTimelineCache(@NonNull TimelineBuilders.Timeline timeline) {
+    public TilesTimelineCache(TimelineBuilders.@NonNull Timeline timeline) {
         mCache = new TilesTimelineCacheInternal(timeline.toProto());
     }
 
@@ -58,8 +59,7 @@
      */
     @Deprecated
     @MainThread
-    @Nullable
-    public androidx.wear.tiles.TimelineBuilders.TimelineEntry findTimelineEntryForTime(
+    public androidx.wear.tiles.TimelineBuilders.@Nullable TimelineEntry findTimelineEntryForTime(
             long timeMillis) {
         TimelineEntry entry = mCache.findTimelineEntryForTime(timeMillis);
 
@@ -81,8 +81,7 @@
      *     none are valid.
      */
     @MainThread
-    @Nullable
-    public TimelineBuilders.TimelineEntry findTileTimelineEntryForTime(long timeMillis) {
+    public TimelineBuilders.@Nullable TimelineEntry findTileTimelineEntryForTime(long timeMillis) {
         TimelineEntry entry = mCache.findTimelineEntryForTime(timeMillis);
 
         if (entry == null) {
@@ -107,9 +106,8 @@
      * @deprecated Use {@link #findClosestTileTimelineEntry(long)} instead.
      */
     @MainThread
-    @Nullable
     @Deprecated
-    public androidx.wear.tiles.TimelineBuilders.TimelineEntry findClosestTimelineEntry(
+    public androidx.wear.tiles.TimelineBuilders.@Nullable TimelineEntry findClosestTimelineEntry(
             long timeMillis) {
         TimelineEntry entry = mCache.findClosestTimelineEntry(timeMillis);
 
@@ -134,8 +132,7 @@
      * @return The timeline entry with validity period closest to {@code timeMillis}.
      */
     @MainThread
-    @Nullable
-    public TimelineBuilders.TimelineEntry findClosestTileTimelineEntry(long timeMillis) {
+    public TimelineBuilders.@Nullable TimelineEntry findClosestTileTimelineEntry(long timeMillis) {
         TimelineEntry entry = mCache.findClosestTimelineEntry(timeMillis);
 
         if (entry == null) {
@@ -161,7 +158,7 @@
     @Deprecated
     @MainThread
     public long findCurrentTimelineEntryExpiry(
-            @NonNull androidx.wear.tiles.TimelineBuilders.TimelineEntry entry,
+            androidx.wear.tiles.TimelineBuilders.@NonNull TimelineEntry entry,
             long fromTimeMillis) {
         return mCache.findCurrentTimelineEntryExpiry(entry.toProto(), fromTimeMillis);
     }
@@ -179,7 +176,7 @@
      */
     @MainThread
     public long findCurrentTimelineEntryExpiry(
-            @NonNull TimelineBuilders.TimelineEntry entry, long fromTimeMillis) {
+            TimelineBuilders.@NonNull TimelineEntry entry, long fromTimeMillis) {
         return mCache.findCurrentTimelineEntryExpiry(entry.toProto(), fromTimeMillis);
     }
 }
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineManager.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineManager.java
index d3ad277..85e601f 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineManager.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineManager.java
@@ -18,12 +18,13 @@
 
 import android.app.AlarmManager;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 import androidx.wear.protolayout.LayoutElementBuilders;
 import androidx.wear.protolayout.TimelineBuilders;
 import androidx.wear.tiles.timeline.internal.TilesTimelineManagerInternal;
 
+import org.jspecify.annotations.NonNull;
+
 import java.util.concurrent.Executor;
 
 /**
@@ -61,7 +62,7 @@
          */
         @Deprecated
         void onLayoutUpdate(
-                int token, @NonNull androidx.wear.tiles.LayoutElementBuilders.Layout layout);
+                int token, androidx.wear.tiles.LayoutElementBuilders.@NonNull Layout layout);
     }
 
     /** Type to listen for layout updates from a given timeline. */
@@ -73,7 +74,7 @@
          * @param token The token originally passed to {@link TilesTimelineManager}.
          * @param layout The new layout to use.
          */
-        void onLayoutUpdate(int token, @NonNull LayoutElementBuilders.Layout layout);
+        void onLayoutUpdate(int token, LayoutElementBuilders.@NonNull Layout layout);
     }
 
     private final TilesTimelineManagerInternal mManager;
@@ -96,7 +97,7 @@
     public TilesTimelineManager(
             @NonNull AlarmManager alarmManager,
             @NonNull Clock clock,
-            @NonNull androidx.wear.tiles.TimelineBuilders.Timeline timeline,
+            androidx.wear.tiles.TimelineBuilders.@NonNull Timeline timeline,
             int token,
             @NonNull Executor listenerExecutor,
             @NonNull Listener listener) {
@@ -128,7 +129,7 @@
     public TilesTimelineManager(
             @NonNull AlarmManager alarmManager,
             @NonNull Clock clock,
-            @NonNull TimelineBuilders.Timeline timeline,
+            TimelineBuilders.@NonNull Timeline timeline,
             int token,
             @NonNull Executor listenerExecutor,
             @NonNull LayoutUpdateListener listener) {
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineCacheInternal.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineCacheInternal.java
index 4571ad5..fa20027 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineCacheInternal.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineCacheInternal.java
@@ -17,12 +17,13 @@
 package androidx.wear.tiles.timeline.internal;
 
 import androidx.annotation.MainThread;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.wear.protolayout.proto.TimelineProto.TimeInterval;
 import androidx.wear.protolayout.proto.TimelineProto.Timeline;
 import androidx.wear.protolayout.proto.TimelineProto.TimelineEntry;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Timeline cache for Tiles. This will take in a full timeline, and return the appropriate entry for
  * the given time from {@code findTimelineEntryForTime}.
@@ -45,8 +46,7 @@
      *     none are valid.
      */
     @MainThread
-    @Nullable
-    public TimelineEntry findTimelineEntryForTime(long timeMillis) {
+    public @Nullable TimelineEntry findTimelineEntryForTime(long timeMillis) {
         TimelineEntry currentEntry = null;
         long currentEntryLength = Long.MAX_VALUE;
 
@@ -93,8 +93,7 @@
      * @return The timeline entry with validity period closest to {@code timeMillis}.
      */
     @MainThread
-    @Nullable
-    public TimelineEntry findClosestTimelineEntry(long timeMillis) {
+    public @Nullable TimelineEntry findClosestTimelineEntry(long timeMillis) {
         long currentEntryError = Long.MAX_VALUE;
         TimelineEntry currentEntry = null;
 
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineManagerInternal.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineManagerInternal.java
index d25e42d..4dc70ac 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineManagerInternal.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineManagerInternal.java
@@ -23,11 +23,12 @@
 import android.app.AlarmManager.OnAlarmListener;
 import android.util.Log;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.wear.protolayout.proto.TimelineProto.Timeline;
 import androidx.wear.protolayout.proto.TimelineProto.TimelineEntry;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.concurrent.Executor;
 
 /**
@@ -65,7 +66,7 @@
     private final Executor mListenerExecutor;
     private final Listener mListener;
     private final int mToken;
-    @Nullable private OnAlarmListener mAlarmListener = null;
+    private @Nullable OnAlarmListener mAlarmListener = null;
 
     /**
      * Default constructor.
diff --git a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineCacheTest.java b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineCacheTest.java
index e7a1782..5ef39ef 100644
--- a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineCacheTest.java
+++ b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineCacheTest.java
@@ -18,13 +18,13 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import androidx.annotation.Nullable;
 import androidx.wear.protolayout.LayoutElementBuilders;
 import androidx.wear.protolayout.TimelineBuilders;
 import androidx.wear.tiles.TilesTestRunner;
 
 import com.google.common.truth.Expect;
 
+import org.jspecify.annotations.Nullable;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -552,8 +552,8 @@
     }
 
     private void expectTimelineEntryEqual(
-            @Nullable TimelineBuilders.TimelineEntry actual,
-            @Nullable TimelineBuilders.TimelineEntry expected) {
+            TimelineBuilders.@Nullable TimelineEntry actual,
+            TimelineBuilders.@Nullable TimelineEntry expected) {
         if (expected == null) {
             expect.that(actual).isNull();
         } else {
diff --git a/wear/tiles/tiles/build.gradle b/wear/tiles/tiles/build.gradle
index 316a1fa..a69618c 100644
--- a/wear/tiles/tiles/build.gradle
+++ b/wear/tiles/tiles/build.gradle
@@ -29,6 +29,7 @@
 }
 
 dependencies {
+    api(libs.jspecify)
     api("androidx.annotation:annotation:1.8.1")
     api(project(":wear:protolayout:protolayout"))
     api(project(":wear:protolayout:protolayout-expression"))
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ActionBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ActionBuilders.java
index 37ad14f..85f81af 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ActionBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ActionBuilders.java
@@ -22,13 +22,14 @@
 
 import android.annotation.SuppressLint;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
 import androidx.wear.protolayout.proto.ActionProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.Collections;
 import java.util.Map;
 
@@ -42,39 +43,34 @@
     private ActionBuilders() {}
 
     /** Shortcut for building an {@link AndroidStringExtra}. */
-    @NonNull
-    public static AndroidStringExtra stringExtra(@NonNull String value) {
+    public static @NonNull AndroidStringExtra stringExtra(@NonNull String value) {
         return new AndroidStringExtra.Builder().setValue(value).build();
     }
 
     /** Shortcut for building an {@link AndroidIntExtra}. */
-    @NonNull
-    public static AndroidIntExtra intExtra(int value) {
+    public static @NonNull AndroidIntExtra intExtra(int value) {
         return new AndroidIntExtra.Builder().setValue(value).build();
     }
 
     /** Shortcut for building an {@link AndroidLongExtra}. */
-    @NonNull
-    public static AndroidLongExtra longExtra(long value) {
+    public static @NonNull AndroidLongExtra longExtra(long value) {
         return new AndroidLongExtra.Builder().setValue(value).build();
     }
 
     /** Shortcut for building an {@link AndroidDoubleExtra}. */
-    @NonNull
-    public static AndroidDoubleExtra doubleExtra(double value) {
+    public static @NonNull AndroidDoubleExtra doubleExtra(double value) {
         return new AndroidDoubleExtra.Builder().setValue(value).build();
     }
 
     /** Shortcut for building an {@link AndroidBooleanExtra}. */
-    @NonNull
-    public static AndroidBooleanExtra booleanExtra(boolean value) {
+    public static @NonNull AndroidBooleanExtra booleanExtra(boolean value) {
         return new AndroidBooleanExtra.Builder().setValue(value).build();
     }
 
     /** A string value that can be added to an Android intent's extras. */
     public static final class AndroidStringExtra implements AndroidExtra {
         private final ActionProto.AndroidStringExtra mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         AndroidStringExtra(ActionProto.AndroidStringExtra impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -82,32 +78,28 @@
         }
 
         /** Gets the value. Intended for testing purposes only. */
-        @NonNull
-        public String getValue() {
+        public @NonNull String getValue() {
             return mImpl.getValue();
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static AndroidStringExtra fromProto(@NonNull ActionProto.AndroidStringExtra proto) {
+        static @NonNull AndroidStringExtra fromProto(
+                ActionProto.@NonNull AndroidStringExtra proto) {
             return new AndroidStringExtra(proto, null);
         }
 
-        @NonNull
-        ActionProto.AndroidStringExtra toProto() {
+        ActionProto.@NonNull AndroidStringExtra toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public ActionProto.AndroidExtra toAndroidExtraProto() {
+        public ActionProto.@NonNull AndroidExtra toAndroidExtraProto() {
             return ActionProto.AndroidExtra.newBuilder().setStringVal(mImpl).build();
         }
 
@@ -120,16 +112,14 @@
             public Builder() {}
 
             /** Sets the value. */
-            @NonNull
-            public Builder setValue(@NonNull String value) {
+            public @NonNull Builder setValue(@NonNull String value) {
                 mImpl.setValue(value);
                 mFingerprint.recordPropertyUpdate(1, value.hashCode());
                 return this;
             }
 
             @Override
-            @NonNull
-            public AndroidStringExtra build() {
+            public @NonNull AndroidStringExtra build() {
                 return new AndroidStringExtra(mImpl.build(), mFingerprint);
             }
         }
@@ -138,7 +128,7 @@
     /** An integer value that can be added to an Android intent's extras. */
     public static final class AndroidIntExtra implements AndroidExtra {
         private final ActionProto.AndroidIntExtra mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         AndroidIntExtra(ActionProto.AndroidIntExtra impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -152,25 +142,21 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static AndroidIntExtra fromProto(@NonNull ActionProto.AndroidIntExtra proto) {
+        static @NonNull AndroidIntExtra fromProto(ActionProto.@NonNull AndroidIntExtra proto) {
             return new AndroidIntExtra(proto, null);
         }
 
-        @NonNull
-        ActionProto.AndroidIntExtra toProto() {
+        ActionProto.@NonNull AndroidIntExtra toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public ActionProto.AndroidExtra toAndroidExtraProto() {
+        public ActionProto.@NonNull AndroidExtra toAndroidExtraProto() {
             return ActionProto.AndroidExtra.newBuilder().setIntVal(mImpl).build();
         }
 
@@ -183,16 +169,14 @@
             public Builder() {}
 
             /** Sets the value. */
-            @NonNull
-            public Builder setValue(int value) {
+            public @NonNull Builder setValue(int value) {
                 mImpl.setValue(value);
                 mFingerprint.recordPropertyUpdate(1, value);
                 return this;
             }
 
             @Override
-            @NonNull
-            public AndroidIntExtra build() {
+            public @NonNull AndroidIntExtra build() {
                 return new AndroidIntExtra(mImpl.build(), mFingerprint);
             }
         }
@@ -201,7 +185,7 @@
     /** A long value that can be added to an Android intent's extras. */
     public static final class AndroidLongExtra implements AndroidExtra {
         private final ActionProto.AndroidLongExtra mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         AndroidLongExtra(ActionProto.AndroidLongExtra impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -215,25 +199,21 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static AndroidLongExtra fromProto(@NonNull ActionProto.AndroidLongExtra proto) {
+        static @NonNull AndroidLongExtra fromProto(ActionProto.@NonNull AndroidLongExtra proto) {
             return new AndroidLongExtra(proto, null);
         }
 
-        @NonNull
-        ActionProto.AndroidLongExtra toProto() {
+        ActionProto.@NonNull AndroidLongExtra toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public ActionProto.AndroidExtra toAndroidExtraProto() {
+        public ActionProto.@NonNull AndroidExtra toAndroidExtraProto() {
             return ActionProto.AndroidExtra.newBuilder().setLongVal(mImpl).build();
         }
 
@@ -246,16 +226,14 @@
             public Builder() {}
 
             /** Sets the value. */
-            @NonNull
-            public Builder setValue(long value) {
+            public @NonNull Builder setValue(long value) {
                 mImpl.setValue(value);
                 mFingerprint.recordPropertyUpdate(1, Long.hashCode(value));
                 return this;
             }
 
             @Override
-            @NonNull
-            public AndroidLongExtra build() {
+            public @NonNull AndroidLongExtra build() {
                 return new AndroidLongExtra(mImpl.build(), mFingerprint);
             }
         }
@@ -264,7 +242,7 @@
     /** A double value that can be added to an Android intent's extras. */
     public static final class AndroidDoubleExtra implements AndroidExtra {
         private final ActionProto.AndroidDoubleExtra mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         AndroidDoubleExtra(ActionProto.AndroidDoubleExtra impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -278,25 +256,22 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static AndroidDoubleExtra fromProto(@NonNull ActionProto.AndroidDoubleExtra proto) {
+        static @NonNull AndroidDoubleExtra fromProto(
+                ActionProto.@NonNull AndroidDoubleExtra proto) {
             return new AndroidDoubleExtra(proto, null);
         }
 
-        @NonNull
-        ActionProto.AndroidDoubleExtra toProto() {
+        ActionProto.@NonNull AndroidDoubleExtra toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public ActionProto.AndroidExtra toAndroidExtraProto() {
+        public ActionProto.@NonNull AndroidExtra toAndroidExtraProto() {
             return ActionProto.AndroidExtra.newBuilder().setDoubleVal(mImpl).build();
         }
 
@@ -309,16 +284,14 @@
             public Builder() {}
 
             /** Sets the value. */
-            @NonNull
-            public Builder setValue(double value) {
+            public @NonNull Builder setValue(double value) {
                 mImpl.setValue(value);
                 mFingerprint.recordPropertyUpdate(1, Double.hashCode(value));
                 return this;
             }
 
             @Override
-            @NonNull
-            public AndroidDoubleExtra build() {
+            public @NonNull AndroidDoubleExtra build() {
                 return new AndroidDoubleExtra(mImpl.build(), mFingerprint);
             }
         }
@@ -327,7 +300,7 @@
     /** A boolean value that can be added to an Android intent's extras. */
     public static final class AndroidBooleanExtra implements AndroidExtra {
         private final ActionProto.AndroidBooleanExtra mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         AndroidBooleanExtra(
                 ActionProto.AndroidBooleanExtra impl, @Nullable Fingerprint fingerprint) {
@@ -342,25 +315,22 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static AndroidBooleanExtra fromProto(@NonNull ActionProto.AndroidBooleanExtra proto) {
+        static @NonNull AndroidBooleanExtra fromProto(
+                ActionProto.@NonNull AndroidBooleanExtra proto) {
             return new AndroidBooleanExtra(proto, null);
         }
 
-        @NonNull
-        ActionProto.AndroidBooleanExtra toProto() {
+        ActionProto.@NonNull AndroidBooleanExtra toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public ActionProto.AndroidExtra toAndroidExtraProto() {
+        public ActionProto.@NonNull AndroidExtra toAndroidExtraProto() {
             return ActionProto.AndroidExtra.newBuilder().setBooleanVal(mImpl).build();
         }
 
@@ -374,16 +344,14 @@
 
             /** Sets the value. */
             @SuppressLint("MissingGetterMatchingBuilder")
-            @NonNull
-            public Builder setValue(boolean value) {
+            public @NonNull Builder setValue(boolean value) {
                 mImpl.setValue(value);
                 mFingerprint.recordPropertyUpdate(1, Boolean.hashCode(value));
                 return this;
             }
 
             @Override
-            @NonNull
-            public AndroidBooleanExtra build() {
+            public @NonNull AndroidBooleanExtra build() {
                 return new AndroidBooleanExtra(mImpl.build(), mFingerprint);
             }
         }
@@ -396,29 +364,25 @@
     public interface AndroidExtra {
         /** Get the protocol buffer representation of this object. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        ActionProto.AndroidExtra toAndroidExtraProto();
+        ActionProto.@NonNull AndroidExtra toAndroidExtraProto();
 
         /** Get the fingerprint for this object or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        Fingerprint getFingerprint();
+        @Nullable Fingerprint getFingerprint();
 
         /** Builder to create {@link AndroidExtra} objects. */
         @SuppressLint("StaticFinalBuilder")
         interface Builder {
 
             /** Builds an instance with values accumulated in this Builder. */
-            @NonNull
-            AndroidExtra build();
+            @NonNull AndroidExtra build();
         }
     }
 
     /**
      * Return an instance of one of this object's subtypes, from the protocol buffer representation.
      */
-    @NonNull
-    static AndroidExtra androidExtraFromProto(@NonNull ActionProto.AndroidExtra proto) {
+    static @NonNull AndroidExtra androidExtraFromProto(ActionProto.@NonNull AndroidExtra proto) {
         if (proto.hasStringVal()) {
             return AndroidStringExtra.fromProto(proto.getStringVal());
         }
@@ -440,7 +404,7 @@
     /** A launch action to send an intent to an Android activity. */
     public static final class AndroidActivity {
         private final ActionProto.AndroidActivity mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         AndroidActivity(ActionProto.AndroidActivity impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -451,8 +415,7 @@
          * Gets the package name to send the intent to, for example, "com.google.weather". Intended
          * for testing purposes only.
          */
-        @NonNull
-        public String getPackageName() {
+        public @NonNull String getPackageName() {
             return mImpl.getPackageName();
         }
 
@@ -461,14 +424,12 @@
          * example, "com.google.weather.WeatherOverviewActivity". Intended for testing purposes
          * only.
          */
-        @NonNull
-        public String getClassName() {
+        public @NonNull String getClassName() {
             return mImpl.getClassName();
         }
 
         /** Gets the extras to be included in the intent. Intended for testing purposes only. */
-        @NonNull
-        public Map<String, AndroidExtra> getKeyToExtraMapping() {
+        public @NonNull Map<String, AndroidExtra> getKeyToExtraMapping() {
             return Collections.unmodifiableMap(
                     mImpl.getKeyToExtraMap().entrySet().stream()
                             .collect(
@@ -479,18 +440,15 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static AndroidActivity fromProto(@NonNull ActionProto.AndroidActivity proto) {
+        static @NonNull AndroidActivity fromProto(ActionProto.@NonNull AndroidActivity proto) {
             return new AndroidActivity(proto, null);
         }
 
-        @NonNull
-        ActionProto.AndroidActivity toProto() {
+        ActionProto.@NonNull AndroidActivity toProto() {
             return mImpl;
         }
 
@@ -503,8 +461,7 @@
             public Builder() {}
 
             /** Sets the package name to send the intent to, for example, "com.google.weather". */
-            @NonNull
-            public Builder setPackageName(@NonNull String packageName) {
+            public @NonNull Builder setPackageName(@NonNull String packageName) {
                 mImpl.setPackageName(packageName);
                 mFingerprint.recordPropertyUpdate(1, packageName.hashCode());
                 return this;
@@ -514,8 +471,7 @@
              * Sets the fully qualified class name (including the package) to send the intent to,
              * for example, "com.google.weather.WeatherOverviewActivity".
              */
-            @NonNull
-            public Builder setClassName(@NonNull String className) {
+            public @NonNull Builder setClassName(@NonNull String className) {
                 mImpl.setClassName(className);
                 mFingerprint.recordPropertyUpdate(2, className.hashCode());
                 return this;
@@ -523,8 +479,8 @@
 
             /** Adds an entry into the extras to be included in the intent. */
             @SuppressLint("MissingGetterMatchingBuilder")
-            @NonNull
-            public Builder addKeyToExtraMapping(@NonNull String key, @NonNull AndroidExtra extra) {
+            public @NonNull Builder addKeyToExtraMapping(@NonNull String key,
+                    @NonNull AndroidExtra extra) {
                 mImpl.putKeyToExtra(key, extra.toAndroidExtraProto());
                 mFingerprint.recordPropertyUpdate(
                         key.hashCode(), checkNotNull(extra.getFingerprint()).aggregateValueAsInt());
@@ -532,8 +488,7 @@
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public AndroidActivity build() {
+            public @NonNull AndroidActivity build() {
                 return new AndroidActivity(mImpl.build(), mFingerprint);
             }
         }
@@ -546,7 +501,7 @@
      */
     public static final class LaunchAction implements Action {
         private final ActionProto.LaunchAction mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         LaunchAction(ActionProto.LaunchAction impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -554,8 +509,7 @@
         }
 
         /** Gets an action to launch an Android activity. Intended for testing purposes only. */
-        @Nullable
-        public AndroidActivity getAndroidActivity() {
+        public @Nullable AndroidActivity getAndroidActivity() {
             if (mImpl.hasAndroidActivity()) {
                 return AndroidActivity.fromProto(mImpl.getAndroidActivity());
             } else {
@@ -565,25 +519,21 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static LaunchAction fromProto(@NonNull ActionProto.LaunchAction proto) {
+        static @NonNull LaunchAction fromProto(ActionProto.@NonNull LaunchAction proto) {
             return new LaunchAction(proto, null);
         }
 
-        @NonNull
-        ActionProto.LaunchAction toProto() {
+        ActionProto.@NonNull LaunchAction toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public ActionProto.Action toActionProto() {
+        public ActionProto.@NonNull Action toActionProto() {
             return ActionProto.Action.newBuilder().setLaunchAction(mImpl).build();
         }
 
@@ -596,8 +546,7 @@
             public Builder() {}
 
             /** Sets an action to launch an Android activity. */
-            @NonNull
-            public Builder setAndroidActivity(@NonNull AndroidActivity androidActivity) {
+            public @NonNull Builder setAndroidActivity(@NonNull AndroidActivity androidActivity) {
                 mImpl.setAndroidActivity(androidActivity.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(androidActivity.getFingerprint()).aggregateValueAsInt());
@@ -605,8 +554,7 @@
             }
 
             @Override
-            @NonNull
-            public LaunchAction build() {
+            public @NonNull LaunchAction build() {
                 return new LaunchAction(mImpl.build(), mFingerprint);
             }
         }
@@ -615,7 +563,7 @@
     /** An action used to load (or reload) the tile contents. */
     public static final class LoadAction implements Action {
         private final ActionProto.LoadAction mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         LoadAction(ActionProto.LoadAction impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -628,8 +576,7 @@
          * {@link androidx.wear.tiles.ModifiersBuilders.Clickable}. Intended for testing purposes
          * only.
          */
-        @Nullable
-        public StateBuilders.State getRequestState() {
+        public StateBuilders.@Nullable State getRequestState() {
             if (mImpl.hasRequestState()) {
                 return StateBuilders.State.fromProto(mImpl.getRequestState());
             } else {
@@ -639,25 +586,21 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static LoadAction fromProto(@NonNull ActionProto.LoadAction proto) {
+        static @NonNull LoadAction fromProto(ActionProto.@NonNull LoadAction proto) {
             return new LoadAction(proto, null);
         }
 
-        @NonNull
-        ActionProto.LoadAction toProto() {
+        ActionProto.@NonNull LoadAction toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public ActionProto.Action toActionProto() {
+        public ActionProto.@NonNull Action toActionProto() {
             return ActionProto.Action.newBuilder().setLoadAction(mImpl).build();
         }
 
@@ -674,8 +617,7 @@
              * androidx.wear.tiles.RequestBuilders.TileRequest} sent after this action is invoked by
              * a {@link androidx.wear.tiles.ModifiersBuilders.Clickable}.
              */
-            @NonNull
-            public Builder setRequestState(@NonNull StateBuilders.State requestState) {
+            public @NonNull Builder setRequestState(StateBuilders.@NonNull State requestState) {
                 mImpl.setRequestState(requestState.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(requestState.getFingerprint()).aggregateValueAsInt());
@@ -683,8 +625,7 @@
             }
 
             @Override
-            @NonNull
-            public LoadAction build() {
+            public @NonNull LoadAction build() {
                 return new LoadAction(mImpl.build(), mFingerprint);
             }
         }
@@ -694,29 +635,25 @@
     public interface Action {
         /** Get the protocol buffer representation of this object. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        ActionProto.Action toActionProto();
+        ActionProto.@NonNull Action toActionProto();
 
         /** Get the fingerprint for this object or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        Fingerprint getFingerprint();
+        @Nullable Fingerprint getFingerprint();
 
         /** Builder to create {@link Action} objects. */
         @SuppressLint("StaticFinalBuilder")
         interface Builder {
 
             /** Builds an instance with values accumulated in this Builder. */
-            @NonNull
-            Action build();
+            @NonNull Action build();
         }
     }
 
     /**
      * Return an instance of one of this object's subtypes, from the protocol buffer representation.
      */
-    @NonNull
-    static Action actionFromProto(@NonNull ActionProto.Action proto) {
+    static @NonNull Action actionFromProto(ActionProto.@NonNull Action proto) {
         if (proto.hasLaunchAction()) {
             return LaunchAction.fromProto(proto.getLaunchAction());
         }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ActiveTileIdentifier.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ActiveTileIdentifier.java
index 419d8f9..9d53721 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ActiveTileIdentifier.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ActiveTileIdentifier.java
@@ -18,7 +18,7 @@
 
 import android.content.ComponentName;
 
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
 
 /**
  * Tile information containing the tile instance ID and component name for identifying a tile
@@ -34,8 +34,7 @@
     }
 
     /** Component name of the tile provider. */
-    @NonNull
-    public ComponentName getComponentName() {
+    public @NonNull ComponentName getComponentName() {
         return mComponentName;
     }
 
@@ -53,8 +52,7 @@
      *     represented as the tileId, concatenated with a ':' and then the component name flattened
      *     to string.
      */
-    @NonNull
-    String flattenToString() {
+    @NonNull String flattenToString() {
         return mInstanceId + ":" + mComponentName.flattenToString();
     }
 
@@ -67,8 +65,7 @@
      * @return Returns a new ActiveTileIdentifier containing the tile id and component name that
      *     were encoded in {@code string}.
      */
-    @NonNull
-    static ActiveTileIdentifier unflattenFromString(@NonNull String string) {
+    static @NonNull ActiveTileIdentifier unflattenFromString(@NonNull String string) {
         int delimiterIndex = string.indexOf(":");
         return new ActiveTileIdentifier(
                 ComponentName.unflattenFromString(string.substring(delimiterIndex + 1)),
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ColorBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ColorBuilders.java
index dd34db9..3e0526a 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ColorBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ColorBuilders.java
@@ -17,13 +17,14 @@
 package androidx.wear.tiles;
 
 import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
 import androidx.wear.protolayout.proto.ColorProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Builders for color utilities for layout elements.
  *
@@ -34,15 +35,14 @@
     private ColorBuilders() {}
 
     /** Shortcut for building a {@link ColorProp} using an ARGB value. */
-    @NonNull
-    public static ColorProp argb(@ColorInt int colorArgb) {
+    public static @NonNull ColorProp argb(@ColorInt int colorArgb) {
         return new ColorProp.Builder().setArgb(colorArgb).build();
     }
 
     /** A property defining a color. */
     public static final class ColorProp {
         private final ColorProto.ColorProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         ColorProp(ColorProto.ColorProp impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -57,18 +57,15 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static ColorProp fromProto(@NonNull ColorProto.ColorProp proto) {
+        static @NonNull ColorProp fromProto(ColorProto.@NonNull ColorProp proto) {
             return new ColorProp(proto, null);
         }
 
-        @NonNull
-        ColorProto.ColorProp toProto() {
+        ColorProto.@NonNull ColorProp toProto() {
             return mImpl;
         }
 
@@ -80,16 +77,14 @@
             public Builder() {}
 
             /** Sets the color value, in ARGB format. */
-            @NonNull
-            public Builder setArgb(@ColorInt int argb) {
+            public @NonNull Builder setArgb(@ColorInt int argb) {
                 mImpl.setArgb(argb);
                 mFingerprint.recordPropertyUpdate(1, argb);
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public ColorProp build() {
+            public @NonNull ColorProp build() {
                 return new ColorProp(mImpl.build(), mFingerprint);
             }
         }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/CompositeTileUpdateRequester.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/CompositeTileUpdateRequester.java
index 2233b74..3ac0640 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/CompositeTileUpdateRequester.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/CompositeTileUpdateRequester.java
@@ -16,7 +16,7 @@
 
 package androidx.wear.tiles;
 
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
 
 import java.util.List;
 
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DeviceParametersBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DeviceParametersBuilders.java
index 662d045..fbd4755 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DeviceParametersBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DeviceParametersBuilders.java
@@ -21,10 +21,11 @@
 import androidx.annotation.Dimension;
 import androidx.annotation.FloatRange;
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.wear.protolayout.proto.DeviceParametersProto;
 
+import org.jspecify.annotations.NonNull;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -108,13 +109,12 @@
             return mImpl.getScreenShape().getNumber();
         }
 
-        @NonNull
-        static DeviceParameters fromProto(@NonNull DeviceParametersProto.DeviceParameters proto) {
+        static @NonNull DeviceParameters fromProto(
+                DeviceParametersProto.@NonNull DeviceParameters proto) {
             return new DeviceParameters(proto);
         }
 
-        @NonNull
-        DeviceParametersProto.DeviceParameters toProto() {
+        DeviceParametersProto.@NonNull DeviceParameters toProto() {
             return mImpl;
         }
 
@@ -126,15 +126,13 @@
             public Builder() {}
 
             /** Sets width of the device's screen in DP. */
-            @NonNull
-            public Builder setScreenWidthDp(@Dimension(unit = DP) int screenWidthDp) {
+            public @NonNull Builder setScreenWidthDp(@Dimension(unit = DP) int screenWidthDp) {
                 mImpl.setScreenWidthDp(screenWidthDp);
                 return this;
             }
 
             /** Sets height of the device's screen in DP. */
-            @NonNull
-            public Builder setScreenHeightDp(@Dimension(unit = DP) int screenHeightDp) {
+            public @NonNull Builder setScreenHeightDp(@Dimension(unit = DP) int screenHeightDp) {
                 mImpl.setScreenHeightDp(screenHeightDp);
                 return this;
             }
@@ -143,8 +141,7 @@
              * Sets density of the display. This value is the scaling factor to get from DP to
              * Pixels (px = dp * density).
              */
-            @NonNull
-            public Builder setScreenDensity(
+            public @NonNull Builder setScreenDensity(
                     @FloatRange(from = 0.0, fromInclusive = false, toInclusive = false)
                             float screenDensity) {
                 mImpl.setScreenDensity(screenDensity);
@@ -152,23 +149,20 @@
             }
 
             /** Sets the platform of the device. */
-            @NonNull
-            public Builder setDevicePlatform(@DevicePlatform int devicePlatform) {
+            public @NonNull Builder setDevicePlatform(@DevicePlatform int devicePlatform) {
                 mImpl.setDevicePlatform(
                         DeviceParametersProto.DevicePlatform.forNumber(devicePlatform));
                 return this;
             }
 
             /** Sets the shape of the device's screen. */
-            @NonNull
-            public Builder setScreenShape(@ScreenShape int screenShape) {
+            public @NonNull Builder setScreenShape(@ScreenShape int screenShape) {
                 mImpl.setScreenShape(DeviceParametersProto.ScreenShape.forNumber(screenShape));
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public DeviceParameters build() {
+            public @NonNull DeviceParameters build() {
                 return DeviceParameters.fromProto(mImpl.build());
             }
         }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DimensionBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DimensionBuilders.java
index e054a94..050de79 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DimensionBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DimensionBuilders.java
@@ -23,13 +23,14 @@
 
 import androidx.annotation.Dimension;
 import androidx.annotation.IntRange;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
 import androidx.wear.protolayout.proto.DimensionProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Builders for dimensions for layout elements.
  *
@@ -43,32 +44,27 @@
     private static final WrappedDimensionProp WRAP = new WrappedDimensionProp.Builder().build();
 
     /** Shortcut for building a {@link DpProp} using a measurement in DP. */
-    @NonNull
-    public static DpProp dp(@Dimension(unit = DP) float valueDp) {
+    public static @NonNull DpProp dp(@Dimension(unit = DP) float valueDp) {
         return new DpProp.Builder().setValue(valueDp).build();
     }
 
     /** Shortcut for building a {@link SpProp} using a measurement in SP. */
-    @NonNull
-    public static SpProp sp(@Dimension(unit = SP) float valueSp) {
+    public static @NonNull SpProp sp(@Dimension(unit = SP) float valueSp) {
         return new SpProp.Builder().setValue(valueSp).build();
     }
 
     /** Shortcut for building a {@link EmProp} using a measurement in EM. */
-    @NonNull
-    public static EmProp em(int valueEm) {
+    public static @NonNull EmProp em(int valueEm) {
         return new EmProp.Builder().setValue(valueEm).build();
     }
 
     /** Shortcut for building a {@link EmProp} using a measurement in EM. */
-    @NonNull
-    public static EmProp em(float valueEm) {
+    public static @NonNull EmProp em(float valueEm) {
         return new EmProp.Builder().setValue(valueEm).build();
     }
 
     /** Shortcut for building an {@link DegreesProp} using a measurement in degrees. */
-    @NonNull
-    public static DegreesProp degrees(float valueDegrees) {
+    public static @NonNull DegreesProp degrees(float valueDegrees) {
         return new DegreesProp.Builder().setValue(valueDegrees).build();
     }
 
@@ -76,8 +72,7 @@
      * Shortcut for building an {@link ExpandedDimensionProp} that will expand to the size of its
      * parent.
      */
-    @NonNull
-    public static ExpandedDimensionProp expand() {
+    public static @NonNull ExpandedDimensionProp expand() {
         return EXPAND;
     }
 
@@ -85,8 +80,7 @@
      * Shortcut for building an {@link WrappedDimensionProp} that will shrink to the size of its
      * children.
      */
-    @NonNull
-    public static WrappedDimensionProp wrap() {
+    public static @NonNull WrappedDimensionProp wrap() {
         return WRAP;
     }
 
@@ -94,7 +88,7 @@
     public static final class DpProp
             implements ContainerDimension, ImageDimension, SpacerDimension {
         private final DimensionProto.DpProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         DpProp(DimensionProto.DpProp impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -109,39 +103,33 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static DpProp fromProto(@NonNull DimensionProto.DpProp proto) {
+        static @NonNull DpProp fromProto(DimensionProto.@NonNull DpProp proto) {
             return new DpProp(proto, null);
         }
 
-        @NonNull
-        DimensionProto.DpProp toProto() {
+        DimensionProto.@NonNull DpProp toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public DimensionProto.ContainerDimension toContainerDimensionProto() {
+        public DimensionProto.@NonNull ContainerDimension toContainerDimensionProto() {
             return DimensionProto.ContainerDimension.newBuilder().setLinearDimension(mImpl).build();
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public DimensionProto.ImageDimension toImageDimensionProto() {
+        public DimensionProto.@NonNull ImageDimension toImageDimensionProto() {
             return DimensionProto.ImageDimension.newBuilder().setLinearDimension(mImpl).build();
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public DimensionProto.SpacerDimension toSpacerDimensionProto() {
+        public DimensionProto.@NonNull SpacerDimension toSpacerDimensionProto() {
             return DimensionProto.SpacerDimension.newBuilder().setLinearDimension(mImpl).build();
         }
 
@@ -156,16 +144,14 @@
             public Builder() {}
 
             /** Sets the value, in dp. */
-            @NonNull
-            public Builder setValue(@Dimension(unit = DP) float value) {
+            public @NonNull Builder setValue(@Dimension(unit = DP) float value) {
                 mImpl.setValue(value);
                 mFingerprint.recordPropertyUpdate(1, Float.floatToIntBits(value));
                 return this;
             }
 
             @Override
-            @NonNull
-            public DpProp build() {
+            public @NonNull DpProp build() {
                 return new DpProp(mImpl.build(), mFingerprint);
             }
         }
@@ -174,7 +160,7 @@
     /** A type for font sizes, measured in sp. */
     public static final class SpProp {
         private final DimensionProto.SpProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         SpProp(DimensionProto.SpProp impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -189,18 +175,15 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static SpProp fromProto(@NonNull DimensionProto.SpProp proto) {
+        static @NonNull SpProp fromProto(DimensionProto.@NonNull SpProp proto) {
             return new SpProp(proto, null);
         }
 
-        @NonNull
-        DimensionProto.SpProp toProto() {
+        DimensionProto.@NonNull SpProp toProto() {
             return mImpl;
         }
 
@@ -212,16 +195,14 @@
             public Builder() {}
 
             /** Sets the value, in sp. */
-            @NonNull
-            public Builder setValue(@Dimension(unit = SP) float value) {
+            public @NonNull Builder setValue(@Dimension(unit = SP) float value) {
                 mImpl.setValue(value);
                 mFingerprint.recordPropertyUpdate(2, Float.floatToIntBits(value));
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public SpProp build() {
+            public @NonNull SpProp build() {
                 return new SpProp(mImpl.build(), mFingerprint);
             }
         }
@@ -230,7 +211,7 @@
     /** A type for font spacing, measured in em. */
     public static final class EmProp {
         private final DimensionProto.EmProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         EmProp(DimensionProto.EmProp impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -244,18 +225,15 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static EmProp fromProto(@NonNull DimensionProto.EmProp proto) {
+        static @NonNull EmProp fromProto(DimensionProto.@NonNull EmProp proto) {
             return new EmProp(proto, null);
         }
 
-        @NonNull
-        DimensionProto.EmProp toProto() {
+        DimensionProto.@NonNull EmProp toProto() {
             return mImpl;
         }
 
@@ -267,16 +245,14 @@
             public Builder() {}
 
             /** Sets the value, in em. */
-            @NonNull
-            public Builder setValue(float value) {
+            public @NonNull Builder setValue(float value) {
                 mImpl.setValue(value);
                 mFingerprint.recordPropertyUpdate(1, Float.floatToIntBits(value));
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public EmProp build() {
+            public @NonNull EmProp build() {
                 return new EmProp(mImpl.build(), mFingerprint);
             }
         }
@@ -285,7 +261,7 @@
     /** A type for angular dimensions, measured in degrees. */
     public static final class DegreesProp {
         private final DimensionProto.DegreesProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         DegreesProp(DimensionProto.DegreesProp impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -299,18 +275,15 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static DegreesProp fromProto(@NonNull DimensionProto.DegreesProp proto) {
+        static @NonNull DegreesProp fromProto(DimensionProto.@NonNull DegreesProp proto) {
             return new DegreesProp(proto, null);
         }
 
-        @NonNull
-        DimensionProto.DegreesProp toProto() {
+        DimensionProto.@NonNull DegreesProp toProto() {
             return mImpl;
         }
 
@@ -323,16 +296,14 @@
             public Builder() {}
 
             /** Sets the value, in degrees. */
-            @NonNull
-            public Builder setValue(float value) {
+            public @NonNull Builder setValue(float value) {
                 mImpl.setValue(value);
                 mFingerprint.recordPropertyUpdate(1, Float.floatToIntBits(value));
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public DegreesProp build() {
+            public @NonNull DegreesProp build() {
                 return new DegreesProp(mImpl.build(), mFingerprint);
             }
         }
@@ -344,7 +315,7 @@
      */
     public static final class ExpandedDimensionProp implements ContainerDimension, ImageDimension {
         private final DimensionProto.ExpandedDimensionProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         ExpandedDimensionProp(
                 DimensionProto.ExpandedDimensionProp impl, @Nullable Fingerprint fingerprint) {
@@ -354,26 +325,22 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static ExpandedDimensionProp fromProto(
-                @NonNull DimensionProto.ExpandedDimensionProp proto) {
+        static @NonNull ExpandedDimensionProp fromProto(
+                DimensionProto.@NonNull ExpandedDimensionProp proto) {
             return new ExpandedDimensionProp(proto, null);
         }
 
-        @NonNull
-        DimensionProto.ExpandedDimensionProp toProto() {
+        DimensionProto.@NonNull ExpandedDimensionProp toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public DimensionProto.ContainerDimension toContainerDimensionProto() {
+        public DimensionProto.@NonNull ContainerDimension toContainerDimensionProto() {
             return DimensionProto.ContainerDimension.newBuilder()
                     .setExpandedDimension(mImpl)
                     .build();
@@ -381,8 +348,7 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public DimensionProto.ImageDimension toImageDimensionProto() {
+        public DimensionProto.@NonNull ImageDimension toImageDimensionProto() {
             return DimensionProto.ImageDimension.newBuilder().setExpandedDimension(mImpl).build();
         }
 
@@ -396,8 +362,7 @@
             public Builder() {}
 
             @Override
-            @NonNull
-            public ExpandedDimensionProp build() {
+            public @NonNull ExpandedDimensionProp build() {
                 return new ExpandedDimensionProp(mImpl.build(), mFingerprint);
             }
         }
@@ -409,7 +374,7 @@
      */
     public static final class WrappedDimensionProp implements ContainerDimension {
         private final DimensionProto.WrappedDimensionProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         WrappedDimensionProp(
                 DimensionProto.WrappedDimensionProp impl, @Nullable Fingerprint fingerprint) {
@@ -419,25 +384,22 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static WrappedDimensionProp fromProto(@NonNull DimensionProto.WrappedDimensionProp proto) {
+        static @NonNull WrappedDimensionProp fromProto(
+                DimensionProto.@NonNull WrappedDimensionProp proto) {
             return new WrappedDimensionProp(proto, null);
         }
 
-        @NonNull
-        DimensionProto.WrappedDimensionProp toProto() {
+        DimensionProto.@NonNull WrappedDimensionProp toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public DimensionProto.ContainerDimension toContainerDimensionProto() {
+        public DimensionProto.@NonNull ContainerDimension toContainerDimensionProto() {
             return DimensionProto.ContainerDimension.newBuilder()
                     .setWrappedDimension(mImpl)
                     .build();
@@ -452,8 +414,7 @@
             public Builder() {}
 
             @Override
-            @NonNull
-            public WrappedDimensionProp build() {
+            public @NonNull WrappedDimensionProp build() {
                 return new WrappedDimensionProp(mImpl.build(), mFingerprint);
             }
         }
@@ -470,7 +431,7 @@
      */
     public static final class ProportionalDimensionProp implements ImageDimension {
         private final DimensionProto.ProportionalDimensionProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         ProportionalDimensionProp(
                 DimensionProto.ProportionalDimensionProp impl, @Nullable Fingerprint fingerprint) {
@@ -498,26 +459,22 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static ProportionalDimensionProp fromProto(
-                @NonNull DimensionProto.ProportionalDimensionProp proto) {
+        static @NonNull ProportionalDimensionProp fromProto(
+                DimensionProto.@NonNull ProportionalDimensionProp proto) {
             return new ProportionalDimensionProp(proto, null);
         }
 
-        @NonNull
-        DimensionProto.ProportionalDimensionProp toProto() {
+        DimensionProto.@NonNull ProportionalDimensionProp toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public DimensionProto.ImageDimension toImageDimensionProto() {
+        public DimensionProto.@NonNull ImageDimension toImageDimensionProto() {
             return DimensionProto.ImageDimension.newBuilder()
                     .setProportionalDimension(mImpl)
                     .build();
@@ -532,24 +489,22 @@
             public Builder() {}
 
             /** Sets the width to be used when calculating the aspect ratio to preserve. */
-            @NonNull
-            public Builder setAspectRatioWidth(@IntRange(from = 0) int aspectRatioWidth) {
+            public @NonNull Builder setAspectRatioWidth(@IntRange(from = 0) int aspectRatioWidth) {
                 mImpl.setAspectRatioWidth(aspectRatioWidth);
                 mFingerprint.recordPropertyUpdate(1, aspectRatioWidth);
                 return this;
             }
 
             /** Sets the height to be used when calculating the aspect ratio ratio to preserve. */
-            @NonNull
-            public Builder setAspectRatioHeight(@IntRange(from = 0) int aspectRatioHeight) {
+            public @NonNull Builder setAspectRatioHeight(
+                    @IntRange(from = 0) int aspectRatioHeight) {
                 mImpl.setAspectRatioHeight(aspectRatioHeight);
                 mFingerprint.recordPropertyUpdate(2, aspectRatioHeight);
                 return this;
             }
 
             @Override
-            @NonNull
-            public ProportionalDimensionProp build() {
+            public @NonNull ProportionalDimensionProp build() {
                 return new ProportionalDimensionProp(mImpl.build(), mFingerprint);
             }
         }
@@ -559,30 +514,26 @@
     public interface ContainerDimension {
         /** Get the protocol buffer representation of this object. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        DimensionProto.ContainerDimension toContainerDimensionProto();
+        DimensionProto.@NonNull ContainerDimension toContainerDimensionProto();
 
         /** Get the fingerprint for this object or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        Fingerprint getFingerprint();
+        @Nullable Fingerprint getFingerprint();
 
         /** Builder to create {@link ContainerDimension} objects. */
         @SuppressLint("StaticFinalBuilder")
         interface Builder {
 
             /** Builds an instance with values accumulated in this Builder. */
-            @NonNull
-            ContainerDimension build();
+            @NonNull ContainerDimension build();
         }
     }
 
     /**
      * Return an instance of one of this object's subtypes, from the protocol buffer representation.
      */
-    @NonNull
-    static ContainerDimension containerDimensionFromProto(
-            @NonNull DimensionProto.ContainerDimension proto) {
+    static @NonNull ContainerDimension containerDimensionFromProto(
+            DimensionProto.@NonNull ContainerDimension proto) {
         if (proto.hasLinearDimension()) {
             return DpProp.fromProto(proto.getLinearDimension());
         }
@@ -600,29 +551,26 @@
     public interface ImageDimension {
         /** Get the protocol buffer representation of this object. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        DimensionProto.ImageDimension toImageDimensionProto();
+        DimensionProto.@NonNull ImageDimension toImageDimensionProto();
 
         /** Get the fingerprint for this object or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        Fingerprint getFingerprint();
+        @Nullable Fingerprint getFingerprint();
 
         /** Builder to create {@link ImageDimension} objects. */
         @SuppressLint("StaticFinalBuilder")
         interface Builder {
 
             /** Builds an instance with values accumulated in this Builder. */
-            @NonNull
-            ImageDimension build();
+            @NonNull ImageDimension build();
         }
     }
 
     /**
      * Return an instance of one of this object's subtypes, from the protocol buffer representation.
      */
-    @NonNull
-    static ImageDimension imageDimensionFromProto(@NonNull DimensionProto.ImageDimension proto) {
+    static @NonNull ImageDimension imageDimensionFromProto(
+            DimensionProto.@NonNull ImageDimension proto) {
         if (proto.hasLinearDimension()) {
             return DpProp.fromProto(proto.getLinearDimension());
         }
@@ -639,26 +587,23 @@
     public interface SpacerDimension {
         /** Get the protocol buffer representation of this object. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        DimensionProto.SpacerDimension toSpacerDimensionProto();
+        DimensionProto.@NonNull SpacerDimension toSpacerDimensionProto();
 
         /** Get the fingerprint for this object or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        Fingerprint getFingerprint();
+        @Nullable Fingerprint getFingerprint();
 
         /** Builder to create {@link SpacerDimension} objects. */
         @SuppressLint("StaticFinalBuilder")
         interface Builder {
 
             /** Builds an instance with values accumulated in this Builder. */
-            @NonNull
-            SpacerDimension build();
+            @NonNull SpacerDimension build();
         }
     }
 
-    @NonNull
-    static SpacerDimension spacerDimensionFromProto(@NonNull DimensionProto.SpacerDimension proto) {
+    static @NonNull SpacerDimension spacerDimensionFromProto(
+            DimensionProto.@NonNull SpacerDimension proto) {
         if (proto.hasLinearDimension()) {
             return DpProp.fromProto(proto.getLinearDimension());
         }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DiskAccessAllowedPrefs.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DiskAccessAllowedPrefs.java
index 7928651..884becd 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DiskAccessAllowedPrefs.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DiskAccessAllowedPrefs.java
@@ -21,18 +21,19 @@
 import android.os.StrictMode;
 import android.os.StrictMode.ThreadPolicy;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.Map;
 
 /** Get versions of shared prefs that ignore strict mode and allows disk reads and writes. */
 @RestrictTo(Scope.LIBRARY_GROUP)
 final class DiskAccessAllowedPrefs {
 
-    @NonNull private final SharedPreferences preferences;
+    private final @NonNull SharedPreferences preferences;
 
     private DiskAccessAllowedPrefs(@NonNull SharedPreferences preferences) {
         this.preferences = preferences;
@@ -42,8 +43,7 @@
      * Returns a simplified version of {@link SharedPreferences} wrapped to ignore disk read and
      * write StrictMode violations.
      */
-    @Nullable
-    static DiskAccessAllowedPrefs wrap(@NonNull Context context, @NonNull String name) {
+    static @Nullable DiskAccessAllowedPrefs wrap(@NonNull Context context, @NonNull String name) {
         ThreadPolicy policy = StrictMode.allowThreadDiskReads();
         try {
             SharedPreferences sharedPref = context.getSharedPreferences(name, Context.MODE_PRIVATE);
@@ -53,8 +53,7 @@
         }
     }
 
-    @Nullable
-    Map<String, ?> getAll() {
+    @Nullable Map<String, ?> getAll() {
         ThreadPolicy policy = StrictMode.allowThreadDiskReads();
         try {
             return preferences.getAll();
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/EventBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/EventBuilders.java
index 7e72ffb..0e71b08 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/EventBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/EventBuilders.java
@@ -17,13 +17,14 @@
 package androidx.wear.tiles;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.annotation.VisibleForTesting;
 import androidx.wear.protolayout.expression.RequiresSchemaVersion;
 import androidx.wear.tiles.proto.EventProto;
 
+import org.jspecify.annotations.NonNull;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.time.Instant;
@@ -52,21 +53,18 @@
 
         /** Creates a new wrapper instance from the proto. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public static TileAddEvent fromProto(@NonNull EventProto.TileAddEvent proto) {
+        public static @NonNull TileAddEvent fromProto(EventProto.@NonNull TileAddEvent proto) {
             return new TileAddEvent(proto);
         }
 
         /** Returns the internal proto instance. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public EventProto.TileAddEvent toProto() {
+        public EventProto.@NonNull TileAddEvent toProto() {
             return mImpl;
         }
 
         @Override
-        @NonNull
-        public String toString() {
+        public @NonNull String toString() {
             return "TileAddEvent{" + "tileId=" + getTileId() + "}";
         }
 
@@ -84,15 +82,13 @@
              * carousel. This ID will remain the same for this tile instance as long it is not
              * removed from the carousel.
              */
-            @NonNull
-            public Builder setTileId(int tileId) {
+            public @NonNull Builder setTileId(int tileId) {
                 mImpl.setTileId(tileId);
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public TileAddEvent build() {
+            public @NonNull TileAddEvent build() {
                 return TileAddEvent.fromProto(mImpl.build());
             }
         }
@@ -118,21 +114,19 @@
 
         /** Creates a new wrapper instance from the proto. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public static TileRemoveEvent fromProto(@NonNull EventProto.TileRemoveEvent proto) {
+        public static @NonNull TileRemoveEvent fromProto(
+                EventProto.@NonNull TileRemoveEvent proto) {
             return new TileRemoveEvent(proto);
         }
 
         /** Returns the internal proto instance. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public EventProto.TileRemoveEvent toProto() {
+        public EventProto.@NonNull TileRemoveEvent toProto() {
             return mImpl;
         }
 
         @Override
-        @NonNull
-        public String toString() {
+        public @NonNull String toString() {
             return "TileRemoveEvent{" + "tileId=" + getTileId() + "}";
         }
 
@@ -149,15 +143,13 @@
              * Sets instance ID of the removed tile, allocated when the tile instance was added to
              * the carousel.
              */
-            @NonNull
-            public Builder setTileId(int tileId) {
+            public @NonNull Builder setTileId(int tileId) {
                 mImpl.setTileId(tileId);
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public TileRemoveEvent build() {
+            public @NonNull TileRemoveEvent build() {
                 return TileRemoveEvent.fromProto(mImpl.build());
             }
         }
@@ -183,21 +175,18 @@
 
         /** Creates a new wrapper instance from the proto. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public static TileEnterEvent fromProto(@NonNull EventProto.TileEnterEvent proto) {
+        public static @NonNull TileEnterEvent fromProto(EventProto.@NonNull TileEnterEvent proto) {
             return new TileEnterEvent(proto);
         }
 
         /** Returns the internal proto instance. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public EventProto.TileEnterEvent toProto() {
+        public EventProto.@NonNull TileEnterEvent toProto() {
             return mImpl;
         }
 
         @Override
-        @NonNull
-        public String toString() {
+        public @NonNull String toString() {
             return "TileEnterEvent{" + "tileId=" + getTileId() + "}";
         }
 
@@ -215,15 +204,13 @@
              * carousel. This ID will remain the same for this tile instance as long it is not
              * removed from the carousel.
              */
-            @NonNull
-            public Builder setTileId(int tileId) {
+            public @NonNull Builder setTileId(int tileId) {
                 mImpl.setTileId(tileId);
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public TileEnterEvent build() {
+            public @NonNull TileEnterEvent build() {
                 return TileEnterEvent.fromProto(mImpl.build());
             }
         }
@@ -252,21 +239,18 @@
 
         /** Creates a new wrapper instance from the proto. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public static TileLeaveEvent fromProto(@NonNull EventProto.TileLeaveEvent proto) {
+        public static @NonNull TileLeaveEvent fromProto(EventProto.@NonNull TileLeaveEvent proto) {
             return new TileLeaveEvent(proto);
         }
 
         /** Returns the internal proto instance. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public EventProto.TileLeaveEvent toProto() {
+        public EventProto.@NonNull TileLeaveEvent toProto() {
             return mImpl;
         }
 
         @Override
-        @NonNull
-        public String toString() {
+        public @NonNull String toString() {
             return "TileLeaveEvent{" + "tileId=" + getTileId() + "}";
         }
 
@@ -284,15 +268,13 @@
              * carousel. This ID will remain the same for this tile instance as long it is not
              * removed from the carousel.
              */
-            @NonNull
-            public Builder setTileId(int tileId) {
+            public @NonNull Builder setTileId(int tileId) {
                 mImpl.setTileId(tileId);
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public TileLeaveEvent build() {
+            public @NonNull TileLeaveEvent build() {
                 return TileLeaveEvent.fromProto(mImpl.build());
             }
         }
@@ -347,29 +329,25 @@
          * Instant#now()} (Created at the time of {@link
          * TileInteractionEvent.Builder#Builder(int,int)} constructor call) if not provided.
          */
-        @NonNull
-        public Instant getTimestamp() {
+        public @NonNull Instant getTimestamp() {
             return Instant.ofEpochMilli(mImpl.getTimestampEpochMillis());
         }
 
         /** Creates a new wrapper instance from the proto. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public static TileInteractionEvent fromProto(
-                @NonNull EventProto.TileInteractionEvent proto) {
+        public static @NonNull TileInteractionEvent fromProto(
+                EventProto.@NonNull TileInteractionEvent proto) {
             return new TileInteractionEvent(proto);
         }
 
         /** Returns the internal proto instance. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public EventProto.TileInteractionEvent toProto() {
+        public EventProto.@NonNull TileInteractionEvent toProto() {
             return mImpl;
         }
 
         @Override
-        @NonNull
-        public String toString() {
+        public @NonNull String toString() {
             return "TileInteractionEvent{"
                     + "tileId="
                     + getTileId()
@@ -382,8 +360,7 @@
 
         /** Builder for {@link TileInteractionEvent} */
         public static final class Builder {
-            @NonNull
-            private final EventProto.TileInteractionEvent.Builder mImpl =
+            private final EventProto.TileInteractionEvent.@NonNull Builder mImpl =
                     EventProto.TileInteractionEvent.newBuilder();
 
             /** Interface so this Builder can retrieve the current time. */
@@ -441,15 +418,13 @@
              * call) if not provided.
              */
             @RequiresSchemaVersion(major = 1, minor = 400)
-            @NonNull
-            public Builder setTimestamp(@NonNull Instant instant) {
+            public @NonNull Builder setTimestamp(@NonNull Instant instant) {
                 mImpl.setTimestampEpochMillis(instant.toEpochMilli());
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public TileInteractionEvent build() {
+            public @NonNull TileInteractionEvent build() {
                 return TileInteractionEvent.fromProto(mImpl.build());
             }
         }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/LayoutElementBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/LayoutElementBuilders.java
index 259bddf..eca36c9 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/LayoutElementBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/LayoutElementBuilders.java
@@ -24,8 +24,6 @@
 
 import androidx.annotation.IntDef;
 import androidx.annotation.IntRange;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.OptIn;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
@@ -38,6 +36,9 @@
 import androidx.wear.protolayout.proto.TypesProto;
 import androidx.wear.protolayout.protobuf.InvalidProtocolBufferException;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.Collections;
@@ -316,7 +317,7 @@
     /** An extensible {@code HorizontalAlignment} property. */
     public static final class HorizontalAlignmentProp {
         private final AlignmentProto.HorizontalAlignmentProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         private HorizontalAlignmentProp(
                 AlignmentProto.HorizontalAlignmentProp impl, @Nullable Fingerprint fingerprint) {
@@ -332,19 +333,16 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static HorizontalAlignmentProp fromProto(
-                @NonNull AlignmentProto.HorizontalAlignmentProp proto) {
+        static @NonNull HorizontalAlignmentProp fromProto(
+                AlignmentProto.@NonNull HorizontalAlignmentProp proto) {
             return new HorizontalAlignmentProp(proto, null);
         }
 
-        @NonNull
-        AlignmentProto.HorizontalAlignmentProp toProto() {
+        AlignmentProto.@NonNull HorizontalAlignmentProp toProto() {
             return mImpl;
         }
 
@@ -357,16 +355,14 @@
             public Builder() {}
 
             /** Sets the value. */
-            @NonNull
-            public Builder setValue(@HorizontalAlignment int value) {
+            public @NonNull Builder setValue(@HorizontalAlignment int value) {
                 mImpl.setValue(AlignmentProto.HorizontalAlignment.forNumber(value));
                 mFingerprint.recordPropertyUpdate(1, value);
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public HorizontalAlignmentProp build() {
+            public @NonNull HorizontalAlignmentProp build() {
                 return HorizontalAlignmentProp.fromProto(mImpl.build());
             }
         }
@@ -375,7 +371,7 @@
     /** An extensible {@code VerticalAlignment} property. */
     public static final class VerticalAlignmentProp {
         private final AlignmentProto.VerticalAlignmentProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         VerticalAlignmentProp(
                 AlignmentProto.VerticalAlignmentProp impl, @Nullable Fingerprint fingerprint) {
@@ -391,19 +387,16 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static VerticalAlignmentProp fromProto(
-                @NonNull AlignmentProto.VerticalAlignmentProp proto) {
+        static @NonNull VerticalAlignmentProp fromProto(
+                AlignmentProto.@NonNull VerticalAlignmentProp proto) {
             return new VerticalAlignmentProp(proto, null);
         }
 
-        @NonNull
-        AlignmentProto.VerticalAlignmentProp toProto() {
+        AlignmentProto.@NonNull VerticalAlignmentProp toProto() {
             return mImpl;
         }
 
@@ -416,16 +409,14 @@
             public Builder() {}
 
             /** Sets the value. */
-            @NonNull
-            public Builder setValue(@VerticalAlignment int value) {
+            public @NonNull Builder setValue(@VerticalAlignment int value) {
                 mImpl.setValue(AlignmentProto.VerticalAlignment.forNumber(value));
                 mFingerprint.recordPropertyUpdate(1, value);
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public VerticalAlignmentProp build() {
+            public @NonNull VerticalAlignmentProp build() {
                 return new VerticalAlignmentProp(mImpl.build(), mFingerprint);
             }
         }
@@ -434,7 +425,7 @@
     /** An extensible {@code FontWeight} property. */
     public static final class FontWeightProp {
         private final LayoutElementProto.FontWeightProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         FontWeightProp(LayoutElementProto.FontWeightProp impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -449,18 +440,15 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static FontWeightProp fromProto(@NonNull LayoutElementProto.FontWeightProp proto) {
+        static @NonNull FontWeightProp fromProto(LayoutElementProto.@NonNull FontWeightProp proto) {
             return new FontWeightProp(proto, null);
         }
 
-        @NonNull
-        LayoutElementProto.FontWeightProp toProto() {
+        LayoutElementProto.@NonNull FontWeightProp toProto() {
             return mImpl;
         }
 
@@ -473,16 +461,14 @@
             public Builder() {}
 
             /** Sets the value. */
-            @NonNull
-            public Builder setValue(@FontWeight int value) {
+            public @NonNull Builder setValue(@FontWeight int value) {
                 mImpl.setValue(LayoutElementProto.FontWeight.forNumber(value));
                 mFingerprint.recordPropertyUpdate(1, value);
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public FontWeightProp build() {
+            public @NonNull FontWeightProp build() {
                 return new FontWeightProp(mImpl.build(), mFingerprint);
             }
         }
@@ -492,7 +478,7 @@
     @TilesExperimental
     public static final class FontVariantProp {
         private final LayoutElementProto.FontVariantProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         FontVariantProp(
                 LayoutElementProto.FontVariantProp impl, @Nullable Fingerprint fingerprint) {
@@ -508,18 +494,16 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static FontVariantProp fromProto(@NonNull LayoutElementProto.FontVariantProp proto) {
+        static @NonNull FontVariantProp fromProto(
+                LayoutElementProto.@NonNull FontVariantProp proto) {
             return new FontVariantProp(proto, null);
         }
 
-        @NonNull
-        LayoutElementProto.FontVariantProp toProto() {
+        LayoutElementProto.@NonNull FontVariantProp toProto() {
             return mImpl;
         }
 
@@ -532,16 +516,14 @@
             public Builder() {}
 
             /** Sets the value. */
-            @NonNull
-            public Builder setValue(@FontVariant int value) {
+            public @NonNull Builder setValue(@FontVariant int value) {
                 mImpl.setValue(LayoutElementProto.FontVariant.forNumber(value));
                 mFingerprint.recordPropertyUpdate(1, value);
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public FontVariantProp build() {
+            public @NonNull FontVariantProp build() {
                 return new FontVariantProp(mImpl.build(), mFingerprint);
             }
         }
@@ -550,7 +532,7 @@
     /** An extensible {@code SpanVerticalAlignment} property. */
     public static final class SpanVerticalAlignmentProp {
         private final LayoutElementProto.SpanVerticalAlignmentProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         SpanVerticalAlignmentProp(
                 LayoutElementProto.SpanVerticalAlignmentProp impl,
@@ -567,19 +549,16 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static SpanVerticalAlignmentProp fromProto(
-                @NonNull LayoutElementProto.SpanVerticalAlignmentProp proto) {
+        static @NonNull SpanVerticalAlignmentProp fromProto(
+                LayoutElementProto.@NonNull SpanVerticalAlignmentProp proto) {
             return new SpanVerticalAlignmentProp(proto, null);
         }
 
-        @NonNull
-        LayoutElementProto.SpanVerticalAlignmentProp toProto() {
+        LayoutElementProto.@NonNull SpanVerticalAlignmentProp toProto() {
             return mImpl;
         }
 
@@ -592,16 +571,14 @@
             public Builder() {}
 
             /** Sets the value. */
-            @NonNull
-            public Builder setValue(@SpanVerticalAlignment int value) {
+            public @NonNull Builder setValue(@SpanVerticalAlignment int value) {
                 mImpl.setValue(LayoutElementProto.SpanVerticalAlignment.forNumber(value));
                 mFingerprint.recordPropertyUpdate(1, value);
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public SpanVerticalAlignmentProp build() {
+            public @NonNull SpanVerticalAlignmentProp build() {
                 return new SpanVerticalAlignmentProp(mImpl.build(), mFingerprint);
             }
         }
@@ -610,7 +587,7 @@
     /** The styling of a font (e.g. font size, and metrics). */
     public static final class FontStyle {
         private final LayoutElementProto.FontStyle mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         FontStyle(LayoutElementProto.FontStyle impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -621,8 +598,7 @@
          * Gets the size of the font, in scaled pixels (sp). If not specified, defaults to the size
          * of the system's "body" font. Intended for testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.SpProp getSize() {
+        public DimensionBuilders.@Nullable SpProp getSize() {
             List<DimensionProto.SpProp> sizes = mImpl.getSizeList();
             if (!sizes.isEmpty()) {
                 return DimensionBuilders.SpProp.fromProto(sizes.get(0));
@@ -635,8 +611,7 @@
          * Gets whether the text should be rendered in a italic typeface. If not specified, defaults
          * to "false". Intended for testing purposes only.
          */
-        @Nullable
-        public TypeBuilders.BoolProp getItalic() {
+        public TypeBuilders.@Nullable BoolProp getItalic() {
             if (mImpl.hasItalic()) {
                 return TypeBuilders.BoolProp.fromProto(mImpl.getItalic());
             } else {
@@ -648,8 +623,7 @@
          * Gets whether the text should be rendered with an underline. If not specified, defaults to
          * "false". Intended for testing purposes only.
          */
-        @Nullable
-        public TypeBuilders.BoolProp getUnderline() {
+        public TypeBuilders.@Nullable BoolProp getUnderline() {
             if (mImpl.hasUnderline()) {
                 return TypeBuilders.BoolProp.fromProto(mImpl.getUnderline());
             } else {
@@ -661,8 +635,7 @@
          * Gets the text color. If not defined, defaults to white. Intended for testing purposes
          * only.
          */
-        @Nullable
-        public ColorBuilders.ColorProp getColor() {
+        public ColorBuilders.@Nullable ColorProp getColor() {
             if (mImpl.hasColor()) {
                 return ColorBuilders.ColorProp.fromProto(mImpl.getColor());
             } else {
@@ -675,8 +648,7 @@
          * nearest supported value will be used. If not defined, or when set to an invalid value,
          * defaults to "normal". Intended for testing purposes only.
          */
-        @Nullable
-        public FontWeightProp getWeight() {
+        public @Nullable FontWeightProp getWeight() {
             if (mImpl.hasWeight()) {
                 return FontWeightProp.fromProto(mImpl.getWeight());
             } else {
@@ -689,8 +661,7 @@
          * negative numbers tighten the space. If not specified, defaults to 0. Intended for testing
          * purposes only.
          */
-        @Nullable
-        public DimensionBuilders.EmProp getLetterSpacing() {
+        public DimensionBuilders.@Nullable EmProp getLetterSpacing() {
             if (mImpl.hasLetterSpacing()) {
                 return DimensionBuilders.EmProp.fromProto(mImpl.getLetterSpacing());
             } else {
@@ -704,8 +675,7 @@
          * Intended for testing purposes only.
          */
         @TilesExperimental
-        @Nullable
-        public FontVariantProp getVariant() {
+        public @Nullable FontVariantProp getVariant() {
             if (mImpl.hasVariant()) {
                 return FontVariantProp.fromProto(mImpl.getVariant());
             } else {
@@ -715,20 +685,17 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static FontStyle fromProto(@NonNull LayoutElementProto.FontStyle proto) {
+        static @NonNull FontStyle fromProto(LayoutElementProto.@NonNull FontStyle proto) {
             return new FontStyle(proto, null);
         }
 
         /** Returns the internal proto instance. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public LayoutElementProto.FontStyle toProto() {
+        public LayoutElementProto.@NonNull FontStyle toProto() {
             return mImpl;
         }
 
@@ -744,8 +711,7 @@
              * Sets the size of the font, in scaled pixels (sp). If not specified, defaults to the
              * size of the system's "body" font.
              */
-            @NonNull
-            public Builder setSize(@NonNull DimensionBuilders.SpProp size) {
+            public @NonNull Builder setSize(DimensionBuilders.@NonNull SpProp size) {
                 mImpl.clearSize();
                 mImpl.addSize(size.toProto());
                 mFingerprint.recordPropertyUpdate(
@@ -757,8 +723,7 @@
              * Sets whether the text should be rendered in a italic typeface. If not specified,
              * defaults to "false".
              */
-            @NonNull
-            public Builder setItalic(@NonNull TypeBuilders.BoolProp italic) {
+            public @NonNull Builder setItalic(TypeBuilders.@NonNull BoolProp italic) {
                 mImpl.setItalic(italic.toProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(italic.getFingerprint()).aggregateValueAsInt());
@@ -770,8 +735,7 @@
              * defaults to "false".
              */
             @SuppressLint("MissingGetterMatchingBuilder")
-            @NonNull
-            public Builder setItalic(boolean italic) {
+            public @NonNull Builder setItalic(boolean italic) {
                 mImpl.setItalic(TypesProto.BoolProp.newBuilder().setValue(italic));
                 mFingerprint.recordPropertyUpdate(2, Boolean.hashCode(italic));
                 return this;
@@ -781,8 +745,7 @@
              * Sets whether the text should be rendered with an underline. If not specified,
              * defaults to "false".
              */
-            @NonNull
-            public Builder setUnderline(@NonNull TypeBuilders.BoolProp underline) {
+            public @NonNull Builder setUnderline(TypeBuilders.@NonNull BoolProp underline) {
                 mImpl.setUnderline(underline.toProto());
                 mFingerprint.recordPropertyUpdate(
                         3, checkNotNull(underline.getFingerprint()).aggregateValueAsInt());
@@ -794,16 +757,14 @@
              * defaults to "false".
              */
             @SuppressLint("MissingGetterMatchingBuilder")
-            @NonNull
-            public Builder setUnderline(boolean underline) {
+            public @NonNull Builder setUnderline(boolean underline) {
                 mImpl.setUnderline(TypesProto.BoolProp.newBuilder().setValue(underline));
                 mFingerprint.recordPropertyUpdate(3, Boolean.hashCode(underline));
                 return this;
             }
 
             /** Sets the text color. If not defined, defaults to white. */
-            @NonNull
-            public Builder setColor(@NonNull ColorBuilders.ColorProp color) {
+            public @NonNull Builder setColor(ColorBuilders.@NonNull ColorProp color) {
                 mImpl.setColor(color.toProto());
                 mFingerprint.recordPropertyUpdate(
                         4, checkNotNull(color.getFingerprint()).aggregateValueAsInt());
@@ -815,8 +776,7 @@
              * the nearest supported value will be used. If not defined, or when set to an invalid
              * value, defaults to "normal".
              */
-            @NonNull
-            public Builder setWeight(@NonNull FontWeightProp weight) {
+            public @NonNull Builder setWeight(@NonNull FontWeightProp weight) {
                 mImpl.setWeight(weight.toProto());
                 mFingerprint.recordPropertyUpdate(
                         5, checkNotNull(weight.getFingerprint()).aggregateValueAsInt());
@@ -828,8 +788,7 @@
              * the nearest supported value will be used. If not defined, or when set to an invalid
              * value, defaults to "normal".
              */
-            @NonNull
-            public Builder setWeight(@FontWeight int weight) {
+            public @NonNull Builder setWeight(@FontWeight int weight) {
                 mImpl.setWeight(
                         LayoutElementProto.FontWeightProp.newBuilder()
                                 .setValue(LayoutElementProto.FontWeight.forNumber(weight)));
@@ -841,8 +800,8 @@
              * Sets the text letter-spacing. Positive numbers increase the space between letters
              * while negative numbers tighten the space. If not specified, defaults to 0.
              */
-            @NonNull
-            public Builder setLetterSpacing(@NonNull DimensionBuilders.EmProp letterSpacing) {
+            public @NonNull Builder setLetterSpacing(
+                    DimensionBuilders.@NonNull EmProp letterSpacing) {
                 mImpl.setLetterSpacing(letterSpacing.toProto());
                 mFingerprint.recordPropertyUpdate(
                         6, checkNotNull(letterSpacing.getFingerprint()).aggregateValueAsInt());
@@ -854,8 +813,7 @@
              * text, which can be selected using this field. If not specified, defaults to "body".
              */
             @TilesExperimental
-            @NonNull
-            public Builder setVariant(@NonNull FontVariantProp variant) {
+            public @NonNull Builder setVariant(@NonNull FontVariantProp variant) {
                 mImpl.setVariant(variant.toProto());
                 mFingerprint.recordPropertyUpdate(
                         7, checkNotNull(variant.getFingerprint()).aggregateValueAsInt());
@@ -867,8 +825,7 @@
              * text, which can be selected using this field. If not specified, defaults to "body".
              */
             @TilesExperimental
-            @NonNull
-            public Builder setVariant(@FontVariant int variant) {
+            public @NonNull Builder setVariant(@FontVariant int variant) {
                 mImpl.setVariant(
                         LayoutElementProto.FontVariantProp.newBuilder()
                                 .setValue(LayoutElementProto.FontVariant.forNumber(variant)));
@@ -877,8 +834,7 @@
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public FontStyle build() {
+            public @NonNull FontStyle build() {
                 return new FontStyle(mImpl.build(), mFingerprint);
             }
         }
@@ -887,7 +843,7 @@
     /** An extensible {@code TextAlignment} property. */
     public static final class TextAlignmentProp {
         private final AlignmentProto.TextAlignmentProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         TextAlignmentProp(
                 AlignmentProto.TextAlignmentProp impl, @Nullable Fingerprint fingerprint) {
@@ -903,18 +859,16 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static TextAlignmentProp fromProto(@NonNull AlignmentProto.TextAlignmentProp proto) {
+        static @NonNull TextAlignmentProp fromProto(
+                AlignmentProto.@NonNull TextAlignmentProp proto) {
             return new TextAlignmentProp(proto, null);
         }
 
-        @NonNull
-        AlignmentProto.TextAlignmentProp toProto() {
+        AlignmentProto.@NonNull TextAlignmentProp toProto() {
             return mImpl;
         }
 
@@ -927,16 +881,14 @@
             public Builder() {}
 
             /** Sets the value. */
-            @NonNull
-            public Builder setValue(@TextAlignment int value) {
+            public @NonNull Builder setValue(@TextAlignment int value) {
                 mImpl.setValue(AlignmentProto.TextAlignment.forNumber(value));
                 mFingerprint.recordPropertyUpdate(1, value);
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public TextAlignmentProp build() {
+            public @NonNull TextAlignmentProp build() {
                 return new TextAlignmentProp(mImpl.build(), mFingerprint);
             }
         }
@@ -945,7 +897,7 @@
     /** An extensible {@code TextOverflow} property. */
     public static final class TextOverflowProp {
         private final LayoutElementProto.TextOverflowProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         TextOverflowProp(
                 LayoutElementProto.TextOverflowProp impl, @Nullable Fingerprint fingerprint) {
@@ -961,18 +913,16 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static TextOverflowProp fromProto(@NonNull LayoutElementProto.TextOverflowProp proto) {
+        static @NonNull TextOverflowProp fromProto(
+                LayoutElementProto.@NonNull TextOverflowProp proto) {
             return new TextOverflowProp(proto, null);
         }
 
-        @NonNull
-        LayoutElementProto.TextOverflowProp toProto() {
+        LayoutElementProto.@NonNull TextOverflowProp toProto() {
             return mImpl;
         }
 
@@ -985,16 +935,14 @@
             public Builder() {}
 
             /** Sets the value. */
-            @NonNull
-            public Builder setValue(@TextOverflow int value) {
+            public @NonNull Builder setValue(@TextOverflow int value) {
                 mImpl.setValue(LayoutElementProto.TextOverflow.forNumber(value));
                 mFingerprint.recordPropertyUpdate(1, value);
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public TextOverflowProp build() {
+            public @NonNull TextOverflowProp build() {
                 return new TextOverflowProp(mImpl.build(), mFingerprint);
             }
         }
@@ -1003,7 +951,7 @@
     /** An extensible {@code ArcAnchorType} property. */
     public static final class ArcAnchorTypeProp {
         private final AlignmentProto.ArcAnchorTypeProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         ArcAnchorTypeProp(
                 AlignmentProto.ArcAnchorTypeProp impl, @Nullable Fingerprint fingerprint) {
@@ -1019,18 +967,16 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static ArcAnchorTypeProp fromProto(@NonNull AlignmentProto.ArcAnchorTypeProp proto) {
+        static @NonNull ArcAnchorTypeProp fromProto(
+                AlignmentProto.@NonNull ArcAnchorTypeProp proto) {
             return new ArcAnchorTypeProp(proto, null);
         }
 
-        @NonNull
-        AlignmentProto.ArcAnchorTypeProp toProto() {
+        AlignmentProto.@NonNull ArcAnchorTypeProp toProto() {
             return mImpl;
         }
 
@@ -1043,16 +989,14 @@
             public Builder() {}
 
             /** Sets the value. */
-            @NonNull
-            public Builder setValue(@ArcAnchorType int value) {
+            public @NonNull Builder setValue(@ArcAnchorType int value) {
                 mImpl.setValue(AlignmentProto.ArcAnchorType.forNumber(value));
                 mFingerprint.recordPropertyUpdate(1, value);
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public ArcAnchorTypeProp build() {
+            public @NonNull ArcAnchorTypeProp build() {
                 return new ArcAnchorTypeProp(mImpl.build(), mFingerprint);
             }
         }
@@ -1061,7 +1005,7 @@
     /** A text string. */
     public static final class Text implements LayoutElement {
         private final LayoutElementProto.Text mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         Text(LayoutElementProto.Text impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -1069,8 +1013,7 @@
         }
 
         /** Gets the text to render. Intended for testing purposes only. */
-        @Nullable
-        public TypeBuilders.StringProp getText() {
+        public TypeBuilders.@Nullable StringProp getText() {
             if (mImpl.hasText()) {
                 return TypeBuilders.StringProp.fromProto(mImpl.getText());
             } else {
@@ -1082,8 +1025,7 @@
          * Gets the style of font to use (size, bold etc). If not specified, defaults to the
          * platform's default body font. Intended for testing purposes only.
          */
-        @Nullable
-        public FontStyle getFontStyle() {
+        public @Nullable FontStyle getFontStyle() {
             if (mImpl.hasFontStyle()) {
                 return FontStyle.fromProto(mImpl.getFontStyle());
             } else {
@@ -1095,8 +1037,7 @@
          * Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public ModifiersBuilders.Modifiers getModifiers() {
+        public ModifiersBuilders.@Nullable Modifiers getModifiers() {
             if (mImpl.hasModifiers()) {
                 return ModifiersBuilders.Modifiers.fromProto(mImpl.getModifiers());
             } else {
@@ -1109,8 +1050,7 @@
          * not defined, the {@link Text} element will be treated as a single-line element. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public TypeBuilders.Int32Prop getMaxLines() {
+        public TypeBuilders.@Nullable Int32Prop getMaxLines() {
             if (mImpl.hasMaxLines()) {
                 return TypeBuilders.Int32Prop.fromProto(mImpl.getMaxLines());
             } else {
@@ -1125,8 +1065,7 @@
          * the alignment of lines relative to the {@link Text} element bounds. If not defined,
          * defaults to TEXT_ALIGN_CENTER. Intended for testing purposes only.
          */
-        @Nullable
-        public TextAlignmentProp getMultilineAlignment() {
+        public @Nullable TextAlignmentProp getMultilineAlignment() {
             if (mImpl.hasMultilineAlignment()) {
                 return TextAlignmentProp.fromProto(mImpl.getMultilineAlignment());
             } else {
@@ -1141,8 +1080,7 @@
          * which cannot fit inside its container will be truncated. If not defined, defaults to
          * TEXT_OVERFLOW_TRUNCATE. Intended for testing purposes only.
          */
-        @Nullable
-        public TextOverflowProp getOverflow() {
+        public @Nullable TextOverflowProp getOverflow() {
             if (mImpl.hasOverflow()) {
                 return TextOverflowProp.fromProto(mImpl.getOverflow());
             } else {
@@ -1155,8 +1093,7 @@
          * distance between subsequent baselines. If not specified, defaults the font's recommended
          * interline spacing. Intended for testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.SpProp getLineHeight() {
+        public DimensionBuilders.@Nullable SpProp getLineHeight() {
             if (mImpl.hasLineHeight()) {
                 return DimensionBuilders.SpProp.fromProto(mImpl.getLineHeight());
             } else {
@@ -1166,26 +1103,22 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static Text fromProto(
-                @NonNull LayoutElementProto.Text proto, @Nullable Fingerprint fingerprint) {
+        static @NonNull Text fromProto(
+                LayoutElementProto.@NonNull Text proto, @Nullable Fingerprint fingerprint) {
             return new Text(proto, fingerprint);
         }
 
-        @NonNull
-        LayoutElementProto.Text toProto() {
+        LayoutElementProto.@NonNull Text toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public LayoutElementProto.LayoutElement toLayoutElementProto() {
+        public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
             return LayoutElementProto.LayoutElement.newBuilder().setText(mImpl).build();
         }
 
@@ -1198,8 +1131,7 @@
             public Builder() {}
 
             /** Sets the text to render. */
-            @NonNull
-            public Builder setText(@NonNull TypeBuilders.StringProp text) {
+            public @NonNull Builder setText(TypeBuilders.@NonNull StringProp text) {
                 mImpl.setText(text.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(text.getFingerprint()).aggregateValueAsInt());
@@ -1207,8 +1139,7 @@
             }
 
             /** Sets the text to render. */
-            @NonNull
-            public Builder setText(@NonNull String text) {
+            public @NonNull Builder setText(@NonNull String text) {
                 mImpl.mergeText(TypesProto.StringProp.newBuilder().setValue(text).build());
                 mFingerprint.recordPropertyUpdate(1, text.hashCode());
                 return this;
@@ -1218,8 +1149,7 @@
              * Sets the style of font to use (size, bold etc). If not specified, defaults to the
              * platform's default body font.
              */
-            @NonNull
-            public Builder setFontStyle(@NonNull FontStyle fontStyle) {
+            public @NonNull Builder setFontStyle(@NonNull FontStyle fontStyle) {
                 mImpl.setFontStyle(fontStyle.toProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(fontStyle.getFingerprint()).aggregateValueAsInt());
@@ -1227,8 +1157,7 @@
             }
 
             /** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
-            @NonNull
-            public Builder setModifiers(@NonNull ModifiersBuilders.Modifiers modifiers) {
+            public @NonNull Builder setModifiers(ModifiersBuilders.@NonNull Modifiers modifiers) {
                 mImpl.setModifiers(modifiers.toProto());
                 mFingerprint.recordPropertyUpdate(
                         3, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -1239,8 +1168,7 @@
              * Sets the maximum number of lines that can be represented by the {@link Text} element.
              * If not defined, the {@link Text} element will be treated as a single-line element.
              */
-            @NonNull
-            public Builder setMaxLines(@NonNull TypeBuilders.Int32Prop maxLines) {
+            public @NonNull Builder setMaxLines(TypeBuilders.@NonNull Int32Prop maxLines) {
                 mImpl.setMaxLines(maxLines.toProto());
                 mFingerprint.recordPropertyUpdate(
                         4, checkNotNull(maxLines.getFingerprint()).aggregateValueAsInt());
@@ -1251,8 +1179,7 @@
              * Sets the maximum number of lines that can be represented by the {@link Text} element.
              * If not defined, the {@link Text} element will be treated as a single-line element.
              */
-            @NonNull
-            public Builder setMaxLines(@IntRange(from = 1) int maxLines) {
+            public @NonNull Builder setMaxLines(@IntRange(from = 1) int maxLines) {
                 mImpl.setMaxLines(TypesProto.Int32Prop.newBuilder().setValue(maxLines));
                 mFingerprint.recordPropertyUpdate(4, maxLines);
                 return this;
@@ -1265,8 +1192,8 @@
              * will set the alignment of lines relative to the {@link Text} element bounds. If not
              * defined, defaults to TEXT_ALIGN_CENTER.
              */
-            @NonNull
-            public Builder setMultilineAlignment(@NonNull TextAlignmentProp multilineAlignment) {
+            public @NonNull Builder setMultilineAlignment(
+                    @NonNull TextAlignmentProp multilineAlignment) {
                 mImpl.setMultilineAlignment(multilineAlignment.toProto());
                 mFingerprint.recordPropertyUpdate(
                         5, checkNotNull(multilineAlignment.getFingerprint()).aggregateValueAsInt());
@@ -1280,8 +1207,7 @@
              * will set the alignment of lines relative to the {@link Text} element bounds. If not
              * defined, defaults to TEXT_ALIGN_CENTER.
              */
-            @NonNull
-            public Builder setMultilineAlignment(@TextAlignment int multilineAlignment) {
+            public @NonNull Builder setMultilineAlignment(@TextAlignment int multilineAlignment) {
                 mImpl.setMultilineAlignment(
                         AlignmentProto.TextAlignmentProp.newBuilder()
                                 .setValue(
@@ -1298,8 +1224,7 @@
              * its text, the text which cannot fit inside its container will be truncated. If not
              * defined, defaults to TEXT_OVERFLOW_TRUNCATE.
              */
-            @NonNull
-            public Builder setOverflow(@NonNull TextOverflowProp overflow) {
+            public @NonNull Builder setOverflow(@NonNull TextOverflowProp overflow) {
                 mImpl.setOverflow(overflow.toProto());
                 mFingerprint.recordPropertyUpdate(
                         6, checkNotNull(overflow.getFingerprint()).aggregateValueAsInt());
@@ -1313,8 +1238,7 @@
              * its text, the text which cannot fit inside its container will be truncated. If not
              * defined, defaults to TEXT_OVERFLOW_TRUNCATE.
              */
-            @NonNull
-            public Builder setOverflow(@TextOverflow int overflow) {
+            public @NonNull Builder setOverflow(@TextOverflow int overflow) {
                 mImpl.setOverflow(
                         LayoutElementProto.TextOverflowProp.newBuilder()
                                 .setValue(LayoutElementProto.TextOverflow.forNumber(overflow)));
@@ -1327,8 +1251,7 @@
              * distance between subsequent baselines. If not specified, defaults the font's
              * recommended interline spacing.
              */
-            @NonNull
-            public Builder setLineHeight(@NonNull DimensionBuilders.SpProp lineHeight) {
+            public @NonNull Builder setLineHeight(DimensionBuilders.@NonNull SpProp lineHeight) {
                 mImpl.setLineHeight(lineHeight.toProto());
                 mFingerprint.recordPropertyUpdate(
                         7, checkNotNull(lineHeight.getFingerprint()).aggregateValueAsInt());
@@ -1336,8 +1259,7 @@
             }
 
             @Override
-            @NonNull
-            public Text build() {
+            public @NonNull Text build() {
                 return new Text(mImpl.build(), mFingerprint);
             }
         }
@@ -1346,7 +1268,7 @@
     /** An extensible {@code ContentScaleMode} property. */
     public static final class ContentScaleModeProp {
         private final LayoutElementProto.ContentScaleModeProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         ContentScaleModeProp(
                 LayoutElementProto.ContentScaleModeProp impl, @Nullable Fingerprint fingerprint) {
@@ -1362,19 +1284,16 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static ContentScaleModeProp fromProto(
-                @NonNull LayoutElementProto.ContentScaleModeProp proto) {
+        static @NonNull ContentScaleModeProp fromProto(
+                LayoutElementProto.@NonNull ContentScaleModeProp proto) {
             return new ContentScaleModeProp(proto, null);
         }
 
-        @NonNull
-        LayoutElementProto.ContentScaleModeProp toProto() {
+        LayoutElementProto.@NonNull ContentScaleModeProp toProto() {
             return mImpl;
         }
 
@@ -1387,16 +1306,14 @@
             public Builder() {}
 
             /** Sets the value. */
-            @NonNull
-            public Builder setValue(@ContentScaleMode int value) {
+            public @NonNull Builder setValue(@ContentScaleMode int value) {
                 mImpl.setValue(LayoutElementProto.ContentScaleMode.forNumber(value));
                 mFingerprint.recordPropertyUpdate(1, value);
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public ContentScaleModeProp build() {
+            public @NonNull ContentScaleModeProp build() {
                 return new ContentScaleModeProp(mImpl.build(), mFingerprint);
             }
         }
@@ -1405,7 +1322,7 @@
     /** Filtering parameters used for images. This can be used to apply a color tint to images. */
     public static final class ColorFilter {
         private final LayoutElementProto.ColorFilter mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         ColorFilter(LayoutElementProto.ColorFilter impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -1420,8 +1337,7 @@
          * <p>Note that only Android image resources can be tinted; Inline images will not be
          * tinted, and this property will have no effect. Intended for testing purposes only.
          */
-        @Nullable
-        public ColorBuilders.ColorProp getTint() {
+        public ColorBuilders.@Nullable ColorProp getTint() {
             if (mImpl.hasTint()) {
                 return ColorBuilders.ColorProp.fromProto(mImpl.getTint());
             } else {
@@ -1431,18 +1347,15 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static ColorFilter fromProto(@NonNull LayoutElementProto.ColorFilter proto) {
+        static @NonNull ColorFilter fromProto(LayoutElementProto.@NonNull ColorFilter proto) {
             return new ColorFilter(proto, null);
         }
 
-        @NonNull
-        LayoutElementProto.ColorFilter toProto() {
+        LayoutElementProto.@NonNull ColorFilter toProto() {
             return mImpl;
         }
 
@@ -1462,9 +1375,8 @@
              * <p>Note that only Android image resources can be tinted; Inline images will not be
              * tinted, and this property will have no effect.
              */
-            @NonNull
-            public LayoutElementBuilders.ColorFilter.Builder setTint(
-                    @NonNull ColorBuilders.ColorProp tint) {
+            public LayoutElementBuilders.ColorFilter.@NonNull Builder setTint(
+                    ColorBuilders.@NonNull ColorProp tint) {
                 mImpl.setTint(tint.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(tint.getFingerprint()).aggregateValueAsInt());
@@ -1472,8 +1384,7 @@
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public ColorFilter build() {
+            public @NonNull ColorFilter build() {
                 return new ColorFilter(mImpl.build(), mFingerprint);
             }
         }
@@ -1488,7 +1399,7 @@
      */
     public static final class Image implements LayoutElement {
         private final LayoutElementProto.Image mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         Image(LayoutElementProto.Image impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -1499,8 +1410,7 @@
          * Gets the resource_id of the image to render. This must exist in the supplied resource
          * bundle. Intended for testing purposes only.
          */
-        @Nullable
-        public TypeBuilders.StringProp getResourceId() {
+        public TypeBuilders.@Nullable StringProp getResourceId() {
             if (mImpl.hasResourceId()) {
                 return TypeBuilders.StringProp.fromProto(mImpl.getResourceId());
             } else {
@@ -1512,8 +1422,7 @@
          * Gets the width of this image. If not defined, the image will not be rendered. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.ImageDimension getWidth() {
+        public DimensionBuilders.@Nullable ImageDimension getWidth() {
             if (mImpl.hasWidth()) {
                 return DimensionBuilders.imageDimensionFromProto(mImpl.getWidth());
             } else {
@@ -1525,8 +1434,7 @@
          * Gets the height of this image. If not defined, the image will not be rendered. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.ImageDimension getHeight() {
+        public DimensionBuilders.@Nullable ImageDimension getHeight() {
             if (mImpl.hasHeight()) {
                 return DimensionBuilders.imageDimensionFromProto(mImpl.getHeight());
             } else {
@@ -1539,8 +1447,7 @@
          * size does not match those bounds. Defaults to CONTENT_SCALE_MODE_FIT. Intended for
          * testing purposes only.
          */
-        @Nullable
-        public ContentScaleModeProp getContentScaleMode() {
+        public @Nullable ContentScaleModeProp getContentScaleMode() {
             if (mImpl.hasContentScaleMode()) {
                 return ContentScaleModeProp.fromProto(mImpl.getContentScaleMode());
             } else {
@@ -1552,8 +1459,7 @@
          * Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public ModifiersBuilders.Modifiers getModifiers() {
+        public ModifiersBuilders.@Nullable Modifiers getModifiers() {
             if (mImpl.hasModifiers()) {
                 return ModifiersBuilders.Modifiers.fromProto(mImpl.getModifiers());
             } else {
@@ -1562,8 +1468,7 @@
         }
 
         /** Gets filtering parameters for this image. If not specified, defaults to no filtering. */
-        @Nullable
-        public ColorFilter getColorFilter() {
+        public @Nullable ColorFilter getColorFilter() {
             if (mImpl.hasColorFilter()) {
                 return ColorFilter.fromProto(mImpl.getColorFilter());
             } else {
@@ -1573,26 +1478,22 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static Image fromProto(
-                @NonNull LayoutElementProto.Image proto, @Nullable Fingerprint fingerprint) {
+        static @NonNull Image fromProto(
+                LayoutElementProto.@NonNull Image proto, @Nullable Fingerprint fingerprint) {
             return new Image(proto, fingerprint);
         }
 
-        @NonNull
-        LayoutElementProto.Image toProto() {
+        LayoutElementProto.@NonNull Image toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public LayoutElementProto.LayoutElement toLayoutElementProto() {
+        public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
             return LayoutElementProto.LayoutElement.newBuilder().setImage(mImpl).build();
         }
 
@@ -1608,8 +1509,7 @@
              * Sets the resource_id of the image to render. This must exist in the supplied resource
              * bundle.
              */
-            @NonNull
-            public Builder setResourceId(@NonNull TypeBuilders.StringProp resourceId) {
+            public @NonNull Builder setResourceId(TypeBuilders.@NonNull StringProp resourceId) {
                 mImpl.setResourceId(resourceId.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(resourceId.getFingerprint()).aggregateValueAsInt());
@@ -1620,16 +1520,14 @@
              * Sets the resource_id of the image to render. This must exist in the supplied resource
              * bundle.
              */
-            @NonNull
-            public Builder setResourceId(@NonNull String resourceId) {
+            public @NonNull Builder setResourceId(@NonNull String resourceId) {
                 mImpl.setResourceId(TypesProto.StringProp.newBuilder().setValue(resourceId));
                 mFingerprint.recordPropertyUpdate(1, resourceId.hashCode());
                 return this;
             }
 
             /** Sets the width of this image. If not defined, the image will not be rendered. */
-            @NonNull
-            public Builder setWidth(@NonNull DimensionBuilders.ImageDimension width) {
+            public @NonNull Builder setWidth(DimensionBuilders.@NonNull ImageDimension width) {
                 mImpl.setWidth(width.toImageDimensionProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(width.getFingerprint()).aggregateValueAsInt());
@@ -1637,8 +1535,7 @@
             }
 
             /** Sets the height of this image. If not defined, the image will not be rendered. */
-            @NonNull
-            public Builder setHeight(@NonNull DimensionBuilders.ImageDimension height) {
+            public @NonNull Builder setHeight(DimensionBuilders.@NonNull ImageDimension height) {
                 mImpl.setHeight(height.toImageDimensionProto());
                 mFingerprint.recordPropertyUpdate(
                         3, checkNotNull(height.getFingerprint()).aggregateValueAsInt());
@@ -1649,8 +1546,8 @@
              * Sets how to scale the image resource inside the bounds specified by width/height if
              * its size does not match those bounds. Defaults to CONTENT_SCALE_MODE_FIT.
              */
-            @NonNull
-            public Builder setContentScaleMode(@NonNull ContentScaleModeProp contentScaleMode) {
+            public @NonNull Builder setContentScaleMode(
+                    @NonNull ContentScaleModeProp contentScaleMode) {
                 mImpl.setContentScaleMode(contentScaleMode.toProto());
                 mFingerprint.recordPropertyUpdate(
                         4, checkNotNull(contentScaleMode.getFingerprint()).aggregateValueAsInt());
@@ -1661,8 +1558,7 @@
              * Sets how to scale the image resource inside the bounds specified by width/height if
              * its size does not match those bounds. Defaults to CONTENT_SCALE_MODE_FIT.
              */
-            @NonNull
-            public Builder setContentScaleMode(@ContentScaleMode int contentScaleMode) {
+            public @NonNull Builder setContentScaleMode(@ContentScaleMode int contentScaleMode) {
                 mImpl.setContentScaleMode(
                         LayoutElementProto.ContentScaleModeProp.newBuilder()
                                 .setValue(
@@ -1673,8 +1569,7 @@
             }
 
             /** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
-            @NonNull
-            public Builder setModifiers(@NonNull ModifiersBuilders.Modifiers modifiers) {
+            public @NonNull Builder setModifiers(ModifiersBuilders.@NonNull Modifiers modifiers) {
                 mImpl.setModifiers(modifiers.toProto());
                 mFingerprint.recordPropertyUpdate(
                         5, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -1684,8 +1579,7 @@
             /**
              * Sets filtering parameters for this image. If not specified, defaults to no filtering.
              */
-            @NonNull
-            public Builder setColorFilter(@NonNull ColorFilter colorFilter) {
+            public @NonNull Builder setColorFilter(@NonNull ColorFilter colorFilter) {
                 mImpl.setColorFilter(colorFilter.toProto());
                 mFingerprint.recordPropertyUpdate(
                         6, checkNotNull(colorFilter.getFingerprint()).aggregateValueAsInt());
@@ -1693,8 +1587,7 @@
             }
 
             @Override
-            @NonNull
-            public Image build() {
+            public @NonNull Image build() {
                 return new Image(mImpl.build(), mFingerprint);
             }
         }
@@ -1703,7 +1596,7 @@
     /** A simple spacer, typically used to provide padding between adjacent elements. */
     public static final class Spacer implements LayoutElement {
         private final LayoutElementProto.Spacer mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         Spacer(LayoutElementProto.Spacer impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -1715,8 +1608,7 @@
          * {@link Arc}, this must be specified as an angular dimension, otherwise a linear dimension
          * must be used. If not defined, defaults to 0. Intended for testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.SpacerDimension getWidth() {
+        public DimensionBuilders.@Nullable SpacerDimension getWidth() {
             if (mImpl.hasWidth()) {
                 return DimensionBuilders.spacerDimensionFromProto(mImpl.getWidth());
             } else {
@@ -1728,8 +1620,7 @@
          * Gets the height of this spacer. If not defined, defaults to 0. Intended for testing
          * purposes only.
          */
-        @Nullable
-        public DimensionBuilders.SpacerDimension getHeight() {
+        public DimensionBuilders.@Nullable SpacerDimension getHeight() {
             if (mImpl.hasHeight()) {
                 return DimensionBuilders.spacerDimensionFromProto(mImpl.getHeight());
             } else {
@@ -1741,8 +1632,7 @@
          * Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public ModifiersBuilders.Modifiers getModifiers() {
+        public ModifiersBuilders.@Nullable Modifiers getModifiers() {
             if (mImpl.hasModifiers()) {
                 return ModifiersBuilders.Modifiers.fromProto(mImpl.getModifiers());
             } else {
@@ -1752,26 +1642,22 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static Spacer fromProto(
-                @NonNull LayoutElementProto.Spacer proto, @Nullable Fingerprint fingerprint) {
+        static @NonNull Spacer fromProto(
+                LayoutElementProto.@NonNull Spacer proto, @Nullable Fingerprint fingerprint) {
             return new Spacer(proto, fingerprint);
         }
 
-        @NonNull
-        LayoutElementProto.Spacer toProto() {
+        LayoutElementProto.@NonNull Spacer toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public LayoutElementProto.LayoutElement toLayoutElementProto() {
+        public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
             return LayoutElementProto.LayoutElement.newBuilder().setSpacer(mImpl).build();
         }
 
@@ -1788,8 +1674,7 @@
              * {@link Arc}, this must be specified as an angular dimension, otherwise a linear
              * dimension must be used. If not defined, defaults to 0.
              */
-            @NonNull
-            public Builder setWidth(@NonNull DimensionBuilders.SpacerDimension width) {
+            public @NonNull Builder setWidth(DimensionBuilders.@NonNull SpacerDimension width) {
                 mImpl.setWidth(width.toSpacerDimensionProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(width.getFingerprint()).aggregateValueAsInt());
@@ -1797,8 +1682,7 @@
             }
 
             /** Sets the height of this spacer. If not defined, defaults to 0. */
-            @NonNull
-            public Builder setHeight(@NonNull DimensionBuilders.SpacerDimension height) {
+            public @NonNull Builder setHeight(DimensionBuilders.@NonNull SpacerDimension height) {
                 mImpl.setHeight(height.toSpacerDimensionProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(height.getFingerprint()).aggregateValueAsInt());
@@ -1806,8 +1690,7 @@
             }
 
             /** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
-            @NonNull
-            public Builder setModifiers(@NonNull ModifiersBuilders.Modifiers modifiers) {
+            public @NonNull Builder setModifiers(ModifiersBuilders.@NonNull Modifiers modifiers) {
                 mImpl.setModifiers(modifiers.toProto());
                 mFingerprint.recordPropertyUpdate(
                         3, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -1815,8 +1698,7 @@
             }
 
             @Override
-            @NonNull
-            public Spacer build() {
+            public @NonNull Spacer build() {
                 return new Spacer(mImpl.build(), mFingerprint);
             }
         }
@@ -1828,7 +1710,7 @@
      */
     public static final class Box implements LayoutElement {
         private final LayoutElementProto.Box mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         Box(LayoutElementProto.Box impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -1836,8 +1718,7 @@
         }
 
         /** Gets the child element(s) to wrap. Intended for testing purposes only. */
-        @NonNull
-        public List<LayoutElement> getContents() {
+        public @NonNull List<LayoutElement> getContents() {
             return Collections.unmodifiableList(
                     mImpl.getContentsList().stream()
                             .map(LayoutElementBuilders::layoutElementFromProto)
@@ -1848,8 +1729,7 @@
          * Gets the height of this {@link Box}. If not defined, this will size itself to fit all of
          * its children (i.e. a WrappedDimension). Intended for testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.ContainerDimension getHeight() {
+        public DimensionBuilders.@Nullable ContainerDimension getHeight() {
             if (mImpl.hasHeight()) {
                 return DimensionBuilders.containerDimensionFromProto(mImpl.getHeight());
             } else {
@@ -1861,8 +1741,7 @@
          * Gets the width of this {@link Box}. If not defined, this will size itself to fit all of
          * its children (i.e. a WrappedDimension). Intended for testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.ContainerDimension getWidth() {
+        public DimensionBuilders.@Nullable ContainerDimension getWidth() {
             if (mImpl.hasWidth()) {
                 return DimensionBuilders.containerDimensionFromProto(mImpl.getWidth());
             } else {
@@ -1874,8 +1753,7 @@
          * Gets the horizontal alignment of the element inside this {@link Box}. If not defined,
          * defaults to HORIZONTAL_ALIGN_CENTER. Intended for testing purposes only.
          */
-        @Nullable
-        public HorizontalAlignmentProp getHorizontalAlignment() {
+        public @Nullable HorizontalAlignmentProp getHorizontalAlignment() {
             if (mImpl.hasHorizontalAlignment()) {
                 return HorizontalAlignmentProp.fromProto(mImpl.getHorizontalAlignment());
             } else {
@@ -1887,8 +1765,7 @@
          * Gets the vertical alignment of the element inside this {@link Box}. If not defined,
          * defaults to VERTICAL_ALIGN_CENTER. Intended for testing purposes only.
          */
-        @Nullable
-        public VerticalAlignmentProp getVerticalAlignment() {
+        public @Nullable VerticalAlignmentProp getVerticalAlignment() {
             if (mImpl.hasVerticalAlignment()) {
                 return VerticalAlignmentProp.fromProto(mImpl.getVerticalAlignment());
             } else {
@@ -1900,8 +1777,7 @@
          * Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public ModifiersBuilders.Modifiers getModifiers() {
+        public ModifiersBuilders.@Nullable Modifiers getModifiers() {
             if (mImpl.hasModifiers()) {
                 return ModifiersBuilders.Modifiers.fromProto(mImpl.getModifiers());
             } else {
@@ -1911,26 +1787,22 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static Box fromProto(
-                @NonNull LayoutElementProto.Box proto, @Nullable Fingerprint fingerprint) {
+        static @NonNull Box fromProto(
+                LayoutElementProto.@NonNull Box proto, @Nullable Fingerprint fingerprint) {
             return new Box(proto, fingerprint);
         }
 
-        @NonNull
-        LayoutElementProto.Box toProto() {
+        LayoutElementProto.@NonNull Box toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public LayoutElementProto.LayoutElement toLayoutElementProto() {
+        public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
             return LayoutElementProto.LayoutElement.newBuilder().setBox(mImpl).build();
         }
 
@@ -1943,8 +1815,7 @@
             public Builder() {}
 
             /** Adds one item to the child element(s) to wrap. */
-            @NonNull
-            public Builder addContent(@NonNull LayoutElement content) {
+            public @NonNull Builder addContent(@NonNull LayoutElement content) {
                 mImpl.addContents(content.toLayoutElementProto());
                 mFingerprint.addChildNode(checkNotNull(content.getFingerprint()));
                 return this;
@@ -1954,8 +1825,8 @@
              * Sets the height of this {@link Box}. If not defined, this will size itself to fit all
              * of its children (i.e. a WrappedDimension).
              */
-            @NonNull
-            public Builder setHeight(@NonNull DimensionBuilders.ContainerDimension height) {
+            public @NonNull Builder setHeight(
+                    DimensionBuilders.@NonNull ContainerDimension height) {
                 mImpl.setHeight(height.toContainerDimensionProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(height.getFingerprint()).aggregateValueAsInt());
@@ -1966,8 +1837,7 @@
              * Sets the width of this {@link Box}. If not defined, this will size itself to fit all
              * of its children (i.e. a WrappedDimension).
              */
-            @NonNull
-            public Builder setWidth(@NonNull DimensionBuilders.ContainerDimension width) {
+            public @NonNull Builder setWidth(DimensionBuilders.@NonNull ContainerDimension width) {
                 mImpl.setWidth(width.toContainerDimensionProto());
                 mFingerprint.recordPropertyUpdate(
                         3, checkNotNull(width.getFingerprint()).aggregateValueAsInt());
@@ -1978,8 +1848,7 @@
              * Sets the horizontal alignment of the element inside this {@link Box}. If not defined,
              * defaults to HORIZONTAL_ALIGN_CENTER.
              */
-            @NonNull
-            public Builder setHorizontalAlignment(
+            public @NonNull Builder setHorizontalAlignment(
                     @NonNull HorizontalAlignmentProp horizontalAlignment) {
                 mImpl.setHorizontalAlignment(horizontalAlignment.toProto());
                 mFingerprint.recordPropertyUpdate(
@@ -1992,8 +1861,8 @@
              * Sets the horizontal alignment of the element inside this {@link Box}. If not defined,
              * defaults to HORIZONTAL_ALIGN_CENTER.
              */
-            @NonNull
-            public Builder setHorizontalAlignment(@HorizontalAlignment int horizontalAlignment) {
+            public @NonNull Builder setHorizontalAlignment(
+                    @HorizontalAlignment int horizontalAlignment) {
                 mImpl.setHorizontalAlignment(
                         AlignmentProto.HorizontalAlignmentProp.newBuilder()
                                 .setValue(
@@ -2007,8 +1876,8 @@
              * Sets the vertical alignment of the element inside this {@link Box}. If not defined,
              * defaults to VERTICAL_ALIGN_CENTER.
              */
-            @NonNull
-            public Builder setVerticalAlignment(@NonNull VerticalAlignmentProp verticalAlignment) {
+            public @NonNull Builder setVerticalAlignment(
+                    @NonNull VerticalAlignmentProp verticalAlignment) {
                 mImpl.setVerticalAlignment(verticalAlignment.toProto());
                 mFingerprint.recordPropertyUpdate(
                         5, checkNotNull(verticalAlignment.getFingerprint()).aggregateValueAsInt());
@@ -2019,8 +1888,7 @@
              * Sets the vertical alignment of the element inside this {@link Box}. If not defined,
              * defaults to VERTICAL_ALIGN_CENTER.
              */
-            @NonNull
-            public Builder setVerticalAlignment(@VerticalAlignment int verticalAlignment) {
+            public @NonNull Builder setVerticalAlignment(@VerticalAlignment int verticalAlignment) {
                 mImpl.setVerticalAlignment(
                         AlignmentProto.VerticalAlignmentProp.newBuilder()
                                 .setValue(
@@ -2031,8 +1899,7 @@
             }
 
             /** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
-            @NonNull
-            public Builder setModifiers(@NonNull ModifiersBuilders.Modifiers modifiers) {
+            public @NonNull Builder setModifiers(ModifiersBuilders.@NonNull Modifiers modifiers) {
                 mImpl.setModifiers(modifiers.toProto());
                 mFingerprint.recordPropertyUpdate(
                         6, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -2040,8 +1907,7 @@
             }
 
             @Override
-            @NonNull
-            public Box build() {
+            public @NonNull Box build() {
                 return new Box(mImpl.build(), mFingerprint);
             }
         }
@@ -2054,7 +1920,7 @@
      */
     public static final class SpanText implements Span {
         private final LayoutElementProto.SpanText mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         SpanText(LayoutElementProto.SpanText impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -2062,8 +1928,7 @@
         }
 
         /** Gets the text to render. Intended for testing purposes only. */
-        @Nullable
-        public TypeBuilders.StringProp getText() {
+        public TypeBuilders.@Nullable StringProp getText() {
             if (mImpl.hasText()) {
                 return TypeBuilders.StringProp.fromProto(mImpl.getText());
             } else {
@@ -2075,8 +1940,7 @@
          * Gets the style of font to use (size, bold etc). If not specified, defaults to the
          * platform's default body font. Intended for testing purposes only.
          */
-        @Nullable
-        public FontStyle getFontStyle() {
+        public @Nullable FontStyle getFontStyle() {
             if (mImpl.hasFontStyle()) {
                 return FontStyle.fromProto(mImpl.getFontStyle());
             } else {
@@ -2088,8 +1952,7 @@
          * Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public ModifiersBuilders.SpanModifiers getModifiers() {
+        public ModifiersBuilders.@Nullable SpanModifiers getModifiers() {
             if (mImpl.hasModifiers()) {
                 return ModifiersBuilders.SpanModifiers.fromProto(mImpl.getModifiers());
             } else {
@@ -2099,25 +1962,21 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static SpanText fromProto(@NonNull LayoutElementProto.SpanText proto) {
+        static @NonNull SpanText fromProto(LayoutElementProto.@NonNull SpanText proto) {
             return new SpanText(proto, null);
         }
 
-        @NonNull
-        LayoutElementProto.SpanText toProto() {
+        LayoutElementProto.@NonNull SpanText toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public LayoutElementProto.Span toSpanProto() {
+        public LayoutElementProto.@NonNull Span toSpanProto() {
             return LayoutElementProto.Span.newBuilder().setText(mImpl).build();
         }
 
@@ -2130,8 +1989,7 @@
             public Builder() {}
 
             /** Sets the text to render. */
-            @NonNull
-            public Builder setText(@NonNull TypeBuilders.StringProp text) {
+            public @NonNull Builder setText(TypeBuilders.@NonNull StringProp text) {
                 mImpl.setText(text.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(text.getFingerprint()).aggregateValueAsInt());
@@ -2139,8 +1997,7 @@
             }
 
             /** Sets the text to render. */
-            @NonNull
-            public Builder setText(@NonNull String text) {
+            public @NonNull Builder setText(@NonNull String text) {
                 mImpl.setText(TypesProto.StringProp.newBuilder().setValue(text));
                 mFingerprint.recordPropertyUpdate(1, text.hashCode());
                 return this;
@@ -2150,8 +2007,7 @@
              * Sets the style of font to use (size, bold etc). If not specified, defaults to the
              * platform's default body font.
              */
-            @NonNull
-            public Builder setFontStyle(@NonNull FontStyle fontStyle) {
+            public @NonNull Builder setFontStyle(@NonNull FontStyle fontStyle) {
                 mImpl.setFontStyle(fontStyle.toProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(fontStyle.getFingerprint()).aggregateValueAsInt());
@@ -2159,8 +2015,8 @@
             }
 
             /** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
-            @NonNull
-            public Builder setModifiers(@NonNull ModifiersBuilders.SpanModifiers modifiers) {
+            public @NonNull Builder setModifiers(
+                    ModifiersBuilders.@NonNull SpanModifiers modifiers) {
                 mImpl.setModifiers(modifiers.toProto());
                 mFingerprint.recordPropertyUpdate(
                         3, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -2168,8 +2024,7 @@
             }
 
             @Override
-            @NonNull
-            public SpanText build() {
+            public @NonNull SpanText build() {
                 return new SpanText(mImpl.build(), mFingerprint);
             }
         }
@@ -2178,7 +2033,7 @@
     /** An image which can be added to a {@link Span}. */
     public static final class SpanImage implements Span {
         private final LayoutElementProto.SpanImage mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         SpanImage(LayoutElementProto.SpanImage impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -2189,8 +2044,7 @@
          * Gets the resource_id of the image to render. This must exist in the supplied resource
          * bundle. Intended for testing purposes only.
          */
-        @Nullable
-        public TypeBuilders.StringProp getResourceId() {
+        public TypeBuilders.@Nullable StringProp getResourceId() {
             if (mImpl.hasResourceId()) {
                 return TypeBuilders.StringProp.fromProto(mImpl.getResourceId());
             } else {
@@ -2202,8 +2056,7 @@
          * Gets the width of this image. If not defined, the image will not be rendered. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.DpProp getWidth() {
+        public DimensionBuilders.@Nullable DpProp getWidth() {
             if (mImpl.hasWidth()) {
                 return DimensionBuilders.DpProp.fromProto(mImpl.getWidth());
             } else {
@@ -2215,8 +2068,7 @@
          * Gets the height of this image. If not defined, the image will not be rendered. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.DpProp getHeight() {
+        public DimensionBuilders.@Nullable DpProp getHeight() {
             if (mImpl.hasHeight()) {
                 return DimensionBuilders.DpProp.fromProto(mImpl.getHeight());
             } else {
@@ -2228,8 +2080,7 @@
          * Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public ModifiersBuilders.SpanModifiers getModifiers() {
+        public ModifiersBuilders.@Nullable SpanModifiers getModifiers() {
             if (mImpl.hasModifiers()) {
                 return ModifiersBuilders.SpanModifiers.fromProto(mImpl.getModifiers());
             } else {
@@ -2241,8 +2092,7 @@
          * Gets alignment of this image within the line height of the surrounding {@link Spannable}.
          * If undefined, defaults to SPAN_VERTICAL_ALIGN_BOTTOM. Intended for testing purposes only.
          */
-        @Nullable
-        public SpanVerticalAlignmentProp getAlignment() {
+        public @Nullable SpanVerticalAlignmentProp getAlignment() {
             if (mImpl.hasAlignment()) {
                 return SpanVerticalAlignmentProp.fromProto(mImpl.getAlignment());
             } else {
@@ -2252,25 +2102,21 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static SpanImage fromProto(@NonNull LayoutElementProto.SpanImage proto) {
+        static @NonNull SpanImage fromProto(LayoutElementProto.@NonNull SpanImage proto) {
             return new SpanImage(proto, null);
         }
 
-        @NonNull
-        LayoutElementProto.SpanImage toProto() {
+        LayoutElementProto.@NonNull SpanImage toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public LayoutElementProto.Span toSpanProto() {
+        public LayoutElementProto.@NonNull Span toSpanProto() {
             return LayoutElementProto.Span.newBuilder().setImage(mImpl).build();
         }
 
@@ -2286,8 +2132,7 @@
              * Sets the resource_id of the image to render. This must exist in the supplied resource
              * bundle.
              */
-            @NonNull
-            public Builder setResourceId(@NonNull TypeBuilders.StringProp resourceId) {
+            public @NonNull Builder setResourceId(TypeBuilders.@NonNull StringProp resourceId) {
                 mImpl.setResourceId(resourceId.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(resourceId.getFingerprint()).aggregateValueAsInt());
@@ -2298,16 +2143,14 @@
              * Sets the resource_id of the image to render. This must exist in the supplied resource
              * bundle.
              */
-            @NonNull
-            public Builder setResourceId(@NonNull String resourceId) {
+            public @NonNull Builder setResourceId(@NonNull String resourceId) {
                 mImpl.setResourceId(TypesProto.StringProp.newBuilder().setValue(resourceId));
                 mFingerprint.recordPropertyUpdate(1, resourceId.hashCode());
                 return this;
             }
 
             /** Sets the width of this image. If not defined, the image will not be rendered. */
-            @NonNull
-            public Builder setWidth(@NonNull DimensionBuilders.DpProp width) {
+            public @NonNull Builder setWidth(DimensionBuilders.@NonNull DpProp width) {
                 mImpl.setWidth(width.toProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(width.getFingerprint()).aggregateValueAsInt());
@@ -2315,8 +2158,7 @@
             }
 
             /** Sets the height of this image. If not defined, the image will not be rendered. */
-            @NonNull
-            public Builder setHeight(@NonNull DimensionBuilders.DpProp height) {
+            public @NonNull Builder setHeight(DimensionBuilders.@NonNull DpProp height) {
                 mImpl.setHeight(height.toProto());
                 mFingerprint.recordPropertyUpdate(
                         3, checkNotNull(height.getFingerprint()).aggregateValueAsInt());
@@ -2324,8 +2166,8 @@
             }
 
             /** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
-            @NonNull
-            public Builder setModifiers(@NonNull ModifiersBuilders.SpanModifiers modifiers) {
+            public @NonNull Builder setModifiers(
+                    ModifiersBuilders.@NonNull SpanModifiers modifiers) {
                 mImpl.setModifiers(modifiers.toProto());
                 mFingerprint.recordPropertyUpdate(
                         4, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -2336,8 +2178,7 @@
              * Sets alignment of this image within the line height of the surrounding {@link
              * Spannable}. If undefined, defaults to SPAN_VERTICAL_ALIGN_BOTTOM.
              */
-            @NonNull
-            public Builder setAlignment(@NonNull SpanVerticalAlignmentProp alignment) {
+            public @NonNull Builder setAlignment(@NonNull SpanVerticalAlignmentProp alignment) {
                 mImpl.setAlignment(alignment.toProto());
                 mFingerprint.recordPropertyUpdate(
                         5, checkNotNull(alignment.getFingerprint()).aggregateValueAsInt());
@@ -2348,8 +2189,7 @@
              * Sets alignment of this image within the line height of the surrounding {@link
              * Spannable}. If undefined, defaults to SPAN_VERTICAL_ALIGN_BOTTOM.
              */
-            @NonNull
-            public Builder setAlignment(@SpanVerticalAlignment int alignment) {
+            public @NonNull Builder setAlignment(@SpanVerticalAlignment int alignment) {
                 mImpl.setAlignment(
                         LayoutElementProto.SpanVerticalAlignmentProp.newBuilder()
                                 .setValue(
@@ -2360,8 +2200,7 @@
             }
 
             @Override
-            @NonNull
-            public SpanImage build() {
+            public @NonNull SpanImage build() {
                 return new SpanImage(mImpl.build(), mFingerprint);
             }
         }
@@ -2375,29 +2214,25 @@
     public interface Span {
         /** Get the protocol buffer representation of this object. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        LayoutElementProto.Span toSpanProto();
+        LayoutElementProto.@NonNull Span toSpanProto();
 
         /** Get the fingerprint for this object or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        Fingerprint getFingerprint();
+        @Nullable Fingerprint getFingerprint();
 
         /** Builder to create {@link Span} objects. */
         @SuppressLint("StaticFinalBuilder")
         interface Builder {
 
             /** Builds an instance with values accumulated in this Builder. */
-            @NonNull
-            Span build();
+            @NonNull Span build();
         }
     }
 
     /**
      * Return an instance of one of this object's subtypes, from the protocol buffer representation.
      */
-    @NonNull
-    static Span spanFromProto(@NonNull LayoutElementProto.Span proto) {
+    static @NonNull Span spanFromProto(LayoutElementProto.@NonNull Span proto) {
         if (proto.hasText()) {
             return SpanText.fromProto(proto.getText());
         }
@@ -2415,7 +2250,7 @@
      */
     public static final class Spannable implements LayoutElement {
         private final LayoutElementProto.Spannable mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         Spannable(LayoutElementProto.Spannable impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -2426,8 +2261,7 @@
          * Gets the {@link Span} elements that form this {@link Spannable}. Intended for testing
          * purposes only.
          */
-        @NonNull
-        public List<Span> getSpans() {
+        public @NonNull List<Span> getSpans() {
             return Collections.unmodifiableList(
                     mImpl.getSpansList().stream()
                             .map(LayoutElementBuilders::spanFromProto)
@@ -2438,8 +2272,7 @@
          * Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public ModifiersBuilders.Modifiers getModifiers() {
+        public ModifiersBuilders.@Nullable Modifiers getModifiers() {
             if (mImpl.hasModifiers()) {
                 return ModifiersBuilders.Modifiers.fromProto(mImpl.getModifiers());
             } else {
@@ -2452,8 +2285,7 @@
          * element. If not defined, the {@link Spannable} element will be treated as a single-line
          * element. Intended for testing purposes only.
          */
-        @Nullable
-        public TypeBuilders.Int32Prop getMaxLines() {
+        public TypeBuilders.@Nullable Int32Prop getMaxLines() {
             if (mImpl.hasMaxLines()) {
                 return TypeBuilders.Int32Prop.fromProto(mImpl.getMaxLines());
             } else {
@@ -2469,8 +2301,7 @@
          * element bounds. If not defined, defaults to TEXT_ALIGN_CENTER. Intended for testing
          * purposes only.
          */
-        @Nullable
-        public HorizontalAlignmentProp getMultilineAlignment() {
+        public @Nullable HorizontalAlignmentProp getMultilineAlignment() {
             if (mImpl.hasMultilineAlignment()) {
                 return HorizontalAlignmentProp.fromProto(mImpl.getMultilineAlignment());
             } else {
@@ -2485,8 +2316,7 @@
          * content, the content which cannot fit inside its container will be truncated. If not
          * defined, defaults to TEXT_OVERFLOW_TRUNCATE. Intended for testing purposes only.
          */
-        @Nullable
-        public TextOverflowProp getOverflow() {
+        public @Nullable TextOverflowProp getOverflow() {
             if (mImpl.hasOverflow()) {
                 return TextOverflowProp.fromProto(mImpl.getOverflow());
             } else {
@@ -2499,8 +2329,7 @@
          * distance between subsequent baselines. If not specified, defaults the font's recommended
          * interline spacing. Intended for testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.SpProp getLineHeight() {
+        public DimensionBuilders.@Nullable SpProp getLineHeight() {
             if (mImpl.hasLineHeight()) {
                 return DimensionBuilders.SpProp.fromProto(mImpl.getLineHeight());
             } else {
@@ -2510,26 +2339,22 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static Spannable fromProto(
-                @NonNull LayoutElementProto.Spannable proto, @Nullable Fingerprint fingerprint) {
+        static @NonNull Spannable fromProto(
+                LayoutElementProto.@NonNull Spannable proto, @Nullable Fingerprint fingerprint) {
             return new Spannable(proto, fingerprint);
         }
 
-        @NonNull
-        LayoutElementProto.Spannable toProto() {
+        LayoutElementProto.@NonNull Spannable toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public LayoutElementProto.LayoutElement toLayoutElementProto() {
+        public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
             return LayoutElementProto.LayoutElement.newBuilder().setSpannable(mImpl).build();
         }
 
@@ -2542,8 +2367,7 @@
             public Builder() {}
 
             /** Adds one item to the {@link Span} elements that form this {@link Spannable}. */
-            @NonNull
-            public Builder addSpan(@NonNull Span span) {
+            public @NonNull Builder addSpan(@NonNull Span span) {
                 mImpl.addSpans(span.toSpanProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(span.getFingerprint()).aggregateValueAsInt());
@@ -2551,8 +2375,7 @@
             }
 
             /** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
-            @NonNull
-            public Builder setModifiers(@NonNull ModifiersBuilders.Modifiers modifiers) {
+            public @NonNull Builder setModifiers(ModifiersBuilders.@NonNull Modifiers modifiers) {
                 mImpl.setModifiers(modifiers.toProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -2564,8 +2387,7 @@
              * element. If not defined, the {@link Spannable} element will be treated as a
              * single-line element.
              */
-            @NonNull
-            public Builder setMaxLines(@NonNull TypeBuilders.Int32Prop maxLines) {
+            public @NonNull Builder setMaxLines(TypeBuilders.@NonNull Int32Prop maxLines) {
                 mImpl.setMaxLines(maxLines.toProto());
                 mFingerprint.recordPropertyUpdate(
                         3, checkNotNull(maxLines.getFingerprint()).aggregateValueAsInt());
@@ -2577,8 +2399,7 @@
              * element. If not defined, the {@link Spannable} element will be treated as a
              * single-line element.
              */
-            @NonNull
-            public Builder setMaxLines(@IntRange(from = 1) int maxLines) {
+            public @NonNull Builder setMaxLines(@IntRange(from = 1) int maxLines) {
                 mImpl.setMaxLines(TypesProto.Int32Prop.newBuilder().setValue(maxLines));
                 mFingerprint.recordPropertyUpdate(3, maxLines);
                 return this;
@@ -2591,8 +2412,7 @@
              * For multi-line content, however, this will set the alignment of lines relative to the
              * {@link Spannable} element bounds. If not defined, defaults to TEXT_ALIGN_CENTER.
              */
-            @NonNull
-            public Builder setMultilineAlignment(
+            public @NonNull Builder setMultilineAlignment(
                     @NonNull HorizontalAlignmentProp multilineAlignment) {
                 mImpl.setMultilineAlignment(multilineAlignment.toProto());
                 mFingerprint.recordPropertyUpdate(
@@ -2607,8 +2427,8 @@
              * For multi-line content, however, this will set the alignment of lines relative to the
              * {@link Spannable} element bounds. If not defined, defaults to TEXT_ALIGN_CENTER.
              */
-            @NonNull
-            public Builder setMultilineAlignment(@HorizontalAlignment int multilineAlignment) {
+            public @NonNull Builder setMultilineAlignment(
+                    @HorizontalAlignment int multilineAlignment) {
                 mImpl.setMultilineAlignment(
                         AlignmentProto.HorizontalAlignmentProp.newBuilder()
                                 .setValue(
@@ -2625,8 +2445,7 @@
              * render all of its content, the content which cannot fit inside its container will be
              * truncated. If not defined, defaults to TEXT_OVERFLOW_TRUNCATE.
              */
-            @NonNull
-            public Builder setOverflow(@NonNull TextOverflowProp overflow) {
+            public @NonNull Builder setOverflow(@NonNull TextOverflowProp overflow) {
                 mImpl.setOverflow(overflow.toProto());
                 mFingerprint.recordPropertyUpdate(
                         5, checkNotNull(overflow.getFingerprint()).aggregateValueAsInt());
@@ -2640,8 +2459,7 @@
              * render all of its content, the content which cannot fit inside its container will be
              * truncated. If not defined, defaults to TEXT_OVERFLOW_TRUNCATE.
              */
-            @NonNull
-            public Builder setOverflow(@TextOverflow int overflow) {
+            public @NonNull Builder setOverflow(@TextOverflow int overflow) {
                 mImpl.setOverflow(
                         LayoutElementProto.TextOverflowProp.newBuilder()
                                 .setValue(LayoutElementProto.TextOverflow.forNumber(overflow)));
@@ -2654,8 +2472,7 @@
              * distance between subsequent baselines. If not specified, defaults the font's
              * recommended interline spacing.
              */
-            @NonNull
-            public Builder setLineHeight(@NonNull DimensionBuilders.SpProp lineHeight) {
+            public @NonNull Builder setLineHeight(DimensionBuilders.@NonNull SpProp lineHeight) {
                 mImpl.setLineHeight(lineHeight.toProto());
                 mFingerprint.recordPropertyUpdate(
                         7, checkNotNull(lineHeight.getFingerprint()).aggregateValueAsInt());
@@ -2663,8 +2480,7 @@
             }
 
             @Override
-            @NonNull
-            public Spannable build() {
+            public @NonNull Spannable build() {
                 return new Spannable(mImpl.build(), mFingerprint);
             }
         }
@@ -2682,7 +2498,7 @@
      */
     public static final class Column implements LayoutElement {
         private final LayoutElementProto.Column mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         Column(LayoutElementProto.Column impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -2693,8 +2509,7 @@
          * Gets the list of child elements to place inside this {@link Column}. Intended for testing
          * purposes only.
          */
-        @NonNull
-        public List<LayoutElement> getContents() {
+        public @NonNull List<LayoutElement> getContents() {
             return Collections.unmodifiableList(
                     mImpl.getContentsList().stream()
                             .map(LayoutElementBuilders::layoutElementFromProto)
@@ -2706,8 +2521,7 @@
          * the resulting width of the column. If not defined, defaults to HORIZONTAL_ALIGN_CENTER.
          * Intended for testing purposes only.
          */
-        @Nullable
-        public HorizontalAlignmentProp getHorizontalAlignment() {
+        public @Nullable HorizontalAlignmentProp getHorizontalAlignment() {
             if (mImpl.hasHorizontalAlignment()) {
                 return HorizontalAlignmentProp.fromProto(mImpl.getHorizontalAlignment());
             } else {
@@ -2719,8 +2533,7 @@
          * Gets the width of this column. If not defined, this will size itself to fit all of its
          * children (i.e. a WrappedDimension). Intended for testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.ContainerDimension getWidth() {
+        public DimensionBuilders.@Nullable ContainerDimension getWidth() {
             if (mImpl.hasWidth()) {
                 return DimensionBuilders.containerDimensionFromProto(mImpl.getWidth());
             } else {
@@ -2732,8 +2545,7 @@
          * Gets the height of this column. If not defined, this will size itself to fit all of its
          * children (i.e. a WrappedDimension). Intended for testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.ContainerDimension getHeight() {
+        public DimensionBuilders.@Nullable ContainerDimension getHeight() {
             if (mImpl.hasHeight()) {
                 return DimensionBuilders.containerDimensionFromProto(mImpl.getHeight());
             } else {
@@ -2745,8 +2557,7 @@
          * Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public ModifiersBuilders.Modifiers getModifiers() {
+        public ModifiersBuilders.@Nullable Modifiers getModifiers() {
             if (mImpl.hasModifiers()) {
                 return ModifiersBuilders.Modifiers.fromProto(mImpl.getModifiers());
             } else {
@@ -2756,26 +2567,22 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static Column fromProto(
-                @NonNull LayoutElementProto.Column proto, @Nullable Fingerprint fingerprint) {
+        static @NonNull Column fromProto(
+                LayoutElementProto.@NonNull Column proto, @Nullable Fingerprint fingerprint) {
             return new Column(proto, fingerprint);
         }
 
-        @NonNull
-        LayoutElementProto.Column toProto() {
+        LayoutElementProto.@NonNull Column toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public LayoutElementProto.LayoutElement toLayoutElementProto() {
+        public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
             return LayoutElementProto.LayoutElement.newBuilder().setColumn(mImpl).build();
         }
 
@@ -2788,8 +2595,7 @@
             public Builder() {}
 
             /** Adds one item to the list of child elements to place inside this {@link Column}. */
-            @NonNull
-            public Builder addContent(@NonNull LayoutElement content) {
+            public @NonNull Builder addContent(@NonNull LayoutElement content) {
                 mImpl.addContents(content.toLayoutElementProto());
                 mFingerprint.addChildNode(checkNotNull(content.getFingerprint()));
                 return this;
@@ -2800,8 +2606,7 @@
              * than the resulting width of the column. If not defined, defaults to
              * HORIZONTAL_ALIGN_CENTER.
              */
-            @NonNull
-            public Builder setHorizontalAlignment(
+            public @NonNull Builder setHorizontalAlignment(
                     @NonNull HorizontalAlignmentProp horizontalAlignment) {
                 mImpl.setHorizontalAlignment(horizontalAlignment.toProto());
                 mFingerprint.recordPropertyUpdate(
@@ -2815,8 +2620,8 @@
              * than the resulting width of the column. If not defined, defaults to
              * HORIZONTAL_ALIGN_CENTER.
              */
-            @NonNull
-            public Builder setHorizontalAlignment(@HorizontalAlignment int horizontalAlignment) {
+            public @NonNull Builder setHorizontalAlignment(
+                    @HorizontalAlignment int horizontalAlignment) {
                 mImpl.setHorizontalAlignment(
                         AlignmentProto.HorizontalAlignmentProp.newBuilder()
                                 .setValue(
@@ -2830,8 +2635,7 @@
              * Sets the width of this column. If not defined, this will size itself to fit all of
              * its children (i.e. a WrappedDimension).
              */
-            @NonNull
-            public Builder setWidth(@NonNull DimensionBuilders.ContainerDimension width) {
+            public @NonNull Builder setWidth(DimensionBuilders.@NonNull ContainerDimension width) {
                 mImpl.setWidth(width.toContainerDimensionProto());
                 mFingerprint.recordPropertyUpdate(
                         3, checkNotNull(width.getFingerprint()).aggregateValueAsInt());
@@ -2842,8 +2646,8 @@
              * Sets the height of this column. If not defined, this will size itself to fit all of
              * its children (i.e. a WrappedDimension).
              */
-            @NonNull
-            public Builder setHeight(@NonNull DimensionBuilders.ContainerDimension height) {
+            public @NonNull Builder setHeight(
+                    DimensionBuilders.@NonNull ContainerDimension height) {
                 mImpl.setHeight(height.toContainerDimensionProto());
                 mFingerprint.recordPropertyUpdate(
                         4, checkNotNull(height.getFingerprint()).aggregateValueAsInt());
@@ -2851,8 +2655,7 @@
             }
 
             /** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
-            @NonNull
-            public Builder setModifiers(@NonNull ModifiersBuilders.Modifiers modifiers) {
+            public @NonNull Builder setModifiers(ModifiersBuilders.@NonNull Modifiers modifiers) {
                 mImpl.setModifiers(modifiers.toProto());
                 mFingerprint.recordPropertyUpdate(
                         5, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -2860,8 +2663,7 @@
             }
 
             @Override
-            @NonNull
-            public Column build() {
+            public @NonNull Column build() {
                 return new Column(mImpl.build(), mFingerprint);
             }
         }
@@ -2879,7 +2681,7 @@
      */
     public static final class Row implements LayoutElement {
         private final LayoutElementProto.Row mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         Row(LayoutElementProto.Row impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -2890,8 +2692,7 @@
          * Gets the list of child elements to place inside this {@link Row}. Intended for testing
          * purposes only.
          */
-        @NonNull
-        public List<LayoutElement> getContents() {
+        public @NonNull List<LayoutElement> getContents() {
             return Collections.unmodifiableList(
                     mImpl.getContentsList().stream()
                             .map(LayoutElementBuilders::layoutElementFromProto)
@@ -2903,8 +2704,7 @@
          * resulting height of the row. If not defined, defaults to VERTICAL_ALIGN_CENTER. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public VerticalAlignmentProp getVerticalAlignment() {
+        public @Nullable VerticalAlignmentProp getVerticalAlignment() {
             if (mImpl.hasVerticalAlignment()) {
                 return VerticalAlignmentProp.fromProto(mImpl.getVerticalAlignment());
             } else {
@@ -2916,8 +2716,7 @@
          * Gets the width of this row. If not defined, this will size itself to fit all of its
          * children (i.e. a WrappedDimension). Intended for testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.ContainerDimension getWidth() {
+        public DimensionBuilders.@Nullable ContainerDimension getWidth() {
             if (mImpl.hasWidth()) {
                 return DimensionBuilders.containerDimensionFromProto(mImpl.getWidth());
             } else {
@@ -2929,8 +2728,7 @@
          * Gets the height of this row. If not defined, this will size itself to fit all of its
          * children (i.e. a WrappedDimension). Intended for testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.ContainerDimension getHeight() {
+        public DimensionBuilders.@Nullable ContainerDimension getHeight() {
             if (mImpl.hasHeight()) {
                 return DimensionBuilders.containerDimensionFromProto(mImpl.getHeight());
             } else {
@@ -2942,8 +2740,7 @@
          * Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public ModifiersBuilders.Modifiers getModifiers() {
+        public ModifiersBuilders.@Nullable Modifiers getModifiers() {
             if (mImpl.hasModifiers()) {
                 return ModifiersBuilders.Modifiers.fromProto(mImpl.getModifiers());
             } else {
@@ -2953,26 +2750,22 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static Row fromProto(
-                @NonNull LayoutElementProto.Row proto, @Nullable Fingerprint fingerprint) {
+        static @NonNull Row fromProto(
+                LayoutElementProto.@NonNull Row proto, @Nullable Fingerprint fingerprint) {
             return new Row(proto, fingerprint);
         }
 
-        @NonNull
-        LayoutElementProto.Row toProto() {
+        LayoutElementProto.@NonNull Row toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public LayoutElementProto.LayoutElement toLayoutElementProto() {
+        public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
             return LayoutElementProto.LayoutElement.newBuilder().setRow(mImpl).build();
         }
 
@@ -2985,8 +2778,7 @@
             public Builder() {}
 
             /** Adds one item to the list of child elements to place inside this {@link Row}. */
-            @NonNull
-            public Builder addContent(@NonNull LayoutElement content) {
+            public @NonNull Builder addContent(@NonNull LayoutElement content) {
                 mImpl.addContents(content.toLayoutElementProto());
                 mFingerprint.addChildNode(checkNotNull(content.getFingerprint()));
                 return this;
@@ -2996,8 +2788,8 @@
              * Sets the vertical alignment of elements inside this row, if they are narrower than
              * the resulting height of the row. If not defined, defaults to VERTICAL_ALIGN_CENTER.
              */
-            @NonNull
-            public Builder setVerticalAlignment(@NonNull VerticalAlignmentProp verticalAlignment) {
+            public @NonNull Builder setVerticalAlignment(
+                    @NonNull VerticalAlignmentProp verticalAlignment) {
                 mImpl.setVerticalAlignment(verticalAlignment.toProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(verticalAlignment.getFingerprint()).aggregateValueAsInt());
@@ -3008,8 +2800,7 @@
              * Sets the vertical alignment of elements inside this row, if they are narrower than
              * the resulting height of the row. If not defined, defaults to VERTICAL_ALIGN_CENTER.
              */
-            @NonNull
-            public Builder setVerticalAlignment(@VerticalAlignment int verticalAlignment) {
+            public @NonNull Builder setVerticalAlignment(@VerticalAlignment int verticalAlignment) {
                 mImpl.setVerticalAlignment(
                         AlignmentProto.VerticalAlignmentProp.newBuilder()
                                 .setValue(
@@ -3023,8 +2814,7 @@
              * Sets the width of this row. If not defined, this will size itself to fit all of its
              * children (i.e. a WrappedDimension).
              */
-            @NonNull
-            public Builder setWidth(@NonNull DimensionBuilders.ContainerDimension width) {
+            public @NonNull Builder setWidth(DimensionBuilders.@NonNull ContainerDimension width) {
                 mImpl.setWidth(width.toContainerDimensionProto());
                 mFingerprint.recordPropertyUpdate(
                         3, checkNotNull(width.getFingerprint()).aggregateValueAsInt());
@@ -3035,8 +2825,8 @@
              * Sets the height of this row. If not defined, this will size itself to fit all of its
              * children (i.e. a WrappedDimension).
              */
-            @NonNull
-            public Builder setHeight(@NonNull DimensionBuilders.ContainerDimension height) {
+            public @NonNull Builder setHeight(
+                    DimensionBuilders.@NonNull ContainerDimension height) {
                 mImpl.setHeight(height.toContainerDimensionProto());
                 mFingerprint.recordPropertyUpdate(
                         4, checkNotNull(height.getFingerprint()).aggregateValueAsInt());
@@ -3044,8 +2834,7 @@
             }
 
             /** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
-            @NonNull
-            public Builder setModifiers(@NonNull ModifiersBuilders.Modifiers modifiers) {
+            public @NonNull Builder setModifiers(ModifiersBuilders.@NonNull Modifiers modifiers) {
                 mImpl.setModifiers(modifiers.toProto());
                 mFingerprint.recordPropertyUpdate(
                         5, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -3053,8 +2842,7 @@
             }
 
             @Override
-            @NonNull
-            public Row build() {
+            public @NonNull Row build() {
                 return new Row(mImpl.build(), mFingerprint);
             }
         }
@@ -3067,7 +2855,7 @@
      */
     public static final class Arc implements LayoutElement {
         private final LayoutElementProto.Arc mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         Arc(LayoutElementProto.Arc impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -3075,8 +2863,7 @@
         }
 
         /** Gets contents of this container. Intended for testing purposes only. */
-        @NonNull
-        public List<ArcLayoutElement> getContents() {
+        public @NonNull List<ArcLayoutElement> getContents() {
             return Collections.unmodifiableList(
                     mImpl.getContentsList().stream()
                             .map(LayoutElementBuilders::arcLayoutElementFromProto)
@@ -3092,8 +2879,7 @@
          * sweep anti-clockwise (i.e. -90 degrees is equivalent to 270 degrees), and values >360
          * will be be placed at X mod 360 degrees. Intended for testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.DegreesProp getAnchorAngle() {
+        public DimensionBuilders.@Nullable DegreesProp getAnchorAngle() {
             if (mImpl.hasAnchorAngle()) {
                 return DimensionBuilders.DegreesProp.fromProto(mImpl.getAnchorAngle());
             } else {
@@ -3105,8 +2891,7 @@
          * Gets how to align the contents of this container relative to anchor_angle. If not
          * defined, defaults to ARC_ANCHOR_CENTER. Intended for testing purposes only.
          */
-        @Nullable
-        public ArcAnchorTypeProp getAnchorType() {
+        public @Nullable ArcAnchorTypeProp getAnchorType() {
             if (mImpl.hasAnchorType()) {
                 return ArcAnchorTypeProp.fromProto(mImpl.getAnchorType());
             } else {
@@ -3120,8 +2905,7 @@
          * should be drawn towards the inner or outer edge of the arc, or drawn in the center. If
          * not defined, defaults to VERTICAL_ALIGN_CENTER. Intended for testing purposes only.
          */
-        @Nullable
-        public VerticalAlignmentProp getVerticalAlign() {
+        public @Nullable VerticalAlignmentProp getVerticalAlign() {
             if (mImpl.hasVerticalAlign()) {
                 return VerticalAlignmentProp.fromProto(mImpl.getVerticalAlign());
             } else {
@@ -3133,8 +2917,7 @@
          * Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public ModifiersBuilders.Modifiers getModifiers() {
+        public ModifiersBuilders.@Nullable Modifiers getModifiers() {
             if (mImpl.hasModifiers()) {
                 return ModifiersBuilders.Modifiers.fromProto(mImpl.getModifiers());
             } else {
@@ -3144,26 +2927,22 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static Arc fromProto(
-                @NonNull LayoutElementProto.Arc proto, @Nullable Fingerprint fingerprint) {
+        static @NonNull Arc fromProto(
+                LayoutElementProto.@NonNull Arc proto, @Nullable Fingerprint fingerprint) {
             return new Arc(proto, fingerprint);
         }
 
-        @NonNull
-        LayoutElementProto.Arc toProto() {
+        LayoutElementProto.@NonNull Arc toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public LayoutElementProto.LayoutElement toLayoutElementProto() {
+        public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
             return LayoutElementProto.LayoutElement.newBuilder().setArc(mImpl).build();
         }
 
@@ -3176,8 +2955,7 @@
             public Builder() {}
 
             /** Adds one item to contents of this container. */
-            @NonNull
-            public Builder addContent(@NonNull ArcLayoutElement content) {
+            public @NonNull Builder addContent(@NonNull ArcLayoutElement content) {
                 mImpl.addContents(content.toArcLayoutElementProto());
                 mFingerprint.addChildNode(checkNotNull(content.getFingerprint()));
                 return this;
@@ -3192,8 +2970,8 @@
              * will sweep anti-clockwise (i.e. -90 degrees is equivalent to 270 degrees), and values
              * >360 will be be placed at X mod 360 degrees.
              */
-            @NonNull
-            public Builder setAnchorAngle(@NonNull DimensionBuilders.DegreesProp anchorAngle) {
+            public @NonNull Builder setAnchorAngle(
+                    DimensionBuilders.@NonNull DegreesProp anchorAngle) {
                 mImpl.setAnchorAngle(anchorAngle.toProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(anchorAngle.getFingerprint()).aggregateValueAsInt());
@@ -3204,8 +2982,7 @@
              * Sets how to align the contents of this container relative to anchor_angle. If not
              * defined, defaults to ARC_ANCHOR_CENTER.
              */
-            @NonNull
-            public Builder setAnchorType(@NonNull ArcAnchorTypeProp anchorType) {
+            public @NonNull Builder setAnchorType(@NonNull ArcAnchorTypeProp anchorType) {
                 mImpl.setAnchorType(anchorType.toProto());
                 mFingerprint.recordPropertyUpdate(
                         3, checkNotNull(anchorType.getFingerprint()).aggregateValueAsInt());
@@ -3216,8 +2993,7 @@
              * Sets how to align the contents of this container relative to anchor_angle. If not
              * defined, defaults to ARC_ANCHOR_CENTER.
              */
-            @NonNull
-            public Builder setAnchorType(@ArcAnchorType int anchorType) {
+            public @NonNull Builder setAnchorType(@ArcAnchorType int anchorType) {
                 mImpl.setAnchorType(
                         AlignmentProto.ArcAnchorTypeProp.newBuilder()
                                 .setValue(AlignmentProto.ArcAnchorType.forNumber(anchorType)));
@@ -3231,8 +3007,7 @@
              * element should be drawn towards the inner or outer edge of the arc, or drawn in the
              * center. If not defined, defaults to VERTICAL_ALIGN_CENTER.
              */
-            @NonNull
-            public Builder setVerticalAlign(@NonNull VerticalAlignmentProp verticalAlign) {
+            public @NonNull Builder setVerticalAlign(@NonNull VerticalAlignmentProp verticalAlign) {
                 mImpl.setVerticalAlign(verticalAlign.toProto());
                 mFingerprint.recordPropertyUpdate(
                         4, checkNotNull(verticalAlign.getFingerprint()).aggregateValueAsInt());
@@ -3245,8 +3020,7 @@
              * element should be drawn towards the inner or outer edge of the arc, or drawn in the
              * center. If not defined, defaults to VERTICAL_ALIGN_CENTER.
              */
-            @NonNull
-            public Builder setVerticalAlign(@VerticalAlignment int verticalAlign) {
+            public @NonNull Builder setVerticalAlign(@VerticalAlignment int verticalAlign) {
                 mImpl.setVerticalAlign(
                         AlignmentProto.VerticalAlignmentProp.newBuilder()
                                 .setValue(
@@ -3256,8 +3030,7 @@
             }
 
             /** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
-            @NonNull
-            public Builder setModifiers(@NonNull ModifiersBuilders.Modifiers modifiers) {
+            public @NonNull Builder setModifiers(ModifiersBuilders.@NonNull Modifiers modifiers) {
                 mImpl.setModifiers(modifiers.toProto());
                 mFingerprint.recordPropertyUpdate(
                         5, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -3265,8 +3038,7 @@
             }
 
             @Override
-            @NonNull
-            public Arc build() {
+            public @NonNull Arc build() {
                 return new Arc(mImpl.build(), mFingerprint);
             }
         }
@@ -3275,7 +3047,7 @@
     /** A text element that can be used in an {@link Arc}. */
     public static final class ArcText implements ArcLayoutElement {
         private final LayoutElementProto.ArcText mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         ArcText(LayoutElementProto.ArcText impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -3283,8 +3055,7 @@
         }
 
         /** Gets the text to render. Intended for testing purposes only. */
-        @Nullable
-        public TypeBuilders.StringProp getText() {
+        public TypeBuilders.@Nullable StringProp getText() {
             if (mImpl.hasText()) {
                 return TypeBuilders.StringProp.fromProto(mImpl.getText());
             } else {
@@ -3296,8 +3067,7 @@
          * Gets the style of font to use (size, bold etc). If not specified, defaults to the
          * platform's default body font. Intended for testing purposes only.
          */
-        @Nullable
-        public FontStyle getFontStyle() {
+        public @Nullable FontStyle getFontStyle() {
             if (mImpl.hasFontStyle()) {
                 return FontStyle.fromProto(mImpl.getFontStyle());
             } else {
@@ -3309,8 +3079,7 @@
          * Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public ModifiersBuilders.ArcModifiers getModifiers() {
+        public ModifiersBuilders.@Nullable ArcModifiers getModifiers() {
             if (mImpl.hasModifiers()) {
                 return ModifiersBuilders.ArcModifiers.fromProto(mImpl.getModifiers());
             } else {
@@ -3320,25 +3089,21 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static ArcText fromProto(@NonNull LayoutElementProto.ArcText proto) {
+        static @NonNull ArcText fromProto(LayoutElementProto.@NonNull ArcText proto) {
             return new ArcText(proto, null);
         }
 
-        @NonNull
-        LayoutElementProto.ArcText toProto() {
+        LayoutElementProto.@NonNull ArcText toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public LayoutElementProto.ArcLayoutElement toArcLayoutElementProto() {
+        public LayoutElementProto.@NonNull ArcLayoutElement toArcLayoutElementProto() {
             return LayoutElementProto.ArcLayoutElement.newBuilder().setText(mImpl).build();
         }
 
@@ -3351,8 +3116,7 @@
             public Builder() {}
 
             /** Sets the text to render. */
-            @NonNull
-            public Builder setText(@NonNull TypeBuilders.StringProp text) {
+            public @NonNull Builder setText(TypeBuilders.@NonNull StringProp text) {
                 mImpl.setText(text.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(text.getFingerprint()).aggregateValueAsInt());
@@ -3360,8 +3124,7 @@
             }
 
             /** Sets the text to render. */
-            @NonNull
-            public Builder setText(@NonNull String text) {
+            public @NonNull Builder setText(@NonNull String text) {
                 mImpl.setText(TypesProto.StringProp.newBuilder().setValue(text));
                 mFingerprint.recordPropertyUpdate(1, text.hashCode());
                 return this;
@@ -3371,8 +3134,7 @@
              * Sets the style of font to use (size, bold etc). If not specified, defaults to the
              * platform's default body font.
              */
-            @NonNull
-            public Builder setFontStyle(@NonNull FontStyle fontStyle) {
+            public @NonNull Builder setFontStyle(@NonNull FontStyle fontStyle) {
                 mImpl.setFontStyle(fontStyle.toProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(fontStyle.getFingerprint()).aggregateValueAsInt());
@@ -3380,8 +3142,8 @@
             }
 
             /** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
-            @NonNull
-            public Builder setModifiers(@NonNull ModifiersBuilders.ArcModifiers modifiers) {
+            public @NonNull Builder setModifiers(
+                    ModifiersBuilders.@NonNull ArcModifiers modifiers) {
                 mImpl.setModifiers(modifiers.toProto());
                 mFingerprint.recordPropertyUpdate(
                         3, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -3389,8 +3151,7 @@
             }
 
             @Override
-            @NonNull
-            public ArcText build() {
+            public @NonNull ArcText build() {
                 return new ArcText(mImpl.build(), mFingerprint);
             }
         }
@@ -3399,7 +3160,7 @@
     /** A line that can be used in an {@link Arc} and renders as a round progress bar. */
     public static final class ArcLine implements ArcLayoutElement {
         private final LayoutElementProto.ArcLine mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         ArcLine(LayoutElementProto.ArcLine impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -3410,8 +3171,7 @@
          * Gets the length of this line, in degrees. If not defined, defaults to 0. Intended for
          * testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.DegreesProp getLength() {
+        public DimensionBuilders.@Nullable DegreesProp getLength() {
             if (mImpl.hasLength()) {
                 return DimensionBuilders.DegreesProp.fromProto(mImpl.getLength());
             } else {
@@ -3423,8 +3183,7 @@
          * Gets the thickness of this line. If not defined, defaults to 0. Intended for testing
          * purposes only.
          */
-        @Nullable
-        public DimensionBuilders.DpProp getThickness() {
+        public DimensionBuilders.@Nullable DpProp getThickness() {
             if (mImpl.hasThickness()) {
                 return DimensionBuilders.DpProp.fromProto(mImpl.getThickness());
             } else {
@@ -3433,8 +3192,7 @@
         }
 
         /** Gets the color of this line. Intended for testing purposes only. */
-        @Nullable
-        public ColorBuilders.ColorProp getColor() {
+        public ColorBuilders.@Nullable ColorProp getColor() {
             if (mImpl.hasColor()) {
                 return ColorBuilders.ColorProp.fromProto(mImpl.getColor());
             } else {
@@ -3446,8 +3204,7 @@
          * Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public ModifiersBuilders.ArcModifiers getModifiers() {
+        public ModifiersBuilders.@Nullable ArcModifiers getModifiers() {
             if (mImpl.hasModifiers()) {
                 return ModifiersBuilders.ArcModifiers.fromProto(mImpl.getModifiers());
             } else {
@@ -3457,25 +3214,21 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static ArcLine fromProto(@NonNull LayoutElementProto.ArcLine proto) {
+        static @NonNull ArcLine fromProto(LayoutElementProto.@NonNull ArcLine proto) {
             return new ArcLine(proto, null);
         }
 
-        @NonNull
-        LayoutElementProto.ArcLine toProto() {
+        LayoutElementProto.@NonNull ArcLine toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public LayoutElementProto.ArcLayoutElement toArcLayoutElementProto() {
+        public LayoutElementProto.@NonNull ArcLayoutElement toArcLayoutElementProto() {
             return LayoutElementProto.ArcLayoutElement.newBuilder().setLine(mImpl).build();
         }
 
@@ -3488,8 +3241,7 @@
             public Builder() {}
 
             /** Sets the length of this line, in degrees. If not defined, defaults to 0. */
-            @NonNull
-            public Builder setLength(@NonNull DimensionBuilders.DegreesProp length) {
+            public @NonNull Builder setLength(DimensionBuilders.@NonNull DegreesProp length) {
                 mImpl.setLength(length.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(length.getFingerprint()).aggregateValueAsInt());
@@ -3497,8 +3249,7 @@
             }
 
             /** Sets the thickness of this line. If not defined, defaults to 0. */
-            @NonNull
-            public Builder setThickness(@NonNull DimensionBuilders.DpProp thickness) {
+            public @NonNull Builder setThickness(DimensionBuilders.@NonNull DpProp thickness) {
                 mImpl.setThickness(thickness.toProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(thickness.getFingerprint()).aggregateValueAsInt());
@@ -3506,8 +3257,7 @@
             }
 
             /** Sets the color of this line. */
-            @NonNull
-            public Builder setColor(@NonNull ColorBuilders.ColorProp color) {
+            public @NonNull Builder setColor(ColorBuilders.@NonNull ColorProp color) {
                 mImpl.setColor(color.toProto());
                 mFingerprint.recordPropertyUpdate(
                         3, checkNotNull(color.getFingerprint()).aggregateValueAsInt());
@@ -3515,8 +3265,8 @@
             }
 
             /** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
-            @NonNull
-            public Builder setModifiers(@NonNull ModifiersBuilders.ArcModifiers modifiers) {
+            public @NonNull Builder setModifiers(
+                    ModifiersBuilders.@NonNull ArcModifiers modifiers) {
                 mImpl.setModifiers(modifiers.toProto());
                 mFingerprint.recordPropertyUpdate(
                         4, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -3524,8 +3274,7 @@
             }
 
             @Override
-            @NonNull
-            public ArcLine build() {
+            public @NonNull ArcLine build() {
                 return new ArcLine(mImpl.build(), mFingerprint);
             }
         }
@@ -3534,7 +3283,7 @@
     /** A simple spacer used to provide padding between adjacent elements in an {@link Arc}. */
     public static final class ArcSpacer implements ArcLayoutElement {
         private final LayoutElementProto.ArcSpacer mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         ArcSpacer(LayoutElementProto.ArcSpacer impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -3545,8 +3294,7 @@
          * Gets the length of this spacer, in degrees. If not defined, defaults to 0. Intended for
          * testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.DegreesProp getLength() {
+        public DimensionBuilders.@Nullable DegreesProp getLength() {
             if (mImpl.hasLength()) {
                 return DimensionBuilders.DegreesProp.fromProto(mImpl.getLength());
             } else {
@@ -3558,8 +3306,7 @@
          * Gets the thickness of this spacer, in DP. If not defined, defaults to 0. Intended for
          * testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.DpProp getThickness() {
+        public DimensionBuilders.@Nullable DpProp getThickness() {
             if (mImpl.hasThickness()) {
                 return DimensionBuilders.DpProp.fromProto(mImpl.getThickness());
             } else {
@@ -3571,8 +3318,7 @@
          * Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
          * for testing purposes only.
          */
-        @Nullable
-        public ModifiersBuilders.ArcModifiers getModifiers() {
+        public ModifiersBuilders.@Nullable ArcModifiers getModifiers() {
             if (mImpl.hasModifiers()) {
                 return ModifiersBuilders.ArcModifiers.fromProto(mImpl.getModifiers());
             } else {
@@ -3582,25 +3328,21 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static ArcSpacer fromProto(@NonNull LayoutElementProto.ArcSpacer proto) {
+        static @NonNull ArcSpacer fromProto(LayoutElementProto.@NonNull ArcSpacer proto) {
             return new ArcSpacer(proto, null);
         }
 
-        @NonNull
-        LayoutElementProto.ArcSpacer toProto() {
+        LayoutElementProto.@NonNull ArcSpacer toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public LayoutElementProto.ArcLayoutElement toArcLayoutElementProto() {
+        public LayoutElementProto.@NonNull ArcLayoutElement toArcLayoutElementProto() {
             return LayoutElementProto.ArcLayoutElement.newBuilder().setSpacer(mImpl).build();
         }
 
@@ -3613,8 +3355,7 @@
             public Builder() {}
 
             /** Sets the length of this spacer, in degrees. If not defined, defaults to 0. */
-            @NonNull
-            public Builder setLength(@NonNull DimensionBuilders.DegreesProp length) {
+            public @NonNull Builder setLength(DimensionBuilders.@NonNull DegreesProp length) {
                 mImpl.setLength(length.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(length.getFingerprint()).aggregateValueAsInt());
@@ -3622,8 +3363,7 @@
             }
 
             /** Sets the thickness of this spacer, in DP. If not defined, defaults to 0. */
-            @NonNull
-            public Builder setThickness(@NonNull DimensionBuilders.DpProp thickness) {
+            public @NonNull Builder setThickness(DimensionBuilders.@NonNull DpProp thickness) {
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(thickness.getFingerprint()).aggregateValueAsInt());
                 mImpl.setThickness(thickness.toProto());
@@ -3631,8 +3371,8 @@
             }
 
             /** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
-            @NonNull
-            public Builder setModifiers(@NonNull ModifiersBuilders.ArcModifiers modifiers) {
+            public @NonNull Builder setModifiers(
+                    ModifiersBuilders.@NonNull ArcModifiers modifiers) {
                 mImpl.setModifiers(modifiers.toProto());
                 mFingerprint.recordPropertyUpdate(
                         3, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -3640,8 +3380,7 @@
             }
 
             @Override
-            @NonNull
-            public ArcSpacer build() {
+            public @NonNull ArcSpacer build() {
                 return new ArcSpacer(mImpl.build(), mFingerprint);
             }
         }
@@ -3650,7 +3389,7 @@
     /** A container that allows a standard {@link LayoutElement} to be added to an {@link Arc}. */
     public static final class ArcAdapter implements ArcLayoutElement {
         private final LayoutElementProto.ArcAdapter mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         ArcAdapter(LayoutElementProto.ArcAdapter impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -3658,8 +3397,7 @@
         }
 
         /** Gets the element to adapt to an {@link Arc}. Intended for testing purposes only. */
-        @Nullable
-        public LayoutElement getContent() {
+        public @Nullable LayoutElement getContent() {
             if (mImpl.hasContent()) {
                 return LayoutElementBuilders.layoutElementFromProto(mImpl.getContent());
             } else {
@@ -3676,8 +3414,7 @@
          * will not be rotated. If not defined, defaults to false. Intended for testing purposes
          * only.
          */
-        @Nullable
-        public TypeBuilders.BoolProp getRotateContents() {
+        public TypeBuilders.@Nullable BoolProp getRotateContents() {
             if (mImpl.hasRotateContents()) {
                 return TypeBuilders.BoolProp.fromProto(mImpl.getRotateContents());
             } else {
@@ -3687,25 +3424,21 @@
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static ArcAdapter fromProto(@NonNull LayoutElementProto.ArcAdapter proto) {
+        static @NonNull ArcAdapter fromProto(LayoutElementProto.@NonNull ArcAdapter proto) {
             return new ArcAdapter(proto, null);
         }
 
-        @NonNull
-        LayoutElementProto.ArcAdapter toProto() {
+        LayoutElementProto.@NonNull ArcAdapter toProto() {
             return mImpl;
         }
 
         @Override
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public LayoutElementProto.ArcLayoutElement toArcLayoutElementProto() {
+        public LayoutElementProto.@NonNull ArcLayoutElement toArcLayoutElementProto() {
             return LayoutElementProto.ArcLayoutElement.newBuilder().setAdapter(mImpl).build();
         }
 
@@ -3718,8 +3451,7 @@
             public Builder() {}
 
             /** Sets the element to adapt to an {@link Arc}. */
-            @NonNull
-            public Builder setContent(@NonNull LayoutElement content) {
+            public @NonNull Builder setContent(@NonNull LayoutElement content) {
                 mImpl.setContent(content.toLayoutElementProto());
                 mFingerprint.addChildNode(checkNotNull(content.getFingerprint()));
                 return this;
@@ -3733,8 +3465,8 @@
              * degrees. If rotate_contents = false, the image will be placed at the 3 o clock
              * position, but itself will not be rotated. If not defined, defaults to false.
              */
-            @NonNull
-            public Builder setRotateContents(@NonNull TypeBuilders.BoolProp rotateContents) {
+            public @NonNull Builder setRotateContents(
+                    TypeBuilders.@NonNull BoolProp rotateContents) {
                 mImpl.setRotateContents(rotateContents.toProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(rotateContents.getFingerprint()).aggregateValueAsInt());
@@ -3750,16 +3482,14 @@
              * position, but itself will not be rotated. If not defined, defaults to false.
              */
             @SuppressLint("MissingGetterMatchingBuilder")
-            @NonNull
-            public Builder setRotateContents(boolean rotateContents) {
+            public @NonNull Builder setRotateContents(boolean rotateContents) {
                 mImpl.setRotateContents(TypesProto.BoolProp.newBuilder().setValue(rotateContents));
                 mFingerprint.recordPropertyUpdate(2, Boolean.hashCode(rotateContents));
                 return this;
             }
 
             @Override
-            @NonNull
-            public ArcAdapter build() {
+            public @NonNull ArcAdapter build() {
                 return new ArcAdapter(mImpl.build(), mFingerprint);
             }
         }
@@ -3772,29 +3502,25 @@
     public interface LayoutElement {
         /** Get the protocol buffer representation of this object. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        LayoutElementProto.LayoutElement toLayoutElementProto();
+        LayoutElementProto.@NonNull LayoutElement toLayoutElementProto();
 
         /** Get the fingerprint for this object or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        Fingerprint getFingerprint();
+        @Nullable Fingerprint getFingerprint();
 
         /** Builder to create {@link LayoutElement} objects. */
         @SuppressLint("StaticFinalBuilder")
         interface Builder {
 
             /** Builds an instance with values accumulated in this Builder. */
-            @NonNull
-            LayoutElement build();
+            @NonNull LayoutElement build();
         }
     }
 
     /** Creates a new wrapper instance from the proto. */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    @NonNull
-    public static LayoutElement layoutElementFromProto(
-            @NonNull LayoutElementProto.LayoutElement proto, @Nullable Fingerprint fingerprint) {
+    public static @NonNull LayoutElement layoutElementFromProto(
+            LayoutElementProto.@NonNull LayoutElement proto, @Nullable Fingerprint fingerprint) {
         if (proto.hasColumn()) {
             return Column.fromProto(proto.getColumn(), fingerprint);
         }
@@ -3822,8 +3548,8 @@
         throw new IllegalStateException("Proto was not a recognised instance of LayoutElement");
     }
 
-    @NonNull
-    static LayoutElement layoutElementFromProto(@NonNull LayoutElementProto.LayoutElement proto) {
+    static @NonNull LayoutElement layoutElementFromProto(
+            LayoutElementProto.@NonNull LayoutElement proto) {
         return layoutElementFromProto(proto, null);
     }
 
@@ -3834,27 +3560,23 @@
     public interface ArcLayoutElement {
         /** Get the protocol buffer representation of this object. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        LayoutElementProto.ArcLayoutElement toArcLayoutElementProto();
+        LayoutElementProto.@NonNull ArcLayoutElement toArcLayoutElementProto();
 
         /** Get the fingerprint for this object or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        Fingerprint getFingerprint();
+        @Nullable Fingerprint getFingerprint();
 
         /** Builder to create {@link ArcLayoutElement} objects. */
         @SuppressLint("StaticFinalBuilder")
         interface Builder {
 
             /** Builds an instance with values accumulated in this Builder. */
-            @NonNull
-            ArcLayoutElement build();
+            @NonNull ArcLayoutElement build();
         }
     }
 
-    @NonNull
-    static ArcLayoutElement arcLayoutElementFromProto(
-            @NonNull LayoutElementProto.ArcLayoutElement proto) {
+    static @NonNull ArcLayoutElement arcLayoutElementFromProto(
+            LayoutElementProto.@NonNull ArcLayoutElement proto) {
         if (proto.hasText()) {
             return ArcText.fromProto(proto.getText());
         }
@@ -3879,8 +3601,7 @@
         }
 
         /** Gets the root element in the layout. Intended for testing purposes only. */
-        @Nullable
-        public LayoutElement getRoot() {
+        public @Nullable LayoutElement getRoot() {
             if (mImpl.hasRoot()) {
                 return LayoutElementBuilders.layoutElementFromProto(mImpl.getRoot());
             } else {
@@ -3889,35 +3610,30 @@
         }
 
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public static Layout fromProto(@NonNull LayoutElementProto.Layout proto) {
+        public static @NonNull Layout fromProto(LayoutElementProto.@NonNull Layout proto) {
             return new Layout(proto);
         }
 
         /** Creates a {@link Layout} object containing the given layout element. */
-        @NonNull
-        public static Layout fromLayoutElement(@NonNull LayoutElement layoutElement) {
+        public static @NonNull Layout fromLayoutElement(@NonNull LayoutElement layoutElement) {
             return new Builder().setRoot(layoutElement).build();
         }
 
         /** Returns the internal proto instance. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public LayoutElementProto.Layout toProto() {
+        public LayoutElementProto.@NonNull Layout toProto() {
             return mImpl;
         }
 
         /** Converts to byte array representation. */
         @TilesExperimental
-        @NonNull
-        public byte[] toByteArray() {
+        public byte @NonNull [] toByteArray() {
             return mImpl.toByteArray();
         }
 
         /** Converts from byte array representation. */
         @TilesExperimental
-        @Nullable
-        public static Layout fromByteArray(@NonNull byte[] byteArray) {
+        public static @Nullable Layout fromByteArray(byte @NonNull [] byteArray) {
             try {
                 return fromProto(LayoutElementProto.Layout.parseFrom(byteArray));
             } catch (InvalidProtocolBufferException e) {
@@ -3933,10 +3649,9 @@
             public Builder() {}
 
             /** Sets the root element in the layout. */
-            @NonNull
-            public Builder setRoot(@NonNull LayoutElement root) {
+            public @NonNull Builder setRoot(@NonNull LayoutElement root) {
                 mImpl.setRoot(root.toLayoutElementProto());
-                @Nullable Fingerprint fingerprint = root.getFingerprint();
+                Fingerprint fingerprint = root.getFingerprint();
                 if (fingerprint != null) {
                     mImpl.setFingerprint(
                             TreeFingerprint.newBuilder().setRoot(fingerprintToProto(fingerprint)));
@@ -3964,8 +3679,7 @@
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public Layout build() {
+            public @NonNull Layout build() {
                 return Layout.fromProto(mImpl.build());
             }
         }
@@ -3978,101 +3692,90 @@
         private FontStyles() {}
 
         private static boolean isLargeScreen(
-                @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+                DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
             return deviceParameters.getScreenWidthDp() >= LARGE_SCREEN_WIDTH_DP;
         }
 
         /** Font style for large display text. */
-        @NonNull
-        public static FontStyle.Builder display1(
-                @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+        public static FontStyle.@NonNull Builder display1(
+                DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
             return new FontStyle.Builder()
                     .setWeight(FONT_WEIGHT_BOLD)
                     .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 54 : 50));
         }
 
         /** Font style for medium display text. */
-        @NonNull
-        public static FontStyle.Builder display2(
-                @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+        public static FontStyle.@NonNull Builder display2(
+                DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
             return new FontStyle.Builder()
                     .setWeight(FONT_WEIGHT_BOLD)
                     .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 44 : 40));
         }
 
         /** Font style for small display text. */
-        @NonNull
-        public static FontStyle.Builder display3(
-                @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+        public static FontStyle.@NonNull Builder display3(
+                DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
             return new FontStyle.Builder()
                     .setWeight(FONT_WEIGHT_BOLD)
                     .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 34 : 30));
         }
 
         /** Font style for large title text. */
-        @NonNull
-        public static FontStyle.Builder title1(
-                @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+        public static FontStyle.@NonNull Builder title1(
+                DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
             return new FontStyle.Builder()
                     .setWeight(FONT_WEIGHT_BOLD)
                     .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 26 : 24));
         }
 
         /** Font style for medium title text. */
-        @NonNull
-        public static FontStyle.Builder title2(
-                @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+        public static FontStyle.@NonNull Builder title2(
+                DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
             return new FontStyle.Builder()
                     .setWeight(FONT_WEIGHT_BOLD)
                     .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 22 : 20));
         }
 
         /** Font style for small title text. */
-        @NonNull
-        public static FontStyle.Builder title3(
-                @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+        public static FontStyle.@NonNull Builder title3(
+                DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
             return new FontStyle.Builder()
                     .setWeight(FONT_WEIGHT_BOLD)
                     .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 18 : 16));
         }
 
         /** Font style for large body text. */
-        @NonNull
-        public static FontStyle.Builder body1(
-                @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+        public static FontStyle.@NonNull Builder body1(
+                DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
             return new FontStyle.Builder()
                     .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 18 : 16));
         }
 
         /** Font style for medium body text. */
-        @NonNull
-        public static FontStyle.Builder body2(
-                @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+        public static FontStyle.@NonNull Builder body2(
+                DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
             return new FontStyle.Builder()
                     .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 16 : 14));
         }
 
         /** Font style for button text. */
-        @NonNull
-        public static FontStyle.Builder button(
-                @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+        public static FontStyle.@NonNull Builder button(
+                DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
             return new FontStyle.Builder()
                     .setWeight(FONT_WEIGHT_BOLD)
                     .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 16 : 14));
         }
 
         /** Font style for large caption text. */
-        @NonNull
-        public static FontStyle.Builder caption1(
-                @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+        public static FontStyle.@NonNull Builder caption1(
+                DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
             return new FontStyle.Builder()
                     .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 16 : 14));
         }
 
         /** Font style for medium caption text. */
-        @NonNull
-        public static FontStyle.Builder caption2(
-                @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+        public static FontStyle.@NonNull Builder caption2(
+                DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
             return new FontStyle.Builder()
                     .setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 14 : 12));
         }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ModifiersBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ModifiersBuilders.java
index a92e6a1..c697106 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ModifiersBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ModifiersBuilders.java
@@ -20,8 +20,6 @@
 
 import android.annotation.SuppressLint;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
@@ -29,6 +27,9 @@
 import androidx.wear.protolayout.proto.TypesProto;
 import androidx.wear.protolayout.protobuf.ByteString;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.Arrays;
 
 /**
@@ -46,7 +47,7 @@
      */
     public static final class Clickable {
         private final ModifiersProto.Clickable mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         Clickable(ModifiersProto.Clickable impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -54,8 +55,7 @@
         }
 
         /** Gets the ID associated with this action. Intended for testing purposes only. */
-        @NonNull
-        public String getId() {
+        public @NonNull String getId() {
             return mImpl.getId();
         }
 
@@ -63,8 +63,7 @@
          * Gets the action to perform when the element this modifier is attached to is clicked.
          * Intended for testing purposes only.
          */
-        @Nullable
-        public ActionBuilders.Action getOnClick() {
+        public ActionBuilders.@Nullable Action getOnClick() {
             if (mImpl.hasOnClick()) {
                 return ActionBuilders.actionFromProto(mImpl.getOnClick());
             } else {
@@ -74,20 +73,17 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static Clickable fromProto(@NonNull ModifiersProto.Clickable proto) {
+        static @NonNull Clickable fromProto(ModifiersProto.@NonNull Clickable proto) {
             return new Clickable(proto, null);
         }
 
         /** Returns the internal proto instance. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public ModifiersProto.Clickable toProto() {
+        public ModifiersProto.@NonNull Clickable toProto() {
             return mImpl;
         }
 
@@ -100,8 +96,7 @@
             public Builder() {}
 
             /** Sets the ID associated with this action. */
-            @NonNull
-            public Builder setId(@NonNull String id) {
+            public @NonNull Builder setId(@NonNull String id) {
                 mImpl.setId(id);
                 mFingerprint.recordPropertyUpdate(1, id.hashCode());
                 return this;
@@ -110,8 +105,7 @@
             /**
              * Sets the action to perform when the element this modifier is attached to is clicked.
              */
-            @NonNull
-            public Builder setOnClick(@NonNull ActionBuilders.Action onClick) {
+            public @NonNull Builder setOnClick(ActionBuilders.@NonNull Action onClick) {
                 mImpl.setOnClick(onClick.toActionProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(onClick.getFingerprint()).aggregateValueAsInt());
@@ -119,8 +113,7 @@
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public Clickable build() {
+            public @NonNull Clickable build() {
                 return new Clickable(mImpl.build(), mFingerprint);
             }
         }
@@ -133,7 +126,7 @@
      */
     public static final class Semantics {
         private final ModifiersProto.Semantics mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         Semantics(ModifiersProto.Semantics impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -144,25 +137,21 @@
          * Gets the content description associated with this element. This will be dictated when the
          * element is focused by the screen reader. Intended for testing purposes only.
          */
-        @NonNull
-        public String getContentDescription() {
+        public @NonNull String getContentDescription() {
             return mImpl.getObsoleteContentDescription();
         }
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static Semantics fromProto(@NonNull ModifiersProto.Semantics proto) {
+        static @NonNull Semantics fromProto(ModifiersProto.@NonNull Semantics proto) {
             return new Semantics(proto, null);
         }
 
-        @NonNull
-        ModifiersProto.Semantics toProto() {
+        ModifiersProto.@NonNull Semantics toProto() {
             return mImpl;
         }
 
@@ -178,18 +167,16 @@
              * Sets the content description associated with this element. This will be dictated when
              * the element is focused by the screen reader.
              */
-            @NonNull
             @SuppressWarnings(
                     "deprecation") // Updating a deprecated field for backward compatibility
-            public Builder setContentDescription(@NonNull String contentDescription) {
+            public @NonNull Builder setContentDescription(@NonNull String contentDescription) {
                 mImpl.setObsoleteContentDescription(contentDescription);
                 mFingerprint.recordPropertyUpdate(4, contentDescription.hashCode());
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public Semantics build() {
+            public @NonNull Semantics build() {
                 return new Semantics(mImpl.build(), mFingerprint);
             }
         }
@@ -198,7 +185,7 @@
     /** A modifier to apply padding around an element. */
     public static final class Padding {
         private final ModifiersProto.Padding mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         Padding(ModifiersProto.Padding impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -209,8 +196,7 @@
          * Gets the padding on the end of the content, depending on the layout direction, in DP and
          * the value of "rtl_aware". Intended for testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.DpProp getEnd() {
+        public DimensionBuilders.@Nullable DpProp getEnd() {
             if (mImpl.hasEnd()) {
                 return DimensionBuilders.DpProp.fromProto(mImpl.getEnd());
             } else {
@@ -222,8 +208,7 @@
          * Gets the padding on the start of the content, depending on the layout direction, in DP
          * and the value of "rtl_aware". Intended for testing purposes only.
          */
-        @Nullable
-        public DimensionBuilders.DpProp getStart() {
+        public DimensionBuilders.@Nullable DpProp getStart() {
             if (mImpl.hasStart()) {
                 return DimensionBuilders.DpProp.fromProto(mImpl.getStart());
             } else {
@@ -232,8 +217,7 @@
         }
 
         /** Gets the padding at the top, in DP. Intended for testing purposes only. */
-        @Nullable
-        public DimensionBuilders.DpProp getTop() {
+        public DimensionBuilders.@Nullable DpProp getTop() {
             if (mImpl.hasTop()) {
                 return DimensionBuilders.DpProp.fromProto(mImpl.getTop());
             } else {
@@ -242,8 +226,7 @@
         }
 
         /** Gets the padding at the bottom, in DP. Intended for testing purposes only. */
-        @Nullable
-        public DimensionBuilders.DpProp getBottom() {
+        public DimensionBuilders.@Nullable DpProp getBottom() {
             if (mImpl.hasBottom()) {
                 return DimensionBuilders.DpProp.fromProto(mImpl.getBottom());
             } else {
@@ -257,8 +240,7 @@
          * of the container if the device is using an RTL locale). If false, start/end will always
          * map to left/right, accordingly. Intended for testing purposes only.
          */
-        @Nullable
-        public TypeBuilders.BoolProp getRtlAware() {
+        public TypeBuilders.@Nullable BoolProp getRtlAware() {
             if (mImpl.hasRtlAware()) {
                 return TypeBuilders.BoolProp.fromProto(mImpl.getRtlAware());
             } else {
@@ -268,18 +250,15 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static Padding fromProto(@NonNull ModifiersProto.Padding proto) {
+        static @NonNull Padding fromProto(ModifiersProto.@NonNull Padding proto) {
             return new Padding(proto, null);
         }
 
-        @NonNull
-        ModifiersProto.Padding toProto() {
+        ModifiersProto.@NonNull Padding toProto() {
             return mImpl;
         }
 
@@ -295,8 +274,7 @@
              * Sets the padding on the end of the content, depending on the layout direction, in DP
              * and the value of "rtl_aware".
              */
-            @NonNull
-            public Builder setEnd(@NonNull DimensionBuilders.DpProp end) {
+            public @NonNull Builder setEnd(DimensionBuilders.@NonNull DpProp end) {
                 mImpl.setEnd(end.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(end.getFingerprint()).aggregateValueAsInt());
@@ -307,8 +285,7 @@
              * Sets the padding on the start of the content, depending on the layout direction, in
              * DP and the value of "rtl_aware".
              */
-            @NonNull
-            public Builder setStart(@NonNull DimensionBuilders.DpProp start) {
+            public @NonNull Builder setStart(DimensionBuilders.@NonNull DpProp start) {
                 mImpl.setStart(start.toProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(start.getFingerprint()).aggregateValueAsInt());
@@ -316,8 +293,7 @@
             }
 
             /** Sets the padding at the top, in DP. */
-            @NonNull
-            public Builder setTop(@NonNull DimensionBuilders.DpProp top) {
+            public @NonNull Builder setTop(DimensionBuilders.@NonNull DpProp top) {
                 mImpl.setTop(top.toProto());
                 mFingerprint.recordPropertyUpdate(
                         3, checkNotNull(top.getFingerprint()).aggregateValueAsInt());
@@ -325,8 +301,7 @@
             }
 
             /** Sets the padding at the bottom, in DP. */
-            @NonNull
-            public Builder setBottom(@NonNull DimensionBuilders.DpProp bottom) {
+            public @NonNull Builder setBottom(DimensionBuilders.@NonNull DpProp bottom) {
                 mImpl.setBottom(bottom.toProto());
                 mFingerprint.recordPropertyUpdate(
                         4, checkNotNull(bottom.getFingerprint()).aggregateValueAsInt());
@@ -339,8 +314,7 @@
              * side of the container if the device is using an RTL locale). If false, start/end will
              * always map to left/right, accordingly.
              */
-            @NonNull
-            public Builder setRtlAware(@NonNull TypeBuilders.BoolProp rtlAware) {
+            public @NonNull Builder setRtlAware(TypeBuilders.@NonNull BoolProp rtlAware) {
                 mImpl.setRtlAware(rtlAware.toProto());
                 mFingerprint.recordPropertyUpdate(
                         5, checkNotNull(rtlAware.getFingerprint()).aggregateValueAsInt());
@@ -354,23 +328,20 @@
              * always map to left/right, accordingly.
              */
             @SuppressLint("MissingGetterMatchingBuilder")
-            @NonNull
-            public Builder setRtlAware(boolean rtlAware) {
+            public @NonNull Builder setRtlAware(boolean rtlAware) {
                 mImpl.setRtlAware(TypesProto.BoolProp.newBuilder().setValue(rtlAware));
                 mFingerprint.recordPropertyUpdate(5, Boolean.hashCode(rtlAware));
                 return this;
             }
 
             /** Sets the padding for all sides of the content, in DP. */
-            @NonNull
             @SuppressLint("MissingGetterMatchingBuilder")
-            public Builder setAll(@NonNull DimensionBuilders.DpProp value) {
+            public @NonNull Builder setAll(DimensionBuilders.@NonNull DpProp value) {
                 return setStart(value).setEnd(value).setTop(value).setBottom(value);
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public Padding build() {
+            public @NonNull Padding build() {
                 return new Padding(mImpl.build(), mFingerprint);
             }
         }
@@ -379,7 +350,7 @@
     /** A modifier to apply a border around an element. */
     public static final class Border {
         private final ModifiersProto.Border mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         Border(ModifiersProto.Border impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -387,8 +358,7 @@
         }
 
         /** Gets the width of the border, in DP. Intended for testing purposes only. */
-        @Nullable
-        public DimensionBuilders.DpProp getWidth() {
+        public DimensionBuilders.@Nullable DpProp getWidth() {
             if (mImpl.hasWidth()) {
                 return DimensionBuilders.DpProp.fromProto(mImpl.getWidth());
             } else {
@@ -397,8 +367,7 @@
         }
 
         /** Gets the color of the border. Intended for testing purposes only. */
-        @Nullable
-        public ColorBuilders.ColorProp getColor() {
+        public ColorBuilders.@Nullable ColorProp getColor() {
             if (mImpl.hasColor()) {
                 return ColorBuilders.ColorProp.fromProto(mImpl.getColor());
             } else {
@@ -408,18 +377,15 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static Border fromProto(@NonNull ModifiersProto.Border proto) {
+        static @NonNull Border fromProto(ModifiersProto.@NonNull Border proto) {
             return new Border(proto, null);
         }
 
-        @NonNull
-        ModifiersProto.Border toProto() {
+        ModifiersProto.@NonNull Border toProto() {
             return mImpl;
         }
 
@@ -431,8 +397,7 @@
             public Builder() {}
 
             /** Sets the width of the border, in DP. */
-            @NonNull
-            public Builder setWidth(@NonNull DimensionBuilders.DpProp width) {
+            public @NonNull Builder setWidth(DimensionBuilders.@NonNull DpProp width) {
                 mImpl.setWidth(width.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(width.getFingerprint()).aggregateValueAsInt());
@@ -440,8 +405,7 @@
             }
 
             /** Sets the color of the border. */
-            @NonNull
-            public Builder setColor(@NonNull ColorBuilders.ColorProp color) {
+            public @NonNull Builder setColor(ColorBuilders.@NonNull ColorProp color) {
                 mImpl.setColor(color.toProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(color.getFingerprint()).aggregateValueAsInt());
@@ -449,8 +413,7 @@
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public Border build() {
+            public @NonNull Border build() {
                 return new Border(mImpl.build(), mFingerprint);
             }
         }
@@ -459,7 +422,7 @@
     /** The corner of a {@link androidx.wear.tiles.LayoutElementBuilders.Box} element. */
     public static final class Corner {
         private final ModifiersProto.Corner mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         Corner(ModifiersProto.Corner impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -467,8 +430,7 @@
         }
 
         /** Gets the radius of the corner in DP. Intended for testing purposes only. */
-        @Nullable
-        public DimensionBuilders.DpProp getRadius() {
+        public DimensionBuilders.@Nullable DpProp getRadius() {
             if (mImpl.hasRadius()) {
                 return DimensionBuilders.DpProp.fromProto(mImpl.getRadius());
             } else {
@@ -478,18 +440,15 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static Corner fromProto(@NonNull ModifiersProto.Corner proto) {
+        static @NonNull Corner fromProto(ModifiersProto.@NonNull Corner proto) {
             return new Corner(proto, null);
         }
 
-        @NonNull
-        ModifiersProto.Corner toProto() {
+        ModifiersProto.@NonNull Corner toProto() {
             return mImpl;
         }
 
@@ -501,8 +460,7 @@
             public Builder() {}
 
             /** Sets the radius of the corner in DP. */
-            @NonNull
-            public Builder setRadius(@NonNull DimensionBuilders.DpProp radius) {
+            public @NonNull Builder setRadius(DimensionBuilders.@NonNull DpProp radius) {
                 mImpl.setRadius(radius.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(radius.getFingerprint()).aggregateValueAsInt());
@@ -510,8 +468,7 @@
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public Corner build() {
+            public @NonNull Corner build() {
                 return new Corner(mImpl.build(), mFingerprint);
             }
         }
@@ -520,7 +477,7 @@
     /** A modifier to apply a background to an element. */
     public static final class Background {
         private final ModifiersProto.Background mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         Background(ModifiersProto.Background impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -531,8 +488,7 @@
          * Gets the background color for this element. If not defined, defaults to being
          * transparent. Intended for testing purposes only.
          */
-        @Nullable
-        public ColorBuilders.ColorProp getColor() {
+        public ColorBuilders.@Nullable ColorProp getColor() {
             if (mImpl.hasColor()) {
                 return ColorBuilders.ColorProp.fromProto(mImpl.getColor());
             } else {
@@ -545,8 +501,7 @@
          * if it has a background color or border. If not defined, defaults to having a square
          * corner. Intended for testing purposes only.
          */
-        @Nullable
-        public Corner getCorner() {
+        public @Nullable Corner getCorner() {
             if (mImpl.hasCorner()) {
                 return Corner.fromProto(mImpl.getCorner());
             } else {
@@ -556,18 +511,15 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static Background fromProto(@NonNull ModifiersProto.Background proto) {
+        static @NonNull Background fromProto(ModifiersProto.@NonNull Background proto) {
             return new Background(proto, null);
         }
 
-        @NonNull
-        ModifiersProto.Background toProto() {
+        ModifiersProto.@NonNull Background toProto() {
             return mImpl;
         }
 
@@ -583,8 +535,7 @@
              * Sets the background color for this element. If not defined, defaults to being
              * transparent.
              */
-            @NonNull
-            public Builder setColor(@NonNull ColorBuilders.ColorProp color) {
+            public @NonNull Builder setColor(ColorBuilders.@NonNull ColorProp color) {
                 mImpl.setColor(color.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(color.getFingerprint()).aggregateValueAsInt());
@@ -596,8 +547,7 @@
              * element if it has a background color or border. If not defined, defaults to having a
              * square corner.
              */
-            @NonNull
-            public Builder setCorner(@NonNull Corner corner) {
+            public @NonNull Builder setCorner(@NonNull Corner corner) {
                 mImpl.setCorner(corner.toProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(corner.getFingerprint()).aggregateValueAsInt());
@@ -605,8 +555,7 @@
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public Background build() {
+            public @NonNull Background build() {
                 return new Background(mImpl.build(), mFingerprint);
             }
         }
@@ -618,7 +567,7 @@
      */
     public static final class ElementMetadata {
         private final ModifiersProto.ElementMetadata mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         ElementMetadata(ModifiersProto.ElementMetadata impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -629,27 +578,23 @@
          * Gets property describing the element with which it is associated. For use by libraries
          * building higher-level components only. This can be used to track component metadata.
          */
-        @NonNull
-        public byte[] getTagData() {
+        public byte @NonNull [] getTagData() {
             return mImpl.getTagData().toByteArray();
         }
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static ElementMetadata fromProto(@NonNull ModifiersProto.ElementMetadata proto) {
+        static @NonNull ElementMetadata fromProto(ModifiersProto.@NonNull ElementMetadata proto) {
             return new ElementMetadata(proto, null);
         }
 
         /** Returns the internal proto instance. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public ModifiersProto.ElementMetadata toProto() {
+        public ModifiersProto.@NonNull ElementMetadata toProto() {
             return mImpl;
         }
 
@@ -666,16 +611,14 @@
              * libraries building higher-level components only. This can be used to track component
              * metadata.
              */
-            @NonNull
-            public Builder setTagData(@NonNull byte[] tagData) {
+            public @NonNull Builder setTagData(byte @NonNull [] tagData) {
                 mImpl.setTagData(ByteString.copyFrom(tagData));
                 mFingerprint.recordPropertyUpdate(1, Arrays.hashCode(tagData));
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public ElementMetadata build() {
+            public @NonNull ElementMetadata build() {
                 return new ElementMetadata(mImpl.build(), mFingerprint);
             }
         }
@@ -688,7 +631,7 @@
      */
     public static final class Modifiers {
         private final ModifiersProto.Modifiers mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         Modifiers(ModifiersProto.Modifiers impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -700,8 +643,7 @@
          * have actions associated with it, which will be executed when the element is tapped.
          * Intended for testing purposes only.
          */
-        @Nullable
-        public Clickable getClickable() {
+        public @Nullable Clickable getClickable() {
             if (mImpl.hasClickable()) {
                 return Clickable.fromProto(mImpl.getClickable());
             } else {
@@ -714,8 +656,7 @@
          * modified element (eg. screen reader content descriptions). Intended for testing purposes
          * only.
          */
-        @Nullable
-        public Semantics getSemantics() {
+        public @Nullable Semantics getSemantics() {
             if (mImpl.hasSemantics()) {
                 return Semantics.fromProto(mImpl.getSemantics());
             } else {
@@ -724,8 +665,7 @@
         }
 
         /** Gets the padding of the modified element. Intended for testing purposes only. */
-        @Nullable
-        public Padding getPadding() {
+        public @Nullable Padding getPadding() {
             if (mImpl.hasPadding()) {
                 return Padding.fromProto(mImpl.getPadding());
             } else {
@@ -734,8 +674,7 @@
         }
 
         /** Gets the border of the modified element. Intended for testing purposes only. */
-        @Nullable
-        public Border getBorder() {
+        public @Nullable Border getBorder() {
             if (mImpl.hasBorder()) {
                 return Border.fromProto(mImpl.getBorder());
             } else {
@@ -747,8 +686,7 @@
          * Gets the background (with optional corner radius) of the modified element. Intended for
          * testing purposes only.
          */
-        @Nullable
-        public Background getBackground() {
+        public @Nullable Background getBackground() {
             if (mImpl.hasBackground()) {
                 return Background.fromProto(mImpl.getBackground());
             } else {
@@ -760,8 +698,7 @@
          * Gets metadata about an element. For use by libraries building higher-level components
          * only. This can be used to track component metadata.
          */
-        @Nullable
-        public ElementMetadata getMetadata() {
+        public @Nullable ElementMetadata getMetadata() {
             if (mImpl.hasMetadata()) {
                 return ElementMetadata.fromProto(mImpl.getMetadata());
             } else {
@@ -771,16 +708,14 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
         /** Creates a new wrapper instance from the proto. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public static Modifiers fromProto(
-                @NonNull ModifiersProto.Modifiers proto, @Nullable Fingerprint fingerprint) {
+        public static @NonNull Modifiers fromProto(
+                ModifiersProto.@NonNull Modifiers proto, @Nullable Fingerprint fingerprint) {
             return new Modifiers(proto, fingerprint);
         }
 
@@ -789,15 +724,13 @@
          * object created using this method can't be added to any other wrapper.
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public static Modifiers fromProto(@NonNull ModifiersProto.Modifiers proto) {
+        public static @NonNull Modifiers fromProto(ModifiersProto.@NonNull Modifiers proto) {
             return fromProto(proto, null);
         }
 
         /** Returns the internal proto instance. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public ModifiersProto.Modifiers toProto() {
+        public ModifiersProto.@NonNull Modifiers toProto() {
             return mImpl;
         }
 
@@ -813,8 +746,7 @@
              * Sets the clickable property of the modified element. It allows its wrapped element to
              * have actions associated with it, which will be executed when the element is tapped.
              */
-            @NonNull
-            public Builder setClickable(@NonNull Clickable clickable) {
+            public @NonNull Builder setClickable(@NonNull Clickable clickable) {
                 mImpl.setClickable(clickable.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(clickable.getFingerprint()).aggregateValueAsInt());
@@ -825,8 +757,7 @@
              * Sets the semantics of the modified element. This can be used to add metadata to the
              * modified element (eg. screen reader content descriptions).
              */
-            @NonNull
-            public Builder setSemantics(@NonNull Semantics semantics) {
+            public @NonNull Builder setSemantics(@NonNull Semantics semantics) {
                 mImpl.setSemantics(semantics.toProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(semantics.getFingerprint()).aggregateValueAsInt());
@@ -834,8 +765,7 @@
             }
 
             /** Sets the padding of the modified element. */
-            @NonNull
-            public Builder setPadding(@NonNull Padding padding) {
+            public @NonNull Builder setPadding(@NonNull Padding padding) {
                 mImpl.setPadding(padding.toProto());
                 mFingerprint.recordPropertyUpdate(
                         3, checkNotNull(padding.getFingerprint()).aggregateValueAsInt());
@@ -843,8 +773,7 @@
             }
 
             /** Sets the border of the modified element. */
-            @NonNull
-            public Builder setBorder(@NonNull Border border) {
+            public @NonNull Builder setBorder(@NonNull Border border) {
                 mImpl.setBorder(border.toProto());
                 mFingerprint.recordPropertyUpdate(
                         4, checkNotNull(border.getFingerprint()).aggregateValueAsInt());
@@ -852,8 +781,7 @@
             }
 
             /** Sets the background (with optional corner radius) of the modified element. */
-            @NonNull
-            public Builder setBackground(@NonNull Background background) {
+            public @NonNull Builder setBackground(@NonNull Background background) {
                 mImpl.setBackground(background.toProto());
                 mFingerprint.recordPropertyUpdate(
                         5, checkNotNull(background.getFingerprint()).aggregateValueAsInt());
@@ -864,8 +792,7 @@
              * Sets metadata about an element. For use by libraries building higher-level components
              * only. This can be used to track component metadata.
              */
-            @NonNull
-            public Builder setMetadata(@NonNull ElementMetadata metadata) {
+            public @NonNull Builder setMetadata(@NonNull ElementMetadata metadata) {
                 mImpl.setMetadata(metadata.toProto());
                 mFingerprint.recordPropertyUpdate(
                         6, checkNotNull(metadata.getFingerprint()).aggregateValueAsInt());
@@ -873,8 +800,7 @@
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public Modifiers build() {
+            public @NonNull Modifiers build() {
                 return new Modifiers(mImpl.build(), mFingerprint);
             }
         }
@@ -886,7 +812,7 @@
      */
     public static final class ArcModifiers {
         private final ModifiersProto.ArcModifiers mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         ArcModifiers(ModifiersProto.ArcModifiers impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -897,8 +823,7 @@
          * Gets allows its wrapped element to have actions associated with it, which will be
          * executed when the element is tapped. Intended for testing purposes only.
          */
-        @Nullable
-        public Clickable getClickable() {
+        public @Nullable Clickable getClickable() {
             if (mImpl.hasClickable()) {
                 return Clickable.fromProto(mImpl.getClickable());
             } else {
@@ -910,8 +835,7 @@
          * Gets adds metadata for the modified element, for example, screen reader content
          * descriptions. Intended for testing purposes only.
          */
-        @Nullable
-        public Semantics getSemantics() {
+        public @Nullable Semantics getSemantics() {
             if (mImpl.hasSemantics()) {
                 return Semantics.fromProto(mImpl.getSemantics());
             } else {
@@ -921,20 +845,17 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static ArcModifiers fromProto(@NonNull ModifiersProto.ArcModifiers proto) {
+        static @NonNull ArcModifiers fromProto(ModifiersProto.@NonNull ArcModifiers proto) {
             return new ArcModifiers(proto, null);
         }
 
         /** Returns the internal proto instance. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public ModifiersProto.ArcModifiers toProto() {
+        public ModifiersProto.@NonNull ArcModifiers toProto() {
             return mImpl;
         }
 
@@ -950,8 +871,7 @@
              * Sets allows its wrapped element to have actions associated with it, which will be
              * executed when the element is tapped.
              */
-            @NonNull
-            public Builder setClickable(@NonNull Clickable clickable) {
+            public @NonNull Builder setClickable(@NonNull Clickable clickable) {
                 mImpl.setClickable(clickable.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(clickable.getFingerprint()).aggregateValueAsInt());
@@ -962,8 +882,7 @@
              * Sets adds metadata for the modified element, for example, screen reader content
              * descriptions.
              */
-            @NonNull
-            public Builder setSemantics(@NonNull Semantics semantics) {
+            public @NonNull Builder setSemantics(@NonNull Semantics semantics) {
                 mImpl.setSemantics(semantics.toProto());
                 mFingerprint.recordPropertyUpdate(
                         2, checkNotNull(semantics.getFingerprint()).aggregateValueAsInt());
@@ -971,8 +890,7 @@
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public ArcModifiers build() {
+            public @NonNull ArcModifiers build() {
                 return new ArcModifiers(mImpl.build(), mFingerprint);
             }
         }
@@ -985,7 +903,7 @@
      */
     public static final class SpanModifiers {
         private final ModifiersProto.SpanModifiers mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         SpanModifiers(ModifiersProto.SpanModifiers impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -996,8 +914,7 @@
          * Gets allows its wrapped element to have actions associated with it, which will be
          * executed when the element is tapped. Intended for testing purposes only.
          */
-        @Nullable
-        public Clickable getClickable() {
+        public @Nullable Clickable getClickable() {
             if (mImpl.hasClickable()) {
                 return Clickable.fromProto(mImpl.getClickable());
             } else {
@@ -1007,20 +924,17 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static SpanModifiers fromProto(@NonNull ModifiersProto.SpanModifiers proto) {
+        static @NonNull SpanModifiers fromProto(ModifiersProto.@NonNull SpanModifiers proto) {
             return new SpanModifiers(proto, null);
         }
 
         /** Returns the internal proto instance. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public ModifiersProto.SpanModifiers toProto() {
+        public ModifiersProto.@NonNull SpanModifiers toProto() {
             return mImpl;
         }
 
@@ -1036,8 +950,7 @@
              * Sets allows its wrapped element to have actions associated with it, which will be
              * executed when the element is tapped.
              */
-            @NonNull
-            public Builder setClickable(@NonNull Clickable clickable) {
+            public @NonNull Builder setClickable(@NonNull Clickable clickable) {
                 mImpl.setClickable(clickable.toProto());
                 mFingerprint.recordPropertyUpdate(
                         1, checkNotNull(clickable.getFingerprint()).aggregateValueAsInt());
@@ -1045,8 +958,7 @@
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public SpanModifiers build() {
+            public @NonNull SpanModifiers build() {
                 return new SpanModifiers(mImpl.build(), mFingerprint);
             }
         }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ProtoParcelable.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ProtoParcelable.java
index 04413bd..0b0acd8 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ProtoParcelable.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ProtoParcelable.java
@@ -20,9 +20,10 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 import java.lang.reflect.Array;
 import java.util.Arrays;
 import java.util.function.BiFunction;
@@ -57,14 +58,13 @@
         };
     }
 
-    protected ProtoParcelable(@NonNull byte[] contents, int version) {
+    protected ProtoParcelable(byte @NonNull [] contents, int version) {
         this.mContents = contents;
         this.mVersion = version;
     }
 
     /** Get the payload contained within this ProtoParcelable. */
-    @NonNull
-    public byte[] getContents() {
+    public byte @NonNull [] getContents() {
         return mContents;
     }
 
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/RequestBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/RequestBuilders.java
index b12b8ff2..708bf5a 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/RequestBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/RequestBuilders.java
@@ -16,8 +16,6 @@
 
 package androidx.wear.tiles;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters;
@@ -27,6 +25,9 @@
 import androidx.wear.protolayout.proto.StateProto;
 import androidx.wear.tiles.proto.RequestProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.List;
 
 /** Builders for request messages used to fetch tiles and resources. */
@@ -50,8 +51,7 @@
          * object describing the device requesting the tile update. If not set, a default empty
          * instance is used.
          */
-        @NonNull
-        public DeviceParameters getDeviceConfiguration() {
+        public @NonNull DeviceParameters getDeviceConfiguration() {
             if (mImpl.hasDeviceConfiguration()) {
                 return DeviceParameters.fromProto(mImpl.getDeviceConfiguration());
             } else {
@@ -64,8 +64,7 @@
          * Gets the {@link androidx.wear.protolayout.StateBuilders.State} that should be used when
          * building the tile.
          */
-        @NonNull
-        public State getCurrentState() {
+        public @NonNull State getCurrentState() {
             if (mImpl.hasCurrentState()) {
                 return State.fromProto(mImpl.getCurrentState());
             } else {
@@ -89,9 +88,9 @@
          * @deprecated Use {@link #getDeviceConfiguration()} instead.
          */
         @Deprecated
-        @Nullable
         @SuppressWarnings("deprecation") // for backward compatibility
-        public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters getDeviceParameters() {
+        public androidx.wear.tiles.DeviceParametersBuilders.@Nullable DeviceParameters
+                getDeviceParameters() {
             if (mImpl.hasDeviceConfiguration()) {
                 return androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters.fromProto(
                         mImpl.getDeviceConfiguration());
@@ -107,9 +106,8 @@
          * @deprecated Use {@link #getCurrentState()} instead.
          */
         @Deprecated
-        @Nullable
         @SuppressWarnings("deprecation") // for backward compatibility
-        public androidx.wear.tiles.StateBuilders.State getState() {
+        public androidx.wear.tiles.StateBuilders.@Nullable State getState() {
             if (mImpl.hasCurrentState()) {
                 return androidx.wear.tiles.StateBuilders.State.fromProto(mImpl.getCurrentState());
             } else {
@@ -119,21 +117,18 @@
 
         /** Creates a new wrapper instance from the proto. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public static TileRequest fromProto(@NonNull RequestProto.TileRequest proto) {
+        public static @NonNull TileRequest fromProto(RequestProto.@NonNull TileRequest proto) {
             return new TileRequest(proto);
         }
 
         /** Returns the internal proto instance. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public RequestProto.TileRequest toProto() {
+        public RequestProto.@NonNull TileRequest toProto() {
             return mImpl;
         }
 
         @Override
-        @NonNull
-        public String toString() {
+        public @NonNull String toString() {
             return "TileRequest{"
                     + "deviceConfiguration="
                     + getDeviceConfiguration()
@@ -159,8 +154,8 @@
              * instance is used.
              */
             @RequiresSchemaVersion(major = 1, minor = 0)
-            @NonNull
-            public Builder setDeviceConfiguration(@NonNull DeviceParameters deviceConfiguration) {
+            public @NonNull Builder setDeviceConfiguration(
+                    @NonNull DeviceParameters deviceConfiguration) {
                 mImpl.setDeviceConfiguration(deviceConfiguration.toProto());
                 return this;
             }
@@ -170,16 +165,14 @@
              * when building the tile.
              */
             @RequiresSchemaVersion(major = 1, minor = 0)
-            @NonNull
-            public Builder setCurrentState(@NonNull State currentState) {
+            public @NonNull Builder setCurrentState(@NonNull State currentState) {
                 mImpl.setCurrentState(currentState.toProto());
                 return this;
             }
 
             /** Sets the ID of the tile being requested. */
             @RequiresSchemaVersion(major = 1, minor = 0)
-            @NonNull
-            public Builder setTileId(int tileId) {
+            public @NonNull Builder setTileId(int tileId) {
                 mImpl.setTileId(tileId);
                 return this;
             }
@@ -191,10 +184,8 @@
              * @deprecated Use {@link setDeviceConfiguration(DeviceParameters)} instead.
              */
             @Deprecated
-            @NonNull
-            public Builder setDeviceParameters(
-                    @NonNull
-                            androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+            public @NonNull Builder setDeviceParameters(
+                    androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
                                     deviceParameters) {
                 mImpl.setDeviceConfiguration(deviceParameters.toProto());
                 return this;
@@ -207,15 +198,14 @@
              * @deprecated Use {@link setCurrentState(State)} instead.
              */
             @Deprecated
-            @NonNull
-            public Builder setState(@NonNull androidx.wear.tiles.StateBuilders.State state) {
+            public @NonNull Builder setState(
+                    androidx.wear.tiles.StateBuilders.@NonNull State state) {
                 mImpl.setCurrentState(state.toProto());
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public TileRequest build() {
+            public @NonNull TileRequest build() {
                 return TileRequest.fromProto(mImpl.build());
             }
         }
@@ -237,8 +227,7 @@
          * Gets the version of the resources being fetched. This is the same as the requested
          * resource version, passed in {@link androidx.wear.tiles.TileBuilders.Tile}.
          */
-        @NonNull
-        public String getVersion() {
+        public @NonNull String getVersion() {
             return mImpl.getVersion();
         }
 
@@ -251,8 +240,7 @@
          * in {@link androidx.wear.protolayout.ResourceBuilders.Resources}.idToImage), not Android
          * resource names or similar.
          */
-        @NonNull
-        public List<String> getResourceIds() {
+        public @NonNull List<String> getResourceIds() {
             return mImpl.getResourceIdsList();
         }
 
@@ -260,8 +248,7 @@
          * Gets the {@link androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters}
          * object describing the device requesting the resources.
          */
-        @NonNull
-        public DeviceParameters getDeviceConfiguration() {
+        public @NonNull DeviceParameters getDeviceConfiguration() {
             if (mImpl.hasDeviceConfiguration()) {
                 return DeviceParameters.fromProto(mImpl.getDeviceConfiguration());
             } else {
@@ -286,9 +273,9 @@
          * @deprecated Use {@link #getDeviceConfiguration()} instead.
          */
         @Deprecated
-        @Nullable
         @SuppressWarnings("deprecation") // for backward compatibility
-        public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters getDeviceParameters() {
+        public androidx.wear.tiles.DeviceParametersBuilders.@Nullable DeviceParameters
+                getDeviceParameters() {
             if (mImpl.hasDeviceConfiguration()) {
                 return androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters.fromProto(
                         mImpl.getDeviceConfiguration());
@@ -299,21 +286,19 @@
 
         /** Creates a new wrapper instance from the proto. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public static ResourcesRequest fromProto(@NonNull RequestProto.ResourcesRequest proto) {
+        public static @NonNull ResourcesRequest fromProto(
+                RequestProto.@NonNull ResourcesRequest proto) {
             return new ResourcesRequest(proto);
         }
 
         /** Returns the internal proto instance. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public RequestProto.ResourcesRequest toProto() {
+        public RequestProto.@NonNull ResourcesRequest toProto() {
             return mImpl;
         }
 
         @Override
-        @NonNull
-        public String toString() {
+        public @NonNull String toString() {
             return "ResourcesRequest{"
                     + "version="
                     + getVersion()
@@ -340,8 +325,7 @@
              * resource version, passed in {@link androidx.wear.tiles.TileBuilders.Tile}.
              */
             @RequiresSchemaVersion(major = 1, minor = 0)
-            @NonNull
-            public Builder setVersion(@NonNull String version) {
+            public @NonNull Builder setVersion(@NonNull String version) {
                 mImpl.setVersion(version);
                 return this;
             }
@@ -357,8 +341,7 @@
              * Android resource names or similar.
              */
             @RequiresSchemaVersion(major = 1, minor = 0)
-            @NonNull
-            public Builder addResourceId(@NonNull String resourceId) {
+            public @NonNull Builder addResourceId(@NonNull String resourceId) {
                 mImpl.addResourceIds(resourceId);
                 return this;
             }
@@ -368,16 +351,15 @@
              * object describing the device requesting the resources.
              */
             @RequiresSchemaVersion(major = 1, minor = 0)
-            @NonNull
-            public Builder setDeviceConfiguration(@NonNull DeviceParameters deviceConfiguration) {
+            public @NonNull Builder setDeviceConfiguration(
+                    @NonNull DeviceParameters deviceConfiguration) {
                 mImpl.setDeviceConfiguration(deviceConfiguration.toProto());
                 return this;
             }
 
             /** Sets the ID of the tile for which resources are being requested. */
             @RequiresSchemaVersion(major = 1, minor = 0)
-            @NonNull
-            public Builder setTileId(int tileId) {
+            public @NonNull Builder setTileId(int tileId) {
                 mImpl.setTileId(tileId);
                 return this;
             }
@@ -389,19 +371,16 @@
              * @deprecated Use {@link setDeviceConfiguration(DeviceParameters)} instead.
              */
             @Deprecated
-            @NonNull
             @SuppressWarnings("deprecation") // for backward compatibility
-            public Builder setDeviceParameters(
-                    @NonNull
-                            androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+            public @NonNull Builder setDeviceParameters(
+                    androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
                                     deviceParameters) {
                 mImpl.setDeviceConfiguration(deviceParameters.toProto());
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public ResourcesRequest build() {
+            public @NonNull ResourcesRequest build() {
                 return ResourcesRequest.fromProto(mImpl.build());
             }
         }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourceBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourceBuilders.java
index 8979d32..846cf7d 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourceBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourceBuilders.java
@@ -23,14 +23,15 @@
 import androidx.annotation.Dimension;
 import androidx.annotation.DrawableRes;
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.proto.ResourceProto;
 import androidx.wear.protolayout.protobuf.ByteString;
 import androidx.wear.protolayout.protobuf.InvalidProtocolBufferException;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.Collections;
@@ -79,14 +80,12 @@
             return mImpl.getResourceId();
         }
 
-        @NonNull
-        static AndroidImageResourceByResId fromProto(
-                @NonNull ResourceProto.AndroidImageResourceByResId proto) {
+        static @NonNull AndroidImageResourceByResId fromProto(
+                ResourceProto.@NonNull AndroidImageResourceByResId proto) {
             return new AndroidImageResourceByResId(proto);
         }
 
-        @NonNull
-        ResourceProto.AndroidImageResourceByResId toProto() {
+        ResourceProto.@NonNull AndroidImageResourceByResId toProto() {
             return mImpl;
         }
 
@@ -101,15 +100,13 @@
              * Sets the Android resource ID of this image. This must refer to a drawable under
              * R.drawable.
              */
-            @NonNull
-            public Builder setResourceId(@DrawableRes int resourceId) {
+            public @NonNull Builder setResourceId(@DrawableRes int resourceId) {
                 mImpl.setResourceId(resourceId);
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public AndroidImageResourceByResId build() {
+            public @NonNull AndroidImageResourceByResId build() {
                 return AndroidImageResourceByResId.fromProto(mImpl.build());
             }
         }
@@ -127,8 +124,7 @@
         }
 
         /** Gets the byte array representing the image. Intended for testing purposes only. */
-        @NonNull
-        public byte[] getData() {
+        public byte @NonNull [] getData() {
             return mImpl.getData().toByteArray();
         }
 
@@ -163,13 +159,12 @@
             return mImpl.getFormat().getNumber();
         }
 
-        @NonNull
-        static InlineImageResource fromProto(@NonNull ResourceProto.InlineImageResource proto) {
+        static @NonNull InlineImageResource fromProto(
+                ResourceProto.@NonNull InlineImageResource proto) {
             return new InlineImageResource(proto);
         }
 
-        @NonNull
-        ResourceProto.InlineImageResource toProto() {
+        ResourceProto.@NonNull InlineImageResource toProto() {
             return mImpl;
         }
 
@@ -181,8 +176,7 @@
             public Builder() {}
 
             /** Sets the byte array representing the image. */
-            @NonNull
-            public Builder setData(@NonNull byte[] data) {
+            public @NonNull Builder setData(byte @NonNull [] data) {
                 mImpl.setData(ByteString.copyFrom(data));
                 return this;
             }
@@ -191,8 +185,7 @@
              * Sets the native width of the image, in pixels. Only required for formats (e.g.
              * IMAGE_FORMAT_RGB_565) where the image data does not include size.
              */
-            @NonNull
-            public Builder setWidthPx(@Dimension(unit = PX) int widthPx) {
+            public @NonNull Builder setWidthPx(@Dimension(unit = PX) int widthPx) {
                 mImpl.setWidthPx(widthPx);
                 return this;
             }
@@ -201,8 +194,7 @@
              * Sets the native height of the image, in pixels. Only required for formats (e.g.
              * IMAGE_FORMAT_RGB_565) where the image data does not include size.
              */
-            @NonNull
-            public Builder setHeightPx(@Dimension(unit = PX) int heightPx) {
+            public @NonNull Builder setHeightPx(@Dimension(unit = PX) int heightPx) {
                 mImpl.setHeightPx(heightPx);
                 return this;
             }
@@ -213,15 +205,13 @@
              * to extract this from the raw image data. If the platform does not support the format,
              * the image will not be decoded or displayed.
              */
-            @NonNull
-            public Builder setFormat(@ImageFormat int format) {
+            public @NonNull Builder setFormat(@ImageFormat int format) {
                 mImpl.setFormat(ResourceProto.ImageFormat.forNumber(format));
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public InlineImageResource build() {
+            public @NonNull InlineImageResource build() {
                 return InlineImageResource.fromProto(mImpl.build());
             }
         }
@@ -242,8 +232,7 @@
          * Gets an image resource that maps to an Android drawable by resource ID. Intended for
          * testing purposes only.
          */
-        @Nullable
-        public AndroidImageResourceByResId getAndroidResourceByResId() {
+        public @Nullable AndroidImageResourceByResId getAndroidResourceByResId() {
             if (mImpl.hasAndroidResourceByResId()) {
                 return AndroidImageResourceByResId.fromProto(mImpl.getAndroidResourceByResId());
             } else {
@@ -255,8 +244,7 @@
          * Gets an image resource that contains the image data inline. Intended for testing purposes
          * only.
          */
-        @Nullable
-        public InlineImageResource getInlineResource() {
+        public @Nullable InlineImageResource getInlineResource() {
             if (mImpl.hasInlineResource()) {
                 return InlineImageResource.fromProto(mImpl.getInlineResource());
             } else {
@@ -264,13 +252,11 @@
             }
         }
 
-        @NonNull
-        static ImageResource fromProto(@NonNull ResourceProto.ImageResource proto) {
+        static @NonNull ImageResource fromProto(ResourceProto.@NonNull ImageResource proto) {
             return new ImageResource(proto);
         }
 
-        @NonNull
-        ResourceProto.ImageResource toProto() {
+        ResourceProto.@NonNull ImageResource toProto() {
             return mImpl;
         }
 
@@ -282,23 +268,20 @@
             public Builder() {}
 
             /** Sets an image resource that maps to an Android drawable by resource ID. */
-            @NonNull
-            public Builder setAndroidResourceByResId(
+            public @NonNull Builder setAndroidResourceByResId(
                     @NonNull AndroidImageResourceByResId androidResourceByResId) {
                 mImpl.setAndroidResourceByResId(androidResourceByResId.toProto());
                 return this;
             }
 
             /** Sets an image resource that contains the image data inline. */
-            @NonNull
-            public Builder setInlineResource(@NonNull InlineImageResource inlineResource) {
+            public @NonNull Builder setInlineResource(@NonNull InlineImageResource inlineResource) {
                 mImpl.setInlineResource(inlineResource.toProto());
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public ImageResource build() {
+            public @NonNull ImageResource build() {
                 return ImageResource.fromProto(mImpl.build());
             }
         }
@@ -324,8 +307,7 @@
          * androidx.wear.tiles.RequestBuilders.ResourcesRequest} which triggered this request.
          * Intended for testing purposes only.
          */
-        @NonNull
-        public String getVersion() {
+        public @NonNull String getVersion() {
             return mImpl.getVersion();
         }
 
@@ -333,8 +315,7 @@
          * Gets a map of resource_ids to images, which can be used by layouts. Intended for testing
          * purposes only.
          */
-        @NonNull
-        public Map<String, ImageResource> getIdToImageMapping() {
+        public @NonNull Map<String, ImageResource> getIdToImageMapping() {
             Map<String, ImageResource> map = new HashMap<>();
             for (Entry<String, ResourceProto.ImageResource> entry :
                     mImpl.getIdToImageMap().entrySet()) {
@@ -344,17 +325,15 @@
         }
 
         /** Converts to byte array representation. */
-        @NonNull
         @TilesExperimental
-        public byte[] toByteArray() {
+        public byte @NonNull [] toByteArray() {
             return mImpl.toByteArray();
         }
 
         /** Converts from byte array representation. */
         @SuppressWarnings("ProtoParseWithRegistry")
-        @Nullable
         @TilesExperimental
-        public static Resources fromByteArray(@NonNull byte[] byteArray) {
+        public static @Nullable Resources fromByteArray(byte @NonNull [] byteArray) {
             try {
                 return fromProto(ResourceProto.Resources.parseFrom(byteArray));
             } catch (InvalidProtocolBufferException e) {
@@ -363,15 +342,13 @@
         }
 
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public static Resources fromProto(@NonNull ResourceProto.Resources proto) {
+        public static @NonNull Resources fromProto(ResourceProto.@NonNull Resources proto) {
             return new Resources(proto);
         }
 
         /** Returns the internal proto instance. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public ResourceProto.Resources toProto() {
+        public ResourceProto.@NonNull Resources toProto() {
             return mImpl;
         }
 
@@ -393,23 +370,21 @@
              * tile to render successfully, and must match the resource version specified in {@link
              * androidx.wear.tiles.RequestBuilders.ResourcesRequest} which triggered this request.
              */
-            @NonNull
-            public Builder setVersion(@NonNull String version) {
+            public @NonNull Builder setVersion(@NonNull String version) {
                 mImpl.setVersion(version);
                 return this;
             }
 
             /** Adds an entry into a map of resource_ids to images, which can be used by layouts. */
             @SuppressLint("MissingGetterMatchingBuilder")
-            @NonNull
-            public Builder addIdToImageMapping(@NonNull String id, @NonNull ImageResource image) {
+            public @NonNull Builder addIdToImageMapping(@NonNull String id,
+                    @NonNull ImageResource image) {
                 mImpl.putIdToImage(id, image.toProto());
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public Resources build() {
+            public @NonNull Resources build() {
                 return Resources.fromProto(mImpl.build());
             }
         }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesData.java
index d103204..98839a0 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesData.java
@@ -16,9 +16,10 @@
 
 package androidx.wear.tiles;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * Holder for Tiles' Resources class, to be parceled and transferred to Wear.
  *
@@ -31,7 +32,7 @@
     public static final Creator<ResourcesData> CREATOR =
             newCreator(ResourcesData.class, ResourcesData::new);
 
-    public ResourcesData(@NonNull byte[] payload, int version) {
+    public ResourcesData(byte @NonNull [] payload, int version) {
         super(payload, version);
     }
 }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesRequestData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesRequestData.java
index c314400..665d180 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesRequestData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesRequestData.java
@@ -16,9 +16,10 @@
 
 package androidx.wear.tiles;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * Holder for Tiles' ResourceRequest class, to be parceled and transferred to a Tile Service.
  *
@@ -30,7 +31,7 @@
     public static final Creator<ResourcesRequestData> CREATOR =
             newCreator(ResourcesRequestData.class, ResourcesRequestData::new);
 
-    public ResourcesRequestData(@NonNull byte[] params, int version) {
+    public ResourcesRequestData(byte @NonNull [] params, int version) {
         super(params, version);
     }
 }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/StateBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/StateBuilders.java
index 3798263..48fa917 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/StateBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/StateBuilders.java
@@ -16,13 +16,14 @@
 
 package androidx.wear.tiles;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
 import androidx.wear.protolayout.proto.StateProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Builders for state of a tile.
  *
@@ -35,7 +36,7 @@
     /** {@link State} information. */
     public static final class State {
         private final StateProto.State mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         State(StateProto.State impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -43,27 +44,23 @@
         }
 
         /** Gets the ID of the clickable that was last clicked. */
-        @NonNull
-        public String getLastClickableId() {
+        public @NonNull String getLastClickableId() {
             return mImpl.getLastClickableId();
         }
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public static State fromProto(@NonNull StateProto.State proto) {
+        public static @NonNull State fromProto(StateProto.@NonNull State proto) {
             return new State(proto, null);
         }
 
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public StateProto.State toProto() {
+        public StateProto.@NonNull State toProto() {
             return mImpl;
         }
 
@@ -75,8 +72,7 @@
             public Builder() {}
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public State build() {
+            public @NonNull State build() {
                 return new State(mImpl.build(), mFingerprint);
             }
         }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java
index b2f3ab5..c24a580 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java
@@ -35,8 +35,9 @@
 import android.util.Log;
 
 import androidx.annotation.GuardedBy;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
+
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -128,8 +129,7 @@
         }
     }
 
-    @Nullable
-    private Intent buildUpdateBindIntent() {
+    private @Nullable Intent buildUpdateBindIntent() {
         Intent bindIntent = new Intent(ACTION_BIND_UPDATE_REQUESTER);
         bindIntent.setPackage(getSysUiPackageName());
 
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java
index 517a473..220c401 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java
@@ -16,9 +16,10 @@
 
 package androidx.wear.tiles;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * Holder for Tiles' TileAddEvent class, to be parceled and transferred to a Tile Service.
  *
@@ -30,7 +31,7 @@
     public static final Creator<TileAddEventData> CREATOR =
             newCreator(TileAddEventData.class, TileAddEventData::new);
 
-    public TileAddEventData(@NonNull byte[] params, int version) {
+    public TileAddEventData(byte @NonNull [] params, int version) {
         super(params, version);
     }
 }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileBuilders.java
index bf1dcec..d8607e9 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileBuilders.java
@@ -16,8 +16,6 @@
 
 package androidx.wear.tiles;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.StateBuilders.State;
@@ -26,6 +24,9 @@
 import androidx.wear.protolayout.expression.proto.VersionProto.VersionInfo;
 import androidx.wear.tiles.proto.TileProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /** Builders for the components of a tile that can be rendered by a tile renderer. */
 public final class TileBuilders {
     private TileBuilders() {}
@@ -48,8 +49,7 @@
          * androidx.wear.tiles.RequestBuilders.ResourcesRequest} if the system does not have a copy
          * of the specified resource version.
          */
-        @NonNull
-        public String getResourcesVersion() {
+        public @NonNull String getResourcesVersion() {
             return mImpl.getResourcesVersion();
         }
 
@@ -57,8 +57,7 @@
          * Gets the {@link androidx.wear.protolayout.TimelineBuilders.Timeline} containing the
          * layouts for the tiles to show in the carousel, along with their validity periods.
          */
-        @Nullable
-        public Timeline getTileTimeline() {
+        public @Nullable Timeline getTileTimeline() {
             if (mImpl.hasTileTimeline()) {
                 return Timeline.fromProto(mImpl.getTileTimeline());
             } else {
@@ -84,8 +83,7 @@
         }
 
         /** Gets {@link androidx.wear.protolayout.StateBuilders.State} for this tile. */
-        @Nullable
-        public State getState() {
+        public @Nullable State getState() {
             if (mImpl.hasState()) {
                 return State.fromProto(mImpl.getState());
             } else {
@@ -100,9 +98,8 @@
          * @deprecated Use {@link #getTileTimeline()} instead.
          */
         @Deprecated
-        @Nullable
         @SuppressWarnings("deprecation") // for backward compatibility
-        public androidx.wear.tiles.TimelineBuilders.Timeline getTimeline() {
+        public androidx.wear.tiles.TimelineBuilders.@Nullable Timeline getTimeline() {
             if (mImpl.hasTileTimeline()) {
                 return androidx.wear.tiles.TimelineBuilders.Timeline.fromProto(
                         mImpl.getTileTimeline());
@@ -113,21 +110,18 @@
 
         /** Creates a new wrapper instance from the proto. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public static Tile fromProto(@NonNull TileProto.Tile proto) {
+        public static @NonNull Tile fromProto(TileProto.@NonNull Tile proto) {
             return new Tile(proto);
         }
 
         /** Returns the internal proto instance. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public TileProto.Tile toProto() {
+        public TileProto.@NonNull Tile toProto() {
             return mImpl;
         }
 
         @Override
-        @NonNull
-        public String toString() {
+        public @NonNull String toString() {
             return "Tile{"
                     + "resourcesVersion="
                     + getResourcesVersion()
@@ -155,8 +149,7 @@
              * copy of the specified resource version.
              */
             @RequiresSchemaVersion(major = 1, minor = 0)
-            @NonNull
-            public Builder setResourcesVersion(@NonNull String resourcesVersion) {
+            public @NonNull Builder setResourcesVersion(@NonNull String resourcesVersion) {
                 mImpl.setResourcesVersion(resourcesVersion);
                 return this;
             }
@@ -166,8 +159,7 @@
              * layouts for the tiles to show in the carousel, along with their validity periods.
              */
             @RequiresSchemaVersion(major = 1, minor = 0)
-            @NonNull
-            public Builder setTileTimeline(@NonNull Timeline tileTimeline) {
+            public @NonNull Builder setTileTimeline(@NonNull Timeline tileTimeline) {
                 mImpl.setTileTimeline(tileTimeline.toProto());
                 return this;
             }
@@ -186,16 +178,14 @@
              * due to system-level optimizations.
              */
             @RequiresSchemaVersion(major = 1, minor = 0)
-            @NonNull
-            public Builder setFreshnessIntervalMillis(long freshnessIntervalMillis) {
+            public @NonNull Builder setFreshnessIntervalMillis(long freshnessIntervalMillis) {
                 mImpl.setFreshnessIntervalMillis(freshnessIntervalMillis);
                 return this;
             }
 
             /** Sets {@link androidx.wear.protolayout.StateBuilders.State} for this tile. */
             @RequiresSchemaVersion(major = 1, minor = 200)
-            @NonNull
-            public Builder setState(@NonNull State state) {
+            public @NonNull Builder setState(@NonNull State state) {
                 mImpl.setState(state.toProto());
                 return this;
             }
@@ -207,16 +197,14 @@
              * @deprecated Use {@link #setTileTimeline(Timeline)} instead.
              */
             @Deprecated
-            @NonNull
-            public Builder setTimeline(
-                    @NonNull androidx.wear.tiles.TimelineBuilders.Timeline timeline) {
+            public @NonNull Builder setTimeline(
+                    androidx.wear.tiles.TimelineBuilders.@NonNull Timeline timeline) {
                 mImpl.setTileTimeline(timeline.toProto());
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public Tile build() {
+            public @NonNull Tile build() {
                 return Tile.fromProto(mImpl.build());
             }
         }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileData.java
index d6dbca0..beb1a7d 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileData.java
@@ -16,9 +16,10 @@
 
 package androidx.wear.tiles;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * Holder for Tiles' Tile class, to be parceled and transferred to Wear.
  *
@@ -29,7 +30,7 @@
     public static final int VERSION_PROTOBUF = 1;
     public static final Creator<TileData> CREATOR = newCreator(TileData.class, TileData::new);
 
-    public TileData(@NonNull byte[] tile, int version) {
+    public TileData(byte @NonNull [] tile, int version) {
         super(tile, version);
     }
 }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java
index 052dd79..f2cba65 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java
@@ -16,9 +16,10 @@
 
 package androidx.wear.tiles;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * Holder for Tiles' TileEnterEvent class, to be parceled and transferred to a Tile Service.
  *
@@ -30,7 +31,7 @@
     public static final Creator<TileEnterEventData> CREATOR =
             newCreator(TileEnterEventData.class, TileEnterEventData::new);
 
-    public TileEnterEventData(@NonNull byte[] params, int version) {
+    public TileEnterEventData(byte @NonNull [] params, int version) {
         super(params, version);
     }
 }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileInteractionEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileInteractionEventData.java
index 53f32ff..2ca9682 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileInteractionEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileInteractionEventData.java
@@ -15,9 +15,10 @@
  */
 package androidx.wear.tiles;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * Holder for Tiles' TileInteractionEvent class, to be parceled and transferred to a Tile Service.
  *
@@ -29,7 +30,7 @@
     public static final Creator<TileInteractionEventData> CREATOR =
             newCreator(TileInteractionEventData.class, TileInteractionEventData::new);
 
-    public TileInteractionEventData(@NonNull byte[] params, int version) {
+    public TileInteractionEventData(byte @NonNull [] params, int version) {
         super(params, version);
     }
 }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileLeaveEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileLeaveEventData.java
index 476cd9a..0edd237 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileLeaveEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileLeaveEventData.java
@@ -16,9 +16,10 @@
 
 package androidx.wear.tiles;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * Holder for Tiles' TileLeaveEvent class, to be parceled and transferred to a Tile Service.
  *
@@ -30,7 +31,7 @@
     public static final Creator<TileLeaveEventData> CREATOR =
             newCreator(TileLeaveEventData.class, TileLeaveEventData::new);
 
-    public TileLeaveEventData(@NonNull byte[] params, int version) {
+    public TileLeaveEventData(byte @NonNull [] params, int version) {
         super(params, version);
     }
 }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java
index fc6152c..6d97a2c 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java
@@ -16,9 +16,10 @@
 
 package androidx.wear.tiles;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * Holder for Tiles' TileRemoveEvent class, to be parceled and transferred to a Tile Service.
  *
@@ -30,7 +31,7 @@
     public static final Creator<TileRemoveEventData> CREATOR =
             newCreator(TileRemoveEventData.class, TileRemoveEventData::new);
 
-    public TileRemoveEventData(@NonNull byte[] params, int version) {
+    public TileRemoveEventData(byte @NonNull [] params, int version) {
         super(params, version);
     }
 }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRequestData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRequestData.java
index e4d83ae..352e188 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRequestData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRequestData.java
@@ -16,9 +16,10 @@
 
 package androidx.wear.tiles;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * Holder for Tiles' TileRequest class, to be parceled and transferred to a Tile Service.
  *
@@ -30,7 +31,7 @@
     public static final Creator<TileRequestData> CREATOR =
             newCreator(TileRequestData.class, TileRequestData::new);
 
-    public TileRequestData(@NonNull byte[] params, int version) {
+    public TileRequestData(byte @NonNull [] params, int version) {
         super(params, version);
     }
 }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileService.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileService.java
index e85f9ae..37c203e 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileService.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileService.java
@@ -29,8 +29,6 @@
 import android.util.Log;
 
 import androidx.annotation.MainThread;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.VisibleForTesting;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
@@ -57,6 +55,9 @@
 import com.google.wear.services.tiles.TileInstance;
 import com.google.wear.services.tiles.TilesManager;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.ref.WeakReference;
 import java.time.Duration;
 import java.util.ArrayList;
@@ -152,8 +153,8 @@
      * @param requestParams Parameters about the request. See {@link TileRequest} for more info.
      */
     @MainThread
-    @NonNull
-    protected abstract ListenableFuture<Tile> onTileRequest(@NonNull TileRequest requestParams);
+    protected abstract @NonNull ListenableFuture<Tile> onTileRequest(
+            @NonNull TileRequest requestParams);
 
     /**
      * Called when the system is requesting a resource bundle from this Tile Provider. The returned
@@ -167,10 +168,9 @@
      * @deprecated Use {@link #onTileResourcesRequest} instead.
      */
     @MainThread
-    @NonNull
     @Deprecated
-    protected ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources> onResourcesRequest(
-            @NonNull ResourcesRequest requestParams) {
+    protected @NonNull ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources>
+    onResourcesRequest(@NonNull ResourcesRequest requestParams) {
         return ON_RESOURCES_REQUEST_NOT_IMPLEMENTED;
     }
 
@@ -190,9 +190,8 @@
      *     info.
      */
     @MainThread
-    @NonNull
     @SuppressWarnings({"AsyncSuffixFuture", "deprecation"}) // For backward compatibility
-    protected ListenableFuture<Resources> onTileResourcesRequest(
+    protected @NonNull ListenableFuture<Resources> onTileResourcesRequest(
             @NonNull ResourcesRequest requestParams) {
         // We are offering a default implementation for onTileResourcesRequest for backward
         // compatibility as older clients are overriding onResourcesRequest.
@@ -280,8 +279,7 @@
      *
      * @param context The application context.
      */
-    @NonNull
-    public static TileUpdateRequester getUpdater(@NonNull Context context) {
+    public static @NonNull TileUpdateRequester getUpdater(@NonNull Context context) {
 
         List<TileUpdateRequester> requesters = new ArrayList<>();
         requesters.add(new SysUiTileUpdateRequester(context));
@@ -313,8 +311,7 @@
      *     context} present in the carousel, or a value based on platform-specific fallback
      *     behavior.
      */
-    @NonNull
-    public static ListenableFuture<List<ActiveTileIdentifier>> getActiveTilesAsync(
+    public static @NonNull ListenableFuture<List<ActiveTileIdentifier>> getActiveTilesAsync(
             @NonNull Context context, @NonNull Executor executor) {
         if (useWearSdkImpl(context)
                 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
@@ -325,8 +322,7 @@
     }
 
     @VisibleForTesting
-    @NonNull
-    static ListenableFuture<List<ActiveTileIdentifier>> getActiveTilesAsyncLegacy(
+    static @NonNull ListenableFuture<List<ActiveTileIdentifier>> getActiveTilesAsyncLegacy(
             @NonNull Context context,
             @NonNull Executor executor,
             @NonNull TimeSourceClock timeSourceClock) {
@@ -344,8 +340,7 @@
     private TileProvider.Stub mBinder;
 
     @Override
-    @Nullable
-    public IBinder onBind(@NonNull Intent intent) {
+    public @Nullable IBinder onBind(@NonNull Intent intent) {
         if (ACTION_BIND_TILE_PROVIDER.equals(intent.getAction())) {
             if (mBinder == null) {
                 mBinder = new TileProviderWrapper(this, new Handler(getMainLooper()));
@@ -697,8 +692,7 @@
                     });
         }
 
-        @NonNull
-        private static Optional<TileInteractionEvent> tileInteractionEventFromProto(
+        private static @NonNull Optional<TileInteractionEvent> tileInteractionEventFromProto(
                 TileInteractionEventData data) {
             try {
                 return Optional.of(
@@ -755,8 +749,7 @@
 
     @RequiresApi(34)
     private static class Api34Impl {
-        @NonNull
-        static ListenableFuture<List<ActiveTileIdentifier>> getActiveTilesAsync(
+        static @NonNull ListenableFuture<List<ActiveTileIdentifier>> getActiveTilesAsync(
                 @NonNull TilesManager tilesManager, @NonNull Executor executor) {
             return CallbackToFutureAdapter.getFuture(
                     completer -> {
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequestData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequestData.java
index 1907b70..d2e7c82 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequestData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequestData.java
@@ -16,9 +16,10 @@
 
 package androidx.wear.tiles;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * Holder for parameters, used when a Tile update request is triggered. This is currently a
  * placeholder to allow for future expansion, and should be filled in with an empty byte array.
@@ -30,7 +31,7 @@
     public static final Creator<TileUpdateRequestData> CREATOR =
             newCreator(TileUpdateRequestData.class, TileUpdateRequestData::new);
 
-    private TileUpdateRequestData(@NonNull byte[] params, int version) {
+    private TileUpdateRequestData(byte @NonNull [] params, int version) {
         super(params, version);
     }
 
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequester.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequester.java
index 23f8def..bf0a573 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequester.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequester.java
@@ -16,7 +16,7 @@
 
 package androidx.wear.tiles;
 
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
 
 /**
  * Interface used for a Tile Service to notify a Tile Renderer that it should fetch a new Timeline
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TimelineBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TimelineBuilders.java
index 9ec8f9e..d5da952 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TimelineBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TimelineBuilders.java
@@ -16,12 +16,13 @@
 
 package androidx.wear.tiles;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.proto.TimelineProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -62,13 +63,11 @@
             return mImpl.getEndMillis();
         }
 
-        @NonNull
-        static TimeInterval fromProto(@NonNull TimelineProto.TimeInterval proto) {
+        static @NonNull TimeInterval fromProto(TimelineProto.@NonNull TimeInterval proto) {
             return new TimeInterval(proto);
         }
 
-        @NonNull
-        TimelineProto.TimeInterval toProto() {
+        TimelineProto.@NonNull TimeInterval toProto() {
             return mImpl;
         }
 
@@ -80,22 +79,19 @@
             public Builder() {}
 
             /** Sets starting point of the time interval, in milliseconds since the Unix epoch. */
-            @NonNull
-            public Builder setStartMillis(long startMillis) {
+            public @NonNull Builder setStartMillis(long startMillis) {
                 mImpl.setStartMillis(startMillis);
                 return this;
             }
 
             /** Sets end point of the time interval, in milliseconds since the Unix epoch. */
-            @NonNull
-            public Builder setEndMillis(long endMillis) {
+            public @NonNull Builder setEndMillis(long endMillis) {
                 mImpl.setEndMillis(endMillis);
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public TimeInterval build() {
+            public @NonNull TimeInterval build() {
                 return TimeInterval.fromProto(mImpl.build());
             }
         }
@@ -110,8 +106,7 @@
         }
 
         /** Gets the validity period for this timeline entry. Intended for testing purposes only. */
-        @Nullable
-        public TimeInterval getValidity() {
+        public @Nullable TimeInterval getValidity() {
             if (mImpl.hasValidity()) {
                 return TimeInterval.fromProto(mImpl.getValidity());
             } else {
@@ -120,8 +115,7 @@
         }
 
         /** Gets the contents of this timeline entry. Intended for testing purposes only. */
-        @Nullable
-        public LayoutElementBuilders.Layout getLayout() {
+        public LayoutElementBuilders.@Nullable Layout getLayout() {
             if (mImpl.hasLayout()) {
                 return LayoutElementBuilders.Layout.fromProto(mImpl.getLayout());
             } else {
@@ -130,23 +124,20 @@
         }
 
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public static TimelineEntry fromProto(@NonNull TimelineProto.TimelineEntry proto) {
+        public static @NonNull TimelineEntry fromProto(TimelineProto.@NonNull TimelineEntry proto) {
             return new TimelineEntry(proto);
         }
 
         /** Returns the {@link TimelineEntry} object containing the given layout element. */
-        @NonNull
-        public static TimelineEntry fromLayoutElement(
-                @NonNull LayoutElementBuilders.LayoutElement layoutElement) {
+        public static @NonNull TimelineEntry fromLayoutElement(
+                LayoutElementBuilders.@NonNull LayoutElement layoutElement) {
             return new Builder()
                     .setLayout(LayoutElementBuilders.Layout.fromLayoutElement(layoutElement))
                     .build();
         }
 
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public TimelineProto.TimelineEntry toProto() {
+        public TimelineProto.@NonNull TimelineEntry toProto() {
             return mImpl;
         }
 
@@ -158,22 +149,19 @@
             public Builder() {}
 
             /** Sets the validity period for this timeline entry. */
-            @NonNull
-            public Builder setValidity(@NonNull TimeInterval validity) {
+            public @NonNull Builder setValidity(@NonNull TimeInterval validity) {
                 mImpl.setValidity(validity.toProto());
                 return this;
             }
 
             /** Sets the contents of this timeline entry. */
-            @NonNull
-            public Builder setLayout(@NonNull LayoutElementBuilders.Layout layout) {
+            public @NonNull Builder setLayout(LayoutElementBuilders.@NonNull Layout layout) {
                 mImpl.setLayout(layout.toProto());
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public TimelineEntry build() {
+            public @NonNull TimelineEntry build() {
                 return TimelineEntry.fromProto(mImpl.build());
             }
         }
@@ -201,8 +189,7 @@
         }
 
         /** Gets the entries in a timeline. Intended for testing purposes only. */
-        @NonNull
-        public List<TimelineEntry> getTimelineEntries() {
+        public @NonNull List<TimelineEntry> getTimelineEntries() {
             List<TimelineEntry> list = new ArrayList<>();
             for (TimelineProto.TimelineEntry item : mImpl.getTimelineEntriesList()) {
                 list.add(TimelineEntry.fromProto(item));
@@ -211,23 +198,20 @@
         }
 
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public static Timeline fromProto(@NonNull TimelineProto.Timeline proto) {
+        public static @NonNull Timeline fromProto(TimelineProto.@NonNull Timeline proto) {
             return new Timeline(proto);
         }
 
         /** Returns the {@link Timeline} object containing the given layout element. */
-        @NonNull
-        public static Timeline fromLayoutElement(
-                @NonNull LayoutElementBuilders.LayoutElement layoutElement) {
+        public static @NonNull Timeline fromLayoutElement(
+                LayoutElementBuilders.@NonNull LayoutElement layoutElement) {
             return new Builder()
                     .addTimelineEntry(TimelineEntry.fromLayoutElement(layoutElement))
                     .build();
         }
 
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public TimelineProto.Timeline toProto() {
+        public TimelineProto.@NonNull Timeline toProto() {
             return mImpl;
         }
 
@@ -239,15 +223,13 @@
             public Builder() {}
 
             /** Adds one item to the entries in a timeline. */
-            @NonNull
-            public Builder addTimelineEntry(@NonNull TimelineEntry timelineEntry) {
+            public @NonNull Builder addTimelineEntry(@NonNull TimelineEntry timelineEntry) {
                 mImpl.addTimelineEntries(timelineEntry.toProto());
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public Timeline build() {
+            public @NonNull Timeline build() {
                 return Timeline.fromProto(mImpl.build());
             }
         }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TypeBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TypeBuilders.java
index 60c066c..a0f0a19 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TypeBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TypeBuilders.java
@@ -18,13 +18,14 @@
 
 import android.annotation.SuppressLint;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.wear.protolayout.expression.Fingerprint;
 import androidx.wear.protolayout.proto.TypesProto;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Builders for extensible primitive types used by layout elements.
  *
@@ -37,7 +38,7 @@
     /** An int32 type. */
     public static final class Int32Prop {
         private final TypesProto.Int32Prop mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         Int32Prop(TypesProto.Int32Prop impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -51,18 +52,15 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static Int32Prop fromProto(@NonNull TypesProto.Int32Prop proto) {
+        static @NonNull Int32Prop fromProto(TypesProto.@NonNull Int32Prop proto) {
             return new Int32Prop(proto, null);
         }
 
-        @NonNull
-        TypesProto.Int32Prop toProto() {
+        TypesProto.@NonNull Int32Prop toProto() {
             return mImpl;
         }
 
@@ -74,16 +72,14 @@
             public Builder() {}
 
             /** Sets the value. */
-            @NonNull
-            public Builder setValue(int value) {
+            public @NonNull Builder setValue(int value) {
                 mImpl.setValue(value);
                 mFingerprint.recordPropertyUpdate(1, value);
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public Int32Prop build() {
+            public @NonNull Int32Prop build() {
                 return new Int32Prop(mImpl.build(), mFingerprint);
             }
         }
@@ -92,7 +88,7 @@
     /** A string type. */
     public static final class StringProp {
         private final TypesProto.StringProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         StringProp(TypesProto.StringProp impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -100,25 +96,21 @@
         }
 
         /** Gets the value. Intended for testing purposes only. */
-        @NonNull
-        public String getValue() {
+        public @NonNull String getValue() {
             return mImpl.getValue();
         }
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static StringProp fromProto(@NonNull TypesProto.StringProp proto) {
+        static @NonNull StringProp fromProto(TypesProto.@NonNull StringProp proto) {
             return new StringProp(proto, null);
         }
 
-        @NonNull
-        TypesProto.StringProp toProto() {
+        TypesProto.@NonNull StringProp toProto() {
             return mImpl;
         }
 
@@ -130,16 +122,14 @@
             public Builder() {}
 
             /** Sets the value. */
-            @NonNull
-            public Builder setValue(@NonNull String value) {
+            public @NonNull Builder setValue(@NonNull String value) {
                 mImpl.setValue(value);
                 mFingerprint.recordPropertyUpdate(1, value.hashCode());
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public StringProp build() {
+            public @NonNull StringProp build() {
                 return new StringProp(mImpl.build(), mFingerprint);
             }
         }
@@ -148,7 +138,7 @@
     /** A float type. */
     public static final class FloatProp {
         private final TypesProto.FloatProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         FloatProp(TypesProto.FloatProp impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -162,18 +152,15 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static FloatProp fromProto(@NonNull TypesProto.FloatProp proto) {
+        static @NonNull FloatProp fromProto(TypesProto.@NonNull FloatProp proto) {
             return new FloatProp(proto, null);
         }
 
-        @NonNull
-        TypesProto.FloatProp toProto() {
+        TypesProto.@NonNull FloatProp toProto() {
             return mImpl;
         }
 
@@ -185,16 +172,14 @@
             public Builder() {}
 
             /** Sets the value. */
-            @NonNull
-            public Builder setValue(float value) {
+            public @NonNull Builder setValue(float value) {
                 mImpl.setValue(value);
                 mFingerprint.recordPropertyUpdate(1, Float.floatToIntBits(value));
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public FloatProp build() {
+            public @NonNull FloatProp build() {
                 return new FloatProp(mImpl.build(), mFingerprint);
             }
         }
@@ -203,7 +188,7 @@
     /** A boolean type. */
     public static final class BoolProp {
         private final TypesProto.BoolProp mImpl;
-        @Nullable private final Fingerprint mFingerprint;
+        private final @Nullable Fingerprint mFingerprint;
 
         BoolProp(TypesProto.BoolProp impl, @Nullable Fingerprint fingerprint) {
             this.mImpl = impl;
@@ -217,18 +202,15 @@
 
         /** Get the fingerprint for this object, or null if unknown. */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        @Nullable
-        public Fingerprint getFingerprint() {
+        public @Nullable Fingerprint getFingerprint() {
             return mFingerprint;
         }
 
-        @NonNull
-        static BoolProp fromProto(@NonNull TypesProto.BoolProp proto) {
+        static @NonNull BoolProp fromProto(TypesProto.@NonNull BoolProp proto) {
             return new BoolProp(proto, null);
         }
 
-        @NonNull
-        TypesProto.BoolProp toProto() {
+        TypesProto.@NonNull BoolProp toProto() {
             return mImpl;
         }
 
@@ -241,16 +223,14 @@
 
             /** Sets the value. */
             @SuppressLint("MissingGetterMatchingBuilder")
-            @NonNull
-            public Builder setValue(boolean value) {
+            public @NonNull Builder setValue(boolean value) {
                 mImpl.setValue(value);
                 mFingerprint.recordPropertyUpdate(1, Boolean.hashCode(value));
                 return this;
             }
 
             /** Builds an instance from accumulated values. */
-            @NonNull
-            public BoolProp build() {
+            public @NonNull BoolProp build() {
                 return new BoolProp(mImpl.build(), mFingerprint);
             }
         }
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ViewerTileUpdateRequester.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ViewerTileUpdateRequester.java
index cffb82d..a18a073 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ViewerTileUpdateRequester.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ViewerTileUpdateRequester.java
@@ -19,7 +19,7 @@
 import android.content.Context;
 import android.content.Intent;
 
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
 
 /**
  * {@link TileUpdateRequester} which notifies the viewer that it should fetch a new version of the
diff --git a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/CompositeTileUpdateRequesterTest.java b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/CompositeTileUpdateRequesterTest.java
index 5c0133e..5d62133 100644
--- a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/CompositeTileUpdateRequesterTest.java
+++ b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/CompositeTileUpdateRequesterTest.java
@@ -21,8 +21,6 @@
 import android.content.Intent;
 import android.os.IBinder;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.concurrent.futures.ResolvableFuture;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.wear.protolayout.ResourceBuilders;
@@ -30,6 +28,8 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.util.concurrent.ListenableFuture;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -71,27 +71,24 @@
     }
 
     private static class FakeService extends TileService {
-        @NonNull
         @Override
-        protected ListenableFuture<TileBuilders.Tile> onTileRequest(
-                @NonNull RequestBuilders.TileRequest requestParams) {
+        protected @NonNull ListenableFuture<TileBuilders.Tile> onTileRequest(
+                RequestBuilders.@NonNull TileRequest requestParams) {
             ResolvableFuture<TileBuilders.Tile> f = ResolvableFuture.create();
             f.set(null);
             return f;
         }
 
-        @NonNull
         @Override
-        protected ListenableFuture<ResourceBuilders.Resources> onTileResourcesRequest(
-                @NonNull RequestBuilders.ResourcesRequest requestParams) {
+        protected @NonNull ListenableFuture<ResourceBuilders.Resources> onTileResourcesRequest(
+                RequestBuilders.@NonNull ResourcesRequest requestParams) {
             ResolvableFuture<ResourceBuilders.Resources> f = ResolvableFuture.create();
             f.set(null);
             return f;
         }
 
-        @Nullable
         @Override
-        public IBinder onBind(Intent intent) {
+        public @Nullable IBinder onBind(Intent intent) {
             return null;
         }
     }
diff --git a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/ProtoParcelableTest.java b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/ProtoParcelableTest.java
index d0032c7..92e0dc8 100644
--- a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/ProtoParcelableTest.java
+++ b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/ProtoParcelableTest.java
@@ -27,7 +27,6 @@
 import org.junit.runner.RunWith;
 import org.robolectric.annotation.internal.DoNotInstrument;
 
-
 @RunWith(AndroidJUnit4.class)
 @DoNotInstrument // See http://g/robolectric-users/fTi2FRXgyGA/m/PkB0wYuwBgAJ
 public final class ProtoParcelableTest {
diff --git a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileServiceTest.java b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileServiceTest.java
index 5db6074..2b87fe2 100644
--- a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileServiceTest.java
+++ b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileServiceTest.java
@@ -39,8 +39,6 @@
 import android.os.Looper;
 import android.os.RemoteException;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.wear.protolayout.ResourceBuilders.Resources;
@@ -66,6 +64,8 @@
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
@@ -1000,8 +1000,7 @@
         }
 
         @Override
-        @NonNull
-        protected ListenableFuture<TileBuilders.Tile> onTileRequest(
+        protected @NonNull ListenableFuture<TileBuilders.Tile> onTileRequest(
                 @NonNull TileRequest requestParams) {
             mTileRequestParams = requestParams;
             mTileId = requestParams.getTileId();
@@ -1012,8 +1011,7 @@
         }
 
         @Override
-        @NonNull
-        protected ListenableFuture<Resources> onTileResourcesRequest(
+        protected @NonNull ListenableFuture<Resources> onTileResourcesRequest(
                 @NonNull ResourcesRequest requestParams) {
             mResourcesRequestParams = requestParams;
             mTileId = requestParams.getTileId();
@@ -1051,16 +1049,14 @@
         protected void onTileLeaveEvent(@NonNull TileLeaveEvent requestParams) {}
 
         @Override
-        @NonNull
-        protected ListenableFuture<TileBuilders.Tile> onTileRequest(
+        protected @NonNull ListenableFuture<TileBuilders.Tile> onTileRequest(
                 @NonNull TileRequest requestParams) {
             return Futures.immediateFuture(DUMMY_TILE_TO_RETURN);
         }
 
         @Override
-        @NonNull
         @SuppressWarnings("deprecation") // for backward compatibility
-        protected ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources>
+        protected @NonNull ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources>
                 onResourcesRequest(@NonNull ResourcesRequest requestParams) {
             androidx.wear.tiles.ResourceBuilders.Resources resources =
                     new androidx.wear.tiles.ResourceBuilders.Resources.Builder()
diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/PrefetchParametersAdapter.java b/webkit/webkit/src/main/java/androidx/webkit/internal/PrefetchParametersAdapter.java
index 9ef2c2a..ec1528b 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/internal/PrefetchParametersAdapter.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/internal/PrefetchParametersAdapter.java
@@ -19,7 +19,6 @@
 import androidx.webkit.NoVarySearchData;
 import androidx.webkit.PrefetchParameters;
 
-import org.chromium.support_lib_boundary.PrefetchParamsBoundaryInterface;
 import org.chromium.support_lib_boundary.util.BoundaryInterfaceReflectionUtil;
 import org.jspecify.annotations.NonNull;
 import org.jspecify.annotations.Nullable;
@@ -28,21 +27,18 @@
 import java.util.HashMap;
 import java.util.Map;
 
-public class PrefetchParametersAdapter implements
-        PrefetchParamsBoundaryInterface {
+public class PrefetchParametersAdapter  {
     private final PrefetchParameters mPrefetchParameters;
 
     public PrefetchParametersAdapter(@Nullable PrefetchParameters impl) {
         mPrefetchParameters = impl;
     }
 
-    @Override
     public @NonNull Map<String, String> getAdditionalHeaders() {
         if (mPrefetchParameters == null) return new HashMap<>();
         return mPrefetchParameters.getAdditionalHeaders();
     }
 
-    @Override
     public @Nullable InvocationHandler getNoVarySearchData() {
         if (mPrefetchParameters == null) return null;
         NoVarySearchData noVarySearchData = mPrefetchParameters.getExpectedNoVarySearchData();
@@ -51,7 +47,6 @@
                 new NoVarySearchDataAdapter(noVarySearchData));
     }
 
-    @Override
     public boolean isJavaScriptEnabled() {
         if (mPrefetchParameters == null) return false;
         return mPrefetchParameters.isJavaScriptEnabled();
diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/ProfileImpl.java b/webkit/webkit/src/main/java/androidx/webkit/internal/ProfileImpl.java
index 29b2df9..a762e5d 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/internal/ProfileImpl.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/internal/ProfileImpl.java
@@ -16,26 +16,20 @@
 
 package androidx.webkit.internal;
 
-import android.util.Log;
 import android.webkit.CookieManager;
 import android.webkit.GeolocationPermissions;
 import android.webkit.ServiceWorkerController;
 import android.webkit.WebStorage;
 
 import androidx.core.os.CancellationSignal;
-import androidx.webkit.PrefetchException;
 import androidx.webkit.PrefetchOperationCallback;
 import androidx.webkit.PrefetchParameters;
 import androidx.webkit.Profile;
 
-import org.chromium.support_lib_boundary.PrefetchOperationResultBoundaryInterface;
-import org.chromium.support_lib_boundary.PrefetchStatusCodeBoundaryInterface;
 import org.chromium.support_lib_boundary.ProfileBoundaryInterface;
-import org.chromium.support_lib_boundary.util.BoundaryInterfaceReflectionUtil;
 import org.jspecify.annotations.NonNull;
 import org.jspecify.annotations.Nullable;
 
-import java.lang.reflect.InvocationHandler;
 
 /**
  * Internal implementation of Profile.
@@ -110,26 +104,6 @@
             @Nullable CancellationSignal cancellationSignal,
             @NonNull PrefetchOperationCallback<Void> operationCallback,
             @Nullable PrefetchParameters params) {
-        ApiFeature.NoFramework feature = WebViewFeatureInternal.PROFILE_URL_PREFETCH;
-        if (feature.isSupportedByWebView()) {
-            try {
-                InvocationHandler paramsBoundaryInterface =
-                        BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
-                                new PrefetchParametersAdapter(params));
-
-                mProfileImpl.prefetchUrl(url, paramsBoundaryInterface,
-                        value -> mapOperationResult(value, operationCallback));
-
-            } catch (Exception e) {
-                operationCallback.onError(e);
-            }
-            if (cancellationSignal != null) {
-                cancellationSignal.setOnCancelListener(() -> mProfileImpl.cancelPrefetch(url,
-                        value -> mapOperationResult(value, operationCallback)));
-            }
-        } else {
-            throw WebViewFeatureInternal.getUnsupportedOperationException();
-        }
     }
 
     @Override
@@ -142,35 +116,6 @@
     @Override
     public void clearPrefetchAsync(@NonNull String url,
             @NonNull PrefetchOperationCallback<Void> operationCallback) {
-        ApiFeature.NoFramework feature = WebViewFeatureInternal.PROFILE_URL_PREFETCH;
-        if (feature.isSupportedByWebView()) {
-            try {
-                mProfileImpl.clearPrefetch(url,
-                        value -> mapOperationResult(value, operationCallback));
-            } catch (Exception e) {
-                operationCallback.onError(e);
-            }
-        } else {
-            throw WebViewFeatureInternal.getUnsupportedOperationException();
-        }
-    }
-
-    private void mapOperationResult(InvocationHandler resultInvocation,
-            PrefetchOperationCallback<Void> operationCallback) {
-        PrefetchOperationResultBoundaryInterface result =
-                BoundaryInterfaceReflectionUtil.castToSuppLibClass(
-                        PrefetchOperationResultBoundaryInterface.class, resultInvocation);
-        assert result != null;
-        switch (result.getStatusCode()) {
-            case PrefetchStatusCodeBoundaryInterface.SUCCESS:
-                operationCallback.onSuccess(null);
-                break;
-            case PrefetchStatusCodeBoundaryInterface.FAILURE:
-                operationCallback.onError(new PrefetchException("An unexpected error occurred."));
-                break;
-            default:
-                Log.e("Prefetch", "Unsupported status code received");
-        }
     }
 
 }