[Catalyst] Use the AbstractKeyedDataObservable in BatterySaverStore

NO_IFTTT=Catalyst migration

Test: atest BatterySaverScreenTest
Bug: 335132588
Flag: com.android.settings.flags.catalyst_battery_saver_screen
Change-Id: I93dbffb0fdda002ed94dddb7cf94f1beeeb3e478
This commit is contained in:
Sunny Shao
2024-12-31 15:54:18 +08:00
parent 12df61328a
commit 13938078db

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 {