From fc178fa65ace81bcbdb2c4d8f0c9d074f1cfd4d7 Mon Sep 17 00:00:00 2001 From: razeeman Date: Fri, 5 Jan 2024 10:23:59 +0300 Subject: [PATCH] add cache for prefs --- .../data_local/repo/RepoConstants.kt | 1 + .../data_local/utils/PrefsUtils.kt | 29 +++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/RepoConstants.kt b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/RepoConstants.kt index 1dbee8f5..6e719227 100644 --- a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/RepoConstants.kt +++ b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/RepoConstants.kt @@ -2,5 +2,6 @@ package com.example.util.simpletimetracker.data_local.repo object RepoConstants { const val LOG_MESSAGE_PREFIX = "DB_ACCESS" + const val LOG_MESSAGE_PREFS_PREFIX = "PREFS" const val LOG_MESSAGE_CACHE = "CACHE" } \ No newline at end of file diff --git a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/utils/PrefsUtils.kt b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/utils/PrefsUtils.kt index 1d5d0536..a46e70ed 100644 --- a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/utils/PrefsUtils.kt +++ b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/utils/PrefsUtils.kt @@ -3,6 +3,7 @@ package com.example.util.simpletimetracker.data_local.utils import android.content.SharedPreferences import com.example.util.simpletimetracker.data_local.repo.RepoConstants.LOG_MESSAGE_CACHE import com.example.util.simpletimetracker.data_local.repo.RepoConstants.LOG_MESSAGE_PREFIX +import com.example.util.simpletimetracker.data_local.repo.RepoConstants.LOG_MESSAGE_PREFS_PREFIX import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock @@ -12,12 +13,21 @@ import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty @Suppress("UNCHECKED_CAST") -inline fun SharedPreferences.delegate( +internal inline fun SharedPreferences.delegate( key: String, default: T, ) = object : ReadWriteProperty { - override fun getValue(thisRef: Any?, property: KProperty<*>): T = - when (default) { + + private val cache: MutableMap = mutableMapOf() + + override fun getValue(thisRef: Any?, property: KProperty<*>): T { + val cached = cache[key] + if (cached != null) { + logPrefsDataAccess("get $key ($LOG_MESSAGE_CACHE)") + return cached + } + logPrefsDataAccess("get $key") + val data = when (default) { is Boolean -> (getBoolean(key, default) as? T) ?: default is Int -> (getInt(key, default) as? T) ?: default is Long -> (getLong(key, default) as? T) ?: default @@ -27,8 +37,13 @@ inline fun SharedPreferences.delegate( "Prefs delegate not implemented for class ${(default as Any?)?.javaClass}", ) } + cache[key] = data + return data + } override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) = with(edit()) { + cache[key] = value + logPrefsDataAccess("set $key") when (value) { is Boolean -> putBoolean(key, value) is Int -> putInt(key, value) @@ -83,6 +98,14 @@ internal inline fun logDataAccess(logMessage: String) { Timber.d("$LOG_MESSAGE_PREFIX $logMessage") } +/** + * Inlined for message tag to be an actual class name at call site. + */ +@Suppress("NOTHING_TO_INLINE") +internal inline fun logPrefsDataAccess(logMessage: String) { + logDataAccess("$LOG_MESSAGE_PREFS_PREFIX $logMessage") +} + /** * Produces a new list from original list by removing elements satisfying filter block. */ -- 2.54.0