diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/Settings.java | 71 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/permission/LegacyPermissionState.java | 44 |
2 files changed, 91 insertions, 24 deletions
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 2929568ab1d7..349d556eac87 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -4881,7 +4881,7 @@ public final class Settings implements Watchable, Snappable { } if (ps.sharedUser == null || permissionNames != null || dumpAll) { - dumpInstallPermissionsLPr(pw, prefix + " ", permissionNames, permissionsState); + dumpInstallPermissionsLPr(pw, prefix + " ", permissionNames, permissionsState, users); } if (dumpAllComponents) { @@ -5131,9 +5131,12 @@ public final class Settings implements Watchable, Snappable { continue; } - dumpInstallPermissionsLPr(pw, prefix, permissionNames, permissionsState); + List<UserInfo> users = getAllUsers(UserManagerService.getInstance()); - for (int userId : UserManagerService.getInstance().getUserIds()) { + dumpInstallPermissionsLPr(pw, prefix, permissionNames, permissionsState, users); + + for (UserInfo user : users) { + final int userId = user.id; final int[] gids = mPermissionDataProvider.getGidsForUid(UserHandle.getUid( userId, su.userId)); final Collection<PermissionState> permissions = @@ -5247,31 +5250,55 @@ public final class Settings implements Watchable, Snappable { } } - void dumpInstallPermissionsLPr(PrintWriter pw, String prefix, ArraySet<String> permissionNames, - LegacyPermissionState permissionsState) { - Collection<PermissionState> permissionStates = permissionsState.getPermissionStates( - UserHandle.USER_SYSTEM); - boolean hasInstallPermissions = false; - for (PermissionState permissionState : permissionStates) { - if (!permissionState.isRuntime()) { - hasInstallPermissions = true; - break; - } - } - if (hasInstallPermissions) { - pw.print(prefix); pw.println("install permissions:"); + void dumpInstallPermissionsLPr(PrintWriter pw, String prefix, + ArraySet<String> filterPermissionNames, LegacyPermissionState permissionsState, + List<UserInfo> users) { + ArraySet<String> dumpPermissionNames = new ArraySet<>(); + for (UserInfo user : users) { + int userId = user.id; + Collection<PermissionState> permissionStates = permissionsState.getPermissionStates( + userId); for (PermissionState permissionState : permissionStates) { if (permissionState.isRuntime()) { continue; } - if (permissionNames != null - && !permissionNames.contains(permissionState.getName())) { + String permissionName = permissionState.getName(); + if (filterPermissionNames != null + && !filterPermissionNames.contains(permissionName)) { continue; } - pw.print(prefix); pw.print(" "); pw.print(permissionState.getName()); - pw.print(": granted="); pw.print(permissionState.isGranted()); - pw.println(permissionFlagsToString(", flags=", - permissionState.getFlags())); + dumpPermissionNames.add(permissionName); + } + } + boolean printedSomething = false; + for (String permissionName : dumpPermissionNames) { + PermissionState systemPermissionState = permissionsState.getPermissionState( + permissionName, UserHandle.USER_SYSTEM); + for (UserInfo user : users) { + int userId = user.id; + PermissionState permissionState; + if (userId == UserHandle.USER_SYSTEM) { + permissionState = systemPermissionState; + } else { + permissionState = permissionsState.getPermissionState(permissionName, userId); + if (Objects.equals(permissionState, systemPermissionState)) { + continue; + } + } + if (!printedSomething) { + pw.print(prefix); pw.println("install permissions:"); + printedSomething = true; + } + pw.print(prefix); pw.print(" "); pw.print(permissionName); + pw.print(": granted="); pw.print( + permissionState != null && permissionState.isGranted()); + pw.print(permissionFlagsToString(", flags=", + permissionState != null ? permissionState.getFlags() : 0)); + if (userId == UserHandle.USER_SYSTEM) { + pw.println(); + } else { + pw.print(", userId="); pw.println(userId); + } } } } diff --git a/services/core/java/com/android/server/pm/permission/LegacyPermissionState.java b/services/core/java/com/android/server/pm/permission/LegacyPermissionState.java index 92f22a4a7b8e..e8eae471874a 100644 --- a/services/core/java/com/android/server/pm/permission/LegacyPermissionState.java +++ b/services/core/java/com/android/server/pm/permission/LegacyPermissionState.java @@ -104,6 +104,26 @@ public final class LegacyPermissionState { } /** + * Get the permission state for a permission and a user. + * + * @param permissionName the permission name + * @param userId the user ID + * @return the permission state + * + * @hide + */ + @Nullable + public PermissionState getPermissionState(@NonNull String permissionName, + @UserIdInt int userId) { + checkUserId(userId); + UserState userState = mUserStates.get(userId); + if (userState == null) { + return null; + } + return userState.getPermissionState(permissionName); + } + + /** * Put a permission state for a user. * * @param permissionState the permission state @@ -142,10 +162,10 @@ public final class LegacyPermissionState { } /** - * Get all the runtime permission states for a user. + * Get all the permission states for a user. * * @param userId the user ID - * @return the runtime permission states + * @return the permission states */ @NonNull public Collection<PermissionState> getPermissionStates(@UserIdInt int userId) { @@ -301,5 +321,25 @@ public final class LegacyPermissionState { public int getFlags() { return mFlags; } + + @Override + public boolean equals(@Nullable Object object) { + if (this == object) { + return true; + } + if (object == null || getClass() != object.getClass()) { + return false; + } + PermissionState that = (PermissionState) object; + return mRuntime == that.mRuntime + && mGranted == that.mGranted + && mFlags == that.mFlags + && Objects.equals(mName, that.mName); + } + + @Override + public int hashCode() { + return Objects.hash(mName, mRuntime, mGranted, mFlags); + } } } |