Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 30349e41 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes from topic "sysprop-reboot-strategy" into main

* changes:
  Add new system property to override HSUM boot strategy
  Rename HSUM boot strategy const
parents 9cafc9c5 1d35e3ea
Loading
Loading
Loading
Loading
+26 −9
Original line number Diff line number Diff line
@@ -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;

@@ -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) {
@@ -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);
@@ -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());
+6 −6
Original line number Diff line number Diff line
@@ -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;
@@ -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);
@@ -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);
    }
@@ -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);
@@ -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());