From 587512a0cfc88ba2e114a30554fc232d9b2c5a4f Mon Sep 17 00:00:00 2001 From: Svet Ganov Date: Fri, 14 Jul 2017 20:46:43 -0700 Subject: [PATCH] Don't reset review state until no permission requires a review. In a permission review mode we have a per user flag whether a permission review is required for an app to avoid iteration over all permissions on an activity start. This state was incorrectly cleared if a permission review flag is cleared despite the fact that there may me other permissions requiring a review. Test: manual bug:63720758 Change-Id: I3391c9d7e419e2e22f7b053de8e6ed977b6eba91 --- .../com/android/server/pm/PermissionsState.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/pm/PermissionsState.java b/services/core/java/com/android/server/pm/PermissionsState.java index 8a427cd329e26..f4d2ad2c6eb0c 100644 --- a/services/core/java/com/android/server/pm/PermissionsState.java +++ b/services/core/java/com/android/server/pm/PermissionsState.java @@ -427,7 +427,7 @@ public final class PermissionsState { mPermissionReviewRequired.put(userId, true); } else if ((oldFlags & PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED) != 0 && (newFlags & PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED) == 0) { - if (mPermissionReviewRequired != null) { + if (mPermissionReviewRequired != null && !hasPermissionRequiringReview(userId)) { mPermissionReviewRequired.delete(userId); if (mPermissionReviewRequired.size() <= 0) { mPermissionReviewRequired = null; @@ -438,6 +438,18 @@ public final class PermissionsState { return updated; } + private boolean hasPermissionRequiringReview(int userId) { + final int permissionCount = mPermissions.size(); + for (int i = 0; i < permissionCount; i++) { + final PermissionData permission = mPermissions.valueAt(i); + if ((permission.getFlags(userId) + & PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED) != 0) { + return true; + } + } + return false; + } + public boolean updatePermissionFlagsForAllPermissions( int userId, int flagMask, int flagValues) { enforceValidUserId(userId);