Loading core/java/android/content/ContentProvider.java +14 −0 Original line number Diff line number Diff line Loading @@ -623,6 +623,20 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall } } @Override public void uncanonicalizeAsync(String callingPkg, @Nullable String attributionTag, Uri uri, RemoteCallback callback) { final Bundle result = new Bundle(); try { result.putParcelable(ContentResolver.REMOTE_CALLBACK_RESULT, uncanonicalize(callingPkg, attributionTag, uri)); } catch (Exception e) { result.putParcelable(ContentResolver.REMOTE_CALLBACK_ERROR, new ParcelableException(e)); } callback.sendResult(result); } @Override public boolean refresh(String callingPkg, String attributionTag, Uri uri, Bundle extras, ICancellationSignal cancellationSignal) throws RemoteException { Loading core/java/android/content/ContentProviderNative.java +29 −0 Original line number Diff line number Diff line Loading @@ -382,6 +382,16 @@ abstract public class ContentProviderNative extends Binder implements IContentPr return true; } case UNCANONICALIZE_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); uncanonicalizeAsync(callingPkg, featureId, uri, callback); return true; } case REFRESH_TRANSACTION: { data.enforceInterface(IContentProvider.descriptor); String callingPkg = data.readString(); Loading Loading @@ -874,6 +884,25 @@ final class ContentProviderProxy implements IContentProvider } } @Override /* oneway */ public void uncanonicalizeAsync(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.UNCANONICALIZE_ASYNC_TRANSACTION, data, null, Binder.FLAG_ONEWAY); } finally { data.recycle(); } } @Override public boolean refresh(String callingPkg, @Nullable String featureId, Uri url, Bundle extras, ICancellationSignal signal) throws RemoteException { Loading core/java/android/content/ContentResolver.java +8 −1 Original line number Diff line number Diff line Loading @@ -1338,7 +1338,14 @@ public abstract class ContentResolver implements ContentInterface { } try { return provider.uncanonicalize(mPackageName, mAttributionTag, url); final UriResultListener resultListener = new UriResultListener(); provider.uncanonicalizeAsync(mPackageName, mAttributionTag, url, new RemoteCallback(resultListener)); resultListener.waitForResult(CONTENT_PROVIDER_TIMEOUT_MILLIS); if (resultListener.exception != null) { throw resultListener.exception; } return resultListener.result; } catch (RemoteException e) { // Arbitrary and not worth documenting, as Activity // Manager will kill this process shortly anyway. Loading core/java/android/content/IContentProvider.java +9 −0 Original line number Diff line number Diff line Loading @@ -137,6 +137,14 @@ public interface IContentProvider extends IInterface { public Uri uncanonicalize(String callingPkg, @Nullable String attributionTag, Uri uri) throws RemoteException; /** * A oneway version of uncanonicalize. The functionality is exactly the same, except that the * call returns immediately, and the resulting type is returned when available via * a binder callback. */ void uncanonicalizeAsync(String callingPkg, @Nullable String attributionTag, Uri uri, RemoteCallback callback) throws RemoteException; public boolean refresh(String callingPkg, @Nullable String attributionTag, Uri url, @Nullable Bundle extras, ICancellationSignal cancellationSignal) throws RemoteException; Loading Loading @@ -172,4 +180,5 @@ public interface IContentProvider extends IInterface { static final int CHECK_URI_PERMISSION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 27; int GET_TYPE_ASYNC_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 28; int CANONICALIZE_ASYNC_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 29; int UNCANONICALIZE_ASYNC_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 30; } core/tests/coretests/src/android/content/ContentResolverTest.java +8 −0 Original line number Diff line number Diff line Loading @@ -261,4 +261,12 @@ public class ContentResolverTest { // Expected } } @Test public void testUncanonicalize() { Uri uncanonical = mResolver.uncanonicalize( Uri.parse("content://android.content.FakeProviderRemote/something")); assertThat(uncanonical).isEqualTo( Uri.parse("content://android.content.FakeProviderRemote/uncanonical")); } } Loading
core/java/android/content/ContentProvider.java +14 −0 Original line number Diff line number Diff line Loading @@ -623,6 +623,20 @@ public abstract class ContentProvider implements ContentInterface, ComponentCall } } @Override public void uncanonicalizeAsync(String callingPkg, @Nullable String attributionTag, Uri uri, RemoteCallback callback) { final Bundle result = new Bundle(); try { result.putParcelable(ContentResolver.REMOTE_CALLBACK_RESULT, uncanonicalize(callingPkg, attributionTag, uri)); } catch (Exception e) { result.putParcelable(ContentResolver.REMOTE_CALLBACK_ERROR, new ParcelableException(e)); } callback.sendResult(result); } @Override public boolean refresh(String callingPkg, String attributionTag, Uri uri, Bundle extras, ICancellationSignal cancellationSignal) throws RemoteException { Loading
core/java/android/content/ContentProviderNative.java +29 −0 Original line number Diff line number Diff line Loading @@ -382,6 +382,16 @@ abstract public class ContentProviderNative extends Binder implements IContentPr return true; } case UNCANONICALIZE_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); uncanonicalizeAsync(callingPkg, featureId, uri, callback); return true; } case REFRESH_TRANSACTION: { data.enforceInterface(IContentProvider.descriptor); String callingPkg = data.readString(); Loading Loading @@ -874,6 +884,25 @@ final class ContentProviderProxy implements IContentProvider } } @Override /* oneway */ public void uncanonicalizeAsync(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.UNCANONICALIZE_ASYNC_TRANSACTION, data, null, Binder.FLAG_ONEWAY); } finally { data.recycle(); } } @Override public boolean refresh(String callingPkg, @Nullable String featureId, Uri url, Bundle extras, ICancellationSignal signal) throws RemoteException { Loading
core/java/android/content/ContentResolver.java +8 −1 Original line number Diff line number Diff line Loading @@ -1338,7 +1338,14 @@ public abstract class ContentResolver implements ContentInterface { } try { return provider.uncanonicalize(mPackageName, mAttributionTag, url); final UriResultListener resultListener = new UriResultListener(); provider.uncanonicalizeAsync(mPackageName, mAttributionTag, url, new RemoteCallback(resultListener)); resultListener.waitForResult(CONTENT_PROVIDER_TIMEOUT_MILLIS); if (resultListener.exception != null) { throw resultListener.exception; } return resultListener.result; } catch (RemoteException e) { // Arbitrary and not worth documenting, as Activity // Manager will kill this process shortly anyway. Loading
core/java/android/content/IContentProvider.java +9 −0 Original line number Diff line number Diff line Loading @@ -137,6 +137,14 @@ public interface IContentProvider extends IInterface { public Uri uncanonicalize(String callingPkg, @Nullable String attributionTag, Uri uri) throws RemoteException; /** * A oneway version of uncanonicalize. The functionality is exactly the same, except that the * call returns immediately, and the resulting type is returned when available via * a binder callback. */ void uncanonicalizeAsync(String callingPkg, @Nullable String attributionTag, Uri uri, RemoteCallback callback) throws RemoteException; public boolean refresh(String callingPkg, @Nullable String attributionTag, Uri url, @Nullable Bundle extras, ICancellationSignal cancellationSignal) throws RemoteException; Loading Loading @@ -172,4 +180,5 @@ public interface IContentProvider extends IInterface { static final int CHECK_URI_PERMISSION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 27; int GET_TYPE_ASYNC_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 28; int CANONICALIZE_ASYNC_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 29; int UNCANONICALIZE_ASYNC_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 30; }
core/tests/coretests/src/android/content/ContentResolverTest.java +8 −0 Original line number Diff line number Diff line Loading @@ -261,4 +261,12 @@ public class ContentResolverTest { // Expected } } @Test public void testUncanonicalize() { Uri uncanonical = mResolver.uncanonicalize( Uri.parse("content://android.content.FakeProviderRemote/something")); assertThat(uncanonical).isEqualTo( Uri.parse("content://android.content.FakeProviderRemote/uncanonical")); } }