Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save moonlight200/e27acbef57c08934ea248b48d37c4772 to your computer and use it in GitHub Desktop.

Select an option

Save moonlight200/e27acbef57c08934ea248b48d37c4772 to your computer and use it in GitHub Desktop.
Creates LiveData objects that observe a value in SharedPreferences while they have active listeners.
// 1. Get a reference to SharedPreferences however you normally would.
val prefs: SharedPreferences
// 2. Use the extension functions to create a LiveData object of whatever type you need and observe the result.
prefs.getBooleanLiveData("analytics_enabled", false).observe(this, { enabled ->
if (enabled) {
sendAnalytics()
}
})
import android.content.SharedPreferences
import androidx.lifecycle.LiveData
class SharedPreferenceLiveData<T>(
private val sharedPrefs: SharedPreferences,
val key: String,
val defaultValue: T,
private val valueExtractor: (sharedPrefs: SharedPreferences, prefKey: String, defValue: T) -> T
) : LiveData<T>() {
private val preferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener { sharedPrefs, key ->
if (key == this.key) {
postValue(valueExtractor(sharedPrefs, key, defaultValue))
}
}
init {
postValue(valueExtractor(sharedPrefs, key, defaultValue))
}
override fun onActive() {
super.onActive()
sharedPrefs.registerOnSharedPreferenceChangeListener(preferenceChangeListener)
}
override fun onInactive() {
sharedPrefs.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener)
super.onInactive()
}
}
fun SharedPreferences.getIntLiveData(key: String, defaultValue: Int = 0): LiveData<Int> =
SharedPreferenceLiveData(this, key, defaultValue) { sharedPrefs, prefKey, defValue ->
sharedPrefs.getInt(prefKey, defValue)
}
fun SharedPreferences.getStringLiveData(key: String, defaultValue: String = ""): LiveData<String> =
SharedPreferenceLiveData(this, key, defaultValue) { sharedPrefs, prefKey, defValue ->
sharedPrefs.getString(prefKey, defValue) ?: defValue
}
fun SharedPreferences.getBooleanLiveData(key: String, defaultValue: Boolean = false): LiveData<Boolean> =
SharedPreferenceLiveData(this, key, defaultValue) { sharedPrefs, prefKey, defValue ->
sharedPrefs.getBoolean(prefKey, defValue)
}
fun SharedPreferences.getFloatLiveData(key: String, defaultValue: Float = 0.0F): LiveData<Float> =
SharedPreferenceLiveData(this, key, defaultValue) { sharedPrefs, prefKey, defValue ->
sharedPrefs.getFloat(prefKey, defValue)
}
fun SharedPreferences.getLongLiveData(key: String, defaultValue: Long = 0L): LiveData<Long> =
SharedPreferenceLiveData(this, key, defaultValue) { sharedPrefs, prefKey, defValue ->
sharedPrefs.getLong(prefKey, defValue)
}
fun SharedPreferences.getStringSetLiveData(key: String, defaultValue: Set<String> = emptySet()): LiveData<Set<String>> =
SharedPreferenceLiveData(this, key, defaultValue) { sharedPrefs, prefKey, defValue ->
sharedPrefs.getStringSet(prefKey, defValue) ?: defValue
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment