diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverPreference.kt b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverPreference.kt index ed9b525b443..be3a3b891e1 100644 --- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverPreference.kt +++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverPreference.kt @@ -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(), KeyValueStore { + AbstractKeyedDataObservable(), KeyValueStore, BatterySaverListener { + private lateinit var batterySaverReceiver: BatterySaverReceiver + private lateinit var scope: CoroutineScope + override fun contains(key: String) = key == KEY override fun getValue(key: String, valueType: Class) = @@ -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 {