Make YukiHookModulePrefs singleton

This commit is contained in:
2022-05-16 15:21:26 +08:00
parent 359b72f445
commit e97e2367d3
5 changed files with 26 additions and 11 deletions

View File

@@ -1,7 +1,7 @@
## YukiHookModulePrefs [class] ## YukiHookModulePrefs [class]
```kotlin ```kotlin
class YukiHookModulePrefs(private val context: Context?) class YukiHookModulePrefs(private var context: Context?)
``` ```
**变更记录** **变更记录**

View File

@@ -539,7 +539,7 @@ class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
// 可以使用但是不推荐 // ❗为防止存在多个实例 - 不要这样使用
YukiHookModulePrefs(this).getBoolean("test_data") YukiHookModulePrefs(this).getBoolean("test_data")
// ✅ 推荐的使用方法 // ✅ 推荐的使用方法
modulePrefs.getBoolean("test_data") modulePrefs.getBoolean("test_data")

View File

@@ -77,14 +77,14 @@ fun YukiHookXposedInitProxy.encase(vararg hooker: YukiBaseHooker) = YukiHookAPI.
* 获取模块的存取对象 * 获取模块的存取对象
* @return [YukiHookModulePrefs] * @return [YukiHookModulePrefs]
*/ */
val Context.modulePrefs get() = YukiHookModulePrefs(context = this) val Context.modulePrefs get() = YukiHookModulePrefs.instance(context = this)
/** /**
* 获取模块的存取对象 * 获取模块的存取对象
* @param name 自定义 Sp 存储名称 * @param name 自定义 Sp 存储名称
* @return [YukiHookModulePrefs] * @return [YukiHookModulePrefs]
*/ */
fun Context.modulePrefs(name: String) = YukiHookModulePrefs(context = this).name(name) fun Context.modulePrefs(name: String) = YukiHookModulePrefs.instance(context = this).name(name)
/** /**
* 获取当前进程名称 * 获取当前进程名称

View File

@@ -150,7 +150,7 @@ open class PackageParam(@PublishedApi internal var wrapper: PackageParamWrapper?
* - ❗作为 Hook API 装载时无法使用 - 会抛出异常 * - ❗作为 Hook API 装载时无法使用 - 会抛出异常
* @return [YukiHookModulePrefs] * @return [YukiHookModulePrefs]
*/ */
val prefs by lazy { YukiHookModulePrefs() } val prefs get() = YukiHookModulePrefs.instance()
/** /**
* 获得当前使用的存取数据对象缓存实例 * 获得当前使用的存取数据对象缓存实例

View File

@@ -27,7 +27,7 @@
*/ */
@file:Suppress( @file:Suppress(
"SetWorldReadable", "CommitPrefEdits", "DEPRECATION", "WorldReadableFiles", "SetWorldReadable", "CommitPrefEdits", "DEPRECATION", "WorldReadableFiles",
"unused", "UNCHECKED_CAST", "MemberVisibilityCanBePrivate" "unused", "UNCHECKED_CAST", "MemberVisibilityCanBePrivate", "StaticFieldLeak"
) )
package com.highcapable.yukihookapi.hook.xposed.prefs package com.highcapable.yukihookapi.hook.xposed.prefs
@@ -64,19 +64,34 @@ import java.io.File
* - 详情请参考 [API 文档 - YukiHookModulePrefs](https://fankes.github.io/YukiHookAPI/#/api/document?id=yukihookmoduleprefs-class) * - 详情请参考 [API 文档 - YukiHookModulePrefs](https://fankes.github.io/YukiHookAPI/#/api/document?id=yukihookmoduleprefs-class)
* @param context 上下文实例 - 默认空 * @param context 上下文实例 - 默认空
*/ */
class YukiHookModulePrefs(private val context: Context? = null) { class YukiHookModulePrefs(private var context: Context? = null) {
internal companion object { internal companion object {
/** 当前 [YukiHookModulePrefs] 单例 */
private var instance: YukiHookModulePrefs? = null
/**
* 获取 [YukiHookModulePrefs] 单例
* @param context 实例 - Xposed 环境为空
* @return [YukiHookModulePrefs]
*/
internal fun instance(context: Context? = null) =
instance?.apply { this.context = context } ?: YukiHookModulePrefs(context).apply { instance = this }
/** /**
* 设置全局可读可写 * 设置全局可读可写
* @param context 实例 * @param context 实例
* @param prefsFileName Sp 文件名 * @param prefsFileName Sp 文件名
*/ */
internal fun makeWorldReadable(context: Context?, prefsFileName: String) = runCatching { internal fun makeWorldReadable(context: Context?, prefsFileName: String) {
File(File(context!!.applicationInfo.dataDir, "shared_prefs"), prefsFileName).apply { runCatching {
setReadable(true, false) context?.also {
setExecutable(true, false) File(File(it.applicationInfo.dataDir, "shared_prefs"), prefsFileName).apply {
setReadable(true, false)
setExecutable(true, false)
}
}
} }
} }
} }