Fix StringSet cache bug and change cache key-value to XSharedPreferencesCaches in YukiHookModulePrefs

This commit is contained in:
2022-08-27 21:48:20 +08:00
parent 788612feec
commit 11a0b3a693

View File

@@ -102,30 +102,46 @@ class YukiHookModulePrefs private constructor(private var context: Context? = nu
/** 存储名称 - 默认包名 + _preferences */ /** 存储名称 - 默认包名 + _preferences */
private var prefsName = "${YukiHookBridge.modulePackageName.ifBlank { context?.packageName ?: "" }}_preferences" private var prefsName = "${YukiHookBridge.modulePackageName.ifBlank { context?.packageName ?: "" }}_preferences"
/** [XSharedPreferences] 缓存的 [String] 键值数据 */
private var xPrefCacheKeyValueStrings = HashMap<String, String>()
/** [XSharedPreferences] 缓存的 [Set]<[String]> 键值数据 */
private var xPrefCacheKeyValueStringSets = HashMap<String, Set<String>>()
/** [XSharedPreferences] 缓存的 [Boolean] 键值数据 */
private var xPrefCacheKeyValueBooleans = HashMap<String, Boolean>()
/** [XSharedPreferences] 缓存的 [Int] 键值数据 */
private var xPrefCacheKeyValueInts = HashMap<String, Int>()
/** [XSharedPreferences] 缓存的 [Long] 键值数据 */
private var xPrefCacheKeyValueLongs = HashMap<String, Long>()
/** [XSharedPreferences] 缓存的 [Float] 键值数据 */
private var xPrefCacheKeyValueFloats = HashMap<String, Float>()
/** 是否使用键值缓存 */ /** 是否使用键值缓存 */
private var isUsingKeyValueCache = YukiHookAPI.Configs.isEnableModulePrefsCache private var isUsingKeyValueCache = YukiHookAPI.Configs.isEnableModulePrefsCache
/** 是否使用新版存储方式 EdXposed/LSPosed */ /** 是否使用新版存储方式 EdXposed/LSPosed */
private var isUsingNewXSharedPreferences = false private var isUsingNewXSharedPreferences = false
/**
* [XSharedPreferences] 缓存的键值数据
*/
private object XSharedPreferencesCaches {
/** 缓存的 [String] 键值数据 */
var stringData = HashMap<String, String>()
/** 缓存的 [Set]<[String]> 键值数据 */
var stringSetData = HashMap<String, Set<String>>()
/** 缓存的 [Boolean] 键值数据 */
var booleanData = HashMap<String, Boolean>()
/** 缓存的 [Int] 键值数据 */
var intData = HashMap<String, Int>()
/** 缓存的 [Long] 键值数据 */
var longData = HashMap<String, Long>()
/** 缓存的 [Float] 键值数据 */
var floatData = HashMap<String, Float>()
/** 清除所有缓存的键值数据 */
fun clear() {
stringData.clear()
stringSetData.clear()
booleanData.clear()
intData.clear()
longData.clear()
floatData.clear()
}
}
/** 检查 API 装载状态 */ /** 检查 API 装载状态 */
private fun checkApi() { private fun checkApi() {
if (YukiHookAPI.isLoadedFromBaseContext) error("YukiHookModulePrefs not allowed in Custom Hook API") if (YukiHookAPI.isLoadedFromBaseContext) error("YukiHookModulePrefs not allowed in Custom Hook API")
@@ -230,9 +246,9 @@ class YukiHookModulePrefs private constructor(private var context: Context? = nu
fun getString(key: String, value: String = "") = fun getString(key: String, value: String = "") =
(if (isXposedEnvironment) (if (isXposedEnvironment)
if (isUsingKeyValueCache) if (isUsingKeyValueCache)
xPrefCacheKeyValueStrings[key].let { XSharedPreferencesCaches.stringData[key].let {
(it ?: xPrefs.getString(key, value) ?: value).let { value -> (it ?: xPrefs.getString(key, value) ?: value).let { value ->
xPrefCacheKeyValueStrings[key] = value XSharedPreferencesCaches.stringData[key] = value
value value
} }
} }
@@ -255,9 +271,9 @@ class YukiHookModulePrefs private constructor(private var context: Context? = nu
fun getStringSet(key: String, value: Set<String>) = fun getStringSet(key: String, value: Set<String>) =
(if (isXposedEnvironment) (if (isXposedEnvironment)
if (isUsingKeyValueCache) if (isUsingKeyValueCache)
xPrefCacheKeyValueStrings[key].let { XSharedPreferencesCaches.stringSetData[key].let {
(it ?: xPrefs.getStringSet(key, value) ?: value).let { value -> (it ?: xPrefs.getStringSet(key, value) ?: value).let { value ->
xPrefCacheKeyValueStringSets[key] = value as Set<String> XSharedPreferencesCaches.stringSetData[key] = value
value value
} }
} }
@@ -280,9 +296,9 @@ class YukiHookModulePrefs private constructor(private var context: Context? = nu
fun getBoolean(key: String, value: Boolean = false) = fun getBoolean(key: String, value: Boolean = false) =
(if (isXposedEnvironment) (if (isXposedEnvironment)
if (isUsingKeyValueCache) if (isUsingKeyValueCache)
xPrefCacheKeyValueBooleans[key].let { XSharedPreferencesCaches.booleanData[key].let {
it ?: xPrefs.getBoolean(key, value).let { value -> it ?: xPrefs.getBoolean(key, value).let { value ->
xPrefCacheKeyValueBooleans[key] = value XSharedPreferencesCaches.booleanData[key] = value
value value
} }
} }
@@ -305,9 +321,9 @@ class YukiHookModulePrefs private constructor(private var context: Context? = nu
fun getInt(key: String, value: Int = 0) = fun getInt(key: String, value: Int = 0) =
(if (isXposedEnvironment) (if (isXposedEnvironment)
if (isUsingKeyValueCache) if (isUsingKeyValueCache)
xPrefCacheKeyValueInts[key].let { XSharedPreferencesCaches.intData[key].let {
it ?: xPrefs.getInt(key, value).let { value -> it ?: xPrefs.getInt(key, value).let { value ->
xPrefCacheKeyValueInts[key] = value XSharedPreferencesCaches.intData[key] = value
value value
} }
} }
@@ -330,9 +346,9 @@ class YukiHookModulePrefs private constructor(private var context: Context? = nu
fun getFloat(key: String, value: Float = 0f) = fun getFloat(key: String, value: Float = 0f) =
(if (isXposedEnvironment) (if (isXposedEnvironment)
if (isUsingKeyValueCache) if (isUsingKeyValueCache)
xPrefCacheKeyValueFloats[key].let { XSharedPreferencesCaches.floatData[key].let {
it ?: xPrefs.getFloat(key, value).let { value -> it ?: xPrefs.getFloat(key, value).let { value ->
xPrefCacheKeyValueFloats[key] = value XSharedPreferencesCaches.floatData[key] = value
value value
} }
} }
@@ -355,9 +371,9 @@ class YukiHookModulePrefs private constructor(private var context: Context? = nu
fun getLong(key: String, value: Long = 0L) = fun getLong(key: String, value: Long = 0L) =
(if (isXposedEnvironment) (if (isXposedEnvironment)
if (isUsingKeyValueCache) if (isUsingKeyValueCache)
xPrefCacheKeyValueLongs[key].let { XSharedPreferencesCaches.longData[key].let {
it ?: xPrefs.getLong(key, value).let { value -> it ?: xPrefs.getLong(key, value).let { value ->
xPrefCacheKeyValueLongs[key] = value XSharedPreferencesCaches.longData[key] = value
value value
} }
} }
@@ -516,7 +532,7 @@ class YukiHookModulePrefs private constructor(private var context: Context? = nu
* 智能获取指定类型的键值 * 智能获取指定类型的键值
* @param prefs 键值实例 * @param prefs 键值实例
* @param value 默认值 - 未指定默认为 [prefs] 中的 [PrefsData.value] * @param value 默认值 - 未指定默认为 [prefs] 中的 [PrefsData.value]
* @return [T] 只能是 [String]、[Int]、[Float]、[Long]、[Boolean] * @return [T] 只能是 [String]、[Set]<[String]>、[Int]、[Float]、[Long]、[Boolean]
*/ */
inline fun <reified T> get(prefs: PrefsData<T>, value: T = prefs.value): T = getPrefsData(prefs.key, value) as T inline fun <reified T> get(prefs: PrefsData<T>, value: T = prefs.value): T = getPrefsData(prefs.key, value) as T
@@ -527,7 +543,7 @@ class YukiHookModulePrefs private constructor(private var context: Context? = nu
* *
* - ❗在 (Xposed) 宿主环境下只读 - 无法使用 * - ❗在 (Xposed) 宿主环境下只读 - 无法使用
* @param prefs 键值实例 * @param prefs 键值实例
* @param value 要存储的值 - 只能是 [String]、[Int]、[Float]、[Long]、[Boolean] * @param value 要存储的值 - 只能是 [String]、[Set]<[String]>、[Int]、[Float]、[Long]、[Boolean]
*/ */
inline fun <reified T> put(prefs: PrefsData<T>, value: T) = putPrefsData(prefs.key, value) inline fun <reified T> put(prefs: PrefsData<T>, value: T) = putPrefsData(prefs.key, value)
@@ -559,7 +575,7 @@ class YukiHookModulePrefs private constructor(private var context: Context? = nu
* *
* - ❗在 (Xposed) 宿主环境下只读 - 无法使用 * - ❗在 (Xposed) 宿主环境下只读 - 无法使用
* @param key 键值 * @param key 键值
* @param value 要存储的值 - 只能是 [String]、[Int]、[Float]、[Long]、[Boolean] * @param value 要存储的值 - 只能是 [String]、[Set]<[String]>、[Int]、[Float]、[Long]、[Boolean]
*/ */
@PublishedApi @PublishedApi
internal fun putPrefsData(key: String, value: Any?) = when (value) { internal fun putPrefsData(key: String, value: Any?) = when (value) {
@@ -583,14 +599,7 @@ class YukiHookModulePrefs private constructor(private var context: Context? = nu
* *
* - 在 (Xposed) 宿主环境中使用 * - 在 (Xposed) 宿主环境中使用
*/ */
fun clearCache() { fun clearCache() = XSharedPreferencesCaches.clear()
xPrefCacheKeyValueStrings.clear()
xPrefCacheKeyValueStringSets.clear()
xPrefCacheKeyValueBooleans.clear()
xPrefCacheKeyValueInts.clear()
xPrefCacheKeyValueLongs.clear()
xPrefCacheKeyValueFloats.clear()
}
/** /**
* 恢复 [isUsingKeyValueCache] 为默认状态 * 恢复 [isUsingKeyValueCache] 为默认状态