|
import android.arch.lifecycle.LiveData |
|
import android.content.SharedPreferences |
|
|
|
abstract class SharedPreferenceLiveData<T>(val sharedPrefs: SharedPreferences, |
|
val key: String, |
|
val defValue: T) : LiveData<T>() { |
|
|
|
private val preferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, 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<Int>(sharedPrefs, key, defValue) { |
|
override fun getValueFromPreferences(key: String, defValue: Int): Int = sharedPrefs.getInt(key, defValue) |
|
} |
|
|
|
class SharedPreferenceStringLiveData(sharedPrefs: SharedPreferences, key: String, defValue: String) : |
|
SharedPreferenceLiveData<String>(sharedPrefs, key, defValue) { |
|
override fun getValueFromPreferences(key: String, defValue: String): String = sharedPrefs.getString(key, defValue) |
|
} |
|
|
|
class SharedPreferenceBooleanLiveData(sharedPrefs: SharedPreferences, key: String, defValue: Boolean) : |
|
SharedPreferenceLiveData<Boolean>(sharedPrefs, key, defValue) { |
|
override fun getValueFromPreferences(key: String, defValue: Boolean): Boolean = sharedPrefs.getBoolean(key, defValue) |
|
} |
|
|
|
class SharedPreferenceFloatLiveData(sharedPrefs: SharedPreferences, key: String, defValue: Float) : |
|
SharedPreferenceLiveData<Float>(sharedPrefs, key, defValue) { |
|
override fun getValueFromPreferences(key: String, defValue: Float): Float = sharedPrefs.getFloat(key, defValue) |
|
} |
|
|
|
class SharedPreferenceLongLiveData(sharedPrefs: SharedPreferences, key: String, defValue: Long) : |
|
SharedPreferenceLiveData<Long>(sharedPrefs, key, defValue) { |
|
override fun getValueFromPreferences(key: String, defValue: Long): Long = sharedPrefs.getLong(key, defValue) |
|
} |
|
|
|
class SharedPreferenceStringSetLiveData(sharedPrefs: SharedPreferences, key: String, defValue: Set<String>) : |
|
SharedPreferenceLiveData<Set<String>>(sharedPrefs, key, defValue) { |
|
override fun getValueFromPreferences(key: String, defValue: Set<String>): Set<String> = sharedPrefs.getStringSet(key, defValue) |
|
} |
|
|
|
fun SharedPreferences.intLiveData(key: String, defValue: Int): SharedPreferenceLiveData<Int> { |
|
return SharedPreferenceIntLiveData(this, key, defValue) |
|
} |
|
fun SharedPreferences.stringLiveData(key: String, defValue: String): SharedPreferenceLiveData<String> { |
|
return SharedPreferenceStringLiveData(this, key, defValue) |
|
} |
|
fun SharedPreferences.booleanLiveData(key: String, defValue: Boolean): SharedPreferenceLiveData<Boolean> { |
|
return SharedPreferenceBooleanLiveData(this, key, defValue) |
|
} |
|
fun SharedPreferences.floatLiveData(key: String, defValue: Float): SharedPreferenceLiveData<Float> { |
|
return SharedPreferenceFloatLiveData(this, key, defValue) |
|
} |
|
fun SharedPreferences.longLiveData(key: String, defValue: Long): SharedPreferenceLiveData<Long> { |
|
return SharedPreferenceLongLiveData(this, key, defValue) |
|
} |
|
fun SharedPreferences.stringSetLiveData(key: String, defValue: Set<String>): SharedPreferenceLiveData<Set<String>> { |
|
return SharedPreferenceStringSetLiveData(this, key, defValue) |
|
} |
This is a nice gist. My version below incorporates several changes.
getValueFromPreferences
method with a constructor function argument. The base class then doesn't need to be abstract or even open.onActive()
andonInactive()
inLiveData
are just placeholders, so there's no need to call up to them.SharedPreferences.getString
andSharedPreferences.getStringSet
return nullable values, so if the default value is not nullable, the code won't compile. Perhaps this was not an issue when the original gist was published.SharedPreferences
extensions can share the same name. The compiler can figure out which function to use from the type of the default value. (I prefer overloading a single name, but it's a matter of style. Obviously,SharedPreferences
itself doesn't use this approach.)LiveData
.