Skip to content

Instantly share code, notes, and snippets.

@pratamawijaya
Forked from ologe/PreferenceExtensions.kt
Created November 14, 2019 10:37
Show Gist options
  • Save pratamawijaya/6a20412d3300f7855beee951334978aa to your computer and use it in GitHub Desktop.
Save pratamawijaya/6a20412d3300f7855beee951334978aa to your computer and use it in GitHub Desktop.
Android shared preference observer using kotlin coroutines (1.3.0)
inline fun <reified T> SharedPreferences.observeKey(key: String, default: T, dispatcher: CoroutineContext = Dispatchers.Default): Flow<T> {
val flow: Flow<T> = channelFlow {
offer(getItem(key, default))
val listener = SharedPreferences.OnSharedPreferenceChangeListener { _, k ->
if (key == k) {
offer(getItem(key, default)!!)
}
}
registerOnSharedPreferenceChangeListener(listener)
awaitClose { unregisterOnSharedPreferenceChangeListener(listener) }
}
return flow
.flowOn(dispatcher)
}
inline fun <reified T> SharedPreferences.getItem(key: String, default: T): T {
@Suppress("UNCHECKED_CAST")
return when (default){
is String -> getString(key, default) as T
is Int -> getInt(key, default) as T
is Long -> getLong(key, default) as T
is Boolean -> getBoolean(key, default) as T
is Float -> getFloat(key, default) as T
is Set<*> -> getStringSet(key, default as Set<String>) as T
is MutableSet<*> -> getStringSet(key, default as MutableSet<String>) as T
else -> throw IllegalArgumentException("generic type not handle ${T::class.java.name}")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment