Merge "Migrate heifwriter to use JSpecify annotations" into androidx-main
diff --git a/appcompat/appcompat-lint/integration-tests/build.gradle b/appcompat/appcompat-lint/integration-tests/build.gradle
index 5153ca8..309699d 100644
--- a/appcompat/appcompat-lint/integration-tests/build.gradle
+++ b/appcompat/appcompat-lint/integration-tests/build.gradle
@@ -12,6 +12,7 @@
 }
 
 dependencies {
+    api(libs.jspecify)
     implementation(project(":appcompat:appcompat"))
     implementation(project(":core:core"))
     api(libs.kotlinStdlib)
diff --git a/appcompat/appcompat-lint/integration-tests/src/main/java/com/example/android/appcompat/ActivityWithClick.java b/appcompat/appcompat-lint/integration-tests/src/main/java/com/example/android/appcompat/ActivityWithClick.java
index 52e1d0a..22ce10e 100644
--- a/appcompat/appcompat-lint/integration-tests/src/main/java/com/example/android/appcompat/ActivityWithClick.java
+++ b/appcompat/appcompat-lint/integration-tests/src/main/java/com/example/android/appcompat/ActivityWithClick.java
@@ -20,9 +20,10 @@
 import android.view.View;
 import android.widget.Toast;
 
-import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 
+import org.jspecify.annotations.Nullable;
+
 /**
  * Activity for testing the android:onClick Lint rule
  */
diff --git a/appcompat/appcompat-resources/build.gradle b/appcompat/appcompat-resources/build.gradle
index 0172efc..b5e53c11 100644
--- a/appcompat/appcompat-resources/build.gradle
+++ b/appcompat/appcompat-resources/build.gradle
@@ -30,6 +30,7 @@
 }
 
 dependencies {
+    api(libs.jspecify)
     api("androidx.annotation:annotation:1.8.1")
     api("androidx.core:core:1.6.0")
     implementation("androidx.collection:collection:1.4.2")
diff --git a/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/widget/TestResources.java b/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/widget/TestResources.java
index 9da3eb9..f18047b 100644
--- a/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/widget/TestResources.java
+++ b/appcompat/appcompat-resources/src/androidTest/java/androidx/appcompat/widget/TestResources.java
@@ -19,7 +19,7 @@
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
 
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
 
 /**
  * Observable Resources class.
@@ -39,9 +39,8 @@
         return super.getDrawable(id);
     }
 
-    @NonNull
     @Override
-    public String getString(int id) throws NotFoundException {
+    public @NonNull String getString(int id) throws NotFoundException {
         mGetStringCalled = true;
         return super.getString(id);
     }
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/content/res/AppCompatResources.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/content/res/AppCompatResources.java
index b97ec39..0e732bc 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/content/res/AppCompatResources.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/content/res/AppCompatResources.java
@@ -22,11 +22,12 @@
 
 import androidx.annotation.ColorRes;
 import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.widget.ResourceManagerInternal;
 import androidx.core.content.ContextCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Class for accessing an application's resources through AppCompat, and thus any backward
  * compatible functionality.
@@ -59,8 +60,7 @@
      * @return Drawable An object that can be used to draw this resource.
      * @see ContextCompat#getDrawable(Context, int)
      */
-    @Nullable
-    public static Drawable getDrawable(@NonNull Context context, @DrawableRes int resId) {
+    public static @Nullable Drawable getDrawable(@NonNull Context context, @DrawableRes int resId) {
         return ResourceManagerInternal.get().getDrawable(context, resId);
     }
 }
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/AnimatedStateListDrawableCompat.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/AnimatedStateListDrawableCompat.java
index ecff44f..ae5f51d 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/AnimatedStateListDrawableCompat.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/AnimatedStateListDrawableCompat.java
@@ -36,8 +36,6 @@
 import android.util.Xml;
 
 import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.resources.Compatibility;
 import androidx.appcompat.resources.R;
 import androidx.appcompat.widget.ResourceManagerInternal;
@@ -48,6 +46,8 @@
 import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
 import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -129,11 +129,10 @@
      * @param theme the theme to apply, may be null.
      * @return a new AnimatedStateListDrawableCompat or null if parsing error is found.
      */
-    @Nullable
-    public static AnimatedStateListDrawableCompat create(
+    public static @Nullable AnimatedStateListDrawableCompat create(
             @NonNull Context context,
             @DrawableRes int resId,
-            @Nullable Resources.Theme theme) {
+            Resources.@Nullable Theme theme) {
         try {
             final Resources res = context.getResources();
             @SuppressLint("ResourceType")
@@ -162,13 +161,12 @@
      * {@link Resources.Theme}. Called on a parser positioned at a tag in an XML
      * document, tries to create an AnimatedStateListDrawableCompat from that tag.
      */
-    @NonNull
-    public static AnimatedStateListDrawableCompat createFromXmlInner(
+    public static @NonNull AnimatedStateListDrawableCompat createFromXmlInner(
             @NonNull Context context,
             @NonNull Resources resources,
             @NonNull XmlPullParser parser,
             @NonNull AttributeSet attrs,
-            @Nullable Resources.Theme theme)
+            Resources.@Nullable Theme theme)
             throws IOException, XmlPullParserException {
         final String name = parser.getName();
         if (!name.equals("animated-selector")) {
@@ -198,7 +196,7 @@
             @NonNull Resources resources,
             @NonNull XmlPullParser parser,
             @NonNull AttributeSet attrs,
-            @Nullable Resources.Theme theme)
+            Resources.@Nullable Theme theme)
             throws XmlPullParserException, IOException {
         final TypedArray a = obtainAttributes(
                 resources, theme, attrs, R.styleable.AnimatedStateListDrawableCompat);
@@ -232,7 +230,7 @@
      * @param drawable The drawable to show when in the specified state, may not be null
      * @param id       The unique identifier for the keyframe
      */
-    public void addState(@NonNull int[] stateSet, @NonNull Drawable drawable, int id) {
+    public void addState(int @NonNull [] stateSet, @NonNull Drawable drawable, int id) {
         ObjectsCompat.requireNonNull(drawable);
         mState.addStateSet(stateSet, drawable, id);
         onStateChange(getState());
@@ -270,7 +268,7 @@
     }
 
     @Override
-    protected boolean onStateChange(@NonNull int[] stateSet) {
+    protected boolean onStateChange(int @NonNull [] stateSet) {
         // If we're not already at the target index, either attempt to find a
         // valid transition to it or jump directly there.
         final int targetIndex = mState.indexOfKeyframe(stateSet);
@@ -473,7 +471,7 @@
             @NonNull Resources resources,
             @NonNull XmlPullParser parser,
             @NonNull AttributeSet attrs,
-            @Nullable Resources.Theme theme)
+            Resources.@Nullable Theme theme)
             throws XmlPullParserException, IOException {
         int type;
         final int innerDepth = parser.getDepth() + 1;
@@ -500,7 +498,7 @@
             @NonNull Resources resources,
             @NonNull XmlPullParser parser,
             @NonNull AttributeSet attrs,
-            @Nullable Resources.Theme theme)
+            Resources.@Nullable Theme theme)
             throws XmlPullParserException, IOException {
 
         final TypedArray a = obtainAttributes(resources, theme, attrs,
@@ -556,7 +554,7 @@
             @NonNull Resources resources,
             @NonNull XmlPullParser parser,
             @NonNull AttributeSet attrs,
-            @Nullable Resources.Theme theme)
+            Resources.@Nullable Theme theme)
             throws XmlPullParserException, IOException {
         final TypedArray a = obtainAttributes(resources, theme, attrs,
                 R.styleable.AnimatedStateListDrawableItem);
@@ -598,9 +596,8 @@
         return mState.addStateSet(states, dr, keyframeId);
     }
 
-    @NonNull
     @Override
-    public Drawable mutate() {
+    public @NonNull Drawable mutate() {
         if (!mMutated && super.mutate() == this) {
             mState.mutate();
             mMutated = true;
@@ -662,13 +659,13 @@
             return pos;
         }
 
-        int addStateSet(@NonNull int[] stateSet, @NonNull Drawable drawable, int id) {
+        int addStateSet(int @NonNull [] stateSet, @NonNull Drawable drawable, int id) {
             final int index = super.addStateSet(stateSet, drawable);
             mStateIds.put(index, id);
             return index;
         }
 
-        int indexOfKeyframe(@NonNull int[] stateSet) {
+        int indexOfKeyframe(int @NonNull [] stateSet) {
             final int index = super.indexOfStateSet(stateSet);
             if (index >= 0) {
                 return index;
@@ -695,15 +692,13 @@
             return (mTransitions.get(keyFromTo, -1L) & REVERSIBLE_FLAG_BIT) != 0L;
         }
 
-        @NonNull
         @Override
-        public Drawable newDrawable() {
+        public @NonNull Drawable newDrawable() {
             return new AnimatedStateListDrawableCompat(this, null);
         }
 
-        @NonNull
         @Override
-        public Drawable newDrawable(Resources res) {
+        public @NonNull Drawable newDrawable(Resources res) {
             return new AnimatedStateListDrawableCompat(this, res);
         }
 
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableContainerCompat.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableContainerCompat.java
index 104efb4..44b9bbc 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableContainerCompat.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableContainerCompat.java
@@ -35,11 +35,12 @@
 import android.view.View;
 
 import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.core.graphics.drawable.DrawableCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * A helper class that contains several {@link Drawable}s and selects which one to use.
  * <p>
@@ -299,7 +300,7 @@
     }
 
     @Override
-    protected boolean onStateChange(@NonNull int[] state) {
+    protected boolean onStateChange(int @NonNull [] state) {
         if (mLastDrawable != null) {
             return mLastDrawable.setState(state);
         }
@@ -568,9 +569,8 @@
         }
     }
 
-    @NonNull
     @Override
-    public Drawable getCurrent() {
+    public @NonNull Drawable getCurrent() {
         return mCurrDrawable;
     }
 
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapperCompat.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapperCompat.java
index 0531212..bff5a61 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapperCompat.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapperCompat.java
@@ -25,10 +25,11 @@
 import android.graphics.drawable.Drawable;
 import android.view.View;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.core.graphics.drawable.DrawableCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Drawable which delegates all calls to its wrapped {@link Drawable}.
  * <p>
@@ -222,8 +223,7 @@
     /**
      * @return the wrapped drawable
      */
-    @Nullable
-    public Drawable getDrawable() {
+    public @Nullable Drawable getDrawable() {
         return mDrawable;
     }
 
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/StateListDrawableCompat.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/StateListDrawableCompat.java
index 7e33bca..0ba6046 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/StateListDrawableCompat.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/graphics/drawable/StateListDrawableCompat.java
@@ -29,13 +29,13 @@
 import android.util.AttributeSet;
 import android.util.StateSet;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.appcompat.resources.Compatibility;
 import androidx.appcompat.resources.R;
 import androidx.appcompat.widget.ResourceManagerInternal;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -105,7 +105,7 @@
     }
 
     @Override
-    protected boolean onStateChange(@NonNull int[] stateSet) {
+    protected boolean onStateChange(int @NonNull [] stateSet) {
         final boolean changed = super.onStateChange(stateSet);
         int idx = mStateListState.indexOfStateSet(stateSet);
         if (DEBUG) {
@@ -300,9 +300,8 @@
         return mStateListState.indexOfStateSet(stateSet);
     }
 
-    @NonNull
     @Override
-    public Drawable mutate() {
+    public @NonNull Drawable mutate() {
         if (!mMutated && super.mutate() == this) {
             mStateListState.mutate();
             mMutated = true;
@@ -360,15 +359,13 @@
             return -1;
         }
 
-        @NonNull
         @Override
-        public Drawable newDrawable() {
+        public @NonNull Drawable newDrawable() {
             return new StateListDrawableCompat(this, null);
         }
 
-        @NonNull
         @Override
-        public Drawable newDrawable(Resources res) {
+        public @NonNull Drawable newDrawable(Resources res) {
             return new StateListDrawableCompat(this, res);
         }
 
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/resources/Compatibility.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/resources/Compatibility.java
index 40ae0b8..a25c8d1 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/resources/Compatibility.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/resources/Compatibility.java
@@ -21,11 +21,11 @@
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -49,7 +49,7 @@
 
         public static void inflate(@NonNull Drawable drawable, @NonNull Resources r,
                 @NonNull XmlPullParser parser, @NonNull AttributeSet attrs,
-                @Nullable Resources.Theme theme) throws IOException, XmlPullParserException {
+                Resources.@Nullable Theme theme) throws IOException, XmlPullParserException {
             drawable.inflate(r, parser, attrs, theme);
         }
 
@@ -57,10 +57,9 @@
             return typedArray.getChangingConfigurations();
         }
 
-        @NonNull
-        public static Drawable createFromXmlInner(@NonNull Resources r,
+        public static @NonNull Drawable createFromXmlInner(@NonNull Resources r,
                 @NonNull XmlPullParser parser, @NonNull AttributeSet attrs,
-                @Nullable Resources.Theme theme) throws IOException, XmlPullParserException {
+                Resources.@Nullable Theme theme) throws IOException, XmlPullParserException {
             return Drawable.createFromXmlInner(r, parser, attrs, theme);
         }
     }
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/DrawableUtils.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/DrawableUtils.java
index 2329750..675f466 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/DrawableUtils.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/DrawableUtils.java
@@ -26,11 +26,12 @@
 import android.graphics.drawable.Drawable;
 import android.os.Build;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.core.graphics.drawable.DrawableCompat;
 
+import org.jspecify.annotations.NonNull;
+
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -51,8 +52,7 @@
      * Allows us to get the optical insets for a {@link Drawable}. Since this is hidden we need to
      * use reflection. Since the {@code Insets} class is hidden also, we return a Rect instead.
      */
-    @NonNull
-    public static Rect getOpticalBounds(@NonNull Drawable drawable) {
+    public static @NonNull Rect getOpticalBounds(@NonNull Drawable drawable) {
         if (Build.VERSION.SDK_INT >= 29) {
             final Insets insets = Api29Impl.getOpticalInsets(drawable);
             return new Rect(
@@ -189,8 +189,7 @@
             // This class is not instantiable.
         }
 
-        @NonNull
-        static Rect getOpticalInsets(@NonNull Drawable drawable) {
+        static @NonNull Rect getOpticalInsets(@NonNull Drawable drawable) {
             // Check the SDK_INT to avoid UncheckedReflection error.
             if (Build.VERSION.SDK_INT < 29 && sReflectionSuccessful) {
                 try {
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java
index d64a144e..20e193a 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java
@@ -35,8 +35,6 @@
 import android.util.Xml;
 
 import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat;
 import androidx.appcompat.resources.Compatibility;
@@ -50,6 +48,8 @@
 import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
 import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -62,22 +62,21 @@
 public final class ResourceManagerInternal {
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     public interface ResourceManagerHooks {
-        @Nullable
-        Drawable createDrawableFor(@NonNull ResourceManagerInternal appCompatDrawableManager,
+        @Nullable Drawable createDrawableFor(
+                @NonNull ResourceManagerInternal appCompatDrawableManager,
                 @NonNull Context context, @DrawableRes final int resId);
         boolean tintDrawable(@NonNull Context context, @DrawableRes int resId,
                 @NonNull Drawable drawable);
-        @Nullable
-        ColorStateList getTintListForDrawableRes(@NonNull Context context, @DrawableRes int resId);
+        @Nullable ColorStateList getTintListForDrawableRes(
+                @NonNull Context context, @DrawableRes int resId);
         boolean tintDrawableUsingColorFilter(@NonNull Context context,
                 @DrawableRes final int resId, @NonNull Drawable drawable);
-        @Nullable
-        PorterDuff.Mode getTintModeForDrawableRes(final int resId);
+        PorterDuff.@Nullable Mode getTintModeForDrawableRes(final int resId);
     }
 
     private interface InflateDelegate {
         Drawable createFromXmlInner(@NonNull Context context, @NonNull XmlPullParser parser,
-                @NonNull AttributeSet attrs, @Nullable Resources.Theme theme);
+                @NonNull AttributeSet attrs, Resources.@Nullable Theme theme);
     }
 
     private static final String TAG = "ResourceManagerInternal";
@@ -311,7 +310,7 @@
         return null;
     }
 
-    private synchronized Drawable getCachedDrawable(@NonNull final Context context,
+    private synchronized Drawable getCachedDrawable(final @NonNull Context context,
             final long key) {
         final LongSparseArray<WeakReference<ConstantState>> cache = mDrawableCaches.get(context);
         if (cache == null) {
@@ -332,8 +331,8 @@
         return null;
     }
 
-    private synchronized boolean addDrawableToCache(@NonNull final Context context, final long key,
-            @NonNull final Drawable drawable) {
+    private synchronized boolean addDrawableToCache(final @NonNull Context context, final long key,
+            final @NonNull Drawable drawable) {
         final ConstantState cs = drawable.getConstantState();
         if (cs != null) {
             LongSparseArray<WeakReference<ConstantState>> cache = mDrawableCaches.get(context);
@@ -515,7 +514,7 @@
 
         @Override
         public Drawable createFromXmlInner(@NonNull Context context, @NonNull XmlPullParser parser,
-                @NonNull AttributeSet attrs, @Nullable Resources.Theme theme) {
+                @NonNull AttributeSet attrs, Resources.@Nullable Theme theme) {
             try {
                 return VectorDrawableCompat
                         .createFromXmlInner(context.getResources(), parser, attrs, theme);
@@ -532,7 +531,7 @@
 
         @Override
         public Drawable createFromXmlInner(@NonNull Context context, @NonNull XmlPullParser parser,
-                @NonNull AttributeSet attrs, @Nullable Resources.Theme theme) {
+                @NonNull AttributeSet attrs, Resources.@Nullable Theme theme) {
             try {
                 return AnimatedVectorDrawableCompat
                         .createFromXmlInner(context, context.getResources(), parser, attrs, theme);
@@ -546,7 +545,7 @@
     static class AsldcInflateDelegate implements InflateDelegate {
         @Override
         public Drawable createFromXmlInner(@NonNull Context context, @NonNull XmlPullParser parser,
-                @NonNull AttributeSet attrs, @Nullable Resources.Theme theme) {
+                @NonNull AttributeSet attrs, Resources.@Nullable Theme theme) {
             try {
                 return AnimatedStateListDrawableCompat
                         .createFromXmlInner(context, context.getResources(), parser, attrs, theme);
@@ -560,7 +559,7 @@
     static class DrawableDelegate implements InflateDelegate {
         @Override
         public Drawable createFromXmlInner(@NonNull Context context, @NonNull XmlPullParser parser,
-                @NonNull AttributeSet attrs, @Nullable Resources.Theme theme) {
+                @NonNull AttributeSet attrs, Resources.@Nullable Theme theme) {
             String className = attrs.getClassAttribute();
             if (className != null) {
                 try {
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/TintContextWrapper.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/TintContextWrapper.java
index dae6e11..92a8b07 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/TintContextWrapper.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/TintContextWrapper.java
@@ -24,9 +24,10 @@
 import android.content.res.Resources;
 import android.os.Build;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 
@@ -41,7 +42,7 @@
     private static final Object CACHE_LOCK = new Object();
     private static ArrayList<WeakReference<TintContextWrapper>> sCache;
 
-    public static Context wrap(@NonNull final Context context) {
+    public static Context wrap(final @NonNull Context context) {
         if (shouldWrap(context)) {
             synchronized (CACHE_LOCK) {
                 if (sCache == null) {
@@ -73,7 +74,7 @@
         return context;
     }
 
-    private static boolean shouldWrap(@NonNull final Context context) {
+    private static boolean shouldWrap(final @NonNull Context context) {
         if (context instanceof TintContextWrapper
                 || context.getResources() instanceof TintResources
                 || context.getResources() instanceof VectorEnabledTintResources) {
@@ -87,7 +88,7 @@
     private final Resources mResources;
     private final Resources.Theme mTheme;
 
-    private TintContextWrapper(@NonNull final Context base) {
+    private TintContextWrapper(final @NonNull Context base) {
         super(base);
 
         if (VectorEnabledTintResources.shouldBeUsed()) {
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/TintResources.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/TintResources.java
index 9461000..c536410 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/TintResources.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/TintResources.java
@@ -20,7 +20,7 @@
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
 
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
 
 import java.lang.ref.WeakReference;
 
@@ -31,7 +31,7 @@
 
     private final WeakReference<Context> mContextRef;
 
-    public TintResources(@NonNull Context context, @NonNull final Resources res) {
+    public TintResources(@NonNull Context context, final @NonNull Resources res) {
         super(res);
         mContextRef = new WeakReference<>(context);
     }
diff --git a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/VectorEnabledTintResources.java b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/VectorEnabledTintResources.java
index dd9b704..2efd63a8 100644
--- a/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/VectorEnabledTintResources.java
+++ b/appcompat/appcompat-resources/src/main/java/androidx/appcompat/widget/VectorEnabledTintResources.java
@@ -23,9 +23,10 @@
 import android.graphics.drawable.Drawable;
 import android.os.Build;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 import java.lang.ref.WeakReference;
 
 /**
@@ -50,8 +51,8 @@
     private final WeakReference<Context> mContextRef;
 
     @SuppressWarnings("deprecation")
-    public VectorEnabledTintResources(@NonNull final Context context,
-            @NonNull final Resources res) {
+    public VectorEnabledTintResources(final @NonNull Context context,
+            final @NonNull Resources res) {
         super(res);
         mContextRef = new WeakReference<>(context);
     }
diff --git a/appcompat/appcompat/build.gradle b/appcompat/appcompat/build.gradle
index 5dfee05..8fa8635 100644
--- a/appcompat/appcompat/build.gradle
+++ b/appcompat/appcompat/build.gradle
@@ -15,6 +15,7 @@
 }
 
 dependencies {
+    api(libs.jspecify)
     api("androidx.annotation:annotation:1.8.1")
     api("androidx.core:core:1.13.0")
 
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatDialogFragmentTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatDialogFragmentTest.java
index cf7049e..8613f5d 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatDialogFragmentTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatDialogFragmentTest.java
@@ -22,13 +22,13 @@
 import android.app.Dialog;
 import android.os.Bundle;
 
-import androidx.annotation.NonNull;
 import androidx.appcompat.test.R;
 import androidx.fragment.app.DialogFragment;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
 import androidx.test.platform.app.InstrumentationRegistry;
 
+import org.jspecify.annotations.NonNull;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -82,9 +82,8 @@
     }
 
     public static class TestDialogFragment extends AppCompatDialogFragment {
-        @NonNull
         @Override
-        public Dialog onCreateDialog(Bundle savedInstanceState) {
+        public @NonNull Dialog onCreateDialog(Bundle savedInstanceState) {
             return new AlertDialog.Builder(requireContext())
                     .setTitle("Test")
                     .setMessage("Message")
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatMenuItemIconTintingTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatMenuItemIconTintingTest.java
index 4b12878..f3e1ffc 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatMenuItemIconTintingTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatMenuItemIconTintingTest.java
@@ -29,7 +29,6 @@
 import android.view.MenuItem;
 
 import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
 import androidx.appcompat.test.R;
 import androidx.appcompat.testutils.TestUtils;
 import androidx.core.content.res.ResourcesCompat;
@@ -40,6 +39,7 @@
 import androidx.test.filters.LargeTest;
 import androidx.test.rule.ActivityTestRule;
 
+import org.jspecify.annotations.NonNull;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/BaseBasicsTestCase.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/BaseBasicsTestCase.java
index 9cf5964..f5ab27a 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/BaseBasicsTestCase.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/BaseBasicsTestCase.java
@@ -40,7 +40,6 @@
 import android.view.View;
 import android.view.WindowManager;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.appcompat.custom.FitWindowsContentLayout;
 import androidx.appcompat.test.R;
@@ -56,6 +55,7 @@
 import androidx.test.filters.SmallTest;
 import androidx.test.rule.ActivityTestRule;
 
+import org.jspecify.annotations.NonNull;
 import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
@@ -386,7 +386,7 @@
         verify(apCallback).onSupportActionModeFinished(any(ActionMode.class));
     }
 
-    private WindowInsetsCompat waitForWindowInsets(@NonNull final View view) throws Throwable {
+    private WindowInsetsCompat waitForWindowInsets(final @NonNull View view) throws Throwable {
         final CountDownLatch latch = new CountDownLatch(1);
         final AtomicReference<WindowInsetsCompat> received = new AtomicReference<>();
         // Set a listener to catch WindowInsets
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/CustomCollapsibleView.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/CustomCollapsibleView.java
index 76ee4ad..be13793 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/CustomCollapsibleView.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/CustomCollapsibleView.java
@@ -20,9 +20,10 @@
 import android.util.AttributeSet;
 import android.view.View;
 
-import androidx.annotation.Nullable;
 import androidx.appcompat.view.CollapsibleActionView;
 
+import org.jspecify.annotations.Nullable;
+
 public class CustomCollapsibleView extends View implements CollapsibleActionView {
     public CustomCollapsibleView(Context context) {
         this(context, null, 0);
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/FragmentContentIdActivity.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/FragmentContentIdActivity.java
index 935ec3f..2d2cef9 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/FragmentContentIdActivity.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/FragmentContentIdActivity.java
@@ -20,11 +20,11 @@
 import android.view.View;
 import android.view.ViewGroup;
 
-import androidx.annotation.Nullable;
 import androidx.appcompat.test.R;
 import androidx.appcompat.testutils.BaseTestActivity;
 import androidx.fragment.app.Fragment;
 
+import org.jspecify.annotations.Nullable;
 
 public class FragmentContentIdActivity extends BaseTestActivity {
 
@@ -60,9 +60,8 @@
     }
 
     public static class FragmentB extends Fragment {
-        @Nullable
         @Override
-        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+        public @Nullable View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                 @Nullable Bundle savedInstanceState) {
             View view = new View(getContext());
             view.setId(R.id.fragment_b);
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LocalesUpdateActivity.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LocalesUpdateActivity.java
index 7678876..c7fcc95 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LocalesUpdateActivity.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/LocalesUpdateActivity.java
@@ -22,12 +22,13 @@
 import android.os.Build;
 import android.os.Bundle;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.test.R;
 import androidx.appcompat.testutils.BaseTestActivity;
 import androidx.core.os.LocaleListCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
@@ -83,8 +84,7 @@
         mOnDestroySemaphore.release();
     }
 
-    @Nullable
-    Configuration getLastConfigurationChangeAndClear() {
+    @Nullable Configuration getLastConfigurationChangeAndClear() {
         final Configuration config = mLastConfigurationChange;
         mLastConfigurationChange = null;
         return config;
@@ -94,8 +94,7 @@
      * @return a copy of the {@link Configuration} from the most recent call to {@link #onCreate} or
      * {@link #onConfigurationChanged}, or {@code null} if neither has been called yet
      */
-    @Nullable
-    Configuration getEffectiveConfiguration() {
+    @Nullable Configuration getEffectiveConfiguration() {
         return mEffectiveConfiguration;
     }
 
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeActivity.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeActivity.java
index 376c362..ce04aa3 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeActivity.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeActivity.java
@@ -19,11 +19,12 @@
 import android.content.res.Configuration;
 import android.os.Bundle;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.test.R;
 import androidx.appcompat.testutils.BaseTestActivity;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
@@ -81,8 +82,7 @@
         mOnDestroySemaphore.release();
     }
 
-    @Nullable
-    Configuration getLastConfigurationChangeAndClear() {
+    @Nullable Configuration getLastConfigurationChangeAndClear() {
         final Configuration config = mLastConfigurationChange;
         mLastConfigurationChange = null;
         return config;
@@ -92,8 +92,7 @@
      * @return a copy of the {@link Configuration} from the most recent call to {@link #onCreate} or
      *         {@link #onConfigurationChanged}, or {@code null} if neither has been called yet
      */
-    @Nullable
-    Configuration getEffectiveConfiguration() {
+    @Nullable Configuration getEffectiveConfiguration() {
         return mEffectiveConfiguration;
     }
 
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/TestDialogFragment.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/TestDialogFragment.java
index 907c068..d00422c 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/TestDialogFragment.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/TestDialogFragment.java
@@ -19,10 +19,11 @@
 import android.app.Dialog;
 import android.os.Bundle;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.fragment.app.DialogFragment;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Test class extending DialogFragment used for testing of configuration changes like nightMode and
  * locales.
@@ -37,9 +38,8 @@
         return new TestDialogFragment();
     }
 
-    @NonNull
     @Override
-    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+    public @NonNull Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
         AlertDialog.Builder builder = new AlertDialog.Builder(requireContext());
         builder.setTitle("TestDialogFragment");
         builder.setMessage("TestDialogFragment");
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/g3/FilternatorActivity.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/g3/FilternatorActivity.java
index 1aff03c..e2555bb 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/g3/FilternatorActivity.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/g3/FilternatorActivity.java
@@ -19,9 +19,10 @@
 import android.content.res.Configuration;
 import android.os.Bundle;
 
-import androidx.annotation.NonNull;
 import androidx.appcompat.app.AppCompatActivity;
 
+import org.jspecify.annotations.NonNull;
+
 import java.util.concurrent.CountDownLatch;
 
 public class FilternatorActivity extends AppCompatActivity {
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/g3/FilternatorActivityWithCustomDefault.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/g3/FilternatorActivityWithCustomDefault.java
index f8763e9..ac2f7c5 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/g3/FilternatorActivityWithCustomDefault.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/g3/FilternatorActivityWithCustomDefault.java
@@ -19,10 +19,11 @@
 import android.content.res.Configuration;
 import android.os.Bundle;
 
-import androidx.annotation.NonNull;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.app.AppCompatDelegate;
 
+import org.jspecify.annotations.NonNull;
+
 import java.util.concurrent.CountDownLatch;
 
 public class FilternatorActivityWithCustomDefault extends AppCompatActivity {
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/g3/OldTranslateActivity.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/g3/OldTranslateActivity.java
index 3e554f1..2e78dbe 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/g3/OldTranslateActivity.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/g3/OldTranslateActivity.java
@@ -18,10 +18,11 @@
 
 import android.os.Bundle;
 
-import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.test.R;
 
+import org.jspecify.annotations.Nullable;
+
 public class OldTranslateActivity extends AppCompatActivity {
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/inflater/CustomViewInflater.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/inflater/CustomViewInflater.java
index b1804b9..58968fa 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/inflater/CustomViewInflater.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/inflater/CustomViewInflater.java
@@ -19,14 +19,15 @@
 import android.content.Context;
 import android.util.AttributeSet;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatViewInflater;
 import androidx.appcompat.widget.AppCompatButton;
 import androidx.appcompat.widget.AppCompatImageButton;
 import androidx.appcompat.widget.AppCompatTextView;
 import androidx.appcompat.widget.AppCompatToggleButton;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Custom view inflater that takes over the inflation of a few widget types.
  */
@@ -89,27 +90,24 @@
         }
     }
 
-    @NonNull
     @Override
-    protected AppCompatButton createButton(Context context, AttributeSet attrs) {
+    protected @NonNull AppCompatButton createButton(Context context, AttributeSet attrs) {
         return new CustomButton(context, attrs);
     }
 
-    @NonNull
     @Override
-    protected AppCompatTextView createTextView(Context context, AttributeSet attrs) {
+    protected @NonNull AppCompatTextView createTextView(Context context, AttributeSet attrs) {
         return new CustomTextView(context, attrs);
     }
 
-    @NonNull
     @Override
-    protected AppCompatImageButton createImageButton(Context context, AttributeSet attrs) {
+    protected @NonNull AppCompatImageButton createImageButton(Context context, AttributeSet attrs) {
         return new CustomImageButton(context, attrs);
     }
 
-    @NonNull
     @Override
-    protected AppCompatToggleButton createToggleButton(Context context, AttributeSet attrs) {
+    protected @NonNull AppCompatToggleButton createToggleButton(
+            Context context, AttributeSet attrs) {
         return new CustomToggleButton(context, attrs);
     }
 }
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/inflater/MisbehavingViewInflater.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/inflater/MisbehavingViewInflater.java
index fbe91cc2..a1aec1c 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/inflater/MisbehavingViewInflater.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/inflater/MisbehavingViewInflater.java
@@ -19,19 +19,19 @@
 import android.content.Context;
 import android.util.AttributeSet;
 
-import androidx.annotation.NonNull;
 import androidx.appcompat.app.AppCompatViewInflater;
 import androidx.appcompat.widget.AppCompatButton;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * Custom view inflater that declares that it takes over the view inflation but
  * does not honor the contract to return non-null instance in its
  * {@link #createButton(Context, AttributeSet)} method.
  */
 public class MisbehavingViewInflater extends AppCompatViewInflater {
-    @NonNull
     @Override
-    protected AppCompatButton createButton(Context context, AttributeSet attrs) {
+    protected @NonNull AppCompatButton createButton(Context context, AttributeSet attrs) {
         return null;
     }
 }
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/BaseTestActivity.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/BaseTestActivity.java
index bb1de01..9c29c97 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/BaseTestActivity.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/BaseTestActivity.java
@@ -25,14 +25,15 @@
 import android.view.MenuItem;
 import android.view.WindowManager;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatCallback;
 import androidx.appcompat.test.R;
 import androidx.appcompat.view.ActionMode;
 import androidx.testutils.LocaleTestUtils;
 import androidx.testutils.RecreatedAppCompatActivity;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.Locale;
 
 public abstract class BaseTestActivity extends RecreatedAppCompatActivity {
@@ -244,9 +245,9 @@
         }
     }
 
-    @Nullable
     @Override
-    public ActionMode onWindowStartingSupportActionMode(@NonNull ActionMode.Callback callback) {
+    public @Nullable ActionMode onWindowStartingSupportActionMode(
+            ActionMode.@NonNull Callback callback) {
         if (mAppCompatCallback != null) {
             return mAppCompatCallback.onWindowStartingSupportActionMode(callback);
         }
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/DrawerLayoutActions.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/DrawerLayoutActions.java
index 495491c..ed5107a 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/DrawerLayoutActions.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/DrawerLayoutActions.java
@@ -20,7 +20,6 @@
 
 import android.view.View;
 
-import androidx.annotation.Nullable;
 import androidx.drawerlayout.widget.DrawerLayout;
 import androidx.test.espresso.Espresso;
 import androidx.test.espresso.IdlingResource;
@@ -28,6 +27,7 @@
 import androidx.test.espresso.ViewAction;
 
 import org.hamcrest.Matcher;
+import org.jspecify.annotations.Nullable;
 
 public class DrawerLayoutActions {
     /**
@@ -38,7 +38,7 @@
             implements DrawerLayout.DrawerListener, IdlingResource {
         private int mCurrState = DrawerLayout.STATE_IDLE;
 
-        @Nullable private IdlingResource.ResourceCallback mCallback;
+        private IdlingResource.@Nullable ResourceCallback mCallback;
 
         private boolean mNeedsIdle = false;
 
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/TestUtils.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/TestUtils.java
index e13aa1a..cfcf7da 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/TestUtils.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/testutils/TestUtils.java
@@ -36,14 +36,15 @@
 import android.view.ViewTreeObserver.OnDrawListener;
 
 import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.appcompat.widget.TintTypedArray;
 import androidx.core.util.Pair;
 import androidx.test.platform.app.InstrumentationRegistry;
 import androidx.test.rule.ActivityTestRule;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
@@ -371,8 +372,8 @@
      * @param runner the runnable to run on the main thread, or {@code null} to
      *               simply force invalidation and a draw pass
      */
-    public static void runOnMainAndDrawSync(@NonNull final ActivityTestRule activityTestRule,
-            @NonNull final View view, @Nullable final Runnable runner) {
+    public static void runOnMainAndDrawSync(final @NonNull ActivityTestRule activityTestRule,
+            final @NonNull View view, final @Nullable Runnable runner) {
         final CountDownLatch latch = new CountDownLatch(1);
 
         try {
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatAutoCompleteTextViewEmojiTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatAutoCompleteTextViewEmojiTest.java
index 2eefa1f..a11f943 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatAutoCompleteTextViewEmojiTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatAutoCompleteTextViewEmojiTest.java
@@ -22,12 +22,12 @@
 import android.text.method.DigitsKeyListener;
 import android.text.method.KeyListener;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatBaseImageViewTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatBaseImageViewTest.java
index 44ce501..e3e6b80 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatBaseImageViewTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatBaseImageViewTest.java
@@ -30,7 +30,6 @@
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.IdRes;
-import androidx.annotation.NonNull;
 import androidx.appcompat.test.R;
 import androidx.appcompat.testutils.AppCompatTintableViewActions;
 import androidx.appcompat.testutils.BaseTestActivity;
@@ -40,6 +39,7 @@
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.filters.MediumTest;
 
+import org.jspecify.annotations.NonNull;
 import org.junit.Test;
 
 /**
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatBaseViewTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatBaseViewTest.java
index d87f8fb..0798649 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatBaseViewTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatBaseViewTest.java
@@ -25,8 +25,8 @@
 import static androidx.test.espresso.Espresso.onView;
 import static androidx.test.espresso.assertion.ViewAssertions.matches;
 import static androidx.test.espresso.matcher.ViewMatchers.withId;
-import static androidx.testutils.lifecycle.LifecycleOwnerUtils.waitUntilState;
 import static androidx.testutils.PollingCheck.waitFor;
+import static androidx.testutils.lifecycle.LifecycleOwnerUtils.waitUntilState;
 
 import static org.junit.Assert.assertNull;
 
@@ -39,7 +39,6 @@
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.IdRes;
-import androidx.annotation.NonNull;
 import androidx.appcompat.test.R;
 import androidx.appcompat.testutils.AppCompatTintableViewActions;
 import androidx.appcompat.testutils.BaseTestActivity;
@@ -51,6 +50,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
 
+import org.jspecify.annotations.NonNull;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatEditTextEmojiTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatEditTextEmojiTest.java
index 534c451..11a91cd 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatEditTextEmojiTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatEditTextEmojiTest.java
@@ -24,13 +24,13 @@
 import android.text.method.NumberKeyListener;
 import android.view.KeyEvent;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.test.R;
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatEditTextReceiveContentTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatEditTextReceiveContentTest.java
index 005ca1a..ccfb32f 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatEditTextReceiveContentTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatEditTextReceiveContentTest.java
@@ -47,8 +47,6 @@
 import android.view.inputmethod.InputConnection;
 import android.view.inputmethod.InputContentInfo;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.test.R;
 import androidx.core.util.ObjectsCompat;
@@ -64,6 +62,8 @@
 import androidx.test.filters.SdkSuppress;
 import androidx.test.rule.ActivityTestRule;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
@@ -598,14 +598,11 @@
     private static class PayloadArgumentMatcher implements ArgumentMatcher<ContentInfoCompat> {
         public static final String EXTRA_KEY = "testExtra";
 
-        @NonNull
-        private final ClipData mClip;
+        private final @NonNull ClipData mClip;
         private final int mSource;
         private final int mFlags;
-        @Nullable
-        private final Uri mLinkUri;
-        @Nullable
-        private final String mExtraValue;
+        private final @Nullable Uri mLinkUri;
+        private final @Nullable String mExtraValue;
 
         private PayloadArgumentMatcher(@NonNull ClipData clip, int source, int flags,
                 @Nullable Uri linkUri, @Nullable String extraValue) {
@@ -616,9 +613,8 @@
             mExtraValue = extraValue;
         }
 
-        @NonNull
         @Override
-        public String toString() {
+        public @NonNull String toString() {
             return "[" + "clip=" + mClip + ", source=" + mSource + ", flags=" + mFlags
                     + ", linkUri=" + mLinkUri + ", extraValue=" + mExtraValue + "]";
         }
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextViewEmojiTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextViewEmojiTest.java
index 49640e8..137aa96 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextViewEmojiTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextViewEmojiTest.java
@@ -22,12 +22,12 @@
 import android.text.method.DigitsKeyListener;
 import android.text.method.KeyListener;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeTest.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeTest.java
index 2a3c537..f8c4b67 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeTest.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeTest.java
@@ -26,13 +26,13 @@
 import android.util.AttributeSet;
 import android.widget.LinearLayout;
 
-import androidx.annotation.Nullable;
 import androidx.appcompat.test.R;
 import androidx.core.widget.TextViewCompat;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.MediumTest;
 import androidx.test.filters.SmallTest;
 
+import org.jspecify.annotations.Nullable;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/ToolbarTestActivity.java b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/ToolbarTestActivity.java
index b4123e9..5ff5184 100644
--- a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/ToolbarTestActivity.java
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/ToolbarTestActivity.java
@@ -18,10 +18,11 @@
 
 import android.os.Bundle;
 
-import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.test.R;
 
+import org.jspecify.annotations.Nullable;
+
 public class ToolbarTestActivity extends AppCompatActivity {
 
     @Override
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/ActionBar.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/ActionBar.java
index fb0241a..4333c77 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/ActionBar.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/ActionBar.java
@@ -32,8 +32,6 @@
 
 import androidx.annotation.DrawableRes;
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.StringRes;
 import androidx.appcompat.R;
@@ -42,6 +40,9 @@
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentTransaction;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -549,8 +550,7 @@
      *
      * @return The current ActionBar title or null.
      */
-    @Nullable
-    public abstract CharSequence getTitle();
+    public abstract @Nullable CharSequence getTitle();
 
     /**
      * Returns the current ActionBar subtitle in standard mode.
@@ -559,8 +559,7 @@
      *
      * @return The current ActionBar subtitle or null.
      */
-    @Nullable
-    public abstract CharSequence getSubtitle();
+    public abstract @Nullable CharSequence getSubtitle();
 
     /**
      * Returns the current navigation mode. The result will be one of:
@@ -745,8 +744,7 @@
      * navigation patterns</a> instead.
      */
     @Deprecated
-    @Nullable
-    public abstract Tab getSelectedTab();
+    public abstract @Nullable Tab getSelectedTab();
 
     /**
      * Returns the tab at the specified index.
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java
index c3925bf..71d5d6a 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java
@@ -25,14 +25,15 @@
 import android.view.MenuItem;
 import android.view.View;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 import androidx.appcompat.graphics.drawable.DrawerArrowDrawable;
 import androidx.appcompat.widget.Toolbar;
 import androidx.core.view.GravityCompat;
 import androidx.drawerlayout.widget.DrawerLayout;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * This class provides a handy way to tie together the functionality of
  * {@link DrawerLayout} and the framework <code>ActionBar</code> to
@@ -74,8 +75,7 @@
          * @return Delegate to use for ActionBarDrawableToggles, or null if the Activity
          * does not wish to override the default behavior.
          */
-        @Nullable
-        Delegate getDrawerToggleDelegate();
+        @Nullable Delegate getDrawerToggleDelegate();
     }
 
     public interface Delegate {
@@ -365,8 +365,7 @@
     /**
      * @return DrawerArrowDrawable that is currently shown by the ActionBarDrawerToggle.
      */
-    @NonNull
-    public DrawerArrowDrawable getDrawerArrowDrawable() {
+    public @NonNull DrawerArrowDrawable getDrawerArrowDrawable() {
         return mSlider;
     }
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AlertController.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AlertController.java
index e1ca2bc..7dabfdd 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AlertController.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AlertController.java
@@ -54,12 +54,13 @@
 import android.widget.SimpleCursorAdapter;
 import android.widget.TextView;
 
-import androidx.annotation.Nullable;
 import androidx.appcompat.R;
 import androidx.appcompat.widget.LinearLayoutCompat;
 import androidx.core.view.ViewCompat;
 import androidx.core.widget.NestedScrollView;
 
+import org.jspecify.annotations.Nullable;
+
 import java.lang.ref.WeakReference;
 
 class AlertController {
@@ -437,8 +438,8 @@
      * @param defaultPanel the default panel
      * @return the panel to use
      */
-    @Nullable
-    private ViewGroup resolvePanel(@Nullable View customPanel, @Nullable View defaultPanel) {
+    private @Nullable ViewGroup resolvePanel(
+            @Nullable View customPanel, @Nullable View defaultPanel) {
         if (customPanel == null) {
             // Inflate the default panel, if needed.
             if (defaultPanel instanceof ViewStub) {
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AlertDialog.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AlertDialog.java
index 1e4fc9d..ce6244b 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AlertDialog.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AlertDialog.java
@@ -37,13 +37,14 @@
 import androidx.annotation.ArrayRes;
 import androidx.annotation.AttrRes;
 import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.StringRes;
 import androidx.annotation.StyleRes;
 import androidx.appcompat.R;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * A subclass of Dialog that can display one, two or three buttons. If you only want to
  * display a String in this dialog box, use the setMessage() method.  If you
@@ -352,8 +353,7 @@
          *
          * @return A Context for built Dialogs.
          */
-        @NonNull
-        public Context getContext() {
+        public @NonNull Context getContext() {
             return P.mContext;
         }
 
@@ -975,8 +975,7 @@
          * processing is needed, {@link #show()} may be called instead to both
          * create and display the dialog.
          */
-        @NonNull
-        public AlertDialog create() {
+        public @NonNull AlertDialog create() {
             // We can't use Dialog's 3-arg constructor with the createThemeContextWrapper param,
             // so we always have to re-set the theme
             final AlertDialog dialog = new AlertDialog(P.mContext, mTheme);
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatActivity.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatActivity.java
index cfe80b38..bd983f3 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatActivity.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatActivity.java
@@ -36,8 +36,6 @@
 import androidx.annotation.ContentView;
 import androidx.annotation.IdRes;
 import androidx.annotation.LayoutRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.StyleRes;
 import androidx.appcompat.app.AppCompatDelegate.NightMode;
 import androidx.appcompat.view.ActionMode;
@@ -53,6 +51,9 @@
 import androidx.savedstate.SavedStateRegistry;
 import androidx.savedstate.ViewTreeSavedStateRegistryOwner;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Base class for activities that wish to use some of the newer platform features on older
  * Android devices. Some of these backported features include:
@@ -117,9 +118,8 @@
         // TODO: Directly connect AppCompatDelegate to SavedStateRegistry
         getSavedStateRegistry().registerSavedStateProvider(DELEGATE_TAG,
                 new SavedStateRegistry.SavedStateProvider() {
-                    @NonNull
                     @Override
-                    public Bundle saveState() {
+                    public @NonNull Bundle saveState() {
                         Bundle outState = new Bundle();
                         getDelegate().onSaveInstanceState(outState);
                         return outState;
@@ -160,8 +160,7 @@
      *
      * @return The Activity's ActionBar, or null if it does not have one.
      */
-    @Nullable
-    public ActionBar getSupportActionBar() {
+    public @Nullable ActionBar getSupportActionBar() {
         return getDelegate().getSupportActionBar();
     }
 
@@ -185,9 +184,8 @@
         getDelegate().setSupportActionBar(toolbar);
     }
 
-    @NonNull
     @Override
-    public MenuInflater getMenuInflater() {
+    public @NonNull MenuInflater getMenuInflater() {
         return getDelegate().getMenuInflater();
     }
 
@@ -265,7 +263,7 @@
     }
 
     @Override
-    public final boolean onMenuItemSelected(int featureId, @NonNull android.view.MenuItem item) {
+    public final boolean onMenuItemSelected(int featureId, android.view.@NonNull MenuItem item) {
         if (super.onMenuItemSelected(featureId, item)) {
             return true;
         }
@@ -350,9 +348,9 @@
      * @param callback Callback to control the lifecycle of this action mode
      * @return The ActionMode that was started, or null if the system should present it
      */
-    @Nullable
     @Override
-    public ActionMode onWindowStartingSupportActionMode(@NonNull ActionMode.Callback callback) {
+    public @Nullable ActionMode onWindowStartingSupportActionMode(
+            ActionMode.@NonNull Callback callback) {
         return null;
     }
 
@@ -362,8 +360,7 @@
      * @param callback Callback that will manage lifecycle events for this context mode
      * @return The ContextMode that was started, or null if it was canceled
      */
-    @Nullable
-    public ActionMode startSupportActionMode(@NonNull ActionMode.Callback callback) {
+    public @Nullable ActionMode startSupportActionMode(ActionMode.@NonNull Callback callback) {
         return getDelegate().startSupportActionMode(callback);
     }
 
@@ -499,9 +496,8 @@
      *
      * @return a new Intent targeting the defined parent activity of sourceActivity
      */
-    @Nullable
     @Override
-    public Intent getSupportParentActivityIntent() {
+    public @Nullable Intent getSupportParentActivityIntent() {
         return NavUtils.getParentActivityIntent(this);
     }
 
@@ -552,9 +548,8 @@
     public void onSupportContentChanged() {
     }
 
-    @Nullable
     @Override
-    public ActionBarDrawerToggle.Delegate getDrawerToggleDelegate() {
+    public ActionBarDrawerToggle.@Nullable Delegate getDrawerToggleDelegate() {
         return getDelegate().getDrawerToggleDelegate();
     }
 
@@ -583,8 +578,7 @@
     /**
      * @return The {@link AppCompatDelegate} being used by this Activity.
      */
-    @NonNull
-    public AppCompatDelegate getDelegate() {
+    public @NonNull AppCompatDelegate getDelegate() {
         if (mDelegate == null) {
             mDelegate = AppCompatDelegate.create(this, this);
         }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatCallback.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatCallback.java
index 0447939..cae571e 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatCallback.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatCallback.java
@@ -16,9 +16,10 @@
 
 package androidx.appcompat.app;
 
-import androidx.annotation.Nullable;
 import androidx.appcompat.view.ActionMode;
 
+import org.jspecify.annotations.Nullable;
+
 /**
  * Implemented this in order for AppCompat to be able to callback in certain situations.
  * <p>
@@ -50,6 +51,5 @@
      * @param callback Callback to control the lifecycle of this action mode
      * @return The ActionMode that was started, or null if the system should present it
      */
-    @Nullable
-    ActionMode onWindowStartingSupportActionMode(ActionMode.Callback callback);
+    @Nullable ActionMode onWindowStartingSupportActionMode(ActionMode.Callback callback);
 }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegate.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegate.java
index a1d6165b..e6a1cd5 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegate.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegate.java
@@ -47,8 +47,6 @@
 import androidx.annotation.IdRes;
 import androidx.annotation.IntDef;
 import androidx.annotation.LayoutRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.StyleRes;
@@ -62,6 +60,9 @@
 import androidx.core.view.WindowCompat;
 import androidx.fragment.app.FragmentActivity;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.ref.WeakReference;
@@ -305,8 +306,7 @@
      *
      * @param callback An optional callback for AppCompat specific events
      */
-    @NonNull
-    public static AppCompatDelegate create(@NonNull Activity activity,
+    public static @NonNull AppCompatDelegate create(@NonNull Activity activity,
             @Nullable AppCompatCallback callback) {
         return new AppCompatDelegateImpl(activity, callback);
     }
@@ -316,8 +316,7 @@
      *
      * @param callback An optional callback for AppCompat specific events
      */
-    @NonNull
-    public static AppCompatDelegate create(@NonNull Dialog dialog,
+    public static @NonNull AppCompatDelegate create(@NonNull Dialog dialog,
             @Nullable AppCompatCallback callback) {
         return new AppCompatDelegateImpl(dialog, callback);
     }
@@ -328,9 +327,8 @@
      *
      * @param callback An optional callback for AppCompat specific events
      */
-    @NonNull
-    public static AppCompatDelegate create(@NonNull Context context, @NonNull Window window,
-            @Nullable AppCompatCallback callback) {
+    public static @NonNull AppCompatDelegate create(@NonNull Context context,
+            @NonNull Window window, @Nullable AppCompatCallback callback) {
         return new AppCompatDelegateImpl(context, window, callback);
     }
 
@@ -340,9 +338,8 @@
      *
      * @param callback An optional callback for AppCompat specific events
      */
-    @NonNull
-    public static AppCompatDelegate create(@NonNull Context context, @NonNull Activity activity,
-            @Nullable AppCompatCallback callback) {
+    public static @NonNull AppCompatDelegate create(@NonNull Context context,
+            @NonNull Activity activity, @Nullable AppCompatCallback callback) {
         return new AppCompatDelegateImpl(context, activity, callback);
     }
 
@@ -356,8 +353,7 @@
      *
      * @return AppCompat's action bar, or null if it does not have one.
      */
-    @Nullable
-    public abstract ActionBar getSupportActionBar();
+    public abstract @Nullable ActionBar getSupportActionBar();
 
     /**
      * Set a {@link Toolbar} to act as the {@link ActionBar} for this delegate.
@@ -435,8 +431,7 @@
      * @return The view if found or null otherwise.
      */
     @SuppressWarnings("TypeParameterUnusedInFormals")
-    @Nullable
-    public abstract <T extends View> T findViewById(@IdRes int id);
+    public abstract <T extends View> @Nullable T findViewById(@IdRes int id);
 
     /**
      * Should be called instead of {@link Activity#setContentView(android.view.View)}}
@@ -470,9 +465,8 @@
     /**
      * Should be called from {@link Activity#attachBaseContext(Context)}.
      */
-    @NonNull
     @CallSuper
-    public Context attachBaseContext2(@NonNull Context context) {
+    public @NonNull Context attachBaseContext2(@NonNull Context context) {
         attachBaseContext(context);
         return context;
     }
@@ -497,8 +491,7 @@
      * Returns an {@link ActionBarDrawerToggle.Delegate} which can be returned from your Activity
      * if it implements {@link ActionBarDrawerToggle.DelegateProvider}.
      */
-    @Nullable
-    public abstract ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
+    public abstract ActionBarDrawerToggle.@Nullable Delegate getDrawerToggleDelegate();
 
     /**
      * Enable extended window features.  This should be called instead of
@@ -527,8 +520,8 @@
      * @param callback Callback that will manage lifecycle events for this context mode
      * @return The ContextMode that was started, or null if it was canceled
      */
-    @Nullable
-    public abstract ActionMode startSupportActionMode(@NonNull ActionMode.Callback callback);
+    public abstract @Nullable ActionMode startSupportActionMode(
+            ActionMode.@NonNull Callback callback);
 
     /**
      * Installs AppCompat's {@link android.view.LayoutInflater} Factory so that it can replace
@@ -637,8 +630,7 @@
     /**
      * Returns the context for the current delegate.
      */
-    @Nullable
-    public Context getContextForDelegate() {
+    public @Nullable Context getContextForDelegate() {
         return null;
     }
 
@@ -815,8 +807,7 @@
      * Activity.onCreate().</b></p>
      */
     @AnyThread
-    @NonNull
-    public static LocaleListCompat getApplicationLocales() {
+    public static @NonNull LocaleListCompat getApplicationLocales() {
         if (Build.VERSION.SDK_INT >= 33) {
             // If the API version is 33 or above we want to redirect the call to the framework API.
             Object localeManager = getLocaleManagerForApplication();
@@ -849,8 +840,7 @@
      *
      * @see #setApplicationLocales(LocaleListCompat)
      */
-    @Nullable
-    static LocaleListCompat getRequestedAppLocales() {
+    static @Nullable LocaleListCompat getRequestedAppLocales() {
         return sRequestedAppLocales;
     }
 
@@ -859,8 +849,7 @@
      *
      * @see #setApplicationLocales(LocaleListCompat)
      */
-    @Nullable
-    static LocaleListCompat getStoredAppLocales() {
+    static @Nullable LocaleListCompat getStoredAppLocales() {
         return sStoredAppLocales;
     }
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
index 6f787f3..9347e01 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
@@ -79,8 +79,6 @@
 
 import androidx.annotation.CallSuper;
 import androidx.annotation.IdRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.StyleRes;
@@ -126,6 +124,8 @@
 import androidx.lifecycle.Lifecycle;
 import androidx.lifecycle.LifecycleOwner;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 import org.xmlpull.v1.XmlPullParser;
 
 import java.util.List;
@@ -376,10 +376,9 @@
         }
     }
 
-    @NonNull
     @Override
     @CallSuper
-    public Context attachBaseContext2(@NonNull final Context baseContext) {
+    public @NonNull Context attachBaseContext2(final @NonNull Context baseContext) {
         mBaseContextAttached = true;
 
         // This is a tricky method. Here are some things to avoid:
@@ -660,9 +659,8 @@
     }
 
     @SuppressWarnings({"TypeParameterUnusedInFormals", "unchecked"})
-    @Nullable
     @Override
-    public <T extends View> T findViewById(@IdRes int id) {
+    public <T extends View> @Nullable T findViewById(@IdRes int id) {
         ensureSubDecor();
         return (T) mWindow.findViewById(id);
     }
@@ -1243,7 +1241,7 @@
     }
 
     @Override
-    public ActionMode startSupportActionMode(@NonNull final ActionMode.Callback callback) {
+    public ActionMode startSupportActionMode(final ActionMode.@NonNull Callback callback) {
         if (callback == null) {
             throw new IllegalArgumentException("ActionMode callback can not be null.");
         }
@@ -1280,7 +1278,7 @@
         invalidatePanelMenu(FEATURE_OPTIONS_PANEL);
     }
 
-    ActionMode startSupportActionModeFromWindow(@NonNull ActionMode.Callback callback) {
+    ActionMode startSupportActionModeFromWindow(ActionMode.@NonNull Callback callback) {
         endOnGoingFadeAnimation();
         if (mActionMode != null) {
             mActionMode.finish();
@@ -1713,8 +1711,7 @@
         return onCreateView(null, name, context, attrs);
     }
 
-    @Nullable
-    private AppCompatActivity tryUnwrapContext() {
+    private @Nullable AppCompatActivity tryUnwrapContext() {
         Context context = mContext;
         while (context != null) {
             if (context instanceof AppCompatActivity) {
@@ -2297,8 +2294,8 @@
      * @param rectInsets the current system window insets if {@code insets} is not available
      * @return the new top system window inset
      */
-    final int updateStatusGuard(@Nullable final WindowInsetsCompat insets,
-            @Nullable final Rect rectInsets) {
+    final int updateStatusGuard(final @Nullable WindowInsetsCompat insets,
+            final @Nullable Rect rectInsets) {
         int systemWindowInsetTop = 0;
         if (insets != null) {
             systemWindowInsetTop = insets.getSystemWindowInsetTop();
@@ -2557,8 +2554,7 @@
      * checks for requested app-specific locales and returns them after an overlay
      * with the system locales. If requested app-specific do not exist, it returns a null.
      */
-    @Nullable
-    LocaleListCompat calculateApplicationLocales(@NonNull Context context) {
+    @Nullable LocaleListCompat calculateApplicationLocales(@NonNull Context context) {
         if (Build.VERSION.SDK_INT >= 33) {
             return null;
         }
@@ -2686,8 +2682,7 @@
         }
     }
 
-    @NonNull
-    private Configuration createOverrideAppConfiguration(@NonNull Context context,
+    private @NonNull Configuration createOverrideAppConfiguration(@NonNull Context context,
             @ApplyableNightMode int mode, @Nullable LocaleListCompat locales,
             @Nullable Configuration configOverlay, boolean ignoreFollowSystem) {
         int newNightMode;
@@ -2858,7 +2853,7 @@
     }
 
     private void updateResourcesConfiguration(int uiModeNightModeValue,
-            @Nullable final LocaleListCompat locales, final boolean callOnConfigChange,
+            final @Nullable LocaleListCompat locales, final boolean callOnConfigChange,
             @Nullable Configuration configOverlay) {
         // If the Activity is not set to handle config changes we will
         // update the Resources with a new Configuration with  updated nightMode and locales.
@@ -2918,10 +2913,9 @@
 
     /**
      */
-    @NonNull
     @RestrictTo(LIBRARY)
     @VisibleForTesting
-    final AutoNightModeManager getAutoTimeNightModeManager() {
+    final @NonNull AutoNightModeManager getAutoTimeNightModeManager() {
         return getAutoTimeNightModeManager(mContext);
     }
 
@@ -3368,8 +3362,7 @@
     interface ActionBarMenuCallback {
         boolean onPreparePanel(int featureId);
 
-        @Nullable
-        View onCreatePanelView(int featureId);
+        @Nullable View onCreatePanelView(int featureId);
     }
 
     class AppCompatWindowCallback extends WindowCallbackWrapper {
@@ -3636,8 +3629,7 @@
             mContext.registerReceiver(mReceiver, filter);
         }
 
-        @Nullable
-        abstract IntentFilter createIntentFilterForBroadcastReceiver();
+        abstract @Nullable IntentFilter createIntentFilterForBroadcastReceiver();
 
         void cleanup() {
             if (mReceiver != null) {
@@ -3778,8 +3770,7 @@
      * <p>
      * This is fine for device configurations as no member is ever undefined.
      */
-    @NonNull
-    private static Configuration generateConfigDelta(@NonNull Configuration base,
+    private static @NonNull Configuration generateConfigDelta(@NonNull Configuration base,
             @Nullable Configuration change) {
         final Configuration delta = new Configuration();
         delta.fontScale = 0;
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialog.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialog.java
index 6b4759e..45a10d7 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialog.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialog.java
@@ -29,8 +29,6 @@
 import androidx.activity.ViewTreeOnBackPressedDispatcherOwner;
 import androidx.annotation.IdRes;
 import androidx.annotation.LayoutRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.appcompat.view.ActionMode;
@@ -38,6 +36,9 @@
 import androidx.lifecycle.ViewTreeLifecycleOwner;
 import androidx.savedstate.ViewTreeSavedStateRegistryOwner;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Base class for AppCompat themed {@link android.app.Dialog}s.
  */
@@ -120,9 +121,8 @@
     }
 
     @SuppressWarnings("TypeParameterUnusedInFormals")
-    @Nullable
     @Override
-    public <T extends View> T findViewById(@IdRes int id) {
+    public <T extends View> @Nullable T findViewById(@IdRes int id) {
         return getDelegate().findViewById(id);
     }
 
@@ -186,8 +186,7 @@
     /**
      * @return The {@link AppCompatDelegate} being used by this Dialog.
      */
-    @NonNull
-    public AppCompatDelegate getDelegate() {
+    public @NonNull AppCompatDelegate getDelegate() {
         if (mDelegate == null) {
             mDelegate = AppCompatDelegate.create(this, this);
         }
@@ -212,9 +211,8 @@
     public void onSupportActionModeFinished(ActionMode mode) {
     }
 
-    @Nullable
     @Override
-    public ActionMode onWindowStartingSupportActionMode(ActionMode.Callback callback) {
+    public @Nullable ActionMode onWindowStartingSupportActionMode(ActionMode.Callback callback) {
         return null;
     }
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialogFragment.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialogFragment.java
index ffa9967..345b83d 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialogFragment.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatDialogFragment.java
@@ -25,11 +25,12 @@
 import android.view.WindowManager;
 
 import androidx.annotation.LayoutRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.fragment.app.DialogFragment;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * A special version of {@link DialogFragment} which uses an {@link AppCompatDialog} in place of a
  * platform-styled dialog.
@@ -48,9 +49,8 @@
         super(contentLayoutId);
     }
 
-    @NonNull
     @Override
-    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+    public @NonNull Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
         return new AppCompatDialog(getContext(), getTheme());
     }
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatViewInflater.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatViewInflater.java
index f6de633..6f4dc4c 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatViewInflater.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatViewInflater.java
@@ -25,8 +25,6 @@
 import android.view.InflateException;
 import android.view.View;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.R;
 import androidx.appcompat.view.ContextThemeWrapper;
 import androidx.appcompat.widget.AppCompatAutoCompleteTextView;
@@ -47,6 +45,9 @@
 import androidx.collection.SimpleArrayMap;
 import androidx.core.view.ViewCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -120,8 +121,7 @@
      *                    additional resource system feature backports
      * @return an AppCompat-compatible widget
      */
-    @Nullable
-    public final View createView(@Nullable View parent, @NonNull final String name,
+    public final @Nullable View createView(@Nullable View parent, final @NonNull String name,
             @NonNull Context context,
             @NonNull AttributeSet attrs, boolean inheritContext,
             boolean readAndroidTheme, boolean readAppTheme, boolean wrapContext) {
@@ -223,75 +223,63 @@
         return view;
     }
 
-    @NonNull
-    protected AppCompatTextView createTextView(Context context, AttributeSet attrs) {
+    protected @NonNull AppCompatTextView createTextView(Context context, AttributeSet attrs) {
         return new AppCompatTextView(context, attrs);
     }
 
-    @NonNull
-    protected AppCompatImageView createImageView(Context context, AttributeSet attrs) {
+    protected @NonNull AppCompatImageView createImageView(Context context, AttributeSet attrs) {
         return new AppCompatImageView(context, attrs);
     }
 
-    @NonNull
-    protected AppCompatButton createButton(Context context, AttributeSet attrs) {
+    protected @NonNull AppCompatButton createButton(Context context, AttributeSet attrs) {
         return new AppCompatButton(context, attrs);
     }
 
-    @NonNull
-    protected AppCompatEditText createEditText(Context context, AttributeSet attrs) {
+    protected @NonNull AppCompatEditText createEditText(Context context, AttributeSet attrs) {
         return new AppCompatEditText(context, attrs);
     }
 
-    @NonNull
-    protected AppCompatSpinner createSpinner(Context context, AttributeSet attrs) {
+    protected @NonNull AppCompatSpinner createSpinner(Context context, AttributeSet attrs) {
         return new AppCompatSpinner(context, attrs);
     }
 
-    @NonNull
-    protected AppCompatImageButton createImageButton(Context context, AttributeSet attrs) {
+    protected @NonNull AppCompatImageButton createImageButton(Context context, AttributeSet attrs) {
         return new AppCompatImageButton(context, attrs);
     }
 
-    @NonNull
-    protected AppCompatCheckBox createCheckBox(Context context, AttributeSet attrs) {
+    protected @NonNull AppCompatCheckBox createCheckBox(Context context, AttributeSet attrs) {
         return new AppCompatCheckBox(context, attrs);
     }
 
-    @NonNull
-    protected AppCompatRadioButton createRadioButton(Context context, AttributeSet attrs) {
+    protected @NonNull AppCompatRadioButton createRadioButton(Context context, AttributeSet attrs) {
         return new AppCompatRadioButton(context, attrs);
     }
 
-    @NonNull
-    protected AppCompatCheckedTextView createCheckedTextView(Context context, AttributeSet attrs) {
+    protected @NonNull AppCompatCheckedTextView createCheckedTextView(Context context,
+            AttributeSet attrs) {
         return new AppCompatCheckedTextView(context, attrs);
     }
 
-    @NonNull
-    protected AppCompatAutoCompleteTextView createAutoCompleteTextView(Context context,
+    protected @NonNull AppCompatAutoCompleteTextView createAutoCompleteTextView(Context context,
             AttributeSet attrs) {
         return new AppCompatAutoCompleteTextView(context, attrs);
     }
 
-    @NonNull
-    protected AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(Context context,
-            AttributeSet attrs) {
+    protected @NonNull AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(
+            Context context, AttributeSet attrs) {
         return new AppCompatMultiAutoCompleteTextView(context, attrs);
     }
 
-    @NonNull
-    protected AppCompatRatingBar createRatingBar(Context context, AttributeSet attrs) {
+    protected @NonNull AppCompatRatingBar createRatingBar(Context context, AttributeSet attrs) {
         return new AppCompatRatingBar(context, attrs);
     }
 
-    @NonNull
-    protected AppCompatSeekBar createSeekBar(Context context, AttributeSet attrs) {
+    protected @NonNull AppCompatSeekBar createSeekBar(Context context, AttributeSet attrs) {
         return new AppCompatSeekBar(context, attrs);
     }
 
-    @NonNull
-    protected AppCompatToggleButton createToggleButton(Context context, AttributeSet attrs) {
+    protected @NonNull AppCompatToggleButton createToggleButton(Context context,
+            AttributeSet attrs) {
         return new AppCompatToggleButton(context, attrs);
     }
 
@@ -302,8 +290,7 @@
         }
     }
 
-    @Nullable
-    protected View createView(Context context, String name, AttributeSet attrs) {
+    protected @Nullable View createView(Context context, String name, AttributeSet attrs) {
         return null;
     }
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppLocalesMetadataHolderService.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppLocalesMetadataHolderService.java
index de453cf..12a0bd4 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppLocalesMetadataHolderService.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppLocalesMetadataHolderService.java
@@ -25,10 +25,11 @@
 import android.os.Build;
 import android.os.IBinder;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.core.os.LocaleListCompat;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * A placeholder service to avoid adding application-level metadata. The service
  * is only used to expose metadata defined in the library's manifest. It is
@@ -41,9 +42,9 @@
 public final class AppLocalesMetadataHolderService extends Service {
     public AppLocalesMetadataHolderService() {}
 
-    @NonNull
     @Override
-    public IBinder onBind(@SuppressWarnings("InvalidNullabilityOverride") @NonNull Intent intent) {
+    public @NonNull IBinder onBind(
+            @SuppressWarnings("InvalidNullabilityOverride") @NonNull Intent intent) {
         throw new UnsupportedOperationException();
     }
 
@@ -53,9 +54,8 @@
      * <p>This serviceInfo contains the attribute "autoStoreLocales", its value being a boolean
      * that informs us if the developer wants us to handle the storage of locales or not.</p>
      */
-    @NonNull
     @SuppressWarnings("deprecation") // GET_DISABLED_COMPONENTS, getServiceInfo
-    public static ServiceInfo getServiceInfo(@NonNull Context context) throws
+    public static @NonNull ServiceInfo getServiceInfo(@NonNull Context context) throws
             PackageManager.NameNotFoundException {
         int flags = PackageManager.GET_META_DATA;
         // The service is marked as disabled so we need to include the following flags.
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/LayoutIncludeDetector.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/LayoutIncludeDetector.java
index 71963ec..be26f91 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/LayoutIncludeDetector.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/LayoutIncludeDetector.java
@@ -18,9 +18,8 @@
 
 import android.util.AttributeSet;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -35,8 +34,7 @@
  */
 class LayoutIncludeDetector {
 
-    @NonNull
-    private final Deque<WeakReference<XmlPullParser>> mXmlParserStack = new ArrayDeque<>();
+    private final @NonNull Deque<WeakReference<XmlPullParser>> mXmlParserStack = new ArrayDeque<>();
 
     /**
      * Returns true if this is the start of an included layout file, otherwise false.
@@ -89,9 +87,8 @@
      * @param xmlParserStack stack to purge
      * @return most recent {@link XmlPullParser} that is not outdated
      */
-    @Nullable
-    private static XmlPullParser popOutdatedAttrHolders(@NonNull
-            Deque<WeakReference<XmlPullParser>> xmlParserStack) {
+    private static @Nullable XmlPullParser popOutdatedAttrHolders(
+            @NonNull Deque<WeakReference<XmlPullParser>> xmlParserStack) {
         while (!xmlParserStack.isEmpty()) {
             XmlPullParser parser = xmlParserStack.peek().get();
             if (isParserOutdated(parser)) {
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/ResourcesFlusher.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/ResourcesFlusher.java
index d7fb7ad..f0b53bf 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/ResourcesFlusher.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/ResourcesFlusher.java
@@ -21,9 +21,10 @@
 import android.util.Log;
 import android.util.LongSparseArray;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 
+import org.jspecify.annotations.NonNull;
+
 import java.lang.reflect.Field;
 import java.util.Map;
 
@@ -42,7 +43,7 @@
     private static Field sResourcesImplField;
     private static boolean sResourcesImplFieldFetched;
 
-    static void flush(@NonNull final Resources resources) {
+    static void flush(final @NonNull Resources resources) {
         if (Build.VERSION.SDK_INT >= 28) {
             // no-op on P and above
             return;
@@ -56,7 +57,7 @@
     }
 
     @RequiresApi(21)
-    private static void flushLollipops(@NonNull final Resources resources) {
+    private static void flushLollipops(final @NonNull Resources resources) {
         if (!sDrawableCacheFieldFetched) {
             try {
                 sDrawableCacheField = Resources.class.getDeclaredField("mDrawableCache");
@@ -80,7 +81,7 @@
     }
 
     @RequiresApi(23)
-    private static void flushMarshmallows(@NonNull final Resources resources) {
+    private static void flushMarshmallows(final @NonNull Resources resources) {
         if (!sDrawableCacheFieldFetched) {
             try {
                 sDrawableCacheField = Resources.class.getDeclaredField("mDrawableCache");
@@ -109,7 +110,7 @@
     }
 
     @RequiresApi(24)
-    private static void flushNougats(@NonNull final Resources resources) {
+    private static void flushNougats(final @NonNull Resources resources) {
         if (!sResourcesImplFieldFetched) {
             try {
                 sResourcesImplField = Resources.class.getDeclaredField("mResourcesImpl");
@@ -161,7 +162,7 @@
         }
     }
 
-    private static void flushThemedResourcesCache(@NonNull final Object cache) {
+    private static void flushThemedResourcesCache(final @NonNull Object cache) {
         if (!sThemedResourceCacheClazzFetched) {
             try {
                 sThemedResourceCacheClazz = Class.forName("android.content.res.ThemedResourceCache");
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/ToolbarActionBar.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/ToolbarActionBar.java
index d2565a5..883b7e4 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/ToolbarActionBar.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/ToolbarActionBar.java
@@ -30,8 +30,6 @@
 import android.view.Window;
 import android.widget.SpinnerAdapter;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.view.menu.MenuBuilder;
 import androidx.appcompat.view.menu.MenuPresenter;
 import androidx.appcompat.widget.DecorToolbar;
@@ -40,6 +38,9 @@
 import androidx.core.util.Preconditions;
 import androidx.core.view.ViewCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.ArrayList;
 
 class ToolbarActionBar extends ActionBar {
@@ -68,7 +69,7 @@
             };
 
     ToolbarActionBar(@NonNull Toolbar toolbar, @Nullable CharSequence title,
-            @NonNull Window.Callback windowCallback) {
+            Window.@NonNull Callback windowCallback) {
         Preconditions.checkNotNull(toolbar);
         mDecorToolbar = new ToolbarWidgetWrapper(toolbar, false);
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/TwilightManager.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/TwilightManager.java
index 6d445c09..16ae3e4 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/TwilightManager.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/TwilightManager.java
@@ -27,11 +27,12 @@
 import android.text.format.DateUtils;
 import android.util.Log;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RequiresPermission;
 import androidx.annotation.VisibleForTesting;
 import androidx.core.content.PermissionChecker;
 
+import org.jspecify.annotations.NonNull;
+
 import java.util.Calendar;
 
 /**
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/WindowDecorActionBar.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/WindowDecorActionBar.java
index ff2e791f1..0c4b3cb 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/WindowDecorActionBar.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/WindowDecorActionBar.java
@@ -42,7 +42,6 @@
 import android.view.animation.Interpolator;
 import android.widget.SpinnerAdapter;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.appcompat.content.res.AppCompatResources;
@@ -67,6 +66,8 @@
 import androidx.fragment.app.FragmentActivity;
 import androidx.fragment.app.FragmentTransaction;
 
+import org.jspecify.annotations.NonNull;
+
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/graphics/drawable/DrawerArrowDrawable.java b/appcompat/appcompat/src/main/java/androidx/appcompat/graphics/drawable/DrawerArrowDrawable.java
index ae0eb0d..97d7e03 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/graphics/drawable/DrawerArrowDrawable.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/graphics/drawable/DrawerArrowDrawable.java
@@ -32,12 +32,13 @@
 import androidx.annotation.ColorInt;
 import androidx.annotation.FloatRange;
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.core.graphics.drawable.DrawableCompat;
 import androidx.core.view.ViewCompat;
 
+import org.jspecify.annotations.NonNull;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/view/StandaloneActionMode.java b/appcompat/appcompat/src/main/java/androidx/appcompat/view/StandaloneActionMode.java
index 7f8b6e3..8c28593 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/view/StandaloneActionMode.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/view/StandaloneActionMode.java
@@ -23,13 +23,14 @@
 import android.view.MenuItem;
 import android.view.View;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.view.menu.MenuBuilder;
 import androidx.appcompat.view.menu.MenuPopupHelper;
 import androidx.appcompat.view.menu.SubMenuBuilder;
 import androidx.appcompat.widget.ActionBarContextView;
 
+import org.jspecify.annotations.NonNull;
+
 import java.lang.ref.WeakReference;
 
 /**
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java
index a589b288b..37700ab 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java
@@ -29,14 +29,15 @@
 import android.view.SubMenu;
 import android.view.View;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.core.content.ContextCompat;
 import androidx.core.graphics.drawable.DrawableCompat;
 import androidx.core.internal.view.SupportMenuItem;
 import androidx.core.view.ActionProvider;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  */
 @RestrictTo(LIBRARY_GROUP_PREFIX)
@@ -180,9 +181,8 @@
         return this;
     }
 
-    @NonNull
     @Override
-    public MenuItem setAlphabeticShortcut(char alphaChar, int alphaModifiers) {
+    public @NonNull MenuItem setAlphabeticShortcut(char alphaChar, int alphaModifiers) {
         mShortcutAlphabeticChar = Character.toLowerCase(alphaChar);
         mShortcutAlphabeticModifiers = KeyEvent.normalizeMetaState(alphaModifiers);
         return this;
@@ -239,9 +239,8 @@
         return this;
     }
 
-    @NonNull
     @Override
-    public MenuItem setNumericShortcut(char numericChar, int numericModifiers) {
+    public @NonNull MenuItem setNumericShortcut(char numericChar, int numericModifiers) {
         mShortcutNumericChar = numericChar;
         mShortcutNumericModifiers = KeyEvent.normalizeMetaState(numericModifiers);
         return this;
@@ -260,9 +259,8 @@
         return this;
     }
 
-    @NonNull
     @Override
-    public MenuItem setShortcut(char numericChar, char alphaChar, int numericModifiers,
+    public @NonNull MenuItem setShortcut(char numericChar, char alphaChar, int numericModifiers,
             int alphaModifiers) {
         mShortcutNumericChar = numericChar;
         mShortcutNumericModifiers = KeyEvent.normalizeMetaState(numericModifiers);
@@ -323,9 +321,8 @@
         return false;
     }
 
-    @NonNull
     @Override
-    public SupportMenuItem setActionView(View actionView) {
+    public @NonNull SupportMenuItem setActionView(View actionView) {
         throw new UnsupportedOperationException();
     }
 
@@ -344,9 +341,8 @@
         throw new UnsupportedOperationException();
     }
 
-    @NonNull
     @Override
-    public SupportMenuItem setActionView(int resId) {
+    public @NonNull SupportMenuItem setActionView(int resId) {
         throw new UnsupportedOperationException();
     }
 
@@ -355,15 +351,13 @@
         return null;
     }
 
-    @NonNull
     @Override
-    public SupportMenuItem setSupportActionProvider(ActionProvider actionProvider) {
+    public @NonNull SupportMenuItem setSupportActionProvider(ActionProvider actionProvider) {
         throw new UnsupportedOperationException();
     }
 
-    @NonNull
     @Override
-    public SupportMenuItem setShowAsActionFlags(int actionEnum) {
+    public @NonNull SupportMenuItem setShowAsActionFlags(int actionEnum) {
         setShowAsAction(actionEnum);
         return this;
     }
@@ -388,9 +382,8 @@
         throw new UnsupportedOperationException();
     }
 
-    @NonNull
     @Override
-    public SupportMenuItem setContentDescription(CharSequence contentDescription) {
+    public @NonNull SupportMenuItem setContentDescription(CharSequence contentDescription) {
         mContentDescription = contentDescription;
         return this;
     }
@@ -400,9 +393,8 @@
         return mContentDescription;
     }
 
-    @NonNull
     @Override
-    public SupportMenuItem setTooltipText(CharSequence tooltipText) {
+    public @NonNull SupportMenuItem setTooltipText(CharSequence tooltipText) {
         mTooltipText = tooltipText;
         return this;
     }
@@ -412,9 +404,8 @@
         return mTooltipText;
     }
 
-    @NonNull
     @Override
-    public MenuItem setIconTintList(@Nullable ColorStateList iconTintList) {
+    public @NonNull MenuItem setIconTintList(@Nullable ColorStateList iconTintList) {
         mIconTintList = iconTintList;
         mHasIconTint = true;
 
@@ -428,9 +419,8 @@
         return mIconTintList;
     }
 
-    @NonNull
     @Override
-    public MenuItem setIconTintMode(PorterDuff.Mode iconTintMode) {
+    public @NonNull MenuItem setIconTintMode(PorterDuff.Mode iconTintMode) {
         mIconTintMode = iconTintMode;
         mHasIconTintMode = true;
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/CascadingMenuPopup.java b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/CascadingMenuPopup.java
index 3957a72..e22ad41 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/CascadingMenuPopup.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/CascadingMenuPopup.java
@@ -42,8 +42,6 @@
 
 import androidx.annotation.AttrRes;
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.StyleRes;
 import androidx.appcompat.R;
 import androidx.appcompat.widget.MenuItemHoverListener;
@@ -51,6 +49,9 @@
 import androidx.core.internal.view.SupportMenu;
 import androidx.core.view.GravityCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
@@ -144,7 +145,7 @@
 
         @Override
         public void onItemHoverEnter(
-                @NonNull final MenuBuilder menu, @NonNull final MenuItem item) {
+                final @NonNull MenuBuilder menu, final @NonNull MenuItem item) {
             // Something new was hovered, cancel all scheduled runnables.
             mSubMenuHoverHandler.removeCallbacksAndMessages(null);
 
@@ -531,8 +532,7 @@
      * @param submenu the submenu whose parent view should be obtained
      * @return the parent view, or {@code null} if one could not be found
      */
-    @Nullable
-    private View findParentViewForSubmenu(
+    private @Nullable View findParentViewForSubmenu(
             @NonNull CascadingMenuInfo parentInfo, @NonNull MenuBuilder submenu) {
         final MenuItem owner = findMenuItemForSubmenu(parentInfo.menu, submenu);
         if (owner == null) {
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuBuilder.java b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuBuilder.java
index 47fb9e8..c028921 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuBuilder.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuBuilder.java
@@ -37,7 +37,6 @@
 import android.view.View;
 import android.view.ViewConfiguration;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.core.content.ContextCompat;
 import androidx.core.internal.view.SupportMenu;
@@ -45,6 +44,8 @@
 import androidx.core.view.ActionProvider;
 import androidx.core.view.ViewConfigurationCompat;
 
+import org.jspecify.annotations.NonNull;
+
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.List;
@@ -1116,8 +1117,7 @@
         onItemsChanged(true);
     }
 
-    @NonNull
-    public ArrayList<MenuItemImpl> getVisibleItems() {
+    public @NonNull ArrayList<MenuItemImpl> getVisibleItems() {
         if (!mIsVisibleItemsStale) return mVisibleItems;
 
         // Refresh the visible items
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuDialogHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuDialogHelper.java
index 4d4093b..43ba513 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuDialogHelper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuDialogHelper.java
@@ -24,10 +24,11 @@
 import android.view.Window;
 import android.view.WindowManager;
 
-import androidx.annotation.NonNull;
 import androidx.appcompat.R;
 import androidx.appcompat.app.AlertDialog;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * Helper for menus that appear as Dialogs (context and submenus).
  */
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java
index dbdc39a..80f9f41 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java
@@ -36,8 +36,6 @@
 import android.view.ViewDebug;
 import android.widget.LinearLayout;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.appcompat.content.res.AppCompatResources;
@@ -45,6 +43,9 @@
 import androidx.core.internal.view.SupportMenuItem;
 import androidx.core.view.ActionProvider;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  */
 @RestrictTo(LIBRARY_GROUP_PREFIX)
@@ -255,9 +256,8 @@
         return this;
     }
 
-    @NonNull
     @Override
-    public MenuItem setAlphabeticShortcut(char alphaChar, int alphaModifiers) {
+    public @NonNull MenuItem setAlphabeticShortcut(char alphaChar, int alphaModifiers) {
         if (mShortcutAlphabeticChar == alphaChar
                 && mShortcutAlphabeticModifiers == alphaModifiers) {
             return this;
@@ -298,9 +298,8 @@
         return this;
     }
 
-    @NonNull
     @Override
-    public MenuItem setNumericShortcut(char numericChar, int numericModifiers) {
+    public @NonNull MenuItem setNumericShortcut(char numericChar, int numericModifiers) {
         if (mShortcutNumericChar == numericChar && mShortcutNumericModifiers == numericModifiers) {
             return this;
         }
@@ -323,9 +322,8 @@
         return this;
     }
 
-    @NonNull
     @Override
-    public MenuItem setShortcut(char numericChar, char alphaChar, int numericModifiers,
+    public @NonNull MenuItem setShortcut(char numericChar, char alphaChar, int numericModifiers,
             int alphaModifiers) {
         mShortcutNumericChar = numericChar;
         mShortcutNumericModifiers = KeyEvent.normalizeMetaState(numericModifiers);
@@ -526,9 +524,8 @@
     }
 
 
-    @NonNull
     @Override
-    public MenuItem setIconTintList(@Nullable ColorStateList iconTintList) {
+    public @NonNull MenuItem setIconTintList(@Nullable ColorStateList iconTintList) {
         mIconTintList = iconTintList;
         mHasIconTint = true;
         mNeedToApplyIconTint = true;
@@ -543,9 +540,8 @@
         return mIconTintList;
     }
 
-    @NonNull
     @Override
-    public MenuItem setIconTintMode(PorterDuff.Mode iconTintMode) {
+    public @NonNull MenuItem setIconTintMode(PorterDuff.Mode iconTintMode) {
         mIconTintMode = iconTintMode;
         mHasIconTintMode = true;
         mNeedToApplyIconTint = true;
@@ -740,9 +736,8 @@
         mMenu.onItemActionRequestChanged(this);
     }
 
-    @NonNull
     @Override
-    public SupportMenuItem setActionView(View view) {
+    public @NonNull SupportMenuItem setActionView(View view) {
         mActionView = view;
         mActionProvider = null;
         if (view != null && view.getId() == View.NO_ID && mId > 0) {
@@ -752,9 +747,8 @@
         return this;
     }
 
-    @NonNull
     @Override
-    public SupportMenuItem setActionView(int resId) {
+    public @NonNull SupportMenuItem setActionView(int resId) {
         final Context context = mMenu.getContext();
         final LayoutInflater inflater = LayoutInflater.from(context);
         setActionView(inflater.inflate(resId, new LinearLayout(context), false));
@@ -790,9 +784,8 @@
         return mActionProvider;
     }
 
-    @NonNull
     @Override
-    public SupportMenuItem setSupportActionProvider(ActionProvider actionProvider) {
+    public @NonNull SupportMenuItem setSupportActionProvider(ActionProvider actionProvider) {
         if (mActionProvider != null) {
             mActionProvider.reset();
         }
@@ -810,9 +803,8 @@
         return this;
     }
 
-    @NonNull
     @Override
-    public SupportMenuItem setShowAsActionFlags(int actionEnum) {
+    public @NonNull SupportMenuItem setShowAsActionFlags(int actionEnum) {
         setShowAsAction(actionEnum);
         return this;
     }
@@ -875,9 +867,8 @@
         return this;
     }
 
-    @NonNull
     @Override
-    public SupportMenuItem setContentDescription(CharSequence contentDescription) {
+    public @NonNull SupportMenuItem setContentDescription(CharSequence contentDescription) {
         mContentDescription = contentDescription;
 
         mMenu.onItemsChanged(false);
@@ -890,9 +881,8 @@
         return mContentDescription;
     }
 
-    @NonNull
     @Override
-    public SupportMenuItem setTooltipText(CharSequence tooltipText) {
+    public @NonNull SupportMenuItem setTooltipText(CharSequence tooltipText) {
         mTooltipText = tooltipText;
 
         mMenu.onItemsChanged(false);
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java
index d35af13..c3a73f7 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java
@@ -30,12 +30,13 @@
 import android.view.View;
 import android.widget.FrameLayout;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.view.CollapsibleActionView;
 import androidx.core.internal.view.SupportMenuItem;
 import androidx.core.view.ActionProvider;
 
+import org.jspecify.annotations.NonNull;
+
 import java.lang.reflect.Method;
 
 /**
@@ -469,8 +470,7 @@
         }
 
         @Override
-        @NonNull
-        public View onCreateActionView() {
+        public @NonNull View onCreateActionView() {
             return mInner.onCreateActionView();
         }
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPopup.java b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPopup.java
index f59c9f9..b926aa8 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPopup.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPopup.java
@@ -28,10 +28,11 @@
 import android.widget.ListAdapter;
 import android.widget.PopupWindow;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.core.internal.view.SupportMenu;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Base class for a menu popup abstraction - i.e., some type of menu, housed in a popup window
  * environment.
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java
index 7bf848f..9567c4c 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java
@@ -31,13 +31,14 @@
 import android.widget.PopupWindow.OnDismissListener;
 
 import androidx.annotation.AttrRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.StyleRes;
 import androidx.appcompat.R;
 import androidx.core.view.GravityCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Presents a menu as a small, simple popup anchored to another view.
  *
@@ -153,8 +154,7 @@
     /**
      */
     @RestrictTo(LIBRARY)
-    @NonNull
-    public MenuPopup getPopup() {
+    public @NonNull MenuPopup getPopup() {
         if (mPopup == null) {
             mPopup = createPopup();
         }
@@ -221,9 +221,8 @@
      *
      * @return an initialized popup
      */
-    @NonNull
     @SuppressWarnings("deprecation") /* getDefaultDisplay */
-    private MenuPopup createPopup() {
+    private @NonNull MenuPopup createPopup() {
         final WindowManager windowManager = (WindowManager) mContext.getSystemService(
                 Context.WINDOW_SERVICE);
         final Display display = windowManager.getDefaultDisplay();
@@ -320,7 +319,7 @@
     }
 
     @Override
-    public void setPresenterCallback(@Nullable MenuPresenter.Callback cb) {
+    public void setPresenterCallback(MenuPresenter.@Nullable Callback cb) {
         mPresenterCallback = cb;
         if (mPopup != null) {
             mPopup.setCallback(cb);
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPresenter.java b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPresenter.java
index 46af852..7694890 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPresenter.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/MenuPresenter.java
@@ -22,9 +22,10 @@
 import android.os.Parcelable;
 import android.view.ViewGroup;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * A MenuPresenter is responsible for building views for a Menu object. It takes over some
  * responsibility from the old style monolithic MenuBuilder class.
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java
index fbd4601..01ba5eb 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java
@@ -25,9 +25,10 @@
 import android.view.SubMenu;
 import android.view.View;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * The model for a sub menu, which is an extension of the menu.  Most methods are proxied to the
  * parent menu.
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AbsActionBarView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AbsActionBarView.java
index 3ed4a46..bf59b8e 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AbsActionBarView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AbsActionBarView.java
@@ -26,13 +26,14 @@
 import android.view.View;
 import android.view.ViewGroup;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.R;
 import androidx.core.view.ViewCompat;
 import androidx.core.view.ViewPropertyAnimatorCompat;
 import androidx.core.view.ViewPropertyAnimatorListener;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 abstract class AbsActionBarView extends ViewGroup {
     private static final int FADE_DURATION = 200;
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarBackgroundDrawable.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarBackgroundDrawable.java
index 2af5be6..305053c9 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarBackgroundDrawable.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarBackgroundDrawable.java
@@ -22,9 +22,10 @@
 import android.graphics.PixelFormat;
 import android.graphics.drawable.Drawable;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 
+import org.jspecify.annotations.NonNull;
+
 class ActionBarBackgroundDrawable extends Drawable {
 
     final ActionBarContainer mContainer;
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContainer.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContainer.java
index bd7ce7f..0dc464f 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContainer.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContainer.java
@@ -28,11 +28,12 @@
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * This class acts as a container for the action bar view and action mode context views.
  * It applies special styles as needed to help handle animated transitions between them.
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContextView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContextView.java
index 3fbccd1..99eaa09 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContextView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarContextView.java
@@ -27,14 +27,15 @@
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.appcompat.view.ActionMode;
 import androidx.appcompat.view.menu.MenuBuilder;
 import androidx.core.view.ViewCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  */
 @RestrictTo(LIBRARY_GROUP_PREFIX)
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarOverlayLayout.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarOverlayLayout.java
index bc0e4a3..f578c7a 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarOverlayLayout.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionBarOverlayLayout.java
@@ -39,8 +39,6 @@
 import android.view.WindowInsets;
 import android.widget.OverScroller;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
@@ -54,6 +52,9 @@
 import androidx.core.view.ViewCompat;
 import androidx.core.view.WindowInsetsCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Special layout for the containing of an overlay action bar (and its content) to correctly handle
  * fitting system windows when the content has request that its layout ignore them.
@@ -101,10 +102,10 @@
     private final Rect mLastInnerInsetsRect = new Rect();
 
     // Used on API 21+
-    @NonNull private WindowInsetsCompat mBaseInnerInsets = WindowInsetsCompat.CONSUMED;
-    @NonNull private WindowInsetsCompat mLastBaseInnerInsets = WindowInsetsCompat.CONSUMED;
-    @NonNull private WindowInsetsCompat mInnerInsets = WindowInsetsCompat.CONSUMED;
-    @NonNull private WindowInsetsCompat mLastInnerInsets = WindowInsetsCompat.CONSUMED;
+    private @NonNull WindowInsetsCompat mBaseInnerInsets = WindowInsetsCompat.CONSUMED;
+    private @NonNull WindowInsetsCompat mLastBaseInnerInsets = WindowInsetsCompat.CONSUMED;
+    private @NonNull WindowInsetsCompat mInnerInsets = WindowInsetsCompat.CONSUMED;
+    private @NonNull WindowInsetsCompat mLastInnerInsets = WindowInsetsCompat.CONSUMED;
 
     private ActionBarVisibilityCallback mActionBarVisibilityCallback;
 
@@ -394,7 +395,7 @@
 
     @RequiresApi(21)
     @Override
-    public WindowInsets onApplyWindowInsets(@NonNull final WindowInsets in) {
+    public WindowInsets onApplyWindowInsets(final @NonNull WindowInsets in) {
         pullChildren();
 
         final int vis = getWindowSystemUiVisibility();
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionMenuPresenter.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionMenuPresenter.java
index 11f4532..0940822 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionMenuPresenter.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionMenuPresenter.java
@@ -30,8 +30,6 @@
 import android.view.View.MeasureSpec;
 import android.view.ViewGroup;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.R;
 import androidx.appcompat.view.ActionBarPolicy;
 import androidx.appcompat.view.menu.ActionMenuItemView;
@@ -46,6 +44,9 @@
 import androidx.core.view.ActionProvider;
 import androidx.core.view.GravityCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.ArrayList;
 
 /**
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionMenuView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionMenuView.java
index 949e159..02c7e00 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionMenuView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActionMenuView.java
@@ -31,8 +31,6 @@
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityEvent;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.StyleRes;
 import androidx.appcompat.view.menu.ActionMenuItemView;
@@ -41,6 +39,9 @@
 import androidx.appcompat.view.menu.MenuPresenter;
 import androidx.appcompat.view.menu.MenuView;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * ActionMenuView is a presentation of a series of menu options as a View. It provides
  * several top level options as action buttons while spilling remaining options over as
@@ -559,8 +560,7 @@
      *
      * @return The overflow icon drawable
      */
-    @Nullable
-    public Drawable getOverflowIcon() {
+    public @Nullable Drawable getOverflowIcon() {
         getMenu();
         return mPresenter.getOverflowIcon();
     }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActivityChooserView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActivityChooserView.java
index 4fc7fb2..380eec9 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActivityChooserView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ActivityChooserView.java
@@ -44,8 +44,6 @@
 import android.widget.PopupWindow;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.appcompat.view.menu.ShowableListMenu;
@@ -53,6 +51,9 @@
 import androidx.core.view.ViewCompat;
 import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * This class is a view for choosing an activity for handling a given {@link Intent}.
  * <p>
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AlertDialogLayout.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AlertDialogLayout.java
index 819c18f..eacffd1 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AlertDialogLayout.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AlertDialogLayout.java
@@ -25,12 +25,13 @@
 import android.view.View;
 import android.view.ViewGroup;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.core.view.GravityCompat;
 import androidx.core.view.ViewCompat;
 
+import org.jspecify.annotations.Nullable;
+
 /**
  * Special implementation of linear layout that's capable of laying out alert
  * dialog components.
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java
index d184fc2..6f137f8 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java
@@ -31,8 +31,6 @@
 import android.widget.TextView;
 
 import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.appcompat.content.res.AppCompatResources;
@@ -41,6 +39,9 @@
 import androidx.core.widget.TintableCompoundDrawablesView;
 import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * A {@link AutoCompleteTextView} which supports compatible features on older versions of the
  * platform, including:
@@ -66,8 +67,7 @@
 
     private final AppCompatBackgroundHelper mBackgroundTintHelper;
     private final AppCompatTextHelper mTextHelper;
-    @NonNull
-    private final AppCompatEmojiEditTextHelper mAppCompatEmojiEditTextHelper;
+    private final @NonNull AppCompatEmojiEditTextHelper mAppCompatEmojiEditTextHelper;
 
     public AppCompatAutoCompleteTextView(@NonNull Context context) {
         this(context, null);
@@ -183,8 +183,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public ColorStateList getSupportBackgroundTintList() {
+    public @Nullable ColorStateList getSupportBackgroundTintList() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintList() : null;
     }
@@ -196,7 +195,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportBackgroundTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mBackgroundTintHelper != null) {
             mBackgroundTintHelper.setSupportBackgroundTintMode(tintMode);
         }
@@ -209,8 +208,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public PorterDuff.Mode getSupportBackgroundTintMode() {
+    public PorterDuff.@Nullable Mode getSupportBackgroundTintMode() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintMode() : null;
     }
@@ -247,14 +245,13 @@
      */
     @Override
     public void setCustomSelectionActionModeCallback(
-            @Nullable ActionMode.Callback actionModeCallback) {
+            ActionMode.@Nullable Callback actionModeCallback) {
         super.setCustomSelectionActionModeCallback(
                 TextViewCompat.wrapCustomSelectionActionModeCallback(this, actionModeCallback));
     }
 
     @Override
-    @Nullable
-    public ActionMode.Callback getCustomSelectionActionModeCallback() {
+    public ActionMode.@Nullable Callback getCustomSelectionActionModeCallback() {
         return TextViewCompat.unwrapCustomSelectionActionModeCallback(
                 super.getCustomSelectionActionModeCallback());
     }
@@ -307,10 +304,9 @@
      * @see #setSupportCompoundDrawablesTintList(ColorStateList)
      *
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public ColorStateList getSupportCompoundDrawablesTintList() {
+    public @Nullable ColorStateList getSupportCompoundDrawablesTintList() {
         return mTextHelper.getCompoundDrawableTintList();
     }
 
@@ -348,10 +344,9 @@
      * @see #setSupportCompoundDrawablesTintMode(PorterDuff.Mode)
      *
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public PorterDuff.Mode getSupportCompoundDrawablesTintMode() {
+    public PorterDuff.@Nullable Mode getSupportCompoundDrawablesTintMode() {
         return mTextHelper.getCompoundDrawableTintMode();
     }
 
@@ -370,7 +365,7 @@
      */
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public void setSupportCompoundDrawablesTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportCompoundDrawablesTintMode(PorterDuff.@Nullable Mode tintMode) {
         mTextHelper.setCompoundDrawableTintMode(tintMode);
         mTextHelper.applyCompoundDrawablesTints();
     }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatBackgroundHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatBackgroundHelper.java
index bcc381b..c3d5148 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatBackgroundHelper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatBackgroundHelper.java
@@ -23,15 +23,15 @@
 import android.util.AttributeSet;
 import android.view.View;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.R;
 import androidx.core.view.ViewCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 class AppCompatBackgroundHelper {
 
-    @NonNull
-    private final View mView;
+    private final @NonNull View mView;
     private final AppCompatDrawableManager mDrawableManager;
 
     private int mBackgroundResId = -1;
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatButton.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatButton.java
index 4f96bef..5e5e452 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatButton.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatButton.java
@@ -33,8 +33,6 @@
 import android.widget.TextView;
 
 import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.core.view.TintableBackgroundView;
@@ -43,6 +41,9 @@
 import androidx.core.widget.TintableCompoundDrawablesView;
 import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * A {@link Button} which supports compatible features on older versions of the platform,
  * including:
@@ -65,8 +66,7 @@
 
     private final AppCompatBackgroundHelper mBackgroundTintHelper;
     private final AppCompatTextHelper mTextHelper;
-    @NonNull
-    private AppCompatEmojiTextHelper mAppCompatEmojiTextHelper;
+    private @NonNull AppCompatEmojiTextHelper mAppCompatEmojiTextHelper;
 
     public AppCompatButton(@NonNull Context context) {
         this(context, null);
@@ -129,8 +129,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public ColorStateList getSupportBackgroundTintList() {
+    public @Nullable ColorStateList getSupportBackgroundTintList() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintList() : null;
     }
@@ -142,7 +141,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportBackgroundTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mBackgroundTintHelper != null) {
             mBackgroundTintHelper.setSupportBackgroundTintMode(tintMode);
         }
@@ -155,8 +154,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public PorterDuff.Mode getSupportBackgroundTintMode() {
+    public PorterDuff.@Nullable Mode getSupportBackgroundTintMode() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintMode() : null;
     }
@@ -260,7 +258,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setAutoSizeTextTypeUniformWithPresetSizes(@NonNull int[] presetSizes, int unit)
+    public void setAutoSizeTextTypeUniformWithPresetSizes(int @NonNull [] presetSizes, int unit)
             throws IllegalArgumentException {
         if (SDK_LEVEL_SUPPORTS_AUTOSIZE) {
             super.setAutoSizeTextTypeUniformWithPresetSizes(presetSizes, unit);
@@ -372,14 +370,13 @@
      */
     @Override
     public void setCustomSelectionActionModeCallback(
-            @Nullable ActionMode.Callback actionModeCallback) {
+            ActionMode.@Nullable Callback actionModeCallback) {
         super.setCustomSelectionActionModeCallback(
                 TextViewCompat.wrapCustomSelectionActionModeCallback(this, actionModeCallback));
     }
 
     @Override
-    @Nullable
-    public ActionMode.Callback getCustomSelectionActionModeCallback() {
+    public ActionMode.@Nullable Callback getCustomSelectionActionModeCallback() {
         return TextViewCompat.unwrapCustomSelectionActionModeCallback(
                 super.getCustomSelectionActionModeCallback());
     }
@@ -397,10 +394,9 @@
     /**
      * @return the tint applied to the compound drawables
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public ColorStateList getSupportCompoundDrawablesTintList() {
+    public @Nullable ColorStateList getSupportCompoundDrawablesTintList() {
         return mTextHelper.getCompoundDrawableTintList();
     }
 
@@ -409,7 +405,7 @@
      */
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public void setSupportCompoundDrawablesTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportCompoundDrawablesTintMode(PorterDuff.@Nullable Mode tintMode) {
         mTextHelper.setCompoundDrawableTintMode(tintMode);
         mTextHelper.applyCompoundDrawablesTints();
     }
@@ -417,16 +413,15 @@
     /**
      * @return the blending mode used to apply the tint to the compound drawables
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public PorterDuff.Mode getSupportCompoundDrawablesTintMode() {
+    public PorterDuff.@Nullable Mode getSupportCompoundDrawablesTintMode() {
         return mTextHelper.getCompoundDrawableTintMode();
     }
 
 
     @Override
-    public void setFilters(@SuppressWarnings("ArrayReturn") @NonNull InputFilter[] filters) {
+    public void setFilters(@SuppressWarnings("ArrayReturn") InputFilter @NonNull [] filters) {
         super.setFilters(getEmojiTextViewHelper().getFilters(filters));
     }
 
@@ -434,8 +429,7 @@
     /**
      * This may be called from super constructors.
      */
-    @NonNull
-    private AppCompatEmojiTextHelper getEmojiTextViewHelper() {
+    private @NonNull AppCompatEmojiTextHelper getEmojiTextViewHelper() {
         //noinspection ConstantConditions
         if (mAppCompatEmojiTextHelper == null) {
             mAppCompatEmojiTextHelper = new AppCompatEmojiTextHelper(this);
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckBox.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckBox.java
index 79d3921..1a750fb 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckBox.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckBox.java
@@ -29,8 +29,6 @@
 import android.widget.TextView;
 
 import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.appcompat.content.res.AppCompatResources;
@@ -40,6 +38,9 @@
 import androidx.core.widget.TintableCompoundDrawablesView;
 import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * A {@link CheckBox} which supports compatible features on older versions of the platform,
  * including:
@@ -94,8 +95,7 @@
     /**
      * This may be called from super constructors.
      */
-    @NonNull
-    private AppCompatEmojiTextHelper getEmojiTextViewHelper() {
+    private @NonNull AppCompatEmojiTextHelper getEmojiTextViewHelper() {
         if (mAppCompatEmojiTextHelper == null) {
             mAppCompatEmojiTextHelper = new AppCompatEmojiTextHelper(this);
         }
@@ -130,9 +130,8 @@
      * This should be accessed from {@link androidx.core.widget.CompoundButtonCompat}
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    @Nullable
     @Override
-    public ColorStateList getSupportButtonTintList() {
+    public @Nullable ColorStateList getSupportButtonTintList() {
         return mCompoundButtonHelper != null
                 ? mCompoundButtonHelper.getSupportButtonTintList()
                 : null;
@@ -143,7 +142,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setSupportButtonTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportButtonTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mCompoundButtonHelper != null) {
             mCompoundButtonHelper.setSupportButtonTintMode(tintMode);
         }
@@ -153,9 +152,8 @@
      * This should be accessed from {@link androidx.core.widget.CompoundButtonCompat}
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    @Nullable
     @Override
-    public PorterDuff.Mode getSupportButtonTintMode() {
+    public PorterDuff.@Nullable Mode getSupportButtonTintMode() {
         return mCompoundButtonHelper != null
                 ? mCompoundButtonHelper.getSupportButtonTintMode()
                 : null;
@@ -180,8 +178,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public ColorStateList getSupportBackgroundTintList() {
+    public @Nullable ColorStateList getSupportBackgroundTintList() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintList() : null;
     }
@@ -193,7 +190,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportBackgroundTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mBackgroundTintHelper != null) {
             mBackgroundTintHelper.setSupportBackgroundTintMode(tintMode);
         }
@@ -206,8 +203,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public PorterDuff.Mode getSupportBackgroundTintMode() {
+    public PorterDuff.@Nullable Mode getSupportBackgroundTintMode() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintMode() : null;
     }
@@ -240,7 +236,7 @@
     }
 
     @Override
-    public void setFilters(@SuppressWarnings("ArrayReturn") @NonNull InputFilter[] filters) {
+    public void setFilters(@SuppressWarnings("ArrayReturn") InputFilter @NonNull [] filters) {
         super.setFilters(getEmojiTextViewHelper().getFilters(filters));
     }
 
@@ -287,10 +283,9 @@
      * @see #setSupportCompoundDrawablesTintList(ColorStateList)
      *
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public ColorStateList getSupportCompoundDrawablesTintList() {
+    public @Nullable ColorStateList getSupportCompoundDrawablesTintList() {
         return mTextHelper.getCompoundDrawableTintList();
     }
 
@@ -328,10 +323,9 @@
      * @see #setSupportCompoundDrawablesTintMode(PorterDuff.Mode)
      *
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public PorterDuff.Mode getSupportCompoundDrawablesTintMode() {
+    public PorterDuff.@Nullable Mode getSupportCompoundDrawablesTintMode() {
         return mTextHelper.getCompoundDrawableTintMode();
     }
 
@@ -350,7 +344,7 @@
      */
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public void setSupportCompoundDrawablesTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportCompoundDrawablesTintMode(PorterDuff.@Nullable Mode tintMode) {
         mTextHelper.setCompoundDrawableTintMode(tintMode);
         mTextHelper.applyCompoundDrawablesTints();
     }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckedTextView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckedTextView.java
index 606a40c..88acdf6 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckedTextView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckedTextView.java
@@ -31,8 +31,6 @@
 import android.widget.TextView;
 
 import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.appcompat.content.res.AppCompatResources;
@@ -43,6 +41,9 @@
 import androidx.core.widget.TintableCompoundDrawablesView;
 import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * A {@link CheckedTextView} which supports compatible features on older versions of the platform,
  * including:
@@ -70,8 +71,7 @@
     private final AppCompatCheckedTextViewHelper mCheckedHelper;
     private final AppCompatBackgroundHelper mBackgroundTintHelper;
     private final AppCompatTextHelper mTextHelper;
-    @NonNull
-    private AppCompatEmojiTextHelper mAppCompatEmojiTextHelper;
+    private @NonNull AppCompatEmojiTextHelper mAppCompatEmojiTextHelper;
 
     public AppCompatCheckedTextView(@NonNull Context context) {
         this(context, null);
@@ -131,9 +131,8 @@
      *
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    @Nullable
     @Override
-    public ColorStateList getSupportCheckMarkTintList() {
+    public @Nullable ColorStateList getSupportCheckMarkTintList() {
         return mCheckedHelper != null
                 ? mCheckedHelper.getSupportCheckMarkTintList()
                 : null;
@@ -145,7 +144,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setSupportCheckMarkTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportCheckMarkTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mCheckedHelper != null) {
             mCheckedHelper.setSupportCheckMarkTintMode(tintMode);
         }
@@ -156,9 +155,8 @@
      *
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    @Nullable
     @Override
-    public PorterDuff.Mode getSupportCheckMarkTintMode() {
+    public PorterDuff.@Nullable Mode getSupportCheckMarkTintMode() {
         return mCheckedHelper != null
                 ? mCheckedHelper.getSupportCheckMarkTintMode()
                 : null;
@@ -183,8 +181,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public ColorStateList getSupportBackgroundTintList() {
+    public @Nullable ColorStateList getSupportBackgroundTintList() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintList() : null;
     }
@@ -196,7 +193,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportBackgroundTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mBackgroundTintHelper != null) {
             mBackgroundTintHelper.setSupportBackgroundTintMode(tintMode);
         }
@@ -209,8 +206,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public PorterDuff.Mode getSupportBackgroundTintMode() {
+    public PorterDuff.@Nullable Mode getSupportBackgroundTintMode() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintMode() : null;
     }
@@ -254,8 +250,7 @@
     }
 
     @Override
-    @Nullable
-    public InputConnection onCreateInputConnection(@NonNull EditorInfo outAttrs) {
+    public @Nullable InputConnection onCreateInputConnection(@NonNull EditorInfo outAttrs) {
         return AppCompatHintHelper.onCreateInputConnection(super.onCreateInputConnection(outAttrs),
                 outAttrs, this);
     }
@@ -266,14 +261,13 @@
      */
     @Override
     public void setCustomSelectionActionModeCallback(
-            @Nullable ActionMode.Callback actionModeCallback) {
+            ActionMode.@Nullable Callback actionModeCallback) {
         super.setCustomSelectionActionModeCallback(
                 TextViewCompat.wrapCustomSelectionActionModeCallback(this, actionModeCallback));
     }
 
     @Override
-    @Nullable
-    public ActionMode.Callback getCustomSelectionActionModeCallback() {
+    public ActionMode.@Nullable Callback getCustomSelectionActionModeCallback() {
         return TextViewCompat.unwrapCustomSelectionActionModeCallback(
                 super.getCustomSelectionActionModeCallback());
     }
@@ -281,8 +275,7 @@
     /**
      * This may be called from super constructors.
      */
-    @NonNull
-    private AppCompatEmojiTextHelper getEmojiTextViewHelper() {
+    private @NonNull AppCompatEmojiTextHelper getEmojiTextViewHelper() {
         //noinspection ConstantConditions
         if (mAppCompatEmojiTextHelper == null) {
             mAppCompatEmojiTextHelper = new AppCompatEmojiTextHelper(this);
@@ -334,10 +327,9 @@
      * @see #setSupportCompoundDrawablesTintList(ColorStateList)
      *
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public ColorStateList getSupportCompoundDrawablesTintList() {
+    public @Nullable ColorStateList getSupportCompoundDrawablesTintList() {
         return mTextHelper.getCompoundDrawableTintList();
     }
 
@@ -375,10 +367,9 @@
      * @see #setSupportCompoundDrawablesTintMode(PorterDuff.Mode)
      *
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public PorterDuff.Mode getSupportCompoundDrawablesTintMode() {
+    public PorterDuff.@Nullable Mode getSupportCompoundDrawablesTintMode() {
         return mTextHelper.getCompoundDrawableTintMode();
     }
 
@@ -397,7 +388,7 @@
      */
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public void setSupportCompoundDrawablesTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportCompoundDrawablesTintMode(PorterDuff.@Nullable Mode tintMode) {
         mTextHelper.setCompoundDrawableTintMode(tintMode);
         mTextHelper.applyCompoundDrawablesTints();
     }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckedTextViewHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckedTextViewHelper.java
index 73b631a..3459276 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckedTextViewHelper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCheckedTextViewHelper.java
@@ -25,8 +25,6 @@
 import android.util.AttributeSet;
 import android.widget.CheckedTextView;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.appcompat.content.res.AppCompatResources;
@@ -34,10 +32,12 @@
 import androidx.core.view.ViewCompat;
 import androidx.core.widget.CheckedTextViewCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 @RestrictTo(LIBRARY)
 class AppCompatCheckedTextViewHelper {
-    @NonNull
-    private final CheckedTextView mView;
+    private final @NonNull CheckedTextView mView;
 
     private ColorStateList mCheckMarkTintList = null;
     private PorterDuff.Mode mCheckMarkTintMode = null;
@@ -107,7 +107,7 @@
         return mCheckMarkTintList;
     }
 
-    void setSupportCheckMarkTintMode(@Nullable PorterDuff.Mode tintMode) {
+    void setSupportCheckMarkTintMode(PorterDuff.@Nullable Mode tintMode) {
         mCheckMarkTintMode = tintMode;
         mHasCheckMarkTintMode = true;
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCompoundButtonHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCompoundButtonHelper.java
index bf9b410..e78f66f 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCompoundButtonHelper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatCompoundButtonHelper.java
@@ -23,17 +23,17 @@
 import android.util.AttributeSet;
 import android.widget.CompoundButton;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.R;
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.core.graphics.drawable.DrawableCompat;
 import androidx.core.view.ViewCompat;
 import androidx.core.widget.CompoundButtonCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 class AppCompatCompoundButtonHelper {
-    @NonNull
-    private final CompoundButton mView;
+    private final @NonNull CompoundButton mView;
 
     private ColorStateList mButtonTintList = null;
     private PorterDuff.Mode mButtonTintMode = null;
@@ -101,7 +101,7 @@
         return mButtonTintList;
     }
 
-    void setSupportButtonTintMode(@Nullable PorterDuff.Mode tintMode) {
+    void setSupportButtonTintMode(PorterDuff.@Nullable Mode tintMode) {
         mButtonTintMode = tintMode;
         mHasButtonTintMode = true;
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java
index 479200e..e894c47 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java
@@ -39,11 +39,12 @@
 import androidx.annotation.ColorInt;
 import androidx.annotation.DimenRes;
 import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.core.graphics.drawable.DrawableCompat;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  */
 @RestrictTo(LIBRARY_GROUP_PREFIX)
@@ -148,7 +149,7 @@
                             getThemeAttrColor(context, R.attr.colorAccent));
                 }
 
-                private ColorStateList createButtonColorStateList(@NonNull final Context context,
+                private ColorStateList createButtonColorStateList(final @NonNull Context context,
                         @ColorInt final int baseColor) {
                     final int[][] states = new int[4][];
                     final int[] colors = new int[4];
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEditText.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEditText.java
index fcb6eda..58c2f28 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEditText.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEditText.java
@@ -38,8 +38,6 @@
 import android.widget.TextView;
 
 import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.UiThread;
@@ -56,6 +54,9 @@
 import androidx.core.widget.TintableCompoundDrawablesView;
 import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * A {@link EditText} which supports compatible features on older versions of the platform,
  * including:
@@ -83,10 +84,8 @@
     private final AppCompatTextHelper mTextHelper;
     private final AppCompatTextClassifierHelper mTextClassifierHelper;
     private final TextViewOnReceiveContentListener mDefaultOnReceiveContentListener;
-    @NonNull
-    private final AppCompatEmojiEditTextHelper mAppCompatEmojiEditTextHelper;
-    @Nullable
-    private SuperCaller mSuperCaller;
+    private final @NonNull AppCompatEmojiEditTextHelper mAppCompatEmojiEditTextHelper;
+    private @Nullable SuperCaller mSuperCaller;
 
     public AppCompatEditText(@NonNull Context context) {
         this(context, null);
@@ -162,7 +161,7 @@
      * will return null.
      */
     @Override
-    @Nullable public Editable getText() {
+    public @Nullable Editable getText() {
         if (Build.VERSION.SDK_INT >= 28) {
             return super.getText();
         }
@@ -207,8 +206,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public ColorStateList getSupportBackgroundTintList() {
+    public @Nullable ColorStateList getSupportBackgroundTintList() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintList() : null;
     }
@@ -220,7 +218,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportBackgroundTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mBackgroundTintHelper != null) {
             mBackgroundTintHelper.setSupportBackgroundTintMode(tintMode);
         }
@@ -233,8 +231,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public PorterDuff.Mode getSupportBackgroundTintMode() {
+    public PorterDuff.@Nullable Mode getSupportBackgroundTintMode() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintMode() : null;
     }
@@ -264,9 +261,8 @@
      *
      * {@inheritDoc}
      */
-    @Nullable
     @Override
-    public InputConnection onCreateInputConnection(@NonNull EditorInfo outAttrs) {
+    public @Nullable InputConnection onCreateInputConnection(@NonNull EditorInfo outAttrs) {
         InputConnection ic = super.onCreateInputConnection(outAttrs);
         mTextHelper.populateSurroundingTextIfNeeded(this, ic, outAttrs);
         ic = AppCompatHintHelper.onCreateInputConnection(ic, outAttrs, this);
@@ -290,14 +286,13 @@
      */
     @Override
     public void setCustomSelectionActionModeCallback(
-            @Nullable ActionMode.Callback actionModeCallback) {
+            ActionMode.@Nullable Callback actionModeCallback) {
         super.setCustomSelectionActionModeCallback(
                 TextViewCompat.wrapCustomSelectionActionModeCallback(this, actionModeCallback));
     }
 
     @Override
-    @Nullable
-    public ActionMode.Callback getCustomSelectionActionModeCallback() {
+    public ActionMode.@Nullable Callback getCustomSelectionActionModeCallback() {
         return TextViewCompat.unwrapCustomSelectionActionModeCallback(
                 super.getCustomSelectionActionModeCallback());
     }
@@ -317,9 +312,8 @@
     }
 
     @UiThread
-    @NonNull
     @RequiresApi(26)
-    private SuperCaller getSuperCaller() {
+    private @NonNull SuperCaller getSuperCaller() {
         if (mSuperCaller == null) {
             mSuperCaller = new SuperCaller();
         }
@@ -345,9 +339,8 @@
      * {@link android.view.textclassifier.TextClassificationManager}.
      */
     @Override
-    @NonNull
     @RequiresApi(api = 26)
-    public TextClassifier getTextClassifier() {
+    public @NonNull TextClassifier getTextClassifier() {
         // The null check is necessary because getTextClassifier is called when we are invoking
         // the super class's constructor.
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P || mTextClassifierHelper == null) {
@@ -394,9 +387,8 @@
      * @return The portion of the passed-in content that was not handled (may be all, some, or none
      * of the passed-in content).
      */
-    @Nullable
     @Override
-    public ContentInfoCompat onReceiveContent(@NonNull ContentInfoCompat payload) {
+    public @Nullable ContentInfoCompat onReceiveContent(@NonNull ContentInfoCompat payload) {
         return mDefaultOnReceiveContentListener.onReceiveContent(this, payload);
     }
 
@@ -448,10 +440,9 @@
      * @see #setSupportCompoundDrawablesTintList(ColorStateList)
      *
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public ColorStateList getSupportCompoundDrawablesTintList() {
+    public @Nullable ColorStateList getSupportCompoundDrawablesTintList() {
         return mTextHelper.getCompoundDrawableTintList();
     }
 
@@ -489,10 +480,9 @@
      * @see #setSupportCompoundDrawablesTintMode(PorterDuff.Mode)
      *
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public PorterDuff.Mode getSupportCompoundDrawablesTintMode() {
+    public PorterDuff.@Nullable Mode getSupportCompoundDrawablesTintMode() {
         return mTextHelper.getCompoundDrawableTintMode();
     }
 
@@ -511,7 +501,7 @@
      */
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public void setSupportCompoundDrawablesTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportCompoundDrawablesTintMode(PorterDuff.@Nullable Mode tintMode) {
         mTextHelper.setCompoundDrawableTintMode(tintMode);
         mTextHelper.applyCompoundDrawablesTints();
     }
@@ -519,8 +509,7 @@
     @RequiresApi(api = 26)
     class SuperCaller {
 
-        @Nullable
-        public TextClassifier getTextClassifier() {
+        public @Nullable TextClassifier getTextClassifier() {
             return AppCompatEditText.super.getTextClassifier();
         }
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEmojiEditTextHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEmojiEditTextHelper.java
index 987ca76..9f0a585 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEmojiEditTextHelper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEmojiEditTextHelper.java
@@ -26,20 +26,19 @@
 import android.widget.EditText;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.R;
 import androidx.emoji2.viewsintegration.EmojiEditTextHelper;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Helper for using EmojiCompat from TextView in appcompat.
  */
 class AppCompatEmojiEditTextHelper {
 
-    @NonNull
-    private final EditText mView;
-    @NonNull
-    private final EmojiEditTextHelper mEmojiEditTextHelper;
+    private final @NonNull EditText mView;
+    private final @NonNull EmojiEditTextHelper mEmojiEditTextHelper;
 
     /**
      * Helper for integrating EmojiCompat into an EditText subclass.
@@ -116,8 +115,7 @@
      *
      * @return a new KeyListener instance that wraps {@code keyListener}, or null if passed null.
      */
-    @Nullable
-    KeyListener getKeyListener(@Nullable KeyListener keyListener) {
+    @Nullable KeyListener getKeyListener(@Nullable KeyListener keyListener) {
         // add a guard for NumberkeyListener both here and in emoji2 to avoid release dependency.
         // this allows appcompat 1.4.1 to ship without a dependency on emoji2 1.1.
         if (isEmojiCapableKeyListener(keyListener)) {
@@ -142,8 +140,7 @@
      *
      * @return a new InputConnection instance that wraps {@code inputConnection}
      */
-    @Nullable
-    InputConnection onCreateInputConnection(@Nullable InputConnection inputConnection,
+    @Nullable InputConnection onCreateInputConnection(@Nullable InputConnection inputConnection,
             @NonNull EditorInfo outAttrs) {
         return mEmojiEditTextHelper.onCreateInputConnection(inputConnection, outAttrs);
     }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEmojiTextHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEmojiTextHelper.java
index b7418d6..0308988 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEmojiTextHelper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEmojiTextHelper.java
@@ -23,20 +23,19 @@
 import android.util.AttributeSet;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.R;
 import androidx.emoji2.viewsintegration.EmojiTextViewHelper;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Helper for using EmojiCompat from TextView in appcompat.
  */
 class AppCompatEmojiTextHelper {
 
-    @NonNull
-    private final TextView mView;
-    @NonNull
-    private final EmojiTextViewHelper mEmojiTextViewHelper;
+    private final @NonNull TextView mView;
+    private final @NonNull EmojiTextViewHelper mEmojiTextViewHelper;
 
     AppCompatEmojiTextHelper(@NonNull TextView view) {
         mView = view;
@@ -94,8 +93,8 @@
      * availability
      */
     @SuppressWarnings("ArrayReturn")
-    @NonNull
-    InputFilter[] getFilters(@SuppressWarnings("ArrayReturn") @NonNull InputFilter[] filters) {
+    InputFilter @NonNull [] getFilters(
+            @SuppressWarnings("ArrayReturn") InputFilter @NonNull [] filters) {
         return mEmojiTextViewHelper.getFilters(filters);
     }
 
@@ -116,8 +115,7 @@
      *                             transform
      * @return the correct transformation based on isEnabled, may be null
      */
-    @Nullable
-    public TransformationMethod wrapTransformationMethod(
+    public @Nullable TransformationMethod wrapTransformationMethod(
             @Nullable TransformationMethod transformationMethod) {
         return mEmojiTextViewHelper.wrapTransformationMethod(transformationMethod);
     }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageButton.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageButton.java
index 63c15e0..9dafb34 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageButton.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageButton.java
@@ -29,8 +29,6 @@
 import android.widget.ImageView;
 
 import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.core.view.TintableBackgroundView;
@@ -38,6 +36,9 @@
 import androidx.core.widget.TintableImageSourceView;
 import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * A {@link ImageButton} which supports compatible features on older versions of the platform,
  * including:
@@ -160,8 +161,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public ColorStateList getSupportBackgroundTintList() {
+    public @Nullable ColorStateList getSupportBackgroundTintList() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintList() : null;
     }
@@ -173,7 +173,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportBackgroundTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mBackgroundTintHelper != null) {
             mBackgroundTintHelper.setSupportBackgroundTintMode(tintMode);
         }
@@ -186,8 +186,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public PorterDuff.Mode getSupportBackgroundTintMode() {
+    public PorterDuff.@Nullable Mode getSupportBackgroundTintMode() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintMode() : null;
     }
@@ -211,8 +210,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public ColorStateList getSupportImageTintList() {
+    public @Nullable ColorStateList getSupportImageTintList() {
         return mImageHelper != null
                 ? mImageHelper.getSupportImageTintList() : null;
     }
@@ -224,7 +222,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setSupportImageTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportImageTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mImageHelper != null) {
             mImageHelper.setSupportImageTintMode(tintMode);
         }
@@ -237,8 +235,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public PorterDuff.Mode getSupportImageTintMode() {
+    public PorterDuff.@Nullable Mode getSupportImageTintMode() {
         return mImageHelper != null
                 ? mImageHelper.getSupportImageTintMode() : null;
     }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageHelper.java
index 3c7b25e..84a07cf 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageHelper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageHelper.java
@@ -25,19 +25,19 @@
 import android.util.AttributeSet;
 import android.widget.ImageView;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.core.view.ViewCompat;
 import androidx.core.widget.ImageViewCompat;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  */
 @RestrictTo(LIBRARY_GROUP_PREFIX)
 public class AppCompatImageHelper {
-    @NonNull
-    private final ImageView mView;
+    private final @NonNull ImageView mView;
 
     private TintInfo mInternalImageTint;
     private TintInfo mImageTint;
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageView.java
index a7bdad9..7f1bd11 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatImageView.java
@@ -28,14 +28,15 @@
 import android.widget.ImageView;
 
 import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.core.view.TintableBackgroundView;
 import androidx.core.widget.ImageViewCompat;
 import androidx.core.widget.TintableImageSourceView;
 import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * A {@link ImageView} which supports compatible features on older versions of the platform,
  * including:
@@ -171,8 +172,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public ColorStateList getSupportBackgroundTintList() {
+    public @Nullable ColorStateList getSupportBackgroundTintList() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintList() : null;
     }
@@ -184,7 +184,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportBackgroundTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mBackgroundTintHelper != null) {
             mBackgroundTintHelper.setSupportBackgroundTintMode(tintMode);
         }
@@ -197,8 +197,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public PorterDuff.Mode getSupportBackgroundTintMode() {
+    public PorterDuff.@Nullable Mode getSupportBackgroundTintMode() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintMode() : null;
     }
@@ -223,8 +222,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public ColorStateList getSupportImageTintList() {
+    public @Nullable ColorStateList getSupportImageTintList() {
         return mImageHelper != null
                 ? mImageHelper.getSupportImageTintList() : null;
     }
@@ -236,7 +234,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setSupportImageTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportImageTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mImageHelper != null) {
             mImageHelper.setSupportImageTintMode(tintMode);
         }
@@ -249,8 +247,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public PorterDuff.Mode getSupportImageTintMode() {
+    public PorterDuff.@Nullable Mode getSupportImageTintMode() {
         return mImageHelper != null
                 ? mImageHelper.getSupportImageTintMode() : null;
     }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextView.java
index 9ad2193..346f542 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextView.java
@@ -30,8 +30,6 @@
 import android.widget.TextView;
 
 import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.appcompat.content.res.AppCompatResources;
@@ -39,6 +37,9 @@
 import androidx.core.widget.TintableCompoundDrawablesView;
 import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * A {@link MultiAutoCompleteTextView} which supports compatible features on older version of the
  * platform, including:
@@ -65,8 +66,7 @@
 
     private final AppCompatBackgroundHelper mBackgroundTintHelper;
     private final AppCompatTextHelper mTextHelper;
-    @NonNull
-    private final AppCompatEmojiEditTextHelper mAppCompatEmojiEditTextHelper;
+    private final @NonNull AppCompatEmojiEditTextHelper mAppCompatEmojiEditTextHelper;
 
     public AppCompatMultiAutoCompleteTextView(@NonNull Context context) {
         this(context, null);
@@ -183,8 +183,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public ColorStateList getSupportBackgroundTintList() {
+    public @Nullable ColorStateList getSupportBackgroundTintList() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintList() : null;
     }
@@ -196,7 +195,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportBackgroundTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mBackgroundTintHelper != null) {
             mBackgroundTintHelper.setSupportBackgroundTintMode(tintMode);
         }
@@ -209,8 +208,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public PorterDuff.Mode getSupportBackgroundTintMode() {
+    public PorterDuff.@Nullable Mode getSupportBackgroundTintMode() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintMode() : null;
     }
@@ -289,10 +287,9 @@
      * @see #setSupportCompoundDrawablesTintList(ColorStateList)
      *
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public ColorStateList getSupportCompoundDrawablesTintList() {
+    public @Nullable ColorStateList getSupportCompoundDrawablesTintList() {
         return mTextHelper.getCompoundDrawableTintList();
     }
 
@@ -330,10 +327,9 @@
      * @see #setSupportCompoundDrawablesTintMode(PorterDuff.Mode)
      *
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public PorterDuff.Mode getSupportCompoundDrawablesTintMode() {
+    public PorterDuff.@Nullable Mode getSupportCompoundDrawablesTintMode() {
         return mTextHelper.getCompoundDrawableTintMode();
     }
 
@@ -352,7 +348,7 @@
      */
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public void setSupportCompoundDrawablesTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportCompoundDrawablesTintMode(PorterDuff.@Nullable Mode tintMode) {
         mTextHelper.setCompoundDrawableTintMode(tintMode);
         mTextHelper.applyCompoundDrawablesTints();
     }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatPopupWindow.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatPopupWindow.java
index 5c1f568..55057df 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatPopupWindow.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatPopupWindow.java
@@ -23,12 +23,13 @@
 import android.widget.PopupWindow;
 
 import androidx.annotation.AttrRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.StyleRes;
 import androidx.appcompat.R;
 import androidx.core.widget.PopupWindowCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 class AppCompatPopupWindow extends PopupWindow {
 
     private static final boolean COMPAT_OVERLAP_ANCHOR = Build.VERSION.SDK_INT < 21;
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatRadioButton.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatRadioButton.java
index e0eb8e0..53f4d82 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatRadioButton.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatRadioButton.java
@@ -29,8 +29,6 @@
 import android.widget.TextView;
 
 import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.appcompat.content.res.AppCompatResources;
@@ -40,6 +38,9 @@
 import androidx.core.widget.TintableCompoundDrawablesView;
 import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * A {@link RadioButton} which supports compatible features on older versions of the platform,
  * including:
@@ -92,8 +93,7 @@
     /**
      * This may be called from super constructors.
      */
-    @NonNull
-    private AppCompatEmojiTextHelper getEmojiTextViewHelper() {
+    private @NonNull AppCompatEmojiTextHelper getEmojiTextViewHelper() {
         if (mAppCompatEmojiTextHelper == null) {
             mAppCompatEmojiTextHelper = new AppCompatEmojiTextHelper(this);
         }
@@ -128,9 +128,8 @@
      * This should be accessed from {@link androidx.core.widget.CompoundButtonCompat}
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    @Nullable
     @Override
-    public ColorStateList getSupportButtonTintList() {
+    public @Nullable ColorStateList getSupportButtonTintList() {
         return mCompoundButtonHelper != null
                 ? mCompoundButtonHelper.getSupportButtonTintList()
                 : null;
@@ -141,7 +140,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setSupportButtonTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportButtonTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mCompoundButtonHelper != null) {
             mCompoundButtonHelper.setSupportButtonTintMode(tintMode);
         }
@@ -151,9 +150,8 @@
      * This should be accessed from {@link androidx.core.widget.CompoundButtonCompat}
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    @Nullable
     @Override
-    public PorterDuff.Mode getSupportButtonTintMode() {
+    public PorterDuff.@Nullable Mode getSupportButtonTintMode() {
         return mCompoundButtonHelper != null
                 ? mCompoundButtonHelper.getSupportButtonTintMode()
                 : null;
@@ -179,8 +177,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public ColorStateList getSupportBackgroundTintList() {
+    public @Nullable ColorStateList getSupportBackgroundTintList() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintList() : null;
     }
@@ -192,7 +189,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportBackgroundTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mBackgroundTintHelper != null) {
             mBackgroundTintHelper.setSupportBackgroundTintMode(tintMode);
         }
@@ -205,8 +202,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public PorterDuff.Mode getSupportBackgroundTintMode() {
+    public PorterDuff.@Nullable Mode getSupportBackgroundTintMode() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintMode() : null;
     }
@@ -239,7 +235,7 @@
     }
 
     @Override
-    public void setFilters(@SuppressWarnings("ArrayReturn") @NonNull InputFilter[] filters) {
+    public void setFilters(@SuppressWarnings("ArrayReturn") InputFilter @NonNull [] filters) {
         super.setFilters(getEmojiTextViewHelper().getFilters(filters));
     }
 
@@ -286,10 +282,9 @@
      * @see #setSupportCompoundDrawablesTintList(ColorStateList)
      *
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public ColorStateList getSupportCompoundDrawablesTintList() {
+    public @Nullable ColorStateList getSupportCompoundDrawablesTintList() {
         return mTextHelper.getCompoundDrawableTintList();
     }
 
@@ -327,10 +322,9 @@
      * @see #setSupportCompoundDrawablesTintMode(PorterDuff.Mode)
      *
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public PorterDuff.Mode getSupportCompoundDrawablesTintMode() {
+    public PorterDuff.@Nullable Mode getSupportCompoundDrawablesTintMode() {
         return mTextHelper.getCompoundDrawableTintMode();
     }
 
@@ -349,7 +343,7 @@
      */
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public void setSupportCompoundDrawablesTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportCompoundDrawablesTintMode(PorterDuff.@Nullable Mode tintMode) {
         mTextHelper.setCompoundDrawableTintMode(tintMode);
         mTextHelper.applyCompoundDrawablesTints();
     }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatRatingBar.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatRatingBar.java
index 242f61e..7d58c8b 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatRatingBar.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatRatingBar.java
@@ -22,10 +22,11 @@
 import android.view.View;
 import android.widget.RatingBar;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.R;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * A {@link RatingBar} which supports compatible features on older versions of the platform.
  *
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatReceiveContentHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatReceiveContentHelper.java
index 91bc26a..8b2bf8e 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatReceiveContentHelper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatReceiveContentHelper.java
@@ -33,12 +33,13 @@
 import android.view.View;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.core.view.ContentInfoCompat;
 import androidx.core.view.ViewCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Common code for handling content via {@link ViewCompat#performReceiveContent}.
  */
@@ -150,8 +151,7 @@
      * @param view The target view.
      * @return The activity if found; null otherwise.
      */
-    @Nullable
-    static Activity tryGetActivity(@NonNull View view) {
+    static @Nullable Activity tryGetActivity(@NonNull View view) {
         Context context = view.getContext();
         while (context instanceof ContextWrapper) {
             if (context instanceof Activity) {
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSeekBar.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSeekBar.java
index 70a8b0f..afe710c 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSeekBar.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSeekBar.java
@@ -21,10 +21,11 @@
 import android.util.AttributeSet;
 import android.widget.SeekBar;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.R;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * A {@link SeekBar} which supports compatible features on older versions of the platform.
  *
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSeekBarHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSeekBarHelper.java
index ada8287..5399505c 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSeekBarHelper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSeekBarHelper.java
@@ -23,11 +23,12 @@
 import android.util.AttributeSet;
 import android.widget.SeekBar;
 
-import androidx.annotation.Nullable;
 import androidx.appcompat.R;
 import androidx.core.graphics.drawable.DrawableCompat;
 import androidx.core.view.ViewCompat;
 
+import org.jspecify.annotations.Nullable;
+
 class AppCompatSeekBarHelper extends AppCompatProgressBarHelper {
 
     private final SeekBar mView;
@@ -95,8 +96,7 @@
         mView.invalidate();
     }
 
-    @Nullable
-    Drawable getTickMark() {
+    @Nullable Drawable getTickMark() {
         return mTickMark;
     }
 
@@ -107,20 +107,18 @@
         applyTickMarkTint();
     }
 
-    @Nullable
-    ColorStateList getTickMarkTintList() {
+    @Nullable ColorStateList getTickMarkTintList() {
         return mTickMarkTintList;
     }
 
-    void setTickMarkTintMode(@Nullable PorterDuff.Mode tintMode) {
+    void setTickMarkTintMode(PorterDuff.@Nullable Mode tintMode) {
         mTickMarkTintMode = tintMode;
         mHasTickMarkTintMode = true;
 
         applyTickMarkTint();
     }
 
-    @Nullable
-    PorterDuff.Mode getTickMarkTintMode() {
+    PorterDuff.@Nullable Mode getTickMarkTintMode() {
         return mTickMarkTintMode;
     }
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSpinner.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSpinner.java
index 37e4725..33cc244 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSpinner.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatSpinner.java
@@ -47,8 +47,6 @@
 import android.widget.SpinnerAdapter;
 
 import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.StyleableRes;
@@ -62,6 +60,8 @@
 import androidx.core.view.TintableBackgroundView;
 import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
 
 /**
  * A {@link Spinner} which supports compatible features on older versions of the platform,
@@ -182,7 +182,7 @@
      * @see #MODE_DROPDOWN
      */
     public AppCompatSpinner(
-            @NonNull Context context, @Nullable  AttributeSet attrs, int defStyleAttr, int mode) {
+            @NonNull Context context,  @Nullable AttributeSet attrs, int defStyleAttr, int mode) {
         this(context, attrs, defStyleAttr, mode, null);
     }
 
@@ -510,8 +510,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public ColorStateList getSupportBackgroundTintList() {
+    public @Nullable ColorStateList getSupportBackgroundTintList() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintList() : null;
     }
@@ -524,7 +523,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportBackgroundTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mBackgroundTintHelper != null) {
             mBackgroundTintHelper.setSupportBackgroundTintMode(tintMode);
         }
@@ -537,8 +536,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public PorterDuff.Mode getSupportBackgroundTintMode() {
+    public PorterDuff.@Nullable Mode getSupportBackgroundTintMode() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintMode() : null;
     }
@@ -689,7 +687,7 @@
          *                      views, may be {@null} to use default theme
          */
         public DropDownAdapter(@Nullable SpinnerAdapter adapter,
-                @Nullable Resources.Theme dropDownTheme) {
+                Resources.@Nullable Theme dropDownTheme) {
             mAdapter = adapter;
 
             if (adapter instanceof ListAdapter) {
@@ -1103,8 +1101,8 @@
         }
 
         static void setDropDownViewTheme(
-                @NonNull android.widget.ThemedSpinnerAdapter themedSpinnerAdapter,
-                @Nullable Resources.Theme theme
+                android.widget.@NonNull ThemedSpinnerAdapter themedSpinnerAdapter,
+                Resources.@Nullable Theme theme
         ) {
             if (!ObjectsCompat.equals(themedSpinnerAdapter.getDropDownViewTheme(), theme)) {
                 themedSpinnerAdapter.setDropDownViewTheme(theme);
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextClassifierHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextClassifierHelper.java
index f675ec9..27ea549 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextClassifierHelper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextClassifierHelper.java
@@ -20,11 +20,12 @@
 import android.view.textclassifier.TextClassifier;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.core.util.Preconditions;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * To workaround a bug in O, by backporting a fix in P.
  * <p>
@@ -34,10 +35,8 @@
  * effect to this TextView.
  */
 final class AppCompatTextClassifierHelper {
-    @NonNull
-    private TextView mTextView;
-    @Nullable
-    private TextClassifier mTextClassifier;
+    private @NonNull TextView mTextView;
+    private @Nullable TextClassifier mTextClassifier;
 
     AppCompatTextClassifierHelper(@NonNull TextView textView) {
         mTextView = Preconditions.checkNotNull(textView);
@@ -57,8 +56,7 @@
      * {@link android.view.textclassifier.TextClassificationManager}.
      */
     @RequiresApi(api = 26)
-    @NonNull
-    public TextClassifier getTextClassifier() {
+    public @NonNull TextClassifier getTextClassifier() {
         if (mTextClassifier == null) {
             return Api26Impl.getTextClassifier(mTextView);
         }
@@ -71,8 +69,7 @@
             // This class is not instantiable.
         }
 
-        @NonNull
-        static TextClassifier getTextClassifier(@NonNull TextView textView) {
+        static @NonNull TextClassifier getTextClassifier(@NonNull TextView textView) {
             final TextClassificationManager tcm =
                     textView.getContext().getSystemService(TextClassificationManager.class);
             if (tcm != null) {
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java
index 7368922..4ea59ca 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java
@@ -37,8 +37,6 @@
 import android.view.inputmethod.InputConnection;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.UiThread;
@@ -51,6 +49,9 @@
 import androidx.core.view.inputmethod.EditorInfoCompat;
 import androidx.core.widget.TextViewCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.ref.WeakReference;
 import java.util.Locale;
 import java.util.Objects;
@@ -64,8 +65,7 @@
     private static final int SERIF = 2;
     private static final int MONOSPACE = 3;
 
-    @NonNull
-    private final TextView mView;
+    private final @NonNull TextView mView;
 
     private TintInfo mDrawableLeftTint;
     private TintInfo mDrawableTopTint;
@@ -75,14 +75,12 @@
     private TintInfo mDrawableEndTint;
     private TintInfo mDrawableTint; // Tint used for all compound drawables
 
-    @NonNull
-    private final AppCompatTextViewAutoSizeHelper mAutoSizeTextHelper;
+    private final @NonNull AppCompatTextViewAutoSizeHelper mAutoSizeTextHelper;
 
     private int mStyle = Typeface.NORMAL;
     private int mFontWeight = TEXT_FONT_WEIGHT_UNSPECIFIED;
     private Typeface mFontTypeface;
-    @Nullable
-    private String mFontVariationSettings = null;
+    private @Nullable String mFontVariationSettings = null;
     private boolean mAsyncFontPending;
 
     AppCompatTextHelper(@NonNull TextView view) {
@@ -472,8 +470,7 @@
         return false;
     }
 
-    @NonNull
-    private ResourcesCompat.FontCallback makeFontCallback(int fontWeight, int style) {
+    private ResourcesCompat.@NonNull FontCallback makeFontCallback(int fontWeight, int style) {
         final WeakReference<TextView> textViewWeak = new WeakReference<>(mView);
         return new ResourcesCompat.FontCallback() {
             @Override
@@ -665,7 +662,7 @@
                 autoSizeMinTextSize, autoSizeMaxTextSize, autoSizeStepGranularity, unit);
     }
 
-    void setAutoSizeTextTypeUniformWithPresetSizes(@NonNull int[] presetSizes, int unit)
+    void setAutoSizeTextTypeUniformWithPresetSizes(int @NonNull [] presetSizes, int unit)
             throws IllegalArgumentException {
         mAutoSizeTextHelper.setAutoSizeTextTypeUniformWithPresetSizes(presetSizes, unit);
     }
@@ -691,8 +688,7 @@
         return mAutoSizeTextHelper.getAutoSizeTextAvailableSizes();
     }
 
-    @Nullable
-    ColorStateList getCompoundDrawableTintList() {
+    @Nullable ColorStateList getCompoundDrawableTintList() {
         return mDrawableTint != null ? mDrawableTint.mTintList : null;
     }
 
@@ -705,12 +701,11 @@
         setCompoundTints();
     }
 
-    @Nullable
-    PorterDuff.Mode getCompoundDrawableTintMode() {
+    PorterDuff.@Nullable Mode getCompoundDrawableTintMode() {
         return mDrawableTint != null ? mDrawableTint.mTintMode : null;
     }
 
-    void setCompoundDrawableTintMode(@Nullable PorterDuff.Mode tintMode) {
+    void setCompoundDrawableTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mDrawableTint == null) {
             mDrawableTint = new TintInfo();
         }
@@ -830,9 +825,8 @@
          *         {@link Paint#setFontVariationSettings(String)} would return null for this
          *         Typeface and font variation settings string.
          */
-        @Nullable
         @UiThread
-        static Typeface createVariationInstance(@Nullable Typeface baseTypeface,
+        static @Nullable Typeface createVariationInstance(@Nullable Typeface baseTypeface,
                 @Nullable String fontVariationSettings) {
             Pair<Typeface, String> cacheKey = new Pair<>(baseTypeface, fontVariationSettings);
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextView.java
index 1333bf6..ccf0a76 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextView.java
@@ -40,8 +40,6 @@
 import androidx.annotation.DrawableRes;
 import androidx.annotation.FloatRange;
 import androidx.annotation.IntRange;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.Px;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
@@ -55,6 +53,9 @@
 import androidx.core.widget.TintableCompoundDrawablesView;
 import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 
@@ -93,8 +94,7 @@
     private final AppCompatTextHelper mTextHelper;
     private final AppCompatTextClassifierHelper mTextClassifierHelper;
     @SuppressWarnings("NotNullFieldNotInitialized") // initialized in getter
-    @NonNull
-    private AppCompatEmojiTextHelper mEmojiTextViewHelper;
+    private @NonNull AppCompatEmojiTextHelper mEmojiTextViewHelper;
 
     private boolean mIsSetTypefaceProcessing = false;
 
@@ -123,11 +123,9 @@
      */
     private String mFontVariationSettings;
 
-    @Nullable
-    private SuperCaller mSuperCaller = null;
+    private @Nullable SuperCaller mSuperCaller = null;
 
-    @Nullable
-    private Future<PrecomputedTextCompat> mPrecomputedTextFuture;
+    private @Nullable Future<PrecomputedTextCompat> mPrecomputedTextFuture;
 
     public AppCompatTextView(@NonNull Context context) {
         this(context, null);
@@ -159,8 +157,7 @@
     /**
      * This may be called from super constructors.
      */
-    @NonNull
-    private AppCompatEmojiTextHelper getEmojiTextViewHelper() {
+    private @NonNull AppCompatEmojiTextHelper getEmojiTextViewHelper() {
         //noinspection ConstantConditions
         if (mEmojiTextViewHelper == null) {
             mEmojiTextViewHelper = new AppCompatEmojiTextHelper(this);
@@ -202,8 +199,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public ColorStateList getSupportBackgroundTintList() {
+    public @Nullable ColorStateList getSupportBackgroundTintList() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintList() : null;
     }
@@ -214,7 +210,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportBackgroundTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mBackgroundTintHelper != null) {
             mBackgroundTintHelper.setSupportBackgroundTintMode(tintMode);
         }
@@ -226,8 +222,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public PorterDuff.Mode getSupportBackgroundTintMode() {
+    public PorterDuff.@Nullable Mode getSupportBackgroundTintMode() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintMode() : null;
     }
@@ -276,15 +271,14 @@
         }
     }
 
-    @Nullable
     @RequiresApi(26)
     @Override
-    public String getFontVariationSettings() {
+    public @Nullable String getFontVariationSettings() {
         return mFontVariationSettings;
     }
 
     @Override
-    public void setFilters(@SuppressWarnings("ArrayReturn") @NonNull InputFilter[] filters) {
+    public void setFilters(@SuppressWarnings("ArrayReturn") InputFilter @NonNull [] filters) {
         super.setFilters(getEmojiTextViewHelper().getFilters(filters));
     }
 
@@ -395,7 +389,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setAutoSizeTextTypeUniformWithPresetSizes(@NonNull int[] presetSizes, int unit)
+    public void setAutoSizeTextTypeUniformWithPresetSizes(int @NonNull [] presetSizes, int unit)
             throws IllegalArgumentException {
         if (SDK_LEVEL_SUPPORTS_AUTOSIZE) {
             getSuperCaller().setAutoSizeTextTypeUniformWithPresetSizes(presetSizes, unit);
@@ -559,14 +553,13 @@
      */
     @Override
     public void setCustomSelectionActionModeCallback(
-            @Nullable ActionMode.Callback actionModeCallback) {
+            ActionMode.@Nullable Callback actionModeCallback) {
         super.setCustomSelectionActionModeCallback(
                 TextViewCompat.wrapCustomSelectionActionModeCallback(this, actionModeCallback));
     }
 
     @Override
-    @Nullable
-    public ActionMode.Callback getCustomSelectionActionModeCallback() {
+    public ActionMode.@Nullable Callback getCustomSelectionActionModeCallback() {
         return TextViewCompat.unwrapCustomSelectionActionModeCallback(
                 super.getCustomSelectionActionModeCallback());
     }
@@ -578,8 +571,7 @@
      * @return a current {@link PrecomputedTextCompat.Params}
      * @see PrecomputedTextCompat
      */
-    @NonNull
-    public PrecomputedTextCompat.Params getTextMetricsParamsCompat() {
+    public PrecomputedTextCompat.@NonNull Params getTextMetricsParamsCompat() {
         return TextViewCompat.getTextMetricsParams(this);
     }
 
@@ -590,7 +582,7 @@
      *
      * @see PrecomputedTextCompat
      */
-    public void setTextMetricsParamsCompat(@NonNull PrecomputedTextCompat.Params params) {
+    public void setTextMetricsParamsCompat(PrecomputedTextCompat.@NonNull Params params) {
         TextViewCompat.setTextMetricsParams(this, params);
     }
 
@@ -645,8 +637,7 @@
      */
     @Override
     @RequiresApi(api = 26)
-    @NonNull
-    public TextClassifier getTextClassifier() {
+    public @NonNull TextClassifier getTextClassifier() {
         // The null check is necessary because getTextClassifier is called when we are invoking
         // the super class's constructor.
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P || mTextClassifierHelper == null) {
@@ -752,10 +743,9 @@
      * @see #setSupportCompoundDrawablesTintList(ColorStateList)
      *
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public ColorStateList getSupportCompoundDrawablesTintList() {
+    public @Nullable ColorStateList getSupportCompoundDrawablesTintList() {
         return mTextHelper.getCompoundDrawableTintList();
     }
 
@@ -793,10 +783,9 @@
      * @see #setSupportCompoundDrawablesTintMode(PorterDuff.Mode)
      *
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public PorterDuff.Mode getSupportCompoundDrawablesTintMode() {
+    public PorterDuff.@Nullable Mode getSupportCompoundDrawablesTintMode() {
         return mTextHelper.getCompoundDrawableTintMode();
     }
 
@@ -815,7 +804,7 @@
      */
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public void setSupportCompoundDrawablesTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportCompoundDrawablesTintMode(PorterDuff.@Nullable Mode tintMode) {
         mTextHelper.setCompoundDrawableTintMode(tintMode);
         mTextHelper.applyCompoundDrawablesTints();
     }
@@ -846,10 +835,9 @@
     }
 
     @Override
-    @Nullable
     // Code inspection reveals that the superclass method can return null.
     @SuppressWarnings("InvalidNullabilityOverride")
-    public Typeface getTypeface() {
+    public @Nullable Typeface getTypeface() {
         return mOriginalTypeface;
     }
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java
index cd09c92..512724c 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java
@@ -36,8 +36,6 @@
 import android.util.TypedValue;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.VisibleForTesting;
@@ -45,6 +43,9 @@
 import androidx.core.view.ViewCompat;
 import androidx.core.widget.TextViewCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -96,8 +97,7 @@
     private boolean mHasPresetAutoSizeValues = false;
     private TextPaint mTempTextPaint;
 
-    @NonNull
-    private final TextView mTextView;
+    private final @NonNull TextView mTextView;
     private final Context mContext;
 
     private final Impl mImpl;
@@ -357,7 +357,7 @@
      *
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    void setAutoSizeTextTypeUniformWithPresetSizes(@NonNull int[] presetSizes, int unit)
+    void setAutoSizeTextTypeUniformWithPresetSizes(int @NonNull [] presetSizes, int unit)
             throws IllegalArgumentException {
         if (supportsAutoSizeText()) {
             final int presetSizesLength = presetSizes.length;
@@ -711,10 +711,9 @@
     }
 
     @VisibleForTesting
-    @NonNull
-    StaticLayout createLayout(
+    @NonNull StaticLayout createLayout(
             @NonNull CharSequence text,
-            @NonNull Layout.Alignment alignment,
+            Layout.@NonNull Alignment alignment,
             int availableWidth,
             int maxLines
     ) {
@@ -773,7 +772,7 @@
     // This is marked package-protected so that it doesn't require a synthetic accessor
     // when being used from the Impl inner classes
     static <T> T invokeAndReturnWithDefault(@NonNull Object object,
-            @NonNull final String methodName, @NonNull final T defaultValue) {
+            final @NonNull String methodName, final @NonNull T defaultValue) {
         T result = null;
         boolean exceptionThrown = false;
 
@@ -793,8 +792,7 @@
         return result;
     }
 
-    @Nullable
-    private static Method getTextViewMethod(@NonNull final String methodName) {
+    private static @Nullable Method getTextViewMethod(final @NonNull String methodName) {
         try {
             Method method = sTextViewMethodByNameCache.get(methodName);
             if (method == null) {
@@ -838,10 +836,9 @@
             // This class is not instantiable.
         }
 
-        @NonNull
-        static StaticLayout createStaticLayoutForMeasuring(
+        static @NonNull StaticLayout createStaticLayoutForMeasuring(
                 @NonNull CharSequence text,
-                @NonNull Layout.Alignment alignment,
+                Layout.@NonNull Alignment alignment,
                 int availableWidth,
                 int maxLines,
                 @NonNull TextView textView,
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatToggleButton.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatToggleButton.java
index a55a8b2..bd591b9 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatToggleButton.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/AppCompatToggleButton.java
@@ -28,14 +28,15 @@
 import android.widget.ToggleButton;
 
 import androidx.annotation.DrawableRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.core.view.TintableBackgroundView;
 import androidx.core.view.ViewCompat;
 import androidx.core.widget.TintableCompoundDrawablesView;
 import androidx.resourceinspection.annotation.AppCompatShadowedAttributes;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * A {@link ToggleButton} which supports compatible features on older versions of the platform,
  * including:
@@ -119,8 +120,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public ColorStateList getSupportBackgroundTintList() {
+    public @Nullable ColorStateList getSupportBackgroundTintList() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintList() : null;
     }
@@ -132,7 +132,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    public void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportBackgroundTintMode(PorterDuff.@Nullable Mode tintMode) {
         if (mBackgroundTintHelper != null) {
             mBackgroundTintHelper.setSupportBackgroundTintMode(tintMode);
         }
@@ -145,8 +145,7 @@
      */
     @RestrictTo(LIBRARY_GROUP_PREFIX)
     @Override
-    @Nullable
-    public PorterDuff.Mode getSupportBackgroundTintMode() {
+    public PorterDuff.@Nullable Mode getSupportBackgroundTintMode() {
         return mBackgroundTintHelper != null
                 ? mBackgroundTintHelper.getSupportBackgroundTintMode() : null;
     }
@@ -163,7 +162,7 @@
     }
 
     @Override
-    public void setFilters(@SuppressWarnings("ArrayReturn") @NonNull InputFilter[] filters) {
+    public void setFilters(@SuppressWarnings("ArrayReturn") InputFilter @NonNull [] filters) {
         super.setFilters(getEmojiTextViewHelper().getFilters(filters));
     }
 
@@ -171,8 +170,7 @@
     /**
      * This may be called from super constructors.
      */
-    @NonNull
-    private AppCompatEmojiTextHelper getEmojiTextViewHelper() {
+    private @NonNull AppCompatEmojiTextHelper getEmojiTextViewHelper() {
         //noinspection ConstantConditions
         if (mAppCompatEmojiTextHelper == null) {
             mAppCompatEmojiTextHelper = new AppCompatEmojiTextHelper(this);
@@ -223,10 +221,9 @@
      * @see #setSupportCompoundDrawablesTintList(ColorStateList)
      *
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public ColorStateList getSupportCompoundDrawablesTintList() {
+    public @Nullable ColorStateList getSupportCompoundDrawablesTintList() {
         return mTextHelper.getCompoundDrawableTintList();
     }
 
@@ -264,10 +261,9 @@
      * @see #setSupportCompoundDrawablesTintMode(PorterDuff.Mode)
      *
      */
-    @Nullable
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public PorterDuff.Mode getSupportCompoundDrawablesTintMode() {
+    public PorterDuff.@Nullable Mode getSupportCompoundDrawablesTintMode() {
         return mTextHelper.getCompoundDrawableTintMode();
     }
 
@@ -286,7 +282,7 @@
      */
     @Override
     @RestrictTo(LIBRARY_GROUP_PREFIX)
-    public void setSupportCompoundDrawablesTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setSupportCompoundDrawablesTintMode(PorterDuff.@Nullable Mode tintMode) {
         mTextHelper.setCompoundDrawableTintMode(tintMode);
         mTextHelper.applyCompoundDrawablesTints();
     }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ButtonBarLayout.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ButtonBarLayout.java
index d0fb325..37b5457 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ButtonBarLayout.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ButtonBarLayout.java
@@ -24,12 +24,13 @@
 import android.view.View;
 import android.widget.LinearLayout;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.core.view.ViewCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * An extension of LinearLayout that automatically switches to vertical
  * orientation when it can't fit its child views horizontally.
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ContentFrameLayout.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ContentFrameLayout.java
index 6dda3d0..f1f6604 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ContentFrameLayout.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ContentFrameLayout.java
@@ -29,10 +29,11 @@
 import android.util.TypedValue;
 import android.widget.FrameLayout;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  */
 @RestrictTo(LIBRARY)
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/DialogTitle.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/DialogTitle.java
index 0e43cf1..f32b45d 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/DialogTitle.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/DialogTitle.java
@@ -24,11 +24,12 @@
 import android.util.AttributeSet;
 import android.util.TypedValue;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Used by dialogs to change the font size and number of lines to try to fit
  * the text to the available space.
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/DropDownListView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/DropDownListView.java
index 89472db..b2124e5 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/DropDownListView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/DropDownListView.java
@@ -32,7 +32,6 @@
 import android.widget.ListAdapter;
 import android.widget.ListView;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.appcompat.R;
 import androidx.appcompat.graphics.drawable.DrawableWrapperCompat;
@@ -40,6 +39,8 @@
 import androidx.core.view.ViewPropertyAnimatorCompat;
 import androidx.core.widget.ListViewAutoScrollHelper;
 
+import org.jspecify.annotations.NonNull;
+
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsFrameLayout.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsFrameLayout.java
index 5a3c3d6..aecaf58 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsFrameLayout.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsFrameLayout.java
@@ -23,10 +23,11 @@
 import android.util.AttributeSet;
 import android.widget.FrameLayout;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  */
 @RestrictTo(LIBRARY_GROUP_PREFIX)
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsLinearLayout.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsLinearLayout.java
index 8aec6e9..ee18239 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsLinearLayout.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/FitWindowsLinearLayout.java
@@ -23,10 +23,11 @@
 import android.util.AttributeSet;
 import android.widget.LinearLayout;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  */
 @RestrictTo(LIBRARY_GROUP_PREFIX)
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java
index c6f23eb..1356f48 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java
@@ -32,14 +32,15 @@
 
 import androidx.annotation.GravityInt;
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.core.view.GravityCompat;
 import androidx.core.view.ViewCompat;
 import androidx.resourceinspection.annotation.Attribute;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ListPopupWindow.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ListPopupWindow.java
index ca8c609..3afa057 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ListPopupWindow.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ListPopupWindow.java
@@ -45,8 +45,6 @@
 import android.widget.PopupWindow;
 
 import androidx.annotation.AttrRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.StyleRes;
@@ -54,6 +52,9 @@
 import androidx.appcompat.view.menu.ShowableListMenu;
 import androidx.core.widget.PopupWindowCompat;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.reflect.Method;
 
 /**
@@ -521,8 +522,7 @@
      * @return anchor-relative bounds, or @{@code null} if not set
      * @see #setEpicenterBounds(Rect)
      */
-    @Nullable
-    public Rect getEpicenterBounds() {
+    public @Nullable Rect getEpicenterBounds() {
         return mEpicenterBounds != null ? new Rect(mEpicenterBounds) : null;
     }
 
@@ -613,7 +613,7 @@
      *
      * @see ListView#setOnItemClickListener(AdapterView.OnItemClickListener)
      */
-    public void setOnItemClickListener(@Nullable AdapterView.OnItemClickListener clickListener) {
+    public void setOnItemClickListener(AdapterView.@Nullable OnItemClickListener clickListener) {
         mItemClickListener = clickListener;
     }
 
@@ -779,7 +779,7 @@
      *
      * @param listener Listener that will be notified when the popup is dismissed.
      */
-    public void setOnDismissListener(@Nullable PopupWindow.OnDismissListener listener) {
+    public void setOnDismissListener(PopupWindow.@Nullable OnDismissListener listener) {
         mPopup.setOnDismissListener(listener);
     }
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/MenuItemHoverListener.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/MenuItemHoverListener.java
index 262e575..fd8ca9f 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/MenuItemHoverListener.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/MenuItemHoverListener.java
@@ -20,10 +20,11 @@
 
 import android.view.MenuItem;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.view.menu.MenuBuilder;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * An interface notified when a menu item is hovered. Useful for cases when hover should trigger
  * some behavior at a higher level, like managing the opening and closing of submenus.
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/MenuPopupWindow.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/MenuPopupWindow.java
index 44c6c66..1ceaf64 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/MenuPopupWindow.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/MenuPopupWindow.java
@@ -33,14 +33,15 @@
 import android.widget.ListAdapter;
 import android.widget.PopupWindow;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.view.menu.ListMenuItemView;
 import androidx.appcompat.view.menu.MenuAdapter;
 import androidx.appcompat.view.menu.MenuBuilder;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.reflect.Method;
 
 /**
@@ -74,9 +75,8 @@
         super(context, attrs, defStyleAttr, defStyleRes);
     }
 
-    @NonNull
     @Override
-    DropDownListView createDropDownListView(Context context, boolean hijackFocus) {
+    @NonNull DropDownListView createDropDownListView(Context context, boolean hijackFocus) {
         MenuDropDownListView view = new MenuDropDownListView(context, hijackFocus);
         view.setHoverListener(this);
         return view;
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/PopupMenu.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/PopupMenu.java
index b8cb0d8..853440e 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/PopupMenu.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/PopupMenu.java
@@ -29,8 +29,6 @@
 
 import androidx.annotation.AttrRes;
 import androidx.annotation.MenuRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.StyleRes;
 import androidx.appcompat.R;
@@ -39,6 +37,9 @@
 import androidx.appcompat.view.menu.MenuPopupHelper;
 import androidx.appcompat.view.menu.ShowableListMenu;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Static library support version of the framework's {@link android.widget.PopupMenu}.
  * Used to write apps that run on platforms prior to Android 3.0.  When running
@@ -169,8 +170,7 @@
      *
      * @return a touch listener that controls drag-to-open behavior
      */
-    @NonNull
-    public View.OnTouchListener getDragToOpenListener() {
+    public View.@NonNull OnTouchListener getDragToOpenListener() {
         if (mDragListener == null) {
             mDragListener = new ForwardingListener(mAnchor) {
                 @Override
@@ -204,8 +204,7 @@
      * @see #show()
      * @see #getMenuInflater()
      */
-    @NonNull
-    public Menu getMenu() {
+    public @NonNull Menu getMenu() {
         return mMenu;
     }
 
@@ -214,8 +213,7 @@
      *         from XML into the menu returned by {@link #getMenu()}
      * @see #getMenu()
      */
-    @NonNull
-    public MenuInflater getMenuInflater() {
+    public @NonNull MenuInflater getMenuInflater() {
         return new SupportMenuInflater(mContext);
     }
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ScrollingTabContainerView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ScrollingTabContainerView.java
index 7197b4b..db9e7a5 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ScrollingTabContainerView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ScrollingTabContainerView.java
@@ -42,13 +42,14 @@
 import android.widget.Spinner;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.view.ActionBarPolicy;
 import androidx.core.view.GravityCompat;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * This widget implements the dynamic action bar tab behavior that can change across different
  * configurations or circumstances.
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SearchView.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SearchView.java
index 0cce612..aef3570 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SearchView.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SearchView.java
@@ -72,8 +72,6 @@
 import android.widget.TextView;
 import android.widget.TextView.OnEditorActionListener;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
@@ -84,6 +82,9 @@
 import androidx.customview.view.AbsSavedState;
 import androidx.resourceinspection.annotation.Attribute;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.reflect.Method;
 import java.util.WeakHashMap;
 
@@ -620,8 +621,7 @@
      * {@link R.attr#queryHint}
      */
     @Attribute("androidx.appcompat:queryHint")
-    @Nullable
-    public CharSequence getQueryHint() {
+    public @Nullable CharSequence getQueryHint() {
         final CharSequence hint;
         if (mQueryHint != null) {
             hint = mQueryHint;
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java
index 661dfb2..b591814b 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/SwitchCompat.java
@@ -49,8 +49,6 @@
 import android.widget.TextView;
 
 import androidx.annotation.FloatRange;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.R;
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.appcompat.text.AllCapsTransformationMethod;
@@ -60,6 +58,9 @@
 import androidx.emoji2.text.EmojiCompat;
 import androidx.resourceinspection.annotation.Attribute;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.ref.Reference;
 import java.lang.ref.WeakReference;
 
@@ -195,14 +196,11 @@
     private ColorStateList mTextColors;
     private Layout mOnLayout;
     private Layout mOffLayout;
-    @Nullable
-    private TransformationMethod mSwitchTransformationMethod;
+    private @Nullable TransformationMethod mSwitchTransformationMethod;
     ObjectAnimator mPositionAnimator;
     private final AppCompatTextHelper mTextHelper;
-    @NonNull
-    private AppCompatEmojiTextHelper mAppCompatEmojiTextHelper;
-    @Nullable
-    private EmojiCompatInitCallback mEmojiCompatInitCallback;
+    private @NonNull AppCompatEmojiTextHelper mAppCompatEmojiTextHelper;
+    private @Nullable EmojiCompatInitCallback mEmojiCompatInitCallback;
 
     @SuppressWarnings("hiding")
     private final Rect mTempRect = new Rect();
@@ -582,8 +580,7 @@
      * @see android.R.attr#trackTint
      */
     @Attribute("androidx.appcompat:trackTint")
-    @Nullable
-    public ColorStateList getTrackTintList() {
+    public @Nullable ColorStateList getTrackTintList() {
         return mTrackTintList;
     }
 
@@ -598,7 +595,7 @@
      * @see #getTrackTintMode()
      * @see android.R.attr#trackTintMode
      */
-    public void setTrackTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setTrackTintMode(PorterDuff.@Nullable Mode tintMode) {
         mTrackTintMode = tintMode;
         mHasTrackTintMode = true;
 
@@ -613,8 +610,7 @@
      * @see android.R.attr#trackTintMode
      */
     @Attribute("androidx.appcompat:trackTintMode")
-    @Nullable
-    public PorterDuff.Mode getTrackTintMode() {
+    public PorterDuff.@Nullable Mode getTrackTintMode() {
         return mTrackTintMode;
     }
 
@@ -710,8 +706,7 @@
      * @see android.R.attr#thumbTint
      */
     @Attribute("androidx.appcompat:thumbTint")
-    @Nullable
-    public ColorStateList getThumbTintList() {
+    public @Nullable ColorStateList getThumbTintList() {
         return mThumbTintList;
     }
 
@@ -727,7 +722,7 @@
      * @see android.R.attr#thumbTintMode
      * @see Drawable#setTintMode(PorterDuff.Mode)
      */
-    public void setThumbTintMode(@Nullable PorterDuff.Mode tintMode) {
+    public void setThumbTintMode(PorterDuff.@Nullable Mode tintMode) {
         mThumbTintMode = tintMode;
         mHasThumbTintMode = true;
 
@@ -742,8 +737,7 @@
      * @see android.R.attr#thumbTintMode
      */
     @Attribute("androidx.appcompat:thumbTintMode")
-    @Nullable
-    public PorterDuff.Mode getThumbTintMode() {
+    public PorterDuff.@Nullable Mode getThumbTintMode() {
         return mThumbTintMode;
     }
 
@@ -868,8 +862,7 @@
         }
     }
 
-    @Nullable
-    private CharSequence doTransformForOnOffText(@Nullable CharSequence onOffText) {
+    private @Nullable CharSequence doTransformForOnOffText(@Nullable CharSequence onOffText) {
         TransformationMethod transformationMethod =
                 getEmojiTextViewHelper().wrapTransformationMethod(mSwitchTransformationMethod);
         return ((transformationMethod != null)
@@ -1542,14 +1535,13 @@
      */
     @Override
     public void setCustomSelectionActionModeCallback(
-            @Nullable ActionMode.Callback actionModeCallback) {
+            ActionMode.@Nullable Callback actionModeCallback) {
         super.setCustomSelectionActionModeCallback(
                 TextViewCompat.wrapCustomSelectionActionModeCallback(this, actionModeCallback));
     }
 
     @Override
-    @Nullable
-    public ActionMode.Callback getCustomSelectionActionModeCallback() {
+    public ActionMode.@Nullable Callback getCustomSelectionActionModeCallback() {
         return TextViewCompat.unwrapCustomSelectionActionModeCallback(
                 super.getCustomSelectionActionModeCallback());
     }
@@ -1597,15 +1589,14 @@
     }
 
     @Override
-    public void setFilters(@SuppressWarnings("ArrayReturn") @NonNull InputFilter[] filters) {
+    public void setFilters(@SuppressWarnings("ArrayReturn") InputFilter @NonNull [] filters) {
         super.setFilters(getEmojiTextViewHelper().getFilters(filters));
     }
 
     /**
      * This may be called from super constructors.
      */
-    @NonNull
-    private AppCompatEmojiTextHelper getEmojiTextViewHelper() {
+    private @NonNull AppCompatEmojiTextHelper getEmojiTextViewHelper() {
         //noinspection ConstantConditions
         if (mAppCompatEmojiTextHelper == null) {
             mAppCompatEmojiTextHelper = new AppCompatEmojiTextHelper(this);
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ThemeUtils.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ThemeUtils.java
index 1d955be..024172d 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ThemeUtils.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ThemeUtils.java
@@ -25,12 +25,13 @@
 import android.util.TypedValue;
 import android.view.View;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 import androidx.core.graphics.ColorUtils;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  */
 @RestrictTo(LIBRARY)
@@ -58,8 +59,8 @@
      * @param disabledTextColor Disabled text color.
      * @return Color state list.
      */
-    @NonNull
-    public static ColorStateList createDisabledStateList(int textColor, int disabledTextColor) {
+    public static @NonNull ColorStateList createDisabledStateList(int textColor,
+            int disabledTextColor) {
         // Now create a new ColorStateList with the default color, and the new disabled
         // color
         final int[][] states = new int[2][];
@@ -103,8 +104,8 @@
      * @param attr Theme attribute for resolving color state list.
      * @return Resolved color state list.
      */
-    @Nullable
-    public static ColorStateList getThemeAttrColorStateList(@NonNull Context context, int attr) {
+    public static @Nullable ColorStateList getThemeAttrColorStateList(@NonNull Context context,
+            int attr) {
         TEMP_ARRAY[0] = attr;
         TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, null, TEMP_ARRAY);
         try {
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ThemedSpinnerAdapter.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ThemedSpinnerAdapter.java
index 77e9dae..0803510 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ThemedSpinnerAdapter.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ThemedSpinnerAdapter.java
@@ -25,10 +25,11 @@
 import android.view.ViewGroup;
 import android.widget.SpinnerAdapter;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.view.ContextThemeWrapper;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * An extension of SpinnerAdapter that is capable of inflating drop-down views
  * against a different theme than normal views.
@@ -49,7 +50,7 @@
      *              {@code null} to use the default theme
      * @see SpinnerAdapter#getDropDownView(int, View, ViewGroup)
      */
-    void setDropDownViewTheme(@Nullable Resources.Theme theme);
+    void setDropDownViewTheme(Resources.@Nullable Theme theme);
 
     /**
      * Returns the value previously set by a call to
@@ -58,8 +59,7 @@
      * @return the {@link Resources.Theme} against which drop-down views are
      *         inflated, or {@code null} if one has not been explicitly set
      */
-    @Nullable
-    Resources.Theme getDropDownViewTheme();
+    Resources.@Nullable Theme getDropDownViewTheme();
 
     /**
      * A helper class which allows easy integration of {@link ThemedSpinnerAdapter} into existing
@@ -120,7 +120,7 @@
          * @param theme the theme passed in to
          *              {@link ThemedSpinnerAdapter#setDropDownViewTheme(Theme)}
          */
-        public void setDropDownViewTheme(@Nullable Resources.Theme theme) {
+        public void setDropDownViewTheme(Resources.@Nullable Theme theme) {
             if (theme == null) {
                 mDropDownInflater = null;
             } else if (theme.equals(mContext.getTheme())) {
@@ -135,8 +135,7 @@
          * Should be called from your adapter's {@link ThemedSpinnerAdapter#getDropDownViewTheme()},
          * returning the value returned from this method.
          */
-        @Nullable
-        public Resources.Theme getDropDownViewTheme() {
+        public Resources.@Nullable Theme getDropDownViewTheme() {
             return mDropDownInflater == null ? null : mDropDownInflater.getContext().getTheme();
         }
 
@@ -147,8 +146,7 @@
          * <p>The instance returned will have a correct theme, meaning that any inflated views
          * will be created with the same theme.</p>
          */
-        @NonNull
-        public LayoutInflater getDropDownViewInflater() {
+        public @NonNull LayoutInflater getDropDownViewInflater() {
             return mDropDownInflater != null ? mDropDownInflater : mInflater;
         }
     }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/TintTypedArray.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/TintTypedArray.java
index a9db85c..6541871 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/TintTypedArray.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/TintTypedArray.java
@@ -28,13 +28,14 @@
 import android.util.AttributeSet;
 import android.util.TypedValue;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.StyleableRes;
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.core.content.res.ResourcesCompat;
 
+import org.jspecify.annotations.Nullable;
+
 /**
  * A class that wraps a {@link TypedArray} and provides the same public API
  * surface. The purpose of this class is so that we can intercept calls to new APIs.
@@ -112,9 +113,8 @@
      * @throws UnsupportedOperationException if the attribute is defined but is
      *         not a font resource.
      */
-    @Nullable
-    public Typeface getFont(@StyleableRes int index, int style,
-            @Nullable ResourcesCompat.FontCallback fontCallback) {
+    public @Nullable Typeface getFont(@StyleableRes int index, int style,
+            ResourcesCompat.@Nullable FontCallback fontCallback) {
         final int resourceId = mWrapped.getResourceId(index, 0);
         if (resourceId == 0) {
             return null;
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
index 349f778..87b8d12 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
@@ -48,8 +48,6 @@
 import androidx.annotation.DrawableRes;
 import androidx.annotation.MainThread;
 import androidx.annotation.MenuRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.StringRes;
@@ -75,6 +73,9 @@
 import androidx.lifecycle.LifecycleOwner;
 import androidx.resourceinspection.annotation.Attribute;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -981,8 +982,7 @@
      * {@link androidx.appcompat.R.attr#navigationContentDescription}
      */
     @Attribute("androidx.appcompat:navigationContentDescription")
-    @Nullable
-    public CharSequence getNavigationContentDescription() {
+    public @Nullable CharSequence getNavigationContentDescription() {
         return mNavButtonView != null ? mNavButtonView.getContentDescription() : null;
     }
 
@@ -1075,8 +1075,7 @@
      * {@link androidx.appcompat.R.attr#navigationIcon}
      */
     @Attribute("androidx.appcompat:navigationIcon")
-    @Nullable
-    public Drawable getNavigationIcon() {
+    public @Nullable Drawable getNavigationIcon() {
         return mNavButtonView != null ? mNavButtonView.getDrawable() : null;
     }
 
@@ -1104,8 +1103,7 @@
      * {@link androidx.appcompat.R.attr#collapseContentDescription}
      */
     @Attribute("androidx.appcompat:collapseContentDescription")
-    @Nullable
-    public CharSequence getCollapseContentDescription() {
+    public @Nullable CharSequence getCollapseContentDescription() {
         return mCollapseButtonView != null ? mCollapseButtonView.getContentDescription() : null;
     }
 
@@ -1150,8 +1148,7 @@
      * {@link androidx.appcompat.R.attr#collapseIcon}
      */
     @Attribute("androidx.appcompat:collapseIcon")
-    @Nullable
-    public Drawable getCollapseIcon() {
+    public @Nullable Drawable getCollapseIcon() {
         return mCollapseButtonView != null ? mCollapseButtonView.getDrawable() : null;
     }
 
@@ -1218,8 +1215,7 @@
      *
      * @return The overflow icon drawable
      */
-    @Nullable
-    public Drawable getOverflowIcon() {
+    public @Nullable Drawable getOverflowIcon() {
         ensureMenu();
         return mMenuView.getOverflowIcon();
     }
@@ -1604,8 +1600,7 @@
      *
      */
     @VisibleForTesting
-    @Nullable
-    View getNavButtonView() {
+    @Nullable View getNavButtonView() {
         return mNavButtonView;
     }
 
@@ -2414,16 +2409,14 @@
     /**
      */
     @VisibleForTesting
-    @Nullable
-    final TextView getTitleTextView() {
+    final @Nullable TextView getTitleTextView() {
         return mTitleTextView;
     }
 
     /**
      */
     @VisibleForTesting
-    @Nullable
-    final TextView getSubtitleTextView() {
+    final @Nullable TextView getSubtitleTextView() {
         return mSubtitleTextView;
     }
 
@@ -2475,7 +2468,7 @@
     @MainThread
     @SuppressLint("LambdaLast")
     public void addMenuProvider(@NonNull MenuProvider provider, @NonNull LifecycleOwner owner,
-            @NonNull Lifecycle.State state) {
+            Lifecycle.@NonNull State state) {
         mMenuHostHelper.addMenuProvider(provider, owner, state);
     }
 
@@ -2810,13 +2803,11 @@
             dispatcher.unregisterOnBackInvokedCallback((OnBackInvokedCallback) callbackObj);
         }
 
-        @Nullable
-        static OnBackInvokedDispatcher findOnBackInvokedDispatcher(@NonNull View view) {
+        static @Nullable OnBackInvokedDispatcher findOnBackInvokedDispatcher(@NonNull View view) {
             return view.findOnBackInvokedDispatcher();
         }
 
-        @NonNull
-        static OnBackInvokedCallback newOnBackInvokedCallback(@NonNull Runnable action) {
+        static @NonNull OnBackInvokedCallback newOnBackInvokedCallback(@NonNull Runnable action) {
             return action::run;
         }
     }
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/TooltipCompat.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/TooltipCompat.java
index 3a84584..3f9cabe 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/TooltipCompat.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/TooltipCompat.java
@@ -19,10 +19,11 @@
 import android.os.Build;
 import android.view.View;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Helper class used to emulate the behavior of {@link View#setTooltipText(CharSequence)} prior
  * to API level 26.
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/TooltipPopup.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/TooltipPopup.java
index fc05b4b..39c39d9 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/TooltipPopup.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/TooltipPopup.java
@@ -33,10 +33,11 @@
 import android.view.WindowManager;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 
+import org.jspecify.annotations.NonNull;
+
 /**
  * A popup window displaying a text message aligned to a specified view.
  *
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ViewStubCompat.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ViewStubCompat.java
index 5691c63..290efdc 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ViewStubCompat.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ViewStubCompat.java
@@ -28,11 +28,12 @@
 import android.view.ViewGroup;
 import android.view.ViewParent;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.appcompat.R;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.lang.ref.WeakReference;
 
 /**
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ViewUtils.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ViewUtils.java
index 2369324..e678cab 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ViewUtils.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/ViewUtils.java
@@ -28,10 +28,11 @@
 import android.view.WindowInsets;
 
 import androidx.annotation.ChecksSdkIntAtLeast;
-import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/WithHint.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/WithHint.java
index b5d2c34..12a1a86 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/WithHint.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/WithHint.java
@@ -18,9 +18,10 @@
 
 import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.Nullable;
+
 /**
  */
 @RestrictTo(LIBRARY_GROUP_PREFIX)
@@ -30,6 +31,5 @@
      *
      * @return the hint, or null if there isn't one set, or the hint is not enabled.
      */
-    @Nullable
-    CharSequence getHint();
+    @Nullable CharSequence getHint();
 }
diff --git a/appcompat/integration-tests/receive-content-testapp/build.gradle b/appcompat/integration-tests/receive-content-testapp/build.gradle
index 3bb6c17..342bb9f 100644
--- a/appcompat/integration-tests/receive-content-testapp/build.gradle
+++ b/appcompat/integration-tests/receive-content-testapp/build.gradle
@@ -25,6 +25,7 @@
 }
 
 dependencies {
+    api(libs.jspecify)
     api("androidx.annotation:annotation:1.8.1")
     implementation(project(":appcompat:appcompat"))
     implementation(libs.constraintLayout)
diff --git a/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/AttachmentsRecyclerViewAdapter.java b/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/AttachmentsRecyclerViewAdapter.java
index fcbf576..cf0f536 100644
--- a/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/AttachmentsRecyclerViewAdapter.java
+++ b/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/AttachmentsRecyclerViewAdapter.java
@@ -20,10 +20,11 @@
 import android.view.LayoutInflater;
 import android.view.ViewGroup;
 
-import androidx.annotation.NonNull;
 import androidx.appcompat.widget.AppCompatImageView;
 import androidx.recyclerview.widget.RecyclerView;
 
+import org.jspecify.annotations.NonNull;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -58,9 +59,8 @@
         return mAttachments.size();
     }
 
-    @NonNull
     @Override
-    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+    public @NonNull MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         AppCompatImageView view = (AppCompatImageView) LayoutInflater.from(parent.getContext())
                 .inflate(R.layout.attachment, parent, false);
         return new MyViewHolder(view);
diff --git a/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/AttachmentsRepo.java b/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/AttachmentsRepo.java
index 6c53dfe..02bcd00 100644
--- a/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/AttachmentsRepo.java
+++ b/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/AttachmentsRepo.java
@@ -22,12 +22,13 @@
 import android.util.Log;
 import android.webkit.MimeTypeMap;
 
-import androidx.annotation.NonNull;
 import androidx.core.content.FileProvider;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.io.ByteStreams;
 
+import org.jspecify.annotations.NonNull;
+
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -57,8 +58,7 @@
      * Reads the content at the given URI and writes it to private storage. Then returns a content
      * URI referencing the newly written file.
      */
-    @NonNull
-    public Uri write(@NonNull Uri uri) {
+    public @NonNull Uri write(@NonNull Uri uri) {
         ContentResolver contentResolver = mContext.getContentResolver();
         String mimeType = contentResolver.getType(uri);
         String ext = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType);
@@ -91,8 +91,7 @@
         }
     }
 
-    @NonNull
-    public ImmutableList<Uri> getAllUris() {
+    public @NonNull ImmutableList<Uri> getAllUris() {
         File[] files = mAttachmentsDir.listFiles();
         if (files == null || files.length == 0) {
             return ImmutableList.of();
@@ -104,8 +103,7 @@
         return uris.build();
     }
 
-    @NonNull
-    private Uri getUriForFile(@NonNull File file) {
+    private @NonNull Uri getUriForFile(@NonNull File file) {
         return FileProvider.getUriForFile(mContext, FILE_PROVIDER_AUTHORITY, file);
     }
 }
diff --git a/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/MainActivity.java b/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/MainActivity.java
index 408b409..975f5f5 100644
--- a/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/MainActivity.java
+++ b/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/MainActivity.java
@@ -23,8 +23,6 @@
 import android.view.MenuInflater;
 import android.view.MenuItem;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.widget.AppCompatEditText;
 import androidx.appcompat.widget.LinearLayoutCompat;
@@ -37,6 +35,9 @@
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /** Main activity for the app. */
 public class MainActivity extends AppCompatActivity {
     private AttachmentsRepo mAttachmentsRepo;
diff --git a/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/MyExecutors.java b/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/MyExecutors.java
index ed0f5e9..e33bc57 100644
--- a/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/MyExecutors.java
+++ b/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/MyExecutors.java
@@ -20,11 +20,11 @@
 import android.os.Looper;
 import android.util.Log;
 
-import androidx.annotation.NonNull;
-
 import com.google.common.util.concurrent.ListeningScheduledExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
 
+import org.jspecify.annotations.NonNull;
+
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 
@@ -42,13 +42,11 @@
                 }
             };
 
-    @NonNull
-    public static ListeningScheduledExecutorService bg() {
+    public static @NonNull ListeningScheduledExecutorService bg() {
         return BG;
     }
 
-    @NonNull
-    public static Executor main() {
+    public static @NonNull Executor main() {
         return MAIN_EXECUTOR;
     }
 }
diff --git a/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/MyReceiver.java b/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/MyReceiver.java
index fdff5b0..3509eb8 100644
--- a/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/MyReceiver.java
+++ b/appcompat/integration-tests/receive-content-testapp/src/main/java/androidx/appcompat/demo/receivecontent/MyReceiver.java
@@ -27,8 +27,6 @@
 import android.view.View;
 import android.widget.Toast;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.core.view.ContentInfoCompat;
 import androidx.core.view.OnReceiveContentListener;
 
@@ -36,6 +34,9 @@
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.io.FileNotFoundException;
 import java.util.ArrayList;
 import java.util.List;
@@ -56,9 +57,8 @@
         mAttachmentsRecyclerViewAdapter = attachmentsRecyclerViewAdapter;
     }
 
-    @Nullable
     @Override
-    public ContentInfoCompat onReceiveContent(@NonNull View view,
+    public @Nullable ContentInfoCompat onReceiveContent(@NonNull View view,
             @NonNull ContentInfoCompat payload) {
         // Split the incoming content into two groups: content URIs and everything else.
         // This way we can implement custom handling for URIs and delegate the rest.
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
index f3df03d..3d87ab6 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
@@ -11104,7 +11104,182 @@
     @Test
     @RequiresFlagsEnabled(Flags.FLAG_ENABLE_SCORABLE_PROPERTY)
     public void testRankWithScorableProperty_joinWithChildQuery() throws Exception {
-        // TODO(b/309826655): Implement this test once cl/696927163 is imported to AppSearch.
+        assumeTrue(mDb1.getFeatures().isFeatureSupported(
+                Features.SCHEMA_SCORABLE_PROPERTY_CONFIG));
+        assumeTrue(mDb1.getFeatures().isFeatureSupported(
+                Features.SEARCH_SPEC_ADVANCED_RANKING_EXPRESSION));
+        assumeTrue(mDb1.getFeatures()
+                .isFeatureSupported(Features.JOIN_SPEC_AND_QUALIFIED_ID));
+
+        AppSearchSchema personSchema = new AppSearchSchema.Builder("Person")
+                .addProperty(new StringPropertyConfig.Builder("name")
+                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
+                        .setIndexingType(StringPropertyConfig.INDEXING_TYPE_PREFIXES)
+                        .setTokenizerType(StringPropertyConfig.TOKENIZER_TYPE_PLAIN)
+                        .build())
+                .addProperty(new DoublePropertyConfig.Builder("income")
+                        .setCardinality(PropertyConfig.CARDINALITY_REPEATED)
+                        .setScoringEnabled(true)
+                        .build())
+                .addProperty(new BooleanPropertyConfig.Builder("isStarred")
+                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
+                        .setScoringEnabled(true)
+                        .build())
+                .build();
+        AppSearchSchema callLogSchema = new AppSearchSchema.Builder("CallLog")
+                .addProperty(new StringPropertyConfig.Builder("personQualifiedId")
+                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
+                        .setJoinableValueType(StringPropertyConfig.JOINABLE_VALUE_TYPE_QUALIFIED_ID)
+                        .build())
+                .addProperty(new DoublePropertyConfig.Builder("rfsScore")
+                        .setCardinality(PropertyConfig.CARDINALITY_REPEATED)
+                        .setScoringEnabled(true)
+                        .build())
+                .build();
+        AppSearchSchema smsLogSchema = new AppSearchSchema.Builder("SmsLog")
+                .addProperty(new StringPropertyConfig.Builder("personQualifiedId")
+                        .setCardinality(PropertyConfig.CARDINALITY_OPTIONAL)
+                        .setJoinableValueType(StringPropertyConfig.JOINABLE_VALUE_TYPE_QUALIFIED_ID)
+                        .build())
+                .addProperty(new DoublePropertyConfig.Builder("rfsScore")
+                        .setCardinality(PropertyConfig.CARDINALITY_REPEATED)
+                        .setScoringEnabled(true)
+                        .build())
+                .build();
+        mDb1.setSchemaAsync(
+                new SetSchemaRequest.Builder()
+                        .addSchemas(personSchema, callLogSchema, smsLogSchema).build()).get();
+
+        // John will have two CallLog docs to join and one sms log to join.
+        GenericDocument personJohn = new GenericDocument.Builder<>(
+                "namespace", "johnId", "Person")
+                .setPropertyString("name", "John")
+                .setPropertyBoolean("isStarred", true)
+                .setPropertyDouble("income", 30)
+                .setScore(10)
+                .build();
+        // Kevin will have two CallLog docs to join and one sms log to join.
+        GenericDocument personKevin = new GenericDocument.Builder<>(
+                "namespace", "kevinId", "Person")
+                .setPropertyString("name", "Kevin")
+                .setPropertyBoolean("isStarred", false)
+                .setPropertyDouble("income", 40)
+                .setScore(20)
+                .build();
+        // Tim has no CallLog or SmsLog to join.
+        GenericDocument personTim = new GenericDocument.Builder<>("namespace", "timId", "Person")
+                .setPropertyString("name", "Tim")
+                .setPropertyDouble("income", 60)
+                .setPropertyBoolean("isStarred", true)
+                .setScore(50)
+                .build();
+
+        GenericDocument johnCallLog1 =
+                new GenericDocument.Builder<>(
+                        "namespace", "johnCallLog1", "CallLog")
+                        .setScore(5)
+                        .setPropertyDouble("rfsScore", 100, 200)
+                        .setPropertyString("personQualifiedId",
+                                DocumentIdUtil.createQualifiedId(mContext.getPackageName(),
+                                        DB_NAME_1, personJohn))
+                        .build();
+        GenericDocument johnCallLog2 =
+                new GenericDocument.Builder<>(
+                        "namespace", "johnCallLog2", "CallLog")
+                        .setScore(5)
+                        .setPropertyDouble("rfsScore", 300, 500)
+                        .setPropertyString("personQualifiedId",
+                                DocumentIdUtil.createQualifiedId(mContext.getPackageName(),
+                                        DB_NAME_1, personJohn))
+                        .build();
+        GenericDocument kevinCallLog1 =
+                new GenericDocument.Builder<>(
+                        "namespace", "kevinCallLog1", "CallLog")
+                        .setScore(5)
+                        .setPropertyDouble("rfsScore", 300, 400)
+                        .setPropertyString("personQualifiedId",
+                                DocumentIdUtil.createQualifiedId(mContext.getPackageName(),
+                                        DB_NAME_1, personKevin))
+                        .build();
+        GenericDocument kevinCallLog2 =
+                new GenericDocument.Builder<>(
+                        "namespace", "kevinCallLog2", "CallLog")
+                        .setScore(5)
+                        .setPropertyDouble("rfsScore", 500, 800)
+                        .setPropertyString("personQualifiedId",
+                                DocumentIdUtil.createQualifiedId(mContext.getPackageName(),
+                                        DB_NAME_1, personKevin))
+                        .build();
+        GenericDocument johnSmsLog1 =
+                new GenericDocument.Builder<>(
+                        "namespace", "johnSmsLog1", "SmsLog")
+                        .setScore(5)
+                        .setPropertyDouble("rfsScore", 1000, 2000)
+                        .setPropertyString("personQualifiedId",
+                                DocumentIdUtil.createQualifiedId(mContext.getPackageName(),
+                                        DB_NAME_1, personJohn))
+                        .build();
+        GenericDocument kevinSmsLog1 =
+                new GenericDocument.Builder<>(
+                        "namespace", "kevinSmsLog1", "SmsLog")
+                        .setScore(5)
+                        .setPropertyDouble("rfsScore",  2000, 3000)
+                        .setPropertyString("personQualifiedId",
+                                DocumentIdUtil.createQualifiedId(mContext.getPackageName(),
+                                        DB_NAME_1, personKevin))
+                        .build();
+
+        // Put all documents to AppSearch and verify its success.
+        AppSearchBatchResult<String, Void> result =
+                checkIsBatchResultSuccess(
+                        mDb1.putAsync(
+                                new PutDocumentsRequest.Builder()
+                                        .addGenericDocuments(
+                                                personTim, personJohn, personKevin,
+                                                kevinCallLog1, kevinCallLog2, kevinSmsLog1,
+                                                johnCallLog1, johnCallLog2, johnSmsLog1)
+                                        .build()));
+        assertThat(result.getSuccesses().size()).isEqualTo(9);
+        assertThat(result.getFailures()).isEmpty();
+
+        String childRankingStrategy =
+                "sum(getScorableProperty(\"CallLog\", \"rfsScore\")) + " +
+                        "sum(getScorableProperty(\"SmsLog\", \"rfsScore\"))";
+        double johnChildDocScore = 100 + 200 + 300 + 500 + 1000 + 2000;
+        double kevinChildDocScore = 300 + 400 + 500 + 800 + 2000 + 3000;
+        double timChildDocScore = 0;
+
+        SearchSpec childSearchSpec = new SearchSpec.Builder()
+                .setScorablePropertyRankingEnabled(true)
+                .setRankingStrategy(childRankingStrategy)
+                .build();
+        JoinSpec js = new JoinSpec.Builder("personQualifiedId")
+                .setNestedSearch("", childSearchSpec)
+                .build();
+        String parentRankingStrategy =
+                        "sum(getScorableProperty(\"Person\", \"income\")) + " +
+                        "20 * sum(getScorableProperty(\"Person\", \"isStarred\")) + " +
+                        "sum(this.childrenRankingSignals())";
+        SearchSpec parentSearchSpec = new SearchSpec.Builder()
+                .setScorablePropertyRankingEnabled(true)
+                .setJoinSpec(js)
+                .setRankingStrategy(parentRankingStrategy)
+                .addFilterSchemas("Person")
+                .build();
+        double johnExpectScore = /*income=*/30 + 20 * /*isStarred=*/1 + johnChildDocScore;
+        double kevinExpectScore = /*income=*/40 + 20 * /*isStarred=*/0 + kevinChildDocScore;
+        double timExpectScore = /*income=*/60 + 20 * /*isStarred=*/1 + timChildDocScore;
+
+        SearchResults searchResults =
+                mDb1.search("", parentSearchSpec);
+        List<SearchResult> results = retrieveAllSearchResults(searchResults);
+        assertThat(results).hasSize(3);
+        assertThat(results.get(0).getRankingSignal())
+                .isWithin(0.00001).of(kevinExpectScore);
+        assertThat(results.get(1).getRankingSignal())
+                .isWithin(0.00001).of(johnExpectScore);
+        assertThat(results.get(2).getRankingSignal())
+                .isWithin(0.00001).of(timExpectScore);
     }
 
     @Test
diff --git a/asynclayoutinflater/asynclayoutinflater-appcompat/build.gradle b/asynclayoutinflater/asynclayoutinflater-appcompat/build.gradle
index 37f331f..a5515aa 100644
--- a/asynclayoutinflater/asynclayoutinflater-appcompat/build.gradle
+++ b/asynclayoutinflater/asynclayoutinflater-appcompat/build.gradle
@@ -13,6 +13,7 @@
 }
 
 dependencies {
+    api(libs.jspecify)
     api("androidx.annotation:annotation:1.8.1")
     api("androidx.core:core:1.1.0")
     implementation(project(":appcompat:appcompat"))
diff --git a/asynclayoutinflater/asynclayoutinflater-appcompat/src/main/java/androidx/asynclayoutinflater/appcompat/AsyncAppCompatFactory.java b/asynclayoutinflater/asynclayoutinflater-appcompat/src/main/java/androidx/asynclayoutinflater/appcompat/AsyncAppCompatFactory.java
index 9455b93..405ce7e 100644
--- a/asynclayoutinflater/asynclayoutinflater-appcompat/src/main/java/androidx/asynclayoutinflater/appcompat/AsyncAppCompatFactory.java
+++ b/asynclayoutinflater/asynclayoutinflater-appcompat/src/main/java/androidx/asynclayoutinflater/appcompat/AsyncAppCompatFactory.java
@@ -21,13 +21,14 @@
 import android.util.Log;
 import android.view.View;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.appcompat.R;
 import androidx.appcompat.app.AppCompatViewInflater;
 import androidx.appcompat.widget.VectorEnabledTintResources;
 import androidx.asynclayoutinflater.view.AsyncLayoutFactory;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 /**
  * Factory for inflating views in AppCompat activity. This is used when Async inflater is created
  * with AppCompat context.
@@ -39,19 +40,17 @@
     /**
      * Creates view using {@link AppCompatViewInflater}.
      */
-    @Nullable
     @Override
-    public View onCreateView(@Nullable View parent, @NonNull String name, @NonNull Context context,
-            @NonNull AttributeSet attrs) {
+    public @Nullable View onCreateView(@Nullable View parent, @NonNull String name,
+            @NonNull Context context, @NonNull AttributeSet attrs) {
         return createView(parent, name, context, attrs);
     }
 
     /**
      * Creates view using {@link AppCompatViewInflater}.
      */
-    @Nullable
     @Override
-    public View onCreateView(@NonNull String name, @NonNull Context context,
+    public @Nullable View onCreateView(@NonNull String name, @NonNull Context context,
             @NonNull AttributeSet attrs) {
         return createView(/* parent= */ null, name, context, attrs);
     }
diff --git a/asynclayoutinflater/asynclayoutinflater/build.gradle b/asynclayoutinflater/asynclayoutinflater/build.gradle
index f0484b3..5c2b29d 100644
--- a/asynclayoutinflater/asynclayoutinflater/build.gradle
+++ b/asynclayoutinflater/asynclayoutinflater/build.gradle
@@ -13,6 +13,7 @@
 }
 
 dependencies {
+    api(libs.jspecify)
     api("androidx.annotation:annotation:1.8.1")
     api("androidx.core:core:1.1.0")
     androidTestImplementation(project(":appcompat:appcompat"))
diff --git a/asynclayoutinflater/asynclayoutinflater/src/androidTest/java/androidx/asynclayoutinflater/view/FailingAsyncView.java b/asynclayoutinflater/asynclayoutinflater/src/androidTest/java/androidx/asynclayoutinflater/view/FailingAsyncView.java
index 8cb3279..35cffd1 100644
--- a/asynclayoutinflater/asynclayoutinflater/src/androidTest/java/androidx/asynclayoutinflater/view/FailingAsyncView.java
+++ b/asynclayoutinflater/asynclayoutinflater/src/androidTest/java/androidx/asynclayoutinflater/view/FailingAsyncView.java
@@ -19,6 +19,7 @@
 import android.os.Looper;
 import android.util.AttributeSet;
 import android.widget.TextView;
+
 /**
  * A view that cannot be inflated on the bg thread because it creates a {@link Handler}.
  */
diff --git a/asynclayoutinflater/asynclayoutinflater/src/main/java/androidx/asynclayoutinflater/view/AsyncLayoutInflater.java b/asynclayoutinflater/asynclayoutinflater/src/main/java/androidx/asynclayoutinflater/view/AsyncLayoutInflater.java
index 8572b19..72281aa 100644
--- a/asynclayoutinflater/asynclayoutinflater/src/main/java/androidx/asynclayoutinflater/view/AsyncLayoutInflater.java
+++ b/asynclayoutinflater/asynclayoutinflater/src/main/java/androidx/asynclayoutinflater/view/AsyncLayoutInflater.java
@@ -27,11 +27,12 @@
 import android.view.ViewGroup;
 
 import androidx.annotation.LayoutRes;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.UiThread;
 import androidx.core.util.Pools.SynchronizedPool;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.Executor;
 
diff --git a/benchmark/benchmark-common/build.gradle b/benchmark/benchmark-common/build.gradle
index a6af5e3..0718f57 100644
--- a/benchmark/benchmark-common/build.gradle
+++ b/benchmark/benchmark-common/build.gradle
@@ -75,6 +75,7 @@
 }
 
 dependencies {
+    api(libs.jspecify)
     implementation(libs.kotlinStdlib)
     api("androidx.annotation:annotation:1.8.1")
     api("androidx.annotation:annotation-experimental:1.4.1")
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/simpleperf/ProfileSession.java b/benchmark/benchmark-common/src/main/java/androidx/benchmark/simpleperf/ProfileSession.java
index 2e33e53..11fe2f0 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/simpleperf/ProfileSession.java
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/simpleperf/ProfileSession.java
@@ -21,11 +21,12 @@
 import android.system.Os;
 import android.system.OsConstants;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
@@ -247,8 +248,7 @@
         return file.canExecute();
     }
 
-    @Nullable
-    private String findSimpleperfInTempDir() {
+    private @Nullable String findSimpleperfInTempDir() {
         String path = "/data/local/tmp/simpleperf";
         File file = new File(path);
         if (!file.isFile()) {
@@ -408,8 +408,7 @@
         }
     }
 
-    @NonNull
-    private String readReply() {
+    private @NonNull String readReply() {
         // Read one byte at a time to stop at line break or EOF. BufferedReader will try to read
         // more than available and make us blocking, so don't use it.
         String s = "";
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/simpleperf/RecordOptions.java b/benchmark/benchmark-common/src/main/java/androidx/benchmark/simpleperf/RecordOptions.java
index 4a23dba..e538e454f 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/simpleperf/RecordOptions.java
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/simpleperf/RecordOptions.java
@@ -18,11 +18,12 @@
 
 import android.system.Os;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
@@ -59,8 +60,7 @@
      * Set output filename. Default is perf-<month>-<day>-<hour>-<minute>-<second>.data.
      * The file will be generated under simpleperf_data/.
      */
-    @NonNull
-    public RecordOptions setOutputFilename(@NonNull String filename) {
+    public @NonNull RecordOptions setOutputFilename(@NonNull String filename) {
         mOutputFilename = filename;
         return this;
     }
@@ -68,8 +68,7 @@
     /**
      * Set event to record. Default is cpu-cycles. See `simpleperf list` for all available events.
      */
-    @NonNull
-    public RecordOptions setEvent(@NonNull String event) {
+    public @NonNull RecordOptions setEvent(@NonNull String event) {
         mEvent = event;
         return this;
     }
@@ -77,8 +76,7 @@
     /**
      * Set how many samples to generate each second running. Default is 4000.
      */
-    @NonNull
-    public RecordOptions setSampleFrequency(int freq) {
+    public @NonNull RecordOptions setSampleFrequency(int freq) {
         mFreq = freq;
         return this;
     }
@@ -87,8 +85,7 @@
      * Set record duration. The record stops after `durationInSecond` seconds. By default,
      * record stops only when stopRecording() is called.
      */
-    @NonNull
-    public RecordOptions setDuration(double durationInSecond) {
+    public @NonNull RecordOptions setDuration(double durationInSecond) {
         mDurationInSeconds = durationInSecond;
         return this;
     }
@@ -96,8 +93,7 @@
     /**
      * Record some threads in the app process. By default, record all threads in the process.
      */
-    @NonNull
-    public RecordOptions setSampleThreads(@NonNull List<Integer> threads) {
+    public @NonNull RecordOptions setSampleThreads(@NonNull List<Integer> threads) {
         mThreads.addAll(threads);
         return this;
     }
@@ -105,15 +101,13 @@
     /**
      * Record current thread in the app process. By default, record all threads in the process.
      */
-    @NonNull
-    public RecordOptions setSampleCurrentThread() {
+    public @NonNull RecordOptions setSampleCurrentThread() {
         return setSampleThreads(Collections.singletonList(Os.gettid()));
     }
     /**
      * Record dwarf based call graph. It is needed to get Java callstacks.
      */
-    @NonNull
-    public RecordOptions recordDwarfCallGraph() {
+    public @NonNull RecordOptions recordDwarfCallGraph() {
         mDwarfCallGraph = true;
         mFpCallGraph = false;
         return this;
@@ -123,8 +117,7 @@
      * Record frame pointer based call graph. It is suitable to get C++ callstacks on 64bit devices.
      */
     @SuppressWarnings("unused")
-    @NonNull
-    public RecordOptions recordFramePointerCallGraph() {
+    public @NonNull RecordOptions recordFramePointerCallGraph() {
         mFpCallGraph = true;
         mDwarfCallGraph = false;
         return this;
@@ -133,8 +126,7 @@
     /**
      * Trace context switch info to show where threads spend time off cpu.
      */
-    @NonNull
-    public RecordOptions traceOffCpu() {
+    public @NonNull RecordOptions traceOffCpu() {
         mTraceOffCpu = true;
         return this;
     }
@@ -142,8 +134,7 @@
     /**
      * Translate record options into arguments for `simpleperf record` cmd.
      */
-    @NonNull
-    public List<String> toRecordArgs() {
+    public @NonNull List<String> toRecordArgs() {
         ArrayList<String> args = new ArrayList<>();
 
         String filename = mOutputFilename;
@@ -192,18 +183,15 @@
         return time.format(formatter);
     }
 
-    @Nullable
-    private String mOutputFilename;
+    private @Nullable String mOutputFilename;
 
-    @NonNull
-    private String mEvent = "cpu-cycles";
+    private @NonNull String mEvent = "cpu-cycles";
 
     private int mFreq = 4000;
 
     private double mDurationInSeconds = 0.0;
 
-    @NonNull
-    private final ArrayList<Integer> mThreads = new ArrayList<>();
+    private final @NonNull ArrayList<Integer> mThreads = new ArrayList<>();
 
     private boolean mDwarfCallGraph = false;
 
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/vmtrace/ByteBufferUtil.java b/benchmark/benchmark-common/src/main/java/androidx/benchmark/vmtrace/ByteBufferUtil.java
index f968b6f..672a9dc 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/vmtrace/ByteBufferUtil.java
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/vmtrace/ByteBufferUtil.java
@@ -15,7 +15,7 @@
  */
 package androidx.benchmark.vmtrace;
 
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -30,8 +30,8 @@
     private ByteBufferUtil() {
     }
 
-    @NonNull
-    public static ByteBuffer mapFile(@NonNull File f, long offset, @NonNull ByteOrder byteOrder)
+    public static @NonNull ByteBuffer mapFile(@NonNull File f, long offset,
+            @NonNull ByteOrder byteOrder)
             throws IOException {
         FileInputStream dataFile = new FileInputStream(f);
         try {
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/vmtrace/MethodInfo.java b/benchmark/benchmark-common/src/main/java/androidx/benchmark/vmtrace/MethodInfo.java
index edd3552..ba51ac8 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/vmtrace/MethodInfo.java
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/vmtrace/MethodInfo.java
@@ -16,7 +16,7 @@
 
 package androidx.benchmark.vmtrace;
 
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
 
 import java.util.Locale;
 
@@ -46,24 +46,21 @@
         this.srcLineNumber = srcLineNumber;
     }
 
-    @NonNull
-    public String getFullName() {
+    public @NonNull String getFullName() {
         if (mFullName == null) {
             mFullName = String.format(Locale.US, "%s.%s: %s", className, methodName, signature);
         }
         return mFullName;
     }
 
-    @NonNull
-    public String getShortName() {
+    public @NonNull String getShortName() {
         if (mShortName == null) {
             mShortName = String.format(Locale.US, "%s.%s", getUnqualifiedClassName(), methodName);
         }
         return mShortName;
     }
 
-    @NonNull
-    private String getUnqualifiedClassName() {
+    private @NonNull String getUnqualifiedClassName() {
         String cn = className;
         int i = cn.lastIndexOf('/');
         if (i > 0) {
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/vmtrace/VmTraceHandler.java b/benchmark/benchmark-common/src/main/java/androidx/benchmark/vmtrace/VmTraceHandler.java
index 55ebfa4..fdd35f8 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/vmtrace/VmTraceHandler.java
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/vmtrace/VmTraceHandler.java
@@ -15,7 +15,7 @@
  */
 package androidx.benchmark.vmtrace;
 
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
 
 /**
  * This interface used by {@link VmTraceParser}. {@link VmTraceParser} parses a trace file and
diff --git a/benchmark/benchmark-common/src/main/java/androidx/benchmark/vmtrace/VmTraceParser.java b/benchmark/benchmark-common/src/main/java/androidx/benchmark/vmtrace/VmTraceParser.java
index f7c8a0b..3a7df15 100644
--- a/benchmark/benchmark-common/src/main/java/androidx/benchmark/vmtrace/VmTraceParser.java
+++ b/benchmark/benchmark-common/src/main/java/androidx/benchmark/vmtrace/VmTraceParser.java
@@ -16,7 +16,7 @@
 
 package androidx.benchmark.vmtrace;
 
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
 
 import java.io.BufferedReader;
 import java.io.File;
diff --git a/benchmark/benchmark-macro/build.gradle b/benchmark/benchmark-macro/build.gradle
index 3b9fbf5..cb5aa1c 100644
--- a/benchmark/benchmark-macro/build.gradle
+++ b/benchmark/benchmark-macro/build.gradle
@@ -68,6 +68,7 @@
 }
 
 dependencies {
+    api(libs.jspecify)
     api(project(":benchmark:benchmark-common"))
     api(libs.junit)
     api(libs.kotlinStdlib)
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/JankCollectionHelper.java b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/JankCollectionHelper.java
index fff2766..b75342a 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/JankCollectionHelper.java
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/JankCollectionHelper.java
@@ -19,12 +19,13 @@
 import android.text.TextUtils;
 import android.util.Log;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.test.platform.app.InstrumentationRegistry;
 import androidx.test.uiautomator.UiDevice;
 
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
 import java.io.IOException;
 import java.util.Collections;
 import java.util.HashMap;
@@ -170,8 +171,7 @@
             mMetricId = metricId;
         }
 
-        @Nullable
-        public Double parse(@NonNull String lines) {
+        public @Nullable Double parse(@NonNull String lines) {
             Matcher matcher = mPattern.matcher(lines);
             if (matcher.matches()) {
                 return Double.valueOf(matcher.group(mGroupIndex));
@@ -180,8 +180,7 @@
             }
         }
 
-        @NonNull
-        public String getMetricId() {
+        public @NonNull String getMetricId() {
             return mMetricId;
         }
     }
@@ -221,8 +220,7 @@
     }
 
     /** Collect the {@code gfxinfo} metrics for tracked processes (or all, if unspecified). */
-    @NonNull
-    public Map<String, Double> getMetrics() {
+    public @NonNull Map<String, Double> getMetrics() {
         Map<String, Double> result = new HashMap<>();
         if (mTrackedPackages.isEmpty()) {
             result.putAll(getGfxInfoMetrics());
@@ -258,7 +256,7 @@
     }
 
     /** Add a package or list of packages to be tracked. */
-    public void addTrackedPackages(@NonNull String... packages) {
+    public void addTrackedPackages(String @NonNull ... packages) {
         Collections.addAll(mTrackedPackages, packages);
     }
 
@@ -348,7 +346,7 @@
         return results;
     }
 
-    private String constructKey(@NonNull String ...tokens) {
+    private String constructKey(String @NonNull ...tokens) {
         return TextUtils.join("_", tokens);
     }
 
@@ -371,9 +369,8 @@
     }
 
     /** Returns the {@link UiDevice} under test. */
-    @NonNull
     @VisibleForTesting
-    protected UiDevice getDevice() {
+    protected @NonNull UiDevice getDevice() {
         if (mDevice == null) {
             mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
         }
diff --git a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/BasicEdgeToEdgeDialog.android.kt b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/BasicEdgeToEdgeDialog.android.kt
index c3ce4cc..fd710df 100644
--- a/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/BasicEdgeToEdgeDialog.android.kt
+++ b/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/internal/BasicEdgeToEdgeDialog.android.kt
@@ -25,18 +25,14 @@
 import android.view.ViewOutlineProvider
 import android.view.Window
 import android.view.WindowManager
-import androidx.activity.BackEventCompat
 import androidx.activity.ComponentDialog
-import androidx.activity.compose.PredictiveBackHandler
 import androidx.compose.foundation.layout.Box
-import androidx.compose.material3.LocalContentColor
 import androidx.compose.material3.isFlagSecureEnabled
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionContext
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.SideEffect
 import androidx.compose.runtime.getValue
-import androidx.compose.runtime.key
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCompositionContext
@@ -45,7 +41,6 @@
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.R
-import androidx.compose.ui.graphics.luminance
 import androidx.compose.ui.platform.AbstractComposeView
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalLayoutDirection
@@ -67,7 +62,6 @@
 import androidx.savedstate.findViewTreeSavedStateRegistryOwner
 import androidx.savedstate.setViewTreeSavedStateRegistryOwner
 import java.util.UUID
-import kotlin.coroutines.cancellation.CancellationException
 
 /**
  * A dialog that is _always_ full screen and edge-to-edge. This is intended to be the underlying
@@ -86,12 +80,12 @@
  * if [DialogProperties.dismissOnBackPress] is true.
  */
 @Composable
-internal fun BasicEdgeToEdgeDialog(
+internal actual fun BasicEdgeToEdgeDialog(
     onDismissRequest: () -> Unit,
-    modifier: Modifier = Modifier,
-    properties: DialogProperties = DialogProperties(),
-    lightStatusBars: Boolean = LocalContentColor.current.luminance() < 0.5f,
-    lightNavigationBars: Boolean = LocalContentColor.current.luminance() < 0.5f,
+    modifier: Modifier,
+    properties: DialogProperties,
+    lightStatusBars: Boolean,
+    lightNavigationBars: Boolean,
     content: @Composable (PredictiveBackState) -> Unit,
 ) {
     val view = LocalView.current
@@ -326,87 +320,6 @@
     }
 }
 
-internal enum class SwipeEdge {
-    Left,
-    Right
-}
-
-/**
- * The state describing a one-shot back state, with use in a [PredictiveBackStateHandler].
- *
- * Because the back handler can only be used once, there are three states that [BackEventProgress]
- * can be in:
- * - [NotRunning]
- * - [InProgress], which can happen on API 34 and above if a predictive back is in progress.
- * - [Completed]
- */
-internal sealed interface BackEventProgress {
-    /** There is no predictive back ongoing, and the back has not been completed. */
-    object NotRunning : BackEventProgress
-
-    /** There is an ongoing predictive back animation, with the given [progress]. */
-    data class InProgress(
-        val touchX: Float,
-        val touchY: Float,
-        val progress: Float,
-        val swipeEdge: SwipeEdge,
-    ) : BackEventProgress
-
-    /** The back has completed. */
-    object Completed : BackEventProgress
-}
-
-@Composable
-internal fun rememberPredictiveBackState(): PredictiveBackState = remember {
-    PredictiveBackStateImpl()
-}
-
-internal sealed interface PredictiveBackState {
-    val value: BackEventProgress
-}
-
-private class PredictiveBackStateImpl : PredictiveBackState {
-    override var value: BackEventProgress by mutableStateOf(BackEventProgress.NotRunning)
-}
-
-@Composable
-internal fun PredictiveBackStateHandler(
-    state: PredictiveBackState,
-    enabled: Boolean = true,
-    onBack: () -> Unit,
-) {
-    // Safely update the current `onBack` lambda when a new one is provided
-    val currentOnBack by rememberUpdatedState(onBack)
-
-    key(state) {
-        state as PredictiveBackStateImpl
-        PredictiveBackHandler(
-            enabled = enabled && state.value !is BackEventProgress.Completed,
-        ) { progress ->
-            try {
-                progress.collect { backEvent ->
-                    state.value =
-                        BackEventProgress.InProgress(
-                            backEvent.touchX,
-                            backEvent.touchY,
-                            backEvent.progress,
-                            when (backEvent.swipeEdge) {
-                                BackEventCompat.EDGE_LEFT -> SwipeEdge.Left
-                                BackEventCompat.EDGE_RIGHT -> SwipeEdge.Right
-                                else -> error("Unknown swipe edge")
-                            },
-                        )
-                }
-                state.value = BackEventProgress.Completed
-                currentOnBack()
-            } catch (e: CancellationException) {
-                state.value = BackEventProgress.NotRunning
-                throw e
-            }
-        }
-    }
-}
-
 // Taken from AndroidPopup.android.kt
 internal fun SecureFlagPolicy.shouldApplySecureFlag(isSecureFlagSetOnParent: Boolean): Boolean {
     return when (this) {
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/BasicEdgeToEdgeDialog.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/BasicEdgeToEdgeDialog.kt
new file mode 100644
index 0000000..30f461f
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/internal/BasicEdgeToEdgeDialog.kt
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.material3.internal
+
+import androidx.compose.material3.LocalContentColor
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.key
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberUpdatedState
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.luminance
+import androidx.compose.ui.window.DialogProperties
+import kotlinx.coroutines.CancellationException
+
+@Composable
+internal expect fun BasicEdgeToEdgeDialog(
+    onDismissRequest: () -> Unit,
+    modifier: Modifier = Modifier,
+    properties: DialogProperties = DialogProperties(),
+    lightStatusBars: Boolean = LocalContentColor.current.luminance() < 0.5f,
+    lightNavigationBars: Boolean = LocalContentColor.current.luminance() < 0.5f,
+    content: @Composable (PredictiveBackState) -> Unit,
+)
+
+internal sealed interface PredictiveBackState {
+    val value: BackEventProgress
+}
+
+/**
+ * The state describing a one-shot back state, with use in a [PredictiveBackStateHandler].
+ *
+ * Because the back handler can only be used once, there are three states that [BackEventProgress]
+ * can be in:
+ * - [NotRunning]
+ * - [InProgress], which can happen on API 34 and above if a predictive back is in progress.
+ * - [Completed]
+ */
+internal sealed interface BackEventProgress {
+    /** There is no predictive back ongoing, and the back has not been completed. */
+    object NotRunning : BackEventProgress
+
+    /** There is an ongoing predictive back animation, with the given [progress]. */
+    data class InProgress(
+        val touchX: Float,
+        val touchY: Float,
+        val progress: Float,
+        val swipeEdge: SwipeEdge,
+    ) : BackEventProgress
+
+    /** The back has completed. */
+    object Completed : BackEventProgress
+}
+
+internal enum class SwipeEdge {
+    Left,
+    Right
+}
+
+@Composable
+internal fun rememberPredictiveBackState(): PredictiveBackState = remember {
+    PredictiveBackStateImpl()
+}
+
+private class PredictiveBackStateImpl : PredictiveBackState {
+    override var value: BackEventProgress by mutableStateOf(BackEventProgress.NotRunning)
+}
+
+@Composable
+internal fun PredictiveBackStateHandler(
+    state: PredictiveBackState,
+    enabled: Boolean = true,
+    onBack: () -> Unit,
+) {
+    // Safely update the current `onBack` lambda when a new one is provided
+    val currentOnBack by rememberUpdatedState(onBack)
+
+    key(state) {
+        state as PredictiveBackStateImpl
+        PredictiveBackHandler(
+            enabled = enabled && state.value !is BackEventProgress.Completed,
+        ) { progress ->
+            try {
+                progress.collect { backEvent ->
+                    state.value =
+                        BackEventProgress.InProgress(
+                            backEvent.touchX,
+                            backEvent.touchY,
+                            backEvent.progress,
+                            when (backEvent.swipeEdge) {
+                                BackEventCompat.EDGE_LEFT -> SwipeEdge.Left
+                                BackEventCompat.EDGE_RIGHT -> SwipeEdge.Right
+                                else -> error("Unknown swipe edge")
+                            },
+                        )
+                }
+                state.value = BackEventProgress.Completed
+                currentOnBack()
+            } catch (e: CancellationException) {
+                state.value = BackEventProgress.NotRunning
+                throw e
+            }
+        }
+    }
+}
diff --git a/compose/material3/material3/src/commonStubsMain/kotlin/androidx/compose/material3/internal/BasicEdgeToEdgeDialog.commonStubs.kt b/compose/material3/material3/src/commonStubsMain/kotlin/androidx/compose/material3/internal/BasicEdgeToEdgeDialog.commonStubs.kt
new file mode 100644
index 0000000..b50e87e
--- /dev/null
+++ b/compose/material3/material3/src/commonStubsMain/kotlin/androidx/compose/material3/internal/BasicEdgeToEdgeDialog.commonStubs.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.material3.internal
+
+import androidx.compose.material3.implementedInJetBrainsFork
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.window.DialogProperties
+
+@Composable
+internal actual fun BasicEdgeToEdgeDialog(
+    onDismissRequest: () -> Unit,
+    modifier: Modifier,
+    properties: DialogProperties,
+    lightStatusBars: Boolean,
+    lightNavigationBars: Boolean,
+    content: @Composable (PredictiveBackState) -> Unit,
+): Unit = implementedInJetBrainsFork()
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/MovableContent.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/MovableContent.kt
index f142586..8dda6de 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/MovableContent.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/MovableContent.kt
@@ -34,8 +34,8 @@
  */
 @OptIn(InternalComposeApi::class)
 fun movableContentOf(content: @Composable () -> Unit): @Composable () -> Unit {
-    val movableContent = MovableContent<Unit>({ content() })
-    return { currentComposer.insertMovableContent(movableContent, Unit) }
+    val movableContent = MovableContent<Nothing?>({ content() })
+    return { currentComposer.insertMovableContent(movableContent, null) }
 }
 
 /**
@@ -103,10 +103,10 @@
     content: @Composable (P1, P2, P3) -> Unit
 ): @Composable (P1, P2, P3) -> Unit {
     val movableContent =
-        MovableContent<Pair<Pair<P1, P2>, P3>> {
-            content(it.first.first, it.first.second, it.second)
-        }
-    return { p1, p2, p3 -> currentComposer.insertMovableContent(movableContent, (p1 to p2) to p3) }
+        MovableContent<Triple<P1, P2, P3>> { content(it.first, it.second, it.third) }
+    return { p1, p2, p3 ->
+        currentComposer.insertMovableContent(movableContent, Triple(p1, p2, p3))
+    }
 }
 
 /**
@@ -130,11 +130,12 @@
     content: @Composable (P1, P2, P3, P4) -> Unit
 ): @Composable (P1, P2, P3, P4) -> Unit {
     val movableContent =
-        MovableContent<Pair<Pair<P1, P2>, Pair<P3, P4>>> {
-            content(it.first.first, it.first.second, it.second.first, it.second.second)
+        MovableContent<Array<Any?>> { (p1, p2, p3, p4) ->
+            @Suppress("UNCHECKED_CAST") // Types are guaranteed below.
+            content(p1 as P1, p2 as P2, p3 as P3, p4 as P4)
         }
     return { p1, p2, p3, p4 ->
-        currentComposer.insertMovableContent(movableContent, (p1 to p2) to (p3 to p4))
+        currentComposer.insertMovableContent(movableContent, arrayOf(p1, p2, p3, p4))
     }
 }
 
@@ -204,9 +205,8 @@
 fun <R, P1, P2> movableContentWithReceiverOf(
     content: @Composable R.(P1, P2) -> Unit
 ): @Composable R.(P1, P2) -> Unit {
-    val movableContent =
-        MovableContent<Pair<Pair<R, P1>, P2>> { it.first.first.content(it.first.second, it.second) }
-    return { p1, p2 -> currentComposer.insertMovableContent(movableContent, (this to p1) to p2) }
+    val movableContent = MovableContent<Triple<R, P1, P2>> { it.first.content(it.second, it.third) }
+    return { p1, p2 -> currentComposer.insertMovableContent(movableContent, Triple(this, p1, p2)) }
 }
 
 /**
@@ -230,11 +230,12 @@
     content: @Composable R.(P1, P2, P3) -> Unit
 ): @Composable R.(P1, P2, P3) -> Unit {
     val movableContent =
-        MovableContent<Pair<Pair<R, P1>, Pair<P2, P3>>> {
-            it.first.first.content(it.first.second, it.second.first, it.second.second)
+        MovableContent<Array<Any?>> { (r, p1, p2, p3) ->
+            @Suppress("UNCHECKED_CAST") // Types are guaranteed below.
+            (r as R).content(p1 as P1, p2 as P2, p3 as P3)
         }
     return { p1, p2, p3 ->
-        currentComposer.insertMovableContent(movableContent, (this to p1) to (p2 to p3))
+        currentComposer.insertMovableContent(movableContent, arrayOf(this, p1, p2, p3))
     }
 }
 
diff --git a/libraryversions.toml b/libraryversions.toml
index 8575a9c..e0fec0e 100644
--- a/libraryversions.toml
+++ b/libraryversions.toml
@@ -44,7 +44,7 @@
 CORE_ROLE = "1.2.0-alpha01"
 CORE_SPLASHSCREEN = "1.2.0-alpha02"
 CORE_TELECOM = "1.0.0-alpha4"
-CORE_UWB = "1.0.0-alpha09"
+CORE_UWB = "1.0.0-alpha10"
 CORE_VIEWTREE = "1.0.0-alpha01"
 CREDENTIALS = "1.5.0-beta01"
 CREDENTIALS_E2EE_QUARANTINE = "1.0.0-alpha02"
diff --git a/privacysandbox/ui/integration-tests/mediateesdkprovider/build.gradle b/privacysandbox/ui/integration-tests/mediateesdkprovider/build.gradle
index 2073543..549a7ee 100644
--- a/privacysandbox/ui/integration-tests/mediateesdkprovider/build.gradle
+++ b/privacysandbox/ui/integration-tests/mediateesdkprovider/build.gradle
@@ -16,18 +16,13 @@
 
 plugins {
     id("AndroidXPlugin")
-    id("com.android.application")
+    id("com.android.library")
     id("org.jetbrains.kotlin.android")
 }
 
 android {
     namespace "androidx.privacysandbox.ui.integration.mediateesdkprovider"
-
-    defaultConfig {
-        applicationId "androidx.privacysandbox.ui.integration.mediateesdkprovider"
-        minSdk 33
-        compileSdk 35
-    }
+    compileSdk 35
 
     buildTypes {
         release {
@@ -39,9 +34,9 @@
 dependencies {
     api(libs.kotlinStdlib)
     api("androidx.annotation:annotation:1.8.1")
+    implementation project(':privacysandbox:sdkruntime:sdkruntime-provider')
     implementation project(':privacysandbox:ui:integration-tests:testaidl')
     implementation project(':privacysandbox:ui:ui-core')
     implementation project(':privacysandbox:ui:ui-provider')
-    implementation project(':privacysandbox:sdkruntime:sdkruntime-client')
     implementation project(':privacysandbox:ui:integration-tests:sdkproviderutils')
 }
diff --git a/privacysandbox/ui/integration-tests/mediateesdkprovider/src/main/AndroidManifest.xml b/privacysandbox/ui/integration-tests/mediateesdkprovider/src/main/AndroidManifest.xml
deleted file mode 100644
index b9e9b43..0000000
--- a/privacysandbox/ui/integration-tests/mediateesdkprovider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2024 The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-  -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <application
-        android:allowBackup="true">
-        <sdk-library android:name="androidx.privacysandbox.ui.integration.mediateesdkprovider"
-            android:versionMajor="1" />
-        <property android:name="android.sdksandbox.PROPERTY_SDK_PROVIDER_CLASS_NAME"
-            android:value="androidx.privacysandbox.ui.integration.mediateesdkprovider.SdkProviderImpl" />
-    </application>
-
-</manifest>
diff --git a/privacysandbox/ui/integration-tests/mediateesdkprovider/src/main/java/androidx/privacysandbox/ui/integration/mediateesdkprovider/SdkProviderImpl.kt b/privacysandbox/ui/integration-tests/mediateesdkprovider/src/main/java/androidx/privacysandbox/ui/integration/mediateesdkprovider/SdkProviderImpl.kt
index 7d6c6ba8..d5f70e7 100644
--- a/privacysandbox/ui/integration-tests/mediateesdkprovider/src/main/java/androidx/privacysandbox/ui/integration/mediateesdkprovider/SdkProviderImpl.kt
+++ b/privacysandbox/ui/integration-tests/mediateesdkprovider/src/main/java/androidx/privacysandbox/ui/integration/mediateesdkprovider/SdkProviderImpl.kt
@@ -16,25 +16,19 @@
 
 package androidx.privacysandbox.ui.integration.mediateesdkprovider
 
-import android.annotation.SuppressLint
-import android.app.sdksandbox.SandboxedSdk
-import android.app.sdksandbox.SandboxedSdkProvider
 import android.content.Context
 import android.os.Bundle
-import android.os.ext.SdkExtensions
 import android.view.View
-import androidx.annotation.RequiresExtension
+import androidx.privacysandbox.sdkruntime.core.SandboxedSdkCompat
+import androidx.privacysandbox.sdkruntime.core.SandboxedSdkProviderCompat
 import androidx.privacysandbox.ui.integration.sdkproviderutils.MediateeSdkApiImpl
 
-// TODO(b/257429573): Remove this line once fixed.
-@SuppressLint("ClassVerificationFailure")
-@RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 5)
-class SdkProviderImpl : SandboxedSdkProvider() {
-    override fun onLoadSdk(p0: Bundle): SandboxedSdk {
-        return SandboxedSdk(MediateeSdkApiImpl(context!!))
+class SdkProviderImpl : SandboxedSdkProviderCompat() {
+    override fun onLoadSdk(params: Bundle): SandboxedSdkCompat {
+        return SandboxedSdkCompat(MediateeSdkApiImpl(context!!))
     }
 
-    override fun getView(p0: Context, p1: Bundle, p2: Int, p3: Int): View {
+    override fun getView(windowContext: Context, params: Bundle, width: Int, height: Int): View {
         throw IllegalStateException("This getView method will not be used.")
     }
 }
diff --git a/privacysandbox/ui/integration-tests/mediateesdkproviderwrapper/build.gradle b/privacysandbox/ui/integration-tests/mediateesdkproviderwrapper/build.gradle
new file mode 100644
index 0000000..b08d73b
--- /dev/null
+++ b/privacysandbox/ui/integration-tests/mediateesdkproviderwrapper/build.gradle
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import androidx.build.AndroidXConfig
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.privacy-sandbox-sdk")
+}
+
+android {
+    namespace "androidx.privacysandbox.ui.integration.mediateesdkproviderwrapper"
+    compileSdk 35
+    minSdk 21
+    buildToolsVersion AndroidXConfig.getDefaultAndroidConfig(project).buildToolsVersion
+
+    bundle {
+        packageName = "androidx.privacysandbox.ui.integration.mediateesdkproviderwrapper"
+
+        // This is the entry point class to our SDK in the SDK Runtime. It enables backward
+        // compatibility support.
+        sdkProviderClassName = "androidx.privacysandbox.sdkruntime.provider.SandboxedSdkProviderAdapter"
+
+        // This is the class path of our implementation of the SandboxedSdkProviderCompat class.
+        compatSdkProviderClassName = "androidx.privacysandbox.ui.integration.mediateesdkprovider.SdkProviderImpl"
+
+        setVersion(1, 0, 0)
+    }
+}
+
+dependencies {
+    include(project(":privacysandbox:ui:integration-tests:mediateesdkprovider"))
+}
diff --git a/privacysandbox/ui/integration-tests/testapp/build.gradle b/privacysandbox/ui/integration-tests/testapp/build.gradle
index 8ea67e8..002e7c0 100644
--- a/privacysandbox/ui/integration-tests/testapp/build.gradle
+++ b/privacysandbox/ui/integration-tests/testapp/build.gradle
@@ -26,7 +26,6 @@
 
     defaultConfig {
         applicationId "androidx.privacysandbox.ui.integration.testapp"
-        minSdk 33
     }
 
     buildTypes {
@@ -34,22 +33,28 @@
             minifyEnabled false
         }
     }
+
+    privacySandbox {
+        enable = true
+    }
 }
 
 dependencies {
     implementation(libs.kotlinStdlib)
     api("androidx.annotation:annotation:1.8.1")
-    implementation 'androidx.core:core-ktx:1.8.0'
-    implementation 'androidx.appcompat:appcompat:1.6.0'
-    implementation 'com.google.android.material:material:1.6.0'
-    implementation "androidx.activity:activity-ktx:1.7.2"
-    implementation "androidx.drawerlayout:drawerlayout:1.2.0"
-    implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
-    implementation 'androidx.recyclerview:recyclerview:1.3.2'
-    implementation project(':privacysandbox:sdkruntime:sdkruntime-client')
-    implementation project(':privacysandbox:ui:integration-tests:testaidl')
-    implementation project(':privacysandbox:ui:integration-tests:sdkproviderutils')
-    implementation project(':privacysandbox:ui:ui-core')
-    implementation project(':privacysandbox:ui:ui-client')
-    implementation project(':privacysandbox:ui:ui-provider')
+    implementation("androidx.core:core-ktx:1.8.0")
+    implementation("androidx.appcompat:appcompat:1.6.0")
+    implementation("com.google.android.material:material:1.6.0")
+    implementation("androidx.activity:activity-ktx:1.7.2")
+    implementation("androidx.drawerlayout:drawerlayout:1.2.0")
+    implementation("androidx.constraintlayout:constraintlayout:2.0.1")
+    implementation("androidx.recyclerview:recyclerview:1.3.2")
+    implementation(project(":privacysandbox:sdkruntime:sdkruntime-client"))
+    implementation(project(":privacysandbox:ui:integration-tests:testaidl"))
+    implementation(project(":privacysandbox:ui:integration-tests:sdkproviderutils"))
+    implementation(project(":privacysandbox:ui:integration-tests:testsdkproviderwrapper"))
+    implementation(project(":privacysandbox:ui:integration-tests:mediateesdkproviderwrapper"))
+    implementation(project(":privacysandbox:ui:ui-core"))
+    implementation(project(":privacysandbox:ui:ui-client"))
+    implementation(project(":privacysandbox:ui:ui-provider"))
 }
diff --git a/privacysandbox/ui/integration-tests/testapp/src/main/AndroidManifest.xml b/privacysandbox/ui/integration-tests/testapp/src/main/AndroidManifest.xml
index 77e1152..3f10b0c 100644
--- a/privacysandbox/ui/integration-tests/testapp/src/main/AndroidManifest.xml
+++ b/privacysandbox/ui/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -35,12 +35,6 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-        <uses-sdk-library android:name="androidx.privacysandbox.ui.integration.testsdkprovider"
-            android:versionMajor="1"
-            android:certDigest="EE:B9:3D:E4:98:2F:A1:2E:AD:5B:C1:16:7A:6E:10:BD:23:49:B4:04:65:C4:3A:01:CC:54:06:4D:E5:2A:38:04" />
-        <uses-sdk-library android:name="androidx.privacysandbox.ui.integration.mediateesdkprovider"
-            android:versionMajor="1"
-            android:certDigest="EE:B9:3D:E4:98:2F:A1:2E:AD:5B:C1:16:7A:6E:10:BD:23:49:B4:04:65:C4:3A:01:CC:54:06:4D:E5:2A:38:04" />
     </application>
 
 </manifest>
diff --git a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/BaseFragment.kt b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/BaseFragment.kt
index 79fdec1..bd41656 100644
--- a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/BaseFragment.kt
+++ b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/BaseFragment.kt
@@ -44,6 +44,7 @@
  */
 abstract class BaseFragment : Fragment() {
     private lateinit var sdkApi: ISdkApi
+
     private lateinit var sdkSandboxManager: SdkSandboxManagerCompat
     private lateinit var activity: Activity
 
@@ -139,9 +140,9 @@
     }
 
     companion object {
-        private const val SDK_NAME = "androidx.privacysandbox.ui.integration.testsdkprovider"
+        private const val SDK_NAME = "androidx.privacysandbox.ui.integration.testsdkproviderwrapper"
         private const val MEDIATEE_SDK_NAME =
-            "androidx.privacysandbox.ui.integration.mediateesdkprovider"
+            "androidx.privacysandbox.ui.integration.mediateesdkproviderwrapper"
         const val TAG = "TestSandboxClient"
         var isZOrderOnTop = true
         @AdType var currentAdType = AdType.BASIC_NON_WEBVIEW
diff --git a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/MainActivity.kt b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/MainActivity.kt
index 5812058..080650a 100644
--- a/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/MainActivity.kt
+++ b/privacysandbox/ui/integration-tests/testapp/src/main/java/androidx/privacysandbox/ui/integration/testapp/MainActivity.kt
@@ -296,8 +296,8 @@
         private const val TAG = "TestSandboxClient"
 
         /** Name of the SDK to be loaded. */
-        private const val SDK_NAME = "androidx.privacysandbox.ui.integration.testsdkprovider"
+        private const val SDK_NAME = "androidx.privacysandbox.ui.integration.testsdkproviderwrapper"
         private const val MEDIATEE_SDK_NAME =
-            "androidx.privacysandbox.ui.integration.mediateesdkprovider"
+            "androidx.privacysandbox.ui.integration.mediateesdkproviderwrapper"
     }
 }
diff --git a/privacysandbox/ui/integration-tests/testsdkprovider/build.gradle b/privacysandbox/ui/integration-tests/testsdkprovider/build.gradle
index 441c562..7a9161f 100644
--- a/privacysandbox/ui/integration-tests/testsdkprovider/build.gradle
+++ b/privacysandbox/ui/integration-tests/testsdkprovider/build.gradle
@@ -16,19 +16,14 @@
 
 plugins {
     id("AndroidXPlugin")
-    id("com.android.application")
+    id("com.android.library")
     id("org.jetbrains.kotlin.android")
 }
 
 android {
+    compileSdk 35
     namespace 'androidx.privacysandbox.ui.integration.testsdkprovider'
 
-    defaultConfig {
-        applicationId "androidx.privacysandbox.ui.integration.testsdkprovider"
-        minSdk 33
-        compileSdk 35
-    }
-
     buildTypes {
         release {
             minifyEnabled false
@@ -39,10 +34,10 @@
 dependencies {
     api(libs.kotlinStdlib)
     api("androidx.annotation:annotation:1.8.1")
+    implementation project(':privacysandbox:sdkruntime:sdkruntime-provider')
     implementation project(':privacysandbox:ui:integration-tests:testaidl')
     implementation project(':privacysandbox:ui:integration-tests:sdkproviderutils')
     implementation project(':privacysandbox:ui:ui-core')
     implementation project(':privacysandbox:ui:ui-provider')
-    implementation project(':privacysandbox:sdkruntime:sdkruntime-client')
     implementation project(':webkit:webkit')
 }
diff --git a/privacysandbox/ui/integration-tests/testsdkprovider/src/main/AndroidManifest.xml b/privacysandbox/ui/integration-tests/testsdkprovider/src/main/AndroidManifest.xml
deleted file mode 100644
index 9156289..0000000
--- a/privacysandbox/ui/integration-tests/testsdkprovider/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright 2023 The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-  -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <application
-        android:allowBackup="true">
-        <sdk-library android:name="androidx.privacysandbox.ui.integration.testsdkprovider"
-            android:versionMajor="1" />
-        <property android:name="android.sdksandbox.PROPERTY_SDK_PROVIDER_CLASS_NAME"
-            android:value="androidx.privacysandbox.ui.integration.testsdkprovider.SdkProviderImpl" />
-    </application>
-
-</manifest>
diff --git a/privacysandbox/ui/integration-tests/testsdkprovider/src/main/java/androidx/privacysandbox/ui/integration/testsdkprovider/SdkApi.kt b/privacysandbox/ui/integration-tests/testsdkprovider/src/main/java/androidx/privacysandbox/ui/integration/testsdkprovider/SdkApi.kt
index 5ae1688..5f149dd 100644
--- a/privacysandbox/ui/integration-tests/testsdkprovider/src/main/java/androidx/privacysandbox/ui/integration/testsdkprovider/SdkApi.kt
+++ b/privacysandbox/ui/integration-tests/testsdkprovider/src/main/java/androidx/privacysandbox/ui/integration/testsdkprovider/SdkApi.kt
@@ -234,7 +234,7 @@
 
     companion object {
         private const val MEDIATEE_SDK =
-            "androidx.privacysandbox.ui.integration.mediateesdkprovider"
+            "androidx.privacysandbox.ui.integration.mediateesdkproviderwrapper"
         private const val UPDATE_DELEGATE_INTERVAL: Long = 5000L
     }
 }
diff --git a/privacysandbox/ui/integration-tests/testsdkprovider/src/main/java/androidx/privacysandbox/ui/integration/testsdkprovider/SdkProviderImpl.kt b/privacysandbox/ui/integration-tests/testsdkprovider/src/main/java/androidx/privacysandbox/ui/integration/testsdkprovider/SdkProviderImpl.kt
index 2b1d2a1..62b9086 100644
--- a/privacysandbox/ui/integration-tests/testsdkprovider/src/main/java/androidx/privacysandbox/ui/integration/testsdkprovider/SdkProviderImpl.kt
+++ b/privacysandbox/ui/integration-tests/testsdkprovider/src/main/java/androidx/privacysandbox/ui/integration/testsdkprovider/SdkProviderImpl.kt
@@ -16,22 +16,18 @@
 
 package androidx.privacysandbox.ui.integration.testsdkprovider
 
-import android.app.sdksandbox.SandboxedSdk
-import android.app.sdksandbox.SandboxedSdkProvider
 import android.content.Context
 import android.os.Bundle
-import android.os.ext.SdkExtensions
 import android.view.View
-import androidx.annotation.RequiresExtension
+import androidx.privacysandbox.sdkruntime.core.SandboxedSdkCompat
+import androidx.privacysandbox.sdkruntime.core.SandboxedSdkProviderCompat
 
-// TODO(b/257429573): Remove this line once fixed.
-@RequiresExtension(extension = SdkExtensions.AD_SERVICES, version = 5)
-class SdkProviderImpl : SandboxedSdkProvider() {
-    override fun onLoadSdk(p0: Bundle): SandboxedSdk {
-        return SandboxedSdk(SdkApi(context!!))
+class SdkProviderImpl : SandboxedSdkProviderCompat() {
+    override fun onLoadSdk(params: Bundle): SandboxedSdkCompat {
+        return SandboxedSdkCompat(SdkApi(context!!))
     }
 
-    override fun getView(p0: Context, p1: Bundle, p2: Int, p3: Int): View {
+    override fun getView(windowContext: Context, params: Bundle, width: Int, height: Int): View {
         TODO("Not yet implemented")
     }
 }
diff --git a/privacysandbox/ui/integration-tests/testsdkproviderwrapper/build.gradle b/privacysandbox/ui/integration-tests/testsdkproviderwrapper/build.gradle
new file mode 100644
index 0000000..b2da013
--- /dev/null
+++ b/privacysandbox/ui/integration-tests/testsdkproviderwrapper/build.gradle
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import androidx.build.AndroidXConfig
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.privacy-sandbox-sdk")
+}
+
+android {
+    namespace "androidx.privacysandbox.ui.integration.testsdkproviderwrapper"
+    compileSdk 35
+    minSdk 21
+    buildToolsVersion AndroidXConfig.getDefaultAndroidConfig(project).buildToolsVersion
+
+    bundle {
+        packageName = "androidx.privacysandbox.ui.integration.testsdkproviderwrapper"
+
+        // This is the entry point class to our SDK in the SDK Runtime. It enables backward
+        // compatibility support.
+        sdkProviderClassName = "androidx.privacysandbox.sdkruntime.provider.SandboxedSdkProviderAdapter"
+
+        // This is the class path of our implementation of the SandboxedSdkProviderCompat class.
+        compatSdkProviderClassName = "androidx.privacysandbox.ui.integration.testsdkprovider.SdkProviderImpl"
+
+        setVersion(1, 0, 0)
+    }
+}
+
+dependencies {
+    include(project(":privacysandbox:ui:integration-tests:testsdkprovider"))
+}
diff --git a/settings.gradle b/settings.gradle
index 454fc7e..ec91b3e 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -896,10 +896,12 @@
 includeProject(":privacysandbox:tools:tools-core", [BuildType.MAIN])
 includeProject(":privacysandbox:tools:tools-testing", [BuildType.MAIN])
 includeProject(":privacysandbox:ui:integration-tests:mediateesdkprovider", [BuildType.MAIN])
+includeProject(":privacysandbox:ui:integration-tests:mediateesdkproviderwrapper", [BuildType.MAIN])
 includeProject(":privacysandbox:ui:integration-tests:sdkproviderutils", [BuildType.MAIN])
 includeProject(":privacysandbox:ui:integration-tests:testaidl", [BuildType.MAIN])
 includeProject(":privacysandbox:ui:integration-tests:testapp", [BuildType.MAIN])
 includeProject(":privacysandbox:ui:integration-tests:testsdkprovider", [BuildType.MAIN])
+includeProject(":privacysandbox:ui:integration-tests:testsdkproviderwrapper", [BuildType.MAIN])
 includeProject(":privacysandbox:ui:ui-client", [BuildType.MAIN])
 includeProject(":privacysandbox:ui:ui-core", [BuildType.MAIN])
 includeProject(":privacysandbox:ui:ui-provider", [BuildType.MAIN])