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

Commit 013594a3 authored by Will Leshner's avatar Will Leshner
Browse files

Migrate screensaver settings to catalyst.

Bug: 337243670
Test: atest SettingsUnitTests
Flag: com.android.settings.flags.catalyst_screensaver
Change-Id: Id7d680b0adbf82fd7070d44572e91c5fbef2ef47
parent f9599ebd
Loading
Loading
Loading
Loading
+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"
}
+1 −1
Original line number Diff line number Diff line
@@ -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">

+4 −0
Original line number Diff line number Diff line
@@ -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
@@ -59,6 +60,9 @@ open class DisplayScreen :
            +AutoBrightnessScreen.KEY
            +LockScreenPreferenceScreen.KEY
            +DarkModeScreen.KEY
            if (Flags.catalystScreensaver()) {
                +ScreensaverScreen.KEY
            }
            +PeakRefreshRateSwitchPreference()
        }

+9 −1
Original line number Diff line number Diff line
@@ -29,6 +29,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;
@@ -46,6 +48,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 {

@@ -130,6 +133,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;
@@ -307,4 +315,4 @@ public class DreamSettings extends DashboardFragment implements OnCheckedChangeL
        }
    }
}
// LINT.ThenChange(ScreensaverScreen.kt)
+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