|
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) |
|
} |
Nice updates!
@lucassales2, Does your reified solution handle nullability? i.e. string types can be nullable, so do you have to
prefs.liveData("foo", null as String?)
or something?I see my original variant doesn't handle nullable types, either, but I don't think either of these can differentiate between
String?
andSet<String>?
. (I'd personally be fine with defaultingSet<String>
to an empty set in my projects, but that does change the behavior of the API.