Loading services/core/java/com/android/server/pm/UserManagerService.java +26 −9 Original line number Diff line number Diff line Loading @@ -369,17 +369,21 @@ public class UserManagerService extends IUserManager.Stub { // The boot user strategy for HSUM. @VisibleForTesting static final int BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER = 0; static final int BOOT_STRATEGY_DO_NOT_OVERRIDE = -1; @VisibleForTesting static final int BOOT_TO_HSU_FOR_PROVISIONED_DEVICE = 1; static final int BOOT_STRATEGY_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER = 0; @VisibleForTesting static final int BOOT_STRATEGY_TO_HSU_FOR_PROVISIONED_DEVICE = 1; @Retention(RetentionPolicy.SOURCE) @IntDef(flag = false, prefix = { "BOOT_TO_" }, value = { BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER, BOOT_TO_HSU_FOR_PROVISIONED_DEVICE}) @IntDef(flag = false, prefix = { "BOOT_STRATEGY_" }, value = { BOOT_STRATEGY_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER, BOOT_STRATEGY_TO_HSU_FOR_PROVISIONED_DEVICE}) @VisibleForTesting @interface BootStrategy {} private static final String BOOT_STRATEGY_PROPERTY = "persist.user.hsum_boot_strategy"; private final Context mContext; private final PackageManagerService mPm; Loading Loading @@ -1454,6 +1458,19 @@ public class UserManagerService extends IUserManager.Stub { } } private @BootStrategy int getHsumBootStrategy() { int bootStrategyOverride = SystemProperties.getInt(BOOT_STRATEGY_PROPERTY, BOOT_STRATEGY_DO_NOT_OVERRIDE); int bootStrategy = getContextResources() .getInteger(com.android.internal.R.integer.config_hsumBootStrategy); if (bootStrategyOverride != BOOT_STRATEGY_DO_NOT_OVERRIDE) { Slogf.d(LOG_TAG, "%s overriding HSUM boot strategy to %d", BOOT_STRATEGY_PROPERTY, bootStrategyOverride); bootStrategy = bootStrategyOverride; } return bootStrategy; } private @UserIdInt int getBootUserUnchecked() throws UserManager.CheckedUserOperationException { synchronized (mUsersLock) { if (mBootUser != UserHandle.USER_NULL) { Loading @@ -1469,12 +1486,11 @@ public class UserManagerService extends IUserManager.Stub { } if (isHeadlessSystemUserMode()) { final int bootStrategy = getContextResources() .getInteger(com.android.internal.R.integer.config_hsumBootStrategy); int bootStrategy = getHsumBootStrategy(); switch (bootStrategy) { case BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER: case BOOT_STRATEGY_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER: return getPreviousOrFirstSwitchableUser(); case BOOT_TO_HSU_FOR_PROVISIONED_DEVICE: case BOOT_STRATEGY_TO_HSU_FOR_PROVISIONED_DEVICE: return getBootUserBasedOnProvisioning(); default: Slogf.w(LOG_TAG, "Unknown HSUM boot strategy: %d", bootStrategy); Loading Loading @@ -8200,6 +8216,7 @@ public class UserManagerService extends IUserManager.Stub { if (isHeadlessSystemUserMode) { pw.println(" Can switch to headless system user: " + getContextResources() .getBoolean(com.android.internal.R.bool.config_canSwitchToHeadlessSystemUser)); pw.println(" HSUM Boot Strategy: " + getHsumBootStrategy()); } pw.println(" Is main user permanent admin: " + isMainUserPermanentAdmin()); Loading services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceMockedTest.java +6 −6 Original line number Diff line number Diff line Loading @@ -54,8 +54,8 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.server.pm.UserJourneyLogger.USER_JOURNEY_DEMOTE_MAIN_USER; import static com.android.server.pm.UserJourneyLogger.USER_JOURNEY_PROMOTE_MAIN_USER; import static com.android.server.pm.UserManagerService.BOOT_TO_HSU_FOR_PROVISIONED_DEVICE; import static com.android.server.pm.UserManagerService.BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER; import static com.android.server.pm.UserManagerService.BOOT_STRATEGY_TO_HSU_FOR_PROVISIONED_DEVICE; import static com.android.server.pm.UserManagerService.BOOT_STRATEGY_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; Loading Loading @@ -258,7 +258,7 @@ public final class UserManagerServiceMockedTest { mSpyResources = spy(mSpiedContext.getResources()); when(mSpiedContext.getResources()).thenReturn(mSpyResources); mockHsumBootStrategy(BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER); mockHsumBootStrategy(BOOT_STRATEGY_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER); mockDisallowRemovingLastAdminUser(false); doReturn(mSpyResources).when(Resources::getSystem); Loading Loading @@ -949,7 +949,7 @@ public final class UserManagerServiceMockedTest { addSecondaryUser(USER_ID); addSecondaryUser(USER_ID2); mockProvisionedDevice(true); mockHsumBootStrategy(BOOT_TO_HSU_FOR_PROVISIONED_DEVICE); mockHsumBootStrategy(BOOT_STRATEGY_TO_HSU_FOR_PROVISIONED_DEVICE); assertThat(mUms.getBootUser()).isEqualTo(USER_SYSTEM); } Loading @@ -960,7 +960,7 @@ public final class UserManagerServiceMockedTest { addSecondaryUser(USER_ID); addSecondaryUser(USER_ID2); mockProvisionedDevice(false); mockHsumBootStrategy(BOOT_TO_HSU_FOR_PROVISIONED_DEVICE); mockHsumBootStrategy(BOOT_STRATEGY_TO_HSU_FOR_PROVISIONED_DEVICE); // Even if the headless system user switchable flag is true, the boot user should be the // first switchable full user. mockCanSwitchToHeadlessSystemUser(true); Loading @@ -974,7 +974,7 @@ public final class UserManagerServiceMockedTest { setSystemUserHeadless(true); removeNonSystemUsers(); mockProvisionedDevice(false); mockHsumBootStrategy(BOOT_TO_HSU_FOR_PROVISIONED_DEVICE); mockHsumBootStrategy(BOOT_STRATEGY_TO_HSU_FOR_PROVISIONED_DEVICE); assertThrows(ServiceSpecificException.class, () -> mUms.getBootUser()); Loading Loading
services/core/java/com/android/server/pm/UserManagerService.java +26 −9 Original line number Diff line number Diff line Loading @@ -369,17 +369,21 @@ public class UserManagerService extends IUserManager.Stub { // The boot user strategy for HSUM. @VisibleForTesting static final int BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER = 0; static final int BOOT_STRATEGY_DO_NOT_OVERRIDE = -1; @VisibleForTesting static final int BOOT_TO_HSU_FOR_PROVISIONED_DEVICE = 1; static final int BOOT_STRATEGY_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER = 0; @VisibleForTesting static final int BOOT_STRATEGY_TO_HSU_FOR_PROVISIONED_DEVICE = 1; @Retention(RetentionPolicy.SOURCE) @IntDef(flag = false, prefix = { "BOOT_TO_" }, value = { BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER, BOOT_TO_HSU_FOR_PROVISIONED_DEVICE}) @IntDef(flag = false, prefix = { "BOOT_STRATEGY_" }, value = { BOOT_STRATEGY_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER, BOOT_STRATEGY_TO_HSU_FOR_PROVISIONED_DEVICE}) @VisibleForTesting @interface BootStrategy {} private static final String BOOT_STRATEGY_PROPERTY = "persist.user.hsum_boot_strategy"; private final Context mContext; private final PackageManagerService mPm; Loading Loading @@ -1454,6 +1458,19 @@ public class UserManagerService extends IUserManager.Stub { } } private @BootStrategy int getHsumBootStrategy() { int bootStrategyOverride = SystemProperties.getInt(BOOT_STRATEGY_PROPERTY, BOOT_STRATEGY_DO_NOT_OVERRIDE); int bootStrategy = getContextResources() .getInteger(com.android.internal.R.integer.config_hsumBootStrategy); if (bootStrategyOverride != BOOT_STRATEGY_DO_NOT_OVERRIDE) { Slogf.d(LOG_TAG, "%s overriding HSUM boot strategy to %d", BOOT_STRATEGY_PROPERTY, bootStrategyOverride); bootStrategy = bootStrategyOverride; } return bootStrategy; } private @UserIdInt int getBootUserUnchecked() throws UserManager.CheckedUserOperationException { synchronized (mUsersLock) { if (mBootUser != UserHandle.USER_NULL) { Loading @@ -1469,12 +1486,11 @@ public class UserManagerService extends IUserManager.Stub { } if (isHeadlessSystemUserMode()) { final int bootStrategy = getContextResources() .getInteger(com.android.internal.R.integer.config_hsumBootStrategy); int bootStrategy = getHsumBootStrategy(); switch (bootStrategy) { case BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER: case BOOT_STRATEGY_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER: return getPreviousOrFirstSwitchableUser(); case BOOT_TO_HSU_FOR_PROVISIONED_DEVICE: case BOOT_STRATEGY_TO_HSU_FOR_PROVISIONED_DEVICE: return getBootUserBasedOnProvisioning(); default: Slogf.w(LOG_TAG, "Unknown HSUM boot strategy: %d", bootStrategy); Loading Loading @@ -8200,6 +8216,7 @@ public class UserManagerService extends IUserManager.Stub { if (isHeadlessSystemUserMode) { pw.println(" Can switch to headless system user: " + getContextResources() .getBoolean(com.android.internal.R.bool.config_canSwitchToHeadlessSystemUser)); pw.println(" HSUM Boot Strategy: " + getHsumBootStrategy()); } pw.println(" Is main user permanent admin: " + isMainUserPermanentAdmin()); Loading
services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceMockedTest.java +6 −6 Original line number Diff line number Diff line Loading @@ -54,8 +54,8 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.server.pm.UserJourneyLogger.USER_JOURNEY_DEMOTE_MAIN_USER; import static com.android.server.pm.UserJourneyLogger.USER_JOURNEY_PROMOTE_MAIN_USER; import static com.android.server.pm.UserManagerService.BOOT_TO_HSU_FOR_PROVISIONED_DEVICE; import static com.android.server.pm.UserManagerService.BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER; import static com.android.server.pm.UserManagerService.BOOT_STRATEGY_TO_HSU_FOR_PROVISIONED_DEVICE; import static com.android.server.pm.UserManagerService.BOOT_STRATEGY_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; Loading Loading @@ -258,7 +258,7 @@ public final class UserManagerServiceMockedTest { mSpyResources = spy(mSpiedContext.getResources()); when(mSpiedContext.getResources()).thenReturn(mSpyResources); mockHsumBootStrategy(BOOT_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER); mockHsumBootStrategy(BOOT_STRATEGY_TO_PREVIOUS_OR_FIRST_SWITCHABLE_USER); mockDisallowRemovingLastAdminUser(false); doReturn(mSpyResources).when(Resources::getSystem); Loading Loading @@ -949,7 +949,7 @@ public final class UserManagerServiceMockedTest { addSecondaryUser(USER_ID); addSecondaryUser(USER_ID2); mockProvisionedDevice(true); mockHsumBootStrategy(BOOT_TO_HSU_FOR_PROVISIONED_DEVICE); mockHsumBootStrategy(BOOT_STRATEGY_TO_HSU_FOR_PROVISIONED_DEVICE); assertThat(mUms.getBootUser()).isEqualTo(USER_SYSTEM); } Loading @@ -960,7 +960,7 @@ public final class UserManagerServiceMockedTest { addSecondaryUser(USER_ID); addSecondaryUser(USER_ID2); mockProvisionedDevice(false); mockHsumBootStrategy(BOOT_TO_HSU_FOR_PROVISIONED_DEVICE); mockHsumBootStrategy(BOOT_STRATEGY_TO_HSU_FOR_PROVISIONED_DEVICE); // Even if the headless system user switchable flag is true, the boot user should be the // first switchable full user. mockCanSwitchToHeadlessSystemUser(true); Loading @@ -974,7 +974,7 @@ public final class UserManagerServiceMockedTest { setSystemUserHeadless(true); removeNonSystemUsers(); mockProvisionedDevice(false); mockHsumBootStrategy(BOOT_TO_HSU_FOR_PROVISIONED_DEVICE); mockHsumBootStrategy(BOOT_STRATEGY_TO_HSU_FOR_PROVISIONED_DEVICE); assertThrows(ServiceSpecificException.class, () -> mUms.getBootUser()); Loading