diff options
| -rw-r--r-- | core/java/android/content/ContentProvider.java | 91 | ||||
| -rw-r--r-- | core/java/android/content/ContentResolver.java | 156 |
2 files changed, 146 insertions, 101 deletions
diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java index 72e701ddb16b..d478f4a6150e 100644 --- a/core/java/android/content/ContentProvider.java +++ b/core/java/android/content/ContentProvider.java @@ -19,6 +19,7 @@ package android.content; 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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * {@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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * <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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * <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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * <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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * 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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * 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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * 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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * 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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * 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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * 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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @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 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @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 96a80e70c3df..bccd144f2f6c 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 android.util.Log; 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 @@ public abstract class ContentResolver { * 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 @@ public abstract class ContentResolver { * 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 @@ public abstract class ContentResolver { * @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 @@ public abstract class ContentResolver { * @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 @@ public abstract class ContentResolver { * * @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 @@ public abstract class ContentResolver { * * @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 @@ public abstract class ContentResolver { * @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 @@ public abstract class ContentResolver { * 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 @@ public abstract class ContentResolver { * @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 @@ public abstract class ContentResolver { * 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 @@ public abstract class ContentResolver { * 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 @@ public abstract class ContentResolver { * @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 @@ public abstract class ContentResolver { * @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 @@ public abstract class ContentResolver { * @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 @@ public abstract class ContentResolver { * @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 @@ public abstract class ContentResolver { * 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 @@ public abstract class ContentResolver { * @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 @@ public abstract class ContentResolver { * 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 @@ public abstract class ContentResolver { (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 @@ public abstract class ContentResolver { * @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 @@ public abstract class ContentResolver { * @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 @@ public abstract class ContentResolver { * @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 @@ public abstract class ContentResolver { * @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 @@ public abstract class ContentResolver { * 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 @@ public abstract class ContentResolver { * 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 @@ public abstract class ContentResolver { * @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 @@ public abstract class ContentResolver { * @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 @@ public abstract class ContentResolver { * 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 @@ public abstract class ContentResolver { * @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 @@ public abstract class ContentResolver { * * @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 @@ public abstract class ContentResolver { * * @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 @@ public abstract class ContentResolver { * @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 @@ public abstract class ContentResolver { * <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(); |