Loading aconfig/catalyst/screensaver.aconfig 0 → 100644 +9 −0 Original line number Diff line number Diff line package: "com.android.settings.flags" container: "system_ext" flag { name: "catalyst_screensaver" namespace: "systemui" description: "Flag for Screensaver" bug: "337243670" } res/xml/dream_fragment_overview.xml +1 −1 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:key="screensaver_settings_screen" android:key="screensaver" android:title="@string/screensaver_settings_title" settings:keywords="@string/keywords_screensaver"> Loading src/com/android/settings/display/DisplayScreen.kt +4 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import com.android.settings.DisplaySettings import com.android.settings.R import com.android.settings.Settings.DisplaySettingsActivity import com.android.settings.display.darkmode.DarkModeScreen import com.android.settings.dream.ScreensaverScreen import com.android.settings.flags.Flags import com.android.settings.security.LockScreenPreferenceScreen import com.android.settings.utils.makeLaunchIntent Loading Loading @@ -63,6 +64,9 @@ open class DisplayScreen : +AmbientDisplayAlwaysOnPreferenceScreen.KEY } +DarkModeScreen.KEY if (Flags.catalystScreensaver()) { +ScreensaverScreen.KEY } +PeakRefreshRateSwitchPreference() } Loading src/com/android/settings/dream/DreamSettings.java +9 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,8 @@ import android.widget.Button; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.recyclerview.widget.RecyclerView; Loading @@ -48,6 +50,7 @@ import com.android.settingslib.widget.MainSwitchPreference; import java.util.ArrayList; import java.util.List; // LINT.IfChange @SearchIndexable public class DreamSettings extends DashboardFragment implements OnCheckedChangeListener { Loading Loading @@ -133,6 +136,11 @@ public class DreamSettings extends DashboardFragment implements OnCheckedChangeL return R.xml.dream_fragment_overview; } @Override public @Nullable String getPreferenceScreenBindingKey(@NonNull Context context) { return ScreensaverScreen.KEY; } @Override public int getHelpResource() { return R.string.help_url_screen_saver; Loading Loading @@ -322,4 +330,4 @@ public class DreamSettings extends DashboardFragment implements OnCheckedChangeL } } } // LINT.ThenChange(ScreensaverScreen.kt) src/com/android/settings/dream/ScreensaverScreen.kt 0 → 100644 +126 −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.settings.dream import android.content.Context import androidx.annotation.VisibleForTesting 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.dream.DreamBackend import com.android.settingslib.metadata.PreferenceAvailabilityProvider import com.android.settingslib.metadata.PreferenceSummaryProvider import com.android.settingslib.metadata.ProvidePreferenceScreen import com.android.settingslib.metadata.preferenceHierarchy import com.android.settingslib.preference.PreferenceScreenCreator // LINT.IfChange @ProvidePreferenceScreen(ScreensaverScreen.KEY) class ScreensaverScreen(fooContext: Context) : PreferenceScreenCreator, PreferenceAvailabilityProvider, PreferenceSummaryProvider { private var dreamBackend: DreamBackend = DreamBackend.getInstance(fooContext) private var ambientModeSuppressionProvider: AmbientModeSuppressionProvider = object : AmbientModeSuppressionProvider { override fun isSuppressedByBedtime(context: Context) = AmbientDisplayAlwaysOnPreferenceController.isAodSuppressedByBedtime(context) } 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, dreamBackend.activeDreamName ) override fun dreamOffBedtime(context: Context) = context.resources.getString(R.string.screensaver_settings_when_to_dream_bedtime) } override val key: String get() = KEY override val title: Int get() = R.string.screensaver_settings_title override fun isFlagEnabled(context: Context) = Flags.catalystScreensaver() override fun hasCompleteHierarchy() = false override fun fragmentClass() = DreamSettings::class.java override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(context, this) {} override fun getSummary(context: Context): CharSequence { val dreamsDisabledByAmbientModeSuppression = context.resources.getBoolean( com.android.internal.R.bool.config_dreamsDisabledByAmbientModeSuppressionConfig) return if (dreamsDisabledByAmbientModeSuppression && ambientModeSuppressionProvider.isSuppressedByBedtime(context)) { summaryStringsProvider.dreamOffBedtime(context) } else { getSummaryTextWithDreamName(context) } } override val keywords: Int get() = R.string.keywords_screensaver override fun isAvailable(context: Context) = Utils.areDreamsAvailableToCurrentUser(context) @VisibleForTesting fun setDreamBackend(backend: DreamBackend) { this.dreamBackend = backend } @VisibleForTesting fun setAmbientModeSuppressionProvider(provider: AmbientModeSuppressionProvider) { ambientModeSuppressionProvider = provider } @VisibleForTesting fun setSummaryStringsProvider(provider: SummaryStringsProvider) { summaryStringsProvider = provider } private fun getSummaryTextWithDreamName(context: Context): CharSequence { return if (dreamBackend.isEnabled) { summaryStringsProvider.dreamOn(context, dreamBackend.activeDreamName) } else { summaryStringsProvider.dreamOff(context) } } interface AmbientModeSuppressionProvider { fun isSuppressedByBedtime(context: Context) : Boolean } interface SummaryStringsProvider { fun dreamOff(context: Context) : CharSequence fun dreamOn(context: Context, activeDreamName: CharSequence) : CharSequence fun dreamOffBedtime(context: Context) : CharSequence } companion object { const val KEY = "screensaver" } } // LINT.ThenChange(DreamSettings.java) Loading
aconfig/catalyst/screensaver.aconfig 0 → 100644 +9 −0 Original line number Diff line number Diff line package: "com.android.settings.flags" container: "system_ext" flag { name: "catalyst_screensaver" namespace: "systemui" description: "Flag for Screensaver" bug: "337243670" }
res/xml/dream_fragment_overview.xml +1 −1 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:key="screensaver_settings_screen" android:key="screensaver" android:title="@string/screensaver_settings_title" settings:keywords="@string/keywords_screensaver"> Loading
src/com/android/settings/display/DisplayScreen.kt +4 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import com.android.settings.DisplaySettings import com.android.settings.R import com.android.settings.Settings.DisplaySettingsActivity import com.android.settings.display.darkmode.DarkModeScreen import com.android.settings.dream.ScreensaverScreen import com.android.settings.flags.Flags import com.android.settings.security.LockScreenPreferenceScreen import com.android.settings.utils.makeLaunchIntent Loading Loading @@ -63,6 +64,9 @@ open class DisplayScreen : +AmbientDisplayAlwaysOnPreferenceScreen.KEY } +DarkModeScreen.KEY if (Flags.catalystScreensaver()) { +ScreensaverScreen.KEY } +PeakRefreshRateSwitchPreference() } Loading
src/com/android/settings/dream/DreamSettings.java +9 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,8 @@ import android.widget.Button; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.recyclerview.widget.RecyclerView; Loading @@ -48,6 +50,7 @@ import com.android.settingslib.widget.MainSwitchPreference; import java.util.ArrayList; import java.util.List; // LINT.IfChange @SearchIndexable public class DreamSettings extends DashboardFragment implements OnCheckedChangeListener { Loading Loading @@ -133,6 +136,11 @@ public class DreamSettings extends DashboardFragment implements OnCheckedChangeL return R.xml.dream_fragment_overview; } @Override public @Nullable String getPreferenceScreenBindingKey(@NonNull Context context) { return ScreensaverScreen.KEY; } @Override public int getHelpResource() { return R.string.help_url_screen_saver; Loading Loading @@ -322,4 +330,4 @@ public class DreamSettings extends DashboardFragment implements OnCheckedChangeL } } } // LINT.ThenChange(ScreensaverScreen.kt)
src/com/android/settings/dream/ScreensaverScreen.kt 0 → 100644 +126 −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.settings.dream import android.content.Context import androidx.annotation.VisibleForTesting 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.dream.DreamBackend import com.android.settingslib.metadata.PreferenceAvailabilityProvider import com.android.settingslib.metadata.PreferenceSummaryProvider import com.android.settingslib.metadata.ProvidePreferenceScreen import com.android.settingslib.metadata.preferenceHierarchy import com.android.settingslib.preference.PreferenceScreenCreator // LINT.IfChange @ProvidePreferenceScreen(ScreensaverScreen.KEY) class ScreensaverScreen(fooContext: Context) : PreferenceScreenCreator, PreferenceAvailabilityProvider, PreferenceSummaryProvider { private var dreamBackend: DreamBackend = DreamBackend.getInstance(fooContext) private var ambientModeSuppressionProvider: AmbientModeSuppressionProvider = object : AmbientModeSuppressionProvider { override fun isSuppressedByBedtime(context: Context) = AmbientDisplayAlwaysOnPreferenceController.isAodSuppressedByBedtime(context) } 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, dreamBackend.activeDreamName ) override fun dreamOffBedtime(context: Context) = context.resources.getString(R.string.screensaver_settings_when_to_dream_bedtime) } override val key: String get() = KEY override val title: Int get() = R.string.screensaver_settings_title override fun isFlagEnabled(context: Context) = Flags.catalystScreensaver() override fun hasCompleteHierarchy() = false override fun fragmentClass() = DreamSettings::class.java override fun getPreferenceHierarchy(context: Context) = preferenceHierarchy(context, this) {} override fun getSummary(context: Context): CharSequence { val dreamsDisabledByAmbientModeSuppression = context.resources.getBoolean( com.android.internal.R.bool.config_dreamsDisabledByAmbientModeSuppressionConfig) return if (dreamsDisabledByAmbientModeSuppression && ambientModeSuppressionProvider.isSuppressedByBedtime(context)) { summaryStringsProvider.dreamOffBedtime(context) } else { getSummaryTextWithDreamName(context) } } override val keywords: Int get() = R.string.keywords_screensaver override fun isAvailable(context: Context) = Utils.areDreamsAvailableToCurrentUser(context) @VisibleForTesting fun setDreamBackend(backend: DreamBackend) { this.dreamBackend = backend } @VisibleForTesting fun setAmbientModeSuppressionProvider(provider: AmbientModeSuppressionProvider) { ambientModeSuppressionProvider = provider } @VisibleForTesting fun setSummaryStringsProvider(provider: SummaryStringsProvider) { summaryStringsProvider = provider } private fun getSummaryTextWithDreamName(context: Context): CharSequence { return if (dreamBackend.isEnabled) { summaryStringsProvider.dreamOn(context, dreamBackend.activeDreamName) } else { summaryStringsProvider.dreamOff(context) } } interface AmbientModeSuppressionProvider { fun isSuppressedByBedtime(context: Context) : Boolean } interface SummaryStringsProvider { fun dreamOff(context: Context) : CharSequence fun dreamOn(context: Context, activeDreamName: CharSequence) : CharSequence fun dreamOffBedtime(context: Context) : CharSequence } companion object { const val KEY = "screensaver" } } // LINT.ThenChange(DreamSettings.java)