From cacfcbdb1b47933e3f3e6c24cac68888192ae257 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 11 Sep 2022 22:06:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/help/storage/Backup.kt | 6 ++- .../legado/app/help/storage/BackupConfig.kt | 3 ++ .../io/legado/app/help/storage/Preferences.kt | 52 ------------------- .../io/legado/app/help/storage/Restore.kt | 6 ++- .../legado/app/utils/PreferencesExtensions.kt | 40 ++++++++++++++ 5 files changed, 51 insertions(+), 56 deletions(-) delete mode 100644 app/src/main/java/io/legado/app/help/storage/Preferences.kt diff --git a/app/src/main/java/io/legado/app/help/storage/Backup.kt b/app/src/main/java/io/legado/app/help/storage/Backup.kt index 247b56cd9..6ae415424 100644 --- a/app/src/main/java/io/legado/app/help/storage/Backup.kt +++ b/app/src/main/java/io/legado/app/help/storage/Backup.kt @@ -21,7 +21,9 @@ import java.io.File import java.io.FileOutputStream import java.util.concurrent.TimeUnit - +/** + * 备份 + */ object Backup { val backupPath: String by lazy { @@ -102,7 +104,7 @@ object Backup { .writeText(GSON.toJson(it)) } ensureActive() - Preferences.getSharedPreferences(appCtx, backupPath, "config")?.let { sp -> + appCtx.getSharedPreferences(backupPath, "config")?.let { sp -> val edit = sp.edit() appCtx.defaultSharedPreferences.all.forEach { (key, value) -> if (BackupConfig.keyIsNotIgnore(key)) { diff --git a/app/src/main/java/io/legado/app/help/storage/BackupConfig.kt b/app/src/main/java/io/legado/app/help/storage/BackupConfig.kt index a1c2e864b..e7e099bc2 100644 --- a/app/src/main/java/io/legado/app/help/storage/BackupConfig.kt +++ b/app/src/main/java/io/legado/app/help/storage/BackupConfig.kt @@ -7,6 +7,9 @@ import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonObject import splitties.init.appCtx +/** + * 备份配置 + */ object BackupConfig { private val ignoreConfigPath = FileUtils.getPath(appCtx.filesDir, "restoreIgnore.json") diff --git a/app/src/main/java/io/legado/app/help/storage/Preferences.kt b/app/src/main/java/io/legado/app/help/storage/Preferences.kt deleted file mode 100644 index c0fbdd6c8..000000000 --- a/app/src/main/java/io/legado/app/help/storage/Preferences.kt +++ /dev/null @@ -1,52 +0,0 @@ -package io.legado.app.help.storage - -import android.annotation.SuppressLint -import android.app.Activity -import android.content.Context -import android.content.ContextWrapper -import android.content.SharedPreferences -import io.legado.app.utils.printOnDebug - - -import java.io.File - -object Preferences { - - /** - * 用反射生成 SharedPreferences - * @param context - * @param dir - * @param fileName 文件名,不需要 '.xml' 后缀 - * @return - */ - @SuppressLint("DiscouragedPrivateApi") - fun getSharedPreferences( - context: Context, - dir: String, - fileName: String - ): SharedPreferences? { - try { - // 获取 ContextWrapper对象中的mBase变量。该变量保存了 ContextImpl 对象 - val fieldMBase = ContextWrapper::class.java.getDeclaredField("mBase") - fieldMBase.isAccessible = true - // 获取 mBase变量 - val objMBase = fieldMBase.get(context) - // 获取 ContextImpl。mPreferencesDir变量,该变量保存了数据文件的保存路径 - val fieldMPreferencesDir = objMBase.javaClass.getDeclaredField("mPreferencesDir") - fieldMPreferencesDir.isAccessible = true - // 创建自定义路径 - val file = File(dir) - // 修改mPreferencesDir变量的值 - fieldMPreferencesDir.set(objMBase, file) - // 返回修改路径以后的 SharedPreferences :%FILE_PATH%/%fileName%.xml - return context.getSharedPreferences(fileName, Activity.MODE_PRIVATE) - } catch (e: NoSuchFieldException) { - e.printOnDebug() - } catch (e: IllegalArgumentException) { - e.printOnDebug() - } catch (e: IllegalAccessException) { - e.printOnDebug() - } - return null - } -} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/storage/Restore.kt b/app/src/main/java/io/legado/app/help/storage/Restore.kt index 2bd99b040..2290d25d5 100644 --- a/app/src/main/java/io/legado/app/help/storage/Restore.kt +++ b/app/src/main/java/io/legado/app/help/storage/Restore.kt @@ -26,7 +26,9 @@ import java.io.File import java.io.FileInputStream import java.io.FileOutputStream - +/** + * 恢复 + */ object Restore { suspend fun restore(context: Context, path: String) { @@ -165,7 +167,7 @@ object Restore { AppLog.put("恢复阅读界面出错\n${e.localizedMessage}", e) } } - Preferences.getSharedPreferences(appCtx, path, "config")?.all?.let { map -> + appCtx.getSharedPreferences(path, "config")?.all?.let { map -> val edit = appCtx.defaultSharedPreferences.edit() map.forEach { (key, value) -> if (BackupConfig.keyIsNotIgnore(key)) { diff --git a/app/src/main/java/io/legado/app/utils/PreferencesExtensions.kt b/app/src/main/java/io/legado/app/utils/PreferencesExtensions.kt index 58498a28a..193f773c1 100644 --- a/app/src/main/java/io/legado/app/utils/PreferencesExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/PreferencesExtensions.kt @@ -2,9 +2,49 @@ package io.legado.app.utils +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.ContextWrapper import android.content.SharedPreferences import androidx.core.content.edit +import java.io.File +/** + * 获取自定义路径的SharedPreferences, 用反射生成 SharedPreferences + * @param dir 目录路径 + * @param fileName 文件名,不需要 '.xml' 后缀 + * @return SharedPreferences + */ +@SuppressLint("DiscouragedPrivateApi") +fun Context.getSharedPreferences( + dir: String, + fileName: String +): SharedPreferences? { + try { + // 获取 ContextWrapper对象中的mBase变量。该变量保存了 ContextImpl 对象 + val fieldMBase = ContextWrapper::class.java.getDeclaredField("mBase") + fieldMBase.isAccessible = true + // 获取 mBase变量 + val objMBase = fieldMBase.get(this) + // 获取 ContextImpl。mPreferencesDir变量,该变量保存了数据文件的保存路径 + val fieldMPreferencesDir = objMBase.javaClass.getDeclaredField("mPreferencesDir") + fieldMPreferencesDir.isAccessible = true + // 创建自定义路径 + val file = File(dir) + // 修改mPreferencesDir变量的值 + fieldMPreferencesDir.set(objMBase, file) + // 返回修改路径以后的 SharedPreferences :%FILE_PATH%/%fileName%.xml + return getSharedPreferences(fileName, Activity.MODE_PRIVATE) + } catch (e: NoSuchFieldException) { + e.printOnDebug() + } catch (e: IllegalArgumentException) { + e.printOnDebug() + } catch (e: IllegalAccessException) { + e.printOnDebug() + } + return null +} fun SharedPreferences.getString(key: String): String? { return getString(key, null)