Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3cb67dff authored by Bookatz's avatar Bookatz
Browse files

Wellbeing app can enable QUIET_MODE

The designated Wellbeing app now has permission
to toggle the "quiet mode" of a profile.

Additionally, callers can only toggle the quiet mode
of a userId that is of the same profile group as the caller
(unless the caller has MANAGE_PERMISSIONS).

Test: manual
Bug: 140485433
Change-Id: Ie6253799b97113aff7d364f8cf9214c69252f704
parent bbf394bf
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -4504,9 +4504,9 @@
        android:protectionLevel="signature" />

    <!-- @SystemApi Allows an application to turn on / off quiet mode.
         @hide <p>Not for use by third-party applications. -->
         @hide -->
    <permission android:name="android.permission.MODIFY_QUIET_MODE"
                android:protectionLevel="signature|privileged" />
                android:protectionLevel="signature|privileged|wellbeing" />

    <!-- Allows internal management of the camera framework
         @hide -->
+9 −3
Original line number Diff line number Diff line
@@ -861,7 +861,7 @@ public class UserManagerService extends IUserManager.Stub {
                    "target should only be specified when we are disabling quiet mode.");
        }

        ensureCanModifyQuietMode(callingPackage, Binder.getCallingUid(), target != null);
        ensureCanModifyQuietMode(callingPackage, Binder.getCallingUid(), userId, target != null);
        final long identity = Binder.clearCallingIdentity();
        try {
            boolean result = false;
@@ -893,13 +893,15 @@ public class UserManagerService extends IUserManager.Stub {
     *     <li>Has system UID or root UID</li>
     *     <li>Has {@link Manifest.permission#MODIFY_QUIET_MODE}</li>
     *     <li>Has {@link Manifest.permission#MANAGE_USERS}</li>
     *     <li>Is the foreground default launcher app</li>
     * </ul>
     * <p>
     * If caller wants to start an intent after disabling the quiet mode, it must has
     * If caller wants to start an intent after disabling the quiet mode, or if it is targeting a
     * user in a different profile group from the caller, it must have
     * {@link Manifest.permission#MANAGE_USERS}.
     */
    private void ensureCanModifyQuietMode(String callingPackage, int callingUid,
            boolean startIntent) {
            @UserIdInt int targetUserId, boolean startIntent) {
        if (hasManageUsersPermission()) {
            return;
        }
@@ -907,6 +909,10 @@ public class UserManagerService extends IUserManager.Stub {
            throw new SecurityException("MANAGE_USERS permission is required to start intent "
                    + "after disabling quiet mode.");
        }
        if (!isSameProfileGroupNoChecks(UserHandle.getUserId(callingUid), targetUserId)) {
            throw new SecurityException("MANAGE_USERS permission is required to modify quiet mode "
                    + "for a different profile group.");
        }
        final boolean hasModifyQuietModePermission = hasPermissionGranted(
                Manifest.permission.MODIFY_QUIET_MODE, callingUid);
        if (hasModifyQuietModePermission) {