diff --git a/api/system-current.txt b/api/system-current.txt index 8bcb0bed0bb56..83a789ad0294b 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -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 getNewPermissions(); + method public java.lang.String getSplitPermission(); method public int getTargetSdk(); } diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 24675d301f4ac..1673c28279b0e 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -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= 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 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); } diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java index aa44eb7e3a265..7ffb22f189b85 100644 --- a/core/java/android/permission/PermissionManager.java +++ b/core/java/android/permission/PermissionManager.java @@ -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 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. * *

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 getSplitPermissions() { - return Arrays.asList(SPLIT_PERMISSIONS); + public @NonNull + List 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 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 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 newPerms, int targetSdk) { - mRootPerm = rootPerm; + mSplitPerm = rootPerm; mNewPerms = newPerms; mTargetSdk = targetSdk; } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 13f084e674944..910860363c261 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -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 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; } diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java index 6f644dd70339b..0a93653ede56b 100644 --- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java @@ -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()); } }