Annotate ContentResolver/Provider arguments.

Explicitly mark if they're @Nullable or @NonNull.

Bug: 21560515
Change-Id: I5f671c241dfe65e5ab8bc06b2382fbf5a82bdb20
diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java
index 72e701d..d478f4a 100644
--- a/core/java/android/content/ContentProvider.java
+++ b/core/java/android/content/ContentProvider.java
@@ -19,6 +19,7 @@
 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
 import static android.Manifest.permission.INTERACT_ACROSS_USERS;
 
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.AppOpsManager;
 import android.content.pm.PathPermission;
@@ -639,7 +640,7 @@
      * {@link #onCreate} has been called -- this will return {@code null} in the
      * constructor.
      */
-    public final Context getContext() {
+    public final @Nullable Context getContext() {
         return mContext;
     }
 
@@ -667,7 +668,7 @@
      * @throws SecurityException if the calling package doesn't belong to the
      *             calling UID.
      */
-    public final String getCallingPackage() {
+    public final @Nullable String getCallingPackage() {
         final String pkg = mCallingPackage.get();
         if (pkg != null) {
             mTransport.mAppOpsManager.checkPackage(Binder.getCallingUid(), pkg);
@@ -716,7 +717,7 @@
      *
      * @param permission Name of the permission required for read-only access.
      */
-    protected final void setReadPermission(String permission) {
+    protected final void setReadPermission(@Nullable String permission) {
         mReadPermission = permission;
     }
 
@@ -727,7 +728,7 @@
      * <a href="{@docRoot}guide/topics/fundamentals/processes-and-threads.html#Threads">Processes
      * and Threads</a>.
      */
-    public final String getReadPermission() {
+    public final @Nullable String getReadPermission() {
         return mReadPermission;
     }
 
@@ -738,7 +739,7 @@
      *
      * @param permission Name of the permission required for read/write access.
      */
-    protected final void setWritePermission(String permission) {
+    protected final void setWritePermission(@Nullable String permission) {
         mWritePermission = permission;
     }
 
@@ -749,7 +750,7 @@
      * <a href="{@docRoot}guide/topics/fundamentals/processes-and-threads.html#Threads">Processes
      * and Threads</a>.
      */
-    public final String getWritePermission() {
+    public final @Nullable String getWritePermission() {
         return mWritePermission;
     }
 
@@ -760,7 +761,7 @@
      *
      * @param permissions Array of path permission descriptions.
      */
-    protected final void setPathPermissions(PathPermission[] permissions) {
+    protected final void setPathPermissions(@Nullable PathPermission[] permissions) {
         mPathPermissions = permissions;
     }
 
@@ -771,7 +772,7 @@
      * <a href="{@docRoot}guide/topics/fundamentals/processes-and-threads.html#Threads">Processes
      * and Threads</a>.
      */
-    public final PathPermission[] getPathPermissions() {
+    public final @Nullable PathPermission[] getPathPermissions() {
         return mPathPermissions;
     }
 
@@ -897,8 +898,9 @@
      *      If {@code null} then the provider is free to define the sort order.
      * @return a Cursor or {@code null}.
      */
-    public abstract Cursor query(Uri uri, String[] projection,
-            String selection, String[] selectionArgs, String sortOrder);
+    public abstract @Nullable Cursor query(@NonNull Uri uri, @Nullable String[] projection,
+            @Nullable String selection, @Nullable String[] selectionArgs,
+            @Nullable String sortOrder);
 
     /**
      * Implement this to handle query requests from clients with support for cancellation.
@@ -963,9 +965,9 @@
      * when the query is executed.
      * @return a Cursor or {@code null}.
      */
-    public Cursor query(Uri uri, String[] projection,
-            String selection, String[] selectionArgs, String sortOrder,
-            CancellationSignal cancellationSignal) {
+    public @Nullable Cursor query(@NonNull Uri uri, @Nullable String[] projection,
+            @Nullable String selection, @Nullable String[] selectionArgs,
+            @Nullable String sortOrder, @Nullable CancellationSignal cancellationSignal) {
         return query(uri, projection, selection, selectionArgs, sortOrder);
     }
 
@@ -987,7 +989,7 @@
      * @param uri the URI to query.
      * @return a MIME type string, or {@code null} if there is no type.
      */
-    public abstract String getType(Uri uri);
+    public abstract @Nullable String getType(@NonNull Uri uri);
 
     /**
      * Implement this to support canonicalization of URIs that refer to your
@@ -1019,7 +1021,7 @@
      * @return Return the canonical representation of <var>url</var>, or null if
      * canonicalization of that Uri is not supported.
      */
-    public Uri canonicalize(Uri url) {
+    public @Nullable Uri canonicalize(@NonNull Uri url) {
         return null;
     }
 
@@ -1037,7 +1039,7 @@
      * the data identified by the canonical representation can not be found in
      * the current environment.
      */
-    public Uri uncanonicalize(Uri url) {
+    public @Nullable Uri uncanonicalize(@NonNull Uri url) {
         return url;
     }
 
@@ -1070,7 +1072,7 @@
      *     This must not be {@code null}.
      * @return The URI for the newly inserted item.
      */
-    public abstract Uri insert(Uri uri, ContentValues values);
+    public abstract @Nullable Uri insert(@NonNull Uri uri, @NonNull ContentValues values);
 
     /**
      * Override this to handle requests to insert a set of new rows, or the
@@ -1087,7 +1089,7 @@
      *    This must not be {@code null}.
      * @return The number of values that were inserted.
      */
-    public int bulkInsert(Uri uri, ContentValues[] values) {
+    public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) {
         int numValues = values.length;
         for (int i = 0; i < numValues; i++) {
             insert(uri, values[i]);
@@ -1115,7 +1117,8 @@
      * @return The number of rows affected.
      * @throws SQLException
      */
-    public abstract int delete(Uri uri, String selection, String[] selectionArgs);
+    public abstract int delete(@NonNull Uri uri, @Nullable String selection,
+            @Nullable String[] selectionArgs);
 
     /**
      * Implement this to handle requests to update one or more rows.
@@ -1134,8 +1137,8 @@
      * @param selection An optional filter to match rows to update.
      * @return the number of rows affected.
      */
-    public abstract int update(Uri uri, ContentValues values, String selection,
-            String[] selectionArgs);
+    public abstract int update(@NonNull Uri uri, @NonNull ContentValues values,
+            @Nullable String selection, @Nullable String[] selectionArgs);
 
     /**
      * Override this to handle requests to open a file blob.
@@ -1194,7 +1197,7 @@
      * @see #getType(android.net.Uri)
      * @see ParcelFileDescriptor#parseMode(String)
      */
-    public ParcelFileDescriptor openFile(Uri uri, String mode)
+    public @Nullable ParcelFileDescriptor openFile(@NonNull Uri uri, @NonNull String mode)
             throws FileNotFoundException {
         throw new FileNotFoundException("No files supported by provider at "
                 + uri);
@@ -1264,8 +1267,8 @@
      * @see #getType(android.net.Uri)
      * @see ParcelFileDescriptor#parseMode(String)
      */
-    public ParcelFileDescriptor openFile(Uri uri, String mode, CancellationSignal signal)
-            throws FileNotFoundException {
+    public @Nullable ParcelFileDescriptor openFile(@NonNull Uri uri, @NonNull String mode,
+            @Nullable CancellationSignal signal) throws FileNotFoundException {
         return openFile(uri, mode);
     }
 
@@ -1320,7 +1323,7 @@
      * @see #openFileHelper(Uri, String)
      * @see #getType(android.net.Uri)
      */
-    public AssetFileDescriptor openAssetFile(Uri uri, String mode)
+    public @Nullable AssetFileDescriptor openAssetFile(@NonNull Uri uri, @NonNull String mode)
             throws FileNotFoundException {
         ParcelFileDescriptor fd = openFile(uri, mode);
         return fd != null ? new AssetFileDescriptor(fd, 0, -1) : null;
@@ -1383,8 +1386,8 @@
      * @see #openFileHelper(Uri, String)
      * @see #getType(android.net.Uri)
      */
-    public AssetFileDescriptor openAssetFile(Uri uri, String mode, CancellationSignal signal)
-            throws FileNotFoundException {
+    public @Nullable AssetFileDescriptor openAssetFile(@NonNull Uri uri, @NonNull String mode,
+            @Nullable CancellationSignal signal) throws FileNotFoundException {
         return openAssetFile(uri, mode);
     }
 
@@ -1402,8 +1405,8 @@
      * @return Returns a new ParcelFileDescriptor that can be used by the
      * client to access the file.
      */
-    protected final ParcelFileDescriptor openFileHelper(Uri uri,
-            String mode) throws FileNotFoundException {
+    protected final @NonNull ParcelFileDescriptor openFileHelper(@NonNull Uri uri,
+            @NonNull String mode) throws FileNotFoundException {
         Cursor c = query(uri, new String[]{"_data"}, null, null, null);
         int count = (c != null) ? c.getCount() : 0;
         if (count != 1) {
@@ -1449,7 +1452,7 @@
      * @see #openTypedAssetFile(Uri, String, Bundle)
      * @see ClipDescription#compareMimeTypes(String, String)
      */
-    public String[] getStreamTypes(Uri uri, String mimeTypeFilter) {
+    public @Nullable String[] getStreamTypes(@NonNull Uri uri, @NonNull String mimeTypeFilter) {
         return null;
     }
 
@@ -1498,8 +1501,8 @@
      * @see #openAssetFile(Uri, String)
      * @see ClipDescription#compareMimeTypes(String, String)
      */
-    public AssetFileDescriptor openTypedAssetFile(Uri uri, String mimeTypeFilter, Bundle opts)
-            throws FileNotFoundException {
+    public @Nullable AssetFileDescriptor openTypedAssetFile(@NonNull Uri uri,
+            @NonNull String mimeTypeFilter, @Nullable Bundle opts) throws FileNotFoundException {
         if ("*/*".equals(mimeTypeFilter)) {
             // If they can take anything, the untyped open call is good enough.
             return openAssetFile(uri, "r");
@@ -1565,9 +1568,9 @@
      * @see #openAssetFile(Uri, String)
      * @see ClipDescription#compareMimeTypes(String, String)
      */
-    public AssetFileDescriptor openTypedAssetFile(
-            Uri uri, String mimeTypeFilter, Bundle opts, CancellationSignal signal)
-            throws FileNotFoundException {
+    public @Nullable AssetFileDescriptor openTypedAssetFile(@NonNull Uri uri,
+            @NonNull String mimeTypeFilter, @Nullable Bundle opts,
+            @Nullable CancellationSignal signal) throws FileNotFoundException {
         return openTypedAssetFile(uri, mimeTypeFilter, opts);
     }
 
@@ -1589,8 +1592,8 @@
          * @param opts Options supplied by caller.
          * @param args Your own custom arguments.
          */
-        public void writeDataToPipe(ParcelFileDescriptor output, Uri uri, String mimeType,
-                Bundle opts, T args);
+        public void writeDataToPipe(@NonNull ParcelFileDescriptor output, @NonNull Uri uri,
+                @NonNull String mimeType, @Nullable Bundle opts, @Nullable T args);
     }
 
     /**
@@ -1610,9 +1613,9 @@
      * the pipe.  This should be returned to the caller for reading; the caller
      * is responsible for closing it when done.
      */
-    public <T> ParcelFileDescriptor openPipeHelper(final Uri uri, final String mimeType,
-            final Bundle opts, final T args, final PipeDataWriter<T> func)
-            throws FileNotFoundException {
+    public @NonNull <T> ParcelFileDescriptor openPipeHelper(final @NonNull Uri uri,
+            final @NonNull String mimeType, final @Nullable Bundle opts, final @Nullable T args,
+            final @NonNull PipeDataWriter<T> func) throws FileNotFoundException {
         try {
             final ParcelFileDescriptor[] fds = ParcelFileDescriptor.createPipe();
 
@@ -1717,8 +1720,9 @@
      * @throws OperationApplicationException thrown if any operation fails.
      * @see ContentProviderOperation#apply
      */
-    public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)
-            throws OperationApplicationException {
+    public @NonNull ContentProviderResult[] applyBatch(
+            @NonNull ArrayList<ContentProviderOperation> operations)
+                    throws OperationApplicationException {
         final int numOperations = operations.size();
         final ContentProviderResult[] results = new ContentProviderResult[numOperations];
         for (int i = 0; i < numOperations; i++) {
@@ -1745,7 +1749,8 @@
      * @return provider-defined return value.  May be {@code null}, which is also
      *   the default for providers which don't implement any call methods.
      */
-    public Bundle call(String method, @Nullable String arg, @Nullable Bundle extras) {
+    public @Nullable Bundle call(@NonNull String method, @Nullable String arg,
+            @Nullable Bundle extras) {
         return null;
     }
 
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 96a80e7..bccd144 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -17,6 +17,7 @@
 package android.content;
 
 import android.accounts.Account;
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.app.ActivityManagerNative;
 import android.app.ActivityThread;
@@ -47,6 +48,8 @@
 
 import dalvik.system.CloseGuard;
 
+import com.android.internal.util.Preconditions;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -320,7 +323,9 @@
      * using the content:// scheme.
      * @return A MIME type for the content, or null if the URL is invalid or the type is unknown
      */
-    public final String getType(Uri url) {
+    public final @Nullable String getType(@NonNull Uri url) {
+        Preconditions.checkNotNull(url, "url");
+
         // XXX would like to have an acquireExistingUnstableProvider for this.
         IContentProvider provider = acquireExistingProvider(url);
         if (provider != null) {
@@ -371,7 +376,10 @@
      * data streams that match the given mimeTypeFilter.  If there are none,
      * null is returned.
      */
-    public String[] getStreamTypes(Uri url, String mimeTypeFilter) {
+    public @Nullable String[] getStreamTypes(@NonNull Uri url, @NonNull String mimeTypeFilter) {
+        Preconditions.checkNotNull(url, "url");
+        Preconditions.checkNotNull(mimeTypeFilter, "mimeTypeFilter");
+
         IContentProvider provider = acquireProvider(url);
         if (provider == null) {
             return null;
@@ -418,8 +426,9 @@
      * @return A Cursor object, which is positioned before the first entry, or null
      * @see Cursor
      */
-    public final Cursor query(Uri uri, String[] projection,
-            String selection, String[] selectionArgs, String sortOrder) {
+    public final @Nullable Cursor query(@NonNull Uri uri, @Nullable String[] projection,
+            @Nullable String selection, @Nullable String[] selectionArgs,
+            @Nullable String sortOrder) {
         return query(uri, projection, selection, selectionArgs, sortOrder, null);
     }
 
@@ -457,9 +466,10 @@
      * @return A Cursor object, which is positioned before the first entry, or null
      * @see Cursor
      */
-    public final Cursor query(final Uri uri, String[] projection,
-            String selection, String[] selectionArgs, String sortOrder,
-            CancellationSignal cancellationSignal) {
+    public final @Nullable Cursor query(final @NonNull Uri uri, @Nullable String[] projection,
+            @Nullable String selection, @Nullable String[] selectionArgs,
+            @Nullable String sortOrder, @Nullable CancellationSignal cancellationSignal) {
+        Preconditions.checkNotNull(uri, "uri");
         IContentProvider unstableProvider = acquireUnstableProvider(uri);
         if (unstableProvider == null) {
             return null;
@@ -555,7 +565,8 @@
      *
      * @see #uncanonicalize
      */
-    public final Uri canonicalize(Uri url) {
+    public final @Nullable Uri canonicalize(@NonNull Uri url) {
+        Preconditions.checkNotNull(url, "url");
         IContentProvider provider = acquireProvider(url);
         if (provider == null) {
             return null;
@@ -590,7 +601,8 @@
      *
      * @see #canonicalize
      */
-    public final Uri uncanonicalize(Uri url) {
+    public final @Nullable Uri uncanonicalize(@NonNull Uri url) {
+        Preconditions.checkNotNull(url, "url");
         IContentProvider provider = acquireProvider(url);
         if (provider == null) {
             return null;
@@ -626,8 +638,9 @@
      * @throws FileNotFoundException if the provided URI could not be opened.
      * @see #openAssetFileDescriptor(Uri, String)
      */
-    public final InputStream openInputStream(Uri uri)
+    public final @Nullable InputStream openInputStream(@NonNull Uri uri)
             throws FileNotFoundException {
+        Preconditions.checkNotNull(uri, "uri");
         String scheme = uri.getScheme();
         if (SCHEME_ANDROID_RESOURCE.equals(scheme)) {
             // Note: left here to avoid breaking compatibility.  May be removed
@@ -658,7 +671,7 @@
      * openOutputStream(uri, "w")}.
      * @throws FileNotFoundException if the provided URI could not be opened.
      */
-    public final OutputStream openOutputStream(Uri uri)
+    public final @Nullable OutputStream openOutputStream(@NonNull Uri uri)
             throws FileNotFoundException {
         return openOutputStream(uri, "w");
     }
@@ -682,7 +695,7 @@
      * @throws FileNotFoundException if the provided URI could not be opened.
      * @see #openAssetFileDescriptor(Uri, String)
      */
-    public final OutputStream openOutputStream(Uri uri, String mode)
+    public final @Nullable OutputStream openOutputStream(@NonNull Uri uri, @NonNull String mode)
             throws FileNotFoundException {
         AssetFileDescriptor fd = openAssetFileDescriptor(uri, mode, null);
         try {
@@ -729,8 +742,8 @@
      * file exists under the URI or the mode is invalid.
      * @see #openAssetFileDescriptor(Uri, String)
      */
-    public final ParcelFileDescriptor openFileDescriptor(Uri uri, String mode)
-            throws FileNotFoundException {
+    public final @Nullable ParcelFileDescriptor openFileDescriptor(@NonNull Uri uri,
+            @NonNull String mode) throws FileNotFoundException {
         return openFileDescriptor(uri, mode, null);
     }
 
@@ -774,8 +787,9 @@
      * file exists under the URI or the mode is invalid.
      * @see #openAssetFileDescriptor(Uri, String)
      */
-    public final ParcelFileDescriptor openFileDescriptor(Uri uri,
-            String mode, CancellationSignal cancellationSignal) throws FileNotFoundException {
+    public final @Nullable ParcelFileDescriptor openFileDescriptor(@NonNull Uri uri,
+            @NonNull String mode, @Nullable CancellationSignal cancellationSignal)
+                    throws FileNotFoundException {
         AssetFileDescriptor afd = openAssetFileDescriptor(uri, mode, cancellationSignal);
         if (afd == null) {
             return null;
@@ -844,8 +858,8 @@
      * @throws FileNotFoundException Throws FileNotFoundException of no
      * file exists under the URI or the mode is invalid.
      */
-    public final AssetFileDescriptor openAssetFileDescriptor(Uri uri, String mode)
-            throws FileNotFoundException {
+    public final @Nullable AssetFileDescriptor openAssetFileDescriptor(@NonNull Uri uri,
+            @NonNull String mode) throws FileNotFoundException {
         return openAssetFileDescriptor(uri, mode, null);
     }
 
@@ -900,8 +914,12 @@
      * @throws FileNotFoundException Throws FileNotFoundException of no
      * file exists under the URI or the mode is invalid.
      */
-    public final AssetFileDescriptor openAssetFileDescriptor(Uri uri,
-            String mode, CancellationSignal cancellationSignal) throws FileNotFoundException {
+    public final @Nullable AssetFileDescriptor openAssetFileDescriptor(@NonNull Uri uri,
+            @NonNull String mode, @Nullable CancellationSignal cancellationSignal)
+                    throws FileNotFoundException {
+        Preconditions.checkNotNull(uri, "uri");
+        Preconditions.checkNotNull(mode, "mode");
+
         String scheme = uri.getScheme();
         if (SCHEME_ANDROID_RESOURCE.equals(scheme)) {
             if (!"r".equals(mode)) {
@@ -1023,8 +1041,8 @@
      * @throws FileNotFoundException Throws FileNotFoundException of no
      * data of the desired type exists under the URI.
      */
-    public final AssetFileDescriptor openTypedAssetFileDescriptor(
-            Uri uri, String mimeType, Bundle opts) throws FileNotFoundException {
+    public final @Nullable AssetFileDescriptor openTypedAssetFileDescriptor(@NonNull Uri uri,
+            @NonNull String mimeType, @Nullable Bundle opts) throws FileNotFoundException {
         return openTypedAssetFileDescriptor(uri, mimeType, opts, null);
     }
 
@@ -1059,9 +1077,12 @@
      * @throws FileNotFoundException Throws FileNotFoundException of no
      * data of the desired type exists under the URI.
      */
-    public final AssetFileDescriptor openTypedAssetFileDescriptor(Uri uri,
-            String mimeType, Bundle opts, CancellationSignal cancellationSignal)
-            throws FileNotFoundException {
+    public final @Nullable AssetFileDescriptor openTypedAssetFileDescriptor(@NonNull Uri uri,
+            @NonNull String mimeType, @Nullable Bundle opts,
+            @Nullable CancellationSignal cancellationSignal) throws FileNotFoundException {
+        Preconditions.checkNotNull(uri, "uri");
+        Preconditions.checkNotNull(mimeType, "mimeType");
+
         IContentProvider unstableProvider = acquireUnstableProvider(uri);
         if (unstableProvider == null) {
             throw new FileNotFoundException("No content provider: " + uri);
@@ -1197,8 +1218,10 @@
      *               the field. Passing an empty ContentValues will create an empty row.
      * @return the URL of the newly created row.
      */
-    public final Uri insert(Uri url, ContentValues values)
-    {
+    public final @Nullable Uri insert(@NonNull Uri url, @NonNull ContentValues values) {
+        Preconditions.checkNotNull(url, "url");
+        Preconditions.checkNotNull(values, "values");
+
         IContentProvider provider = acquireProvider(url);
         if (provider == null) {
             throw new IllegalArgumentException("Unknown URL " + url);
@@ -1234,9 +1257,11 @@
      * @throws RemoteException thrown if a RemoteException is encountered while attempting
      *   to communicate with a remote provider.
      */
-    public ContentProviderResult[] applyBatch(String authority,
-            ArrayList<ContentProviderOperation> operations)
-            throws RemoteException, OperationApplicationException {
+    public @NonNull ContentProviderResult[] applyBatch(@NonNull String authority,
+            @NonNull ArrayList<ContentProviderOperation> operations)
+                    throws RemoteException, OperationApplicationException {
+        Preconditions.checkNotNull(authority, "authority");
+        Preconditions.checkNotNull(operations, "operations");
         ContentProviderClient provider = acquireContentProviderClient(authority);
         if (provider == null) {
             throw new IllegalArgumentException("Unknown authority " + authority);
@@ -1258,8 +1283,9 @@
      *               the field. Passing null will create an empty row.
      * @return the number of newly created rows.
      */
-    public final int bulkInsert(Uri url, ContentValues[] values)
-    {
+    public final int bulkInsert(@NonNull Uri url, @NonNull ContentValues[] values) {
+        Preconditions.checkNotNull(url, "url");
+        Preconditions.checkNotNull(values, "values");
         IContentProvider provider = acquireProvider(url);
         if (provider == null) {
             throw new IllegalArgumentException("Unknown URL " + url);
@@ -1289,8 +1315,9 @@
                     (excluding the WHERE itself).
      * @return The number of rows deleted.
      */
-    public final int delete(Uri url, String where, String[] selectionArgs)
-    {
+    public final int delete(@NonNull Uri url, @Nullable String where,
+            @Nullable String[] selectionArgs) {
+        Preconditions.checkNotNull(url, "url");
         IContentProvider provider = acquireProvider(url);
         if (provider == null) {
             throw new IllegalArgumentException("Unknown URL " + url);
@@ -1323,8 +1350,10 @@
      * @return the number of rows updated.
      * @throws NullPointerException if uri or values are null
      */
-    public final int update(Uri uri, ContentValues values, String where,
-            String[] selectionArgs) {
+    public final int update(@NonNull Uri uri, @NonNull ContentValues values,
+            @Nullable String where, @Nullable String[] selectionArgs) {
+        Preconditions.checkNotNull(uri, "uri");
+        Preconditions.checkNotNull(values, "values");
         IContentProvider provider = acquireProvider(uri);
         if (provider == null) {
             throw new IllegalArgumentException("Unknown URI " + uri);
@@ -1358,14 +1387,10 @@
      * @throws NullPointerException if uri or method is null
      * @throws IllegalArgumentException if uri is not known
      */
-    public final Bundle call(
-            Uri uri, String method, @Nullable String arg, @Nullable Bundle extras) {
-        if (uri == null) {
-            throw new NullPointerException("uri == null");
-        }
-        if (method == null) {
-            throw new NullPointerException("method == null");
-        }
+    public final @Nullable Bundle call(@NonNull Uri uri, @NonNull String method,
+            @Nullable String arg, @Nullable Bundle extras) {
+        Preconditions.checkNotNull(uri, "uri");
+        Preconditions.checkNotNull(method, "method");
         IContentProvider provider = acquireProvider(uri);
         if (provider == null) {
             throw new IllegalArgumentException("Unknown URI " + uri);
@@ -1467,12 +1492,12 @@
      * @return a {@link ContentProviderClient} that is associated with the {@link ContentProvider}
      * that services the content at uri or null if there isn't one.
      */
-    public final ContentProviderClient acquireContentProviderClient(Uri uri) {
+    public final @Nullable ContentProviderClient acquireContentProviderClient(@NonNull Uri uri) {
+        Preconditions.checkNotNull(uri, "uri");
         IContentProvider provider = acquireProvider(uri);
         if (provider != null) {
             return new ContentProviderClient(this, provider, true);
         }
-
         return null;
     }
 
@@ -1487,7 +1512,9 @@
      * @return a {@link ContentProviderClient} that is associated with the {@link ContentProvider}
      * with the authority of name or null if there isn't one.
      */
-    public final ContentProviderClient acquireContentProviderClient(String name) {
+    public final @Nullable ContentProviderClient acquireContentProviderClient(
+            @NonNull String name) {
+        Preconditions.checkNotNull(name, "name");
         IContentProvider provider = acquireProvider(name);
         if (provider != null) {
             return new ContentProviderClient(this, provider, true);
@@ -1512,7 +1539,9 @@
      * can acquire a new one if you would like to try to restart the provider
      * and perform new operations on it.
      */
-    public final ContentProviderClient acquireUnstableContentProviderClient(Uri uri) {
+    public final @Nullable ContentProviderClient acquireUnstableContentProviderClient(
+            @NonNull Uri uri) {
+        Preconditions.checkNotNull(uri, "uri");
         IContentProvider provider = acquireUnstableProvider(uri);
         if (provider != null) {
             return new ContentProviderClient(this, provider, false);
@@ -1537,7 +1566,9 @@
      * can acquire a new one if you would like to try to restart the provider
      * and perform new operations on it.
      */
-    public final ContentProviderClient acquireUnstableContentProviderClient(String name) {
+    public final @Nullable ContentProviderClient acquireUnstableContentProviderClient(
+            @NonNull String name) {
+        Preconditions.checkNotNull(name, "name");
         IContentProvider provider = acquireUnstableProvider(name);
         if (provider != null) {
             return new ContentProviderClient(this, provider, false);
@@ -1559,8 +1590,10 @@
      * @param observer The object that receives callbacks when changes occur.
      * @see #unregisterContentObserver
      */
-    public final void registerContentObserver(Uri uri, boolean notifyForDescendents,
-            ContentObserver observer) {
+    public final void registerContentObserver(@NonNull Uri uri, boolean notifyForDescendents,
+            @NonNull ContentObserver observer) {
+        Preconditions.checkNotNull(uri, "uri");
+        Preconditions.checkNotNull(observer, "observer");
         registerContentObserver(uri, notifyForDescendents, observer, UserHandle.myUserId());
     }
 
@@ -1580,7 +1613,8 @@
      * @param observer The previously registered observer that is no longer needed.
      * @see #registerContentObserver
      */
-    public final void unregisterContentObserver(ContentObserver observer) {
+    public final void unregisterContentObserver(@NonNull ContentObserver observer) {
+        Preconditions.checkNotNull(observer, "observer");
         try {
             IContentObserver contentObserver = observer.releaseContentObserver();
             if (contentObserver != null) {
@@ -1603,7 +1637,7 @@
      * has requested to receive self-change notifications by implementing
      * {@link ContentObserver#deliverSelfNotifications()} to return true.
      */
-    public void notifyChange(Uri uri, ContentObserver observer) {
+    public void notifyChange(@NonNull Uri uri, @Nullable ContentObserver observer) {
         notifyChange(uri, observer, true /* sync to network */);
     }
 
@@ -1623,7 +1657,9 @@
      * @param syncToNetwork If true, attempt to sync the change to the network.
      * @see #requestSync(android.accounts.Account, String, android.os.Bundle)
      */
-    public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) {
+    public void notifyChange(@NonNull Uri uri, @Nullable ContentObserver observer,
+            boolean syncToNetwork) {
+        Preconditions.checkNotNull(uri, "uri");
         notifyChange(uri, observer, syncToNetwork, UserHandle.myUserId());
     }
 
@@ -1653,7 +1689,9 @@
      *
      * @see #getPersistedUriPermissions()
      */
-    public void takePersistableUriPermission(Uri uri, @Intent.AccessUriMode int modeFlags) {
+    public void takePersistableUriPermission(@NonNull Uri uri,
+            @Intent.AccessUriMode int modeFlags) {
+        Preconditions.checkNotNull(uri, "uri");
         try {
             ActivityManagerNative.getDefault().takePersistableUriPermission(
                     ContentProvider.getUriWithoutUserId(uri), modeFlags, resolveUserId(uri));
@@ -1669,7 +1707,9 @@
      *
      * @see #getPersistedUriPermissions()
      */
-    public void releasePersistableUriPermission(Uri uri, @Intent.AccessUriMode int modeFlags) {
+    public void releasePersistableUriPermission(@NonNull Uri uri,
+            @Intent.AccessUriMode int modeFlags) {
+        Preconditions.checkNotNull(uri, "uri");
         try {
             ActivityManagerNative.getDefault().releasePersistableUriPermission(
                     ContentProvider.getUriWithoutUserId(uri), modeFlags, resolveUserId(uri));
@@ -1686,7 +1726,7 @@
      * @see #takePersistableUriPermission(Uri, int)
      * @see #releasePersistableUriPermission(Uri, int)
      */
-    public List<UriPermission> getPersistedUriPermissions() {
+    public @NonNull List<UriPermission> getPersistedUriPermissions() {
         try {
             return ActivityManagerNative.getDefault()
                     .getPersistedUriPermissions(mPackageName, true).getList();
@@ -1701,7 +1741,7 @@
      * <em>from</em> the calling app. Only grants taken with
      * {@link #takePersistableUriPermission(Uri, int)} are returned.
      */
-    public List<UriPermission> getOutgoingPersistedUriPermissions() {
+    public @NonNull List<UriPermission> getOutgoingPersistedUriPermissions() {
         try {
             return ActivityManagerNative.getDefault()
                     .getPersistedUriPermissions(mPackageName, false).getList();