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

Commit eb90e967 authored by Ethan Lee's avatar Ethan Lee
Browse files

Fix UserController to not throw in stopUser

Return an USER_OP_* instead of throwing an IllegalException

Test: atest UserControllerTest#stopUser_invalidUser UserControllerTest#stopUser_systemUser UserControllerTest#stopUser_currentUser
Fixes: 259740023

Change-Id: I7e50412e028d225b7c97e113a3e4aac138da2314
parent 8dadc7e8
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -958,9 +958,8 @@ class UserController implements Handler.Callback {
    int stopUser(final int userId, final boolean force, boolean allowDelayedLocking,
            final IStopUserCallback stopUserCallback, KeyEvictedCallback keyEvictedCallback) {
        checkCallingPermission(INTERACT_ACROSS_USERS_FULL, "stopUser");
        if (userId < 0 || userId == UserHandle.USER_SYSTEM) {
            throw new IllegalArgumentException("Can't stop system user " + userId);
        }
        Preconditions.checkArgument(userId >= 0, "Invalid user id %d", userId);

        enforceShellRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES, userId);
        synchronized (mLock) {
            return stopUsersLU(userId, force, allowDelayedLocking, stopUserCallback,
+33 −0
Original line number Diff line number Diff line
@@ -645,6 +645,39 @@ public class UserControllerTest {
                /* keyEvictedCallback= */ mKeyEvictedCallback, /* expectLocking= */ true);
    }

    @Test
    public void testStopUser_invalidUser() {
        int userId = -1;

        assertThrows(IllegalArgumentException.class,
                () -> mUserController.stopUser(userId, /* force= */ true,
                        /* allowDelayedLocking= */ true, /* stopUserCallback= */ null,
                        /* keyEvictedCallback= */ null));
    }

    @Test
    public void testStopUser_systemUser() {
        int userId = UserHandle.USER_SYSTEM;

        int r = mUserController.stopUser(userId, /* force= */ true,
                /* allowDelayedLocking= */ true, /* stopUserCallback= */ null,
                /* keyEvictedCallback= */ null);

        assertThat(r).isEqualTo(ActivityManager.USER_OP_ERROR_IS_SYSTEM);
    }

    @Test
    public void testStopUser_currentUser() {
        setUpUser(TEST_USER_ID1, /* flags= */ 0);
        mUserController.startUser(TEST_USER_ID1, /* foreground= */ true);

        int r = mUserController.stopUser(TEST_USER_ID1, /* force= */ true,
                /* allowDelayedLocking= */ true, /* stopUserCallback= */ null,
                /* keyEvictedCallback= */ null);

        assertThat(r).isEqualTo(ActivityManager.USER_OP_IS_CURRENT);
    }

    /**
     * Test conditional delayed locking with mDelayUserDataLocking true.
     */