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

Commit ec585b55 authored by Matt Pietal's avatar Matt Pietal
Browse files

Add doze screen state information to PowerInteractor

Besides screen on/off events, the display has more granular
modes, such as a low power DOZE mode. Map these events to flows.

Test: atest PowerInteractorTest
Bug: 373844670
Flag: EXEMPT non-impacting domain code
Change-Id: I1d63d57e6077a1178596362c2c6f432ffeea0475
parent 4307c1e1
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ import androidx.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.biometrics.AuthController;
import com.android.systemui.biometrics.UdfpsController;
import com.android.systemui.keyguard.domain.interactor.DozeInteractor;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
import com.android.systemui.util.wakelock.WakeLockFake;
@@ -87,6 +88,8 @@ public class DozeScreenStateTest extends SysuiTestCase {
    @Mock
    private DozeScreenBrightness mDozeScreenBrightness;
    @Mock
    private DozeInteractor mDozeInteractor;
    @Mock
    private SelectedUserInteractor mSelectedUserInteractor;

    @Before
@@ -103,7 +106,7 @@ public class DozeScreenStateTest extends SysuiTestCase {
        mWakeLock = new WakeLockFake();
        mScreen = new DozeScreenState(mServiceFake, mHandlerFake, mDozeHost, mDozeParameters,
                mWakeLock, mAuthController, mUdfpsControllerProvider, mDozeLog,
                mDozeScreenBrightness, mSelectedUserInteractor);
                mDozeScreenBrightness, mDozeInteractor, mSelectedUserInteractor);
    }

    @Test
+31 −6
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
package com.android.systemui.power.domain.interactor

import android.os.PowerManager
import android.view.Display
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
@@ -25,9 +26,12 @@ import com.android.systemui.camera.cameraGestureHelper
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
import com.android.systemui.keyguard.domain.interactor.dozeInteractor
import com.android.systemui.kosmos.testScope
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.power.data.repository.FakePowerRepository
import com.android.systemui.power.data.repository.fakePowerRepository
import com.android.systemui.power.shared.model.DozeScreenStateModel
import com.android.systemui.power.shared.model.WakeSleepReason
import com.android.systemui.power.shared.model.WakefulnessState
import com.android.systemui.statusbar.phone.ScreenOffAnimationController
@@ -51,9 +55,9 @@ class PowerInteractorTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val testScope = kosmos.testScope
    private val cameraGestureHelper = kosmos.cameraGestureHelper
    private val repository: FakePowerRepository = kosmos.fakePowerRepository

    private lateinit var underTest: PowerInteractor
    private lateinit var repository: FakePowerRepository
    private val keyguardRepository = FakeKeyguardRepository()
    @Mock private lateinit var falsingCollector: FalsingCollector
    @Mock private lateinit var screenOffAnimationController: ScreenOffAnimationController
@@ -63,7 +67,6 @@ class PowerInteractorTest : SysuiTestCase() {
    fun setUp() {
        MockitoAnnotations.initMocks(this)

        repository = FakePowerRepository()
        underTest =
            PowerInteractor(
                repository,
@@ -208,7 +211,7 @@ class PowerInteractorTest : SysuiTestCase() {
        whenever(cameraGestureHelper.canCameraGestureBeLaunched(any())).thenReturn(false)
        underTest.onStartedWakingUp(
            PowerManager.WAKE_REASON_POWER_BUTTON,
            /*powerButtonLaunchGestureTriggeredDuringSleep= */ false
            /*powerButtonLaunchGestureTriggeredDuringSleep= */ false,
        )
        underTest.onFinishedWakingUp()
        underTest.onCameraLaunchGestureDetected()
@@ -224,7 +227,7 @@ class PowerInteractorTest : SysuiTestCase() {
    fun onCameraLaunchGestureDetected_maintainsAllOtherState() {
        underTest.onStartedWakingUp(
            PowerManager.WAKE_REASON_POWER_BUTTON,
            /*powerButtonLaunchGestureTriggeredDuringSleep= */ false
            /*powerButtonLaunchGestureTriggeredDuringSleep= */ false,
        )
        underTest.onFinishedWakingUp()
        underTest.onCameraLaunchGestureDetected()
@@ -244,7 +247,7 @@ class PowerInteractorTest : SysuiTestCase() {
        underTest.onFinishedGoingToSleep(/* powerButtonLaunchGestureTriggeredDuringSleep= */ false)
        underTest.onStartedWakingUp(
            PowerManager.WAKE_REASON_POWER_BUTTON,
            /*powerButtonLaunchGestureTriggeredDuringSleep= */ false
            /*powerButtonLaunchGestureTriggeredDuringSleep= */ false,
        )
        underTest.onFinishedWakingUp()

@@ -262,7 +265,7 @@ class PowerInteractorTest : SysuiTestCase() {
        // This state should only be reset onStartedGoingToSleep.
        underTest.onStartedWakingUp(
            PowerManager.WAKE_REASON_POWER_BUTTON,
            /*powerButtonLaunchGestureTriggeredDuringSleep= */ false
            /*powerButtonLaunchGestureTriggeredDuringSleep= */ false,
        )
        underTest.onFinishedWakingUp()

@@ -272,4 +275,26 @@ class PowerInteractorTest : SysuiTestCase() {
            .isEqualTo(WakeSleepReason.POWER_BUTTON)
        assertTrue(repository.wakefulness.value.powerButtonLaunchGestureTriggered)
    }

    @Test
    fun dozeScreenState() =
        testScope.runTest {
            val dozeScreenState by collectLastValue(underTest.dozeScreenState)
            assertThat(dozeScreenState).isEqualTo(DozeScreenStateModel.UNKNOWN)

            kosmos.dozeInteractor.setDozeScreenState(Display.STATE_OFF)
            assertThat(dozeScreenState).isEqualTo(DozeScreenStateModel.OFF)

            kosmos.dozeInteractor.setDozeScreenState(Display.STATE_ON)
            assertThat(dozeScreenState).isEqualTo(DozeScreenStateModel.ON)

            kosmos.dozeInteractor.setDozeScreenState(Display.STATE_DOZE)
            assertThat(dozeScreenState).isEqualTo(DozeScreenStateModel.DOZE)

            kosmos.dozeInteractor.setDozeScreenState(Display.STATE_DOZE_SUSPEND)
            assertThat(dozeScreenState).isEqualTo(DozeScreenStateModel.DOZE_SUSPEND)

            kosmos.dozeInteractor.setDozeScreenState(Display.STATE_ON_SUSPEND)
            assertThat(dozeScreenState).isEqualTo(DozeScreenStateModel.ON_SUSPEND)
        }
}
+5 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.doze.dagger.DozeScope;
import com.android.systemui.doze.dagger.WrappedService;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.keyguard.domain.interactor.DozeInteractor;
import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
import com.android.systemui.util.wakelock.SettableWakeLock;
import com.android.systemui.util.wakelock.WakeLock;
@@ -82,6 +83,7 @@ public class DozeScreenState implements DozeMachine.Part {
    private final DozeLog mDozeLog;
    private final DozeScreenBrightness mDozeScreenBrightness;
    private final SelectedUserInteractor mSelectedUserInteractor;
    private final DozeInteractor mDozeInteractor;

    private int mPendingScreenState = Display.STATE_UNKNOWN;
    private SettableWakeLock mWakeLock;
@@ -97,6 +99,7 @@ public class DozeScreenState implements DozeMachine.Part {
            Provider<UdfpsController> udfpsControllerProvider,
            DozeLog dozeLog,
            DozeScreenBrightness dozeScreenBrightness,
            DozeInteractor dozeInteractor,
            SelectedUserInteractor selectedUserInteractor) {
        mDozeService = service;
        mHandler = handler;
@@ -108,6 +111,7 @@ public class DozeScreenState implements DozeMachine.Part {
        mDozeLog = dozeLog;
        mDozeScreenBrightness = dozeScreenBrightness;
        mSelectedUserInteractor = selectedUserInteractor;
        mDozeInteractor = dozeInteractor;

        updateUdfpsController();
        if (mUdfpsController == null) {
@@ -225,6 +229,7 @@ public class DozeScreenState implements DozeMachine.Part {
        if (screenState != Display.STATE_UNKNOWN) {
            if (DEBUG) Log.d(TAG, "setDozeScreenState(" + screenState + ")");
            mDozeService.setDozeScreenState(screenState);
            mDozeInteractor.setDozeScreenState(screenState);
            if (screenState == Display.STATE_DOZE) {
                // If we're entering doze, update the doze screen brightness. We might have been
                // clamping it to the dim brightness during the screen off animation, and we should
+18 −0
Original line number Diff line number Diff line
@@ -17,8 +17,11 @@
package com.android.systemui.keyguard.domain.interactor

import android.graphics.Point
import android.view.Display
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.data.repository.KeyguardRepository
import com.android.systemui.power.data.repository.PowerRepository
import com.android.systemui.power.shared.model.DozeScreenStateModel
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.scene.shared.model.Scenes
@@ -30,6 +33,7 @@ class DozeInteractor
@Inject
constructor(
    private val keyguardRepository: KeyguardRepository,
    private val powerRepository: PowerRepository,
    // TODO(b/336364825) Remove Lazy when SceneContainerFlag is released -
    // while the flag is off, creating this object too early results in a crash
    private val sceneInteractor: Lazy<SceneInteractor>,
@@ -41,6 +45,20 @@ constructor(
        return sceneInteractor.get().currentScene.value == Scenes.Lockscreen
    }

    fun setDozeScreenState(state: Int) {
        powerRepository.dozeScreenState.value =
            when (state) {
                Display.STATE_UNKNOWN -> DozeScreenStateModel.UNKNOWN
                Display.STATE_OFF -> DozeScreenStateModel.OFF
                Display.STATE_ON -> DozeScreenStateModel.ON
                Display.STATE_DOZE -> DozeScreenStateModel.DOZE
                Display.STATE_DOZE_SUSPEND -> DozeScreenStateModel.DOZE_SUSPEND
                Display.STATE_VR -> DozeScreenStateModel.VR
                Display.STATE_ON_SUSPEND -> DozeScreenStateModel.ON_SUSPEND
                else -> throw IllegalArgumentException("Invalid DozeScreenState: $state")
            }
    }

    fun setAodAvailable(value: Boolean) {
        keyguardRepository.setAodAvailable(value)
    }
+6 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLoggin
import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.power.shared.model.DozeScreenStateModel
import com.android.systemui.power.shared.model.ScreenPowerState
import com.android.systemui.power.shared.model.WakeSleepReason
import com.android.systemui.power.shared.model.WakefulnessModel
@@ -64,6 +65,9 @@ interface PowerRepository {
     */
    val screenPowerState: StateFlow<ScreenPowerState>

    /** More granular display states, mainly for use in dozing. */
    val dozeScreenState: MutableStateFlow<DozeScreenStateModel>

    /** Wakes up the device. */
    fun wakeUp(why: String, @PowerManager.WakeReason wakeReason: Int)

@@ -100,6 +104,8 @@ constructor(
    dispatcher: BroadcastDispatcher,
) : PowerRepository {

    override val dozeScreenState = MutableStateFlow(DozeScreenStateModel.UNKNOWN)

    override val isInteractive: Flow<Boolean> = conflatedCallbackFlow {
        fun send() {
            trySendWithFailureLogging(manager.isInteractive, TAG)
Loading