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

Commit 979056c3 authored by Bryce Lee's avatar Bryce Lee
Browse files

Separate DreamSettingsInteractor from CommunalSettingsInteractor.

This changelist refactors communal code to extract dream-related
settings.

Test: atest DreamSettingsRepositoryImplTest
Bug: 389155961
Flag: EXEMPT refactor
Change-Id: I6a007ba3ec2ddd54c77bf927c7bb67141d4a50f5
parent 2647e101
Loading
Loading
Loading
Loading
+0 −87
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ import android.os.UserManager.USER_TYPE_PROFILE_MANAGED
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.FlagsParameterization
import android.provider.Settings
import androidx.test.filters.SmallTest
import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
import com.android.systemui.Flags.FLAG_GLANCEABLE_HUB_BLURRED_BACKGROUND
@@ -36,7 +35,6 @@ import com.android.systemui.SysuiTestCase
import com.android.systemui.broadcast.broadcastDispatcher
import com.android.systemui.communal.data.repository.CommunalSettingsRepositoryImpl.Companion.GLANCEABLE_HUB_BACKGROUND_SETTING
import com.android.systemui.communal.shared.model.CommunalBackgroundType
import com.android.systemui.communal.shared.model.WhenToDream
import com.android.systemui.flags.Flags.COMMUNAL_SERVICE_ENABLED
import com.android.systemui.flags.fakeFeatureFlagsClassic
import com.android.systemui.kosmos.Kosmos
@@ -237,91 +235,6 @@ class CommunalSettingsRepositoryImplTest(flags: FlagsParameterization?) : SysuiT
            }
        }

    @Test
    fun whenToDream_charging() =
        kosmos.runTest {
            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState(PRIMARY_USER))

            fakeSettings.putIntForUser(
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP,
                1,
                PRIMARY_USER.id,
            )

            assertThat(whenToDreamState).isEqualTo(WhenToDream.WHILE_CHARGING)
        }

    @Test
    fun whenToDream_charging_defaultValue() =
        kosmos.runTest {
            mContext.orCreateTestableResources.addOverride(
                com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault,
                true,
            )

            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState(PRIMARY_USER))
            assertThat(whenToDreamState).isEqualTo(WhenToDream.WHILE_CHARGING)
        }

    @Test
    fun whenToDream_docked() =
        kosmos.runTest {
            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState(PRIMARY_USER))

            fakeSettings.putIntForUser(
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,
                1,
                PRIMARY_USER.id,
            )

            assertThat(whenToDreamState).isEqualTo(WhenToDream.WHILE_DOCKED)
        }

    @Test
    fun whenToDream_docked_defaultValue() =
        kosmos.runTest {
            mContext.orCreateTestableResources.addOverride(
                com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault,
                true,
            )

            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState(PRIMARY_USER))
            assertThat(whenToDreamState).isEqualTo(WhenToDream.WHILE_DOCKED)
        }

    @Test
    fun whenToDream_postured() =
        kosmos.runTest {
            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState(PRIMARY_USER))

            fakeSettings.putIntForUser(
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED,
                1,
                PRIMARY_USER.id,
            )

            assertThat(whenToDreamState).isEqualTo(WhenToDream.WHILE_POSTURED)
        }

    @Test
    fun whenToDream_postured_defaultValue() =
        kosmos.runTest {
            mContext.orCreateTestableResources.addOverride(
                com.android.internal.R.bool.config_dreamsActivatedOnPosturedByDefault,
                true,
            )

            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState(PRIMARY_USER))
            assertThat(whenToDreamState).isEqualTo(WhenToDream.WHILE_POSTURED)
        }

    @Test
    fun whenToDream_default() =
        kosmos.runTest {
            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState(PRIMARY_USER))
            assertThat(whenToDreamState).isEqualTo(WhenToDream.NEVER)
        }

    private fun setKeyguardFeaturesDisabled(user: UserInfo, disabledFlags: Int) {
        whenever(kosmos.devicePolicyManager.getKeyguardDisabledFeatures(nullable(), eq(user.id)))
            .thenReturn(disabledFlags)
+190 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.dreams.data.repository

import android.content.pm.UserInfo
import android.content.res.mainResources
import android.provider.Settings
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.dreams.shared.model.WhenToDream
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.testKosmos
import com.android.systemui.util.settings.fakeSettings
import com.google.common.truth.Truth.assertThat
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith

@SmallTest
@RunWith(AndroidJUnit4::class)
class DreamSettingsRepositoryImplTest : SysuiTestCase() {
    private val kosmos =
        testKosmos()
            .apply { mainResources = mContext.orCreateTestableResources.resources }
            .useUnconfinedTestDispatcher()

    private val Kosmos.underTest by Kosmos.Fixture { dreamSettingsRepository }

    @Before
    fun setUp() {
        mContext.orCreateTestableResources.addOverride(
            com.android.internal.R.bool.config_dreamsEnabledByDefault,
            true,
        )

        mContext.orCreateTestableResources.addOverride(
            com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault,
            false,
        )
        mContext.orCreateTestableResources.addOverride(
            com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault,
            false,
        )
        mContext.orCreateTestableResources.addOverride(
            com.android.internal.R.bool.config_dreamsActivatedOnPosturedByDefault,
            false,
        )
    }

    @After
    fun tearDown() {
        mContext.orCreateTestableResources.removeOverride(
            com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault
        )
        mContext.orCreateTestableResources.removeOverride(
            com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault
        )
        mContext.orCreateTestableResources.removeOverride(
            com.android.internal.R.bool.config_dreamsActivatedOnPosturedByDefault
        )
    }

    @Test
    fun whenToDream_charging() =
        kosmos.runTest {
            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState(PRIMARY_USER))

            fakeSettings.putIntForUser(
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP,
                1,
                PRIMARY_USER.id,
            )

            assertThat(whenToDreamState).isEqualTo(WhenToDream.WHILE_CHARGING)
        }

    @Test
    fun whenToDream_charging_defaultValue() =
        kosmos.runTest {
            mContext.orCreateTestableResources.addOverride(
                com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault,
                true,
            )

            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState(PRIMARY_USER))
            assertThat(whenToDreamState).isEqualTo(WhenToDream.WHILE_CHARGING)
        }

    @Test
    fun whenToDream_docked() =
        kosmos.runTest {
            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState(PRIMARY_USER))

            fakeSettings.putIntForUser(
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,
                1,
                PRIMARY_USER.id,
            )

            assertThat(whenToDreamState).isEqualTo(WhenToDream.WHILE_DOCKED)
        }

    @Test
    fun whenToDream_docked_defaultValue() =
        kosmos.runTest {
            mContext.orCreateTestableResources.addOverride(
                com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault,
                true,
            )

            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState(PRIMARY_USER))
            assertThat(whenToDreamState).isEqualTo(WhenToDream.WHILE_DOCKED)
        }

    @Test
    fun whenToDream_postured() =
        kosmos.runTest {
            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState(PRIMARY_USER))

            fakeSettings.putIntForUser(
                Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED,
                1,
                PRIMARY_USER.id,
            )

            assertThat(whenToDreamState).isEqualTo(WhenToDream.WHILE_POSTURED)
        }

    @Test
    fun whenToDream_postured_defaultValue() =
        kosmos.runTest {
            mContext.orCreateTestableResources.addOverride(
                com.android.internal.R.bool.config_dreamsActivatedOnPosturedByDefault,
                true,
            )

            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState(PRIMARY_USER))
            assertThat(whenToDreamState).isEqualTo(WhenToDream.WHILE_POSTURED)
        }

    @Test
    fun whenToDream_overriddenByEnabled() =
        kosmos.runTest {
            mContext.orCreateTestableResources.addOverride(
                com.android.internal.R.bool.config_dreamsActivatedOnPosturedByDefault,
                true,
            )

            fakeSettings.putBoolForUser(Settings.Secure.SCREENSAVER_ENABLED, false, PRIMARY_USER.id)

            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState(PRIMARY_USER))

            assertThat(whenToDreamState).isEqualTo(WhenToDream.NEVER)

            fakeSettings.putBoolForUser(Settings.Secure.SCREENSAVER_ENABLED, true, PRIMARY_USER.id)

            assertThat(whenToDreamState).isEqualTo(WhenToDream.WHILE_POSTURED)
        }

    @Test
    fun whenToDream_default() =
        kosmos.runTest {
            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState(PRIMARY_USER))
            assertThat(whenToDreamState).isEqualTo(WhenToDream.NEVER)
        }

    private companion object {
        val PRIMARY_USER =
            UserInfo(/* id= */ 0, /* name= */ "primary user", /* flags= */ UserInfo.FLAG_MAIN)
    }
}
+4 −4
Original line number Diff line number Diff line
@@ -22,12 +22,12 @@ import android.service.dreams.Flags.allowDreamWhenPostured
import com.android.app.tracing.coroutines.launchInTraced
import com.android.systemui.CoreStartable
import com.android.systemui.common.domain.interactor.BatteryInteractor
import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
import com.android.systemui.communal.posturing.domain.interactor.PosturingInteractor
import com.android.systemui.communal.posturing.shared.model.PosturedState
import com.android.systemui.communal.shared.model.WhenToDream
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dreams.domain.interactor.DreamSettingsInteractor
import com.android.systemui.dreams.shared.model.WhenToDream
import com.android.systemui.log.dagger.CommunalTableLog
import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.log.table.logDiffsForTable
@@ -50,7 +50,7 @@ constructor(
    private val commandRegistry: CommandRegistry,
    private val dreamManager: DreamManager,
    private val posturingInteractor: PosturingInteractor,
    communalSettingsInteractor: CommunalSettingsInteractor,
    dreamSettingsInteractor: DreamSettingsInteractor,
    batteryInteractor: BatteryInteractor,
    @Background private val bgScope: CoroutineScope,
    @CommunalTableLog private val tableLogBuffer: TableLogBuffer,
@@ -62,7 +62,7 @@ constructor(
    private val postured =
        allOf(
                batteryInteractor.isDevicePluggedIn,
                communalSettingsInteractor.whenToDream.map { it == WhenToDream.WHILE_POSTURED },
                dreamSettingsInteractor.whenToDream.map { it == WhenToDream.WHILE_POSTURED },
            )
            .flatMapLatestConflated { shouldListen ->
                if (shouldListen) {
+2 −65
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@ import com.android.systemui.communal.data.model.FEATURE_ALL
import com.android.systemui.communal.data.model.SuppressionReason
import com.android.systemui.communal.data.repository.CommunalSettingsRepositoryModule.Companion.DEFAULT_BACKGROUND_TYPE
import com.android.systemui.communal.shared.model.CommunalBackgroundType
import com.android.systemui.communal.shared.model.WhenToDream
import com.android.systemui.communal.shared.model.WhenToStartHub
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
@@ -59,12 +58,6 @@ interface CommunalSettingsRepository {
     */
    fun setSuppressionReasons(reasons: List<SuppressionReason>)

    /**
     * Returns a [WhenToDream] for the specified user, indicating what state the device should be in
     * to trigger dreams.
     */
    fun getWhenToDreamState(user: UserInfo): Flow<WhenToDream>

    /**
     * Returns a[WhenToStartHub] for the specified user, indicating what state the device should be
     * in to automatically display the hub.
@@ -90,8 +83,8 @@ interface CommunalSettingsRepository {
     * Returns true if the Android config config_glanceableHubEnabled and the glanceable_hub_v2 flag
     * are enabled.
     *
     * This should be used to flag off new glanceable hub or dream behavior that should launch
     * together with the new hub experience that brings the hub to mobile.
     * This should be used to flag off new glanceable hub that should launch together with the new
     * hub experience that brings the hub to mobile.
     *
     * The trunk-stable flag is controlled by server rollout and is on all devices. The Android
     * config flag is enabled via resource overlay only on products we want the hub to be present
@@ -118,19 +111,6 @@ constructor(
    private val devicePolicyManager: DevicePolicyManager,
    @Named(DEFAULT_BACKGROUND_TYPE) private val defaultBackgroundType: CommunalBackgroundType,
) : CommunalSettingsRepository {

    private val dreamsActivatedOnSleepByDefault by lazy {
        resources.getBoolean(com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault)
    }

    private val dreamsActivatedOnDockByDefault by lazy {
        resources.getBoolean(com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault)
    }

    private val dreamsActivatedOnPosturedByDefault by lazy {
        resources.getBoolean(com.android.internal.R.bool.config_dreamsActivatedOnPosturedByDefault)
    }

    private val whenToStartHubByDefault by lazy {
        resources.getInteger(com.android.internal.R.integer.config_whenToStartHubModeDefault)
    }
@@ -163,49 +143,6 @@ constructor(
            glanceableHubV2()
    }

    override fun getWhenToDreamState(user: UserInfo): Flow<WhenToDream> =
        secureSettings
            .observerFlow(
                userId = user.id,
                names =
                    arrayOf(
                        Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP,
                        Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,
                        Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED,
                    ),
            )
            .emitOnStart()
            .map {
                if (
                    secureSettings.getBoolForUser(
                        Settings.Secure.SCREENSAVER_ACTIVATE_ON_SLEEP,
                        dreamsActivatedOnSleepByDefault,
                        user.id,
                    )
                ) {
                    WhenToDream.WHILE_CHARGING
                } else if (
                    secureSettings.getBoolForUser(
                        Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,
                        dreamsActivatedOnDockByDefault,
                        user.id,
                    )
                ) {
                    WhenToDream.WHILE_DOCKED
                } else if (
                    secureSettings.getBoolForUser(
                        Settings.Secure.SCREENSAVER_ACTIVATE_ON_POSTURED,
                        dreamsActivatedOnPosturedByDefault,
                        user.id,
                    )
                ) {
                    WhenToDream.WHILE_POSTURED
                } else {
                    WhenToDream.NEVER
                }
            }
            .flowOn(bgDispatcher)

    override fun getWhenToStartHubState(user: UserInfo): Flow<WhenToStartHub> {
        if (!getV2FlagEnabled()) {
            return MutableStateFlow(WhenToStartHub.NEVER)
+0 −7
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import com.android.systemui.communal.data.model.FEATURE_MANUAL_OPEN
import com.android.systemui.communal.data.model.SuppressionReason
import com.android.systemui.communal.data.repository.CommunalSettingsRepository
import com.android.systemui.communal.shared.model.CommunalBackgroundType
import com.android.systemui.communal.shared.model.WhenToDream
import com.android.systemui.communal.shared.model.WhenToStartHub
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
@@ -74,12 +73,6 @@ constructor(
            .isEnabled(FEATURE_AUTO_OPEN)
            .stateIn(scope = bgScope, started = SharingStarted.Eagerly, initialValue = false)

    /** When to dream for the currently selected user. */
    val whenToDream: Flow<WhenToDream> =
        userInteractor.selectedUserInfo.flatMapLatestConflated { user ->
            repository.getWhenToDreamState(user)
        }

    /** When to automatically start hub for the currently selected user. */
    val whenToStartHub: Flow<WhenToStartHub> =
        userInteractor.selectedUserInfo.flatMapLatest { user ->
Loading