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..e48335b 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()
