Skip to content

Commit 333ec1b

Browse files
committed
Add SharedPreferencesProvider for easily SharedPreferences values binding
Signed-off-by: Fung <fython@163.com>
1 parent b58632f commit 333ec1b

File tree

6 files changed

+169
-9
lines changed

6 files changed

+169
-9
lines changed

demo/src/main/kotlin/moe/feng/kotlinyan/MainActivity.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@ import android.support.design.widget.TabLayout
88
import android.support.v13.app.FragmentPagerAdapter
99
import android.support.v4.view.ViewPager
1010
import android.support.v7.app.AppCompatActivity
11+
import android.util.Log
1112
import android.view.Menu
1213
import android.view.MenuItem
1314
import moe.feng.kotlinyan.common.AndroidExtensions
1415
import moe.feng.kotlinyan.common.ColorExtensions
16+
import moe.feng.kotlinyan.common.getSharedPreferencesProvider
1517
import moe.feng.kotlinyan.common.lazyFindNonNullView
1618
import org.jetbrains.anko.toast
1719

@@ -20,6 +22,10 @@ class MainActivity : AppCompatActivity(), AndroidExtensions, ColorExtensions {
2022
private val tabLayout: TabLayout by lazyFindNonNullView(R.id.tab_layout)
2123
private val viewPager: ViewPager by lazyFindNonNullView(R.id.view_pager)
2224

25+
private val testSettings = getSharedPreferencesProvider<TestSettings>()
26+
27+
private val TAG = MainActivity::class.java.simpleName
28+
2329
override fun onCreate(savedInstanceState: Bundle?) {
2430
super.onCreate(savedInstanceState)
2531
setContentView(R.layout.activity_main)
@@ -28,6 +34,15 @@ class MainActivity : AppCompatActivity(), AndroidExtensions, ColorExtensions {
2834

2935
viewPager.adapter = PagerAdapter(fragmentManager)
3036
tabLayout.setupWithViewPager(viewPager)
37+
38+
Log.i(TAG, "TestSettings: a=${testSettings.a} b=${testSettings.b} c=${testSettings.c} d=${testSettings.d} e=${testSettings.e}")
39+
testSettings.a += "1"
40+
if (testSettings.a!!.length > 10) testSettings.a = "Test"
41+
testSettings.b += 1
42+
testSettings.c = !testSettings.c
43+
testSettings.d += .001F
44+
testSettings.e += 1
45+
Log.i(TAG, "TestSettings: a=${testSettings.a} b=${testSettings.b} c=${testSettings.c} d=${testSettings.d} e=${testSettings.e}")
3146
}
3247

3348
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package moe.feng.kotlinyan
2+
3+
import android.content.Context
4+
import moe.feng.kotlinyan.common.SharedPreferencesProvider
5+
6+
class TestSettings private constructor(context: Context): SharedPreferencesProvider(context, "TestSettings") {
7+
8+
var a by stringValue("a", "Test")
9+
var b by intValue("b", 888)
10+
var c by booleanValue("c", true)
11+
var d by floatValue("d", .666F)
12+
var e by longValue("e", 666L)
13+
14+
}

kotlinyan-common/src/main/kotlin/moe/feng/kotlinyan/common/AndroidExtensions.kt

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import android.util.Size
1111
import android.util.SizeF
1212
import java.io.Serializable
1313

14-
interface AndroidExtensions : ActivityExtensions, ViewExtensions, ResourcesExtensions, FragmentExtensions {
14+
interface AndroidExtensions :
15+
ActivityExtensions, ViewExtensions, ResourcesExtensions, FragmentExtensions, ContextExtensions {
1516

1617
operator fun Intent.set(key: String, value: Any?) {
1718
when (value) {
@@ -154,15 +155,27 @@ interface AndroidExtensions : ActivityExtensions, ViewExtensions, ResourcesExten
154155
operator fun SharedPreferences.get(key: String): SharedPreferencesGetter?
155156
= if (contains(key)) SharedPreferencesGetter(this, key) else null
156157

157-
class SharedPreferencesGetter internal constructor(private val sp: SharedPreferences, val key: String) {
158-
fun asString(defValue: String? = null): String = sp.getString(key, defValue)
158+
class SharedPreferencesGetter internal constructor(internal val sp: SharedPreferences, val key: String) {
159+
fun asString(defValue: String? = null): String? = sp.getString(key, defValue)
159160
fun asInt(defValue: Int = 0): Int = sp.getInt(key, defValue)
160161
fun asBoolean(defValue: Boolean = false): Boolean = sp.getBoolean(key, defValue)
161162
fun asLong(defValue: Long = 0): Long = sp.getLong(key, defValue)
162163
fun asFloat(defValue: Float = 0F): Float = sp.getFloat(key, defValue)
163164
}
164165

165-
operator fun SharedPreferences.set(key: String, value: Any) {
166+
fun SharedPreferencesGetter?.asString(defValue: String? = null): String?
167+
= this?.sp?.getString(key, defValue) ?: defValue
168+
fun SharedPreferencesGetter?.asInt(defValue: Int = 0): Int
169+
= this?.sp?.getInt(key, defValue) ?: defValue
170+
fun SharedPreferencesGetter?.asBoolean(defValue: Boolean = false): Boolean
171+
= this?.sp?.getBoolean(key, defValue) ?: defValue
172+
fun SharedPreferencesGetter?.asLong(defValue: Long = 0): Long
173+
= this?.sp?.getLong(key, defValue) ?: defValue
174+
fun SharedPreferencesGetter?.asFloat(defValue: Float = 0F): Float
175+
= this?.sp?.getFloat(key, defValue) ?: defValue
176+
177+
178+
operator fun SharedPreferences.set(key: String, value: Any?) {
166179
when (value) {
167180
is String -> edit().putString(key, value).apply()
168181
is Int -> edit().putInt(key, value).apply()
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package moe.feng.kotlinyan.common
2+
3+
import android.content.Context
4+
5+
interface ContextExtensions {
6+
7+
fun Context.sharedPreferences(prefName: String, mode: Int = Context.MODE_PRIVATE)
8+
= GetSharedPreferences(this, prefName, mode)
9+
10+
}

kotlinyan-common/src/main/kotlin/moe/feng/kotlinyan/common/Properties.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,14 @@ class GetPreference<out T: Preference>(private val keyName: String)
8686

8787
// Shared Preferences Properties
8888

89-
class GetSharedPreferences(private val prefName: String,
90-
private val mode: Int = Context.MODE_PRIVATE): ReadOnlyProperty<Context, SharedPreferences> {
91-
92-
override fun getValue(thisRef: Context, property: KProperty<*>): SharedPreferences {
93-
return thisRef.getSharedPreferences(prefName, mode)
89+
class GetSharedPreferences internal constructor(
90+
private val context: Context,
91+
private val prefName: String,
92+
private val mode: Int = Context.MODE_PRIVATE
93+
): ReadOnlyProperty<Any, SharedPreferences> {
94+
95+
override fun getValue(thisRef: Any, property: KProperty<*>): SharedPreferences {
96+
return context.getSharedPreferences(prefName, mode)
9497
}
9598

9699
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
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

Comments
 (0)