diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 51e90d28abdc9..24b461408b122 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -919,7 +919,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 a1e18a70fdf20..c75ee93b6c396 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2781,6 +2781,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 5ccc2482ff48e..6fceec93b3078 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 c5b611db48e18..b0a14ab142c74 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -1986,10 +1986,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;