diff options
15 files changed, 324 insertions, 73 deletions
diff --git a/api/current.txt b/api/current.txt index 037aae086cd1..bf7dedf711d5 100644 --- a/api/current.txt +++ b/api/current.txt @@ -9227,11 +9227,31 @@ package android.content { field public static final android.os.Parcelable.Creator<android.content.ComponentName> CREATOR; } - public abstract class ContentProvider implements android.content.ComponentCallbacks2 { + public abstract interface ContentInterface { + method public abstract android.content.ContentProviderResult[] applyBatch(java.lang.String, java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException, android.os.RemoteException; + method public abstract int bulkInsert(android.net.Uri, android.content.ContentValues[]) throws android.os.RemoteException; + method public abstract android.os.Bundle call(java.lang.String, java.lang.String, java.lang.String, android.os.Bundle) throws android.os.RemoteException; + method public abstract android.net.Uri canonicalize(android.net.Uri) throws android.os.RemoteException; + method public abstract int delete(android.net.Uri, java.lang.String, java.lang.String[]) throws android.os.RemoteException; + method public abstract java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String) throws android.os.RemoteException; + method public abstract java.lang.String getType(android.net.Uri) throws android.os.RemoteException; + method public abstract android.net.Uri insert(android.net.Uri, android.content.ContentValues) throws android.os.RemoteException; + method public abstract android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException; + method public abstract android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException; + method public abstract android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException; + method public abstract android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal) throws android.os.RemoteException; + method public abstract boolean refresh(android.net.Uri, android.os.Bundle, android.os.CancellationSignal) throws android.os.RemoteException; + method public abstract android.net.Uri uncanonicalize(android.net.Uri) throws android.os.RemoteException; + method public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]) throws android.os.RemoteException; + } + + public abstract class ContentProvider implements android.content.ComponentCallbacks2 android.content.ContentInterface { ctor public ContentProvider(); + method public android.content.ContentProviderResult[] applyBatch(java.lang.String, java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException; method public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException; method public void attachInfo(android.content.Context, android.content.pm.ProviderInfo); method public int bulkInsert(android.net.Uri, android.content.ContentValues[]); + method public android.os.Bundle call(java.lang.String, java.lang.String, java.lang.String, android.os.Bundle); method public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle); method public android.net.Uri canonicalize(android.net.Uri); method public final android.content.ContentProvider.CallingIdentity clearCallingIdentity(); @@ -9278,10 +9298,12 @@ package android.content { method public abstract void writeDataToPipe(android.os.ParcelFileDescriptor, android.net.Uri, java.lang.String, android.os.Bundle, T); } - public class ContentProviderClient implements java.lang.AutoCloseable { + public class ContentProviderClient implements java.lang.AutoCloseable android.content.ContentInterface { method public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException, android.os.RemoteException; + method public android.content.ContentProviderResult[] applyBatch(java.lang.String, java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException, android.os.RemoteException; method public int bulkInsert(android.net.Uri, android.content.ContentValues[]) throws android.os.RemoteException; method public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle) throws android.os.RemoteException; + method public android.os.Bundle call(java.lang.String, java.lang.String, java.lang.String, android.os.Bundle) throws android.os.RemoteException; method public final android.net.Uri canonicalize(android.net.Uri) throws android.os.RemoteException; method public void close(); method public static void closeQuietly(android.content.ContentProviderClient); @@ -9294,6 +9316,7 @@ package android.content { method public android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException; method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException, android.os.RemoteException; method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException; + method public final android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException; method public final android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException, android.os.RemoteException; method public final android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException, android.os.RemoteException; method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String) throws android.os.RemoteException; @@ -9358,7 +9381,7 @@ package android.content { method public void setKeepUpdated(boolean); } - public abstract class ContentResolver { + public abstract class ContentResolver implements android.content.ContentInterface { ctor public ContentResolver(android.content.Context); method public final android.content.ContentProviderClient acquireContentProviderClient(android.net.Uri); method public final android.content.ContentProviderClient acquireContentProviderClient(java.lang.String); @@ -9369,6 +9392,7 @@ package android.content { method public android.content.ContentProviderResult[] applyBatch(java.lang.String, java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException, android.os.RemoteException; method public final int bulkInsert(android.net.Uri, android.content.ContentValues[]); method public final android.os.Bundle call(android.net.Uri, java.lang.String, java.lang.String, android.os.Bundle); + method public final android.os.Bundle call(java.lang.String, java.lang.String, java.lang.String, android.os.Bundle); method public deprecated void cancelSync(android.net.Uri); method public static void cancelSync(android.accounts.Account, java.lang.String); method public static void cancelSync(android.content.SyncRequest); @@ -9392,13 +9416,16 @@ package android.content { method public void notifyChange(android.net.Uri, android.database.ContentObserver); method public void notifyChange(android.net.Uri, android.database.ContentObserver, boolean); method public void notifyChange(android.net.Uri, android.database.ContentObserver, int); + method public final android.content.res.AssetFileDescriptor openAssetFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException; method public final android.content.res.AssetFileDescriptor openAssetFileDescriptor(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException; method public final android.content.res.AssetFileDescriptor openAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException; + method public final android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException; method public final android.os.ParcelFileDescriptor openFileDescriptor(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException; method public final android.os.ParcelFileDescriptor openFileDescriptor(android.net.Uri, java.lang.String, android.os.CancellationSignal) throws java.io.FileNotFoundException; method public final java.io.InputStream openInputStream(android.net.Uri) throws java.io.FileNotFoundException; method public final java.io.OutputStream openOutputStream(android.net.Uri) throws java.io.FileNotFoundException; method public final java.io.OutputStream openOutputStream(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException; + method public final android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException; method public final android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException; method public final android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle, android.os.CancellationSignal) throws java.io.FileNotFoundException; method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String); diff --git a/api/test-current.txt b/api/test-current.txt index 46cbb52f6efa..b6a42ec7e8b7 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -299,7 +299,7 @@ package android.bluetooth { package android.content { - public abstract class ContentResolver { + public abstract class ContentResolver implements android.content.ContentInterface { method public static java.lang.String[] getSyncAdapterPackagesForAuthorityAsUser(java.lang.String, int); } diff --git a/cmds/content/src/com/android/commands/content/Content.java b/cmds/content/src/com/android/commands/content/Content.java index 52a2ab407f91..55dbc17dba5d 100644 --- a/cmds/content/src/com/android/commands/content/Content.java +++ b/cmds/content/src/com/android/commands/content/Content.java @@ -557,7 +557,7 @@ public class Content { @Override public void onExecute(IContentProvider provider) throws Exception { - Bundle result = provider.call(null, mMethod, mArg, mExtras); + Bundle result = provider.call(null, mUri.getAuthority(), mMethod, mArg, mExtras); if (result != null) { result.size(); // unpack } diff --git a/core/java/android/content/ContentInterface.java b/core/java/android/content/ContentInterface.java new file mode 100644 index 000000000000..3d732eb7678d --- /dev/null +++ b/core/java/android/content/ContentInterface.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.content; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.res.AssetFileDescriptor; +import android.database.Cursor; +import android.net.Uri; +import android.os.Bundle; +import android.os.CancellationSignal; +import android.os.ParcelFileDescriptor; +import android.os.RemoteException; + +import java.io.FileNotFoundException; +import java.util.ArrayList; + +/** + * Interface representing calls that can be made to {@link ContentProvider} + * instances. + * <p> + * These methods have been extracted into a general interface so that APIs can + * be flexible in accepting either a {@link ContentProvider}, a + * {@link ContentResolver}, or a {@link ContentProviderClient}. + */ +public interface ContentInterface { + public @Nullable Cursor query(@NonNull Uri uri, @Nullable String[] projection, + @Nullable Bundle queryArgs, @Nullable CancellationSignal cancellationSignal) + throws RemoteException; + + public @Nullable String getType(@NonNull Uri uri) throws RemoteException; + + public @Nullable String[] getStreamTypes(@NonNull Uri uri, @NonNull String mimeTypeFilter) + throws RemoteException; + + public @Nullable Uri canonicalize(@NonNull Uri uri) throws RemoteException; + + public @Nullable Uri uncanonicalize(@NonNull Uri uri) throws RemoteException; + + public boolean refresh(@NonNull Uri uri, @Nullable Bundle args, + @Nullable CancellationSignal cancellationSignal) throws RemoteException; + + public @Nullable Uri insert(@NonNull Uri uri, @Nullable ContentValues initialValues) + throws RemoteException; + + public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] initialValues) + throws RemoteException; + + public int delete(@NonNull Uri uri, @Nullable String selection, + @Nullable String[] selectionArgs) throws RemoteException; + + public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, + @Nullable String[] selectionArgs) throws RemoteException; + + public @Nullable ParcelFileDescriptor openFile(@NonNull Uri uri, @NonNull String mode, + @Nullable CancellationSignal signal) throws RemoteException, FileNotFoundException; + + public @Nullable AssetFileDescriptor openAssetFile(@NonNull Uri uri, @NonNull String mode, + @Nullable CancellationSignal signal) throws RemoteException, FileNotFoundException; + + public @Nullable AssetFileDescriptor openTypedAssetFile(@NonNull Uri uri, + @NonNull String mimeTypeFilter, @Nullable Bundle opts, + @Nullable CancellationSignal signal) throws RemoteException, FileNotFoundException; + + public @NonNull ContentProviderResult[] applyBatch(@NonNull String authority, + @NonNull ArrayList<ContentProviderOperation> operations) + throws RemoteException, OperationApplicationException; + + public @Nullable Bundle call(@NonNull String authority, @NonNull String method, + @Nullable String arg, @Nullable Bundle extras) throws RemoteException; +} diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java index 0f72fd3c7631..5a12e4ecca1b 100644 --- a/core/java/android/content/ContentProvider.java +++ b/core/java/android/content/ContentProvider.java @@ -105,7 +105,7 @@ import java.util.Objects; * developer guide.</p> * </div> */ -public abstract class ContentProvider implements ComponentCallbacks2 { +public abstract class ContentProvider implements ContentInterface, ComponentCallbacks2 { private static final String TAG = "ContentProvider"; @@ -324,7 +324,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { } @Override - public ContentProviderResult[] applyBatch(String callingPkg, + public ContentProviderResult[] applyBatch(String callingPkg, String authority, ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { int numOperations = operations.size(); @@ -356,7 +356,8 @@ public abstract class ContentProvider implements ComponentCallbacks2 { Trace.traceBegin(TRACE_TAG_DATABASE, "applyBatch"); final String original = setCallingPackage(callingPkg); try { - ContentProviderResult[] results = ContentProvider.this.applyBatch(operations); + ContentProviderResult[] results = ContentProvider.this.applyBatch(authority, + operations); if (results != null) { for (int i = 0; i < results.length ; i++) { if (userIds[i] != UserHandle.USER_CURRENT) { @@ -444,13 +445,13 @@ public abstract class ContentProvider implements ComponentCallbacks2 { } @Override - public Bundle call( - String callingPkg, String method, @Nullable String arg, @Nullable Bundle extras) { + public Bundle call(String callingPkg, String authority, String method, @Nullable String arg, + @Nullable Bundle extras) { Bundle.setDefusable(extras, true); Trace.traceBegin(TRACE_TAG_DATABASE, "call"); final String original = setCallingPackage(callingPkg); try { - return ContentProvider.this.call(method, arg, extras); + return ContentProvider.this.call(authority, method, arg, extras); } finally { setCallingPackage(original); Trace.traceEnd(TRACE_TAG_DATABASE); @@ -1255,6 +1256,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * or {@code null}. * @return a Cursor or {@code null}. */ + @Override public @Nullable Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable Bundle queryArgs, @Nullable CancellationSignal cancellationSignal) { queryArgs = queryArgs != null ? queryArgs : Bundle.EMPTY; @@ -1293,6 +1295,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. */ + @Override public abstract @Nullable String getType(@NonNull Uri uri); /** @@ -1325,6 +1328,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. */ + @Override public @Nullable Uri canonicalize(@NonNull Uri url) { return null; } @@ -1343,6 +1347,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * the data identified by the canonical representation can not be found in * the current environment. */ + @Override public @Nullable Uri uncanonicalize(@NonNull Uri url) { return url; } @@ -1369,6 +1374,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * canceled the refresh request. * @return true if the provider actually tried refreshing. */ + @Override public boolean refresh(Uri uri, @Nullable Bundle args, @Nullable CancellationSignal cancellationSignal) { return false; @@ -1403,6 +1409,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * This must not be {@code null}. * @return The URI for the newly inserted item. */ + @Override public abstract @Nullable Uri insert(@NonNull Uri uri, @Nullable ContentValues values); /** @@ -1420,6 +1427,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * This must not be {@code null}. * @return The number of values that were inserted. */ + @Override public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) { int numValues = values.length; for (int i = 0; i < numValues; i++) { @@ -1448,6 +1456,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @return The number of rows affected. * @throws SQLException */ + @Override public abstract int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs); @@ -1468,6 +1477,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @param selection An optional filter to match rows to update. * @return the number of rows affected. */ + @Override public abstract int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs); @@ -1604,6 +1614,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @see #getType(android.net.Uri) * @see ParcelFileDescriptor#parseMode(String) */ + @Override public @Nullable ParcelFileDescriptor openFile(@NonNull Uri uri, @NonNull String mode, @Nullable CancellationSignal signal) throws FileNotFoundException { return openFile(uri, mode); @@ -1723,6 +1734,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @see #openFileHelper(Uri, String) * @see #getType(android.net.Uri) */ + @Override public @Nullable AssetFileDescriptor openAssetFile(@NonNull Uri uri, @NonNull String mode, @Nullable CancellationSignal signal) throws FileNotFoundException { return openAssetFile(uri, mode); @@ -1789,6 +1801,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @see #openTypedAssetFile(Uri, String, Bundle) * @see ClipDescription#compareMimeTypes(String, String) */ + @Override public @Nullable String[] getStreamTypes(@NonNull Uri uri, @NonNull String mimeTypeFilter) { return null; } @@ -1905,6 +1918,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @see #openAssetFile(Uri, String) * @see ClipDescription#compareMimeTypes(String, String) */ + @Override public @Nullable AssetFileDescriptor openTypedAssetFile(@NonNull Uri uri, @NonNull String mimeTypeFilter, @Nullable Bundle opts, @Nullable CancellationSignal signal) throws FileNotFoundException { @@ -2059,6 +2073,13 @@ public abstract class ContentProvider implements ComponentCallbacks2 { * @throws OperationApplicationException thrown if any operation fails. * @see ContentProviderOperation#apply */ + @Override + public @NonNull ContentProviderResult[] applyBatch(@NonNull String authority, + @NonNull ArrayList<ContentProviderOperation> operations) + throws OperationApplicationException { + return applyBatch(operations); + } + public @NonNull ContentProviderResult[] applyBatch( @NonNull ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { @@ -2088,6 +2109,12 @@ 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. */ + @Override + public @Nullable Bundle call(@NonNull String authority, @NonNull String method, + @Nullable String arg, @Nullable Bundle extras) { + return call(method, arg, extras); + } + public @Nullable Bundle call(@NonNull String method, @Nullable String arg, @Nullable Bundle extras) { return null; @@ -2133,6 +2160,19 @@ public abstract class ContentProvider implements ComponentCallbacks2 { writer.println("nothing to dump"); } + private void validateIncomingAuthority(String authority) throws SecurityException { + if (!matchesOurAuthorities(getAuthorityWithoutUserId(authority))) { + String message = "The authority " + authority + " does not match the one of the " + + "contentProvider: "; + if (mAuthority != null) { + message += mAuthority; + } else { + message += Arrays.toString(mAuthorities); + } + throw new SecurityException(message); + } + } + /** @hide */ @VisibleForTesting public Uri validateIncomingUri(Uri uri) throws SecurityException { @@ -2144,16 +2184,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { + mContext.getUserId() + " with a uri belonging to user " + userId); } } - if (!matchesOurAuthorities(getAuthorityWithoutUserId(auth))) { - String message = "The authority of the uri " + uri + " does not match the one of the " - + "contentProvider: "; - if (mAuthority != null) { - message += mAuthority; - } else { - message += Arrays.toString(mAuthorities); - } - throw new SecurityException(message); - } + validateIncomingAuthority(auth); // Normalize the path by removing any empty path segments, which can be // a source of security issues. diff --git a/core/java/android/content/ContentProviderClient.java b/core/java/android/content/ContentProviderClient.java index d315f4945ffe..cd7a1a101265 100644 --- a/core/java/android/content/ContentProviderClient.java +++ b/core/java/android/content/ContentProviderClient.java @@ -65,7 +65,7 @@ import java.util.concurrent.atomic.AtomicBoolean; * on the ContentProviderClient those calls are made from until you are finished * with the data they have returned. */ -public class ContentProviderClient implements AutoCloseable { +public class ContentProviderClient implements ContentInterface, AutoCloseable { private static final String TAG = "ContentProviderClient"; @GuardedBy("ContentProviderClient.class") @@ -76,6 +76,7 @@ public class ContentProviderClient implements AutoCloseable { private final IContentProvider mContentProvider; @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) private final String mPackageName; + private final String mAuthority; private final boolean mStable; private final AtomicBoolean mClosed = new AtomicBoolean(); @@ -86,12 +87,20 @@ public class ContentProviderClient implements AutoCloseable { /** {@hide} */ @VisibleForTesting - public ContentProviderClient( - ContentResolver contentResolver, IContentProvider contentProvider, boolean stable) { + public ContentProviderClient(ContentResolver contentResolver, IContentProvider contentProvider, + boolean stable) { + // Only used for testing, so use a fake authority + this(contentResolver, contentProvider, "unknown", stable); + } + + /** {@hide} */ + public ContentProviderClient(ContentResolver contentResolver, IContentProvider contentProvider, + String authority, boolean stable) { mContentResolver = contentResolver; mContentProvider = contentProvider; mPackageName = contentResolver.mPackageName; + mAuthority = authority; mStable = stable; mCloseGuard.open("close"); @@ -153,6 +162,7 @@ public class ContentProviderClient implements AutoCloseable { } /** See {@link ContentProvider#query ContentProvider.query} */ + @Override public @Nullable Cursor query(@NonNull Uri uri, @Nullable String[] projection, Bundle queryArgs, @Nullable CancellationSignal cancellationSignal) throws RemoteException { @@ -183,6 +193,7 @@ public class ContentProviderClient implements AutoCloseable { } /** See {@link ContentProvider#getType ContentProvider.getType} */ + @Override public @Nullable String getType(@NonNull Uri url) throws RemoteException { Preconditions.checkNotNull(url, "url"); @@ -200,6 +211,7 @@ public class ContentProviderClient implements AutoCloseable { } /** See {@link ContentProvider#getStreamTypes ContentProvider.getStreamTypes} */ + @Override public @Nullable String[] getStreamTypes(@NonNull Uri url, @NonNull String mimeTypeFilter) throws RemoteException { Preconditions.checkNotNull(url, "url"); @@ -219,6 +231,7 @@ public class ContentProviderClient implements AutoCloseable { } /** See {@link ContentProvider#canonicalize} */ + @Override public final @Nullable Uri canonicalize(@NonNull Uri url) throws RemoteException { Preconditions.checkNotNull(url, "url"); @@ -236,6 +249,7 @@ public class ContentProviderClient implements AutoCloseable { } /** See {@link ContentProvider#uncanonicalize} */ + @Override public final @Nullable Uri uncanonicalize(@NonNull Uri url) throws RemoteException { Preconditions.checkNotNull(url, "url"); @@ -253,6 +267,7 @@ public class ContentProviderClient implements AutoCloseable { } /** See {@link ContentProvider#refresh} */ + @Override public boolean refresh(Uri url, @Nullable Bundle args, @Nullable CancellationSignal cancellationSignal) throws RemoteException { Preconditions.checkNotNull(url, "url"); @@ -277,6 +292,7 @@ public class ContentProviderClient implements AutoCloseable { } /** See {@link ContentProvider#insert ContentProvider.insert} */ + @Override public @Nullable Uri insert(@NonNull Uri url, @Nullable ContentValues initialValues) throws RemoteException { Preconditions.checkNotNull(url, "url"); @@ -295,6 +311,7 @@ public class ContentProviderClient implements AutoCloseable { } /** See {@link ContentProvider#bulkInsert ContentProvider.bulkInsert} */ + @Override public int bulkInsert(@NonNull Uri url, @NonNull ContentValues[] initialValues) throws RemoteException { Preconditions.checkNotNull(url, "url"); @@ -314,6 +331,7 @@ public class ContentProviderClient implements AutoCloseable { } /** See {@link ContentProvider#delete ContentProvider.delete} */ + @Override public int delete(@NonNull Uri url, @Nullable String selection, @Nullable String[] selectionArgs) throws RemoteException { Preconditions.checkNotNull(url, "url"); @@ -332,6 +350,7 @@ public class ContentProviderClient implements AutoCloseable { } /** See {@link ContentProvider#update ContentProvider.update} */ + @Override public int update(@NonNull Uri url, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) throws RemoteException { Preconditions.checkNotNull(url, "url"); @@ -368,6 +387,7 @@ public class ContentProviderClient implements AutoCloseable { * you use the {@link ContentResolver#openFileDescriptor * ContentResolver.openFileDescriptor} API instead. */ + @Override public @Nullable ParcelFileDescriptor openFile(@NonNull Uri url, @NonNull String mode, @Nullable CancellationSignal signal) throws RemoteException, FileNotFoundException { Preconditions.checkNotNull(url, "url"); @@ -411,6 +431,7 @@ public class ContentProviderClient implements AutoCloseable { * you use the {@link ContentResolver#openAssetFileDescriptor * ContentResolver.openAssetFileDescriptor} API instead. */ + @Override public @Nullable AssetFileDescriptor openAssetFile(@NonNull Uri url, @NonNull String mode, @Nullable CancellationSignal signal) throws RemoteException, FileNotFoundException { Preconditions.checkNotNull(url, "url"); @@ -446,8 +467,15 @@ public class ContentProviderClient implements AutoCloseable { public final @Nullable AssetFileDescriptor openTypedAssetFileDescriptor(@NonNull Uri uri, @NonNull String mimeType, @Nullable Bundle opts, @Nullable CancellationSignal signal) throws RemoteException, FileNotFoundException { + return openTypedAssetFile(uri, mimeType, opts, signal); + } + + @Override + public final @Nullable AssetFileDescriptor openTypedAssetFile(@NonNull Uri uri, + @NonNull String mimeTypeFilter, @Nullable Bundle opts, + @Nullable CancellationSignal signal) throws RemoteException, FileNotFoundException { Preconditions.checkNotNull(uri, "uri"); - Preconditions.checkNotNull(mimeType, "mimeType"); + Preconditions.checkNotNull(mimeTypeFilter, "mimeTypeFilter"); beforeRemote(); try { @@ -458,7 +486,7 @@ public class ContentProviderClient implements AutoCloseable { signal.setRemote(remoteSignal); } return mContentProvider.openTypedAssetFile( - mPackageName, uri, mimeType, opts, remoteSignal); + mPackageName, uri, mimeTypeFilter, opts, remoteSignal); } catch (DeadObjectException e) { if (!mStable) { mContentResolver.unstableProviderDied(mContentProvider); @@ -472,12 +500,20 @@ public class ContentProviderClient implements AutoCloseable { /** See {@link ContentProvider#applyBatch ContentProvider.applyBatch} */ public @NonNull ContentProviderResult[] applyBatch( @NonNull ArrayList<ContentProviderOperation> operations) - throws RemoteException, OperationApplicationException { + throws RemoteException, OperationApplicationException { + return applyBatch(mAuthority, operations); + } + + /** See {@link ContentProvider#applyBatch ContentProvider.applyBatch} */ + @Override + public @NonNull ContentProviderResult[] applyBatch(@NonNull String authority, + @NonNull ArrayList<ContentProviderOperation> operations) + throws RemoteException, OperationApplicationException { Preconditions.checkNotNull(operations, "operations"); beforeRemote(); try { - return mContentProvider.applyBatch(mPackageName, operations); + return mContentProvider.applyBatch(mPackageName, authority, operations); } catch (DeadObjectException e) { if (!mStable) { mContentResolver.unstableProviderDied(mContentProvider); @@ -491,11 +527,19 @@ public class ContentProviderClient implements AutoCloseable { /** See {@link ContentProvider#call(String, String, Bundle)} */ public @Nullable Bundle call(@NonNull String method, @Nullable String arg, @Nullable Bundle extras) throws RemoteException { + return call(mAuthority, method, arg, extras); + } + + /** See {@link ContentProvider#call(String, String, Bundle)} */ + @Override + public @Nullable Bundle call(@NonNull String authority, @NonNull String method, + @Nullable String arg, @Nullable Bundle extras) throws RemoteException { + Preconditions.checkNotNull(authority, "authority"); Preconditions.checkNotNull(method, "method"); beforeRemote(); try { - return mContentProvider.call(mPackageName, method, arg, extras); + return mContentProvider.call(mPackageName, authority, method, arg, extras); } catch (DeadObjectException e) { if (!mStable) { mContentResolver.unstableProviderDied(mContentProvider); diff --git a/core/java/android/content/ContentProviderNative.java b/core/java/android/content/ContentProviderNative.java index 6bede131c817..ca657b150f9c 100644 --- a/core/java/android/content/ContentProviderNative.java +++ b/core/java/android/content/ContentProviderNative.java @@ -174,13 +174,15 @@ abstract public class ContentProviderNative extends Binder implements IContentPr { data.enforceInterface(IContentProvider.descriptor); String callingPkg = data.readString(); + String authority = data.readString(); final int numOperations = data.readInt(); final ArrayList<ContentProviderOperation> operations = new ArrayList<>(numOperations); for (int i = 0; i < numOperations; i++) { operations.add(i, ContentProviderOperation.CREATOR.createFromParcel(data)); } - final ContentProviderResult[] results = applyBatch(callingPkg, operations); + final ContentProviderResult[] results = applyBatch(callingPkg, authority, + operations); reply.writeNoException(); reply.writeTypedArray(results, 0); return true; @@ -267,11 +269,12 @@ abstract public class ContentProviderNative extends Binder implements IContentPr data.enforceInterface(IContentProvider.descriptor); String callingPkg = data.readString(); + String authority = data.readString(); String method = data.readString(); String stringArg = data.readString(); Bundle args = data.readBundle(); - Bundle responseBundle = call(callingPkg, method, stringArg, args); + Bundle responseBundle = call(callingPkg, authority, method, stringArg, args); reply.writeNoException(); reply.writeBundle(responseBundle); @@ -507,7 +510,7 @@ final class ContentProviderProxy implements IContentProvider } @Override - public ContentProviderResult[] applyBatch(String callingPkg, + public ContentProviderResult[] applyBatch(String callingPkg, String authority, ArrayList<ContentProviderOperation> operations) throws RemoteException, OperationApplicationException { Parcel data = Parcel.obtain(); @@ -515,6 +518,7 @@ final class ContentProviderProxy implements IContentProvider try { data.writeInterfaceToken(IContentProvider.descriptor); data.writeString(callingPkg); + data.writeString(authority); data.writeInt(operations.size()); for (ContentProviderOperation operation : operations) { operation.writeToParcel(data, 0); @@ -636,14 +640,15 @@ final class ContentProviderProxy implements IContentProvider } @Override - public Bundle call(String callingPkg, String method, String request, Bundle args) - throws RemoteException { + public Bundle call(String callingPkg, String authority, String method, String request, + Bundle args) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); try { data.writeInterfaceToken(IContentProvider.descriptor); data.writeString(callingPkg); + data.writeString(authority); data.writeString(method); data.writeString(request); data.writeBundle(args); diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index 7d5202d0dbce..866050ae752b 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -52,7 +52,6 @@ import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; -import android.os.SystemProperties; import android.os.UserHandle; import android.os.storage.StorageManager; import android.text.TextUtils; @@ -88,7 +87,7 @@ import java.util.concurrent.atomic.AtomicBoolean; * <a href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers</a> * developer guide.</p> */ -public abstract class ContentResolver { +public abstract class ContentResolver implements ContentInterface { /** * Enables logic that supports deprecation of {@code _data} columns, * typically by replacing values with fake paths that the OS then offers to @@ -655,6 +654,7 @@ 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 */ + @Override public final @Nullable String getType(@NonNull Uri url) { Preconditions.checkNotNull(url, "url"); @@ -708,6 +708,7 @@ public abstract class ContentResolver { * data streams that match the given mimeTypeFilter. If there are none, * null is returned. */ + @Override public @Nullable String[] getStreamTypes(@NonNull Uri url, @NonNull String mimeTypeFilter) { Preconditions.checkNotNull(url, "url"); Preconditions.checkNotNull(mimeTypeFilter, "mimeTypeFilter"); @@ -835,6 +836,7 @@ public abstract class ContentResolver { * @return A Cursor object, which is positioned before the first entry, or null * @see Cursor */ + @Override public final @Nullable Cursor query(final @RequiresPermission.Read @NonNull Uri uri, @Nullable String[] projection, @Nullable Bundle queryArgs, @Nullable CancellationSignal cancellationSignal) { @@ -935,6 +937,7 @@ public abstract class ContentResolver { * * @see #uncanonicalize */ + @Override public final @Nullable Uri canonicalize(@NonNull Uri url) { Preconditions.checkNotNull(url, "url"); IContentProvider provider = acquireProvider(url); @@ -971,6 +974,7 @@ public abstract class ContentResolver { * * @see #canonicalize */ + @Override public final @Nullable Uri uncanonicalize(@NonNull Uri url) { Preconditions.checkNotNull(url, "url"); IContentProvider provider = acquireProvider(url); @@ -1005,6 +1009,7 @@ public abstract class ContentResolver { * canceled the refresh request. * @return true if the provider actually tried refreshing. */ + @Override public final boolean refresh(@NonNull Uri url, @Nullable Bundle args, @Nullable CancellationSignal cancellationSignal) { Preconditions.checkNotNull(url, "url"); @@ -1116,6 +1121,12 @@ public abstract class ContentResolver { } } + @Override + public final @Nullable ParcelFileDescriptor openFile(@NonNull Uri uri, @NonNull String mode, + @Nullable CancellationSignal signal) throws FileNotFoundException { + return openFileDescriptor(uri, mode, signal); + } + /** * Open a raw file descriptor to access data under a URI. This * is like {@link #openAssetFileDescriptor(Uri, String)}, but uses the @@ -1221,6 +1232,12 @@ public abstract class ContentResolver { throw new FileNotFoundException("Not a whole file"); } + @Override + public final @Nullable AssetFileDescriptor openAssetFile(@NonNull Uri uri, @NonNull String mode, + @Nullable CancellationSignal signal) throws FileNotFoundException { + return openAssetFileDescriptor(uri, mode, signal); + } + /** * Open a raw file descriptor to access data under a URI. This * interacts with the underlying {@link ContentProvider#openAssetFile} @@ -1425,6 +1442,13 @@ public abstract class ContentResolver { } } + @Override + public final @Nullable AssetFileDescriptor openTypedAssetFile(@NonNull Uri uri, + @NonNull String mimeTypeFilter, @Nullable Bundle opts, + @Nullable CancellationSignal signal) throws FileNotFoundException { + return openTypedAssetFileDescriptor(uri, mimeTypeFilter, opts, signal); + } + /** * Open a raw file descriptor to access (potentially type transformed) * data from a "content:" URI. This interacts with the underlying @@ -1634,6 +1658,7 @@ public abstract class ContentResolver { * the field. Passing an empty ContentValues will create an empty row. * @return the URL of the newly created row. */ + @Override public final @Nullable Uri insert(@RequiresPermission.Write @NonNull Uri url, @Nullable ContentValues values) { Preconditions.checkNotNull(url, "url"); @@ -1672,6 +1697,7 @@ public abstract class ContentResolver { * @throws RemoteException thrown if a RemoteException is encountered while attempting * to communicate with a remote provider. */ + @Override public @NonNull ContentProviderResult[] applyBatch(@NonNull String authority, @NonNull ArrayList<ContentProviderOperation> operations) throws RemoteException, OperationApplicationException { @@ -1698,6 +1724,7 @@ public abstract class ContentResolver { * the field. Passing null will create an empty row. * @return the number of newly created rows. */ + @Override public final int bulkInsert(@RequiresPermission.Write @NonNull Uri url, @NonNull ContentValues[] values) { Preconditions.checkNotNull(url, "url"); @@ -1731,6 +1758,7 @@ public abstract class ContentResolver { (excluding the WHERE itself). * @return The number of rows deleted. */ + @Override public final int delete(@RequiresPermission.Write @NonNull Uri url, @Nullable String where, @Nullable String[] selectionArgs) { Preconditions.checkNotNull(url, "url"); @@ -1766,6 +1794,7 @@ public abstract class ContentResolver { * @return the number of rows updated. * @throws NullPointerException if uri or values are null */ + @Override public final int update(@RequiresPermission.Write @NonNull Uri uri, @Nullable ContentValues values, @Nullable String where, @Nullable String[] selectionArgs) { @@ -1805,14 +1834,20 @@ public abstract class ContentResolver { */ public final @Nullable Bundle call(@NonNull Uri uri, @NonNull String method, @Nullable String arg, @Nullable Bundle extras) { - Preconditions.checkNotNull(uri, "uri"); + return call(uri.getAuthority(), method, arg, extras); + } + + @Override + public final @Nullable Bundle call(@NonNull String authority, @NonNull String method, + @Nullable String arg, @Nullable Bundle extras) { + Preconditions.checkNotNull(authority, "authority"); Preconditions.checkNotNull(method, "method"); - IContentProvider provider = acquireProvider(uri); + IContentProvider provider = acquireProvider(authority); if (provider == null) { - throw new IllegalArgumentException("Unknown URI " + uri); + throw new IllegalArgumentException("Unknown authority " + authority); } try { - final Bundle res = provider.call(mPackageName, method, arg, extras); + final Bundle res = provider.call(mPackageName, authority, method, arg, extras); Bundle.setDefusable(res, true); return res; } catch (RemoteException e) { @@ -1918,7 +1953,7 @@ public abstract class ContentResolver { Preconditions.checkNotNull(uri, "uri"); IContentProvider provider = acquireProvider(uri); if (provider != null) { - return new ContentProviderClient(this, provider, true); + return new ContentProviderClient(this, provider, uri.getAuthority(), true); } return null; } @@ -1939,7 +1974,7 @@ public abstract class ContentResolver { Preconditions.checkNotNull(name, "name"); IContentProvider provider = acquireProvider(name); if (provider != null) { - return new ContentProviderClient(this, provider, true); + return new ContentProviderClient(this, provider, name, true); } return null; @@ -1966,7 +2001,7 @@ public abstract class ContentResolver { Preconditions.checkNotNull(uri, "uri"); IContentProvider provider = acquireUnstableProvider(uri); if (provider != null) { - return new ContentProviderClient(this, provider, false); + return new ContentProviderClient(this, provider, uri.getAuthority(), false); } return null; @@ -1993,7 +2028,7 @@ public abstract class ContentResolver { Preconditions.checkNotNull(name, "name"); IContentProvider provider = acquireUnstableProvider(name); if (provider != null) { - return new ContentProviderClient(this, provider, false); + return new ContentProviderClient(this, provider, name, false); } return null; diff --git a/core/java/android/content/IContentProvider.java b/core/java/android/content/IContentProvider.java index 044ed61470ea..0427c2f52415 100644 --- a/core/java/android/content/IContentProvider.java +++ b/core/java/android/content/IContentProvider.java @@ -60,13 +60,28 @@ public interface IContentProvider extends IInterface { public AssetFileDescriptor openAssetFile( String callingPkg, Uri url, String mode, ICancellationSignal signal) throws RemoteException, FileNotFoundException; - public ContentProviderResult[] applyBatch(String callingPkg, + + @Deprecated + public default ContentProviderResult[] applyBatch(String callingPkg, + ArrayList<ContentProviderOperation> operations) + throws RemoteException, OperationApplicationException { + return applyBatch(callingPkg, "unknown", operations); + } + + public ContentProviderResult[] applyBatch(String callingPkg, String authority, ArrayList<ContentProviderOperation> operations) - throws RemoteException, OperationApplicationException; + throws RemoteException, OperationApplicationException; + + @Deprecated @UnsupportedAppUsage - public Bundle call( - String callingPkg, String method, @Nullable String arg, @Nullable Bundle extras) - throws RemoteException; + public default Bundle call(String callingPkg, String method, + @Nullable String arg, @Nullable Bundle extras) throws RemoteException { + return call(callingPkg, "unknown", method, arg, extras); + } + + public Bundle call(String callingPkg, String authority, String method, + @Nullable String arg, @Nullable Bundle extras) throws RemoteException; + public ICancellationSignal createCancellationSignal() throws RemoteException; public Uri canonicalize(String callingPkg, Uri uri) throws RemoteException; diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index f86296b85f0e..98a1701dd466 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -2055,7 +2055,8 @@ public final class Settings { arg.putBoolean(CALL_METHOD_MAKE_DEFAULT_KEY, true); } IContentProvider cp = mProviderHolder.getProvider(cr); - cp.call(cr.getPackageName(), mCallSetCommand, name, arg); + cp.call(cr.getPackageName(), mProviderHolder.mUri.getAuthority(), + mCallSetCommand, name, arg); } catch (RemoteException e) { Log.w(TAG, "Can't set key " + name + " in " + mUri, e); return false; @@ -2128,12 +2129,14 @@ public final class Settings { if (Settings.isInSystemServer() && Binder.getCallingUid() != Process.myUid()) { final long token = Binder.clearCallingIdentity(); try { - b = cp.call(cr.getPackageName(), mCallGetCommand, name, args); + b = cp.call(cr.getPackageName(), mProviderHolder.mUri.getAuthority(), + mCallGetCommand, name, args); } finally { Binder.restoreCallingIdentity(token); } } else { - b = cp.call(cr.getPackageName(), mCallGetCommand, name, args); + b = cp.call(cr.getPackageName(), mProviderHolder.mUri.getAuthority(), + mCallGetCommand, name, args); } if (b != null) { String value = b.getString(Settings.NameValueTable.VALUE); @@ -5123,7 +5126,8 @@ public final class Settings { } arg.putInt(CALL_METHOD_RESET_MODE_KEY, mode); IContentProvider cp = sProviderHolder.getProvider(resolver); - cp.call(resolver.getPackageName(), CALL_METHOD_RESET_SECURE, null, arg); + cp.call(resolver.getPackageName(), sProviderHolder.mUri.getAuthority(), + CALL_METHOD_RESET_SECURE, null, arg); } catch (RemoteException e) { Log.w(TAG, "Can't reset do defaults for " + CONTENT_URI, e); } @@ -13158,7 +13162,8 @@ public final class Settings { } arg.putInt(CALL_METHOD_RESET_MODE_KEY, mode); IContentProvider cp = sProviderHolder.getProvider(resolver); - cp.call(resolver.getPackageName(), CALL_METHOD_RESET_GLOBAL, null, arg); + cp.call(resolver.getPackageName(), sProviderHolder.mUri.getAuthority(), + CALL_METHOD_RESET_GLOBAL, null, arg); } catch (RemoteException e) { Log.w(TAG, "Can't reset do defaults for " + CONTENT_URI, e); } @@ -13953,7 +13958,8 @@ public final class Settings { } arg.putInt(CALL_METHOD_RESET_MODE_KEY, RESET_MODE_PACKAGE_DEFAULTS); IContentProvider cp = sProviderHolder.getProvider(resolver); - cp.call(resolver.getPackageName(), CALL_METHOD_RESET_CONFIG, null, arg); + cp.call(resolver.getPackageName(), sProviderHolder.mUri.getAuthority(), + CALL_METHOD_RESET_CONFIG, null, arg); } catch (RemoteException e) { Log.w(TAG, "Can't reset to defaults for " + CONTENT_URI, e); } diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java b/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java index 67cfe6bfd18a..91892abdfb44 100644 --- a/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java @@ -363,7 +363,8 @@ public class TileUtils { return null; } try { - return provider.call(context.getPackageName(), method, uriString, null); + return provider.call(context.getPackageName(), uri.getAuthority(), + method, uriString, null); } catch (RemoteException e) { return null; } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsService.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsService.java index 0709c6cd56e0..36360a31a4b7 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsService.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsService.java @@ -309,8 +309,8 @@ final public class SettingsService extends Binder { try { Bundle arg = new Bundle(); arg.putInt(Settings.CALL_METHOD_USER_KEY, userHandle); - Bundle result = - provider.call(resolveCallingPackage(), callListCommand, null, arg); + Bundle result = provider.call(resolveCallingPackage(), Settings.AUTHORITY, + callListCommand, null, arg); lines.addAll(result.getStringArrayList(SettingsProvider.RESULT_SETTINGS_LIST)); Collections.sort(lines); } catch (RemoteException e) { @@ -334,7 +334,8 @@ final public class SettingsService extends Binder { try { Bundle arg = new Bundle(); arg.putInt(Settings.CALL_METHOD_USER_KEY, userHandle); - Bundle b = provider.call(resolveCallingPackage(), callGetCommand, key, arg); + Bundle b = provider.call(resolveCallingPackage(), Settings.AUTHORITY, + callGetCommand, key, arg); if (b != null) { result = b.getPairValue(); } @@ -371,7 +372,8 @@ final public class SettingsService extends Binder { if (makeDefault) { arg.putBoolean(Settings.CALL_METHOD_MAKE_DEFAULT_KEY, true); } - provider.call(resolveCallingPackage(), callPutCommand, key, arg); + provider.call(resolveCallingPackage(), Settings.AUTHORITY, + callPutCommand, key, arg); } catch (RemoteException e) { throw new RuntimeException("Failed in IPC", e); } @@ -394,8 +396,8 @@ final public class SettingsService extends Binder { try { Bundle arg = new Bundle(); arg.putInt(Settings.CALL_METHOD_USER_KEY, userHandle); - Bundle result = - provider.call(resolveCallingPackage(), callDeleteCommand, key, arg); + Bundle result = provider.call(resolveCallingPackage(), Settings.AUTHORITY, + callDeleteCommand, key, arg); return result.getInt(SettingsProvider.RESULT_ROWS_DELETED); } catch (RemoteException e) { throw new RuntimeException("Failed in IPC", e); @@ -421,7 +423,7 @@ final public class SettingsService extends Binder { } String packageName = mPackageName != null ? mPackageName : resolveCallingPackage(); arg.putInt(Settings.CALL_METHOD_USER_KEY, userHandle); - provider.call(packageName, callResetCommand, null, arg); + provider.call(packageName, Settings.AUTHORITY, callResetCommand, null, arg); } catch (RemoteException e) { throw new RuntimeException("Failed in IPC", e); } diff --git a/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java index 82e0fbe0e400..a71aca53ca26 100644 --- a/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java +++ b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java @@ -106,8 +106,8 @@ public class PinnedSliceStateTest extends UiServiceTestCase { mPinnedSliceManager.pin("pkg", FIRST_SPECS, mToken); TestableLooper.get(this).processAllMessages(); - verify(mIContentProvider).call(anyString(), eq(SliceProvider.METHOD_PIN), eq(null), - argThat(b -> { + verify(mIContentProvider).call(anyString(), anyString(), eq(SliceProvider.METHOD_PIN), + eq(null), argThat(b -> { assertEquals(TEST_URI, b.getParcelable(SliceProvider.EXTRA_BIND_URI)); return true; })); diff --git a/test-mock/src/android/test/mock/MockContentProvider.java b/test-mock/src/android/test/mock/MockContentProvider.java index b917fbd8a1fe..0ac35bc2628c 100644 --- a/test-mock/src/android/test/mock/MockContentProvider.java +++ b/test-mock/src/android/test/mock/MockContentProvider.java @@ -54,10 +54,10 @@ public class MockContentProvider extends ContentProvider { */ private class InversionIContentProvider implements IContentProvider { @Override - public ContentProviderResult[] applyBatch(String callingPackage, + public ContentProviderResult[] applyBatch(String callingPackage, String authority, ArrayList<ContentProviderOperation> operations) throws RemoteException, OperationApplicationException { - return MockContentProvider.this.applyBatch(operations); + return MockContentProvider.this.applyBatch(authority, operations); } @Override @@ -112,9 +112,9 @@ public class MockContentProvider extends ContentProvider { } @Override - public Bundle call(String callingPackage, String method, String request, Bundle args) - throws RemoteException { - return MockContentProvider.this.call(method, request, args); + public Bundle call(String callingPackage, String authority, String method, String request, + Bundle args) throws RemoteException { + return MockContentProvider.this.call(authority, method, request, args); } @Override diff --git a/test-mock/src/android/test/mock/MockIContentProvider.java b/test-mock/src/android/test/mock/MockIContentProvider.java index 112d7eef3dbe..fc2a4644b994 100644 --- a/test-mock/src/android/test/mock/MockIContentProvider.java +++ b/test-mock/src/android/test/mock/MockIContentProvider.java @@ -80,7 +80,7 @@ public class MockIContentProvider implements IContentProvider { } @Override - public ContentProviderResult[] applyBatch(String callingPackage, + public ContentProviderResult[] applyBatch(String callingPackage, String authority, ArrayList<ContentProviderOperation> operations) { throw new UnsupportedOperationException("unimplemented mock method"); } @@ -103,8 +103,8 @@ public class MockIContentProvider implements IContentProvider { } @Override - public Bundle call(String callingPackage, String method, String request, Bundle args) - throws RemoteException { + public Bundle call(String callingPackage, String authority, String method, String request, + Bundle args) throws RemoteException { throw new UnsupportedOperationException("unimplemented mock method"); } |