diff options
3 files changed, 39 insertions, 11 deletions
diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java index fa9f03da6372..410f51045b9d 100644 --- a/core/java/android/permission/PermissionManager.java +++ b/core/java/android/permission/PermissionManager.java @@ -1788,6 +1788,9 @@ public final class PermissionManager { /** * Gets the permission states for requested package and persistent device. + * <p> + * <strong>Note: </strong>Default device permissions are not inherited in this API. Returns the + * exact permission states for the requested device. * * @param packageName name of the package you are checking against * @param persistentDeviceId id of the persistent device you are checking against @@ -2073,5 +2076,29 @@ public final class PermissionManager { return new PermissionState[size]; } }; + + /** @hide */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PermissionState that = (PermissionState) o; + return mGranted == that.mGranted && mFlags == that.mFlags; + } + + /** @hide */ + @Override + public int hashCode() { + return Objects.hash(mGranted, mFlags); + } + + /** @hide */ + @Override + public String toString() { + return "PermissionState{" + + "mGranted=" + mGranted + + ", mFlags=" + mFlags + + '}'; + } } } diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInterface.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInterface.java index 47032ea2d6af..754b141ff10d 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInterface.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInterface.java @@ -408,6 +408,9 @@ public interface PermissionManagerServiceInterface extends PermissionManagerInte /** * Gets the permission states for requested package, persistent device and user. + * <p> + * <strong>Note: </strong>Default device permissions are not inherited in this API. Returns the + * exact permission states for the requested device. * * @param packageName name of the package you are checking against * @param deviceId id of the persistent device you are checking against diff --git a/services/permission/java/com/android/server/permission/access/permission/PermissionService.kt b/services/permission/java/com/android/server/permission/access/permission/PermissionService.kt index 0704c8ffca25..0c6c4da712bb 100644 --- a/services/permission/java/com/android/server/permission/access/permission/PermissionService.kt +++ b/services/permission/java/com/android/server/permission/access/permission/PermissionService.kt @@ -1135,25 +1135,23 @@ class PermissionService(private val service: AccessCheckingService) : return emptyMap() } - val permissionFlagsMap = - service.getState { + service.getState { + val permissionFlags = if (deviceId == VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT) { with(policy) { getAllPermissionFlags(packageState.appId, userId) } } else { with(devicePolicy) { getAllPermissionFlags(packageState.appId, deviceId, userId) } - } + } ?: return emptyMap() + val permissionStates = ArrayMap<String, PermissionState>() + permissionFlags.forEachIndexed { _, permissionName, flags -> + val granted = isPermissionGranted(packageState, userId, permissionName, deviceId) + val apiFlags = PermissionFlags.toApiFlags(flags) + permissionStates[permissionName] = PermissionState(granted, apiFlags) } - ?: return emptyMap() - - val permissionStates = ArrayMap<String, PermissionState>() - permissionFlagsMap.forEachIndexed { _, permissionName, flags -> - val granted = PermissionFlags.isPermissionGranted(flags) - val apiFlags = PermissionFlags.toApiFlags(flags) - permissionStates[permissionName] = PermissionState(granted, apiFlags) + return permissionStates } - return permissionStates } override fun isPermissionRevokedByPolicy( |