diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/UserManagerService.java | 20 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java | 15 |
2 files changed, 33 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 6bac90532645..d5095634b4a3 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -1834,6 +1834,23 @@ public class UserManagerService extends IUserManager.Stub { } /** + * 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. * * <p>Doesn't perform any permission check. @@ -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; } diff --git a/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java b/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java index bbe89073d34d..b00fb92f9c46 100644 --- a/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java @@ -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); } |