dave08
12/09/2021, 1:56 PMdave08
12/09/2021, 1:56 PMclass PreferenceProperty<T : Any, R : PackageRestrictions>(
private val key: String,
private val defaultValue: T,
private val getter: SharedPreferences.(String, T) -> T,
private val setter: SharedPreferences.Editor.(String, T) -> SharedPreferences.Editor
) : ReadWriteProperty<R, T> {
lateinit var listener: SharedPreferences.OnSharedPreferenceChangeListener
var _value: T by Delegates.notNull()
init {
println("Instance $this created for key: $key")
}
private fun initialize(prefs: SharedPreferences) {
if (!::listener.isInitialized) {
_value = prefs.getter(key, defaultValue)
listener = SharedPreferences.OnSharedPreferenceChangeListener { prefs, key ->
println("$this accessed listener for: $key")
if (prefs === prefs && key == key) {
_value = prefs.getter(key, defaultValue)
}
}
prefs.registerOnSharedPreferenceChangeListener(listener)
}
}
override operator fun getValue(thisRef: R, property: KProperty<*>): T {
initialize(thisRef.prefs)
return _value
}
override operator fun setValue(thisRef: R, property: KProperty<*>, value: T) =
thisRef.prefs
.edit()
.setter(key, value)
.apply()
}