42 lines
1.6 KiB
Kotlin
42 lines
1.6 KiB
Kotlin
package eu.kanade.tachiyomi.util
|
|
|
|
import android.content.SharedPreferences
|
|
import kotlinx.coroutines.Dispatchers
|
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
|
import kotlinx.coroutines.channels.awaitClose
|
|
import kotlinx.coroutines.flow.Flow
|
|
import kotlinx.coroutines.flow.channelFlow
|
|
import kotlinx.coroutines.flow.flowOn
|
|
import kotlin.coroutines.CoroutineContext
|
|
|
|
@ExperimentalCoroutinesApi
|
|
inline fun <reified T> SharedPreferences.getKey(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 handled: ${T::class.java.name}")
|
|
}
|
|
}
|