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

Commit 35292e51 authored by Kiran Ramachandra's avatar Kiran Ramachandra Committed by Android (Google) Code Review
Browse files

Merge "Added new API to support UX for external device permission" into main

parents fc242d8f bb682627
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -11306,6 +11306,7 @@ package android.permission {
    method public int checkPermissionForPreflight(@NonNull String, @NonNull android.content.AttributionSource);
    method @RequiresPermission(value=android.Manifest.permission.UPDATE_APP_OPS_STATS, conditional=true) public int checkPermissionForStartDataDelivery(@NonNull String, @NonNull android.content.AttributionSource, @Nullable String);
    method public void finishDataDelivery(@NonNull String, @NonNull android.content.AttributionSource);
    method @FlaggedApi("android.permission.flags.device_aware_permission_apis_enabled") @NonNull @RequiresPermission(android.Manifest.permission.GET_RUNTIME_PERMISSIONS) public java.util.Map<java.lang.String,android.permission.PermissionManager.PermissionState> getAllPermissionStates(@NonNull String, @NonNull String);
    method @NonNull @RequiresPermission(android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY) public java.util.Set<java.lang.String> getAutoRevokeExemptionGrantedPackages();
    method @NonNull @RequiresPermission(android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY) public java.util.Set<java.lang.String> getAutoRevokeExemptionRequestedPackages();
    method @FlaggedApi("android.permission.flags.device_aware_permission_apis_enabled") @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS, android.Manifest.permission.GET_RUNTIME_PERMISSIONS}) public int getPermissionFlags(@NonNull String, @NonNull String, @NonNull String);
@@ -11325,6 +11326,14 @@ package android.permission {
    field public static final int PERMISSION_SOFT_DENIED = 1; // 0x1
  }
  @FlaggedApi("android.permission.flags.device_aware_permission_apis_enabled") public static final class PermissionManager.PermissionState implements android.os.Parcelable {
    method @FlaggedApi("android.permission.flags.device_aware_permission_apis_enabled") public int describeContents();
    method @FlaggedApi("android.permission.flags.device_aware_permission_apis_enabled") public int getFlags();
    method @FlaggedApi("android.permission.flags.device_aware_permission_apis_enabled") public boolean isGranted();
    method @FlaggedApi("android.permission.flags.device_aware_permission_apis_enabled") public void writeToParcel(@NonNull android.os.Parcel, int);
    field @FlaggedApi("android.permission.flags.device_aware_permission_apis_enabled") @NonNull public static final android.os.Parcelable.Creator<android.permission.PermissionManager.PermissionState> CREATOR;
  }
  public static final class PermissionManager.SplitPermissionInfo {
    method @NonNull public java.util.List<java.lang.String> getNewPermissions();
    method @NonNull public String getSplitPermission();
+9 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.content.pm.PermissionInfo;
import android.content.pm.permission.SplitPermissionInfoParcelable;
import android.os.UserHandle;
import android.permission.IOnPermissionsChangeListener;
import android.permission.PermissionManager.PermissionState;

/**
 * Interface to communicate directly with the permission manager service.
@@ -103,4 +104,12 @@ interface IPermissionManager {
            int userId);

    int checkUidPermission(int uid, String permissionName, int deviceId);

    Map<String, PermissionState> getAllPermissionStates(String packageName, String persistentDeviceId, int userId);
}

/**
 * Data class for the state of a permission requested by a package
 * @hide
 */
parcelable PermissionManager.PermissionState;
+90 −0
Original line number Diff line number Diff line
@@ -66,6 +66,8 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -89,6 +91,7 @@ import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

@@ -1784,6 +1787,29 @@ public final class PermissionManager {
        return sPermissionCache.query(new PermissionQuery(permission, pid, uid, deviceId));
    }

    /**
     * Gets the permission states for requested package and persistent device.
     *
     * @param packageName name of the package you are checking against
     * @param persistentDeviceId id of the persistent device you are checking against
     * @return mapping of all permission states keyed by their permission names
     *
     * @hide
     */
    @SystemApi
    @NonNull
    @RequiresPermission(android.Manifest.permission.GET_RUNTIME_PERMISSIONS)
    @FlaggedApi(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED)
    public Map<String, PermissionState> getAllPermissionStates(@NonNull String packageName,
            @NonNull String persistentDeviceId) {
        try {
            return mPermissionManager.getAllPermissionStates(packageName, persistentDeviceId,
                    mContext.getUserId());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Make checkPermission() above bypass the permission cache in this process.
     *
@@ -1979,4 +2005,68 @@ public final class PermissionManager {
            }
        }
    }

    /**
     * Data class for the state of a permission requested by a package
     *
     * @hide
     */
    @SystemApi
    @FlaggedApi(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED)
    public static final class PermissionState implements Parcelable {
        private final boolean mGranted;
        private final int mFlags;

        /** @hide */
        @FlaggedApi(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED)
        public PermissionState(boolean granted, int flags) {
            mGranted = granted;
            mFlags = flags;
        }

        /**
         * Returns whether this permission is granted
         */
        @FlaggedApi(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED)
        public boolean isGranted() {
            return mGranted;
        }

        /**
         * Returns the flags associated with this permission state
         * @see PackageManager#getPermissionFlags
         */
        @FlaggedApi(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED)
        public int getFlags() {
            return mFlags;
        }

        @FlaggedApi(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED)
        @Override
        public int describeContents() {
            return 0;
        }

        @FlaggedApi(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED)
        @Override
        public void writeToParcel(@NonNull Parcel parcel, int flags) {
            parcel.writeBoolean(mGranted);
            parcel.writeInt(mFlags);
        }

        private PermissionState(Parcel parcel) {
            this(parcel.readBoolean(), parcel.readInt());
        }

        @FlaggedApi(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED)
        public static final @NonNull Creator<PermissionState> CREATOR = new Creator<>() {
            public PermissionState createFromParcel(Parcel source) {
                return new PermissionState(source);
            }

            public PermissionState[] newArray(int size) {
                return new PermissionState[size];
            }
        };
    }
}
+8 −0
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ import android.permission.IPermissionChecker;
import android.permission.IPermissionManager;
import android.permission.PermissionCheckerManager;
import android.permission.PermissionManager;
import android.permission.PermissionManager.PermissionState;
import android.permission.PermissionManagerInternal;
import android.service.voice.VoiceInteractionManagerInternal;
import android.util.ArrayMap;
@@ -257,6 +258,13 @@ public class PermissionManagerService extends IPermissionManager.Stub {
                deviceId, mPermissionManagerServiceImpl::checkUidPermission);
    }

    @Override
    public Map<String, PermissionState> getAllPermissionStates(@NonNull String packageName,
            @NonNull String persistentDeviceId, int userId) {
        return mPermissionManagerServiceImpl.getAllPermissionStates(packageName,
                persistentDeviceId, userId);
    }

    @Override
    public boolean setAutoRevokeExempted(
            @NonNull String packageName, boolean exempted, int userId) {
+7 −0
Original line number Diff line number Diff line
@@ -999,6 +999,13 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt
        return checkUidPermissionInternal(pkg, uid, permName);
    }

    @Override
    public Map<String, PermissionManager.PermissionState> getAllPermissionStates(
            @NonNull String packageName, @NonNull String persistentDeviceId, int userId) {
        throw new UnsupportedOperationException(
                "This method is supported in newer implementation only");
    }

    /**
     * Checks whether or not the given package has been granted the specified
     * permission. If the given package is {@code null}, we instead check the
Loading