Update YukiHookModulePrefs.kt support Set<String> and all() and clear() method

This commit is contained in:
2022-04-15 01:31:38 +08:00
parent dc8de3b0fb
commit 1a1089cb2f
3 changed files with 157 additions and 14 deletions

View File

@@ -90,6 +90,20 @@ fun getString(key: String, value: String): String
> 获取 `String` 键值。 > 获取 `String` 键值。
### getStringSet [method]
```kotlin
fun getStringSet(key: String, value: Set<String>): Set<String>
```
<b>变更记录</b>
`v1.0.76` `新增`
<b>功能描述</b>
> 获取 `Set<String>` 键值。
### getBoolean [method] ### getBoolean [method]
```kotlin ```kotlin
@@ -146,6 +160,24 @@ fun getFloat(key: String, value: Float): Float
> 获取 `Float` 键值。 > 获取 `Float` 键值。
### all [method]
```kotlin
fun all(): HashMap<String, Any?>
```
<b>变更记录</b>
`v1.0.76` `新增`
<b>功能描述</b>
> 获取全部存储的键值数据。
智能识别对应环境读取键值数据。
!> 每次调用都会获取实时的数据,不受缓存控制,请勿在高并发场景中使用。
### remove [method] ### remove [method]
```kotlin ```kotlin
@@ -178,6 +210,22 @@ inline fun <reified T> remove(prefs: PrefsData<T>)
!> 在 `XSharedPreferences` 环境下只读,无法使用。 !> 在 `XSharedPreferences` 环境下只读,无法使用。
### clear [method]
```kotlin
fun clear()
```
<b>变更记录</b>
`v1.0.76` `新增`
<b>功能描述</b>
> 移除全部存储数据。
!> 在 `XSharedPreferences` 环境下只读,无法使用。
### putString [method] ### putString [method]
```kotlin ```kotlin
@@ -194,6 +242,22 @@ fun putString(key: String, value: String)
!> 在 `XSharedPreferences` 环境下只读,无法使用。 !> 在 `XSharedPreferences` 环境下只读,无法使用。
### putStringSet [method]
```kotlin
fun putStringSet(key: String, value: Set<String>)
```
<b>变更记录</b>
`v1.0.76` `新增`
<b>功能描述</b>
> 存储 `Set<String>` 键值。
!> 在 `XSharedPreferences` 环境下只读,无法使用。
### putBoolean [method] ### putBoolean [method]
```kotlin ```kotlin

View File

@@ -436,7 +436,7 @@ class MainActivity : AppCompatActivity() {
<b>解决方案</b> <b>解决方案</b>
`YukiHookModulePrefs` 支持的类型只有 `String``Int``Float``Long``Boolean`,请传入支持的类型。 `YukiHookModulePrefs` 支持的类型只有 `String``Set<String>``Int``Float``Long``Boolean`,请传入支持的类型。
!> `IllegalStateException` HookParam Method args index must be >= 0 !> `IllegalStateException` HookParam Method args index must be >= 0

View File

@@ -25,13 +25,14 @@
* *
* This file is Created by fankes on 2022/2/8. * This file is Created by fankes on 2022/2/8.
*/ */
@file:Suppress("SetWorldReadable", "CommitPrefEdits", "DEPRECATION", "WorldReadableFiles", "unused") @file:Suppress("SetWorldReadable", "CommitPrefEdits", "DEPRECATION", "WorldReadableFiles", "unused", "UNCHECKED_CAST")
package com.highcapable.yukihookapi.hook.xposed.prefs package com.highcapable.yukihookapi.hook.xposed.prefs
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import com.highcapable.yukihookapi.YukiHookAPI import com.highcapable.yukihookapi.YukiHookAPI
import com.highcapable.yukihookapi.hook.log.yLoggerW
import com.highcapable.yukihookapi.hook.xposed.bridge.YukiHookXposedBridge import com.highcapable.yukihookapi.hook.xposed.bridge.YukiHookXposedBridge
import com.highcapable.yukihookapi.hook.xposed.prefs.data.PrefsData import com.highcapable.yukihookapi.hook.xposed.prefs.data.PrefsData
import de.robv.android.xposed.XSharedPreferences import de.robv.android.xposed.XSharedPreferences
@@ -66,6 +67,9 @@ class YukiHookModulePrefs(private val context: Context? = null) {
/** [XSharedPreferences] 缓存的 [String] 键值数据 */ /** [XSharedPreferences] 缓存的 [String] 键值数据 */
private var xPrefCacheKeyValueStrings = HashMap<String, String>() private var xPrefCacheKeyValueStrings = HashMap<String, String>()
/** [XSharedPreferences] 缓存的 [Set]<[String]> 键值数据 */
private var xPrefCacheKeyValueStringSets = HashMap<String, Set<String>>()
/** [XSharedPreferences] 缓存的 [Boolean] 键值数据 */ /** [XSharedPreferences] 缓存的 [Boolean] 键值数据 */
private var xPrefCacheKeyValueBooleans = HashMap<String, Boolean>() private var xPrefCacheKeyValueBooleans = HashMap<String, Boolean>()
@@ -171,6 +175,31 @@ class YukiHookModulePrefs(private val context: Context? = null) {
it it
} }
/**
* 获取 [Set]<[String]> 键值
*
* - 智能识别对应环境读取键值数据
*
* - 建议使用 [PrefsData] 创建模板并使用 [get] 获取数据
* @param key 键值名称
* @param value 默认数据
* @return [Set]<[String]>
*/
fun getStringSet(key: String, value: Set<String>) =
(if (isXposedEnvironment)
if (isUsingKeyValueCache)
xPrefCacheKeyValueStrings[key].let {
(it ?: xPref.getStringSet(key, value) ?: value).let { value ->
xPrefCacheKeyValueStringSets[key] = value as Set<String>
value
}
}
else resetCacheSet { xPref.getStringSet(key, value) ?: value }
else sPref.getStringSet(key, value) ?: value).let {
makeWorldReadable()
it
}
/** /**
* 获取 [Boolean] 键值 * 获取 [Boolean] 键值
* *
@@ -271,6 +300,20 @@ class YukiHookModulePrefs(private val context: Context? = null) {
it it
} }
/**
* 获取全部存储的键值数据
*
* - 智能识别对应环境读取键值数据
*
* - ❗每次调用都会获取实时的数据 - 不受缓存控制 - 请勿在高并发场景中使用
* @return [HashMap] 全部类型的键值数组
*/
fun all() = HashMap<String, Any?>().apply {
if (isXposedEnvironment)
xPref.all.forEach { (k, v) -> this[k] = v }
else sPref.all.forEach { (k, v) -> this[k] = v }
}
/** /**
* 移除全部包含 [key] 的存储数据 * 移除全部包含 [key] 的存储数据
* *
@@ -279,8 +322,7 @@ class YukiHookModulePrefs(private val context: Context? = null) {
* - ❗在 [XSharedPreferences] 环境下只读 - 无法使用 * - ❗在 [XSharedPreferences] 环境下只读 - 无法使用
* @param key 键值名称 * @param key 键值名称
*/ */
fun remove(key: String) { fun remove(key: String) = moduleEnvironment {
if (isXposedEnvironment) return
sPref.edit().remove(key).apply() sPref.edit().remove(key).apply()
makeWorldReadable() makeWorldReadable()
} }
@@ -295,6 +337,18 @@ class YukiHookModulePrefs(private val context: Context? = null) {
*/ */
inline fun <reified T> remove(prefs: PrefsData<T>) = remove(prefs.key) inline fun <reified T> remove(prefs: PrefsData<T>) = remove(prefs.key)
/**
* 移除全部存储数据
*
* - 在模块 [Context] 环境中使用
*
* - ❗在 [XSharedPreferences] 环境下只读 - 无法使用
*/
fun clear() = moduleEnvironment {
sPref.edit().clear().apply()
makeWorldReadable()
}
/** /**
* 存储 [String] 键值 * 存储 [String] 键值
* *
@@ -306,12 +360,27 @@ class YukiHookModulePrefs(private val context: Context? = null) {
* @param key 键值名称 * @param key 键值名称
* @param value 键值数据 * @param value 键值数据
*/ */
fun putString(key: String, value: String) { fun putString(key: String, value: String) = moduleEnvironment {
if (isXposedEnvironment) return
sPref.edit().putString(key, value).apply() sPref.edit().putString(key, value).apply()
makeWorldReadable() makeWorldReadable()
} }
/**
* 存储 [Set]<[String]> 键值
*
* - 建议使用 [PrefsData] 创建模板并使用 [put] 存储数据
*
* - 在模块 [Context] 环境中使用
*
* - ❗在 [XSharedPreferences] 环境下只读 - 无法使用
* @param key 键值名称
* @param value 键值数据
*/
fun putStringSet(key: String, value: Set<String>) = moduleEnvironment {
sPref.edit().putStringSet(key, value).apply()
makeWorldReadable()
}
/** /**
* 存储 [Boolean] 键值 * 存储 [Boolean] 键值
* *
@@ -323,8 +392,7 @@ class YukiHookModulePrefs(private val context: Context? = null) {
* @param key 键值名称 * @param key 键值名称
* @param value 键值数据 * @param value 键值数据
*/ */
fun putBoolean(key: String, value: Boolean) { fun putBoolean(key: String, value: Boolean) = moduleEnvironment {
if (isXposedEnvironment) return
sPref.edit().putBoolean(key, value).apply() sPref.edit().putBoolean(key, value).apply()
makeWorldReadable() makeWorldReadable()
} }
@@ -340,8 +408,7 @@ class YukiHookModulePrefs(private val context: Context? = null) {
* @param key 键值名称 * @param key 键值名称
* @param value 键值数据 * @param value 键值数据
*/ */
fun putInt(key: String, value: Int) { fun putInt(key: String, value: Int) = moduleEnvironment {
if (isXposedEnvironment) return
sPref.edit().putInt(key, value).apply() sPref.edit().putInt(key, value).apply()
makeWorldReadable() makeWorldReadable()
} }
@@ -357,8 +424,7 @@ class YukiHookModulePrefs(private val context: Context? = null) {
* @param key 键值名称 * @param key 键值名称
* @param value 键值数据 * @param value 键值数据
*/ */
fun putFloat(key: String, value: Float) { fun putFloat(key: String, value: Float) = moduleEnvironment {
if (isXposedEnvironment) return
sPref.edit().putFloat(key, value).apply() sPref.edit().putFloat(key, value).apply()
makeWorldReadable() makeWorldReadable()
} }
@@ -374,8 +440,7 @@ class YukiHookModulePrefs(private val context: Context? = null) {
* @param key 键值名称 * @param key 键值名称
* @param value 键值数据 * @param value 键值数据
*/ */
fun putLong(key: String, value: Long) { fun putLong(key: String, value: Long) = moduleEnvironment {
if (isXposedEnvironment) return
sPref.edit().putLong(key, value).apply() sPref.edit().putLong(key, value).apply()
makeWorldReadable() makeWorldReadable()
} }
@@ -388,6 +453,7 @@ class YukiHookModulePrefs(private val context: Context? = null) {
*/ */
inline fun <reified T> get(prefs: PrefsData<T>, value: T = prefs.value): T = when (prefs.value) { inline fun <reified T> get(prefs: PrefsData<T>, value: T = prefs.value): T = when (prefs.value) {
is String -> getString(prefs.key, value as String) as T is String -> getString(prefs.key, value as String) as T
is Set<*> -> getStringSet(prefs.key, value as? Set<String> ?: error("Key-Value type ${T::class.java.name} is not allowed")) as T
is Int -> getInt(prefs.key, value as Int) as T is Int -> getInt(prefs.key, value as Int) as T
is Float -> getFloat(prefs.key, value as Float) as T is Float -> getFloat(prefs.key, value as Float) as T
is Long -> getLong(prefs.key, value as Long) as T is Long -> getLong(prefs.key, value as Long) as T
@@ -406,6 +472,7 @@ class YukiHookModulePrefs(private val context: Context? = null) {
*/ */
inline fun <reified T> put(prefs: PrefsData<T>, value: T) = when (prefs.value) { inline fun <reified T> put(prefs: PrefsData<T>, value: T) = when (prefs.value) {
is String -> putString(prefs.key, value as String) is String -> putString(prefs.key, value as String)
is Set<*> -> putStringSet(prefs.key, value as? Set<String> ?: error("Key-Value type ${T::class.java.name} is not allowed"))
is Int -> putInt(prefs.key, value as Int) is Int -> putInt(prefs.key, value as Int)
is Float -> putFloat(prefs.key, value as Float) is Float -> putFloat(prefs.key, value as Float)
is Long -> putLong(prefs.key, value as Long) is Long -> putLong(prefs.key, value as Long)
@@ -424,6 +491,7 @@ class YukiHookModulePrefs(private val context: Context? = null) {
*/ */
fun clearCache() { fun clearCache() {
xPrefCacheKeyValueStrings.clear() xPrefCacheKeyValueStrings.clear()
xPrefCacheKeyValueStringSets.clear()
xPrefCacheKeyValueBooleans.clear() xPrefCacheKeyValueBooleans.clear()
xPrefCacheKeyValueInts.clear() xPrefCacheKeyValueInts.clear()
xPrefCacheKeyValueLongs.clear() xPrefCacheKeyValueLongs.clear()
@@ -439,4 +507,15 @@ class YukiHookModulePrefs(private val context: Context? = null) {
isUsingKeyValueCache = YukiHookAPI.Configs.isEnableModulePrefsCache isUsingKeyValueCache = YukiHookAPI.Configs.isEnableModulePrefsCache
return result() return result()
} }
/**
* 仅在模块环境执行
*
* 非模块环境使用会打印警告信息
* @param initiate 在模块环境执行
*/
private fun moduleEnvironment(initiate: () -> Unit) {
if (isXposedEnvironment.not()) initiate()
else yLoggerW(msg = "You cannot use write prefs function in Xposed Environment")
}
} }