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

Commit add32532 authored by Philip P. Moltmann's avatar Philip P. Moltmann Committed by Android (Google) Code Review
Browse files

Merge "Make PermissionManager use lists"

parents 6d0b3051 a3ba4d98
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -4195,8 +4195,8 @@ package android.permission {
  }

  public static final class PermissionManager.SplitPermissionInfo {
    method public java.lang.String[] getNewPermissions();
    method public java.lang.String getRootPermission();
    method public java.util.List<java.lang.String> getNewPermissions();
    method public java.lang.String getSplitPermission();
    method public int getTargetSdk();
  }

+6 −6
Original line number Diff line number Diff line
@@ -2440,17 +2440,17 @@ public class PackageParser {
        }


        final int NS = PermissionManager.SPLIT_PERMISSIONS.length;
        final int NS = PermissionManager.SPLIT_PERMISSIONS.size();
        for (int is=0; is<NS; is++) {
            final PermissionManager.SplitPermissionInfo spi =
                    PermissionManager.SPLIT_PERMISSIONS[is];
                    PermissionManager.SPLIT_PERMISSIONS.get(is);
            if (pkg.applicationInfo.targetSdkVersion >= spi.getTargetSdk()
                    || !pkg.requestedPermissions.contains(spi.getRootPermission())) {
                    || !pkg.requestedPermissions.contains(spi.getSplitPermission())) {
                continue;
            }
            final String[] newPerms = spi.getNewPermissions();
            for (int in = 0; in < newPerms.length; in++) {
                final String perm = newPerms[in];
            final List<String> newPerms = spi.getNewPermissions();
            for (int in = 0; in < newPerms.size(); in++) {
                final String perm = newPerms.get(in);
                if (!pkg.requestedPermissions.contains(perm)) {
                    pkg.requestedPermissions.add(perm);
                }
+37 −18
Original line number Diff line number Diff line
@@ -25,7 +25,9 @@ import android.content.Context;
import com.android.internal.annotations.Immutable;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

/**
 * System level service for accessing the permission capabilities of the platform.
@@ -40,26 +42,28 @@ public final class PermissionManager {
     *
     * @hide
     */
    public static final SplitPermissionInfo[] SPLIT_PERMISSIONS = new SplitPermissionInfo[]{
    public static final List<SplitPermissionInfo> SPLIT_PERMISSIONS = Arrays.asList(
            // READ_EXTERNAL_STORAGE is always required when an app requests
            // WRITE_EXTERNAL_STORAGE, because we can't have an app that has
            // write access without read access.  The hack here with the target
            // target SDK version ensures that this grant is always done.
            new SplitPermissionInfo(android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
                    Collections.singletonList(android.Manifest.permission.READ_EXTERNAL_STORAGE),
                    android.os.Build.VERSION_CODES.CUR_DEVELOPMENT + 1),
            new SplitPermissionInfo(android.Manifest.permission.READ_CONTACTS,
                    new String[]{android.Manifest.permission.READ_CALL_LOG},
                    Collections.singletonList(android.Manifest.permission.READ_CALL_LOG),
                    android.os.Build.VERSION_CODES.JELLY_BEAN),
            new SplitPermissionInfo(android.Manifest.permission.WRITE_CONTACTS,
                    new String[]{android.Manifest.permission.WRITE_CALL_LOG},
                    Collections.singletonList(android.Manifest.permission.WRITE_CALL_LOG),
                    android.os.Build.VERSION_CODES.JELLY_BEAN),
            new SplitPermissionInfo(Manifest.permission.ACCESS_FINE_LOCATION,
                    new String[]{android.Manifest.permission.ACCESS_BACKGROUND_LOCATION},
                    Collections.singletonList(
                            android.Manifest.permission.ACCESS_BACKGROUND_LOCATION),
                    android.os.Build.VERSION_CODES.P0),
            new SplitPermissionInfo(Manifest.permission.ACCESS_COARSE_LOCATION,
                    new String[]{android.Manifest.permission.ACCESS_BACKGROUND_LOCATION},
                    android.os.Build.VERSION_CODES.P0)};
                    Collections.singletonList(
                            android.Manifest.permission.ACCESS_BACKGROUND_LOCATION),
                    android.os.Build.VERSION_CODES.P0));

    private final @NonNull Context mContext;

@@ -74,7 +78,7 @@ public final class PermissionManager {
    }

    /**
     * Get list of permissions that have been split into more granular or dependent permissions.
     * Get set of permissions that have been split into more granular or dependent permissions.
     *
     * <p>E.g. before {@link android.os.Build.VERSION_CODES#P0} an app that was granted
     * {@link Manifest.permission#ACCESS_COARSE_LOCATION} could access he location while it was in
@@ -82,7 +86,7 @@ public final class PermissionManager {
     * the location permission only grants location access while the app is in foreground. This
     * would break apps that target before {@link android.os.Build.VERSION_CODES#P0}. Hence whenever
     * such an old app asks for a location permission (i.e. the
     * {@link SplitPermissionInfo#getRootPermission()}), then the
     * {@link SplitPermissionInfo#getSplitPermission()}), then the
     * {@link Manifest.permission#ACCESS_BACKGROUND_LOCATION} permission (inside
     * {@{@link SplitPermissionInfo#getNewPermissions}) is added.
     *
@@ -91,8 +95,9 @@ public final class PermissionManager {
     *
     * @return All permissions that are split.
     */
    public @NonNull List<SplitPermissionInfo> getSplitPermissions() {
        return Arrays.asList(SPLIT_PERMISSIONS);
    public @NonNull
    List<SplitPermissionInfo> getSplitPermissions() {
        return SPLIT_PERMISSIONS;
    }

    /**
@@ -101,21 +106,35 @@ public final class PermissionManager {
     */
    @Immutable
    public static final class SplitPermissionInfo {
        private final @NonNull String mRootPerm;
        private final @NonNull String[] mNewPerms;
        private final @NonNull String mSplitPerm;
        private final @NonNull List<String> mNewPerms;
        private final int mTargetSdk;

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            SplitPermissionInfo that = (SplitPermissionInfo) o;
            return mTargetSdk == that.mTargetSdk
                    && Objects.equals(mSplitPerm, that.mSplitPerm);
        }

        @Override
        public int hashCode() {
            return Objects.hash(mSplitPerm, mTargetSdk);
        }

        /**
         * Get the permission that is split.
         */
        public @NonNull String getRootPermission() {
            return mRootPerm;
        public @NonNull String getSplitPermission() {
            return mSplitPerm;
        }

        /**
         * Get the permissions that are added.
         */
        public @NonNull String[] getNewPermissions() {
        public @NonNull List<String> getNewPermissions() {
            return mNewPerms;
        }

@@ -126,9 +145,9 @@ public final class PermissionManager {
            return mTargetSdk;
        }

        private SplitPermissionInfo(@NonNull String rootPerm, @NonNull String[] newPerms,
        private SplitPermissionInfo(@NonNull String rootPerm, @NonNull List<String> newPerms,
                int targetSdk) {
            mRootPerm = rootPerm;
            mSplitPerm = rootPerm;
            mNewPerms = newPerms;
            mTargetSdk = targetSdk;
        }
+4 −4
Original line number Diff line number Diff line
@@ -2920,7 +2920,7 @@ public class PackageManagerService extends IPackageManager.Stub
                for (int splitPermNum = 0; splitPermNum < numSplitPerms; splitPermNum++) {
                    final PermissionManager.SplitPermissionInfo splitPerm =
                            splitPermissions.get(splitPermNum);
                    final String rootPerm = splitPerm.getRootPermission();
                    final String rootPerm = splitPerm.getSplitPermission();
                    if (preUpgradeSdkVersion >= splitPerm.getTargetSdk()) {
                        continue;
@@ -2942,11 +2942,11 @@ public class PackageManagerService extends IPackageManager.Stub
                            continue;
                        }
                        final String[] newPerms = splitPerm.getNewPermissions();
                        final List<String> newPerms = splitPerm.getNewPermissions();
                        final int numNewPerms = newPerms.length;
                        final int numNewPerms = newPerms.size();
                        for (int newPermNum = 0; newPermNum < numNewPerms; newPermNum++) {
                            final String newPerm = newPerms[newPermNum];
                            final String newPerm = newPerms.get(newPermNum);
                            if (checkPermission(newPerm, pkgName, userId) == PERMISSION_GRANTED) {
                                continue;
                            }
+2 −2
Original line number Diff line number Diff line
@@ -1033,8 +1033,8 @@ public final class DefaultPermissionGrantPolicy {

            if (applicationInfo != null
                    && applicationInfo.targetSdkVersion < splitPerm.getTargetSdk()
                    && permissionsWithoutSplits.contains(splitPerm.getRootPermission())) {
                Collections.addAll(permissions, splitPerm.getNewPermissions());
                    && permissionsWithoutSplits.contains(splitPerm.getSplitPermission())) {
                permissions.addAll(splitPerm.getNewPermissions());
            }
        }