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

Commit 37ae7996 authored by Lucas Silva's avatar Lucas Silva
Browse files

Move dream condition to LowLightMonitor

This removes the condition from the condition monitor and moves it into
the monitor itself.

Bug: 407633926
Test: atest LowLightMonitorTest
Flag: EXEMPT refactor
Change-Id: I1e4ea387d83e07604e52961bd23d425628a58722
parent 9a6792f2
Loading
Loading
Loading
Loading
+51 −1
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@ package com.android.systemui.lowlightclock

import android.content.ComponentName
import android.content.packageManager
import android.content.res.mainResources
import android.provider.Settings
import android.testing.TestableLooper.RunWithLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
@@ -24,6 +26,7 @@ import com.android.dream.lowlight.LowLightDreamManager
import com.android.systemui.SysuiTestCase
import com.android.systemui.biometrics.domain.interactor.displayStateInteractor
import com.android.systemui.display.data.repository.displayRepository
import com.android.systemui.dreams.domain.interactor.dreamSettingsInteractorKosmos
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.kosmos.backgroundScope
@@ -34,6 +37,8 @@ import com.android.systemui.log.logcatLogBuffer
import com.android.systemui.shared.condition.Condition
import com.android.systemui.shared.condition.Monitor
import com.android.systemui.testKosmos
import com.android.systemui.user.domain.interactor.selectedUserInteractor
import com.android.systemui.util.settings.fakeSettings
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.asExecutor
@@ -48,7 +53,10 @@ import org.mockito.kotlin.verify
@RunWith(AndroidJUnit4::class)
@RunWithLooper
class LowLightMonitorTest : SysuiTestCase() {
    val kosmos = testKosmos().useUnconfinedTestDispatcher()
    val kosmos =
        testKosmos()
            .apply { mainResources = mContext.orCreateTestableResources.resources }
            .useUnconfinedTestDispatcher()

    private val Kosmos.lowLightDreamManager: LowLightDreamManager by
        Kosmos.Fixture { mock<LowLightDreamManager>() }
@@ -67,6 +75,7 @@ class LowLightMonitorTest : SysuiTestCase() {
                { lowLightDreamManager },
                monitor,
                { setOf(condition) },
                dreamSettingsInteractorKosmos,
                displayStateInteractor,
                logger,
                dreamComponent,
@@ -82,9 +91,35 @@ class LowLightMonitorTest : SysuiTestCase() {
        displayRepository.setDefaultDisplayOff(!screenOn)
    }

    private fun Kosmos.setDreamEnabled(enabled: Boolean) {
        fakeSettings.putBoolForUser(
            Settings.Secure.SCREENSAVER_ENABLED,
            enabled,
            selectedUserInteractor.getSelectedUserId(),
        )
    }

    @Before
    fun setUp() {
        kosmos.setDisplayOn(false)

        // Activate dreams on charge by default
        mContext.orCreateTestableResources.addOverride(
            com.android.internal.R.bool.config_dreamsEnabledByDefault,
            true,
        )
        mContext.orCreateTestableResources.addOverride(
            com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault,
            true,
        )
        mContext.orCreateTestableResources.addOverride(
            com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault,
            false,
        )
        mContext.orCreateTestableResources.addOverride(
            com.android.internal.R.bool.config_dreamsActivatedOnPosturedByDefault,
            false,
        )
    }

    @Test
@@ -134,6 +169,21 @@ class LowLightMonitorTest : SysuiTestCase() {
            assertThat(condition.started).isFalse()
        }

    @Test
    fun testStopMonitorLowLightConditionsWhenDreamDisabled() =
        kosmos.runTest {
            underTest.start()

            setDisplayOn(true)
            setDreamEnabled(true)

            assertThat(condition.started).isTrue()

            setDreamEnabled(false)
            // Verify removing subscription when dream disabled.
            assertThat(condition.started).isFalse()
        }

    @Test
    fun testSubscribeIfScreenIsOnWhenStarting() =
        kosmos.runTest {
+12 −1
Original line number Diff line number Diff line
@@ -22,10 +22,13 @@ import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.SystemUser
import com.android.systemui.dreams.dagger.DreamModule
import com.android.systemui.dreams.domain.interactor.DreamSettingsInteractor
import com.android.systemui.dreams.shared.model.WhenToDream
import com.android.systemui.lowlightclock.dagger.LowLightModule
import com.android.systemui.shared.condition.Condition
import com.android.systemui.shared.condition.Monitor
import com.android.systemui.util.condition.ConditionalCoreStartable
import com.android.systemui.util.kotlin.BooleanFlowOperators.allOf
import com.android.systemui.util.kotlin.BooleanFlowOperators.not
import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
import dagger.Lazy
@@ -34,10 +37,12 @@ import javax.inject.Named
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch

/**
@@ -51,6 +56,7 @@ constructor(
    @param:SystemUser private val conditionsMonitor: Monitor,
    @param:Named(LowLightModule.LOW_LIGHT_PRECONDITIONS)
    private val lowLightConditions: Lazy<Set<Condition>>,
    dreamSettingsInteractor: DreamSettingsInteractor,
    displayStateInteractor: DisplayStateInteractor,
    private val logger: LowLightLogger,
    @param:Named(DreamModule.LOW_LIGHT_DREAM_SERVICE)
@@ -58,8 +64,13 @@ constructor(
    private val packageManager: PackageManager,
    @Background private val scope: CoroutineScope,
) : ConditionalCoreStartable(conditionsMonitor) {
    /** Whether the screen is currently on. */
    private val isScreenOn = not(displayStateInteractor.isDefaultDisplayOff).distinctUntilChanged()

    /** Whether dreams are enabled by the user. */
    private val dreamEnabled: Flow<Boolean> =
        dreamSettingsInteractor.whenToDream.map { it != WhenToDream.NEVER }

    private val isLowLight = conflatedCallbackFlow {
        val token =
            conditionsMonitor.addSubscription(
@@ -89,7 +100,7 @@ constructor(
                return@launch
            }

            isScreenOn
            allOf(isScreenOn, dreamEnabled)
                .flatMapLatest {
                    if (it) {
                        isLowLight
+0 −19
Original line number Diff line number Diff line
@@ -21,10 +21,7 @@ import com.android.dream.lowlight.dagger.LowLightDreamModule
import com.android.systemui.CoreStartable
import com.android.systemui.communal.DeviceInactiveCondition
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dreams.domain.interactor.DreamSettingsInteractor
import com.android.systemui.dreams.shared.model.WhenToDream
import com.android.systemui.log.LogBuffer
import com.android.systemui.log.LogBufferFactory
import com.android.systemui.lowlightclock.AmbientLightModeMonitor.DebounceAlgorithm
@@ -35,8 +32,6 @@ import com.android.systemui.lowlightclock.LowLightDisplayController
import com.android.systemui.lowlightclock.LowLightMonitor
import com.android.systemui.res.R
import com.android.systemui.shared.condition.Condition
import com.android.systemui.shared.condition.Condition.Companion.START_EAGERLY
import com.android.systemui.shared.condition.toCondition
import dagger.Binds
import dagger.BindsOptionalOf
import dagger.Module
@@ -45,8 +40,6 @@ import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap
import dagger.multibindings.IntoSet
import javax.inject.Named
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.map

@Module(includes = [LowLightDreamModule::class])
abstract class LowLightModule {
@@ -82,18 +75,6 @@ abstract class LowLightModule {
        const val LOW_LIGHT_PRECONDITIONS: String = "low_light_preconditions"
        const val LIGHT_SENSOR: String = "low_light_monitor_light_sensor"

        @Provides
        @IntoSet
        @Named(LOW_LIGHT_PRECONDITIONS)
        fun provideDreamEnabledCondition(
            @Background scope: CoroutineScope,
            dreamSettingsInteractor: DreamSettingsInteractor,
        ): Condition {
            return dreamSettingsInteractor.whenToDream
                .map { it != WhenToDream.NEVER }
                .toCondition(scope = scope, strategy = START_EAGERLY, initialValue = false)
        }

        /** Provides a [LogBuffer] for logs related to low-light features. */
        @JvmStatic
        @Provides