From cb776b8903cd42231bcfd78fca48159a565a3555 Mon Sep 17 00:00:00 2001 From: Nikhil Kumar Date: Wed, 1 Feb 2023 14:42:27 +0000 Subject: [PATCH] Added restriction for switching to Headless SYSTEM user. On HSUM(HeadlessSystemUserMode) user 0 will not be a Full user and is not going to run in foreground. Added restrictions to prevent switching to non-full user which will eventually restrict switching to user 0 in headless. In some form factors we do need to switch to headless SYSTEM user even when its not FULL like in AUTO, added overlay property to allow switching to non-full SYSTEM user in case the property is enabled. Refactor and Deprecated UserInfo.supportsSwitchToByUser by UserInfo.supportsSwitchTo after adding the restrictions to prevent switch to non-full users. Removed redundant userInfo.isProfile check from UserController.switchUser. Test: m , atest ActivityManagerTest -c Bug: 262402637 Change-Id: I871e6721ce6745d5a9e3009162e3d6ac8a284908 --- core/api/test-current.txt | 2 +- core/java/android/content/pm/UserInfo.java | 18 ++++++++++++++---- core/res/res/values/config.xml | 4 ++++ core/res/res/values/symbols.xml | 1 + .../com/android/server/am/UserController.java | 4 ---- 5 files changed, 20 insertions(+), 9 deletions(-) diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 400a324b43113..6c2845e21ee11 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -923,7 +923,7 @@ package android.content.pm { method public boolean isQuietModeEnabled(); method public boolean isRestricted(); method public boolean supportsSwitchTo(); - method public boolean supportsSwitchToByUser(); + method @Deprecated public boolean supportsSwitchToByUser(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator CREATOR; field public static final int FLAG_ADMIN = 2; // 0x2 diff --git a/core/java/android/content/pm/UserInfo.java b/core/java/android/content/pm/UserInfo.java index e38cb65f991f8..ccaee925751e6 100644 --- a/core/java/android/content/pm/UserInfo.java +++ b/core/java/android/content/pm/UserInfo.java @@ -22,6 +22,7 @@ import android.annotation.Nullable; import android.annotation.TestApi; import android.annotation.UserIdInt; import android.compat.annotation.UnsupportedAppUsage; +import android.content.res.Resources; import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; @@ -418,16 +419,25 @@ public class UserInfo implements Parcelable { // Don't support switching to pre-created users until they become "real" users. return false; } - return !isProfile(); + return isFull() || canSwitchToHeadlessSystemUser(); + } + + /** + * @return true if user is of type {@link UserManager#USER_TYPE_SYSTEM_HEADLESS} and + * {@link com.android.internal.R.bool.config_canSwitchToHeadlessSystemUser} is true. + */ + private boolean canSwitchToHeadlessSystemUser() { + return UserManager.USER_TYPE_SYSTEM_HEADLESS.equals(userType) && Resources.getSystem() + .getBoolean(com.android.internal.R.bool.config_canSwitchToHeadlessSystemUser); } /** * @return true if this user can be switched to by end user through UI. + * @deprecated Use {@link UserInfo#supportsSwitchTo} instead. */ + @Deprecated public boolean supportsSwitchToByUser() { - // Hide the system user when it does not represent a human user. - boolean hideSystemUser = UserManager.isHeadlessSystemUserMode(); - return (!hideSystemUser || id != UserHandle.USER_SYSTEM) && supportsSwitchTo(); + return supportsSwitchTo(); } // TODO(b/142482943): Make this logic more specific and customizable. (canHaveProfile(userType)) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 0c13484276992..2b0d02de3f95f 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2774,6 +2774,10 @@ it can't be deleted or downgraded to non-admin status. --> false + + false + false diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 18084d83364d5..74ddffac9ccd4 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -355,6 +355,7 @@ + diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index b2e4740de5d40..d77bae007e0bb 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -1984,10 +1984,6 @@ class UserController implements Handler.Callback { Slogf.w(TAG, "Cannot switch to User #" + targetUserId + ": not supported"); return false; } - if (targetUserInfo.isProfile()) { - Slogf.w(TAG, "Cannot switch to User #" + targetUserId + ": not a full user"); - return false; - } if (FactoryResetter.isFactoryResetting()) { Slogf.w(TAG, "Cannot switch to User #" + targetUserId + ": factory reset in progress"); return false;