Jelajahi Sumber

Added property delegates for shared preference config

Vadik Sirekanyan 7 tahun lalu
induk
melakukan
d7da6cd235

+ 2 - 2
app/src/main/java/com/sirekanyan/knigopis/common/extensions/ImageView.kt

@@ -13,12 +13,12 @@ import com.bumptech.glide.request.RequestListener
 import com.bumptech.glide.request.RequestOptions
 import com.bumptech.glide.request.target.Target
 import com.sirekanyan.knigopis.R
-import com.sirekanyan.knigopis.repository.isDarkConfiguration
+import com.sirekanyan.knigopis.repository.config.InMemory.isDarkModeEnabled
 
 private const val DARK_SATURATION = 0.33f
 
 private fun ImageView.setImage(url: String?, requestOptions: RequestOptions, placeholder: Int) {
-    if (isDarkConfiguration) {
+    if (isDarkModeEnabled) {
         val colorMatrix = ColorMatrix().apply { setSaturation(DARK_SATURATION) }
         colorFilter = ColorMatrixColorFilter(colorMatrix)
     }

+ 9 - 23
app/src/main/java/com/sirekanyan/knigopis/repository/Configuration.kt

@@ -1,40 +1,26 @@
 package com.sirekanyan.knigopis.repository
 
 import android.content.Context
+import android.content.Context.MODE_PRIVATE
+import com.sirekanyan.knigopis.repository.config.BooleanPreference
+import com.sirekanyan.knigopis.repository.config.InMemory
+import com.sirekanyan.knigopis.repository.config.IntPreference
 
-var isDarkConfiguration = false
-
-private const val PREFS_NAME = "knigopis-dev"
-private const val DARK_THEME_KEY = "dark-theme"
-private const val SORT_MODE_KEY = "sort-mode"
+private const val PREFS_NAME = "config"
 
 interface Configuration {
-
     var isDarkTheme: Boolean
-
     var sortingMode: Int
-
 }
 
 class ConfigurationImpl(context: Context) : Configuration {
 
-    private val prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
+    internal val prefs = context.getSharedPreferences(PREFS_NAME, MODE_PRIVATE)
+    override var isDarkTheme by BooleanPreference(onUpdate = { InMemory.isDarkModeEnabled = it })
+    override var sortingMode by IntPreference()
 
     init {
-        isDarkConfiguration = isDarkTheme
+        InMemory.isDarkModeEnabled = isDarkTheme
     }
 
-    override var isDarkTheme: Boolean
-        get() = prefs.getBoolean(DARK_THEME_KEY, false)
-        set(enabled) {
-            isDarkConfiguration = enabled
-            prefs.edit().putBoolean(DARK_THEME_KEY, enabled).apply()
-        }
-
-    override var sortingMode: Int
-        get() = prefs.getInt(SORT_MODE_KEY, 0)
-        set(mode) {
-            prefs.edit().putInt(SORT_MODE_KEY, mode).apply()
-        }
-
 }

+ 5 - 0
app/src/main/java/com/sirekanyan/knigopis/repository/config/InMemory.kt

@@ -0,0 +1,5 @@
+package com.sirekanyan.knigopis.repository.config
+
+object InMemory {
+    var isDarkModeEnabled: Boolean = false
+}

+ 32 - 0
app/src/main/java/com/sirekanyan/knigopis/repository/config/PropertyDelegate.kt

@@ -0,0 +1,32 @@
+package com.sirekanyan.knigopis.repository.config
+
+import android.content.SharedPreferences
+import android.content.SharedPreferences.Editor
+import com.sirekanyan.knigopis.repository.ConfigurationImpl
+import kotlin.reflect.KProperty
+
+abstract class AbstractPreference<T>(
+    private val load: SharedPreferences.(key: String) -> T,
+    private val save: Editor.(key: String, value: T) -> Editor
+) {
+
+    operator fun getValue(config: ConfigurationImpl, prop: KProperty<*>): T =
+        config.prefs.load(prop.name)
+
+    operator fun setValue(config: ConfigurationImpl, prop: KProperty<*>, value: T) =
+        config.prefs.edit().save(prop.name, value).apply()
+
+}
+
+class IntPreference : AbstractPreference<Int>(
+    { key -> getInt(key, 0) },
+    { key, value -> putInt(key, value) }
+)
+
+class BooleanPreference(onUpdate: ((Boolean) -> Unit)? = null) : AbstractPreference<Boolean>(
+    { key -> getBoolean(key, false) },
+    { key, value ->
+        onUpdate?.invoke(value)
+        putBoolean(key, value)
+    }
+)