summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSvetoslav Ganov <svetoslavganov@google.com>2016-04-29 21:40:17 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2016-04-29 21:40:17 +0000
commit9154c12ce75af52ecf7b260600d62d64918105ff (patch)
tree8479f3ba8a45fc26b2dce9bba9d4a5b855a097eb
parentc9cf85cbdc0099c94e51bf88ec848cb294bce52c (diff)
parent294b6406798c59e9db5ffa99d042f9b8c6ca6f90 (diff)
downloadandroid_packages_apps_PackageInstaller-9154c12ce75af52ecf7b260600d62d64918105ff.tar.gz
android_packages_apps_PackageInstaller-9154c12ce75af52ecf7b260600d62d64918105ff.tar.bz2
android_packages_apps_PackageInstaller-9154c12ce75af52ecf7b260600d62d64918105ff.zip
Merge "Grant only the requested permissions" into nyc-dev
-rw-r--r--src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java50
-rw-r--r--src/com/android/packageinstaller/permission/utils/ArrayUtils.java18
2 files changed, 59 insertions, 9 deletions
diff --git a/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java b/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java
index 78d33d23..807d3a3b 100644
--- a/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java
+++ b/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java
@@ -29,7 +29,6 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Typeface;
import android.graphics.drawable.Icon;
-import android.hardware.camera2.utils.ArrayUtils;
import android.os.Build;
import android.os.Bundle;
import android.text.SpannableString;
@@ -47,6 +46,7 @@ import com.android.packageinstaller.permission.model.AppPermissionGroup;
import com.android.packageinstaller.permission.model.AppPermissions;
import com.android.packageinstaller.permission.model.Permission;
import com.android.packageinstaller.permission.ui.handheld.GrantPermissionsViewHandlerImpl;
+import com.android.packageinstaller.permission.utils.ArrayUtils;
import com.android.packageinstaller.permission.utils.SafetyNetLogger;
import java.util.ArrayList;
@@ -147,24 +147,36 @@ public class GrantPermissionsActivity extends OverlayTouchActivity
switch (permissionPolicy) {
case DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT: {
if (!group.areRuntimePermissionsGranted()) {
- group.grantRuntimePermissions(false);
+ group.grantRuntimePermissions(false, computeAffectedPermissions(
+ callingPackageInfo, requestedPermission));
}
group.setPolicyFixed();
} break;
case DevicePolicyManager.PERMISSION_POLICY_AUTO_DENY: {
if (group.areRuntimePermissionsGranted()) {
- group.revokeRuntimePermissions(false);
+ group.revokeRuntimePermissions(false, computeAffectedPermissions(
+ callingPackageInfo, requestedPermission));
}
group.setPolicyFixed();
} break;
default: {
if (!group.areRuntimePermissionsGranted()) {
- mRequestGrantPermissionGroups.put(group.getName(),
- new GroupState(group));
+ GroupState state = mRequestGrantPermissionGroups.get(group.getName());
+ if (state == null) {
+ state = new GroupState(group);
+ mRequestGrantPermissionGroups.put(group.getName(), state);
+ }
+ String affectedPermission = computeAffectedPermission(
+ callingPackageInfo, requestedPermission);
+ if (affectedPermission != null) {
+ state.affectedPermissions = ArrayUtils.appendString(
+ state.affectedPermissions, affectedPermission);
+ }
} else {
- group.grantRuntimePermissions(false);
+ group.grantRuntimePermissions(false, computeAffectedPermissions(
+ callingPackageInfo, requestedPermission));
updateGrantResults(group);
}
} break;
@@ -271,10 +283,12 @@ public class GrantPermissionsActivity extends OverlayTouchActivity
GroupState groupState = mRequestGrantPermissionGroups.get(name);
if (groupState.mGroup != null) {
if (granted) {
- groupState.mGroup.grantRuntimePermissions(doNotAskAgain);
+ groupState.mGroup.grantRuntimePermissions(doNotAskAgain,
+ groupState.affectedPermissions);
groupState.mState = GroupState.STATE_ALLOWED;
} else {
- groupState.mGroup.revokeRuntimePermissions(doNotAskAgain);
+ groupState.mGroup.revokeRuntimePermissions(doNotAskAgain,
+ groupState.affectedPermissions);
groupState.mState = GroupState.STATE_DENIED;
}
updateGrantResults(groupState.mGroup);
@@ -286,7 +300,7 @@ public class GrantPermissionsActivity extends OverlayTouchActivity
private void updateGrantResults(AppPermissionGroup group) {
for (Permission permission : group.getPermissions()) {
- final int index = ArrayUtils.getArrayIndex(
+ final int index = ArrayUtils.indexOf(
mRequestedPermissions, permission.getName());
if (index >= 0) {
mGrantResults[index] = permission.isGranted() ? PackageManager.PERMISSION_GRANTED
@@ -402,6 +416,23 @@ public class GrantPermissionsActivity extends OverlayTouchActivity
SafetyNetLogger.logPermissionsRequested(mAppPermissions.getPackageInfo(), groups);
}
+ private static String[] computeAffectedPermissions(PackageInfo callingPackageInfo,
+ String permission) {
+ String affectedPermission = computeAffectedPermission(callingPackageInfo, permission);
+ if (affectedPermission != null) {
+ return new String[] {permission};
+ }
+ return null;
+ }
+
+ private static String computeAffectedPermission(PackageInfo callingPackageInfo,
+ String permission) {
+ if (callingPackageInfo.applicationInfo.targetSdkVersion > Build.VERSION_CODES.M) {
+ return permission;
+ }
+ return null;
+ }
+
private static final class GroupState {
static final int STATE_UNKNOWN = 0;
static final int STATE_ALLOWED = 1;
@@ -409,6 +440,7 @@ public class GrantPermissionsActivity extends OverlayTouchActivity
final AppPermissionGroup mGroup;
int mState = STATE_UNKNOWN;
+ String[] affectedPermissions;
GroupState(AppPermissionGroup group) {
mGroup = group;
diff --git a/src/com/android/packageinstaller/permission/utils/ArrayUtils.java b/src/com/android/packageinstaller/permission/utils/ArrayUtils.java
index 4b7a3947..2af641bc 100644
--- a/src/com/android/packageinstaller/permission/utils/ArrayUtils.java
+++ b/src/com/android/packageinstaller/permission/utils/ArrayUtils.java
@@ -16,6 +16,8 @@
package com.android.packageinstaller.permission.utils;
+import android.text.TextUtils;
+
import java.util.Objects;
public final class ArrayUtils {
@@ -42,4 +44,20 @@ public final class ArrayUtils {
}
return -1;
}
+
+ public static String[] appendString(String[] cur, String val) {
+ if (cur == null) {
+ return new String[] { val };
+ }
+ final int N = cur.length;
+ for (int i = 0; i < N; i++) {
+ if (TextUtils.equals(cur[i], val)) {
+ return cur;
+ }
+ }
+ String[] ret = new String[N + 1];
+ System.arraycopy(cur, 0, ret, 0, N);
+ ret[N] = val;
+ return ret;
+ }
}