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

Commit 509c1d78 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[Catalyst] Use the AbstractKeyedDataObservable in BatterySaverStore" into main

parents c670db6e 13938078
Loading
Loading
Loading
Loading
+34 −33
Original line number Diff line number Diff line
@@ -21,27 +21,26 @@ import android.os.PowerManager
import com.android.settings.R
import com.android.settings.fuelgauge.BatterySaverReceiver
import com.android.settings.fuelgauge.BatterySaverReceiver.BatterySaverListener
import com.android.settingslib.datastore.AbstractKeyedDataObservable
import com.android.settingslib.datastore.DataChangeReason
import com.android.settingslib.datastore.KeyValueStore
import com.android.settingslib.datastore.NoOpKeyedObservable
import com.android.settingslib.datastore.Permissions
import com.android.settingslib.fuelgauge.BatterySaverLogging.SAVER_ENABLED_SETTINGS
import com.android.settingslib.fuelgauge.BatterySaverUtils
import com.android.settingslib.fuelgauge.BatteryStatus
import com.android.settingslib.fuelgauge.BatteryUtils
import com.android.settingslib.metadata.MainSwitchPreference
import com.android.settingslib.metadata.PreferenceLifecycleContext
import com.android.settingslib.metadata.PreferenceLifecycleProvider
import com.android.settingslib.metadata.ReadWritePermit
import com.android.settingslib.metadata.SensitivityLevel
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.cancel
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

// LINT.IfChange
class BatterySaverPreference :
    MainSwitchPreference(KEY, R.string.battery_saver_master_switch_title),
    PreferenceLifecycleProvider {

    private var batterySaverReceiver: BatterySaverReceiver? = null
    MainSwitchPreference(KEY, R.string.battery_saver_master_switch_title) {

    override fun storage(context: Context) = BatterySaverStore(context)

@@ -66,34 +65,12 @@ class BatterySaverPreference :
    override fun isEnabled(context: Context) =
        !BatteryStatus(BatteryUtils.getBatteryIntent(context)).isPluggedIn

    override fun onStart(context: PreferenceLifecycleContext) {
        BatterySaverReceiver(context).apply {
            batterySaverReceiver = this
            setBatterySaverListener(
                object : BatterySaverListener {
                    override fun onPowerSaveModeChanged() {
                        context.lifecycleScope.launch {
                            delay(SWITCH_ANIMATION_DURATION)
                            context.notifyPreferenceChange(KEY)
                        }
                    }

                    override fun onBatteryChanged(pluggedIn: Boolean) =
                        context.notifyPreferenceChange(KEY)
                }
            )
            setListening(true)
        }
    }

    override fun onStop(context: PreferenceLifecycleContext) {
        batterySaverReceiver?.setListening(false)
        batterySaverReceiver = null
    }

    @Suppress("UNCHECKED_CAST")
    class BatterySaverStore(private val context: Context) :
        NoOpKeyedObservable<String>(), KeyValueStore {
        AbstractKeyedDataObservable<String>(), KeyValueStore, BatterySaverListener {
        private lateinit var batterySaverReceiver: BatterySaverReceiver
        private lateinit var scope: CoroutineScope

        override fun contains(key: String) = key == KEY

        override fun <T : Any> getValue(key: String, valueType: Class<T>) =
@@ -110,6 +87,30 @@ class BatterySaverPreference :

        private fun Context.isPowerSaveMode() =
            getSystemService(PowerManager::class.java)?.isPowerSaveMode == true

        override fun onFirstObserverAdded() {
            scope = CoroutineScope(Dispatchers.Main)
            batterySaverReceiver =
                BatterySaverReceiver(context).apply {
                    setBatterySaverListener(this@BatterySaverStore)
                    setListening(true)
                }
        }

        override fun onLastObserverRemoved() {
            scope.cancel()
            batterySaverReceiver.setListening(false)
        }

        override fun onPowerSaveModeChanged() {
            scope.launch {
                delay(SWITCH_ANIMATION_DURATION)
                notifyChange(KEY, DataChangeReason.UPDATE)
            }
        }

        override fun onBatteryChanged(pluggedIn: Boolean) =
            notifyChange(KEY, DataChangeReason.UPDATE)
    }

    companion object {