diff options
| -rw-r--r-- | core/api/test-current.txt | 4 | ||||
| -rw-r--r-- | core/java/android/content/pm/UserInfo.java | 16 | ||||
| -rw-r--r-- | core/java/android/os/UserManager.java | 7 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/UserManagerService.java | 14 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/UserTypeDetails.java | 19 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/UserTypeFactory.java | 12 |
6 files changed, 53 insertions, 19 deletions
diff --git a/core/api/test-current.txt b/core/api/test-current.txt index c0cd6386aec2..8ff1a84e9178 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -985,7 +985,7 @@ package android.content.pm { method public boolean isInitialized(); method public boolean isMain(); method public boolean isManagedProfile(); - method public boolean isPrimary(); + method @Deprecated public boolean isPrimary(); method public boolean isProfile(); method public boolean isQuietModeEnabled(); method public boolean isRestricted(); @@ -1002,7 +1002,7 @@ package android.content.pm { field public static final int FLAG_INITIALIZED = 16; // 0x10 field public static final int FLAG_MAIN = 16384; // 0x4000 field @Deprecated public static final int FLAG_MANAGED_PROFILE = 32; // 0x20 - field public static final int FLAG_PRIMARY = 1; // 0x1 + field @Deprecated public static final int FLAG_PRIMARY = 1; // 0x1 field public static final int FLAG_PROFILE = 4096; // 0x1000 field public static final int FLAG_QUIET_MODE = 128; // 0x80 field @Deprecated public static final int FLAG_RESTRICTED = 8; // 0x8 diff --git a/core/java/android/content/pm/UserInfo.java b/core/java/android/content/pm/UserInfo.java index 6386f75ae2f3..81fc0293b685 100644 --- a/core/java/android/content/pm/UserInfo.java +++ b/core/java/android/content/pm/UserInfo.java @@ -60,10 +60,17 @@ public class UserInfo implements Parcelable { */ /** - * Primary user. Only one user can have this flag set. It identifies the first human user - * on a device. This flag is not supported in headless system user mode. + * Primary user. In practice, this is just synonymous with {@link #FLAG_SYSTEM}. + * + * <p>On many devices, this will also be the first human user. + * However, in {@link UserManager#isHeadlessSystemUserMode() headless system user mode}, this + * should be regarded as unsupported since the system user may not be a human. + * + * @deprecated For checking for user 0, use {@link #FLAG_SYSTEM}. + * For checking for the designated "main human user", use {@link #FLAG_MAIN}. */ @UnsupportedAppUsage + @Deprecated public static final int FLAG_PRIMARY = 0x00000001; /** @@ -335,7 +342,12 @@ public class UserInfo implements Parcelable { } } + /** + * @deprecated For checking for user 0, compare {@link #id} to {@link UserHandle#USER_SYSTEM}. + * For checking for the designated "main human user", use {@link #isMain()}. + */ @UnsupportedAppUsage + @Deprecated public boolean isPrimary() { return (flags & FLAG_PRIMARY) == FLAG_PRIMARY; } diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 9c55ad692f42..bbf7f810b3c0 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -4381,11 +4381,16 @@ public class UserManager { } /** - * Returns information for Primary user. + * Returns information for Primary user (which in practice is the same as the System user). * * @return the Primary user, null if not found. + * @deprecated For the system user, call {@link #getUserInfo} on {@link UserHandle#USER_SYSTEM}, + * or just use {@link UserHandle#SYSTEM} or {@link UserHandle#USER_SYSTEM}. + * For the designated MainUser, use {@link #getMainUser()}. + * * @hide */ + @Deprecated @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public @Nullable UserInfo getPrimaryUser() { try { diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 11efd414a89f..58ae95568e3b 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -3938,22 +3938,22 @@ public class UserManagerService extends IUserManager.Stub { @GuardedBy({"mPackagesLock"}) private void fallbackToSingleUserLP() { - int flags = UserInfo.FLAG_SYSTEM | UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_ADMIN - | UserInfo.FLAG_PRIMARY; // Create the system user - String systemUserType = isDefaultHeadlessSystemUserMode() + final String systemUserType = isDefaultHeadlessSystemUserMode() ? UserManager.USER_TYPE_SYSTEM_HEADLESS : UserManager.USER_TYPE_FULL_SYSTEM; - flags |= mUserTypes.get(systemUserType).getDefaultUserInfoFlags(); - UserInfo system = new UserInfo(UserHandle.USER_SYSTEM, null, null, flags, systemUserType); - UserData userData = putUserInfo(system); + final int flags = mUserTypes.get(systemUserType).getDefaultUserInfoFlags() + | UserInfo.FLAG_INITIALIZED; + final UserInfo system = new UserInfo(UserHandle.USER_SYSTEM, + /* name= */ null, /* iconPath= */ null, flags, systemUserType); + final UserData userData = putUserInfo(system); userData.userProperties = new UserProperties( mUserTypes.get(userData.info.userType).getDefaultUserPropertiesReference()); mNextSerialNumber = MIN_USER_ID; mUserVersion = USER_VERSION; mUserTypeVersion = UserTypeFactory.getUserTypeVersion(); - Bundle restrictions = new Bundle(); + final Bundle restrictions = new Bundle(); try { final String[] defaultFirstUserRestrictions = mContext.getResources().getStringArray( com.android.internal.R.array.config_defaultFirstUserRestrictions); diff --git a/services/core/java/com/android/server/pm/UserTypeDetails.java b/services/core/java/com/android/server/pm/UserTypeDetails.java index f86ee9032ee9..6065372e1ea0 100644 --- a/services/core/java/com/android/server/pm/UserTypeDetails.java +++ b/services/core/java/com/android/server/pm/UserTypeDetails.java @@ -76,7 +76,7 @@ public final class UserTypeDetails { private final @UserInfoFlag int mBaseType; // TODO(b/143784345): Update doc/name when we clean up UserInfo. - /** The {@link UserInfo.UserInfoFlag}s that all users of this type will automatically have. */ + /** The {@link UserInfoFlag}s to apply by default to newly created users of this type. */ private final @UserInfoFlag int mDefaultUserInfoPropertyFlags; /** @@ -224,7 +224,7 @@ public final class UserTypeDetails { } // TODO(b/143784345): Update comment when UserInfo is reorganized. - /** The {@link UserInfo.UserInfoFlag}s that all users of this type will automatically have. */ + /** The {@link UserInfoFlag}s to apply by default to newly created users of this type. */ public int getDefaultUserInfoFlags() { return mDefaultUserInfoPropertyFlags | mBaseType; } @@ -526,6 +526,7 @@ public final class UserTypeDetails { Preconditions.checkArgument(hasValidPropertyFlags(), "UserTypeDetails " + mName + " has invalid flags: " + Integer.toHexString(mDefaultUserInfoPropertyFlags)); + checkSystemAndMainUserPreconditions(); if (hasBadge()) { Preconditions.checkArgument(mBadgeLabels != null && mBadgeLabels.length != 0, "UserTypeDetails " + mName + " has badge but no badgeLabels."); @@ -578,8 +579,6 @@ public final class UserTypeDetails { // TODO(b/143784345): Refactor this when we clean up UserInfo. private boolean hasValidPropertyFlags() { final int forbiddenMask = - UserInfo.FLAG_PRIMARY | - UserInfo.FLAG_ADMIN | UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_QUIET_MODE | UserInfo.FLAG_FULL | @@ -587,6 +586,18 @@ public final class UserTypeDetails { UserInfo.FLAG_PROFILE; return (mDefaultUserInfoPropertyFlags & forbiddenMask) == 0; } + + private void checkSystemAndMainUserPreconditions() { + // Primary must be synonymous with System. + Preconditions.checkArgument( + ((mBaseType & UserInfo.FLAG_SYSTEM) != 0) == + ((mDefaultUserInfoPropertyFlags & UserInfo.FLAG_PRIMARY) != 0), + "UserTypeDetails " + mName + " cannot be SYSTEM xor PRIMARY."); + // At most one MainUser is ever allowed at a time. + Preconditions.checkArgument( + ((mDefaultUserInfoPropertyFlags & UserInfo.FLAG_MAIN) == 0) || mMaxAllowed == 1, + "UserTypeDetails " + mName + " must not sanction more than one MainUser."); + } } /** diff --git a/services/core/java/com/android/server/pm/UserTypeFactory.java b/services/core/java/com/android/server/pm/UserTypeFactory.java index 4cf8c0960a87..b7a2b86b1bcd 100644 --- a/services/core/java/com/android/server/pm/UserTypeFactory.java +++ b/services/core/java/com/android/server/pm/UserTypeFactory.java @@ -16,11 +16,14 @@ package com.android.server.pm; +import static android.content.pm.UserInfo.FLAG_ADMIN; import static android.content.pm.UserInfo.FLAG_DEMO; import static android.content.pm.UserInfo.FLAG_EPHEMERAL; import static android.content.pm.UserInfo.FLAG_FULL; import static android.content.pm.UserInfo.FLAG_GUEST; +import static android.content.pm.UserInfo.FLAG_MAIN; import static android.content.pm.UserInfo.FLAG_MANAGED_PROFILE; +import static android.content.pm.UserInfo.FLAG_PRIMARY; import static android.content.pm.UserInfo.FLAG_PROFILE; import static android.content.pm.UserInfo.FLAG_RESTRICTED; import static android.content.pm.UserInfo.FLAG_SYSTEM; @@ -62,7 +65,7 @@ import java.util.function.Consumer; * This class is responsible both for defining the AOSP use types, as well as reading in customized * user types from {@link com.android.internal.R.xml#config_user_types}. * - * Tests are located in UserManagerServiceUserTypeTest.java. + * Tests are located in {@link UserManagerServiceUserTypeTest}. * @hide */ public final class UserTypeFactory { @@ -277,7 +280,8 @@ public final class UserTypeFactory { return new UserTypeDetails.Builder() .setName(USER_TYPE_FULL_SYSTEM) .setBaseType(FLAG_SYSTEM | FLAG_FULL) - .setDefaultUserInfoPropertyFlags(UserInfo.FLAG_MAIN); + .setDefaultUserInfoPropertyFlags(FLAG_PRIMARY | FLAG_ADMIN | FLAG_MAIN) + .setMaxAllowed(1); } /** @@ -287,7 +291,9 @@ public final class UserTypeFactory { private static UserTypeDetails.Builder getDefaultTypeSystemHeadless() { return new UserTypeDetails.Builder() .setName(USER_TYPE_SYSTEM_HEADLESS) - .setBaseType(FLAG_SYSTEM); + .setBaseType(FLAG_SYSTEM) + .setDefaultUserInfoPropertyFlags(FLAG_PRIMARY | FLAG_ADMIN) + .setMaxAllowed(1); } private static Bundle getDefaultSecondaryUserRestrictions() { |