import android.content.SharedPreferences import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty class Preference( private val preferences: SharedPreferences, private val name: String, private val default: T ) : ReadWriteProperty { override fun getValue(thisRef: Any?, property: KProperty<*>): T = findPreference(name, default) override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { putPreference(name, value) } private fun findPreference(name: String, default: T): T = with(preferences) { val res: Any = when (default) { is Long -> getLong(name, default) is String -> getString(name, default) is Int -> getInt(name, default) is Boolean -> getBoolean(name, default) is Float -> getFloat(name, default) else -> throw IllegalArgumentException("This type cannot be saved into Preferences") } res as? T ?: default } private fun putPreference(name: String, value: T) = with(preferences.edit()) { when (value) { is Long -> putLong(name, value) is String -> putString(name, value) is Int -> putInt(name, value) is Boolean -> putBoolean(name, value) is Float -> putFloat(name, value) else -> throw IllegalArgumentException("This type cannot be saved into Preferences") }.apply() } } // SAMPLE // before you need ref to SharedPreference var myValue: String by Preference( preference, "KEY", "DEFAULT_VALUE" ) // put new value to shared pref myValue = "NEW_VALUE"