1+ package moe.feng.kotlinyan.common
2+
3+ import android.content.Context
4+ import android.content.SharedPreferences
5+ import kotlin.properties.ReadWriteProperty
6+ import kotlin.reflect.KProperty
7+
8+ abstract class SharedPreferencesProvider constructor(context : Context , prefName : String , mode : Int = Context .MODE_PRIVATE )
9+ : ISharedPreferencesProvider {
10+
11+ override val sharedPref: SharedPreferences by GetSharedPreferences (context, prefName, mode)
12+
13+ }
14+
15+ private var __sharedPreferencesProviders : MutableMap <String , SharedPreferencesProvider > = mutableMapOf ()
16+
17+ fun <T : SharedPreferencesProvider > Context.getSharedPreferencesProvider (clazz : Class <T >): T {
18+ val providerName = clazz.canonicalName
19+ if (! __sharedPreferencesProviders .contains(providerName)) {
20+ __sharedPreferencesProviders [providerName] = clazz
21+ .getDeclaredConstructor(Context ::class .java).apply { isAccessible = true }.newInstance(this )
22+ }
23+ return __sharedPreferencesProviders [providerName] as T
24+ }
25+
26+ inline fun <reified T : SharedPreferencesProvider > Context.getSharedPreferencesProvider (): T {
27+ return getSharedPreferencesProvider(T ::class .java)
28+ }
29+
30+ interface ISharedPreferencesProvider : ContextExtensions {
31+
32+ val sharedPref: SharedPreferences
33+
34+ fun stringValue (key : String , defValue : String? = null) = StringSharedPreferenceGetter (key, defValue)
35+ fun intValue (key : String , defValue : Int = 0) = IntSharedPreferenceGetter (key, defValue)
36+ fun booleanValue (key : String , defValue : Boolean = false) = BooleanSharedPreferenceGetter (key, defValue)
37+ fun longValue (key : String , defValue : Long = 0) = LongSharedPreferenceGetter (key, defValue)
38+ fun floatValue (key : String , defValue : Float = 0F) = FloatSharedPreferenceGetter (key, defValue)
39+
40+ }
41+
42+ class StringSharedPreferenceGetter internal constructor(private val key : String ,
43+ private val defValue : String? = null )
44+ : ReadWriteProperty <ISharedPreferencesProvider , String ?>, AndroidExtensions {
45+
46+ override fun getValue (thisRef : ISharedPreferencesProvider , property : KProperty <* >): String?
47+ = thisRef.sharedPref[key].asString(defValue)
48+
49+ override fun setValue (thisRef : ISharedPreferencesProvider , property : KProperty <* >, value : String? ) {
50+ thisRef.sharedPref[key] = value
51+ }
52+
53+ }
54+
55+ class IntSharedPreferenceGetter internal constructor(private val key : String ,
56+ private val defValue : Int = 0 )
57+ : ReadWriteProperty <ISharedPreferencesProvider , Int >, AndroidExtensions {
58+
59+ override fun getValue (thisRef : ISharedPreferencesProvider , property : KProperty <* >): Int
60+ = thisRef.sharedPref[key].asInt(defValue)
61+
62+ override fun setValue (thisRef : ISharedPreferencesProvider , property : KProperty <* >, value : Int ) {
63+ thisRef.sharedPref[key] = value
64+ }
65+
66+ }
67+
68+ class BooleanSharedPreferenceGetter internal constructor(private val key : String ,
69+ private val defValue : Boolean = false )
70+ : ReadWriteProperty <ISharedPreferencesProvider , Boolean >, AndroidExtensions {
71+
72+ override fun getValue (thisRef : ISharedPreferencesProvider , property : KProperty <* >): Boolean
73+ = thisRef.sharedPref[key].asBoolean(defValue)
74+
75+ override fun setValue (thisRef : ISharedPreferencesProvider , property : KProperty <* >, value : Boolean ) {
76+ thisRef.sharedPref[key] = value
77+ }
78+
79+ }
80+
81+ class LongSharedPreferenceGetter internal constructor(private val key : String ,
82+ private val defValue : Long = 0 )
83+ : ReadWriteProperty <ISharedPreferencesProvider , Long >, AndroidExtensions {
84+
85+ override fun getValue (thisRef : ISharedPreferencesProvider , property : KProperty <* >): Long
86+ = thisRef.sharedPref[key].asLong(defValue)
87+
88+ override fun setValue (thisRef : ISharedPreferencesProvider , property : KProperty <* >, value : Long ) {
89+ thisRef.sharedPref[key] = value
90+ }
91+
92+ }
93+
94+ class FloatSharedPreferenceGetter internal constructor(private val key : String ,
95+ private val defValue : Float = 0F )
96+ : ReadWriteProperty <ISharedPreferencesProvider , Float >, AndroidExtensions {
97+
98+ override fun getValue (thisRef : ISharedPreferencesProvider , property : KProperty <* >): Float
99+ = thisRef.sharedPref[key].asFloat(defValue)
100+
101+ override fun setValue (thisRef : ISharedPreferencesProvider , property : KProperty <* >, value : Float ) {
102+ thisRef.sharedPref[key] = value
103+ }
104+
105+ }
0 commit comments