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

Commit a3ba4d98 authored by Philip P. Moltmann's avatar Philip P. Moltmann
Browse files

Make PermissionManager use lists

... as requested per API review.

- Sets require iteration via iterators
- Sets are more expensive to construct
- The advantage of sets (faster .contains) is not used
- The system ensures uniqueness of the entires in the list

Test: Built
Bug: 116798569
Change-Id: I2c3b5c6801b78e0bf942073bde1e90299aee39f6
parent 27ef9e49
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -4201,8 +4201,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
@@ -2919,7 +2919,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;
@@ -2941,11 +2941,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());
            }
        }