Loading core/java/android/os/IUserManager.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -86,7 +86,7 @@ interface IUserManager { Bundle getApplicationRestrictionsForUser(in String packageName, int userId); void setDefaultGuestRestrictions(in Bundle restrictions); Bundle getDefaultGuestRestrictions(); int removeUserOrSetEphemeral(int userId); int removeUserOrSetEphemeral(int userId, boolean evenWhenDisallowed); boolean markGuestForDeletion(int userId); UserInfo findCurrentGuestUser(); boolean isQuietModeEnabled(int userId); Loading core/java/android/os/UserManager.java +6 −2 Original line number Diff line number Diff line Loading @@ -4058,14 +4058,18 @@ public class UserManager { * the current user, then set the user as ephemeral so that it will be removed when it is * stopped. * * @param evenWhenDisallowed when {@code true}, user is removed even if the caller user has the * {@link #DISALLOW_REMOVE_USER} or {@link #DISALLOW_REMOVE_MANAGED_PROFILE} restriction * * @return the {@link RemoveResult} code * @hide */ @RequiresPermission(anyOf = {Manifest.permission.MANAGE_USERS, Manifest.permission.CREATE_USERS}) public @RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId) { public @RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId, boolean evenWhenDisallowed) { try { return mService.removeUserOrSetEphemeral(userId); return mService.removeUserOrSetEphemeral(userId, evenWhenDisallowed); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } Loading services/core/java/com/android/server/pm/PackageManagerShellCommand.java +1 −1 Original line number Diff line number Diff line Loading @@ -2732,7 +2732,7 @@ class PackageManagerShellCommand extends ShellCommand { private int removeUserOrSetEphemeral(IUserManager um, @UserIdInt int userId) throws RemoteException { Slog.i(TAG, "Removing " + userId + " or set as ephemeral if in use."); int result = um.removeUserOrSetEphemeral(userId); int result = um.removeUserOrSetEphemeral(userId, /* evenWhenDisallowed= */ false); switch (result) { case UserManager.REMOVE_RESULT_REMOVED: getOutPrintWriter().printf("Success: user %d removed\n", userId); Loading services/core/java/com/android/server/pm/UserManagerService.java +10 −8 Original line number Diff line number Diff line Loading @@ -3843,7 +3843,6 @@ public class UserManagerService extends IUserManager.Stub { */ @Override public boolean removeUser(@UserIdInt int userId) { Slog.i(LOG_TAG, "removeUser u" + userId, new Exception()); checkManageOrCreateUsersPermission("Only the system can remove users"); final String restriction = getUserRemovalRestriction(userId); Loading Loading @@ -3968,14 +3967,17 @@ public class UserManagerService extends IUserManager.Stub { } @Override public @UserManager.RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId) { Slog.i(LOG_TAG, "removeUserOrSetEphemeral u" + userId); public @UserManager.RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId, boolean evenWhenDisallowed) { checkManageOrCreateUsersPermission("Only the system can remove users"); if (!evenWhenDisallowed) { final String restriction = getUserRemovalRestriction(userId); if (getUserRestrictions(UserHandle.getCallingUserId()).getBoolean(restriction, false)) { Slog.w(LOG_TAG, "Cannot remove user. " + restriction + " is enabled."); return UserManager.REMOVE_RESULT_ERROR; } } if (userId == UserHandle.USER_SYSTEM) { Slog.e(LOG_TAG, "System user cannot be removed."); return UserManager.REMOVE_RESULT_ERROR; Loading Loading @@ -4003,7 +4005,7 @@ public class UserManagerService extends IUserManager.Stub { final int currentUser = ActivityManager.getCurrentUser(); if (currentUser != userId) { // Attempt to remove the user. This will fail if the user is the current user if (removeUser(userId)) { if (removeUserUnchecked(userId)) { return UserManager.REMOVE_RESULT_REMOVED; } } Loading services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java +33 −10 Original line number Diff line number Diff line Loading @@ -219,8 +219,8 @@ public final class UserManagerTest { mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ true, asHandle(currentUser)); try { assertThat(mUserManager.removeUserOrSetEphemeral(user1.id)).isEqualTo( UserManager.REMOVE_RESULT_ERROR); assertThat(mUserManager.removeUserOrSetEphemeral(user1.id, /* evenWhenDisallowed= */ false)).isEqualTo(UserManager.REMOVE_RESULT_ERROR); } finally { mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ false, asHandle(currentUser)); Loading @@ -230,11 +230,34 @@ public final class UserManagerTest { assertThat(getUser(user1.id).isEphemeral()).isFalse(); } @MediumTest @Test public void testRemoveUserOrSetEphemeral_evenWhenRestricted() throws Exception { final int currentUser = ActivityManager.getCurrentUser(); final UserInfo user1 = createUser("User 1", /* flags= */ 0); mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ true, asHandle(currentUser)); try { synchronized (mUserRemoveLock) { assertThat(mUserManager.removeUserOrSetEphemeral(user1.id, /* evenWhenDisallowed= */ true)) .isEqualTo(UserManager.REMOVE_RESULT_REMOVED); waitForUserRemovalLocked(user1.id); } } finally { mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ false, asHandle(currentUser)); } assertThat(hasUser(user1.id)).isFalse(); } @MediumTest @Test public void testRemoveUserOrSetEphemeral_systemUserReturnsError() throws Exception { assertThat(mUserManager.removeUserOrSetEphemeral(UserHandle.USER_SYSTEM)).isEqualTo( UserManager.REMOVE_RESULT_ERROR); assertThat(mUserManager.removeUserOrSetEphemeral(UserHandle.USER_SYSTEM, /* evenWhenDisallowed= */ false)).isEqualTo(UserManager.REMOVE_RESULT_ERROR); assertThat(hasUser(UserHandle.USER_SYSTEM)).isTrue(); } Loading @@ -243,8 +266,8 @@ public final class UserManagerTest { @Test public void testRemoveUserOrSetEphemeral_invalidUserReturnsError() throws Exception { assertThat(hasUser(Integer.MAX_VALUE)).isFalse(); assertThat(mUserManager.removeUserOrSetEphemeral(Integer.MAX_VALUE)).isEqualTo( UserManager.REMOVE_RESULT_ERROR); assertThat(mUserManager.removeUserOrSetEphemeral(Integer.MAX_VALUE, /* evenWhenDisallowed= */ false)).isEqualTo(UserManager.REMOVE_RESULT_ERROR); } @MediumTest Loading @@ -255,8 +278,8 @@ public final class UserManagerTest { // Switch to the user just created. switchUser(user1.id, null, /* ignoreHandle= */ true); assertThat(mUserManager.removeUserOrSetEphemeral(user1.id)).isEqualTo( UserManager.REMOVE_RESULT_SET_EPHEMERAL); assertThat(mUserManager.removeUserOrSetEphemeral(user1.id, /* evenWhenDisallowed= */ false)) .isEqualTo(UserManager.REMOVE_RESULT_SET_EPHEMERAL); assertThat(hasUser(user1.id)).isTrue(); assertThat(getUser(user1.id).isEphemeral()).isTrue(); Loading @@ -276,8 +299,8 @@ public final class UserManagerTest { public void testRemoveUserOrSetEphemeral_nonCurrentUserRemoved() throws Exception { final UserInfo user1 = createUser("User 1", /* flags= */ 0); synchronized (mUserRemoveLock) { assertThat(mUserManager.removeUserOrSetEphemeral(user1.id)).isEqualTo( UserManager.REMOVE_RESULT_REMOVED); assertThat(mUserManager.removeUserOrSetEphemeral(user1.id, /* evenWhenDisallowed= */ false)).isEqualTo(UserManager.REMOVE_RESULT_REMOVED); waitForUserRemovalLocked(user1.id); } Loading Loading
core/java/android/os/IUserManager.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -86,7 +86,7 @@ interface IUserManager { Bundle getApplicationRestrictionsForUser(in String packageName, int userId); void setDefaultGuestRestrictions(in Bundle restrictions); Bundle getDefaultGuestRestrictions(); int removeUserOrSetEphemeral(int userId); int removeUserOrSetEphemeral(int userId, boolean evenWhenDisallowed); boolean markGuestForDeletion(int userId); UserInfo findCurrentGuestUser(); boolean isQuietModeEnabled(int userId); Loading
core/java/android/os/UserManager.java +6 −2 Original line number Diff line number Diff line Loading @@ -4058,14 +4058,18 @@ public class UserManager { * the current user, then set the user as ephemeral so that it will be removed when it is * stopped. * * @param evenWhenDisallowed when {@code true}, user is removed even if the caller user has the * {@link #DISALLOW_REMOVE_USER} or {@link #DISALLOW_REMOVE_MANAGED_PROFILE} restriction * * @return the {@link RemoveResult} code * @hide */ @RequiresPermission(anyOf = {Manifest.permission.MANAGE_USERS, Manifest.permission.CREATE_USERS}) public @RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId) { public @RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId, boolean evenWhenDisallowed) { try { return mService.removeUserOrSetEphemeral(userId); return mService.removeUserOrSetEphemeral(userId, evenWhenDisallowed); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } Loading
services/core/java/com/android/server/pm/PackageManagerShellCommand.java +1 −1 Original line number Diff line number Diff line Loading @@ -2732,7 +2732,7 @@ class PackageManagerShellCommand extends ShellCommand { private int removeUserOrSetEphemeral(IUserManager um, @UserIdInt int userId) throws RemoteException { Slog.i(TAG, "Removing " + userId + " or set as ephemeral if in use."); int result = um.removeUserOrSetEphemeral(userId); int result = um.removeUserOrSetEphemeral(userId, /* evenWhenDisallowed= */ false); switch (result) { case UserManager.REMOVE_RESULT_REMOVED: getOutPrintWriter().printf("Success: user %d removed\n", userId); Loading
services/core/java/com/android/server/pm/UserManagerService.java +10 −8 Original line number Diff line number Diff line Loading @@ -3843,7 +3843,6 @@ public class UserManagerService extends IUserManager.Stub { */ @Override public boolean removeUser(@UserIdInt int userId) { Slog.i(LOG_TAG, "removeUser u" + userId, new Exception()); checkManageOrCreateUsersPermission("Only the system can remove users"); final String restriction = getUserRemovalRestriction(userId); Loading Loading @@ -3968,14 +3967,17 @@ public class UserManagerService extends IUserManager.Stub { } @Override public @UserManager.RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId) { Slog.i(LOG_TAG, "removeUserOrSetEphemeral u" + userId); public @UserManager.RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId, boolean evenWhenDisallowed) { checkManageOrCreateUsersPermission("Only the system can remove users"); if (!evenWhenDisallowed) { final String restriction = getUserRemovalRestriction(userId); if (getUserRestrictions(UserHandle.getCallingUserId()).getBoolean(restriction, false)) { Slog.w(LOG_TAG, "Cannot remove user. " + restriction + " is enabled."); return UserManager.REMOVE_RESULT_ERROR; } } if (userId == UserHandle.USER_SYSTEM) { Slog.e(LOG_TAG, "System user cannot be removed."); return UserManager.REMOVE_RESULT_ERROR; Loading Loading @@ -4003,7 +4005,7 @@ public class UserManagerService extends IUserManager.Stub { final int currentUser = ActivityManager.getCurrentUser(); if (currentUser != userId) { // Attempt to remove the user. This will fail if the user is the current user if (removeUser(userId)) { if (removeUserUnchecked(userId)) { return UserManager.REMOVE_RESULT_REMOVED; } } Loading
services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java +33 −10 Original line number Diff line number Diff line Loading @@ -219,8 +219,8 @@ public final class UserManagerTest { mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ true, asHandle(currentUser)); try { assertThat(mUserManager.removeUserOrSetEphemeral(user1.id)).isEqualTo( UserManager.REMOVE_RESULT_ERROR); assertThat(mUserManager.removeUserOrSetEphemeral(user1.id, /* evenWhenDisallowed= */ false)).isEqualTo(UserManager.REMOVE_RESULT_ERROR); } finally { mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ false, asHandle(currentUser)); Loading @@ -230,11 +230,34 @@ public final class UserManagerTest { assertThat(getUser(user1.id).isEphemeral()).isFalse(); } @MediumTest @Test public void testRemoveUserOrSetEphemeral_evenWhenRestricted() throws Exception { final int currentUser = ActivityManager.getCurrentUser(); final UserInfo user1 = createUser("User 1", /* flags= */ 0); mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ true, asHandle(currentUser)); try { synchronized (mUserRemoveLock) { assertThat(mUserManager.removeUserOrSetEphemeral(user1.id, /* evenWhenDisallowed= */ true)) .isEqualTo(UserManager.REMOVE_RESULT_REMOVED); waitForUserRemovalLocked(user1.id); } } finally { mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ false, asHandle(currentUser)); } assertThat(hasUser(user1.id)).isFalse(); } @MediumTest @Test public void testRemoveUserOrSetEphemeral_systemUserReturnsError() throws Exception { assertThat(mUserManager.removeUserOrSetEphemeral(UserHandle.USER_SYSTEM)).isEqualTo( UserManager.REMOVE_RESULT_ERROR); assertThat(mUserManager.removeUserOrSetEphemeral(UserHandle.USER_SYSTEM, /* evenWhenDisallowed= */ false)).isEqualTo(UserManager.REMOVE_RESULT_ERROR); assertThat(hasUser(UserHandle.USER_SYSTEM)).isTrue(); } Loading @@ -243,8 +266,8 @@ public final class UserManagerTest { @Test public void testRemoveUserOrSetEphemeral_invalidUserReturnsError() throws Exception { assertThat(hasUser(Integer.MAX_VALUE)).isFalse(); assertThat(mUserManager.removeUserOrSetEphemeral(Integer.MAX_VALUE)).isEqualTo( UserManager.REMOVE_RESULT_ERROR); assertThat(mUserManager.removeUserOrSetEphemeral(Integer.MAX_VALUE, /* evenWhenDisallowed= */ false)).isEqualTo(UserManager.REMOVE_RESULT_ERROR); } @MediumTest Loading @@ -255,8 +278,8 @@ public final class UserManagerTest { // Switch to the user just created. switchUser(user1.id, null, /* ignoreHandle= */ true); assertThat(mUserManager.removeUserOrSetEphemeral(user1.id)).isEqualTo( UserManager.REMOVE_RESULT_SET_EPHEMERAL); assertThat(mUserManager.removeUserOrSetEphemeral(user1.id, /* evenWhenDisallowed= */ false)) .isEqualTo(UserManager.REMOVE_RESULT_SET_EPHEMERAL); assertThat(hasUser(user1.id)).isTrue(); assertThat(getUser(user1.id).isEphemeral()).isTrue(); Loading @@ -276,8 +299,8 @@ public final class UserManagerTest { public void testRemoveUserOrSetEphemeral_nonCurrentUserRemoved() throws Exception { final UserInfo user1 = createUser("User 1", /* flags= */ 0); synchronized (mUserRemoveLock) { assertThat(mUserManager.removeUserOrSetEphemeral(user1.id)).isEqualTo( UserManager.REMOVE_RESULT_REMOVED); assertThat(mUserManager.removeUserOrSetEphemeral(user1.id, /* evenWhenDisallowed= */ false)).isEqualTo(UserManager.REMOVE_RESULT_REMOVED); waitForUserRemovalLocked(user1.id); } Loading