summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/android/packageinstaller/permission/model/AppPermissionGroup.java4
-rw-r--r--src/com/android/packageinstaller/permission/model/PermissionApps.java4
-rw-r--r--src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java50
-rw-r--r--src/com/android/packageinstaller/permission/ui/ReviewPermissionsActivity.java4
-rw-r--r--src/com/android/packageinstaller/permission/utils/ArrayUtils.java18
5 files changed, 65 insertions, 15 deletions
diff --git a/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java b/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java
index ca66449d..a6601165 100644
--- a/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java
+++ b/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java
@@ -162,10 +162,6 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
group.addPermission(permission);
}
- if (group.getPermissions().isEmpty()) {
- return null;
- }
-
return group;
}
diff --git a/src/com/android/packageinstaller/permission/model/PermissionApps.java b/src/com/android/packageinstaller/permission/model/PermissionApps.java
index b40b5b9f..2025420e 100644
--- a/src/com/android/packageinstaller/permission/model/PermissionApps.java
+++ b/src/com/android/packageinstaller/permission/model/PermissionApps.java
@@ -190,6 +190,10 @@ public class PermissionApps {
AppPermissionGroup group = AppPermissionGroup.create(mContext,
app, groupInfo, groupPermInfos, user);
+ if (group == null) {
+ continue;
+ }
+
String label = mSkipUi ? app.packageName
: app.applicationInfo.loadLabel(mPm).toString();
PermissionApp permApp = new PermissionApp(app.packageName,
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/ui/ReviewPermissionsActivity.java b/src/com/android/packageinstaller/permission/ui/ReviewPermissionsActivity.java
index 0596c19b..6bc251ae 100644
--- a/src/com/android/packageinstaller/permission/ui/ReviewPermissionsActivity.java
+++ b/src/com/android/packageinstaller/permission/ui/ReviewPermissionsActivity.java
@@ -302,8 +302,8 @@ public final class ReviewPermissionsActivity extends Activity
final boolean isPackageUpdated = isPackageUpdated();
for (AppPermissionGroup group : mAppPermissions.getPermissionGroups()) {
- if (!Utils.shouldShowPermission(group,
- mAppPermissions.getPackageInfo().packageName)) {
+ if (!Utils.shouldShowPermission(group, mAppPermissions.getPackageInfo().packageName)
+ || !Utils.OS_PKG.equals(group.getDeclaringPackage())) {
continue;
}
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;
+ }
}