Modify move puts functions to Editor in YukiHookModulePrefs

This commit is contained in:
2023-04-16 23:13:05 +08:00
parent f8eefd58fd
commit 1215ccf220
3 changed files with 751 additions and 378 deletions

View File

@@ -274,185 +274,85 @@ fun all(): HashMap<String, Any?>
::: :::
## remove <span class="symbol">- method</span> <h2 class="deprecated">remove - method</h2>
```kotlin:no-line-numbers
fun remove(key: String)
```
**Change Records** **Change Records**
`v1.0` `first` `v1.0` `first`
**Function Illustrate** `v1.1.9` `deprecated`
> 移除全部包含 `key` 的存储数据。 请转移到 `edit` 方法
::: warning <h2 class="deprecated">clear - method</h2>
在 (Xposed) 宿主环境下只读,无法使用。
:::
## remove <span class="symbol">- method</span>
```kotlin:no-line-numbers
inline fun <reified T> remove(prefs: PrefsData<T>)
```
**Change Records**
`v1.0.67` `added`
**Function Illustrate**
> 移除 `PrefsData.key` 的存储数据。
::: warning
在 (Xposed) 宿主环境下只读,无法使用。
:::
## clear <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun clear()
```
**Change Records** **Change Records**
`v1.0.77` `added` `v1.0.77` `added`
**Function Illustrate** `v1.1.9` `deprecated`
> 移除全部存储数据。 请转移到 `edit` 方法
::: warning <h2 class="deprecated">putString - method</h2>
在 (Xposed) 宿主环境下只读,无法使用。
:::
## putString <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putString(key: String, value: String)
```
**Change Records** **Change Records**
`v1.0` `first` `v1.0` `first`
**Function Illustrate** `v1.1.9` `deprecated`
> 存储 `String` 键值。 请转移到 `edit` 方法
::: warning <h2 class="deprecated">putStringSet - method</h2>
在 (Xposed) 宿主环境下只读,无法使用。
:::
## putStringSet <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putStringSet(key: String, value: Set<String>)
```
**Change Records** **Change Records**
`v1.0.77` `added` `v1.0.77` `added`
**Function Illustrate** `v1.1.9` `deprecated`
> 存储 `Set<String>` 键值。 请转移到 `edit` 方法
::: warning <h2 class="deprecated">putBoolean - method</h2>
在 (Xposed) 宿主环境下只读,无法使用。
:::
## putBoolean <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putBoolean(key: String, value: Boolean)
```
**Change Records** **Change Records**
`v1.0` `first` `v1.0` `first`
**Function Illustrate** `v1.1.9` `deprecated`
> 存储 `Boolean` 键值。 请转移到 `edit` 方法
::: warning <h2 class="deprecated">putInt - method</h2>
在 (Xposed) 宿主环境下只读,无法使用。
:::
## putInt <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putInt(key: String, value: Int)
```
**Change Records** **Change Records**
`v1.0` `first` `v1.0` `first`
**Function Illustrate** `v1.1.9` `deprecated`
> 存储 `Int` 键值。 请转移到 `edit` 方法
::: warning <h2 class="deprecated">putLong - method</h2>
在 (Xposed) 宿主环境下只读,无法使用。
:::
## putLong <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putLong(key: String, value: Long)
```
**Change Records** **Change Records**
`v1.0` `first` `v1.0` `first`
**Function Illustrate** `v1.1.9` `deprecated`
> 存储 `Long` 键值。 请转移到 `edit` 方法
::: warning <h2 class="deprecated">putFloat - method</h2>
在 (Xposed) 宿主环境下只读,无法使用。
:::
## putFloat <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putFloat(key: String, value: Float)
```
**Change Records** **Change Records**
`v1.0` `first` `v1.0` `first`
**Function Illustrate** `v1.1.9` `deprecated`
> 存储 `Float` 键值。 请转移到 `edit` 方法
::: warning
在 (Xposed) 宿主环境下只读,无法使用。
:::
## get <span class="symbol">- method</span> ## get <span class="symbol">- method</span>
@@ -468,19 +368,51 @@ inline fun <reified T> get(prefs: PrefsData<T>, value: T): T
> 智能获取指定类型的键值。 > 智能获取指定类型的键值。
## put <span class="symbol">- method</span> <h2 class="deprecated">put - method</h2>
```kotlin:no-line-numbers
inline fun <reified T> put(prefs: PrefsData<T>, value: T)
```
**Change Records** **Change Records**
`v1.0.67` `added` `v1.0.67` `added`
`v1.1.9` `deprecated`
请转移到 `edit` 方法
## edit <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun edit(): Editor
```
**Change Records**
`v1.1.9` `added`
**Function Illustrate** **Function Illustrate**
> 智能存储指定类型的键值 > 创建新的 `Editor`
::: warning
在 (Xposed) 宿主环境下只读,无法使用。
:::
## edit <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun edit(initiate: Editor.() -> Unit)
```
**Change Records**
`v1.1.9` `added`
**Function Illustrate**
> 创建新的 `Editor`。
自动调用 `Editor.apply` 方法。
::: warning ::: warning
@@ -508,4 +440,194 @@ fun clearCache()
下次将从 `XSharedPreferences` 重新读取。 下次将从 `XSharedPreferences` 重新读取。
在 (Xposed) 宿主环境中使用。 在 (Xposed) 宿主环境中使用。
## Editor <span class="symbol">- class</span>
```kotlin:no-line-numbers
inner class Editor internal constructor()
```
**Change Records**
`v1.1.9` `added`
**Function Illustrate**
> `YukiHookModulePrefs` 的存储代理类。
请使用 `edit` 方法来获取 `Editor`。
::: warning
在 (Xposed) 宿主环境下只读,无法使用。
:::
### remove <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun remove(key: String): Editor
```
**Change Records**
`v1.1.9` `added`
**Function Illustrate**
> 移除全部包含 `key` 的存储数据。
### remove <span class="symbol">- method</span>
```kotlin:no-line-numbers
inline fun <reified T> remove(prefs: PrefsData<T>): Editor
```
**Change Records**
`v1.1.9` `added`
**Function Illustrate**
> 移除 `PrefsData.key` 的存储数据。
### clear <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun clear(): Editor
```
**Change Records**
`v1.1.9` `added`
**Function Illustrate**
> 移除全部存储数据。
### putString <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putString(key: String, value: String): Editor
```
**Change Records**
`v1.1.9` `added`
**Function Illustrate**
> 存储 `String` 键值。
### putStringSet <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putStringSet(key: String, value: Set<String>): Editor
```
**Change Records**
`v1.1.9` `added`
**Function Illustrate**
> 存储 `Set<String>` 键值。
### putBoolean <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putBoolean(key: String, value: Boolean): Editor
```
**Change Records**
`v1.1.9` `added`
**Function Illustrate**
> 存储 `Boolean` 键值。
### putInt <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putInt(key: String, value: Int): Editor
```
**Change Records**
`v1.1.9` `added`
**Function Illustrate**
> 存储 `Int` 键值。
### putLong <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putLong(key: String, value: Long): Editor
```
**Change Records**
`v1.1.9` `added`
**Function Illustrate**
> 存储 `Long` 键值。
### putFloat <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putFloat(key: String, value: Float): Editor
```
**Change Records**
`v1.1.9` `added`
**Function Illustrate**
> 存储 `Float` 键值。
### put <span class="symbol">- method</span>
```kotlin:no-line-numbers
inline fun <reified T> put(prefs: PrefsData<T>, value: T): Editor
```
**Change Records**
`v1.1.9` `added`
**Function Illustrate**
> 智能存储指定类型的键值。
### commit <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun commit(): Boolean
```
**Change Records**
`v1.1.9` `added`
**Function Illustrate**
> 提交更改 (同步)。
### apply <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun apply()
```
**Change Records**
`v1.1.9` `added`
**Function Illustrate**
> 提交更改 (异步)。

View File

@@ -266,185 +266,85 @@ fun all(): HashMap<String, Any?>
::: :::
## remove <span class="symbol">- method</span> <h2 class="deprecated">remove - method</h2>
```kotlin:no-line-numbers
fun remove(key: String)
```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
**功能描述** `v1.1.9` `作废`
> 移除全部包含 `key` 的存储数据。 请转移到 `edit` 方法
::: warning <h2 class="deprecated">clear - method</h2>
在 (Xposed) 宿主环境下只读,无法使用。
:::
## remove <span class="symbol">- method</span>
```kotlin:no-line-numbers
inline fun <reified T> remove(prefs: PrefsData<T>)
```
**变更记录**
`v1.0.67` `新增`
**功能描述**
> 移除 `PrefsData.key` 的存储数据。
::: warning
在 (Xposed) 宿主环境下只读,无法使用。
:::
## clear <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun clear()
```
**变更记录** **变更记录**
`v1.0.77` `新增` `v1.0.77` `新增`
**功能描述** `v1.1.9` `作废`
> 移除全部存储数据。 请转移到 `edit` 方法
::: warning <h2 class="deprecated">putString - method</h2>
在 (Xposed) 宿主环境下只读,无法使用。
:::
## putString <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putString(key: String, value: String)
```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
**功能描述** `v1.1.9` `作废`
> 存储 `String` 键值。 请转移到 `edit` 方法
::: warning <h2 class="deprecated">putStringSet - method</h2>
在 (Xposed) 宿主环境下只读,无法使用。
:::
## putStringSet <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putStringSet(key: String, value: Set<String>)
```
**变更记录** **变更记录**
`v1.0.77` `新增` `v1.0.77` `新增`
**功能描述** `v1.1.9` `作废`
> 存储 `Set<String>` 键值。 请转移到 `edit` 方法
::: warning <h2 class="deprecated">putBoolean - method</h2>
在 (Xposed) 宿主环境下只读,无法使用。
:::
## putBoolean <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putBoolean(key: String, value: Boolean)
```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
**功能描述** `v1.1.9` `作废`
> 存储 `Boolean` 键值。 请转移到 `edit` 方法
::: warning <h2 class="deprecated">putInt - method</h2>
在 (Xposed) 宿主环境下只读,无法使用。
:::
## putInt <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putInt(key: String, value: Int)
```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
**功能描述** `v1.1.9` `作废`
> 存储 `Int` 键值。 请转移到 `edit` 方法
::: warning <h2 class="deprecated">putLong - method</h2>
在 (Xposed) 宿主环境下只读,无法使用。
:::
## putLong <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putLong(key: String, value: Long)
```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
**功能描述** `v1.1.9` `作废`
> 存储 `Long` 键值。 请转移到 `edit` 方法
::: warning <h2 class="deprecated">putFloat - method</h2>
在 (Xposed) 宿主环境下只读,无法使用。
:::
## putFloat <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putFloat(key: String, value: Float)
```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
**功能描述** `v1.1.9` `作废`
> 存储 `Float` 键值。 请转移到 `edit` 方法
::: warning
在 (Xposed) 宿主环境下只读,无法使用。
:::
## get <span class="symbol">- method</span> ## get <span class="symbol">- method</span>
@@ -460,19 +360,51 @@ inline fun <reified T> get(prefs: PrefsData<T>, value: T): T
> 智能获取指定类型的键值。 > 智能获取指定类型的键值。
## put <span class="symbol">- method</span> <h2 class="deprecated">put - method</h2>
```kotlin:no-line-numbers
inline fun <reified T> put(prefs: PrefsData<T>, value: T)
```
**变更记录** **变更记录**
`v1.0.67` `新增` `v1.0.67` `新增`
`v1.1.9` `作废`
请转移到 `edit` 方法
## edit <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun edit(): Editor
```
**变更记录**
`v1.1.9` `新增`
**功能描述** **功能描述**
> 智能存储指定类型的键值 > 创建新的 `Editor`
::: warning
在 (Xposed) 宿主环境下只读,无法使用。
:::
## edit <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun edit(initiate: Editor.() -> Unit)
```
**变更记录**
`v1.1.9` `新增`
**功能描述**
> 创建新的 `Editor`。
自动调用 `Editor.apply` 方法。
::: warning ::: warning
@@ -500,4 +432,194 @@ fun clearCache()
下次将从 `XSharedPreferences` 重新读取。 下次将从 `XSharedPreferences` 重新读取。
在 (Xposed) 宿主环境中使用。 在 (Xposed) 宿主环境中使用。
## Editor <span class="symbol">- class</span>
```kotlin:no-line-numbers
inner class Editor internal constructor()
```
**变更记录**
`v1.1.9` `新增`
**功能描述**
> `YukiHookModulePrefs` 的存储代理类。
请使用 `edit` 方法来获取 `Editor`。
::: warning
在 (Xposed) 宿主环境下只读,无法使用。
:::
### remove <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun remove(key: String): Editor
```
**变更记录**
`v1.1.9` `新增`
**功能描述**
> 移除全部包含 `key` 的存储数据。
### remove <span class="symbol">- method</span>
```kotlin:no-line-numbers
inline fun <reified T> remove(prefs: PrefsData<T>): Editor
```
**变更记录**
`v1.1.9` `新增`
**功能描述**
> 移除 `PrefsData.key` 的存储数据。
### clear <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun clear(): Editor
```
**变更记录**
`v1.1.9` `新增`
**功能描述**
> 移除全部存储数据。
### putString <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putString(key: String, value: String): Editor
```
**变更记录**
`v1.1.9` `新增`
**功能描述**
> 存储 `String` 键值。
### putStringSet <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putStringSet(key: String, value: Set<String>): Editor
```
**变更记录**
`v1.1.9` `新增`
**功能描述**
> 存储 `Set<String>` 键值。
### putBoolean <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putBoolean(key: String, value: Boolean): Editor
```
**变更记录**
`v1.1.9` `新增`
**功能描述**
> 存储 `Boolean` 键值。
### putInt <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putInt(key: String, value: Int): Editor
```
**变更记录**
`v1.1.9` `新增`
**功能描述**
> 存储 `Int` 键值。
### putLong <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putLong(key: String, value: Long): Editor
```
**变更记录**
`v1.1.9` `新增`
**功能描述**
> 存储 `Long` 键值。
### putFloat <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun putFloat(key: String, value: Float): Editor
```
**变更记录**
`v1.1.9` `新增`
**功能描述**
> 存储 `Float` 键值。
### put <span class="symbol">- method</span>
```kotlin:no-line-numbers
inline fun <reified T> put(prefs: PrefsData<T>, value: T): Editor
```
**变更记录**
`v1.1.9` `新增`
**功能描述**
> 智能存储指定类型的键值。
### commit <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun commit(): Boolean
```
**变更记录**
`v1.1.9` `新增`
**功能描述**
> 提交更改 (同步)。
### apply <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun apply()
```
**变更记录**
`v1.1.9` `新增`
**功能描述**
> 提交更改 (异步)。

View File

@@ -398,6 +398,33 @@ class YukiHookModulePrefs private constructor(private var context: Context? = nu
it it
} }
/**
* 智能获取指定类型的键值
* @param prefs 键值实例
* @param value 默认值 - 未指定默认为 [prefs] 中的 [PrefsData.value]
* @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
/**
* 智能获取指定类型的键值
*
* 封装方法以调用内联方法
* @param key 键值
* @param value 默认值
* @return [Any]
*/
@PublishedApi
internal fun getPrefsData(key: String, value: Any?): Any = when (value) {
is String -> getString(key, value)
is Set<*> -> getStringSet(key, value as? Set<String> ?: error("Key-Value type ${value.javaClass.name} is not allowed"))
is Int -> getInt(key, value)
is Float -> getFloat(key, value)
is Long -> getLong(key, value)
is Boolean -> getBoolean(key, value)
else -> error("Key-Value type ${value?.javaClass?.name} is not allowed")
}
/** /**
* 判断当前是否包含 [key] 键值的数据 * 判断当前是否包含 [key] 键值的数据
* *
@@ -426,193 +453,138 @@ class YukiHookModulePrefs private constructor(private var context: Context? = nu
/** /**
* 移除全部包含 [key] 的存储数据 * 移除全部包含 [key] 的存储数据
* *
* - 在模块环境中使用 * - ❗此方法已弃用 - 在之后的版本中将直接被删除
* *
* - ❗在 (Xposed) 宿主环境下只读 - 无法使用 * - ❗请现在转移到 [edit] 方法
* @param key 键值名称 * @param key 键值名称
*/ */
fun remove(key: String) = moduleEnvironment { @Deprecated(message = "此方法因为性能问题已被作废,请转移到新用法", ReplaceWith("edit { remove(key) }"))
sPrefs.edit().remove(key).apply() fun remove(key: String) = edit { remove(key) }
makeWorldReadable()
}
/** /**
* 移除 [PrefsData.key] 的存储数据 * 移除 [PrefsData.key] 的存储数据
* *
* - 在模块环境中使用 * - ❗此方法已弃用 - 在之后的版本中将直接被删除
* *
* - ❗在 (Xposed) 宿主环境下只读 - 无法使用 * - ❗请现在转移到 [edit] 方法
* @param prefs 键值实例 * @param prefs 键值实例
*/ */
inline fun <reified T> remove(prefs: PrefsData<T>) = remove(prefs.key) @Deprecated(message = "此方法因为性能问题已被作废,请转移到新用法", ReplaceWith("edit { remove(prefs) }"))
inline fun <reified T> remove(prefs: PrefsData<T>) = edit { remove(prefs) }
/** /**
* 移除全部存储数据 * 移除全部存储数据
* *
* - 在模块环境中使用 * - ❗此方法已弃用 - 在之后的版本中将直接被删除
* *
* - ❗在 (Xposed) 宿主环境下只读 - 无法使用 * - ❗请现在转移到 [edit] 方法
*/ */
fun clear() = moduleEnvironment { @Deprecated(message = "此方法因为性能问题已被作废,请转移到新用法", ReplaceWith("edit { clear() }"))
sPrefs.edit().clear().apply() fun clear() = edit { clear() }
makeWorldReadable()
}
/** /**
* 存储 [String] 键值 * 存储 [String] 键值
* *
* - 建议使用 [PrefsData] 创建模板并使用 [put] 存储数据 * - ❗此方法已弃用 - 在之后的版本中将直接被删除
* *
* - 在模块环境中使用 * - ❗请现在转移到 [edit] 方法
*
* - ❗在 (Xposed) 宿主环境下只读 - 无法使用
* @param key 键值名称 * @param key 键值名称
* @param value 键值数据 * @param value 键值数据
*/ */
fun putString(key: String, value: String) = moduleEnvironment { @Deprecated(message = "此方法因为性能问题已被作废,请转移到新用法", ReplaceWith("edit { putString(key, value) }"))
sPrefs.edit().putString(key, value).apply() fun putString(key: String, value: String) = edit { putString(key, value) }
makeWorldReadable()
}
/** /**
* 存储 [Set]<[String]> 键值 * 存储 [Set]<[String]> 键值
* *
* - 建议使用 [PrefsData] 创建模板并使用 [put] 存储数据 * - ❗此方法已弃用 - 在之后的版本中将直接被删除
* *
* - 在模块环境中使用 * - ❗请现在转移到 [edit] 方法
*
* - ❗在 (Xposed) 宿主环境下只读 - 无法使用
* @param key 键值名称 * @param key 键值名称
* @param value 键值数据 * @param value 键值数据
*/ */
fun putStringSet(key: String, value: Set<String>) = moduleEnvironment { @Deprecated(message = "此方法因为性能问题已被作废,请转移到新用法", ReplaceWith("edit { putStringSet(key, value) }"))
sPrefs.edit().putStringSet(key, value).apply() fun putStringSet(key: String, value: Set<String>) = edit { putStringSet(key, value) }
makeWorldReadable()
}
/** /**
* 存储 [Boolean] 键值 * 存储 [Boolean] 键值
* *
* - 建议使用 [PrefsData] 创建模板并使用 [put] 存储数据 * - ❗此方法已弃用 - 在之后的版本中将直接被删除
* *
* - 在模块环境中使用 * - ❗请现在转移到 [edit] 方法
*
* - ❗在 (Xposed) 宿主环境下只读 - 无法使用
* @param key 键值名称 * @param key 键值名称
* @param value 键值数据 * @param value 键值数据
*/ */
fun putBoolean(key: String, value: Boolean) = moduleEnvironment { @Deprecated(message = "此方法因为性能问题已被作废,请转移到新用法", ReplaceWith("edit { putBoolean(key, value) }"))
sPrefs.edit().putBoolean(key, value).apply() fun putBoolean(key: String, value: Boolean) = edit { putBoolean(key, value) }
makeWorldReadable()
}
/** /**
* 存储 [Int] 键值 * 存储 [Int] 键值
* *
* - 建议使用 [PrefsData] 创建模板并使用 [put] 存储数据 * - ❗此方法已弃用 - 在之后的版本中将直接被删除
* *
* - 在模块环境中使用 * - ❗请现在转移到 [edit] 方法
*
* - ❗在 (Xposed) 宿主环境下只读 - 无法使用
* @param key 键值名称 * @param key 键值名称
* @param value 键值数据 * @param value 键值数据
*/ */
fun putInt(key: String, value: Int) = moduleEnvironment { @Deprecated(message = "此方法因为性能问题已被作废,请转移到新用法", ReplaceWith("edit { putInt(key, value) }"))
sPrefs.edit().putInt(key, value).apply() fun putInt(key: String, value: Int) = edit { putInt(key, value) }
makeWorldReadable()
}
/** /**
* 存储 [Float] 键值 * 存储 [Float] 键值
* *
* - 建议使用 [PrefsData] 创建模板并使用 [put] 存储数据 * - ❗此方法已弃用 - 在之后的版本中将直接被删除
* *
* - 在模块环境中使用 * - ❗请现在转移到 [edit] 方法
*
* - ❗在 (Xposed) 宿主环境下只读 - 无法使用
* @param key 键值名称 * @param key 键值名称
* @param value 键值数据 * @param value 键值数据
*/ */
fun putFloat(key: String, value: Float) = moduleEnvironment { @Deprecated(message = "此方法因为性能问题已被作废,请转移到新用法", ReplaceWith("edit { putFloat(key, value) }"))
sPrefs.edit().putFloat(key, value).apply() fun putFloat(key: String, value: Float) = edit { putFloat(key, value) }
makeWorldReadable()
}
/** /**
* 存储 [Long] 键值 * 存储 [Long] 键值
* *
* - 建议使用 [PrefsData] 创建模板并使用 [put] 存储数据 * - ❗此方法已弃用 - 在之后的版本中将直接被删除
* *
* - 在模块环境中使用 * - ❗请现在转移到 [edit] 方法
*
* - ❗在 (Xposed) 宿主环境下只读 - 无法使用
* @param key 键值名称 * @param key 键值名称
* @param value 键值数据 * @param value 键值数据
*/ */
fun putLong(key: String, value: Long) = moduleEnvironment { @Deprecated(message = "此方法因为性能问题已被作废,请转移到新用法", ReplaceWith("edit { putLong(key, value) }"))
sPrefs.edit().putLong(key, value).apply() fun putLong(key: String, value: Long) = edit { putLong(key, value) }
makeWorldReadable()
}
/**
* 智能获取指定类型的键值
* @param prefs 键值实例
* @param value 默认值 - 未指定默认为 [prefs] 中的 [PrefsData.value]
* @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
/** /**
* 智能存储指定类型的键值 * 智能存储指定类型的键值
* *
* - 在模块环境中使用 * - ❗此方法已弃用 - 在之后的版本中将直接被删除
* *
* - ❗在 (Xposed) 宿主环境下只读 - 无法使用 * - ❗请现在转移到 [edit] 方法
* @param prefs 键值实例
* @param value 要存储的值 - 只能是 [String]、[Set]<[String]>、[Int]、[Float]、[Long]、[Boolean]
*/ */
inline fun <reified T> put(prefs: PrefsData<T>, value: T) = putPrefsData(prefs.key, value) @Deprecated(message = "此方法因为性能问题已被作废,请转移到新用法", ReplaceWith("edit { put(prefs, value) }"))
inline fun <reified T> put(prefs: PrefsData<T>, value: T) = edit { put(prefs, value) }
/** /**
* 智能获取指定类型的键值 * 创建新的 [Editor]
*
* 封装方法以调用内联方法
* @param key 键值
* @param value 默认值
* @return [Any]
*/
@PublishedApi
internal fun getPrefsData(key: String, value: Any?): Any = when (value) {
is String -> getString(key, value)
is Set<*> -> getStringSet(key, value as? Set<String> ?: error("Key-Value type ${value.javaClass.name} is not allowed"))
is Int -> getInt(key, value)
is Float -> getFloat(key, value)
is Long -> getLong(key, value)
is Boolean -> getBoolean(key, value)
else -> error("Key-Value type ${value?.javaClass?.name} is not allowed")
}
/**
* 智能存储指定类型的键值
*
* 封装方法以调用内联方法
* *
* - 在模块环境中使用 * - 在模块环境中使用
* *
* - ❗在 (Xposed) 宿主环境下只读 - 无法使用 * - ❗在 (Xposed) 宿主环境下只读 - 无法使用
* @param key 键值 * @return [Editor]
* @param value 要存储的值 - 只能是 [String]、[Set]<[String]>、[Int]、[Float]、[Long]、[Boolean]
*/ */
@PublishedApi fun edit() = Editor()
internal fun putPrefsData(key: String, value: Any?) = when (value) {
is String -> putString(key, value) /**
is Set<*> -> putStringSet(key, value as? Set<String> ?: error("Key-Value type ${value.javaClass.name} is not allowed")) * 创建新的 [Editor]
is Int -> putInt(key, value) *
is Float -> putFloat(key, value) * 自动调用 [Editor.apply] 方法
is Long -> putLong(key, value) *
is Boolean -> putBoolean(key, value) * - 在模块环境中使用
else -> error("Key-Value type ${value?.javaClass?.name} is not allowed") *
} * - ❗在 (Xposed) 宿主环境下只读 - 无法使用
* @param initiate 方法体
*/
fun edit(initiate: Editor.() -> Unit = {}) = edit().apply(initiate).apply()
/** /**
* 清除 [XSharedPreferences] 中缓存的键值数据 * 清除 [XSharedPreferences] 中缓存的键值数据
@@ -638,13 +610,170 @@ class YukiHookModulePrefs private constructor(private var context: Context? = nu
} }
/** /**
* 仅在模块环境执行 * [YukiHookModulePrefs] 的存储代理类
* *
* 非模块环境使用会打印警告信息 * - ❗请使用 [edit] 方法来获取 [Editor]
* @param callback 在模块环境执行 *
* - 在模块环境中使用
*
* - ❗在 (Xposed) 宿主环境下只读 - 无法使用
*/ */
private inline fun moduleEnvironment(callback: () -> Unit) { inner class Editor internal constructor() {
if (isXposedEnvironment.not()) callback()
else yLoggerW(msg = "YukiHookModulePrefs write operation not allowed in Xposed Environment") /** 创建新的存储代理类 */
private var editor = runCatching { sPrefs.edit() }.getOrNull()
/**
* 移除全部包含 [key] 的存储数据
* @param key 键值名称
* @return [Editor]
*/
fun remove(key: String) = moduleEnvironment {
editor?.remove(key)
makeWorldReadable()
}
/**
* 移除 [PrefsData.key] 的存储数据
* @param prefs 键值实例
* @return [Editor]
*/
inline fun <reified T> remove(prefs: PrefsData<T>) = remove(prefs.key)
/**
* 移除全部存储数据
* @return [Editor]
*/
fun clear() = moduleEnvironment {
editor?.clear()
makeWorldReadable()
}
/**
* 存储 [String] 键值
*
* - 建议使用 [PrefsData] 创建模板并使用 [put] 存储数据
* @param key 键值名称
* @param value 键值数据
* @return [Editor]
*/
fun putString(key: String, value: String) = moduleEnvironment {
editor?.putString(key, value)
makeWorldReadable()
}
/**
* 存储 [Set]<[String]> 键值
*
* - 建议使用 [PrefsData] 创建模板并使用 [put] 存储数据
* @param key 键值名称
* @param value 键值数据
* @return [Editor]
*/
fun putStringSet(key: String, value: Set<String>) = moduleEnvironment {
editor?.putStringSet(key, value)
makeWorldReadable()
}
/**
* 存储 [Boolean] 键值
*
* - 建议使用 [PrefsData] 创建模板并使用 [put] 存储数据
* @param key 键值名称
* @param value 键值数据
* @return [Editor]
*/
fun putBoolean(key: String, value: Boolean) = moduleEnvironment {
editor?.putBoolean(key, value)
makeWorldReadable()
}
/**
* 存储 [Int] 键值
*
* - 建议使用 [PrefsData] 创建模板并使用 [put] 存储数据
* @param key 键值名称
* @param value 键值数据
* @return [Editor]
*/
fun putInt(key: String, value: Int) = moduleEnvironment {
editor?.putInt(key, value)
makeWorldReadable()
}
/**
* 存储 [Float] 键值
*
* - 建议使用 [PrefsData] 创建模板并使用 [put] 存储数据
* @param key 键值名称
* @param value 键值数据
* @return [Editor]
*/
fun putFloat(key: String, value: Float) = moduleEnvironment {
editor?.putFloat(key, value)
makeWorldReadable()
}
/**
* 存储 [Long] 键值
*
* - 建议使用 [PrefsData] 创建模板并使用 [put] 存储数据
* @param key 键值名称
* @param value 键值数据
* @return [Editor]
*/
fun putLong(key: String, value: Long) = moduleEnvironment {
editor?.putLong(key, value)
makeWorldReadable()
}
/**
* 智能存储指定类型的键值
* @param prefs 键值实例
* @param value 要存储的值 - 只能是 [String]、[Set]<[String]>、[Int]、[Float]、[Long]、[Boolean]
* @return [Editor]
*/
inline fun <reified T> put(prefs: PrefsData<T>, value: T) = putPrefsData(prefs.key, value)
/**
* 智能存储指定类型的键值
*
* 封装方法以调用内联方法
* @param key 键值
* @param value 要存储的值 - 只能是 [String]、[Set]<[String]>、[Int]、[Float]、[Long]、[Boolean]
* @return [Editor]
*/
@PublishedApi
internal fun putPrefsData(key: String, value: Any?) = when (value) {
is String -> putString(key, value)
is Set<*> -> putStringSet(key, value as? Set<String> ?: error("Key-Value type ${value.javaClass.name} is not allowed"))
is Int -> putInt(key, value)
is Float -> putFloat(key, value)
is Long -> putLong(key, value)
is Boolean -> putBoolean(key, value)
else -> error("Key-Value type ${value?.javaClass?.name} is not allowed")
}
/**
* 提交更改 (同步)
* @return [Boolean] 是否成功
*/
fun commit() = editor?.commit()?.also { makeWorldReadable() } ?: false
/** 提交更改 (异步) */
fun apply() = editor?.apply().also { makeWorldReadable() } ?: Unit
/**
* 仅在模块环境执行
*
* 非模块环境使用会打印警告信息
* @param callback 在模块环境执行
* @return [Editor]
*/
private inline fun moduleEnvironment(callback: () -> Unit): Editor {
if (isXposedEnvironment.not()) callback()
else yLoggerW(msg = "YukiHookModulePrefs.Editor not allowed in Xposed Environment")
return this
}
} }
} }