Loading core/java/android/os/UserManager.java +44 −2 Original line number Diff line number Diff line Loading @@ -1466,6 +1466,48 @@ public class UserManager { }) public @interface UserSwitchabilityResult {} /** * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified * user has been successfully removed. * @hide */ public static final int REMOVE_RESULT_REMOVED = 0; /** * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified * user has had its {@link UserInfo#FLAG_EPHEMERAL} flag set to {@code true}, so that it will be * removed when the user is stopped or on boot. * @hide */ public static final int REMOVE_RESULT_SET_EPHEMERAL = 1; /** * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified * user is already in the process of being removed. * @hide */ public static final int REMOVE_RESULT_ALREADY_BEING_REMOVED = 2; /** * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that an error occurred * that prevented the user from being removed or set as ephemeral. * @hide */ public static final int REMOVE_RESULT_ERROR = 3; /** * Possible response codes from {@link #removeUserOrSetEphemeral(int)}. * @hide */ @IntDef(prefix = { "REMOVE_RESULT_" }, value = { REMOVE_RESULT_REMOVED, REMOVE_RESULT_SET_EPHEMERAL, REMOVE_RESULT_ALREADY_BEING_REMOVED, REMOVE_RESULT_ERROR, }) @Retention(RetentionPolicy.SOURCE) public @interface RemoveResult {} /** * Indicates user operation is successful. */ Loading Loading @@ -3981,11 +4023,11 @@ public class UserManager { * the current user, then set the user as ephemeral so that it will be removed when it is * stopped. * * @return the {@link com.android.server.pm.UserManagerService.RemoveResult} code * @return the {@link RemoveResult} code * @hide */ @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public int removeUserOrSetEphemeral(@UserIdInt int userId) { public @RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId) { try { return mService.removeUserOrSetEphemeral(userId); } catch (RemoteException re) { Loading services/core/java/com/android/server/pm/PackageManagerShellCommand.java +3 −3 Original line number Diff line number Diff line Loading @@ -2729,13 +2729,13 @@ class PackageManagerShellCommand extends ShellCommand { Slog.i(TAG, "Removing " + userId + " or set as ephemeral if in use."); int result = um.removeUserOrSetEphemeral(userId); switch (result) { case UserManagerService.REMOVE_RESULT_REMOVED: case UserManager.REMOVE_RESULT_REMOVED: getOutPrintWriter().printf("Success: user %d removed\n", userId); return 0; case UserManagerService.REMOVE_RESULT_SET_EPHEMERAL: case UserManager.REMOVE_RESULT_SET_EPHEMERAL: getOutPrintWriter().printf("Success: user %d set as ephemeral\n", userId); return 0; case UserManagerService.REMOVE_RESULT_ALREADY_BEING_REMOVED: case UserManager.REMOVE_RESULT_ALREADY_BEING_REMOVED: getOutPrintWriter().printf("Success: user %d is already being removed\n", userId); return 0; default: Loading services/core/java/com/android/server/pm/UserManagerService.java +7 −47 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import android.Manifest; import android.annotation.ColorRes; import android.annotation.DrawableRes; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.StringRes; Loading Loading @@ -132,8 +131,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; Loading Loading @@ -248,43 +245,6 @@ public class UserManagerService extends IUserManager.Stub { static final int WRITE_USER_MSG = 1; static final int WRITE_USER_DELAY = 2*1000; // 2 seconds /** * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified * user has been successfully removed. */ public static final int REMOVE_RESULT_REMOVED = 0; /** * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified * user has had its {@link UserInfo#FLAG_EPHEMERAL} flag set to {@code true}, so that it will be * removed when the user is stopped or on boot. */ public static final int REMOVE_RESULT_SET_EPHEMERAL = 1; /** * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified * user is already in the process of being removed. */ public static final int REMOVE_RESULT_ALREADY_BEING_REMOVED = 2; /** * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that an error occurred * that prevented the user from being removed or set as ephemeral. */ public static final int REMOVE_RESULT_ERROR = 3; /** * Possible response codes from {@link #removeUserOrSetEphemeral(int)}. */ @IntDef(prefix = { "REMOVE_RESULT_" }, value = { REMOVE_RESULT_REMOVED, REMOVE_RESULT_SET_EPHEMERAL, REMOVE_RESULT_ALREADY_BEING_REMOVED, REMOVE_RESULT_ERROR, }) @Retention(RetentionPolicy.SOURCE) public @interface RemoveResult {} // Tron counters private static final String TRON_GUEST_CREATED = "users_guest_created"; private static final String TRON_USER_CREATED = "users_user_created"; Loading Loading @@ -4031,17 +3991,17 @@ public class UserManagerService extends IUserManager.Stub { } @Override public @RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId) { public @UserManager.RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId) { Slog.i(LOG_TAG, "removeUserOrSetEphemeral u" + userId); checkManageUsersPermission("Only the system can remove users"); final String restriction = getUserRemovalRestriction(userId); if (getUserRestrictions(UserHandle.getCallingUserId()).getBoolean(restriction, false)) { Slog.w(LOG_TAG, "Cannot remove user. " + restriction + " is enabled."); return REMOVE_RESULT_ERROR; return UserManager.REMOVE_RESULT_ERROR; } if (userId == UserHandle.USER_SYSTEM) { Slog.e(LOG_TAG, "System user cannot be removed."); return REMOVE_RESULT_ERROR; return UserManager.REMOVE_RESULT_ERROR; } final long ident = Binder.clearCallingIdentity(); Loading @@ -4053,12 +4013,12 @@ public class UserManagerService extends IUserManager.Stub { if (userData == null) { Slog.e(LOG_TAG, "Cannot remove user " + userId + ", invalid user id provided."); return REMOVE_RESULT_ERROR; return UserManager.REMOVE_RESULT_ERROR; } if (mRemovingUserIds.get(userId)) { Slog.e(LOG_TAG, "User " + userId + " is already scheduled for removal."); return REMOVE_RESULT_ALREADY_BEING_REMOVED; return UserManager.REMOVE_RESULT_ALREADY_BEING_REMOVED; } } Loading @@ -4067,7 +4027,7 @@ public class UserManagerService extends IUserManager.Stub { if (currentUser != userId) { // Attempt to remove the user. This will fail if the user is the current user if (removeUser(userId)) { return REMOVE_RESULT_REMOVED; return UserManager.REMOVE_RESULT_REMOVED; } Slog.w(LOG_TAG, "Unable to immediately remove non-current user: " + userId Loading @@ -4081,7 +4041,7 @@ public class UserManagerService extends IUserManager.Stub { userData.info.flags |= UserInfo.FLAG_EPHEMERAL; writeUserLP(userData); return REMOVE_RESULT_SET_EPHEMERAL; return UserManager.REMOVE_RESULT_SET_EPHEMERAL; } } finally { Binder.restoreCallingIdentity(ident); Loading services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java +5 −5 Original line number Diff line number Diff line Loading @@ -220,7 +220,7 @@ public final class UserManagerTest { asHandle(currentUser)); try { assertThat(mUserManager.removeUserOrSetEphemeral(user1.id)).isEqualTo( UserManagerService.REMOVE_RESULT_ERROR); UserManager.REMOVE_RESULT_ERROR); } finally { mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ false, asHandle(currentUser)); Loading @@ -234,7 +234,7 @@ public final class UserManagerTest { @Test public void testRemoveUserOrSetEphemeral_systemUserReturnsError() throws Exception { assertThat(mUserManager.removeUserOrSetEphemeral(UserHandle.USER_SYSTEM)).isEqualTo( UserManagerService.REMOVE_RESULT_ERROR); UserManager.REMOVE_RESULT_ERROR); assertThat(hasUser(UserHandle.USER_SYSTEM)).isTrue(); } Loading @@ -244,7 +244,7 @@ public final class UserManagerTest { public void testRemoveUserOrSetEphemeral_invalidUserReturnsError() throws Exception { assertThat(hasUser(Integer.MAX_VALUE)).isFalse(); assertThat(mUserManager.removeUserOrSetEphemeral(Integer.MAX_VALUE)).isEqualTo( UserManagerService.REMOVE_RESULT_ERROR); UserManager.REMOVE_RESULT_ERROR); } @MediumTest Loading @@ -256,7 +256,7 @@ public final class UserManagerTest { switchUser(user1.id, null, /* ignoreHandle= */ true); assertThat(mUserManager.removeUserOrSetEphemeral(user1.id)).isEqualTo( UserManagerService.REMOVE_RESULT_SET_EPHEMERAL); UserManager.REMOVE_RESULT_SET_EPHEMERAL); assertThat(hasUser(user1.id)).isTrue(); assertThat(getUser(user1.id).isEphemeral()).isTrue(); Loading @@ -277,7 +277,7 @@ public final class UserManagerTest { final UserInfo user1 = createUser("User 1", /* flags= */ 0); synchronized (mUserRemoveLock) { assertThat(mUserManager.removeUserOrSetEphemeral(user1.id)).isEqualTo( UserManagerService.REMOVE_RESULT_REMOVED); UserManager.REMOVE_RESULT_REMOVED); waitForUserRemovalLocked(user1.id); } Loading Loading
core/java/android/os/UserManager.java +44 −2 Original line number Diff line number Diff line Loading @@ -1466,6 +1466,48 @@ public class UserManager { }) public @interface UserSwitchabilityResult {} /** * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified * user has been successfully removed. * @hide */ public static final int REMOVE_RESULT_REMOVED = 0; /** * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified * user has had its {@link UserInfo#FLAG_EPHEMERAL} flag set to {@code true}, so that it will be * removed when the user is stopped or on boot. * @hide */ public static final int REMOVE_RESULT_SET_EPHEMERAL = 1; /** * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified * user is already in the process of being removed. * @hide */ public static final int REMOVE_RESULT_ALREADY_BEING_REMOVED = 2; /** * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that an error occurred * that prevented the user from being removed or set as ephemeral. * @hide */ public static final int REMOVE_RESULT_ERROR = 3; /** * Possible response codes from {@link #removeUserOrSetEphemeral(int)}. * @hide */ @IntDef(prefix = { "REMOVE_RESULT_" }, value = { REMOVE_RESULT_REMOVED, REMOVE_RESULT_SET_EPHEMERAL, REMOVE_RESULT_ALREADY_BEING_REMOVED, REMOVE_RESULT_ERROR, }) @Retention(RetentionPolicy.SOURCE) public @interface RemoveResult {} /** * Indicates user operation is successful. */ Loading Loading @@ -3981,11 +4023,11 @@ public class UserManager { * the current user, then set the user as ephemeral so that it will be removed when it is * stopped. * * @return the {@link com.android.server.pm.UserManagerService.RemoveResult} code * @return the {@link RemoveResult} code * @hide */ @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public int removeUserOrSetEphemeral(@UserIdInt int userId) { public @RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId) { try { return mService.removeUserOrSetEphemeral(userId); } catch (RemoteException re) { Loading
services/core/java/com/android/server/pm/PackageManagerShellCommand.java +3 −3 Original line number Diff line number Diff line Loading @@ -2729,13 +2729,13 @@ class PackageManagerShellCommand extends ShellCommand { Slog.i(TAG, "Removing " + userId + " or set as ephemeral if in use."); int result = um.removeUserOrSetEphemeral(userId); switch (result) { case UserManagerService.REMOVE_RESULT_REMOVED: case UserManager.REMOVE_RESULT_REMOVED: getOutPrintWriter().printf("Success: user %d removed\n", userId); return 0; case UserManagerService.REMOVE_RESULT_SET_EPHEMERAL: case UserManager.REMOVE_RESULT_SET_EPHEMERAL: getOutPrintWriter().printf("Success: user %d set as ephemeral\n", userId); return 0; case UserManagerService.REMOVE_RESULT_ALREADY_BEING_REMOVED: case UserManager.REMOVE_RESULT_ALREADY_BEING_REMOVED: getOutPrintWriter().printf("Success: user %d is already being removed\n", userId); return 0; default: Loading
services/core/java/com/android/server/pm/UserManagerService.java +7 −47 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import android.Manifest; import android.annotation.ColorRes; import android.annotation.DrawableRes; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.StringRes; Loading Loading @@ -132,8 +131,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; Loading Loading @@ -248,43 +245,6 @@ public class UserManagerService extends IUserManager.Stub { static final int WRITE_USER_MSG = 1; static final int WRITE_USER_DELAY = 2*1000; // 2 seconds /** * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified * user has been successfully removed. */ public static final int REMOVE_RESULT_REMOVED = 0; /** * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified * user has had its {@link UserInfo#FLAG_EPHEMERAL} flag set to {@code true}, so that it will be * removed when the user is stopped or on boot. */ public static final int REMOVE_RESULT_SET_EPHEMERAL = 1; /** * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that the specified * user is already in the process of being removed. */ public static final int REMOVE_RESULT_ALREADY_BEING_REMOVED = 2; /** * A response code from {@link #removeUserOrSetEphemeral(int)} indicating that an error occurred * that prevented the user from being removed or set as ephemeral. */ public static final int REMOVE_RESULT_ERROR = 3; /** * Possible response codes from {@link #removeUserOrSetEphemeral(int)}. */ @IntDef(prefix = { "REMOVE_RESULT_" }, value = { REMOVE_RESULT_REMOVED, REMOVE_RESULT_SET_EPHEMERAL, REMOVE_RESULT_ALREADY_BEING_REMOVED, REMOVE_RESULT_ERROR, }) @Retention(RetentionPolicy.SOURCE) public @interface RemoveResult {} // Tron counters private static final String TRON_GUEST_CREATED = "users_guest_created"; private static final String TRON_USER_CREATED = "users_user_created"; Loading Loading @@ -4031,17 +3991,17 @@ public class UserManagerService extends IUserManager.Stub { } @Override public @RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId) { public @UserManager.RemoveResult int removeUserOrSetEphemeral(@UserIdInt int userId) { Slog.i(LOG_TAG, "removeUserOrSetEphemeral u" + userId); checkManageUsersPermission("Only the system can remove users"); final String restriction = getUserRemovalRestriction(userId); if (getUserRestrictions(UserHandle.getCallingUserId()).getBoolean(restriction, false)) { Slog.w(LOG_TAG, "Cannot remove user. " + restriction + " is enabled."); return REMOVE_RESULT_ERROR; return UserManager.REMOVE_RESULT_ERROR; } if (userId == UserHandle.USER_SYSTEM) { Slog.e(LOG_TAG, "System user cannot be removed."); return REMOVE_RESULT_ERROR; return UserManager.REMOVE_RESULT_ERROR; } final long ident = Binder.clearCallingIdentity(); Loading @@ -4053,12 +4013,12 @@ public class UserManagerService extends IUserManager.Stub { if (userData == null) { Slog.e(LOG_TAG, "Cannot remove user " + userId + ", invalid user id provided."); return REMOVE_RESULT_ERROR; return UserManager.REMOVE_RESULT_ERROR; } if (mRemovingUserIds.get(userId)) { Slog.e(LOG_TAG, "User " + userId + " is already scheduled for removal."); return REMOVE_RESULT_ALREADY_BEING_REMOVED; return UserManager.REMOVE_RESULT_ALREADY_BEING_REMOVED; } } Loading @@ -4067,7 +4027,7 @@ public class UserManagerService extends IUserManager.Stub { if (currentUser != userId) { // Attempt to remove the user. This will fail if the user is the current user if (removeUser(userId)) { return REMOVE_RESULT_REMOVED; return UserManager.REMOVE_RESULT_REMOVED; } Slog.w(LOG_TAG, "Unable to immediately remove non-current user: " + userId Loading @@ -4081,7 +4041,7 @@ public class UserManagerService extends IUserManager.Stub { userData.info.flags |= UserInfo.FLAG_EPHEMERAL; writeUserLP(userData); return REMOVE_RESULT_SET_EPHEMERAL; return UserManager.REMOVE_RESULT_SET_EPHEMERAL; } } finally { Binder.restoreCallingIdentity(ident); Loading
services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java +5 −5 Original line number Diff line number Diff line Loading @@ -220,7 +220,7 @@ public final class UserManagerTest { asHandle(currentUser)); try { assertThat(mUserManager.removeUserOrSetEphemeral(user1.id)).isEqualTo( UserManagerService.REMOVE_RESULT_ERROR); UserManager.REMOVE_RESULT_ERROR); } finally { mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ false, asHandle(currentUser)); Loading @@ -234,7 +234,7 @@ public final class UserManagerTest { @Test public void testRemoveUserOrSetEphemeral_systemUserReturnsError() throws Exception { assertThat(mUserManager.removeUserOrSetEphemeral(UserHandle.USER_SYSTEM)).isEqualTo( UserManagerService.REMOVE_RESULT_ERROR); UserManager.REMOVE_RESULT_ERROR); assertThat(hasUser(UserHandle.USER_SYSTEM)).isTrue(); } Loading @@ -244,7 +244,7 @@ public final class UserManagerTest { public void testRemoveUserOrSetEphemeral_invalidUserReturnsError() throws Exception { assertThat(hasUser(Integer.MAX_VALUE)).isFalse(); assertThat(mUserManager.removeUserOrSetEphemeral(Integer.MAX_VALUE)).isEqualTo( UserManagerService.REMOVE_RESULT_ERROR); UserManager.REMOVE_RESULT_ERROR); } @MediumTest Loading @@ -256,7 +256,7 @@ public final class UserManagerTest { switchUser(user1.id, null, /* ignoreHandle= */ true); assertThat(mUserManager.removeUserOrSetEphemeral(user1.id)).isEqualTo( UserManagerService.REMOVE_RESULT_SET_EPHEMERAL); UserManager.REMOVE_RESULT_SET_EPHEMERAL); assertThat(hasUser(user1.id)).isTrue(); assertThat(getUser(user1.id).isEphemeral()).isTrue(); Loading @@ -277,7 +277,7 @@ public final class UserManagerTest { final UserInfo user1 = createUser("User 1", /* flags= */ 0); synchronized (mUserRemoveLock) { assertThat(mUserManager.removeUserOrSetEphemeral(user1.id)).isEqualTo( UserManagerService.REMOVE_RESULT_REMOVED); UserManager.REMOVE_RESULT_REMOVED); waitForUserRemovalLocked(user1.id); } Loading