package ani.dantotsu.settings.saving import android.content.SharedPreferences import androidx.lifecycle.LiveData abstract class SharedPreferenceLiveData( val sharedPrefs: SharedPreferences, val key: String, val defValue: T ) : LiveData() { private val preferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener { _, key -> if (key == this.key) { value = getValueFromPreferences(key, defValue) } } abstract fun getValueFromPreferences(key: String, defValue: T): T override fun onActive() { super.onActive() value = getValueFromPreferences(key, defValue) sharedPrefs.registerOnSharedPreferenceChangeListener(preferenceChangeListener) } override fun onInactive() { sharedPrefs.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener) super.onInactive() } } class SharedPreferenceIntLiveData(sharedPrefs: SharedPreferences, key: String, defValue: Int) : SharedPreferenceLiveData(sharedPrefs, key, defValue) { override fun getValueFromPreferences(key: String, defValue: Int): Int = sharedPrefs.getInt(key, defValue) } class SharedPreferenceStringLiveData( sharedPrefs: SharedPreferences, key: String, defValue: String ) : SharedPreferenceLiveData(sharedPrefs, key, defValue) { override fun getValueFromPreferences(key: String, defValue: String): String = sharedPrefs.getString(key, defValue).toString() } class SharedPreferenceBooleanLiveData( sharedPrefs: SharedPreferences, key: String, defValue: Boolean ) : SharedPreferenceLiveData(sharedPrefs, key, defValue) { override fun getValueFromPreferences(key: String, defValue: Boolean): Boolean = sharedPrefs.getBoolean(key, defValue) } class SharedPreferenceFloatLiveData(sharedPrefs: SharedPreferences, key: String, defValue: Float) : SharedPreferenceLiveData(sharedPrefs, key, defValue) { override fun getValueFromPreferences(key: String, defValue: Float): Float = sharedPrefs.getFloat(key, defValue) } class SharedPreferenceLongLiveData(sharedPrefs: SharedPreferences, key: String, defValue: Long) : SharedPreferenceLiveData(sharedPrefs, key, defValue) { override fun getValueFromPreferences(key: String, defValue: Long): Long = sharedPrefs.getLong(key, defValue) } class SharedPreferenceStringSetLiveData( sharedPrefs: SharedPreferences, key: String, defValue: Set ) : SharedPreferenceLiveData>(sharedPrefs, key, defValue) { override fun getValueFromPreferences(key: String, defValue: Set): Set = sharedPrefs.getStringSet(key, defValue)?.toSet() ?: defValue } @Suppress("unused") fun SharedPreferences.intLiveData(key: String, defValue: Int): SharedPreferenceLiveData { return SharedPreferenceIntLiveData(this, key, defValue) } @Suppress("unused") fun SharedPreferences.stringLiveData( key: String, defValue: String ): SharedPreferenceLiveData { return SharedPreferenceStringLiveData(this, key, defValue) } @Suppress("unused") fun SharedPreferences.booleanLiveData( key: String, defValue: Boolean ): SharedPreferenceLiveData { return SharedPreferenceBooleanLiveData(this, key, defValue) } @Suppress("unused") fun SharedPreferences.floatLiveData(key: String, defValue: Float): SharedPreferenceLiveData { return SharedPreferenceFloatLiveData(this, key, defValue) } @Suppress("unused") fun SharedPreferences.longLiveData(key: String, defValue: Long): SharedPreferenceLiveData { return SharedPreferenceLongLiveData(this, key, defValue) } @Suppress("unused") fun SharedPreferences.stringSetLiveData( key: String, defValue: Set ): SharedPreferenceLiveData> { return SharedPreferenceStringSetLiveData(this, key, defValue) }