Merge "Prevent removing the target user during a user switch."
This commit is contained in:
committed by
Android (Google) Code Review
commit
afdcc8028e
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user