Add @NullMarked to //components/payments

Patch 1 contains the automated changes made by the annotator.
Patch 2 and 4 and 5 contains the manual changes made by me.

Bug: 389129271
Change-Id: I172b42479e35ae6ee4c38a80c6bf6243492fcc38
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6299969
Reviewed-by: Peter Wen <wnwen@chromium.org>
Reviewed-by: Andrew Grieve <agrieve@chromium.org>
Commit-Queue: Peter Wen <wnwen@chromium.org>
Commit-Queue: Martin Kong <martinkong@google.com>
Owners-Override: Andrew Grieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1424750}
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentApp.java b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentApp.java
index 380a59a..12c5756 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentApp.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentApp.java
@@ -9,13 +9,14 @@
 import android.os.Handler;
 import android.text.TextUtils;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.payments.intent.IsReadyToPayServiceHelper;
 import org.chromium.components.payments.intent.WebPaymentIntentHelper;
 import org.chromium.components.payments.intent.WebPaymentIntentHelperType;
@@ -40,31 +41,32 @@
  * The point of interaction with a locally installed 3rd party native Android payment app.
  * https://web.dev/articles/android-payment-apps-developers-guide
  */
+@NullMarked
 public class AndroidPaymentApp extends PaymentApp
         implements IsReadyToPayServiceHelper.ResultHandler, WindowAndroid.IntentCallback {
     private final Handler mHandler;
     private final AndroidIntentLauncher mLauncher;
-    @Nullable private final DialogController mDialogController;
+    private final @Nullable DialogController mDialogController;
     private final Set<String> mMethodNames;
     private final boolean mIsIncognito;
     private final String mPackageName;
     private final String mPayActivityName;
-    @Nullable private final String mIsReadyToPayServiceName;
-    @Nullable private final String mPaymentDetailsUpdateServiceName;
+    private final @Nullable String mIsReadyToPayServiceName;
+    private final @Nullable String mPaymentDetailsUpdateServiceName;
     private final SupportedDelegations mSupportedDelegations;
     private final boolean mShowReadyToPayDebugInfo;
     private final boolean mRemoveDeprecatedFields;
 
-    private IsReadyToPayCallback mIsReadyToPayCallback;
-    private InstrumentDetailsCallback mInstrumentDetailsCallback;
-    private IsReadyToPayServiceHelper mIsReadyToPayServiceHelper;
-    private PaymentDetailsUpdateConnection mPaymentDetailsUpdateConnection;
-    @Nullable private String mApplicationIdentifierToHide;
+    private @Nullable IsReadyToPayCallback mIsReadyToPayCallback;
+    private @Nullable InstrumentDetailsCallback mInstrumentDetailsCallback;
+    private @Nullable IsReadyToPayServiceHelper mIsReadyToPayServiceHelper;
+    private @Nullable PaymentDetailsUpdateConnection mPaymentDetailsUpdateConnection;
+    private @Nullable String mApplicationIdentifierToHide;
     private boolean mBypassIsReadyToPayServiceInTest;
     private boolean mIsPreferred;
 
     // Set inside launchPaymentApp and used to validate the received response.
-    @Nullable private WebPaymentIntentHelperType.PaymentOptions mPaymentOptions;
+    private WebPaymentIntentHelperType.@Nullable PaymentOptions mPaymentOptions;
 
     /**
      * Builds the point of interaction with a locally installed 3rd party native Android payment
@@ -179,7 +181,7 @@
             Map<String, PaymentMethodData> methodDataMap,
             String origin,
             String iframeOrigin,
-            @Nullable byte[][] certificateChain,
+            byte @Nullable [][] certificateChain,
             Map<String, PaymentDetailsModifier> modifiers,
             IsReadyToPayCallback callback) {
         ThreadUtils.assertOnUiThread();
@@ -243,8 +245,7 @@
     }
 
     @Override
-    @Nullable
-    public String getApplicationIdentifierToHide() {
+    public @Nullable String getApplicationIdentifierToHide() {
         return mApplicationIdentifierToHide;
     }
 
@@ -259,7 +260,7 @@
             final String merchantName,
             String origin,
             String iframeOrigin,
-            final byte[][] certificateChain,
+            final byte @Nullable [][] certificateChain,
             final Map<String, PaymentMethodData> methodDataMap,
             final PaymentItem total,
             final List<PaymentItem> displayItems,
@@ -348,7 +349,7 @@
             String merchantName,
             String origin,
             String iframeOrigin,
-            byte[][] certificateChain,
+            byte @Nullable [][] certificateChain,
             Map<String, PaymentMethodData> methodDataMap,
             PaymentItem total,
             List<PaymentItem> displayItems,
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFactory.java b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFactory.java
index a50483c..8476e1c 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFactory.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFactory.java
@@ -10,6 +10,7 @@
 import android.text.TextUtils;
 import android.util.Pair;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.payments.intent.WebPaymentIntentHelper;
 
 import java.util.HashMap;
@@ -17,6 +18,7 @@
 import java.util.Map;
 
 /** Looks up installed third party Android payment apps. */
+@NullMarked
 public class AndroidPaymentAppFactory implements PaymentAppFactoryInterface {
     // PaymentAppFactoryInterface implementation.
     @Override
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFinder.java b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFinder.java
index 7be1534..47466e6 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFinder.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFinder.java
@@ -4,17 +4,21 @@
 
 package org.chromium.components.payments;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
 import android.text.TextUtils;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.Log;
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.Contract;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.payments.PaymentManifestVerifier.ManifestVerifyCallback;
 import org.chromium.components.payments.intent.WebPaymentIntentHelper;
 import org.chromium.payments.mojom.PaymentDetailsModifier;
@@ -35,6 +39,7 @@
  * payment method names are exceptions: these are common payment method names that do not have a
  * manifest and can be used by any payment app.
  */
+@NullMarked
 public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
     private static final String TAG = "PaymentAppFinder";
 
@@ -67,10 +72,10 @@
     public static final String META_DATA_NAME_OF_SUPPORTED_DELEGATIONS =
             "org.chromium.payment_supported_delegations";
 
-    private static PackageManagerDelegate sPackageManagerDelegateForTest;
-    private static PaymentManifestDownloader sDownloaderForTest;
+    private static @Nullable PackageManagerDelegate sPackageManagerDelegateForTest;
+    private static @Nullable PaymentManifestDownloader sDownloaderForTest;
     private static boolean sBypassIsReadyToPayServiceInTest;
-    private static AndroidIntentLauncher sAndroidIntentLauncherForTest;
+    private static @Nullable AndroidIntentLauncher sAndroidIntentLauncherForTest;
 
     private final Set<GURL> mUrlPaymentMethods = new HashSet<>();
     private final PaymentManifestDownloader mDownloader;
@@ -285,7 +290,8 @@
                 || urlMethod.equals(defaultUrlMethod);
     }
 
-    private ResolveInfo findAppWithPackageName(List<ResolveInfo> apps, String packageName) {
+    private @Nullable ResolveInfo findAppWithPackageName(
+            List<ResolveInfo> apps, String packageName) {
         assert packageName != null;
         for (int i = 0; i < apps.size(); i++) {
             ResolveInfo app = apps.get(i);
@@ -555,8 +561,8 @@
      * @param metaDataName The name of the string array meta data to be retrieved.
      * @return The string array.
      */
-    @Nullable
-    private String[] getStringArrayMetaData(ActivityInfo activityInfo, String metaDataName) {
+    private String @Nullable [] getStringArrayMetaData(
+            ActivityInfo activityInfo, String metaDataName) {
         if (activityInfo.metaData == null) return null;
 
         int resId = activityInfo.metaData.getInt(metaDataName);
@@ -694,7 +700,8 @@
      * @param resolveInfo The payment app that's allowed to use the method name.
      * @param methodName  The method name that can be used by the app.
      */
-    private void onValidPaymentAppForPaymentMethodName(ResolveInfo resolveInfo, String methodName) {
+    private void onValidPaymentAppForPaymentMethodName(
+            ResolveInfo resolveInfo, String methodName) {
         if (mFactoryDelegate.getParams().hasClosed()) return;
         String packageName = resolveInfo.activityInfo.packageName;
 
@@ -729,7 +736,7 @@
             app =
                     new AndroidPaymentApp(
                             sAndroidIntentLauncherForTest == null
-                                    ? mFactoryDelegate.getAndroidIntentLauncher()
+                                    ? assumeNonNull(mFactoryDelegate.getAndroidIntentLauncher())
                                     : sAndroidIntentLauncherForTest,
                             mFactoryDelegate.getDialogController(),
                             packageName,
@@ -779,14 +786,14 @@
      * @param url The URL to stringify.
      * @return The URL string without a trailing slash, or null if the input parameter is null.
      */
-    @Nullable
-    private static String urlToStringWithoutTrailingSlash(@Nullable GURL url) {
+    @Contract("!null -> !null")
+    private static @Nullable String urlToStringWithoutTrailingSlash(@Nullable GURL url) {
         if (url == null) return null;
         return removeTrailingSlash(url.getSpec());
     }
 
-    @Nullable
-    private static String removeTrailingSlash(@Nullable String string) {
+    @Contract("!null -> !null")
+    private static @Nullable String removeTrailingSlash(@Nullable String string) {
         if (string == null) return null;
         return string.endsWith("/") ? string.substring(0, string.length() - 1) : string;
     }
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/BrowserPaymentRequest.java b/components/payments/content/android/java/src/org/chromium/components/payments/BrowserPaymentRequest.java
index 2cb1cf6c..040aa8b 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/BrowserPaymentRequest.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/BrowserPaymentRequest.java
@@ -4,8 +4,8 @@
 
 package org.chromium.components.payments;
 
-import androidx.annotation.Nullable;
-
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.payments.mojom.PaymentComplete;
 import org.chromium.payments.mojom.PaymentDetails;
@@ -24,6 +24,7 @@
  * The browser part of the PaymentRequest implementation. The browser here can be either the
  * Android Chrome browser or the WebLayer "browser".
  */
+@NullMarked
 public interface BrowserPaymentRequest {
     /**
      * The client of the interface calls this when it has received the payment details update
@@ -98,10 +99,9 @@
      *        implementer may consider other factors before deciding whether to show or skip.
      * @return The error of the showing if any; null if success.
      */
-    @Nullable
-    String showOrSkipAppSelector(
+    @Nullable String showOrSkipAppSelector(
             boolean isShowWaitingForUpdatedDetails,
-            PaymentItem total,
+            @Nullable PaymentItem total,
             boolean shouldSkipAppSelector);
 
     /**
@@ -128,8 +128,7 @@
      *
      * @return The error if it fails; null otherwise.
      */
-    @Nullable
-    default String onShowCalledAndAppsQueriedAndDetailsFinalized() {
+    default @Nullable String onShowCalledAndAppsQueriedAndDetailsFinalized() {
         return null;
     }
 
@@ -166,7 +165,7 @@
      * @param ukmSourceId The ukm source id assigned to the payment app.
      * @return The created WebContents.
      */
-    default WebContents openPaymentHandlerWindow(GURL url, long ukmSourceId) {
+    default @Nullable WebContents openPaymentHandlerWindow(GURL url, long ukmSourceId) {
         return null;
     }
 
@@ -178,8 +177,7 @@
      *         their payment apps.
      * @return The error if it fails; null otherwise.
      */
-    @Nullable
-    default String continueShowWithUpdatedDetails(
+    default @Nullable String continueShowWithUpdatedDetails(
             PaymentDetails details, boolean isFinishedQueryingPaymentApps) {
         return null;
     }
@@ -225,8 +223,7 @@
      *     Can return null when ANDROID_PAYMENT_INTENTS_OMIT_DEPRECATED_PARAMETERS is enabled or
      *     when the page is localhost or is a file.
      */
-    @Nullable
-    byte[][] getCertificateChain();
+    byte @Nullable [][] getCertificateChain();
 
     /**
      * @return The launcher for Android intent-based payment app.
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/CSPCheckerBridge.java b/components/payments/content/android/java/src/org/chromium/components/payments/CSPCheckerBridge.java
index 02e5a7d..8e27fc3 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/CSPCheckerBridge.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/CSPCheckerBridge.java
@@ -4,12 +4,11 @@
 
 package org.chromium.components.payments;
 
-import androidx.annotation.NonNull;
-
 import org.jni_zero.CalledByNative;
 import org.jni_zero.JNINamespace;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.url.GURL;
 
 /**
@@ -24,6 +23,7 @@
  *   bridge.destroy();
  */
 @JNINamespace("payments")
+@NullMarked
 public class CSPCheckerBridge {
     // Performs the CSP checks.
     private final CSPChecker mImpl;
@@ -35,7 +35,7 @@
      * Initializes the CSP checker bridge.
      * @param cspChecker The object that will perform the CSP checks.
      */
-    public CSPCheckerBridge(@NonNull CSPChecker cspChecker) {
+    public CSPCheckerBridge(CSPChecker cspChecker) {
         mImpl = cspChecker;
         mNativeBridge = CSPCheckerBridgeJni.get().createNativeCSPChecker(this);
     }
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/ErrorMessageUtil.java b/components/payments/content/android/java/src/org/chromium/components/payments/ErrorMessageUtil.java
index 96a0fb9..f9ac553 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/ErrorMessageUtil.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/ErrorMessageUtil.java
@@ -9,10 +9,13 @@
 import org.jni_zero.JNINamespace;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
+
 import java.util.Set;
 
 /** Error messages for web payment.  */
 @JNINamespace("payments::android")
+@NullMarked
 public class ErrorMessageUtil {
     /**
      * Returns the "payment method not supported" message.
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/HasEnrolledInstrumentQuery.java b/components/payments/content/android/java/src/org/chromium/components/payments/HasEnrolledInstrumentQuery.java
index 219966c..11fc002 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/HasEnrolledInstrumentQuery.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/HasEnrolledInstrumentQuery.java
@@ -9,6 +9,7 @@
 import org.jni_zero.JniType;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.payments.mojom.PaymentMethodData;
 
@@ -17,6 +18,7 @@
 
 /** Checks whether hasEnrolledInstrument() can be queried. */
 @JNINamespace("payments")
+@NullMarked
 public class HasEnrolledInstrumentQuery {
     /**
      * Checks whether the given hasEnrolledInstrument() query is allowed.
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/InvalidPaymentRequest.java b/components/payments/content/android/java/src/org/chromium/components/payments/InvalidPaymentRequest.java
index b13c456f..39f01ef3 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/InvalidPaymentRequest.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/InvalidPaymentRequest.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.payments;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.mojo.system.MojoException;
 import org.chromium.payments.mojom.CanMakePaymentQueryResult;
 import org.chromium.payments.mojom.HasEnrolledInstrumentQueryResult;
@@ -19,8 +21,9 @@
  * An implementation of PaymentRequest that immediately rejects all connections.
  * Necessary because Mojo does not handle null returned from createImpl().
  */
+@NullMarked
 public final class InvalidPaymentRequest implements PaymentRequest {
-    private PaymentRequestClient mClient;
+    private @Nullable PaymentRequestClient mClient;
 
     @Override
     public void init(
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/JniPaymentApp.java b/components/payments/content/android/java/src/org/chromium/components/payments/JniPaymentApp.java
index 176e0bd5..1c30452 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/JniPaymentApp.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/JniPaymentApp.java
@@ -8,12 +8,12 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.os.Handler;
 
-import androidx.annotation.Nullable;
-
 import org.jni_zero.CalledByNative;
 import org.jni_zero.JNINamespace;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.payments.mojom.PaymentDetailsModifier;
 import org.chromium.payments.mojom.PaymentItem;
 import org.chromium.payments.mojom.PaymentMethodData;
@@ -31,6 +31,7 @@
 
 /** Wrapper around a C++ payment app. */
 @JNINamespace("payments")
+@NullMarked
 public class JniPaymentApp extends PaymentApp {
     private final Handler mHandler = new Handler();
     private final @PaymentAppType int mPaymentAppType;
@@ -38,8 +39,8 @@
     // The Java object owns the C++ payment app and frees it in dismissInstrument().
     private long mNativeObject;
 
-    private AbortCallback mAbortCallback;
-    private InstrumentDetailsCallback mInvokeCallback;
+    private @Nullable AbortCallback mAbortCallback;
+    private @Nullable InstrumentDetailsCallback mInvokeCallback;
 
     @CalledByNative
     private JniPaymentApp(
@@ -170,7 +171,7 @@
             String merchantName,
             String origin,
             String iframeOrigin,
-            @Nullable byte[][] certificateChain,
+            byte @Nullable [][] certificateChain,
             Map<String, PaymentMethodData> methodDataMap,
             PaymentItem total,
             List<PaymentItem> displayItems,
@@ -204,14 +205,12 @@
     }
 
     @Override
-    @Nullable
-    public String getApplicationIdentifierToHide() {
+    public @Nullable String getApplicationIdentifierToHide() {
         return JniPaymentAppJni.get().getApplicationIdentifierToHide(mNativeObject);
     }
 
     @Override
-    @Nullable
-    public Set<String> getApplicationIdentifiersThatHideThisApp() {
+    public @Nullable Set<String> getApplicationIdentifiersThatHideThisApp() {
         return new HashSet<>(
                 Arrays.asList(
                         JniPaymentAppJni.get()
@@ -261,7 +260,7 @@
         String[] getInstrumentMethodNames(long nativeJniPaymentApp);
 
         boolean isValidForPaymentMethodData(
-                long nativeJniPaymentApp, String method, ByteBuffer dataByteBuffer);
+                long nativeJniPaymentApp, String method, @Nullable ByteBuffer dataByteBuffer);
 
         boolean handlesShippingAddress(long nativeJniPaymentApp);
 
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/JourneyLogger.java b/components/payments/content/android/java/src/org/chromium/components/payments/JourneyLogger.java
index 71e38f4..438ed3b 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/JourneyLogger.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/JourneyLogger.java
@@ -7,12 +7,14 @@
 import org.jni_zero.JNINamespace;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.content_public.browser.WebContents;
 
 import java.util.List;
 
 /** A class used to record journey metrics for the Payment Request feature. */
 @JNINamespace("payments")
+@NullMarked
 public class JourneyLogger {
     /** Pointer to the native implementation. */
     private long mJourneyLoggerAndroid;
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/MojoPaymentRequestGateKeeper.java b/components/payments/content/android/java/src/org/chromium/components/payments/MojoPaymentRequestGateKeeper.java
index 23a0fc5f..13ff9f8b 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/MojoPaymentRequestGateKeeper.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/MojoPaymentRequestGateKeeper.java
@@ -4,6 +4,8 @@
 
 package org.chromium.components.payments;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.mojo.system.MojoException;
 import org.chromium.payments.mojom.PaymentDetails;
 import org.chromium.payments.mojom.PaymentMethodData;
@@ -16,9 +18,10 @@
  * Guards against invalid mojo parameters and enforces correct call sequence from mojo IPC in the
  * untrusted renderer, so PaymentRequestService does not have to.
  */
+@NullMarked
 public class MojoPaymentRequestGateKeeper implements PaymentRequest {
     private final Delegate mDelegate;
-    private PaymentRequestService mPaymentRequestService;
+    private @Nullable PaymentRequestService mPaymentRequestService;
 
     /** The delegate of the class. */
     public interface Delegate {
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/OriginSecurityChecker.java b/components/payments/content/android/java/src/org/chromium/components/payments/OriginSecurityChecker.java
index 3c53083..e68aadc 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/OriginSecurityChecker.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/OriginSecurityChecker.java
@@ -7,10 +7,12 @@
 import org.jni_zero.JNINamespace;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.url.GURL;
 
 /** Helper for origin security. */
 @JNINamespace("payments")
+@NullMarked
 public class OriginSecurityChecker {
     /**
      * Returns true for a valid URL from a secure origin, e.g., http://localhost,
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAddressTypeConverter.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAddressTypeConverter.java
index dee642b..bcfdc59 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAddressTypeConverter.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAddressTypeConverter.java
@@ -21,7 +21,9 @@
      * @param address The org.chromium.payments.mojom.PaymentAddress to be converted.
      * @return The converted address with type org.chromium.components.payments.Address.
      */
-    public static @Nullable Address convertPaymentAddressFromMojo(PaymentAddress address) {
+    @Contract("!null -> !null")
+    public static @Nullable Address convertPaymentAddressFromMojo(
+            @Nullable PaymentAddress address) {
         if (address == null) return null;
         return new Address(
                 address.country,
@@ -41,7 +43,8 @@
      * @return The converted address with type org.chromium.payments.mojom.PaymentAddress.
      */
     @Contract("!null -> !null")
-    public static @Nullable PaymentAddress convertAddressToMojoPaymentAddress(Address address) {
+    public static @Nullable PaymentAddress convertAddressToMojoPaymentAddress(
+            @Nullable Address address) {
         if (address == null) return null;
         PaymentAddress result = new PaymentAddress();
         result.country = address.country;
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentApp.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentApp.java
index 2eb44239..93b7da8e 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentApp.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentApp.java
@@ -59,7 +59,7 @@
         void onInstrumentAbortResult(boolean abortSucceeded);
     }
 
-    protected PaymentApp(String id, String label, String sublabel, Drawable icon) {
+    protected PaymentApp(String id, String label, @Nullable String sublabel, Drawable icon) {
         super(id, maybeElide(removeLineTerminators(label)), sublabel, icon);
     }
 
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAppFactoryParams.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAppFactoryParams.java
index 3bfa9757d..7ee76c82 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAppFactoryParams.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAppFactoryParams.java
@@ -28,16 +28,16 @@
      * @return The scheme, host, and port of the last committed URL of the top-level context as
      * formatted by UrlFormatter.formatUrlForSecurityDisplay().
      */
-    default @Nullable String getTopLevelOrigin() {
-        return null;
+    default String getTopLevelOrigin() {
+        throw new UnsupportedOperationException();
     }
 
     /**
      * @return The scheme, host, and port of the last committed URL of the iframe that invoked the
      * PaymentRequest API as formatted by UrlFormatter.formatUrlForSecurityDisplay().
      */
-    default @Nullable String getPaymentRequestOrigin() {
-        return null;
+    default String getPaymentRequestOrigin() {
+        throw new UnsupportedOperationException();
     }
 
     /**
@@ -45,8 +45,8 @@
      * security features like 'Sec-Fetch-Site' and 'Cross-Origin-Resource-Policy'. Should not be
      * null.
      */
-    default @Nullable Origin getPaymentRequestSecurityOrigin() {
-        return null;
+    default Origin getPaymentRequestSecurityOrigin() {
+        throw new UnsupportedOperationException();
     }
 
     /**
@@ -64,14 +64,18 @@
         return false;
     }
 
-    /** @return The listener for payment method, shipping address, and shipping option change events. */
+    /**
+     * @return The listener for payment method, shipping address, and shipping option change events.
+     */
     default @Nullable PaymentRequestUpdateEventListener getPaymentRequestUpdateEventListener() {
         return null;
     }
 
-    /** @return The Payment Request information received from the merchant. */
-    default @Nullable PaymentRequestSpec getSpec() {
-        return null;
+    /**
+     * @return The Payment Request information received from the merchant.
+     */
+    default PaymentRequestSpec getSpec() {
+        throw new UnsupportedOperationException();
     }
 
     /**
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAppServiceBridge.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAppServiceBridge.java
index 3ac45a38..cbaac43 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAppServiceBridge.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAppServiceBridge.java
@@ -9,11 +9,14 @@
 
 import org.chromium.base.ResettersForTesting;
 import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.url_formatter.SchemeDisplay;
 import org.chromium.components.url_formatter.UrlFormatter;
 import org.chromium.content_public.browser.RenderFrameHost;
 
 /** Native bridge for finding payment apps. */
+@NullMarked
 public class PaymentAppServiceBridge implements PaymentAppFactoryInterface {
     private static boolean sCanMakePaymentForTesting;
 
@@ -152,7 +155,7 @@
                 RenderFrameHost initiatorRenderFrameHost,
                 String topOrigin,
                 PaymentRequestSpec spec,
-                String twaPackageName,
+                @Nullable String twaPackageName,
                 boolean mayCrawlForInstallablePaymentApps,
                 boolean isOffTheRecord,
                 long nativeCSPCheckerAndroid,
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentDetailsConverter.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentDetailsConverter.java
index 83284c4..102ce77 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentDetailsConverter.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentDetailsConverter.java
@@ -4,6 +4,7 @@
 
 package org.chromium.components.payments;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.payments.mojom.PaymentDetails;
 import org.chromium.payments.mojom.PaymentHandlerMethodData;
 import org.chromium.payments.mojom.PaymentHandlerModifier;
@@ -16,6 +17,7 @@
  * Redacts and converts the payment details update from the merchant into a data structure to be
  * sent to the invoked payment handler.
  */
+@NullMarked
 public class PaymentDetailsConverter {
     /**
      * To be implemented by the object that can check whether the invoked payment instrument is
@@ -47,7 +49,9 @@
      * @return The data structure that can be sent to the invoked payment handler.
      */
     public static PaymentRequestDetailsUpdate convertToPaymentRequestDetailsUpdate(
-            PaymentDetails details, MethodChecker methodChecker, PaymentApp invokedPaymentApp) {
+            PaymentDetails details,
+            MethodChecker methodChecker,
+            PaymentApp invokedPaymentApp) {
         // Keep in sync with components/payments/content/payment_details_converter.cc.
         assert details != null;
         assert methodChecker != null;
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentHandlerNavigationThrottle.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentHandlerNavigationThrottle.java
index f747bcfc..6745229 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentHandlerNavigationThrottle.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentHandlerNavigationThrottle.java
@@ -7,10 +7,12 @@
 import org.jni_zero.JNINamespace;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.content_public.browser.WebContents;
 
 /** The navigation throttle of the payment handler pages. */
 @JNINamespace("payments::android")
+@NullMarked
 public class PaymentHandlerNavigationThrottle {
     /**
      * Marks the given WebContents as a payment handler WebContents. This will allow the callers of
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestDownloader.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestDownloader.java
index 565ca70e..9786134 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestDownloader.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestDownloader.java
@@ -9,6 +9,8 @@
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.url.GURL;
 import org.chromium.url.Origin;
@@ -18,6 +20,7 @@
  * components/payments/core/payment_manifest_downloader.h
  */
 @JNINamespace("payments")
+@NullMarked
 public class PaymentManifestDownloader {
     /** Interface for the callback to invoke when finished downloading. */
     public interface ManifestDownloadCallback {
@@ -54,7 +57,7 @@
     }
 
     private long mNativeObject;
-    private CSPCheckerBridge mCSPCheckerBridge;
+    private @Nullable CSPCheckerBridge mCSPCheckerBridge;
 
     /**
      * Initializes the native downloader.
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestParser.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestParser.java
index 9d3a7bdd..25f665e 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestParser.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestParser.java
@@ -9,11 +9,13 @@
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.url.GURL;
 
 /** Parses payment manifests in a utility process. */
 @JNINamespace("payments")
+@NullMarked
 public class PaymentManifestParser {
     /** Interface for the callback to invoke when finished parsing. */
     public interface ManifestParseCallback {
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestVerifier.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestVerifier.java
index 7a338b8..5a46fd9 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestVerifier.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestVerifier.java
@@ -4,13 +4,15 @@
 
 package org.chromium.components.payments;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.pm.PackageInfo;
 import android.content.pm.ResolveInfo;
 import android.content.pm.Signature;
 
-import androidx.annotation.Nullable;
-
 import org.chromium.base.Log;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.payments.PaymentManifestDownloader.ManifestDownloadCallback;
 import org.chromium.components.payments.PaymentManifestParser.ManifestParseCallback;
 import org.chromium.url.GURL;
@@ -35,6 +37,7 @@
  * Spec:
  * https://docs.google.com/document/d/1izV4uC-tiRJG3JLooqY3YRLU22tYOsLTNq0P_InPJeE/edit#heading=h.cjp3jlnl47h5
  */
+@NullMarked
 public class PaymentManifestVerifier
         implements ManifestDownloadCallback,
                 ManifestParseCallback,
@@ -84,6 +87,7 @@
     /** Identifying information about an installed native Android payment app. */
     private static class AppInfo {
         /** Identifies a native Android payment app. */
+        @SuppressWarnings("NullAway.Init") // This is set to a non-null value immediately after init
         public ResolveInfo resolveInfo;
 
         /** The version code for the native Android payment app, e.g., 123. */
@@ -93,7 +97,7 @@
          * The SHA256 certificate fingerprints for the native Android payment app, .e.g,
          * ["308201dd30820146020101300d06092a864886f70d010105050030"].
          */
-        public Set<String> sha256CertFingerprints;
+        public @Nullable Set<String> sha256CertFingerprints;
     }
 
     private static final String TAG = "PaymentManifest";
@@ -130,10 +134,10 @@
     private final PaymentManifestParser mParser;
     private final PackageManagerDelegate mPackageManagerDelegate;
     private final ManifestVerifyCallback mCallback;
-    private final MessageDigest mMessageDigest;
+    private final @Nullable MessageDigest mMessageDigest;
 
     /** The origin of the payment method manifest after all redirects have been followed. */
-    private Origin mPaymentMethodManifestOrigin;
+    private @Nullable Origin mPaymentMethodManifestOrigin;
 
     /**
      * The number of web app manifests that have not yet been retrieved from cache or downloaded
@@ -237,6 +241,8 @@
             appInfo.version = packageInfo.versionCode;
             appInfo.sha256CertFingerprints = new HashSet<>();
             Signature[] signatures = packageInfo.signatures;
+            assumeNonNull(signatures);
+            assumeNonNull(mMessageDigest);
             for (int i = 0; i < signatures.length; i++) {
                 mMessageDigest.update(signatures[i].toByteArray());
 
@@ -263,8 +269,6 @@
      * @return A string representation of the input bytes, e.g., "0123456789abcdef".
      */
     private static String byteArrayToString(byte[] input) {
-        if (input == null) return null;
-
         StringBuilder builder = new StringBuilder(input.length * 2);
         Formatter formatter = new Formatter(builder);
         for (byte b : input) {
@@ -344,7 +348,8 @@
         Set<String> validAppPackageNames = verifyAppWithWebAppManifest(manifest);
         for (String validAppPackageName : validAppPackageNames) {
             mCallback.onValidDefaultPaymentApp(
-                    mMethodName, mDefaultApplications.get(validAppPackageName).resolveInfo);
+                    mMethodName,
+                    assumeNonNull(mDefaultApplications.get(validAppPackageName)).resolveInfo);
         }
 
         mPendingWebAppManifestsCount--;
@@ -400,6 +405,7 @@
         for (int i = 0; i < webAppManifestUris.length; i++) {
             if (mAtLeastOneManifestFailedToDownloadOrParse) return;
             assert webAppManifestUris[i] != null;
+            assumeNonNull(mPaymentMethodManifestOrigin);
             mDownloader.downloadWebAppManifest(
                     mPaymentMethodManifestOrigin, webAppManifestUris[i], this);
         }
@@ -428,7 +434,8 @@
             Set<String> validAppPackageNames = verifyAppWithWebAppManifest(manifest);
             for (String validAppPackageName : validAppPackageNames) {
                 mCallback.onValidDefaultPaymentApp(
-                        mMethodName, mDefaultApplications.get(validAppPackageName).resolveInfo);
+                        mMethodName,
+                        assumeNonNull(mDefaultApplications.get(validAppPackageName)).resolveInfo);
             }
         }
 
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestWebDataService.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestWebDataService.java
index 05b06da..74d63940 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestWebDataService.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestWebDataService.java
@@ -8,10 +8,12 @@
 import org.jni_zero.JNINamespace;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.content_public.browser.WebContents;
 
 /** Java wrapper of the payment manifest web data service. */
 @JNINamespace("payments")
+@NullMarked
 public class PaymentManifestWebDataService {
     /** Interface for the callback to invoke when getting data from the web data service. */
     public interface PaymentManifestWebDataServiceCallback {
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentNotShownError.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentNotShownError.java
index 84970eeca..661b4ee19 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentNotShownError.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentNotShownError.java
@@ -4,9 +4,11 @@
 
 package org.chromium.components.payments;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.payments.mojom.PaymentErrorReason;
 
 /** The error of payment UIs not being shown. */
+@NullMarked
 public class PaymentNotShownError {
     private final String mErrorMessage;
     private final int mReason;
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentOptionsUtils.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentOptionsUtils.java
index 3510fdc..1f1181f 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentOptionsUtils.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentOptionsUtils.java
@@ -4,11 +4,12 @@
 
 package org.chromium.components.payments;
 
-import androidx.annotation.Nullable;
-
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.payments.mojom.PaymentOptions;
 
 /** A collection of utility methods for PaymentOptions. */
+@NullMarked
 public class PaymentOptionsUtils {
     /**
      * @param options Any PaymentOption, can be null.
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestParams.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestParams.java
index 8bd6c677..e35c0be 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestParams.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestParams.java
@@ -6,6 +6,7 @@
 
 import org.chromium.build.annotations.MockedInTests;
 import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.payments.mojom.PaymentDetailsModifier;
 import org.chromium.payments.mojom.PaymentItem;
 import org.chromium.payments.mojom.PaymentMethodData;
@@ -43,5 +44,5 @@
      * @return The raw total amount being charged - the total property of the PaymentDetails of
      * payment request.
      */
-    PaymentItem getRawTotal();
+    @Nullable PaymentItem getRawTotal();
 }
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java
index c29d54db..da89e4a9 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java
@@ -4,10 +4,11 @@
 
 package org.chromium.components.payments;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.Context;
 import android.text.TextUtils;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.collection.ArrayMap;
 
@@ -17,6 +18,8 @@
 import org.chromium.base.ResettersForTesting;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.supplier.Supplier;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.components.url_formatter.SchemeDisplay;
 import org.chromium.components.url_formatter.UrlFormatter;
@@ -65,6 +68,7 @@
  * class need to close them with {@link PaymentRequestService#close()}, after which no usage is
  * allowed.
  */
+@NullMarked
 public class PaymentRequestService
         implements PaymentAppFactoryDelegate,
                 PaymentAppFactoryParams,
@@ -80,29 +84,37 @@
      * Hold the currently showing PaymentRequest. Used to prevent showing more than one
      * PaymentRequest UI per browser process.
      */
-    private static PaymentRequestService sShowingPaymentRequest;
+    private static @Nullable PaymentRequestService sShowingPaymentRequest;
 
-    private static PaymentRequestServiceObserverForTest sObserverForTest;
-    private static NativeObserverForTest sNativeObserverForTest;
+    private static @Nullable PaymentRequestServiceObserverForTest sObserverForTest;
+    private static @Nullable NativeObserverForTest sNativeObserverForTest;
     private static boolean sIsLocalHasEnrolledInstrumentQueryQuotaEnforcedForTest;
     private final Runnable mOnClosedListener;
     private final RenderFrameHost mRenderFrameHost;
     private final Delegate mDelegate;
     private final List<PaymentApp> mPendingApps = new ArrayList<>();
-    @Nullable private final Supplier<PaymentAppServiceBridge> mPaymentAppServiceBridgeSupplier;
+    private final @Nullable Supplier<PaymentAppServiceBridge> mPaymentAppServiceBridgeSupplier;
+    @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
     private WebContents mWebContents;
+    @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
     private JourneyLogger mJourneyLogger;
+    @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
     private String mTopLevelOrigin;
+    @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
     private String mPaymentRequestOrigin;
+    @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
     private Origin mPaymentRequestSecurityOrigin;
+    @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
     private String mMerchantName;
     private boolean mIsOffTheRecord;
+    @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
     private PaymentOptions mPaymentOptions;
     private boolean mRequestShipping;
     private boolean mRequestPayerName;
     private boolean mRequestPayerPhone;
     private boolean mRequestPayerEmail;
     private int mShippingType;
+    @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
     private PaymentRequestSpec mSpec;
     private boolean mHasClosed;
     private boolean mIsFinishedQueryingPaymentApps;
@@ -110,21 +122,22 @@
     private boolean mIsShowWaitingForUpdatedDetails;
 
     /** If not empty, use this error message for rejecting PaymentRequest.show(). */
-    private String mRejectShowErrorMessage;
+    private @Nullable String mRejectShowErrorMessage;
 
     /** Internal reason for why PaymentRequest.show() should be rejected. */
     private @AppCreationFailureReason int mRejectShowErrorReason = AppCreationFailureReason.UNKNOWN;
 
     // mClient is null only when it has closed.
-    @Nullable private PaymentRequestClient mClient;
+    private @Nullable PaymentRequestClient mClient;
 
     // mBrowserPaymentRequest is null when it has closed or is uninitiated.
-    @Nullable private BrowserPaymentRequest mBrowserPaymentRequest;
+    private @Nullable BrowserPaymentRequest mBrowserPaymentRequest;
 
     /** The helper to create and fill the response to send to the merchant. */
-    @Nullable private PaymentResponseHelperInterface mPaymentResponseHelper;
+    private @Nullable PaymentResponseHelperInterface mPaymentResponseHelper;
 
     /** A mapping of the payment method names to the corresponding payment method specific data. */
+    @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
     private HashMap<String, PaymentMethodData> mQueryForQuota;
 
     /**
@@ -142,7 +155,7 @@
 
     private boolean mIsCanMakePaymentResponsePending;
     private boolean mIsHasEnrolledInstrumentResponsePending;
-    @Nullable private PaymentApp mInvokedPaymentApp;
+    private @Nullable PaymentApp mInvokedPaymentApp;
 
     /** True if a show() call is rejected for lack of a user activation. */
     private boolean mRejectShowForUserActivation;
@@ -162,7 +175,7 @@
 
         void onHasEnrolledInstrumentReturned();
 
-        void onAppListReady(@Nullable List<PaymentApp> paymentApps, PaymentItem total);
+        void onAppListReady(@Nullable List<PaymentApp> paymentApps, @Nullable PaymentItem total);
 
         void onShippingSectionVisibilityChange(boolean isShippingSectionVisible);
 
@@ -223,8 +236,7 @@
          *     returns the package name for Trusted Web Activity. Otherwise returns an empty string
          *     or null.
          */
-        @Nullable
-        String getTwaPackageName();
+        @Nullable String getTwaPackageName();
 
         /**
          * Gets the WebContents from a RenderFrameHost if the WebContents has not been destroyed;
@@ -234,8 +246,7 @@
          *     WebContents contains.
          * @return The WebContents.
          */
-        @Nullable
-        default WebContents getLiveWebContents(RenderFrameHost renderFrameHost) {
+        default @Nullable WebContents getLiveWebContents(RenderFrameHost renderFrameHost) {
             return PaymentRequestServiceUtil.getLiveWebContents(renderFrameHost);
         }
 
@@ -318,8 +329,7 @@
          *
          * @return The instance, can be null for testing.
          */
-        @Nullable
-        default PaymentAppFactoryInterface createAndroidPaymentAppFactory() {
+        default @Nullable PaymentAppFactoryInterface createAndroidPaymentAppFactory() {
             return new AndroidPaymentAppFactory();
         }
 
@@ -327,8 +337,7 @@
          * @return The context of the current activity, can be null when WebContents has been
          *     destroyed, the activity is gone, the window is closed, etc.
          */
-        @Nullable
-        default Context getContext(RenderFrameHost renderFrameHost) {
+        default @Nullable Context getContext(RenderFrameHost renderFrameHost) {
             WindowAndroid window = getWindowAndroid(renderFrameHost);
             if (window == null) return null;
             return window.getContext().get();
@@ -338,8 +347,7 @@
          * @return The WindowAndroid of the current activity, can be null when WebContents has been
          *     destroyed, the activity is gone, etc.
          */
-        @Nullable
-        default WindowAndroid getWindowAndroid(RenderFrameHost renderFrameHost) {
+        default @Nullable WindowAndroid getWindowAndroid(RenderFrameHost renderFrameHost) {
             WebContents webContents = PaymentRequestServiceUtil.getLiveWebContents(renderFrameHost);
             if (webContents == null) return null;
             return webContents.getTopLevelNativeWindow();
@@ -435,7 +443,7 @@
      * @return Whether the initialization is successful.
      */
     public boolean init(
-            @Nullable PaymentMethodData[] rawMethodData,
+            PaymentMethodData @Nullable [] rawMethodData,
             @Nullable PaymentDetails details,
             @Nullable PaymentOptions options) {
         if (mRenderFrameHost.getLastCommittedOrigin() == null
@@ -448,11 +456,12 @@
         mPaymentRequestOrigin =
                 mDelegate.formatUrlForSecurityDisplay(mRenderFrameHost.getLastCommittedURL());
 
-        mWebContents = mDelegate.getLiveWebContents(mRenderFrameHost);
-        if (mWebContents == null || mWebContents.isDestroyed()) {
+        WebContents webContents = mDelegate.getLiveWebContents(mRenderFrameHost);
+        if (webContents == null || webContents.isDestroyed()) {
             abortForInvalidDataFromRenderer(ErrorStrings.NO_WEB_CONTENTS);
             return false;
         }
+        mWebContents = webContents;
         // TODO(crbug.com/41475385): replace UrlFormatter with GURL operations.
         mTopLevelOrigin = mDelegate.formatUrlForSecurityDisplay(mWebContents.getLastCommittedUrl());
 
@@ -585,6 +594,7 @@
             return false;
         }
         PaymentMethodData spcMethodData = methodData.get(MethodStrings.SECURE_PAYMENT_CONFIRMATION);
+        assumeNonNull(spcMethodData);
         if (spcMethodData.securePaymentConfirmation == null) return false;
 
         // TODO(crbug.com/40231121): Update checks to match desktop browser-side logic.
@@ -637,12 +647,12 @@
      * @return The WebContents of the payment handler that's just opened when the opening is
      *     successful; null if failed.
      */
-    @Nullable
-    public static WebContents openPaymentHandlerWindow(GURL url) {
+    public static @Nullable WebContents openPaymentHandlerWindow(GURL url) {
         if (sShowingPaymentRequest == null) return null;
         PaymentApp invokedPaymentApp = sShowingPaymentRequest.mInvokedPaymentApp;
         assert invokedPaymentApp != null;
         assert invokedPaymentApp.getPaymentAppType() == PaymentAppType.SERVICE_WORKER_APP;
+        assumeNonNull(sShowingPaymentRequest.mBrowserPaymentRequest);
         return sShowingPaymentRequest.mBrowserPaymentRequest.openPaymentHandlerWindow(
                 url, invokedPaymentApp.getUkmSourceId());
     }
@@ -698,8 +708,7 @@
     /**
      * @return Get the native=side observer, for testing purpose only.
      */
-    @Nullable
-    public static NativeObserverForTest getNativeObserverForTest() {
+    public static @Nullable NativeObserverForTest getNativeObserverForTest() {
         return sNativeObserverForTest;
     }
 
@@ -739,12 +748,14 @@
     // Implements PaymentResponseHelper.PaymentResponseResultCallback:
     @Override
     public void onPaymentResponseReady(PaymentResponse response) {
+        assumeNonNull(mBrowserPaymentRequest);
         if (!mBrowserPaymentRequest.patchPaymentResponseIfNeeded(response)) {
             disconnectFromClientWithDebugMessage(
                     ErrorStrings.PAYMENT_APP_INVALID_RESPONSE, PaymentErrorReason.NOT_SUPPORTED);
             // Intentionally do not early-return.
         }
         if (response.methodName.equals(MethodStrings.SECURE_PAYMENT_CONFIRMATION)) {
+            assumeNonNull(mInvokedPaymentApp);
             assert mInvokedPaymentApp.getInstrumentMethodNames().contains(response.methodName);
             response = mInvokedPaymentApp.setAppSpecificResponseFields(response);
         }
@@ -825,13 +836,13 @@
                         ? mSpec.getRawShippingOptions()
                         : Collections.unmodifiableList(new ArrayList<>());
         paymentApp.invokePaymentApp(
-                mSpec.getId(),
+                assumeNonNull(mSpec.getId()),
                 mMerchantName,
                 mTopLevelOrigin,
                 mPaymentRequestOrigin,
                 getCertificateChain(),
                 Collections.unmodifiableMap(methodData),
-                mSpec.getRawTotal(),
+                assumeNonNull(mSpec.getRawTotal()),
                 mSpec.getRawLineItems(),
                 Collections.unmodifiableMap(modifiers),
                 paymentOptions,
@@ -912,8 +923,7 @@
         }
     }
 
-    @Nullable
-    private PaymentNotShownError onShowCalledAndAppsQueried() {
+    private @Nullable PaymentNotShownError onShowCalledAndAppsQueried() {
         assert mIsShowCalled;
         assert mIsFinishedQueryingPaymentApps;
         assert mBrowserPaymentRequest != null;
@@ -989,10 +999,10 @@
      *
      * @return The error if the payment cannot be made; null otherwise.
      */
-    @Nullable
-    private PaymentNotShownError ensureHasSupportedPaymentMethods() {
+    private @Nullable PaymentNotShownError ensureHasSupportedPaymentMethods() {
         assert mIsShowCalled;
         assert mIsFinishedQueryingPaymentApps;
+        assumeNonNull(mBrowserPaymentRequest);
         if (!mCanMakePayment || !mBrowserPaymentRequest.hasAvailableApps()) {
             // All factories have responded, but none of them have apps. It's possible to add credit
             // cards, but the merchant does not support them either. The payment request must be
@@ -1166,12 +1176,14 @@
     // Implements PaymentAppFactoryDelegate:
     @Override
     public DialogController getDialogController() {
+        assumeNonNull(mBrowserPaymentRequest);
         return mBrowserPaymentRequest.getDialogController();
     }
 
     // Implements PaymentAppFactoryDelegate:
     @Override
     public AndroidIntentLauncher getAndroidIntentLauncher() {
+        assumeNonNull(mBrowserPaymentRequest);
         return mBrowserPaymentRequest.getAndroidIntentLauncher();
     }
 
@@ -1180,8 +1192,7 @@
      * @return The validated method data, a mapping of method names to its PaymentMethodData(s);
      *     when the given method data is invalid, returns null.
      */
-    @Nullable
-    private static Map<String, PaymentMethodData> getValidatedMethodData(
+    private static @Nullable Map<String, PaymentMethodData> getValidatedMethodData(
             PaymentMethodData[] methodDataList) {
         // Payment methodData are required.
         assert methodDataList != null;
@@ -1228,6 +1239,7 @@
         if (!hadUserActivation) {
             PaymentRequestWebContentsData paymentRequestWebContentsData =
                     PaymentRequestWebContentsData.from(mWebContents);
+            assumeNonNull(paymentRequestWebContentsData);
             if (paymentRequestWebContentsData.hadActivationlessShow()) {
                 // Reject the call to show(), because only one activationless show is allowed per
                 // page.
@@ -1326,13 +1338,14 @@
     }
 
     private boolean isPaymentDetailsUpdateValid(PaymentDetails details) {
+        assumeNonNull(mBrowserPaymentRequest);
         // ID cannot be updated. Updating the total is optional.
         return details.id == null
                 && mDelegate.validatePaymentDetails(details)
                 && mBrowserPaymentRequest.parseAndValidateDetailsFurtherIfNeeded(details);
     }
 
-    private String continueShowWithUpdatedDetails(@Nullable PaymentDetails details) {
+    private @Nullable String continueShowWithUpdatedDetails(@Nullable PaymentDetails details) {
         assert mIsShowWaitingForUpdatedDetails;
         assert mBrowserPaymentRequest != null;
         // mSpec.updateWith() can be used only when mSpec has not been destroyed.
@@ -1406,6 +1419,7 @@
             // After a payment app has been invoked, all of the merchant's calls to update the price
             // via updateWith() should be forwarded to the invoked app, so it can reflect the
             // updated price in its UI.
+            assumeNonNull(mInvokedPaymentApp);
             mInvokedPaymentApp.updateWith(
                     PaymentDetailsConverter.convertToPaymentRequestDetailsUpdate(
                             details, /* methodChecker= */ this, mInvokedPaymentApp));
@@ -1601,8 +1615,7 @@
     /**
      * @return An observer for the payment request service, if any; otherwise, null.
      */
-    @Nullable
-    public static PaymentRequestServiceObserverForTest getObserverForTest() {
+    public static @Nullable PaymentRequestServiceObserverForTest getObserverForTest() {
         return sObserverForTest;
     }
 
@@ -1685,7 +1698,7 @@
 
     // PaymentAppFactoryParams implementation.
     @Override
-    public String getId() {
+    public @Nullable String getId() {
         assert !mHasClosed;
         assert !mSpec.isDestroyed();
         return mSpec.getId();
@@ -1711,8 +1724,8 @@
 
     // PaymentAppFactoryParams implementation.
     @Override
-    @Nullable
-    public byte[][] getCertificateChain() {
+    public byte @Nullable [][] getCertificateChain() {
+        assumeNonNull(mBrowserPaymentRequest);
         return mBrowserPaymentRequest.getCertificateChain();
     }
 
@@ -1726,7 +1739,7 @@
 
     // PaymentAppFactoryParams implementation.
     @Override
-    public PaymentItem getRawTotal() {
+    public @Nullable PaymentItem getRawTotal() {
         assert !mHasClosed;
         assert !mSpec.isDestroyed();
         return mSpec.getRawTotal();
@@ -1758,8 +1771,7 @@
 
     // PaymentAppFactoryParams implementation.
     @Override
-    @Nullable
-    public String getTwaPackageName() {
+    public @Nullable String getTwaPackageName() {
         return mDelegate.getTwaPackageName();
     }
 
@@ -1881,8 +1893,7 @@
     }
 
     @VisibleForTesting
-    @Nullable
-    public static BrowserPaymentRequest getBrowserPaymentRequestForTesting() {
+    public static @Nullable BrowserPaymentRequest getBrowserPaymentRequestForTesting() {
         return sShowingPaymentRequest != null
                 ? sShowingPaymentRequest.mBrowserPaymentRequest
                 : null;
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestServiceUtil.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestServiceUtil.java
index 4c6ca770..2d96b7a 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestServiceUtil.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestServiceUtil.java
@@ -4,14 +4,15 @@
 
 package org.chromium.components.payments;
 
-import androidx.annotation.Nullable;
-
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.content_public.browser.RenderFrameHost;
 import org.chromium.content_public.browser.Visibility;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.WebContentsStatics;
 
 /** The utility class for PaymentRequestFactory and WebLayerPaymentRequestFactory. */
+@NullMarked
 public final class PaymentRequestServiceUtil {
     /**
      * Gets the WebContents from a RenderFrameHost if the WebContents has not been destroyed;
@@ -20,8 +21,7 @@
      *         WebContents contains.
      * @return The WebContents.
      */
-    @Nullable
-    public static WebContents getLiveWebContents(RenderFrameHost renderFrameHost) {
+    public static @Nullable WebContents getLiveWebContents(RenderFrameHost renderFrameHost) {
         WebContents webContents = WebContentsStatics.fromRenderFrameHost(renderFrameHost);
         return webContents != null && !webContents.isDestroyed() ? webContents : null;
     }
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestWebContentsData.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestWebContentsData.java
index 9e10b03..f4baeb0 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestWebContentsData.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestWebContentsData.java
@@ -10,6 +10,8 @@
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.UserData;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.content.browser.webcontents.WebContentsImpl;
 import org.chromium.content.browser.webcontents.WebContentsImpl.UserDataFactory;
 import org.chromium.content_public.browser.WebContents;
@@ -21,8 +23,9 @@
  * user activation, which is recorded and tracked by the native PaymentRequestWebContentsManager.
  */
 @JNINamespace("payments::android")
+@NullMarked
 public class PaymentRequestWebContentsData extends WebContentsObserver implements UserData {
-    private static PaymentRequestWebContentsData sInstanceForTesting;
+    private static @Nullable PaymentRequestWebContentsData sInstanceForTesting;
 
     private static final class UserDataFactoryLazyHolder {
         private static final UserDataFactory<PaymentRequestWebContentsData> INSTANCE =
@@ -40,7 +43,7 @@
      * @param webContents The web contents of the current PaymentRequest.
      * @return the PaymentRequestWebContentsData instance.
      */
-    public static PaymentRequestWebContentsData from(WebContents webContents) {
+    public static @Nullable PaymentRequestWebContentsData from(WebContents webContents) {
         return sInstanceForTesting != null
                 ? sInstanceForTesting
                 : ((WebContentsImpl) webContents)
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentResponseHelper.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentResponseHelper.java
index 8f0e8f4..d52c00f3 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentResponseHelper.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentResponseHelper.java
@@ -4,6 +4,7 @@
 
 package org.chromium.components.payments;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.payments.mojom.PayerDetail;
 import org.chromium.payments.mojom.PaymentOptions;
 import org.chromium.payments.mojom.PaymentResponse;
@@ -13,6 +14,7 @@
  * Compared to ChromePaymentResponseHelper, this helper does not handle the Autofill data, and so
  * can be used for WebLayerPaymentRequestService.
  */
+@NullMarked
 public class PaymentResponseHelper implements PaymentResponseHelperInterface {
     private final PaymentResponse mPaymentResponse;
     private final PaymentOptions mPaymentOptions;
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentResponseHelperInterface.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentResponseHelperInterface.java
index 9159deb..77e38c5 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentResponseHelperInterface.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentResponseHelperInterface.java
@@ -4,12 +4,14 @@
 
 package org.chromium.components.payments;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.payments.mojom.PaymentResponse;
 
 /**
  * The interface of a helper class that generates a {@link PaymentResponse} with the input of
  * payment details.
  */
+@NullMarked
 public interface PaymentResponseHelperInterface {
     /**
      * Generates a {@link PaymentResponse} with the given payment details.
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentUiServiceTestInterface.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentUiServiceTestInterface.java
index 8d79d62..ff997f72 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentUiServiceTestInterface.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentUiServiceTestInterface.java
@@ -4,9 +4,11 @@
 
 package org.chromium.components.payments;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.content_public.browser.WebContents;
 
 /** The interface of PaymentUiService that provides testing methods. */
+@NullMarked
 public interface PaymentUiServiceTestInterface {
     /**
      * Get the WebContents of the Payment Handler; return null if nonexistent.
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentValidator.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentValidator.java
index 3c720c5..7c917b66 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentValidator.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentValidator.java
@@ -7,6 +7,7 @@
 import org.jni_zero.JNINamespace;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.payments.mojom.PaymentDetails;
 import org.chromium.payments.mojom.PaymentValidationErrors;
 
@@ -14,6 +15,7 @@
 
 /** Static class to represent a JNI interface to a C++ validation library. */
 @JNINamespace("payments")
+@NullMarked
 public class PaymentValidator {
     public static boolean validatePaymentDetails(PaymentDetails details) {
         if (details == null) {
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/SslValidityChecker.java b/components/payments/content/android/java/src/org/chromium/components/payments/SslValidityChecker.java
index 770ec639..547198c6 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/SslValidityChecker.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/SslValidityChecker.java
@@ -7,10 +7,12 @@
 import org.jni_zero.JNINamespace;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.content_public.browser.WebContents;
 
 /** SSL validity checker. */
 @JNINamespace("payments")
+@NullMarked
 public class SslValidityChecker {
     /**
      *  Returns a developer-facing error message for invalid SSL certificate state or an empty
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/SupportedDelegations.java b/components/payments/content/android/java/src/org/chromium/components/payments/SupportedDelegations.java
index e1c50b6f..68181d1 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/SupportedDelegations.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/SupportedDelegations.java
@@ -4,11 +4,12 @@
 
 package org.chromium.components.payments;
 
-import androidx.annotation.Nullable;
-
 import org.chromium.base.Log;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 /** This class represents the supported delegations of a service worker based payment app. */
+@NullMarked
 public class SupportedDelegations {
     private static final String TAG = "SupportedDelegations";
     private final boolean mShippingAddress;
@@ -57,7 +58,7 @@
     }
 
     public static SupportedDelegations createFromStringArray(
-            @Nullable String[] supportedDelegationsNames) throws IllegalArgumentException {
+            String @Nullable [] supportedDelegationsNames) throws IllegalArgumentException {
         if (supportedDelegationsNames == null || supportedDelegationsNames.length == 0) {
             return new SupportedDelegations();
         }
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/UrlUtil.java b/components/payments/content/android/java/src/org/chromium/components/payments/UrlUtil.java
index d7080ba..9a6a759 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/UrlUtil.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/UrlUtil.java
@@ -7,11 +7,13 @@
 import org.jni_zero.JNINamespace;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.url.GURL;
 
 /** URL validity checker for web payment APIs. */
 @JNINamespace("payments::android")
+@NullMarked
 public class UrlUtil {
     /**
      * Returns false for invalid URL format or a relative URI.
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/WebAppManifestSection.java b/components/payments/content/android/java/src/org/chromium/components/payments/WebAppManifestSection.java
index 6d44573..e14a584 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/WebAppManifestSection.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/WebAppManifestSection.java
@@ -4,7 +4,10 @@
 
 package org.chromium.components.payments;
 
+import org.chromium.build.annotations.NullMarked;
+
 /** Java equivalent of components/payments/content/web_app_manifest.h:WebAppManifestSection */
+@NullMarked
 public final class WebAppManifestSection {
     /**
      * Constructor that does not set the fingerprints. They have to be set after the object is
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/intent/IsReadyToPayServiceHelper.java b/components/payments/content/android/java/src/org/chromium/components/payments/intent/IsReadyToPayServiceHelper.java
index 8ed8add..841250e 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/intent/IsReadyToPayServiceHelper.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/intent/IsReadyToPayServiceHelper.java
@@ -17,9 +17,12 @@
 import org.chromium.IsReadyToPayService;
 import org.chromium.IsReadyToPayServiceCallback;
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.payments.PrePurchaseQuery;
 
 /** A helper to query the payment app's IsReadyToPay service. */
+@NullMarked
 public class IsReadyToPayServiceHelper extends IsReadyToPayServiceCallback.Stub
         implements ServiceConnection {
     /** The maximum number of milliseconds to wait for a response from a READY_TO_PAY service. */
@@ -31,7 +34,7 @@
     private final Context mContext;
 
     // This callback can be used only once, set to null after that.
-    private ResultHandler mResultHandler;
+    private @Nullable ResultHandler mResultHandler;
 
     private boolean mIsServiceBindingInitiated;
     private boolean mIsServiceConnected;
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelper.java b/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelper.java
index c9c0885..90c9a710 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelper.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelper.java
@@ -122,7 +122,7 @@
     public static void parsePaymentResponse(
             int resultCode,
             Intent data,
-            PaymentOptions requestedPaymentOptions,
+            @Nullable PaymentOptions requestedPaymentOptions,
             PaymentErrorCallback errorCallback,
             PaymentSuccessCallback successCallback) {
         if (data == null) {
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelperType.java b/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelperType.java
index b884e20..8317376 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelperType.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelperType.java
@@ -115,10 +115,10 @@
 
     /** The class that corresponds mojom.PaymentDetailsModifier, with minimally required fields. */
     public static final class PaymentDetailsModifier {
-        public final PaymentItem total;
+        public final @Nullable PaymentItem total;
         public final PaymentMethodData methodData;
 
-        public PaymentDetailsModifier(PaymentItem total, PaymentMethodData methodData) {
+        public PaymentDetailsModifier(@Nullable PaymentItem total, PaymentMethodData methodData) {
             this.total = total;
             this.methodData = methodData;
         }
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelperTypeConverter.java b/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelperTypeConverter.java
index 877228a..4d531cd 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelperTypeConverter.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelperTypeConverter.java
@@ -7,8 +7,9 @@
 import android.os.Bundle;
 import android.text.TextUtils;
 
-import androidx.annotation.Nullable;
-
+import org.chromium.build.annotations.Contract;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.payments.mojom.AddressErrors;
 import org.chromium.payments.mojom.PaymentCurrencyAmount;
 import org.chromium.payments.mojom.PaymentDetailsModifier;
@@ -29,34 +30,36 @@
  * This class defines the utility functions that convert the payment info types in
  * org.chromium.payments.mojom to their counterparts in WebPaymentIntentHelperType.
  */
+@NullMarked
 public final class WebPaymentIntentHelperTypeConverter {
-    @Nullable
-    public static WebPaymentIntentHelperType.PaymentCurrencyAmount fromMojoPaymentCurrencyAmount(
-            @Nullable PaymentCurrencyAmount currencyAmount) {
+
+    @Contract("!null -> !null")
+    public static WebPaymentIntentHelperType.@Nullable PaymentCurrencyAmount
+            fromMojoPaymentCurrencyAmount(@Nullable PaymentCurrencyAmount currencyAmount) {
         if (currencyAmount == null) return null;
         return new WebPaymentIntentHelperType.PaymentCurrencyAmount(
                 /* currency= */ currencyAmount.currency, /* value= */ currencyAmount.value);
     }
 
-    @Nullable
-    public static WebPaymentIntentHelperType.PaymentItem fromMojoPaymentItem(
+    @Contract("!null -> !null")
+    public static WebPaymentIntentHelperType.@Nullable PaymentItem fromMojoPaymentItem(
             @Nullable PaymentItem item) {
         if (item == null) return null;
         return new WebPaymentIntentHelperType.PaymentItem(
                 fromMojoPaymentCurrencyAmount(item.amount));
     }
 
-    @Nullable
-    public static WebPaymentIntentHelperType.PaymentDetailsModifier fromMojoPaymentDetailsModifier(
-            @Nullable PaymentDetailsModifier detailsModifier) {
+    @Contract("!null -> !null")
+    public static WebPaymentIntentHelperType.@Nullable PaymentDetailsModifier
+            fromMojoPaymentDetailsModifier(@Nullable PaymentDetailsModifier detailsModifier) {
         if (detailsModifier == null) return null;
         return new WebPaymentIntentHelperType.PaymentDetailsModifier(
                 fromMojoPaymentItem(detailsModifier.total),
                 fromMojoPaymentMethodData(detailsModifier.methodData));
     }
 
-    @Nullable
-    public static WebPaymentIntentHelperType.PaymentMethodData fromMojoPaymentMethodData(
+    @Contract("!null -> !null")
+    public static WebPaymentIntentHelperType.@Nullable PaymentMethodData fromMojoPaymentMethodData(
             @Nullable PaymentMethodData methodData) {
         if (methodData == null) return null;
         return new WebPaymentIntentHelperType.PaymentMethodData(
@@ -64,9 +67,10 @@
                 /* stringifiedData= */ methodData.stringifiedData);
     }
 
-    @Nullable
-    public static Map<String, WebPaymentIntentHelperType.PaymentMethodData>
-            fromMojoPaymentMethodDataMap(@Nullable Map<String, PaymentMethodData> methodDataMap) {
+    @Contract("!null -> !null")
+    public static @Nullable
+            Map<String, WebPaymentIntentHelperType.PaymentMethodData> fromMojoPaymentMethodDataMap(
+                    @Nullable Map<String, PaymentMethodData> methodDataMap) {
         if (methodDataMap == null) return null;
         Map<String, WebPaymentIntentHelperType.PaymentMethodData> compatibleMethodDataMap =
                 new HashMap<>();
@@ -79,10 +83,11 @@
         return compatibleMethodDataMap;
     }
 
-    @Nullable
-    public static Map<String, WebPaymentIntentHelperType.PaymentDetailsModifier>
-            fromMojoPaymentDetailsModifierMap(
-                    @Nullable Map<String, PaymentDetailsModifier> modifiers) {
+    @Contract("!null -> !null")
+    public static @Nullable
+            Map<String, WebPaymentIntentHelperType.PaymentDetailsModifier>
+                    fromMojoPaymentDetailsModifierMap(
+                            @Nullable Map<String, PaymentDetailsModifier> modifiers) {
         if (modifiers == null) return null;
         Map<String, WebPaymentIntentHelperType.PaymentDetailsModifier> compatibleModifiers =
                 new HashMap<>();
@@ -95,8 +100,8 @@
         return compatibleModifiers;
     }
 
-    @Nullable
-    public static List<WebPaymentIntentHelperType.PaymentItem> fromMojoPaymentItems(
+    @Contract("!null -> !null")
+    public static @Nullable List<WebPaymentIntentHelperType.PaymentItem> fromMojoPaymentItems(
             @Nullable List<PaymentItem> paymentItems) {
         if (paymentItems == null) return null;
         List<WebPaymentIntentHelperType.PaymentItem> compatiblePaymentItems = new ArrayList<>();
@@ -107,9 +112,9 @@
         return compatiblePaymentItems;
     }
 
-    @Nullable
-    public static WebPaymentIntentHelperType.PaymentShippingOption fromMojoPaymentShippingOption(
-            @Nullable PaymentShippingOption shippingOption) {
+    @Contract("!null -> !null")
+    public static WebPaymentIntentHelperType.@Nullable PaymentShippingOption
+            fromMojoPaymentShippingOption(@Nullable PaymentShippingOption shippingOption) {
         if (shippingOption == null) return null;
         return new WebPaymentIntentHelperType.PaymentShippingOption(
                 shippingOption.id,
@@ -118,9 +123,10 @@
                 shippingOption.selected);
     }
 
-    @Nullable
-    public static List<WebPaymentIntentHelperType.PaymentShippingOption> fromMojoShippingOptionList(
-            @Nullable List<PaymentShippingOption> shippingOptions) {
+    @Contract("!null -> !null")
+    public static @Nullable
+            List<WebPaymentIntentHelperType.PaymentShippingOption> fromMojoShippingOptionList(
+                    @Nullable List<PaymentShippingOption> shippingOptions) {
         if (shippingOptions == null) return null;
         List<WebPaymentIntentHelperType.PaymentShippingOption> shippingOptionList =
                 new ArrayList<>();
@@ -131,8 +137,8 @@
         return shippingOptionList;
     }
 
-    @Nullable
-    public static WebPaymentIntentHelperType.PaymentOptions fromMojoPaymentOptions(
+    @Contract("!null -> !null")
+    public static WebPaymentIntentHelperType.@Nullable PaymentOptions fromMojoPaymentOptions(
             @Nullable PaymentOptions paymentOptions) {
         if (paymentOptions == null) return null;
         String shippingType = null;
@@ -157,8 +163,9 @@
                 shippingType);
     }
 
-    @Nullable
-    private static Bundle fromMojoShippingAddressErrors(@Nullable AddressErrors addressErrors) {
+    @Contract("!null -> !null")
+    private static @Nullable Bundle fromMojoShippingAddressErrors(
+            @Nullable AddressErrors addressErrors) {
         if (addressErrors == null) return null;
         Bundle bundle = new Bundle();
         putIfNonEmpty("addressLine", addressErrors.addressLine, bundle);
@@ -184,8 +191,8 @@
      * @param update The mojo PaymentRequestDetailsUpdate to be converted.
      * @return The converted update.
      */
-    @Nullable
-    public static WebPaymentIntentHelperType.PaymentRequestDetailsUpdate
+    @Contract("!null -> !null")
+    public static WebPaymentIntentHelperType.@Nullable PaymentRequestDetailsUpdate
             fromMojoPaymentRequestDetailsUpdate(@Nullable PaymentRequestDetailsUpdate update) {
         if (update == null) return null;
         return new WebPaymentIntentHelperType.PaymentRequestDetailsUpdate(
diff --git a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnController.java b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnController.java
index 75cf570..4061918 100644
--- a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnController.java
+++ b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnController.java
@@ -4,18 +4,21 @@
 
 package org.chromium.components.payments.secure_payment_confirmation;
 
+import static org.chromium.build.NullUtil.assertNonNull;
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.Context;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.util.Pair;
 import android.view.View;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.core.content.res.ResourcesCompat;
 
 import org.chromium.base.Callback;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetControllerProvider;
@@ -41,12 +44,16 @@
  * component from other components and acts as the point of contact between them. Any code in this
  * component that needs to interact with another component does that through this controller.
  */
+@NullMarked
 public class SecurePaymentConfirmationAuthnController {
     private final WebContents mWebContents;
-    private Runnable mHider;
-    private Callback<Boolean> mResponseCallback;
-    private Runnable mOptOutCallback;
-    private SecurePaymentConfirmationAuthnView mView;
+    private @Nullable Runnable mHider;
+
+    private @Nullable Callback<Boolean> mResponseCallback;
+
+    private @Nullable Runnable mOptOutCallback;
+
+    private @Nullable SecurePaymentConfirmationAuthnView mView;
 
     private InputProtector mInputProtector = new InputProtector();
 
@@ -66,11 +73,12 @@
             new BottomSheetContent() {
                 @Override
                 public View getContentView() {
+                    assumeNonNull(mView);
                     return mView.getContentView();
                 }
 
                 @Override
-                public View getToolbarView() {
+                public @Nullable View getToolbarView() {
                     return null;
                 }
 
@@ -112,7 +120,7 @@
                 }
 
                 @Override
-                public @NonNull String getSheetContentDescription(Context context) {
+                public String getSheetContentDescription(Context context) {
                     return context.getString(
                             R.string.secure_payment_confirmation_authentication_sheet_description);
                 }
@@ -139,7 +147,8 @@
      *
      * @param webContents The WebContents of the merchant.
      */
-    public static SecurePaymentConfirmationAuthnController create(WebContents webContents) {
+    public static @Nullable SecurePaymentConfirmationAuthnController create(
+            WebContents webContents) {
         return webContents != null
                 ? new SecurePaymentConfirmationAuthnController(webContents)
                 : null;
@@ -263,7 +272,7 @@
     }
 
     @VisibleForTesting(otherwise = VisibleForTesting.NONE)
-    public SecurePaymentConfirmationAuthnView getView() {
+    public @Nullable SecurePaymentConfirmationAuthnView getView() {
         return mView;
     }
 
@@ -272,12 +281,13 @@
         return mHider == null;
     }
 
-    private String getStoreLabel(@Nullable String payeeName, @Nullable Origin payeeOrigin) {
+    private String getStoreLabel(
+            @Nullable String payeeName, @Nullable Origin payeeOrigin) {
         // At least one of the payeeName and payeeOrigin must be non-null in SPC; this should be
         // enforced by PaymentRequestService.isValidSecurePaymentConfirmationRequest.
         assert payeeName != null || payeeOrigin != null;
 
-        if (payeeOrigin == null) return payeeName;
+        if (payeeOrigin == null) return assertNonNull(payeeName);
 
         String origin =
                 UrlFormatter.formatOriginForSecurityDisplay(
@@ -295,6 +305,7 @@
 
     private void onConfirm() {
         hide();
+        assumeNonNull(mResponseCallback);
         mResponseCallback.onResult(true);
     }
 
@@ -304,6 +315,7 @@
 
     private void onCancel() {
         hide();
+        assumeNonNull(mResponseCallback);
         mResponseCallback.onResult(false);
     }
 
diff --git a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnProperties.java b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnProperties.java
index 80229220..837f5c13 100644
--- a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnProperties.java
+++ b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnProperties.java
@@ -7,6 +7,7 @@
 import android.graphics.drawable.Drawable;
 import android.util.Pair;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel.ReadableObjectPropertyKey;
 
@@ -14,6 +15,7 @@
  * The properties of the SecurePaymentConfirmation Authn UI, which fully describe the state of the
  * UI.
  */
+@NullMarked
 /* package */ class SecurePaymentConfirmationAuthnProperties {
     /** The store value of the UI. */
     /* package */ static final ReadableObjectPropertyKey<String> STORE_LABEL =
diff --git a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnView.java b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnView.java
index a1ed0a0..65ba44b9 100644
--- a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnView.java
+++ b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnView.java
@@ -14,6 +14,7 @@
 import android.widget.ScrollView;
 import android.widget.TextView;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.payments.R;
 import org.chromium.ui.widget.TextViewWithClickableSpans;
 
@@ -22,6 +23,7 @@
  * state. It has a fixed height, which is the height of the visible content area. It shows the
  * payment details and provides the option to continue with the payment or to cancel.
  */
+@NullMarked
 /* package */ class SecurePaymentConfirmationAuthnView {
     /**
      * Bundles the information necessary to show the opt out UX, if requested by the caller.
diff --git a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnViewBinder.java b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnViewBinder.java
index 8e784ea..97d96bd 100644
--- a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnViewBinder.java
+++ b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnViewBinder.java
@@ -11,6 +11,7 @@
 import android.view.View;
 import android.view.ViewGroup.LayoutParams;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.payments.R;
 import org.chromium.ui.base.DeviceFormFactor;
 import org.chromium.ui.modelutil.PropertyKey;
@@ -23,6 +24,7 @@
  * The view binder of the SecurePaymentConfirmation Authn UI, which is stateless. It is called to
  * bind a given model to a given view. Should contain as little business logic as possible.
  */
+@NullMarked
 /* package */ class SecurePaymentConfirmationAuthnViewBinder {
     /* package */ static void bind(
             PropertyModel model, SecurePaymentConfirmationAuthnView view, PropertyKey propertyKey) {
diff --git a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationNoMatchingCredController.java b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationNoMatchingCredController.java
index 615ef1a..7cbd013 100644
--- a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationNoMatchingCredController.java
+++ b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationNoMatchingCredController.java
@@ -3,12 +3,15 @@
 // found in the LICENSE file.
 package org.chromium.components.payments.secure_payment_confirmation;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.Context;
 import android.view.View;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetControllerProvider;
@@ -28,12 +31,13 @@
  * between them. Any code in this component that needs to interact with another component does that
  * through this controller.
  */
+@NullMarked
 public class SecurePaymentConfirmationNoMatchingCredController {
     private final WebContents mWebContents;
-    private Runnable mHider;
-    private Runnable mResponseCallback;
-    private Runnable mOptOutCallback;
-    private SecurePaymentConfirmationNoMatchingCredView mView;
+    private @Nullable Runnable mHider;
+    private @Nullable Runnable mResponseCallback;
+    private @Nullable Runnable mOptOutCallback;
+    private @Nullable SecurePaymentConfirmationNoMatchingCredView mView;
 
     private InputProtector mInputProtector = new InputProtector();
 
@@ -53,11 +57,12 @@
             new BottomSheetContent() {
                 @Override
                 public View getContentView() {
+                    assumeNonNull(mView);
                     return mView.getContentView();
                 }
 
                 @Override
-                public View getToolbarView() {
+                public @Nullable View getToolbarView() {
                     return null;
                 }
 
@@ -99,7 +104,7 @@
                 }
 
                 @Override
-                public @NonNull String getSheetContentDescription(Context context) {
+                public String getSheetContentDescription(Context context) {
                     return context.getString(
                             R.string
                                     .secure_payment_confirmation_no_matching_credential_sheet_description);
@@ -127,7 +132,7 @@
      *
      * @param webContents The WebContents of the merchant.
      */
-    public static SecurePaymentConfirmationNoMatchingCredController create(
+    public static @Nullable SecurePaymentConfirmationNoMatchingCredController create(
             WebContents webContents) {
         return webContents != null
                 ? new SecurePaymentConfirmationNoMatchingCredController(webContents)
@@ -223,7 +228,7 @@
     }
 
     @VisibleForTesting(otherwise = VisibleForTesting.NONE)
-    public SecurePaymentConfirmationNoMatchingCredView getView() {
+    public @Nullable SecurePaymentConfirmationNoMatchingCredView getView() {
         return mView;
     }
 
diff --git a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationNoMatchingCredView.java b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationNoMatchingCredView.java
index ee9f34c..903903a8 100644
--- a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationNoMatchingCredView.java
+++ b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationNoMatchingCredView.java
@@ -15,6 +15,7 @@
 import android.widget.ScrollView;
 import android.widget.TextView;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.payments.R;
 import org.chromium.ui.base.DeviceFormFactor;
 import org.chromium.ui.text.ChromeClickableSpan;
@@ -27,6 +28,7 @@
  * peeked or half-open state. It has a fixed height, which is the height of the visible content
  * area. It informs the user that additional steps are needed to verify the payment.
  */
+@NullMarked
 public class SecurePaymentConfirmationNoMatchingCredView {
     private final RelativeLayout mContentView;
     private final ScrollView mScrollView;
diff --git a/url/android/java/src/org/chromium/url/GURL.java b/url/android/java/src/org/chromium/url/GURL.java
index bd3819bf..e418c786 100644
--- a/url/android/java/src/org/chromium/url/GURL.java
+++ b/url/android/java/src/org/chromium/url/GURL.java
@@ -287,7 +287,7 @@
     }
 
     @Override
-    public final boolean equals(Object other) {
+    public final boolean equals(@Nullable Object other) {
         if (other == this) return true;
         if (!(other instanceof GURL)) return false;
         return mSpec.equals(((GURL) other).mSpec);