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

Commit 9e0b99b6 authored by Coco Duan's avatar Coco Duan Committed by Android (Google) Code Review
Browse files

Merge "Register observers to update the summary on ScreenSaverScreen" into main

parents 2d9adf7a 4ae51d6e
Loading
Loading
Loading
Loading
+65 −23
Original line number Diff line number Diff line
@@ -17,13 +17,22 @@
package com.android.settings.dream

import android.content.Context
import android.provider.Settings.Secure.SCREENSAVER_COMPONENTS
import android.provider.Settings.Secure.SCREENSAVER_ENABLED
import androidx.annotation.VisibleForTesting
import com.android.internal.R.bool.config_dreamsDisabledByAmbientModeSuppressionConfig
import com.android.settings.R
import com.android.settings.Utils
import com.android.settings.display.AmbientDisplayAlwaysOnPreferenceController
import com.android.settings.flags.Flags
import com.android.settings.R
import com.android.settingslib.datastore.AbstractKeyedDataObservable
import com.android.settingslib.datastore.HandlerExecutor
import com.android.settingslib.datastore.KeyValueStore
import com.android.settingslib.datastore.KeyedObserver
import com.android.settingslib.datastore.SettingsSecureStore
import com.android.settingslib.dream.DreamBackend
import com.android.settingslib.metadata.PreferenceAvailabilityProvider
import com.android.settingslib.metadata.PreferenceChangeReason
import com.android.settingslib.metadata.PreferenceSummaryProvider
import com.android.settingslib.metadata.ProvidePreferenceScreen
import com.android.settingslib.metadata.preferenceHierarchy
@@ -31,10 +40,17 @@ import com.android.settingslib.preference.PreferenceScreenCreator

// LINT.IfChange
@ProvidePreferenceScreen(ScreensaverScreen.KEY)
class ScreensaverScreen(fooContext: Context) :
    PreferenceScreenCreator, PreferenceAvailabilityProvider, PreferenceSummaryProvider {
class ScreensaverScreen(private val context: Context) :
    PreferenceScreenCreator,
    AbstractKeyedDataObservable<String>(),
    PreferenceAvailabilityProvider,
    PreferenceSummaryProvider {

    private var dreamBackend: DreamBackend = DreamBackend.getInstance(fooContext)
    private var dreamBackend: DreamBackend = DreamBackend.getInstance(context)
    private var settingsStore: KeyValueStore = SettingsSecureStore.get(context)

    private val observer =
        KeyedObserver<String> { _, _ -> notifyChange(KEY, PreferenceChangeReason.STATE) }

    private var ambientModeSuppressionProvider: AmbientModeSuppressionProvider =
        object : AmbientModeSuppressionProvider {
@@ -42,20 +58,24 @@ class ScreensaverScreen(fooContext: Context) :
                AmbientDisplayAlwaysOnPreferenceController.isAodSuppressedByBedtime(context)
        }

    private var summaryStringsProvider: SummaryStringsProvider = object: SummaryStringsProvider {
    private var summaryStringsProvider: SummaryStringsProvider =
        object : SummaryStringsProvider {
            override fun dreamOff(context: Context) =
                context.resources.getString(R.string.screensaver_settings_summary_off)

            override fun dreamOn(context: Context, activeDreamName: CharSequence) =
                context.resources.getString(
                    R.string.screensaver_settings_summary_on,
                activeDreamName
                    activeDreamName,
                )

            override fun dreamOffBedtime(context: Context) =
                context.resources.getString(R.string.screensaver_settings_when_to_dream_bedtime)
        }

    private val screenSaverSettingKeys
        get() = listOf(SCREENSAVER_ENABLED, SCREENSAVER_COMPONENTS)

    override val key: String
        get() = KEY

@@ -70,11 +90,26 @@ class ScreensaverScreen(fooContext: Context) :

    override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(context, this) {}

    override fun onFirstObserverAdded() {
        // update summary when any of the screen saver settings has changed
        for (key in screenSaverSettingKeys) {
            settingsStore.addObserver(key, observer, HandlerExecutor.main)
        }
    }

    override fun onLastObserverRemoved() {
        for (key in screenSaverSettingKeys) {
            settingsStore.removeObserver(key, observer)
        }
    }

    override fun getSummary(context: Context): CharSequence {
        val dreamsDisabledByAmbientModeSuppression = context.resources.getBoolean(
            com.android.internal.R.bool.config_dreamsDisabledByAmbientModeSuppressionConfig)
        return if (dreamsDisabledByAmbientModeSuppression
            && ambientModeSuppressionProvider.isSuppressedByBedtime(context)) {
        val dreamsDisabledByAmbientModeSuppression =
            context.resources.getBoolean(config_dreamsDisabledByAmbientModeSuppressionConfig)
        return if (
            dreamsDisabledByAmbientModeSuppression &&
                ambientModeSuppressionProvider.isSuppressedByBedtime(context)
        ) {
            summaryStringsProvider.dreamOffBedtime(context)
        } else {
            getSummaryTextWithDreamName(context)
@@ -91,6 +126,11 @@ class ScreensaverScreen(fooContext: Context) :
        this.dreamBackend = backend
    }

    @VisibleForTesting
    fun setScreensaverStore(settingsStore: KeyValueStore) {
        this.settingsStore = settingsStore
    }

    @VisibleForTesting
    fun setAmbientModeSuppressionProvider(provider: AmbientModeSuppressionProvider) {
        ambientModeSuppressionProvider = provider
@@ -118,7 +158,9 @@ class ScreensaverScreen(fooContext: Context) :

    interface SummaryStringsProvider {
        fun dreamOff(context: Context): CharSequence

        fun dreamOn(context: Context, activeDreamName: CharSequence): CharSequence

        fun dreamOffBedtime(context: Context): CharSequence
    }

+79 −35
Original line number Diff line number Diff line
@@ -19,29 +19,39 @@ package com.android.settings.screensaver
import android.content.Context
import android.content.ContextWrapper
import android.content.res.Resources
import android.provider.Settings.Secure.SCREENSAVER_COMPONENTS
import android.provider.Settings.Secure.SCREENSAVER_ENABLED
import com.android.internal.R.bool.config_dreamsDisabledByAmbientModeSuppressionConfig
import com.android.settings.dream.ScreensaverScreen
import com.android.settings.flags.Flags
import com.android.settingslib.datastore.KeyValueStore
import com.android.settingslib.dream.DreamBackend
import com.android.settingslib.preference.CatalystScreenTestCase
import com.android.settings.R
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.mockito.Mockito.mock
import org.mockito.kotlin.doAnswer
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.mockito.kotlin.stub

class ScreensaverScreenTest : CatalystScreenTestCase() {
    private val mockResources = mock<Resources>()
    private val context = object : ContextWrapper(appContext) {
    private val settingsStore = mock<KeyValueStore>()
    private val context =
        object : ContextWrapper(appContext) {
            override fun getResources(): Resources = mockResources
        }

    private val dreamBackend: DreamBackend = mock(DreamBackend::class.java)
    private var dreamEnabled = false
    private var activeDreamName = DREAM_NAME

    override val preferenceScreenCreator = ScreensaverScreen(context).also {
    override val preferenceScreenCreator =
        ScreensaverScreen(context).also {
            it.setDreamBackend(dreamBackend)
            it.setScreensaverStore(settingsStore)
        }

    override val flagName: String
@@ -52,20 +62,23 @@ class ScreensaverScreenTest: CatalystScreenTestCase() {
        preferenceScreenCreator.setAmbientModeSuppressionProvider(
            object : ScreensaverScreen.AmbientModeSuppressionProvider {
                override fun isSuppressedByBedtime(context: Context) = false
            })
            }
        )

        preferenceScreenCreator.setSummaryStringsProvider(
            object : ScreensaverScreen.SummaryStringsProvider {
                override fun dreamOff(context: Context) = SCREENSAVER_SUMMARY_OFF

                override fun dreamOn(
                    context: Context,
                    activeDreamName: CharSequence
                ) = SCREENSAVER_SUMMARY_ON
                override fun dreamOn(context: Context, activeDreamName: CharSequence) =
                    getSummaryOnWithDreamName(activeDreamName)

                override fun dreamOffBedtime(context: Context) = SCREENSAVER_SUMMARY_OFF_BEDTIME
            }
        )
        settingsStore.stub {
            on { getString(SCREENSAVER_COMPONENTS) } doAnswer { activeDreamName }
            on { getBoolean(SCREENSAVER_ENABLED) } doAnswer { dreamEnabled }
        }
    }

    @Test
@@ -76,16 +89,10 @@ class ScreensaverScreenTest: CatalystScreenTestCase() {
    @Test
    fun getSummary_dreamsNotDisabledByAmbientModeSuppression_dreamsDisabled() {
        mockResources.stub {
            on {
                getBoolean(
                    com.android.internal.R.bool.config_dreamsDisabledByAmbientModeSuppressionConfig
                )
            } doReturn false
            on { getBoolean(config_dreamsDisabledByAmbientModeSuppressionConfig) } doReturn false
        }

        dreamBackend.stub {
            on { isEnabled } doReturn false
        }
        dreamBackend.stub { on { isEnabled } doReturn false }

        assertThat(preferenceScreenCreator.getSummary(context)).isEqualTo(SCREENSAVER_SUMMARY_OFF)
    }
@@ -93,46 +100,83 @@ class ScreensaverScreenTest: CatalystScreenTestCase() {
    @Test
    fun getSummary_dreamsNotDisabledByAmbientModeSuppression_dreamsEnabled() {
        mockResources.stub {
            on {
                getBoolean(
                    com.android.internal.R.bool.config_dreamsDisabledByAmbientModeSuppressionConfig
                )
            } doReturn false
            on { getBoolean(config_dreamsDisabledByAmbientModeSuppressionConfig) } doReturn false
        }

        dreamBackend.stub {
            on { isEnabled } doReturn true
            on { activeDreamName } doReturn ACTIVE_DREAM_NAME
            on { activeDreamName } doReturn DREAM_NAME
        }

        assertThat(preferenceScreenCreator.getSummary(context)).isEqualTo(SCREENSAVER_SUMMARY_ON)
        assertThat(preferenceScreenCreator.getSummary(context))
            .isEqualTo(getSummaryOnWithDreamName(DREAM_NAME))
    }

    @Test
    fun getSummary_dreamsDisabledByAmbientModeSuppression() {
        mockResources.stub {
            on {
                getBoolean(
                    com.android.internal.R.bool.config_dreamsDisabledByAmbientModeSuppressionConfig
                )
            } doReturn true
            on { getBoolean(config_dreamsDisabledByAmbientModeSuppressionConfig) } doReturn true
        }

        preferenceScreenCreator.setAmbientModeSuppressionProvider(
            object : ScreensaverScreen.AmbientModeSuppressionProvider {
                override fun isSuppressedByBedtime(context: Context) = true
            })
            }
        )

        assertThat(preferenceScreenCreator.getSummary(context))
            .isEqualTo(SCREENSAVER_SUMMARY_OFF_BEDTIME)
    }

    @Test
    fun getSummary_onScreenSaverEnabledChanged() {
        mockResources.stub {
            on { getBoolean(config_dreamsDisabledByAmbientModeSuppressionConfig) } doReturn false
        }

        dreamBackend.stub {
            on { isEnabled } doAnswer { settingsStore.getBoolean(SCREENSAVER_ENABLED) }
            on { activeDreamName } doReturn DREAM_NAME
        }

        dreamEnabled = true
        assertThat(preferenceScreenCreator.getSummary(context))
            .isEqualTo(getSummaryOnWithDreamName(DREAM_NAME))

        dreamEnabled = false
        assertThat(preferenceScreenCreator.getSummary(context)).isEqualTo(SCREENSAVER_SUMMARY_OFF)
    }

    @Test
    fun getSummary_onActiveDreamChanged() {
        mockResources.stub {
            on { getBoolean(config_dreamsDisabledByAmbientModeSuppressionConfig) } doReturn false
        }

        dreamBackend.stub {
            on { isEnabled } doReturn true
            on { activeDreamName } doAnswer { settingsStore.getString(SCREENSAVER_COMPONENTS) }
        }

        activeDreamName = DREAM_NAME
        assertThat(preferenceScreenCreator.getSummary(context))
            .isEqualTo(getSummaryOnWithDreamName(DREAM_NAME))

        activeDreamName = DREAM_NAME_2
        assertThat(preferenceScreenCreator.getSummary(context))
            .isEqualTo(getSummaryOnWithDreamName(DREAM_NAME_2))
    }

    private fun getSummaryOnWithDreamName(dreamName: CharSequence) =
        SCREENSAVER_SUMMARY_ON + dreamName

    override fun migration() {}

    private companion object {
        const val SCREENSAVER_SUMMARY_OFF = "screensaver_summary_dream_off"
        const val SCREENSAVER_SUMMARY_ON = "screensaver_summary_on"
        const val SCREENSAVER_SUMMARY_OFF_BEDTIME = "screensaver_summary_off_bedtime"
        const val ACTIVE_DREAM_NAME = "dream"
        const val DREAM_NAME = "dream"
        const val DREAM_NAME_2 = "second dream"
    }
}