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

Commit 1a7d98b7 authored by Felipe Leme's avatar Felipe Leme Committed by Android (Google) Code Review
Browse files

Merge "Added new API for URI permissions management."

parents 63ea81eb f3fa0f8f
Loading
Loading
Loading
Loading
+42 −0
Original line number Diff line number Diff line
@@ -36,10 +36,12 @@ import com.android.internal.util.FastPrintWriter;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.UriPermission;
import android.content.pm.ApplicationInfo;
import android.content.pm.ConfigurationInfo;
import android.content.pm.IPackageDataObserver;
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.graphics.Bitmap;
@@ -59,6 +61,7 @@ import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Size;
import android.util.Slog;

import org.xmlpull.v1.XmlSerializer;

import java.io.FileDescriptor;
@@ -2256,6 +2259,45 @@ public class ActivityManager {
        return clearApplicationUserData(mContext.getPackageName(), null);
    }


    /**
     * Permits an application to get the persistent URI permissions granted to another.
     *
     * <p>Typically called by Settings.
     *
     * @param packageName application to look for the granted permissions
     * @return list of granted URI permissions
     *
     * @hide
     */
    public ParceledListSlice<UriPermission> getGrantedUriPermissions(String packageName) {
        try {
            return ActivityManagerNative.getDefault().getGrantedUriPermissions(packageName,
                    UserHandle.myUserId());
        } catch (RemoteException e) {
            Log.e(TAG, "Couldn't get granted URI permissions for :" + packageName, e);
            return ParceledListSlice.emptyList();
        }
    }

    /**
     * Permits an application to clear the persistent URI permissions granted to another.
     *
     * <p>Typically called by Settings.
     *
     * @param packageName application to clear its granted permissions
     *
     * @hide
     */
    public void clearGrantedUriPermissions(String packageName) {
        try {
            ActivityManagerNative.getDefault().clearGrantedUriPermissions(packageName,
                    UserHandle.myUserId());
        } catch (RemoteException e) {
            Log.e(TAG, "Couldn't clear granted URI permissions for :" + packageName, e);
        }
    }

    /**
     * Information you can retrieve about any processes that are in an error condition.
     */
+52 −0
Original line number Diff line number Diff line
@@ -1408,6 +1408,26 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
            return true;
        }

        case GET_GRANTED_URI_PERMISSIONS_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            final String packageName = data.readString();
            final int userId = data.readInt();
            final ParceledListSlice<UriPermission> perms = getGrantedUriPermissions(packageName,
                    userId);
            reply.writeNoException();
            perms.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
            return true;
        }

        case CLEAR_GRANTED_URI_PERMISSIONS_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            final String packageName = data.readString();
            final int userId = data.readInt();
            clearGrantedUriPermissions(packageName, userId);
            reply.writeNoException();
            return true;
        }

        case SHOW_WAITING_FOR_DEBUGGER_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            IBinder b = data.readStrongBinder();
@@ -4611,6 +4631,7 @@ class ActivityManagerProxy implements IActivityManager
        data.writeInt(incoming ? 1 : 0);
        mRemote.transact(GET_PERSISTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0);
        reply.readException();
        @SuppressWarnings("unchecked")
        final ParceledListSlice<UriPermission> perms = ParceledListSlice.CREATOR.createFromParcel(
                reply);
        data.recycle();
@@ -4618,6 +4639,37 @@ class ActivityManagerProxy implements IActivityManager
        return perms;
    }

    @Override
    public ParceledListSlice<UriPermission> getGrantedUriPermissions(String packageName, int userId)
            throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        data.writeString(packageName);
        data.writeInt(userId);
        mRemote.transact(GET_GRANTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0);
        reply.readException();
        @SuppressWarnings("unchecked")
        final ParceledListSlice<UriPermission> perms = ParceledListSlice.CREATOR.createFromParcel(
                reply);
        data.recycle();
        reply.recycle();
        return perms;
    }

    @Override
    public void clearGrantedUriPermissions(String packageName, int userId) throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        data.writeString(packageName);
        data.writeInt(userId);
        mRemote.transact(CLEAR_GRANTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0);
        reply.readException();
        data.recycle();
        reply.recycle();
    }

    public void showWaitingForDebugger(IApplicationThread who, boolean waiting)
            throws RemoteException {
        Parcel data = Parcel.obtain();
+11 −0
Original line number Diff line number Diff line
@@ -276,6 +276,15 @@ public interface IActivityManager extends IInterface {
    public ParceledListSlice<UriPermission> getPersistedUriPermissions(
            String packageName, boolean incoming) throws RemoteException;

    // Gets the URI permissions granted to an arbitrary package.
    // NOTE: this is different from getPersistedUriPermissions(), which returns the URIs the package
    // granted to another packages (instead of those granted to it).
    public ParceledListSlice<UriPermission> getGrantedUriPermissions(String packageName, int userId)
            throws RemoteException;

    // Clears the URI permissions granted to an arbitrary package.
    public void clearGrantedUriPermissions(String packageName, int userId) throws RemoteException;

    public void showWaitingForDebugger(IApplicationThread who, boolean waiting)
            throws RemoteException;

@@ -949,4 +958,6 @@ public interface IActivityManager extends IInterface {
    int GET_URI_PERMISSION_OWNER_FOR_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 357;
    int RESIZE_DOCKED_STACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 358;
    int SET_VR_MODE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 359;
    int GET_GRANTED_URI_PERMISSIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 360;
    int CLEAR_GRANTED_URI_PERMISSIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 361;
}
+18 −0
Original line number Diff line number Diff line
@@ -391,6 +391,9 @@
    <protected-broadcast android:name="android.app.action.NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED" />
    <protected-broadcast android:name="android.os.action.ACTION_EFFECTS_SUPPRESSOR_CHANGED" />

    <protected-broadcast android:name="android.permission.GET_APP_GRANTED_URI_PERMISSIONS" />
    <protected-broadcast android:name="android.permission.CLEAR_APP_GRANTED_URI_PERMISSIONS" />

    <!-- ====================================================================== -->
    <!--                          RUNTIME PERMISSIONS                           -->
    <!-- ====================================================================== -->
@@ -2192,6 +2195,21 @@
    <permission android:name="android.permission.CLEAR_APP_USER_DATA"
        android:protectionLevel="signature|installer" />

    <!-- @hide Allows an application to get the URI permissions
         granted to another application.
         <p>Not for use by third-party applications
    -->
    <permission android:name="android.permission.GET_APP_GRANTED_URI_PERMISSIONS"
        android:protectionLevel="signature" />

    <!-- @hide Allows an application to clear the URI permissions
         granted to another application.
         <p>Not for use by third-party applications
    -->
    <permission
        android:name="android.permission.CLEAR_APP_GRANTED_URI_PERMISSIONS"
        android:protectionLevel="signature" />

    <!-- @SystemApi Allows an application to delete cache files.
    <p>Not for use by third-party applications. -->
    <permission android:name="android.permission.DELETE_CACHE_FILES"
+29 −0
Original line number Diff line number Diff line
@@ -8637,6 +8637,35 @@ public final class ActivityManagerService extends ActivityManagerNative
        return new ParceledListSlice<android.content.UriPermission>(result);
    }
    @Override
    public ParceledListSlice<android.content.UriPermission> getGrantedUriPermissions(
            String packageName, int userId) {
        enforceCallingPermission(android.Manifest.permission.GET_APP_GRANTED_URI_PERMISSIONS,
                "getGrantedUriPermissions");
        final ArrayList<android.content.UriPermission> result = Lists.newArrayList();
        synchronized (this) {
            final int size = mGrantedUriPermissions.size();
            for (int i = 0; i < size; i++) {
                final ArrayMap<GrantUri, UriPermission> perms = mGrantedUriPermissions.valueAt(i);
                for (UriPermission perm : perms.values()) {
                    if (packageName.equals(perm.targetPkg) && perm.targetUserId == userId
                            && perm.persistedModeFlags != 0) {
                        result.add(perm.buildPersistedPublicApiObject());
                    }
                }
            }
        }
        return new ParceledListSlice<android.content.UriPermission>(result);
    }
    @Override
    public void clearGrantedUriPermissions(String packageName, int userId) {
        enforceCallingPermission(android.Manifest.permission.CLEAR_APP_GRANTED_URI_PERMISSIONS,
                "clearGrantedUriPermissions");
        removeUriPermissionsForPackageLocked(packageName, userId, true);
    }
    @Override
    public void showWaitingForDebugger(IApplicationThread who, boolean waiting) {
        synchronized (this) {