diff options
-rw-r--r-- | services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 7b624cae8141..401649a2e522 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -12712,7 +12712,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { for (ResolveInfo receiver : receivers) { final String packageName = receiver.getComponentInfo().packageName; if (checkCrossProfilePackagePermissions(packageName, userId, - requiresPermission)) { + requiresPermission) + || checkModifyQuietModePermission(packageName, userId)) { Slog.i(LOG_TAG, String.format("Sending %s broadcast to %s.", intent.getAction(), packageName)); @@ -12730,6 +12731,27 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } /** + * Checks whether the package {@code packageName} has the {@code MODIFY_QUIET_MODE} + * permission granted for the user {@code userId}. + */ + private boolean checkModifyQuietModePermission(String packageName, @UserIdInt int userId) { + try { + final int uid = Objects.requireNonNull( + mInjector.getPackageManager().getApplicationInfoAsUser( + Objects.requireNonNull(packageName), /* flags= */ 0, userId)).uid; + return PackageManager.PERMISSION_GRANTED + == ActivityManager.checkComponentPermission( + android.Manifest.permission.MODIFY_QUIET_MODE, uid, /* owningUid= */ + -1, /* exported= */ true); + } catch (NameNotFoundException ex) { + Slog.w(LOG_TAG, + String.format("Cannot find the package %s to check for permissions.", + packageName)); + return false; + } + } + + /** * Checks whether the package {@code packageName} has the required permissions to receive * cross-profile broadcasts on behalf of the user {@code userId}. */ |