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

Commit a7935ddc authored by Alexander Hendrich's avatar Alexander Hendrich
Browse files

Refactor {Communal|LowLight|Dream}SettingsRepositories to use UserAwareSecureSettingsRepository

The {Communal|LowLight|Dream}SettingsRepositories all follow the pattern of receiving the active user as param for any method that reads from settings by having the respective interactor use userInteractor.selectedUserInfo.

We have UserAwareSecureSettingsRepository for exactly that purpose, so we can use it in these classes instead.

Fixes: 416696502

Test: atest DreamSettingsRepositoryImplTest
Test: atest LowLightBehaviorCoreStartableTest
Test: atest CommunalSettingsRepositoryImplTest
Flag: EXEMPT refactor
Change-Id: I2af28190bb5d00c4b5c67c3b6a2212f460cc0d18
parent bd8c6205
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -44,7 +44,7 @@ import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.nullable
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.settings.fakeSettings
import com.android.systemui.util.settings.data.repository.userAwareSecureSettingsRepository
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertWithMessage
import org.junit.After
@@ -212,19 +212,18 @@ class CommunalSettingsRepositoryImplTest(flags: FlagsParameterization?) : SysuiT
    @DisableFlags(FLAG_GLANCEABLE_HUB_BLURRED_BACKGROUND)
    fun backgroundType_defaultValue() =
        kosmos.runTest {
            val backgroundType by collectLastValue(underTest.getBackground(PRIMARY_USER))
            val backgroundType by collectLastValue(underTest.getBackground())
            assertThat(backgroundType).isEqualTo(CommunalBackgroundType.ANIMATED)
        }

    @Test
    fun backgroundType_verifyAllValues() =
        kosmos.runTest {
            val backgroundType by collectLastValue(underTest.getBackground(PRIMARY_USER))
            val backgroundType by collectLastValue(underTest.getBackground())
            for (type in CommunalBackgroundType.entries) {
                fakeSettings.putIntForUser(
                kosmos.userAwareSecureSettingsRepository.setInt(
                    GLANCEABLE_HUB_BACKGROUND_SETTING,
                    type.value,
                    PRIMARY_USER.id,
                )
                assertWithMessage(
                        "Expected $type when $GLANCEABLE_HUB_BACKGROUND_SETTING is set to" +
+23 −17
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ 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.android.systemui.util.settings.data.repository.userAwareSecureSettingsRepository
import com.google.common.truth.Truth.assertThat
import org.junit.After
import org.junit.Before
@@ -68,6 +68,9 @@ class DreamSettingsRepositoryImplTest : SysuiTestCase() {

    @After
    fun tearDown() {
        mContext.orCreateTestableResources.removeOverride(
            com.android.internal.R.bool.config_dreamsEnabledByDefault
        )
        mContext.orCreateTestableResources.removeOverride(
            com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault
        )
@@ -82,12 +85,11 @@ class DreamSettingsRepositoryImplTest : SysuiTestCase() {
    @Test
    fun whenToDream_charging() =
        kosmos.runTest {
            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState(PRIMARY_USER))
            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState())

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

            assertThat(whenToDreamState).isEqualTo(WhenToDream.WHILE_CHARGING)
@@ -101,19 +103,18 @@ class DreamSettingsRepositoryImplTest : SysuiTestCase() {
                true,
            )

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

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

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

            assertThat(whenToDreamState).isEqualTo(WhenToDream.WHILE_DOCKED)
@@ -127,19 +128,18 @@ class DreamSettingsRepositoryImplTest : SysuiTestCase() {
                true,
            )

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

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

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

            assertThat(whenToDreamState).isEqualTo(WhenToDream.WHILE_POSTURED)
@@ -153,7 +153,7 @@ class DreamSettingsRepositoryImplTest : SysuiTestCase() {
                true,
            )

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

@@ -165,13 +165,19 @@ class DreamSettingsRepositoryImplTest : SysuiTestCase() {
                true,
            )

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

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

            assertThat(whenToDreamState).isEqualTo(WhenToDream.NEVER)

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

            assertThat(whenToDreamState).isEqualTo(WhenToDream.WHILE_POSTURED)
        }
@@ -179,7 +185,7 @@ class DreamSettingsRepositoryImplTest : SysuiTestCase() {
    @Test
    fun whenToDream_default() =
        kosmos.runTest {
            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState(PRIMARY_USER))
            val whenToDreamState by collectLastValue(underTest.getWhenToDreamState())
            assertThat(whenToDreamState).isEqualTo(WhenToDream.NEVER)
        }

+10 −17
Original line number Diff line number Diff line
@@ -46,13 +46,13 @@ import com.android.systemui.lowlightclock.LowLightLogger
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
import com.android.systemui.power.domain.interactor.powerInteractor
import com.android.systemui.res.R
import com.android.systemui.settings.userTracker
import com.android.systemui.testKosmos
import com.android.systemui.user.data.repository.fakeUserRepository
import com.android.systemui.user.domain.interactor.selectedUserInteractor
import com.android.systemui.user.domain.interactor.userLockedInteractor
import com.android.systemui.util.settings.fakeSettings
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.runBlocking
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -135,14 +135,12 @@ class LowLightBehaviorCoreStartableTest : SysuiTestCase() {
            false,
        )

        kosmos.lowLightSettingsRepository.setLowLightDisplayBehaviorEnabled(
            kosmos.userTracker.userInfo,
            true,
        )
        runBlocking {
            kosmos.lowLightSettingsRepository.setLowLightDisplayBehaviorEnabled(true)
            kosmos.lowLightSettingsRepository.setLowLightDisplayBehavior(
            kosmos.userTracker.userInfo,
            LowLightDisplayBehavior.LOW_LIGHT_DREAM,
                LowLightDisplayBehavior.LOW_LIGHT_DREAM
            )
        }
        kosmos.lowLightRepository.addAction(LowLightDisplayBehavior.LOW_LIGHT_DREAM, action)
    }

@@ -183,10 +181,7 @@ class LowLightBehaviorCoreStartableTest : SysuiTestCase() {
    @Test
    fun testSetAmbientLowLightWhenDisabledInLowLight() =
        kosmos.runTest {
            lowLightSettingsRepository.setLowLightDisplayBehaviorEnabled(
                userTracker.userInfo,
                false,
            )
            lowLightSettingsRepository.setLowLightDisplayBehaviorEnabled(false)
            underTest.start()

            // Turn on screen
@@ -254,8 +249,7 @@ class LowLightBehaviorCoreStartableTest : SysuiTestCase() {
        kosmos.runTest {
            lowLightRepository.addAction(LowLightDisplayBehavior.SCREEN_OFF, action)
            lowLightSettingsRepository.setLowLightDisplayBehavior(
                userTracker.userInfo,
                LowLightDisplayBehavior.SCREEN_OFF,
                LowLightDisplayBehavior.SCREEN_OFF
            )

            setDisplayOn(true)
@@ -269,8 +263,7 @@ class LowLightBehaviorCoreStartableTest : SysuiTestCase() {
        kosmos.runTest {
            lowLightRepository.addAction(LowLightDisplayBehavior.SCREEN_OFF, action)
            lowLightSettingsRepository.setLowLightDisplayBehavior(
                userTracker.userInfo,
                LowLightDisplayBehavior.SCREEN_OFF,
                LowLightDisplayBehavior.SCREEN_OFF
            )

            setDisplayOn(true)
+42 −61
Original line number Diff line number Diff line
@@ -38,8 +38,7 @@ import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.flags.FeatureFlagsClassic
import com.android.systemui.flags.Flags
import com.android.systemui.util.kotlin.emitOnStart
import com.android.systemui.util.settings.SecureSettings
import com.android.systemui.util.settings.SettingsProxyExt.observerFlow
import com.android.systemui.util.settings.repository.UserAwareSecureSettingsRepository
import javax.inject.Inject
import javax.inject.Named
import kotlinx.coroutines.CoroutineDispatcher
@@ -59,13 +58,13 @@ interface CommunalSettingsRepository {
    fun setSuppressionReasons(reasons: List<SuppressionReason>)

    /**
     * Returns a[WhenToStartHub] for the specified user, indicating what state the device should be
     * in to automatically display the hub.
     * Returns a[WhenToStartHub] for the active user, indicating what state the device should be in
     * to automatically display the hub.
     */
    fun getWhenToStartHubState(user: UserInfo): Flow<WhenToStartHub>
    fun getWhenToStartHubState(): Flow<WhenToStartHub>

    /** Returns whether glanceable hub is enabled by the current user. */
    fun getSettingEnabledByUser(user: UserInfo): Flow<Boolean>
    /** Returns whether glanceable hub is enabled by the active user. */
    fun getSettingEnabledByUser(): Flow<Boolean>

    /**
     * Returns true if any glanceable hub functionality should be enabled via configs and flags.
@@ -95,8 +94,11 @@ interface CommunalSettingsRepository {
    /** Keyguard widgets enabled state by Device Policy Manager for the specified user. */
    fun getAllowedByDevicePolicy(user: UserInfo): Flow<Boolean>

    /** The type of background to use for the hub. Used to experiment with different backgrounds. */
    fun getBackground(user: UserInfo): Flow<CommunalBackgroundType>
    /**
     * The type of background to use for the hub for the active user. Used to experiment with
     * different backgrounds.
     */
    fun getBackground(): Flow<CommunalBackgroundType>
}

@SysUISingleton
@@ -106,7 +108,7 @@ constructor(
    @Background private val bgDispatcher: CoroutineDispatcher,
    @Main private val resources: Resources,
    private val featureFlagsClassic: FeatureFlagsClassic,
    private val secureSettings: SecureSettings,
    private val userAwareSecureSettingsRepository: UserAwareSecureSettingsRepository,
    private val broadcastDispatcher: BroadcastDispatcher,
    private val devicePolicyManager: DevicePolicyManager,
    @Named(DEFAULT_BACKGROUND_TYPE) private val defaultBackgroundType: CommunalBackgroundType,
@@ -143,33 +145,13 @@ constructor(
            glanceableHubV2()
    }

    override fun getWhenToStartHubState(user: UserInfo): Flow<WhenToStartHub> {
    override fun getWhenToStartHubState(): Flow<WhenToStartHub> {
        if (!getV2FlagEnabled()) {
            return MutableStateFlow(WhenToStartHub.NEVER)
        }
        return secureSettings
            .observerFlow(
                userId = user.id,
                names = arrayOf(Settings.Secure.WHEN_TO_START_GLANCEABLE_HUB),
            )
            .emitOnStart()
            .map {
                when (
                    secureSettings.getIntForUser(
                        Settings.Secure.WHEN_TO_START_GLANCEABLE_HUB,
                        whenToStartHubByDefault,
                        user.id,
                    )
                ) {
                    Settings.Secure.GLANCEABLE_HUB_START_NEVER -> WhenToStartHub.NEVER
                    Settings.Secure.GLANCEABLE_HUB_START_CHARGING -> WhenToStartHub.WHILE_CHARGING
                    Settings.Secure.GLANCEABLE_HUB_START_CHARGING_UPRIGHT ->
                        WhenToStartHub.WHILE_CHARGING_AND_POSTURED

                    Settings.Secure.GLANCEABLE_HUB_START_DOCKED -> WhenToStartHub.WHILE_DOCKED
                    else -> WhenToStartHub.NEVER
                }
            }
        return userAwareSecureSettingsRepository
            .intSetting(Settings.Secure.WHEN_TO_START_GLANCEABLE_HUB, whenToStartHubByDefault)
            .map { it.toWhenToStartHub() }
            .flowOn(bgDispatcher)
    }

@@ -186,34 +168,33 @@ constructor(
            .emitOnStart()
            .map { devicePolicyManager.areKeyguardWidgetsAllowed(user.id) }

    override fun getBackground(user: UserInfo): Flow<CommunalBackgroundType> =
        secureSettings
            .observerFlow(userId = user.id, names = arrayOf(GLANCEABLE_HUB_BACKGROUND_SETTING))
            .emitOnStart()
            .map {
                val intType =
                    secureSettings.getIntForUser(
                        GLANCEABLE_HUB_BACKGROUND_SETTING,
                        defaultBackgroundType.value,
                        user.id,
                    )
                CommunalBackgroundType.entries.find { type -> type.value == intType }
    override fun getBackground(): Flow<CommunalBackgroundType> =
        userAwareSecureSettingsRepository
            .intSetting(GLANCEABLE_HUB_BACKGROUND_SETTING, defaultBackgroundType.value)
            .map { it.toCommunalBackgroundType() }
            .flowOn(bgDispatcher)

    override fun getSettingEnabledByUser(): Flow<Boolean> =
        userAwareSecureSettingsRepository
            .intSetting(Settings.Secure.GLANCEABLE_HUB_ENABLED, ENABLED_SETTING_DEFAULT)
            .map { it == 1 }
            .flowOn(bgDispatcher)

    private fun Int.toCommunalBackgroundType(): CommunalBackgroundType {
        return CommunalBackgroundType.entries.find { type -> type.value == this }
            ?: defaultBackgroundType
    }

    override fun getSettingEnabledByUser(user: UserInfo): Flow<Boolean> =
        secureSettings
            .observerFlow(userId = user.id, names = arrayOf(Settings.Secure.GLANCEABLE_HUB_ENABLED))
            // Force an update
            .emitOnStart()
            .map {
                secureSettings.getIntForUser(
                    Settings.Secure.GLANCEABLE_HUB_ENABLED,
                    ENABLED_SETTING_DEFAULT,
                    user.id,
                ) == 1
    private fun Int.toWhenToStartHub(): WhenToStartHub {
        return when (this) {
            Settings.Secure.GLANCEABLE_HUB_START_NEVER -> WhenToStartHub.NEVER
            Settings.Secure.GLANCEABLE_HUB_START_CHARGING -> WhenToStartHub.WHILE_CHARGING
            Settings.Secure.GLANCEABLE_HUB_START_CHARGING_UPRIGHT ->
                WhenToStartHub.WHILE_CHARGING_AND_POSTURED
            Settings.Secure.GLANCEABLE_HUB_START_DOCKED -> WhenToStartHub.WHILE_DOCKED
            else -> WhenToStartHub.NEVER
        }
    }
            .flowOn(bgDispatcher)

    companion object {
        const val GLANCEABLE_HUB_BACKGROUND_SETTING = "glanceable_hub_background"
+3 −11
Original line number Diff line number Diff line
@@ -76,10 +76,7 @@ constructor(
            .stateIn(scope = bgScope, started = SharingStarted.Eagerly, initialValue = false)

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

    /** Whether communal hub is allowed by device policy for the current user */
    val allowedForCurrentUserByDevicePolicy: Flow<Boolean> =
@@ -88,10 +85,7 @@ constructor(
        }

    /** Whether the hub is enabled for the current user */
    val settingEnabledForCurrentUser: Flow<Boolean> =
        userInteractor.selectedUserInfo.flatMapLatestConflated { user ->
            repository.getSettingEnabledByUser(user)
        }
    val settingEnabledForCurrentUser: Flow<Boolean> = repository.getSettingEnabledByUser()

    /**
     * Returns true if any glanceable hub functionality should be enabled via configs and flags.
@@ -132,9 +126,7 @@ constructor(

    /** The type of background to use for the hub. Used to experiment with different backgrounds */
    val communalBackground: Flow<CommunalBackgroundType> =
        userInteractor.selectedUserInfo
            .flatMapLatest { user -> repository.getBackground(user) }
            .flowOn(bgDispatcher)
        repository.getBackground().flowOn(bgDispatcher)

    private val workProfileUserInfoCallbackFlow: Flow<UserInfo?> = conflatedCallbackFlow {
        fun send(profiles: List<UserInfo>) {
Loading