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

Commit be17a614 authored by Jeff Sharkey's avatar Jeff Sharkey Committed by Android (Google) Code Review
Browse files

Merge "Require that persistable Uri permissions be taken." into klp-dev

parents c499f5b2 e66c1778
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -5746,11 +5746,10 @@ package android.content {
    method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
    method public static deprecated android.content.SyncInfo getCurrentSync();
    method public static java.util.List<android.content.SyncInfo> getCurrentSyncs();
    method public android.net.Uri[] getIncomingUriPermissionGrants(int, int);
    method public static int getIsSyncable(android.accounts.Account, java.lang.String);
    method public static boolean getMasterSyncAutomatically();
    method public android.net.Uri[] getOutgoingUriPermissionGrants(int, int);
    method public static java.util.List<android.content.PeriodicSync> getPeriodicSyncs(android.accounts.Account, java.lang.String);
    method public java.util.List<android.content.UriPermission> getPersistedUriPermissions();
    method public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
    method public static android.content.SyncAdapterType[] getSyncAdapterTypes();
    method public static boolean getSyncAutomatically(android.accounts.Account, java.lang.String);
@@ -5772,6 +5771,7 @@ package android.content {
    method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
    method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
    method public final void registerContentObserver(android.net.Uri, boolean, android.database.ContentObserver);
    method public void releasePersistableUriPermission(android.net.Uri, int);
    method public static void removePeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle);
    method public static void removeStatusChangeListener(java.lang.Object);
    method public static void requestSync(android.accounts.Account, java.lang.String, android.os.Bundle);
@@ -5780,6 +5780,7 @@ package android.content {
    method public static void setMasterSyncAutomatically(boolean);
    method public static void setSyncAutomatically(android.accounts.Account, java.lang.String, boolean);
    method public deprecated void startSync(android.net.Uri, android.os.Bundle);
    method public void takePersistableUriPermission(android.net.Uri, int);
    method public final android.net.Uri uncanonicalize(android.net.Uri);
    method public final void unregisterContentObserver(android.database.ContentObserver);
    method public final int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
@@ -6517,10 +6518,10 @@ package android.content {
    field public static final int FLAG_DEBUG_LOG_RESOLUTION = 8; // 0x8
    field public static final int FLAG_EXCLUDE_STOPPED_PACKAGES = 16; // 0x10
    field public static final int FLAG_FROM_BACKGROUND = 4; // 0x4
    field public static final int FLAG_GRANT_PERSISTABLE_URI_PERMISSION = 64; // 0x40
    field public static final int FLAG_GRANT_READ_URI_PERMISSION = 1; // 0x1
    field public static final int FLAG_GRANT_WRITE_URI_PERMISSION = 2; // 0x2
    field public static final int FLAG_INCLUDE_STOPPED_PACKAGES = 32; // 0x20
    field public static final int FLAG_PERSIST_GRANT_URI_PERMISSION = 64; // 0x40
    field public static final int FLAG_RECEIVER_FOREGROUND = 268435456; // 0x10000000
    field public static final int FLAG_RECEIVER_NO_ABORT = 134217728; // 0x8000000
    field public static final int FLAG_RECEIVER_REGISTERED_ONLY = 1073741824; // 0x40000000
@@ -6913,6 +6914,17 @@ package android.content {
    field public static final int NO_MATCH = -1; // 0xffffffff
  }
  public final class UriPermission implements android.os.Parcelable {
    method public int describeContents();
    method public long getPersistedTime();
    method public android.net.Uri getUri();
    method public boolean isReadPermission();
    method public boolean isWritePermission();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator CREATOR;
    field public static final long INVALID_TIME = -9223372036854775808L; // 0x8000000000000000L
  }
}
package android.content.pm {
@@ -20956,7 +20968,6 @@ package android.provider {
    method public static boolean deleteDocument(android.content.ContentResolver, android.net.Uri);
    method public static java.lang.String getDocumentId(android.net.Uri);
    method public static android.graphics.Bitmap getDocumentThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point, android.os.CancellationSignal);
    method public static android.net.Uri[] getOpenDocuments(android.content.Context);
    method public static java.lang.String getRootId(android.net.Uri);
    method public static java.lang.String getSearchDocumentsQuery(android.net.Uri);
    field public static final java.lang.String EXTRA_ERROR = "error";
+69 −31
Original line number Diff line number Diff line
@@ -23,9 +23,11 @@ import android.content.IIntentSender;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentSender;
import android.content.UriPermission;
import android.content.pm.ApplicationInfo;
import android.content.pm.ConfigurationInfo;
import android.content.pm.IPackageDataObserver;
import android.content.pm.ParceledListSlice;
import android.content.pm.UserInfo;
import android.content.res.Configuration;
import android.graphics.Bitmap;
@@ -1130,6 +1132,32 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
            return true;
        }

        case TAKE_PERSISTABLE_URI_PERMISSION_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            Uri uri = Uri.CREATOR.createFromParcel(data);
            int mode = data.readInt();
            takePersistableUriPermission(uri, mode);
            reply.writeNoException();
            return true;
        }

        case RELEASE_PERSISTABLE_URI_PERMISSION_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            Uri uri = Uri.CREATOR.createFromParcel(data);
            int mode = data.readInt();
            releasePersistableUriPermission(uri, mode);
            reply.writeNoException();
            return true;
        }

        case GET_PERSISTED_URI_PERMISSIONS_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            final ParceledListSlice<UriPermission> perms = getPersistedUriPermissions();
            reply.writeNoException();
            perms.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
            return true;
        }

        case SHOW_WAITING_FOR_DEBUGGER_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            IBinder b = data.readStrongBinder();
@@ -1983,19 +2011,6 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
            return true;
        }

        case GET_GRANTED_URI_PERMISSIONS_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            final String sourcePackage = data.readString();
            final String targetPackage = data.readString();
            final int modeFlags = data.readInt();
            final int modeMask = data.readInt();
            final Uri[] uris = getGrantedUriPermissions(
                    sourcePackage, targetPackage, modeFlags, modeMask);
            reply.writeNoException();
            reply.writeParcelableArray(uris, 0);
            return true;
        }

        case PERFORM_IDLE_MAINTENANCE_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            performIdleMaintenance();
@@ -3436,6 +3451,47 @@ class ActivityManagerProxy implements IActivityManager
        data.recycle();
        reply.recycle();
    }

    @Override
    public void takePersistableUriPermission(Uri uri, int mode) throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        uri.writeToParcel(data, 0);
        data.writeInt(mode);
        mRemote.transact(TAKE_PERSISTABLE_URI_PERMISSION_TRANSACTION, data, reply, 0);
        reply.readException();
        data.recycle();
        reply.recycle();
    }

    @Override
    public void releasePersistableUriPermission(Uri uri, int mode) throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        uri.writeToParcel(data, 0);
        data.writeInt(mode);
        mRemote.transact(RELEASE_PERSISTABLE_URI_PERMISSION_TRANSACTION, data, reply, 0);
        reply.readException();
        data.recycle();
        reply.recycle();
    }

    @Override
    public ParceledListSlice<UriPermission> getPersistedUriPermissions() throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        mRemote.transact(GET_PERSISTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0);
        reply.readException();
        final ParceledListSlice<UriPermission> perms = ParceledListSlice.CREATOR.createFromParcel(
                reply);
        data.recycle();
        reply.recycle();
        return perms;
    }

    public void showWaitingForDebugger(IApplicationThread who, boolean waiting)
            throws RemoteException {
        Parcel data = Parcel.obtain();
@@ -4567,24 +4623,6 @@ class ActivityManagerProxy implements IActivityManager
        reply.recycle();
    }

    public Uri[] getGrantedUriPermissions(
            String sourcePackage, String targetPackage, int modeFlags, int modeMask)
            throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        data.writeString(sourcePackage);
        data.writeString(targetPackage);
        data.writeInt(modeFlags);
        data.writeInt(modeMask);
        mRemote.transact(GET_GRANTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0);
        reply.readException();
        final Uri[] uris = (Uri[]) reply.readParcelableArray(null);
        data.recycle();
        reply.recycle();
        return uris;
    }

    public void performIdleMaintenance() throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
+10 −7
Original line number Diff line number Diff line
@@ -27,9 +27,11 @@ import android.content.IIntentSender;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentSender;
import android.content.UriPermission;
import android.content.pm.ApplicationInfo;
import android.content.pm.ConfigurationInfo;
import android.content.pm.IPackageDataObserver;
import android.content.pm.ParceledListSlice;
import android.content.pm.ProviderInfo;
import android.content.pm.UserInfo;
import android.content.res.Configuration;
@@ -210,6 +212,9 @@ public interface IActivityManager extends IInterface {
            Uri uri, int mode) throws RemoteException;
    public void revokeUriPermission(IApplicationThread caller, Uri uri,
            int mode) throws RemoteException;
    public void takePersistableUriPermission(Uri uri, int modeFlags) throws RemoteException;
    public void releasePersistableUriPermission(Uri uri, int modeFlags) throws RemoteException;
    public ParceledListSlice<UriPermission> getPersistedUriPermissions() throws RemoteException;

    public void showWaitingForDebugger(IApplicationThread who, boolean waiting)
            throws RemoteException;
@@ -399,10 +404,6 @@ public interface IActivityManager extends IInterface {

    public void restart() throws RemoteException;

    public Uri[] getGrantedUriPermissions(
            String sourcePackage, String targetPackage, int modeFlags, int modeMask)
            throws RemoteException;

    public void performIdleMaintenance() throws RemoteException;

    /*
@@ -686,6 +687,8 @@ public interface IActivityManager extends IInterface {
    int NOTIFY_ACTIVITY_DRAWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+175;
    int REPORT_ACTIVITY_FULLY_DRAWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+176;
    int RESTART_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+177;
    int GET_GRANTED_URI_PERMISSIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+178;
    int PERFORM_IDLE_MAINTENANCE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+179;
    int PERFORM_IDLE_MAINTENANCE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+178;
    int TAKE_PERSISTABLE_URI_PERMISSION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+179;
    int RELEASE_PERSISTABLE_URI_PERMISSION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+180;
    int GET_PERSISTED_URI_PERMISSIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+181;
}
+40 −38
Original line number Diff line number Diff line
@@ -266,12 +266,18 @@ public abstract class ContentResolver {

    /** @hide */
    protected abstract IContentProvider acquireProvider(Context c, String name);
    /** Providing a default implementation of this, to avoid having to change
     * a lot of other things, but implementations of ContentResolver should
     * implement it. @hide */

    /**
     * Providing a default implementation of this, to avoid having to change a
     * lot of other things, but implementations of ContentResolver should
     * implement it.
     *
     * @hide
     */
    protected IContentProvider acquireExistingProvider(Context c, String name) {
        return acquireProvider(c, name);
    }

    /** @hide */
    public abstract boolean releaseProvider(IContentProvider icp);
    /** @hide */
@@ -1616,54 +1622,50 @@ public abstract class ContentResolver {
    }

    /**
     * Return list of all Uri permissions that have been granted <em>to</em> the
     * calling package, and which exactly match the requested flags. For
     * example, to return all Uris that the calling application has
     * <em>non-persistent</em> read access to:
     *
     * <pre class="prettyprint">
     * getIncomingUriPermissionGrants(Intent.FLAG_GRANT_READ_URI_PERMISSION,
     *         Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION);
     * </pre>
     * Take a persistable Uri permission grant that has been offered. Once
     * taken, the permission grant will be remembered across device reboots.
     * Only Uri permissions granted with
     * {@link Intent#FLAG_GRANT_PERSISTABLE_URI_PERMISSION} can be persisted. If
     * the grant has already been persisted, taking it again will touch
     * {@link UriPermission#getPersistedTime()}.
     *
     * @param modeFlags any combination of
     *            {@link Intent#FLAG_GRANT_READ_URI_PERMISSION},
     *            {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION}, or
     *            {@link Intent#FLAG_PERSIST_GRANT_URI_PERMISSION}.
     * @param modeMask mask indicating which flags must match.
     * @see #getPersistedUriPermissions()
     */
    public Uri[] getIncomingUriPermissionGrants(int modeFlags, int modeMask) {
    public void takePersistableUriPermission(Uri uri, int modeFlags) {
        try {
            return ActivityManagerNative.getDefault()
                    .getGrantedUriPermissions(null, getPackageName(), modeFlags, modeMask);
            ActivityManagerNative.getDefault().takePersistableUriPermission(uri, modeFlags);
        } catch (RemoteException e) {
            return new Uri[0];
        }
    }

    /**
     * Return list of all Uri permissions that have been granted <em>from</em> the
     * calling package, and which exactly match the requested flags. For
     * example, to return all Uris that the calling application has granted
     * <em>non-persistent</em> read access to:
     * Relinquish a persisted Uri permission grant. The Uri must have been
     * previously made persistent with
     * {@link #takePersistableUriPermission(Uri, int)}. Any non-persistent
     * grants to the calling package will remain intact.
     *
     * <pre class="prettyprint">
     * getOutgoingUriPermissionGrants(Intent.FLAG_GRANT_READ_URI_PERMISSION,
     *         Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION);
     * </pre>
     * @see #getPersistedUriPermissions()
     */
    public void releasePersistableUriPermission(Uri uri, int modeFlags) {
        try {
            ActivityManagerNative.getDefault().releasePersistableUriPermission(uri, modeFlags);
        } catch (RemoteException e) {
        }
    }

    /**
     * Return list of all Uri permission grants that have been persisted for the
     * calling app. Only persistable grants taken with
     * {@link #takePersistableUriPermission(Uri, int)} are returned.
     *
     * @param modeFlags any combination of
     *            {@link Intent#FLAG_GRANT_READ_URI_PERMISSION},
     *            {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION}, or
     *            {@link Intent#FLAG_PERSIST_GRANT_URI_PERMISSION}.
     * @param modeMask mask indicating which flags must match.
     * @see #takePersistableUriPermission(Uri, int)
     * @see #releasePersistableUriPermission(Uri, int)
     */
    public Uri[] getOutgoingUriPermissionGrants(int modeFlags, int modeMask) {
    public List<UriPermission> getPersistedUriPermissions() {
        try {
            return ActivityManagerNative.getDefault()
                    .getGrantedUriPermissions(getPackageName(), null, modeFlags, modeMask);
            return ActivityManagerNative.getDefault().getPersistedUriPermissions().getList();
        } catch (RemoteException e) {
            return new Uri[0];
            throw new RuntimeException("Activity manager has died", e);
        }
    }

+12 −6
Original line number Diff line number Diff line
@@ -3339,12 +3339,18 @@ public class Intent implements Parcelable, Cloneable {

    /**
     * When combined with {@link #FLAG_GRANT_READ_URI_PERMISSION} and/or
     * {@link #FLAG_GRANT_WRITE_URI_PERMISSION}, the grant will be remembered
     * until explicitly revoked with
     * {@link Context#revokeUriPermission(Uri, int)}. These grants persist
     * across device reboots.
     * {@link #FLAG_GRANT_WRITE_URI_PERMISSION}, the Uri permission grant can be
     * persisted across device reboots until explicitly revoked with
     * {@link Context#revokeUriPermission(Uri, int)}. This flag only offers the
     * grant for possible persisting; the receiving application must call
     * {@link ContentResolver#takePersistableUriPermission(Uri, int)} to
     * actually persist.
     *
     * @see ContentResolver#takePersistableUriPermission(Uri, int)
     * @see ContentResolver#releasePersistableUriPermission(Uri, int)
     * @see ContentResolver#getPersistedUriPermissions()
     */
    public static final int FLAG_PERSIST_GRANT_URI_PERMISSION = 0x00000040;
    public static final int FLAG_GRANT_PERSISTABLE_URI_PERMISSION = 0x00000040;

    /**
     * If set, the new activity is not kept in the history stack.  As soon as
@@ -7173,7 +7179,7 @@ public class Intent implements Parcelable, Cloneable {
                    setClipData(target.getClipData());
                    addFlags(target.getFlags()
                            & (FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION
                                    | FLAG_PERSIST_GRANT_URI_PERMISSION));
                                    | FLAG_GRANT_PERSISTABLE_URI_PERMISSION));
                    return true;
                } else {
                    return false;
Loading