|
|
@@ -4,7 +4,6 @@ import android.content.Context
|
|
|
import android.database.sqlite.SQLiteConstraintException
|
|
|
import android.net.Uri
|
|
|
import androidx.appcompat.app.AppCompatDelegate
|
|
|
-import androidx.core.content.edit
|
|
|
import androidx.documentfile.provider.DocumentFile
|
|
|
import io.legado.app.BuildConfig
|
|
|
import io.legado.app.R
|
|
|
@@ -39,6 +38,7 @@ import io.legado.app.help.book.isLocal
|
|
|
import io.legado.app.help.book.upType
|
|
|
import io.legado.app.help.config.AppConfigStore
|
|
|
import io.legado.app.help.config.LocalConfig
|
|
|
+import io.legado.app.help.config.DsSync
|
|
|
import io.legado.app.help.config.ThemeConfigStore
|
|
|
import io.legado.app.help.config.ReadBookConfig
|
|
|
import io.legado.app.ui.config.otherConfig.OtherConfig
|
|
|
@@ -50,7 +50,6 @@ import io.legado.app.utils.FileUtils
|
|
|
import io.legado.app.utils.GSON
|
|
|
import io.legado.app.utils.LogUtils
|
|
|
import io.legado.app.utils.compress.ZipUtils
|
|
|
-import io.legado.app.utils.defaultSharedPreferences
|
|
|
import io.legado.app.utils.fromJsonArray
|
|
|
import io.legado.app.utils.getPrefString
|
|
|
import io.legado.app.utils.isContentScheme
|
|
|
@@ -397,68 +396,17 @@ object Restore : KoinComponent {
|
|
|
}
|
|
|
|
|
|
private suspend fun applyConfigMap(map: Map<String, Any?>, aes: BackupAES) {
|
|
|
- val finalMap = mutableMapOf<String, Any>()
|
|
|
- val legacyBookInfoBackground = map[PreferKey.bookInfoBackgroundBlur] as? String
|
|
|
- val restoreNetworkCoverBackground =
|
|
|
- legacyBookInfoBackground != null &&
|
|
|
- PreferKey.bookInfoNetworkCoverBackground !in map &&
|
|
|
- BackupConfig.keyIsNotIgnore(PreferKey.bookInfoBackgroundBlur) &&
|
|
|
- BackupConfig.keyIsNotIgnore(PreferKey.bookInfoNetworkCoverBackground)
|
|
|
- val restoreDefaultCoverBackground =
|
|
|
- legacyBookInfoBackground != null &&
|
|
|
- PreferKey.bookInfoDefaultCoverBackground !in map &&
|
|
|
- BackupConfig.keyIsNotIgnore(PreferKey.bookInfoBackgroundBlur) &&
|
|
|
- BackupConfig.keyIsNotIgnore(PreferKey.bookInfoDefaultCoverBackground)
|
|
|
- appCtx.defaultSharedPreferences.edit {
|
|
|
- map.forEach { (key, value) ->
|
|
|
- if (BackupConfig.keyIsNotIgnore(key)) {
|
|
|
- when (key) {
|
|
|
- PreferKey.webDavPassword -> {
|
|
|
- val password = kotlin.runCatching {
|
|
|
- aes.decryptStr(value.toString())
|
|
|
- }.getOrNull() ?: let {
|
|
|
- if (appCtx.getPrefString(PreferKey.webDavPassword).isNullOrBlank()) {
|
|
|
- value.toString()
|
|
|
- } else null
|
|
|
- }
|
|
|
- password?.let {
|
|
|
- putString(key, it)
|
|
|
- finalMap[key] = it
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- else -> {
|
|
|
- if (value != null) {
|
|
|
- when (value) {
|
|
|
- is Int -> { putInt(key, value); finalMap[key] = value }
|
|
|
- is Boolean -> { putBoolean(key, value); finalMap[key] = value }
|
|
|
- is Long -> { putLong(key, value); finalMap[key] = value }
|
|
|
- is Double -> { // JSON 数字会被解析为 Double
|
|
|
- val floatValue = value.toFloat()
|
|
|
- putFloat(key, floatValue)
|
|
|
- finalMap[key] = floatValue
|
|
|
- }
|
|
|
- is Float -> { putFloat(key, value); finalMap[key] = value }
|
|
|
- is String -> { putString(key, value); finalMap[key] = value }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- legacyBookInfoBackground?.let { backgroundMode ->
|
|
|
- if (restoreNetworkCoverBackground) {
|
|
|
- putString(PreferKey.bookInfoNetworkCoverBackground, backgroundMode)
|
|
|
- finalMap[PreferKey.bookInfoNetworkCoverBackground] = backgroundMode
|
|
|
- }
|
|
|
- if (restoreDefaultCoverBackground) {
|
|
|
- putString(PreferKey.bookInfoDefaultCoverBackground, backgroundMode)
|
|
|
- finalMap[PreferKey.bookInfoDefaultCoverBackground] = backgroundMode
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- // 经快照层批量恢复:立即对读侧生效(onRestoreFinish 的读取不再依赖回灌时机),异步单次 edit 落盘
|
|
|
+ val finalMap = normalizeConfigMap(
|
|
|
+ map = map,
|
|
|
+ keyIsNotIgnore = { BackupConfig.keyIsNotIgnore(it) },
|
|
|
+ decryptWebDavPassword = { runCatching { aes.decryptStr(it) }.getOrNull() },
|
|
|
+ hasLocalWebDavPassword = !appCtx.getPrefString(PreferKey.webDavPassword)
|
|
|
+ .isNullOrBlank(),
|
|
|
+ )
|
|
|
+ // 经快照层批量恢复:立即对读侧生效(onRestoreFinish 的读取不再依赖回灌时机),单次原子 edit 落盘
|
|
|
AppConfigStore.putAll(finalMap)
|
|
|
+ // 恢复完成提示前等待落盘,dataStore.edit 返回即持久化完成
|
|
|
+ DsSync.awaitPendingWrites()
|
|
|
}
|
|
|
|
|
|
private fun readXmlToMap(file: File): Map<String, Any?> {
|