summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/Settings.java71
-rw-r--r--services/core/java/com/android/server/pm/permission/LegacyPermissionState.java44
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);
+ }
}
}