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

Commit eed9e92b authored by Robert Horvath's avatar Robert Horvath
Browse files

Acquire Booting SuspendBlocker during boot

With quiescent boot, the display stays off during boot, so the
Display SuspendBlocker will not keep the device awake during boot.
To make sure that the device does not suspend during boot, acquire
a SuspendBlocker that is held while the device is booting.

Bug: 180866475
Test: atest PowerManagerServiceTest
Change-Id: Iba93ed3b7fd957820ce15d336514dfce8f5a54fa
parent f4bc81ec
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -352,6 +352,12 @@ public final class PowerManagerService extends SystemService
    // requested because it is updated asynchronously by the display power controller.
    private DisplayGroupPowerStateMapper mDisplayGroupPowerStateMapper;

    // The suspend blocker used to keep the CPU alive while the device is booting.
    private final SuspendBlocker mBootingSuspendBlocker;

    // True if the wake lock suspend blocker has been acquired.
    private boolean mHoldingBootingSuspendBlocker;

    // The suspend blocker used to keep the CPU alive when an application has acquired
    // a wake lock.
    private final SuspendBlocker mWakeLockSuspendBlocker;
@@ -1036,10 +1042,16 @@ public final class PowerManagerService extends SystemService
        }

        synchronized (mLock) {
            mBootingSuspendBlocker =
                    mInjector.createSuspendBlocker(this, "PowerManagerService.Booting");
            mWakeLockSuspendBlocker =
                    mInjector.createSuspendBlocker(this, "PowerManagerService.WakeLocks");
            mDisplaySuspendBlocker =
                    mInjector.createSuspendBlocker(this, "PowerManagerService.Display");
            if (mBootingSuspendBlocker != null) {
                mBootingSuspendBlocker.acquire();
                mHoldingBootingSuspendBlocker = true;
            }
            if (mDisplaySuspendBlocker != null) {
                mDisplaySuspendBlocker.acquire();
                mHoldingDisplaySuspendBlocker = true;
@@ -3385,6 +3397,10 @@ public final class PowerManagerService extends SystemService
        }

        // First acquire suspend blockers if needed.
        if (!mBootCompleted && !mHoldingBootingSuspendBlocker) {
            mBootingSuspendBlocker.acquire();
            mHoldingBootingSuspendBlocker = true;
        }
        if (needWakeLockSuspendBlocker && !mHoldingWakeLockSuspendBlocker) {
            mWakeLockSuspendBlocker.acquire();
            mHoldingWakeLockSuspendBlocker = true;
@@ -3411,6 +3427,10 @@ public final class PowerManagerService extends SystemService
        }

        // Then release suspend blockers if needed.
        if (mBootCompleted && mHoldingBootingSuspendBlocker) {
            mBootingSuspendBlocker.release();
            mHoldingBootingSuspendBlocker = false;
        }
        if (!needWakeLockSuspendBlocker && mHoldingWakeLockSuspendBlocker) {
            mWakeLockSuspendBlocker.release();
            mHoldingWakeLockSuspendBlocker = false;
+27 −0
Original line number Diff line number Diff line
@@ -740,6 +740,33 @@ public class PowerManagerServiceTest {
        assertTrue(isAcquired[0]);
    }

    @Test
    public void testSuspendBlockerHeldDuringBoot() throws Exception {
        final String suspendBlockerName = "PowerManagerService.Booting";

        final boolean[] isAcquired = new boolean[1];
        doAnswer(inv -> {
            isAcquired[0] = false;
            return null;
        }).when(mNativeWrapperMock).nativeReleaseSuspendBlocker(eq(suspendBlockerName));

        doAnswer(inv -> {
            isAcquired[0] = true;
            return null;
        }).when(mNativeWrapperMock).nativeAcquireSuspendBlocker(eq(suspendBlockerName));

        // Need to create the service after we stub the mocks for this test because some of the
        // mocks are used during the constructor.
        createService();
        assertTrue(isAcquired[0]);

        mService.systemReady(null);
        assertTrue(isAcquired[0]);

        mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
        assertFalse(isAcquired[0]);
    }

    @Test
    public void testInattentiveSleep_hideWarningIfStayOnIsEnabledAndPluggedIn() throws Exception {
        setMinimumScreenOffTimeoutConfig(5);