Loading api/system-current.txt +2 −2 Original line number Diff line number Diff line Loading @@ -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(); } Loading core/java/android/content/pm/PackageParser.java +6 −6 Original line number Diff line number Diff line Loading @@ -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); } Loading core/java/android/permission/PermissionManager.java +37 −18 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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; Loading @@ -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 Loading @@ -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. * Loading @@ -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; } /** Loading @@ -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; } Loading @@ -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; } Loading services/core/java/com/android/server/pm/PackageManagerService.java +4 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; } services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +2 −2 Original line number Diff line number Diff line Loading @@ -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()); } } Loading Loading
api/system-current.txt +2 −2 Original line number Diff line number Diff line Loading @@ -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(); } Loading
core/java/android/content/pm/PackageParser.java +6 −6 Original line number Diff line number Diff line Loading @@ -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); } Loading
core/java/android/permission/PermissionManager.java +37 −18 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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; Loading @@ -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 Loading @@ -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. * Loading @@ -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; } /** Loading @@ -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; } Loading @@ -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; } Loading
services/core/java/com/android/server/pm/PackageManagerService.java +4 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; }
services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +2 −2 Original line number Diff line number Diff line Loading @@ -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()); } } Loading