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

This commit is contained in:
Treehugger Robot
2025-01-03 01:04:08 -08:00
committed by Android (Google) Code Review

View File

@@ -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 {