Merge "Make PermissionManager use lists"

This commit is contained in:
Philip P. Moltmann
2018-10-12 23:43:11 +00:00
committed by Android (Google) Code Review
5 changed files with 51 additions and 32 deletions

View File

@@ -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);
}

View File

@@ -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;
}