Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ec2bc8d9 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Add async version of "uncanonicalize"

This CL is basically identical to http://ag/10353234, which
did the same with the sister method, "canonicalize".

Fixes: b/147705670
Test: atest FrameworksCoreTests:android.content.ContentResolverTest
Change-Id: Ide93850f225cdd61779a62fc2c4666efe438b536
parent b2f811d3
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -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 {
+29 −0
Original line number Diff line number Diff line
@@ -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();
@@ -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 {
+8 −1
Original line number Diff line number Diff line
@@ -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.
+9 −0
Original line number Diff line number Diff line
@@ -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;

@@ -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;
}
+8 −0
Original line number Diff line number Diff line
@@ -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