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

Commit afdcc802 authored by Yasin Kilicdere's avatar Yasin Kilicdere Committed by Android (Google) Code Review
Browse files

Merge "Prevent removing the target user during a user switch."

parents b6bb3b65 f9e7fdc3
Loading
Loading
Loading
Loading
+18 −2
Original line number Diff line number Diff line
@@ -1833,6 +1833,23 @@ public class UserManagerService extends IUserManager.Stub {
        return activityManagerInternal.getCurrentUserId();
    }

    /**
     * Gets the current user id, or the target user id in case there is a started user switch.
     *
     * @return id of current or target foreground user, or {@link UserHandle#USER_NULL} if
     * {@link ActivityManagerInternal} is not available yet.
     */
    @VisibleForTesting
    int getCurrentOrTargetUserId() {
        ActivityManagerInternal activityManagerInternal = getActivityManagerInternal();
        if (activityManagerInternal == null) {
            Slog.w(LOG_TAG, "getCurrentOrTargetUserId() called too early, ActivityManagerInternal"
                    + " is not set yet");
            return UserHandle.USER_NULL;
        }
        return activityManagerInternal.getCurrentUser().id;
    }

    /**
     * Gets whether the user is the current foreground user or a started profile of that user.
     *
@@ -5407,8 +5424,7 @@ public class UserManagerService extends IUserManager.Stub {
        final long ident = Binder.clearCallingIdentity();
        try {
            final UserData userData;
            int currentUser = getCurrentUserId();
            if (currentUser == userId) {
            if (userId == getCurrentOrTargetUserId()) {
                Slog.w(LOG_TAG, "Current user cannot be removed.");
                return false;
            }
+15 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.content.pm.UserInfo;
import android.os.RemoteException;
import android.os.UserManager;
import android.platform.test.annotations.Postsubmit;
import android.provider.Settings;
import android.util.Log;

import androidx.test.InstrumentationRegistry;
@@ -37,6 +38,7 @@ import androidx.test.runner.AndroidJUnit4;

import com.android.internal.util.FunctionalUtils;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -62,12 +64,22 @@ public class UserLifecycleStressTest {
    private Context mContext;
    private UserManager mUserManager;
    private ActivityManager mActivityManager;
    private String mRemoveGuestOnExitOriginalValue;

    @Before
    public void setup() {
        mContext = InstrumentationRegistry.getInstrumentation().getContext();
        mUserManager = mContext.getSystemService(UserManager.class);
        mActivityManager = mContext.getSystemService(ActivityManager.class);
        mRemoveGuestOnExitOriginalValue = Settings.Global.getString(mContext.getContentResolver(),
                Settings.Global.REMOVE_GUEST_ON_EXIT);

    }

    @After
    public void tearDown() {
        Settings.Global.putString(mContext.getContentResolver(),
                Settings.Global.REMOVE_GUEST_ON_EXIT, mRemoveGuestOnExitOriginalValue);
    }

    /**
@@ -105,6 +117,9 @@ public class UserLifecycleStressTest {
     **/
    @Test
    public void switchToExistingGuestAndStartOverStressTest() throws Exception {
        Settings.Global.putString(mContext.getContentResolver(),
                Settings.Global.REMOVE_GUEST_ON_EXIT, "0");

        if (ActivityManager.getCurrentUser() != USER_SYSTEM) {
            switchUser(USER_SYSTEM);
        }