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

Commit c2cce799 authored by Pavel Grafov's avatar Pavel Grafov
Browse files

Allow suspending all apps for quiet mode.

When the profile is in quiet mode, no apps should be able
to show UI or notifications. With this CL when packages
are suspended for quiet mode, no package is exempt unlike
when an admin or and app suspends them.

Bug: 258823777
Test: atest SuspendPackageHelperTest
Test: atest CtsSuspendAppsTestCases
Test: atest android.devicepolicy.cts.QuietModeTest
Change-Id: I6131c9af23bc092d651958539703b5299baed1f0
parent d79ffeed
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -6141,7 +6141,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
            enforceCanSetPackagesSuspendedAsUser(snapshot, callingPackage, callingUid, userId,
                    "setPackagesSuspendedAsUser");
            return mSuspendPackageHelper.setPackagesSuspended(snapshot, packageNames, suspended,
                    appExtras, launcherExtras, dialogInfo, callingPackage, userId, callingUid);
                    appExtras, launcherExtras, dialogInfo, callingPackage, userId, callingUid,
                    false /* forQuietMode */);
        }

        @Override
+11 −7
Original line number Diff line number Diff line
@@ -101,17 +101,19 @@ public final class SuspendPackageHelper {
     * @param callingPackage The caller's package name.
     * @param userId The user where packages reside.
     * @param callingUid The caller's uid.
     * @param forQuietMode Whether suspension is for quiet mode, in which case no apps are exempt.
     * @return The names of failed packages.
     */
    @Nullable
    String[] setPackagesSuspended(@NonNull Computer snapshot, @Nullable String[] packageNames,
            boolean suspended, @Nullable PersistableBundle appExtras,
            @Nullable PersistableBundle launcherExtras, @Nullable SuspendDialogInfo dialogInfo,
            @NonNull String callingPackage, @UserIdInt int userId, int callingUid) {
            @NonNull String callingPackage, @UserIdInt int userId, int callingUid,
            boolean forQuietMode) {
        if (ArrayUtils.isEmpty(packageNames)) {
            return packageNames;
        }
        if (suspended && !isSuspendAllowedForUser(snapshot, userId, callingUid)) {
        if (suspended && !forQuietMode && !isSuspendAllowedForUser(snapshot, userId, callingUid)) {
            Slog.w(TAG, "Cannot suspend due to restrictions on user " + userId);
            return packageNames;
        }
@@ -126,8 +128,9 @@ public final class SuspendPackageHelper {
        final ArraySet<String> changedPackagesList = new ArraySet<>(packageNames.length);
        final IntArray changedUids = new IntArray(packageNames.length);

        final boolean[] canSuspend = suspended
                ? canSuspendPackageForUser(snapshot, packageNames, userId, callingUid) : null;
        final boolean[] canSuspend = suspended && !forQuietMode
                ? canSuspendPackageForUser(snapshot, packageNames, userId, callingUid)
                : null;
        for (int i = 0; i < packageNames.length; i++) {
            final String packageName = packageNames[i];
            if (callingPackage.equals(packageName)) {
@@ -642,8 +645,8 @@ public final class SuspendPackageHelper {
                    setPackagesSuspended(
                            snapshot, toSuspend.toArray(new String[0]), suspend,
                            null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */,
                            PackageManagerService.PLATFORM_PACKAGE_NAME, userId, Process.SYSTEM_UID
                    )));
                            PackageManagerService.PLATFORM_PACKAGE_NAME, userId, Process.SYSTEM_UID,
                            false /* forQuietMode */)));
        }
        return unsuspendable.toArray(String[]::new);
    }
@@ -688,7 +691,8 @@ public final class SuspendPackageHelper {

        setPackagesSuspended(snapshot, toSuspend.toArray(new String[0]),
                suspend, null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */,
                PackageManagerService.PLATFORM_PACKAGE_NAME, userId, Process.SYSTEM_UID);
                PackageManagerService.PLATFORM_PACKAGE_NAME, userId, Process.SYSTEM_UID,
                true /* forQuietMode */);
    }

    private Set<String> packagesToSuspendInQuietMode(Computer snapshot, int userId) {
+58 −36
Original line number Diff line number Diff line
@@ -38,8 +38,9 @@ class SuspendPackageHelperTest : PackageHelperTestBase() {
    fun setPackagesSuspended() {
        val targetPackages = arrayOf(TEST_PACKAGE_1, TEST_PACKAGE_2)
        val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(),
            targetPackages, true /* suspended */, null /* appExtras */, null /* launcherExtras */,
            null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid)
                targetPackages, true /* suspended */, null /* appExtras */,
                null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE,
                TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */)
        testHandler.flush()

        verify(pms).scheduleWritePackageRestrictions(eq(TEST_USER_ID))
@@ -62,14 +63,15 @@ class SuspendPackageHelperTest : PackageHelperTestBase() {
    fun setPackagesSuspended_emptyPackageName() {
        var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(),
                null /* packageNames */, true /* suspended */, null /* appExtras */,
            null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID,
            deviceOwnerUid)
                null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE,
                TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */)

        assertThat(failedNames).isNull()

        failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(),
            arrayOfNulls(0), true /* suspended */, null /* appExtras */, null /* launcherExtras */,
            null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid)
                arrayOfNulls(0), true /* suspended */, null /* appExtras */,
                null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE,
                TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */)

        assertThat(failedNames).isEmpty()
    }
@@ -79,7 +81,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() {
        val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(),
                arrayOf(TEST_PACKAGE_2), true /* suspended */, null /* appExtras */,
                null /* launcherExtras */, null /* dialogInfo */, TEST_PACKAGE_1, TEST_USER_ID,
            Binder.getCallingUid())
                Binder.getCallingUid(), false /* forQuietMode */)

        assertThat(failedNames).asList().hasSize(1)
        assertThat(failedNames).asList().contains(TEST_PACKAGE_2)
@@ -89,8 +91,8 @@ class SuspendPackageHelperTest : PackageHelperTestBase() {
    fun setPackagesSuspended_callerSuspendItself() {
        val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(),
                arrayOf(DEVICE_OWNER_PACKAGE), true /* suspended */, null /* appExtras */,
            null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID,
            deviceOwnerUid)
                null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE,
                TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */)

        assertThat(failedNames).asList().hasSize(1)
        assertThat(failedNames).asList().contains(DEVICE_OWNER_PACKAGE)
@@ -100,8 +102,8 @@ class SuspendPackageHelperTest : PackageHelperTestBase() {
    fun setPackagesSuspended_nonexistentPackage() {
        val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(),
                arrayOf(NONEXISTENT_PACKAGE), true /* suspended */, null /* appExtras */,
            null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID,
            deviceOwnerUid)
                null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE,
                TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */)

        assertThat(failedNames).asList().hasSize(1)
        assertThat(failedNames).asList().contains(NONEXISTENT_PACKAGE)
@@ -112,8 +114,9 @@ class SuspendPackageHelperTest : PackageHelperTestBase() {
        val knownPackages = arrayOf(DEVICE_ADMIN_PACKAGE, DEFAULT_HOME_PACKAGE, DIALER_PACKAGE,
            INSTALLER_PACKAGE, UNINSTALLER_PACKAGE, VERIFIER_PACKAGE, PERMISSION_CONTROLLER_PACKAGE)
        val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(),
            knownPackages, true /* suspended */, null /* appExtras */, null /* launcherExtras */,
            null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid)!!
                knownPackages, true /* suspended */, null /* appExtras */,
                null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE,
                TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */)!!

        assertThat(failedNames.size).isEqualTo(knownPackages.size)
        for (pkg in knownPackages) {
@@ -121,17 +124,32 @@ class SuspendPackageHelperTest : PackageHelperTestBase() {
        }
    }

    @Test
    fun setPackagesSuspended_forQuietMode() {
        val knownPackages = arrayOf(DEVICE_ADMIN_PACKAGE, DEFAULT_HOME_PACKAGE, DIALER_PACKAGE,
                INSTALLER_PACKAGE, UNINSTALLER_PACKAGE, VERIFIER_PACKAGE,
                PERMISSION_CONTROLLER_PACKAGE)
        val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(),
                knownPackages, true /* suspended */, null /* appExtras */,
                null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE,
                TEST_USER_ID, deviceOwnerUid, true /* forQuietMode */)!!

        assertThat(failedNames.size).isEqualTo(0)
    }

    @Test
    fun setPackagesUnsuspended() {
        val targetPackages = arrayOf(TEST_PACKAGE_1, TEST_PACKAGE_2)
        var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(),
            targetPackages, true /* suspended */, null /* appExtras */, null /* launcherExtras */,
            null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid)
                targetPackages, true /* suspended */, null /* appExtras */,
                null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE,
                TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */)
        testHandler.flush()
        assertThat(failedNames).isEmpty()
        failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(),
            targetPackages, false /* suspended */, null /* appExtras */, null /* launcherExtras */,
            null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid)
                targetPackages, false /* suspended */, null /* appExtras */,
                null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE,
                TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */)
        testHandler.flush()

        verify(pms, times(2)).scheduleWritePackageRestrictions(eq(TEST_USER_ID))
@@ -182,7 +200,8 @@ class SuspendPackageHelperTest : PackageHelperTestBase() {
        appExtras.putString(TEST_PACKAGE_1, TEST_PACKAGE_1)
        var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(),
                arrayOf(TEST_PACKAGE_1), true /* suspended */, appExtras, null /* launcherExtras */,
            null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid)
                null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid,
                false /* forQuietMode */)
        testHandler.flush()
        assertThat(failedNames).isEmpty()

@@ -199,7 +218,8 @@ class SuspendPackageHelperTest : PackageHelperTestBase() {
        val targetPackages = arrayOf(TEST_PACKAGE_1, TEST_PACKAGE_2)
        var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(),
                targetPackages, true /* suspended */, appExtras, null /* launcherExtras */,
            null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid)
                null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid,
                false /* forQuietMode */)
        testHandler.flush()
        assertThat(failedNames).isEmpty()
        assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(),
@@ -243,7 +263,8 @@ class SuspendPackageHelperTest : PackageHelperTestBase() {
        launcherExtras.putString(TEST_PACKAGE_2, TEST_PACKAGE_2)
        var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(),
                arrayOf(TEST_PACKAGE_2), true /* suspended */, null /* appExtras */, launcherExtras,
            null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid)
                null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid,
                false /* forQuietMode */)
        testHandler.flush()
        assertThat(failedNames).isEmpty()

@@ -257,8 +278,8 @@ class SuspendPackageHelperTest : PackageHelperTestBase() {
    fun isPackageSuspended() {
        var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(),
                arrayOf(TEST_PACKAGE_1), true /* suspended */, null /* appExtras */,
            null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID,
            deviceOwnerUid)
                null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE,
                TEST_USER_ID, deviceOwnerUid, false /* forQuietMode */)
        testHandler.flush()
        assertThat(failedNames).isEmpty()

@@ -272,7 +293,8 @@ class SuspendPackageHelperTest : PackageHelperTestBase() {
        launcherExtras.putString(TEST_PACKAGE_2, TEST_PACKAGE_2)
        var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(),
                arrayOf(TEST_PACKAGE_2), true /* suspended */, null /* appExtras */, launcherExtras,
            null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid)
                null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid,
                false /* forQuietMode */)
        testHandler.flush()
        assertThat(failedNames).isEmpty()

@@ -287,7 +309,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() {
        var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(),
                arrayOf(TEST_PACKAGE_1), true /* suspended */, null /* appExtras */,
                null /* launcherExtras */, dialogInfo, DEVICE_OWNER_PACKAGE, TEST_USER_ID,
            deviceOwnerUid)
                deviceOwnerUid, false /* forQuietMode */)
        testHandler.flush()
        assertThat(failedNames).isEmpty()