diff options
| author | Xin Li <delphij@google.com> | 2020-09-09 20:21:10 -0700 |
|---|---|---|
| committer | Xin Li <delphij@google.com> | 2020-09-09 20:21:10 -0700 |
| commit | c64112eb974e9aa7638aead998f07a868acfb5a7 (patch) | |
| tree | 503334edcee47bfd9f7a76d987d881992ecae9aa /core/java/android/content/ContentProviderNative.java | |
| parent | 104d2f92b3911576c284ddb0adf78148359883d2 (diff) | |
| parent | 14a6871e432e163533a320516ace97bd67d9c3a0 (diff) | |
Merge Android R
Bug: 168057903
Merged-In: Ice3e441cc9c0df8d0a6acc016bb74375e081bd67
Change-Id: I1d85742f594be2007c99841b290e502b6ede624e
Diffstat (limited to 'core/java/android/content/ContentProviderNative.java')
| -rw-r--r-- | core/java/android/content/ContentProviderNative.java | 221 |
1 files changed, 172 insertions, 49 deletions
diff --git a/core/java/android/content/ContentProviderNative.java b/core/java/android/content/ContentProviderNative.java index 234f567f2ad2..7bc59013bcfe 100644 --- a/core/java/android/content/ContentProviderNative.java +++ b/core/java/android/content/ContentProviderNative.java @@ -33,6 +33,7 @@ import android.os.ICancellationSignal; import android.os.Parcel; import android.os.ParcelFileDescriptor; import android.os.Parcelable; +import android.os.RemoteCallback; import android.os.RemoteException; import java.io.FileNotFoundException; @@ -83,6 +84,7 @@ abstract public class ContentProviderNative extends Binder implements IContentPr data.enforceInterface(IContentProvider.descriptor); String callingPkg = data.readString(); + String callingFeatureId = data.readString(); Uri url = Uri.CREATOR.createFromParcel(data); // String[] projection @@ -101,7 +103,8 @@ abstract public class ContentProviderNative extends Binder implements IContentPr ICancellationSignal cancellationSignal = ICancellationSignal.Stub.asInterface( data.readStrongBinder()); - Cursor cursor = query(callingPkg, url, projection, queryArgs, cancellationSignal); + Cursor cursor = query(callingPkg, callingFeatureId, url, projection, queryArgs, + cancellationSignal); if (cursor != null) { CursorToBulkCursorAdaptor adaptor = null; @@ -144,14 +147,24 @@ abstract public class ContentProviderNative extends Binder implements IContentPr return true; } + case GET_TYPE_ASYNC_TRANSACTION: { + data.enforceInterface(IContentProvider.descriptor); + Uri url = Uri.CREATOR.createFromParcel(data); + RemoteCallback callback = RemoteCallback.CREATOR.createFromParcel(data); + getTypeAsync(url, callback); + return true; + } + case INSERT_TRANSACTION: { data.enforceInterface(IContentProvider.descriptor); String callingPkg = data.readString(); + String featureId = data.readString(); Uri url = Uri.CREATOR.createFromParcel(data); ContentValues values = ContentValues.CREATOR.createFromParcel(data); + Bundle extras = data.readBundle(); - Uri out = insert(callingPkg, url, values); + Uri out = insert(callingPkg, featureId, url, values, extras); reply.writeNoException(); Uri.writeToParcel(reply, out); return true; @@ -161,10 +174,11 @@ abstract public class ContentProviderNative extends Binder implements IContentPr { data.enforceInterface(IContentProvider.descriptor); String callingPkg = data.readString(); + String featureId = data.readString(); Uri url = Uri.CREATOR.createFromParcel(data); ContentValues[] values = data.createTypedArray(ContentValues.CREATOR); - int count = bulkInsert(callingPkg, url, values); + int count = bulkInsert(callingPkg, featureId, url, values); reply.writeNoException(); reply.writeInt(count); return true; @@ -174,6 +188,7 @@ abstract public class ContentProviderNative extends Binder implements IContentPr { data.enforceInterface(IContentProvider.descriptor); String callingPkg = data.readString(); + String featureId = data.readString(); String authority = data.readString(); final int numOperations = data.readInt(); final ArrayList<ContentProviderOperation> operations = @@ -181,8 +196,8 @@ abstract public class ContentProviderNative extends Binder implements IContentPr for (int i = 0; i < numOperations; i++) { operations.add(i, ContentProviderOperation.CREATOR.createFromParcel(data)); } - final ContentProviderResult[] results = applyBatch(callingPkg, authority, - operations); + final ContentProviderResult[] results = applyBatch(callingPkg, featureId, + authority, operations); reply.writeNoException(); reply.writeTypedArray(results, 0); return true; @@ -192,11 +207,11 @@ abstract public class ContentProviderNative extends Binder implements IContentPr { data.enforceInterface(IContentProvider.descriptor); String callingPkg = data.readString(); + String featureId = data.readString(); Uri url = Uri.CREATOR.createFromParcel(data); - String selection = data.readString(); - String[] selectionArgs = data.readStringArray(); + Bundle extras = data.readBundle(); - int count = delete(callingPkg, url, selection, selectionArgs); + int count = delete(callingPkg, featureId, url, extras); reply.writeNoException(); reply.writeInt(count); @@ -207,12 +222,12 @@ abstract public class ContentProviderNative extends Binder implements IContentPr { data.enforceInterface(IContentProvider.descriptor); String callingPkg = data.readString(); + String featureId = data.readString(); Uri url = Uri.CREATOR.createFromParcel(data); ContentValues values = ContentValues.CREATOR.createFromParcel(data); - String selection = data.readString(); - String[] selectionArgs = data.readStringArray(); + Bundle extras = data.readBundle(); - int count = update(callingPkg, url, values, selection, selectionArgs); + int count = update(callingPkg, featureId, url, values, extras); reply.writeNoException(); reply.writeInt(count); @@ -223,6 +238,7 @@ abstract public class ContentProviderNative extends Binder implements IContentPr { data.enforceInterface(IContentProvider.descriptor); String callingPkg = data.readString(); + String featureId = data.readString(); Uri url = Uri.CREATOR.createFromParcel(data); String mode = data.readString(); ICancellationSignal signal = ICancellationSignal.Stub.asInterface( @@ -230,7 +246,7 @@ abstract public class ContentProviderNative extends Binder implements IContentPr IBinder callerToken = data.readStrongBinder(); ParcelFileDescriptor fd; - fd = openFile(callingPkg, url, mode, signal, callerToken); + fd = openFile(callingPkg, featureId, url, mode, signal, callerToken); reply.writeNoException(); if (fd != null) { reply.writeInt(1); @@ -246,13 +262,14 @@ abstract public class ContentProviderNative extends Binder implements IContentPr { data.enforceInterface(IContentProvider.descriptor); String callingPkg = data.readString(); + String featureId = data.readString(); Uri url = Uri.CREATOR.createFromParcel(data); String mode = data.readString(); ICancellationSignal signal = ICancellationSignal.Stub.asInterface( data.readStrongBinder()); AssetFileDescriptor fd; - fd = openAssetFile(callingPkg, url, mode, signal); + fd = openAssetFile(callingPkg, featureId, url, mode, signal); reply.writeNoException(); if (fd != null) { reply.writeInt(1); @@ -269,12 +286,14 @@ abstract public class ContentProviderNative extends Binder implements IContentPr data.enforceInterface(IContentProvider.descriptor); String callingPkg = data.readString(); + String featureId = data.readString(); String authority = data.readString(); String method = data.readString(); String stringArg = data.readString(); - Bundle args = data.readBundle(); + Bundle extras = data.readBundle(); - Bundle responseBundle = call(callingPkg, authority, method, stringArg, args); + Bundle responseBundle = call(callingPkg, featureId, authority, method, + stringArg, extras); reply.writeNoException(); reply.writeBundle(responseBundle); @@ -297,6 +316,7 @@ abstract public class ContentProviderNative extends Binder implements IContentPr { data.enforceInterface(IContentProvider.descriptor); String callingPkg = data.readString(); + String featureId = data.readString(); Uri url = Uri.CREATOR.createFromParcel(data); String mimeType = data.readString(); Bundle opts = data.readBundle(); @@ -304,7 +324,7 @@ abstract public class ContentProviderNative extends Binder implements IContentPr data.readStrongBinder()); AssetFileDescriptor fd; - fd = openTypedAssetFile(callingPkg, url, mimeType, opts, signal); + fd = openTypedAssetFile(callingPkg, featureId, url, mimeType, opts, signal); reply.writeNoException(); if (fd != null) { reply.writeInt(1); @@ -330,21 +350,33 @@ abstract public class ContentProviderNative extends Binder implements IContentPr { data.enforceInterface(IContentProvider.descriptor); String callingPkg = data.readString(); + String featureId = data.readString(); Uri url = Uri.CREATOR.createFromParcel(data); - Uri out = canonicalize(callingPkg, url); + Uri out = canonicalize(callingPkg, featureId, url); reply.writeNoException(); Uri.writeToParcel(reply, out); return true; } + case CANONICALIZE_ASYNC_TRANSACTION: { + data.enforceInterface(IContentProvider.descriptor); + String callingPkg = data.readString(); + String featureId = data.readString(); + Uri uri = Uri.CREATOR.createFromParcel(data); + RemoteCallback callback = RemoteCallback.CREATOR.createFromParcel(data); + canonicalizeAsync(callingPkg, featureId, uri, callback); + return true; + } + case UNCANONICALIZE_TRANSACTION: { data.enforceInterface(IContentProvider.descriptor); String callingPkg = data.readString(); + String featureId = data.readString(); Uri url = Uri.CREATOR.createFromParcel(data); - Uri out = uncanonicalize(callingPkg, url); + Uri out = uncanonicalize(callingPkg, featureId, url); reply.writeNoException(); Uri.writeToParcel(reply, out); return true; @@ -353,16 +385,31 @@ abstract public class ContentProviderNative extends Binder implements IContentPr case REFRESH_TRANSACTION: { data.enforceInterface(IContentProvider.descriptor); String callingPkg = data.readString(); + String featureId = data.readString(); Uri url = Uri.CREATOR.createFromParcel(data); - Bundle args = data.readBundle(); + Bundle extras = data.readBundle(); ICancellationSignal signal = ICancellationSignal.Stub.asInterface( data.readStrongBinder()); - boolean out = refresh(callingPkg, url, args, signal); + boolean out = refresh(callingPkg, featureId, url, extras, signal); reply.writeNoException(); reply.writeInt(out ? 0 : -1); return true; } + + case CHECK_URI_PERMISSION_TRANSACTION: { + data.enforceInterface(IContentProvider.descriptor); + String callingPkg = data.readString(); + String featureId = data.readString(); + Uri uri = Uri.CREATOR.createFromParcel(data); + int uid = data.readInt(); + int modeFlags = data.readInt(); + + int out = checkUriPermission(callingPkg, featureId, uri, uid, modeFlags); + reply.writeNoException(); + reply.writeInt(out); + return true; + } } } catch (Exception e) { DatabaseUtils.writeExceptionToParcel(reply, e); @@ -394,8 +441,9 @@ final class ContentProviderProxy implements IContentProvider } @Override - public Cursor query(String callingPkg, Uri url, @Nullable String[] projection, - @Nullable Bundle queryArgs, @Nullable ICancellationSignal cancellationSignal) + public Cursor query(String callingPkg, @Nullable String featureId, Uri url, + @Nullable String[] projection, @Nullable Bundle queryArgs, + @Nullable ICancellationSignal cancellationSignal) throws RemoteException { BulkCursorToCursorAdaptor adaptor = new BulkCursorToCursorAdaptor(); Parcel data = Parcel.obtain(); @@ -404,6 +452,7 @@ final class ContentProviderProxy implements IContentProvider data.writeInterfaceToken(IContentProvider.descriptor); data.writeString(callingPkg); + data.writeString(featureId); url.writeToParcel(data, 0); int length = 0; if (projection != null) { @@ -465,7 +514,24 @@ final class ContentProviderProxy implements IContentProvider } @Override - public Uri insert(String callingPkg, Uri url, ContentValues values) throws RemoteException + /* oneway */ public void getTypeAsync(Uri uri, RemoteCallback callback) throws RemoteException { + Parcel data = Parcel.obtain(); + try { + data.writeInterfaceToken(IContentProvider.descriptor); + + uri.writeToParcel(data, 0); + callback.writeToParcel(data, 0); + + mRemote.transact(IContentProvider.GET_TYPE_ASYNC_TRANSACTION, data, null, + IBinder.FLAG_ONEWAY); + } finally { + data.recycle(); + } + } + + @Override + public Uri insert(String callingPkg, @Nullable String featureId, Uri url, + ContentValues values, Bundle extras) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); @@ -473,8 +539,10 @@ final class ContentProviderProxy implements IContentProvider data.writeInterfaceToken(IContentProvider.descriptor); data.writeString(callingPkg); + data.writeString(featureId); url.writeToParcel(data, 0); values.writeToParcel(data, 0); + data.writeBundle(extras); mRemote.transact(IContentProvider.INSERT_TRANSACTION, data, reply, 0); @@ -488,13 +556,15 @@ final class ContentProviderProxy implements IContentProvider } @Override - public int bulkInsert(String callingPkg, Uri url, ContentValues[] values) throws RemoteException { + public int bulkInsert(String callingPkg, @Nullable String featureId, Uri url, + ContentValues[] values) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); try { data.writeInterfaceToken(IContentProvider.descriptor); data.writeString(callingPkg); + data.writeString(featureId); url.writeToParcel(data, 0); data.writeTypedArray(values, 0); @@ -510,14 +580,15 @@ final class ContentProviderProxy implements IContentProvider } @Override - public ContentProviderResult[] applyBatch(String callingPkg, String authority, - ArrayList<ContentProviderOperation> operations) - throws RemoteException, OperationApplicationException { + public ContentProviderResult[] applyBatch(String callingPkg, @Nullable String featureId, + String authority, ArrayList<ContentProviderOperation> operations) + throws RemoteException, OperationApplicationException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); try { data.writeInterfaceToken(IContentProvider.descriptor); data.writeString(callingPkg); + data.writeString(featureId); data.writeString(authority); data.writeInt(operations.size()); for (ContentProviderOperation operation : operations) { @@ -536,7 +607,7 @@ final class ContentProviderProxy implements IContentProvider } @Override - public int delete(String callingPkg, Uri url, String selection, String[] selectionArgs) + public int delete(String callingPkg, @Nullable String featureId, Uri url, Bundle extras) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); @@ -544,9 +615,9 @@ final class ContentProviderProxy implements IContentProvider data.writeInterfaceToken(IContentProvider.descriptor); data.writeString(callingPkg); + data.writeString(featureId); url.writeToParcel(data, 0); - data.writeString(selection); - data.writeStringArray(selectionArgs); + data.writeBundle(extras); mRemote.transact(IContentProvider.DELETE_TRANSACTION, data, reply, 0); @@ -560,18 +631,18 @@ final class ContentProviderProxy implements IContentProvider } @Override - public int update(String callingPkg, Uri url, ContentValues values, String selection, - String[] selectionArgs) throws RemoteException { + public int update(String callingPkg, @Nullable String featureId, Uri url, + ContentValues values, Bundle extras) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); try { data.writeInterfaceToken(IContentProvider.descriptor); data.writeString(callingPkg); + data.writeString(featureId); url.writeToParcel(data, 0); values.writeToParcel(data, 0); - data.writeString(selection); - data.writeStringArray(selectionArgs); + data.writeBundle(extras); mRemote.transact(IContentProvider.UPDATE_TRANSACTION, data, reply, 0); @@ -585,8 +656,8 @@ final class ContentProviderProxy implements IContentProvider } @Override - public ParcelFileDescriptor openFile( - String callingPkg, Uri url, String mode, ICancellationSignal signal, IBinder token) + public ParcelFileDescriptor openFile(String callingPkg, @Nullable String featureId, Uri url, + String mode, ICancellationSignal signal, IBinder token) throws RemoteException, FileNotFoundException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); @@ -594,6 +665,7 @@ final class ContentProviderProxy implements IContentProvider data.writeInterfaceToken(IContentProvider.descriptor); data.writeString(callingPkg); + data.writeString(featureId); url.writeToParcel(data, 0); data.writeString(mode); data.writeStrongBinder(signal != null ? signal.asBinder() : null); @@ -613,8 +685,8 @@ final class ContentProviderProxy implements IContentProvider } @Override - public AssetFileDescriptor openAssetFile( - String callingPkg, Uri url, String mode, ICancellationSignal signal) + public AssetFileDescriptor openAssetFile(String callingPkg, @Nullable String featureId, + Uri url, String mode, ICancellationSignal signal) throws RemoteException, FileNotFoundException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); @@ -622,6 +694,7 @@ final class ContentProviderProxy implements IContentProvider data.writeInterfaceToken(IContentProvider.descriptor); data.writeString(callingPkg); + data.writeString(featureId); url.writeToParcel(data, 0); data.writeString(mode); data.writeStrongBinder(signal != null ? signal.asBinder() : null); @@ -640,18 +713,19 @@ final class ContentProviderProxy implements IContentProvider } @Override - public Bundle call(String callingPkg, String authority, String method, String request, - Bundle args) throws RemoteException { + public Bundle call(String callingPkg, @Nullable String featureId, String authority, + String method, String request, Bundle extras) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); try { data.writeInterfaceToken(IContentProvider.descriptor); data.writeString(callingPkg); + data.writeString(featureId); data.writeString(authority); data.writeString(method); data.writeString(request); - data.writeBundle(args); + data.writeBundle(extras); mRemote.transact(IContentProvider.CALL_TRANSACTION, data, reply, 0); @@ -687,14 +761,16 @@ final class ContentProviderProxy implements IContentProvider } @Override - public AssetFileDescriptor openTypedAssetFile(String callingPkg, Uri url, String mimeType, - Bundle opts, ICancellationSignal signal) throws RemoteException, FileNotFoundException { + public AssetFileDescriptor openTypedAssetFile(String callingPkg, @Nullable String featureId, + Uri url, String mimeType, Bundle opts, ICancellationSignal signal) + throws RemoteException, FileNotFoundException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); try { data.writeInterfaceToken(IContentProvider.descriptor); data.writeString(callingPkg); + data.writeString(featureId); url.writeToParcel(data, 0); data.writeString(mimeType); data.writeBundle(opts); @@ -734,14 +810,15 @@ final class ContentProviderProxy implements IContentProvider } @Override - public Uri canonicalize(String callingPkg, Uri url) throws RemoteException - { + public Uri canonicalize(String callingPkg, @Nullable String featureId, Uri url) + throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); try { data.writeInterfaceToken(IContentProvider.descriptor); data.writeString(callingPkg); + data.writeString(featureId); url.writeToParcel(data, 0); mRemote.transact(IContentProvider.CANONICALIZE_TRANSACTION, data, reply, 0); @@ -756,13 +833,34 @@ final class ContentProviderProxy implements IContentProvider } @Override - public Uri uncanonicalize(String callingPkg, Uri url) throws RemoteException { + /* oneway */ public void canonicalizeAsync(String callingPkg, @Nullable String featureId, + Uri uri, RemoteCallback callback) throws RemoteException { + Parcel data = Parcel.obtain(); + try { + data.writeInterfaceToken(IContentProvider.descriptor); + + data.writeString(callingPkg); + data.writeString(featureId); + uri.writeToParcel(data, 0); + callback.writeToParcel(data, 0); + + mRemote.transact(IContentProvider.CANONICALIZE_ASYNC_TRANSACTION, data, null, + Binder.FLAG_ONEWAY); + } finally { + data.recycle(); + } + } + + @Override + public Uri uncanonicalize(String callingPkg, @Nullable String featureId, Uri url) + throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); try { data.writeInterfaceToken(IContentProvider.descriptor); data.writeString(callingPkg); + data.writeString(featureId); url.writeToParcel(data, 0); mRemote.transact(IContentProvider.UNCANONICALIZE_TRANSACTION, data, reply, 0); @@ -777,16 +875,17 @@ final class ContentProviderProxy implements IContentProvider } @Override - public boolean refresh(String callingPkg, Uri url, Bundle args, ICancellationSignal signal) - throws RemoteException { + public boolean refresh(String callingPkg, @Nullable String featureId, Uri url, Bundle extras, + ICancellationSignal signal) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); try { data.writeInterfaceToken(IContentProvider.descriptor); data.writeString(callingPkg); + data.writeString(featureId); url.writeToParcel(data, 0); - data.writeBundle(args); + data.writeBundle(extras); data.writeStrongBinder(signal != null ? signal.asBinder() : null); mRemote.transact(IContentProvider.REFRESH_TRANSACTION, data, reply, 0); @@ -800,6 +899,30 @@ final class ContentProviderProxy implements IContentProvider } } + @Override + public int checkUriPermission(String callingPkg, @Nullable String featureId, Uri url, int uid, + int modeFlags) throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + try { + data.writeInterfaceToken(IContentProvider.descriptor); + + data.writeString(callingPkg); + data.writeString(featureId); + url.writeToParcel(data, 0); + data.writeInt(uid); + data.writeInt(modeFlags); + + mRemote.transact(IContentProvider.CHECK_URI_PERMISSION_TRANSACTION, data, reply, 0); + + DatabaseUtils.readExceptionFromParcel(reply); + return reply.readInt(); + } finally { + data.recycle(); + reply.recycle(); + } + } + @UnsupportedAppUsage private IBinder mRemote; } |
