Loading src/com/android/settings/dream/ScreensaverScreen.kt +65 −23 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 { Loading @@ -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 Loading @@ -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) Loading @@ -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 Loading Loading @@ -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 } Loading tests/unit/src/com/android/settings/screensaver/ScreensaverScreenTest.kt +79 −35 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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) } Loading @@ -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" } } Loading
src/com/android/settings/dream/ScreensaverScreen.kt +65 −23 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 { Loading @@ -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 Loading @@ -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) Loading @@ -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 Loading Loading @@ -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 } Loading
tests/unit/src/com/android/settings/screensaver/ScreensaverScreenTest.kt +79 −35 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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) } Loading @@ -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" } }