Hi! Anybody could spot why the onSharedPreferenceL...
# android
d
Hi! Anybody could spot why the onSharedPreferenceListener is never called in the code in the thread?
Copy code
class 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()
}