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

Commit 2994f36f authored by Yao Li's avatar Yao Li
Browse files

getUserLogoutability to return error for unsupported device

Since logoutUser() no longer supports HSUM devices that cannot switch to
headless system user, getUserLogoutability() should also reflect that in
the return value.

Also, getUserLogoutability() will not return error when target user is
not current, since logging out non-current user is already supported.

Bug: 380125011
Flag: android.multiuser.logout_user_api
Test: atest FrameworksMockingServicesTests:com.android.server.pm.UserManagerServiceMockedTest
Change-Id: I318df5a40d24788eca20bbc99533a5781a2382b3
parent 294710f3
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -2301,6 +2301,12 @@ public class UserManager {
     */
    public static final int LOGOUTABILITY_STATUS_CANNOT_SWITCH = 3;

    /**
     * Indicates that user cannot logout because logout is not supported on the device.
     * @hide
     */
    public static final int LOGOUTABILITY_STATUS_DEVICE_NOT_SUPPORTED = 4;

    /**
     * Result returned in {@link #getUserLogoutability()} indicating user logoutability.
     * @hide
@@ -2310,7 +2316,8 @@ public class UserManager {
            LOGOUTABILITY_STATUS_OK,
            LOGOUTABILITY_STATUS_CANNOT_LOGOUT_SYSTEM_USER,
            LOGOUTABILITY_STATUS_NO_SUITABLE_USER_TO_LOGOUT_TO,
            LOGOUTABILITY_STATUS_CANNOT_SWITCH
            LOGOUTABILITY_STATUS_CANNOT_SWITCH,
            LOGOUTABILITY_STATUS_DEVICE_NOT_SUPPORTED
    })
    public @interface UserLogoutability {}

@@ -2807,6 +2814,7 @@ public class UserManager {
     * {@link #LOGOUTABILITY_STATUS_CANNOT_LOGOUT_SYSTEM_USER},
     * {@link #LOGOUTABILITY_STATUS_NO_SUITABLE_USER_TO_LOGOUT_TO},
     * {@link #LOGOUTABILITY_STATUS_CANNOT_SWITCH}.
     * {@link #LOGOUTABILITY_STATUS_DEVICE_NOT_SUPPORTED}.
     * @hide
     */
    @RequiresPermission(Manifest.permission.MANAGE_USERS)
+4 −7
Original line number Diff line number Diff line
@@ -3052,15 +3052,12 @@ public class UserManagerService extends IUserManager.Stub {

        checkManageUsersPermission("getUserLogoutability");

        if (userId == UserHandle.USER_SYSTEM) {
            return UserManager.LOGOUTABILITY_STATUS_CANNOT_LOGOUT_SYSTEM_USER;
        if (isHeadlessSystemUserMode() && !canSwitchToHeadlessSystemUser()) {
            return UserManager.LOGOUTABILITY_STATUS_DEVICE_NOT_SUPPORTED;
        }

        if (userId != getCurrentUserId()) {
            // TODO(b/393656514): Decide what to do with non-current/background users.
            // As of now, we are not going to logout a background user. A background user should
            // simply be stopped instead.
            return UserManager.LOGOUTABILITY_STATUS_CANNOT_SWITCH;
        if (userId == UserHandle.USER_SYSTEM) {
            return UserManager.LOGOUTABILITY_STATUS_CANNOT_LOGOUT_SYSTEM_USER;
        }

        if (getUserSwitchability(userId) != UserManager.SWITCHABILITY_STATUS_OK) {
+8 −4
Original line number Diff line number Diff line
@@ -964,7 +964,7 @@ public final class UserManagerServiceMockedTest {

    @Test
    @EnableFlags(FLAG_LOGOUT_USER_API)
    public void testGetUserLogoutability_HsumAndInteractiveHeadlessSystem_UserCanLogout()
    public void testGetUserLogoutability_HsumAndInteractiveHeadlessSystemUser_UserCanLogout()
            throws Exception {
        setSystemUserHeadless(true);
        addUser(USER_ID);
@@ -980,7 +980,7 @@ public final class UserManagerServiceMockedTest {

    @Test
    @EnableFlags(FLAG_LOGOUT_USER_API)
    public void testGetUserLogoutability_HsumAndNonInteractiveHeadlessSystem_UserCannotLogout()
    public void testGetUserLogoutability_HsumAndNonInteractiveHeadlessSystemUser_UserCannotLogout()
            throws Exception {
        setSystemUserHeadless(true);
        mockCanSwitchToHeadlessSystemUser(false);
@@ -990,13 +990,16 @@ public final class UserManagerServiceMockedTest {
        mockUserIsInCall(false);

        assertThat(mUms.getUserLogoutability(USER_ID))
                .isEqualTo(UserManager.LOGOUTABILITY_STATUS_NO_SUITABLE_USER_TO_LOGOUT_TO);
                .isEqualTo(UserManager.LOGOUTABILITY_STATUS_DEVICE_NOT_SUPPORTED);
    }

    @Test
    @EnableFlags(FLAG_LOGOUT_USER_API)
    public void testGetUserLogoutability_Hsum_SystemUserCannotLogout() throws Exception {
    public void
            testGetUserLogoutability_HsumAndInteractiveHeadlessSystemUser_SystemUserCannotLogout()
                    throws Exception {
        setSystemUserHeadless(true);
        mockCanSwitchToHeadlessSystemUser(true);
        mockCurrentUser(UserHandle.USER_SYSTEM);
        assertThat(mUms.getUserLogoutability(UserHandle.USER_SYSTEM))
                .isEqualTo(UserManager.LOGOUTABILITY_STATUS_CANNOT_LOGOUT_SYSTEM_USER);
@@ -1016,6 +1019,7 @@ public final class UserManagerServiceMockedTest {
    @EnableFlags(FLAG_LOGOUT_USER_API)
    public void testGetUserLogoutability_CannotSwitch_CannotLogout() throws Exception {
        setSystemUserHeadless(true);
        mockCanSwitchToHeadlessSystemUser(true);
        addUser(USER_ID);
        addUser(OTHER_USER_ID);
        setLastForegroundTime(OTHER_USER_ID, 1_000_000L);