Skip to content

Instantly share code, notes, and snippets.

@szymonkozak
Created October 3, 2017 21:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save szymonkozak/477cf8d6603a6f8bf8bc217689ff62b1 to your computer and use it in GitHub Desktop.
Save szymonkozak/477cf8d6603a6f8bf8bc217689ff62b1 to your computer and use it in GitHub Desktop.
abstract class PrefDelegate<T>(val prefKey: String) {
companion object {
private var context: Context? = null
/**
* Initialize PrefDelegate with a Context reference
* This method needs to be called before any other usage of PrefDelegate
*/
fun init(context: Context) {
Companion.context = context
}
}
protected val prefs: SharedPreferences by lazy {
if (context != null) {
PreferenceManager.getDefaultSharedPreferences(context)
} else {
throw IllegalStateException("Context was not initialized. Call PrefDelegate.init(context) before using it")
}
}
abstract operator fun getValue(thisRef: Any?, property: KProperty<*>): T
abstract operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T)
}
fun stringPref(prefKey: String, defaultValue: String? = null) = StringPrefDelegate(prefKey, defaultValue)
class StringPrefDelegate(prefKey: String, private val defaultValue: String?) : PrefDelegate<String?>(prefKey) {
override fun getValue(thisRef: Any?, property: KProperty<*>): String? = prefs.getString(prefKey, defaultValue)
override fun setValue(thisRef: Any?, property: KProperty<*>, value: String?) = prefs.edit().putString(prefKey, value).apply()
}
fun intPref(prefKey: String, defaultValue: Int = 0) = IntPrefDelegate(prefKey, defaultValue)
class IntPrefDelegate(prefKey: String, private val defaultValue: Int) : PrefDelegate<Int>(prefKey) {
override fun getValue(thisRef: Any?, property: KProperty<*>) = prefs.getInt(prefKey, defaultValue)
override fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) = prefs.edit().putInt(prefKey, value).apply()
}
fun floatPref(prefKey: String, defaultValue: Float = 0f) = FloatPrefDelegate(prefKey, defaultValue)
class FloatPrefDelegate(prefKey: String, private val defaultValue: Float) : PrefDelegate<Float>(prefKey) {
override fun getValue(thisRef: Any?, property: KProperty<*>) = prefs.getFloat(prefKey, defaultValue)
override fun setValue(thisRef: Any?, property: KProperty<*>, value: Float) = prefs.edit().putFloat(prefKey, value).apply()
}
fun booleanPref(prefKey: String, defaultValue: Boolean = false) = BooleanPrefDelegate(prefKey, defaultValue)
class BooleanPrefDelegate(prefKey: String, private val defaultValue: Boolean) : PrefDelegate<Boolean>(prefKey) {
override fun getValue(thisRef: Any?, property: KProperty<*>) = prefs.getBoolean(prefKey, defaultValue)
override fun setValue(thisRef: Any?, property: KProperty<*>, value: Boolean) = prefs.edit().putBoolean(prefKey, value).apply()
}
fun longPref(prefKey: String, defaultValue: Long = 0L) = LongPrefDelegate(prefKey, defaultValue)
class LongPrefDelegate(prefKey: String, private val defaultValue: Long) : PrefDelegate<Long>(prefKey) {
override fun getValue(thisRef: Any?, property: KProperty<*>) = prefs.getLong(prefKey, defaultValue)
override fun setValue(thisRef: Any?, property: KProperty<*>, value: Long) = prefs.edit().putLong(prefKey, value).apply()
}
fun stringSetPref(prefKey: String, defaultValue: Set<String> = HashSet<String>()) = StringSetPrefDelegate(prefKey, defaultValue)
class StringSetPrefDelegate(prefKey: String, private val defaultValue: Set<String>) : PrefDelegate<Set<String>>(prefKey) {
override fun getValue(thisRef: Any?, property: KProperty<*>) = prefs.getStringSet(prefKey, defaultValue)
override fun setValue(thisRef: Any?, property: KProperty<*>, value: Set<String>) = prefs.edit().putStringSet(prefKey, value).apply()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment