diff --git a/app/src/main/java/io/legado/app/help/config/AppConfig.kt b/app/src/main/java/io/legado/app/help/config/AppConfig.kt index d778dba00..32288a0e4 100644 --- a/app/src/main/java/io/legado/app/help/config/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/AppConfig.kt @@ -1,13 +1,19 @@ package io.legado.app.help.config import android.content.SharedPreferences -import android.os.Build import io.legado.app.BuildConfig import io.legado.app.constant.PreferKey -import io.legado.app.ui.config.themeConfig.ThemeConfig import io.legado.app.data.appDb import io.legado.app.data.repository.ReadPreferences import io.legado.app.ui.book.manga.config.MangaScrollMode +import io.legado.app.ui.config.backupConfig.BackupConfig +import io.legado.app.ui.config.bookshelfConfig.BookshelfConfig +import io.legado.app.ui.config.coverConfig.CoverConfig +import io.legado.app.ui.config.downloadCacheConfig.DownloadCacheConfig +import io.legado.app.ui.config.importBookConfig.ImportBookConfig +import io.legado.app.ui.config.otherConfig.OtherConfig +import io.legado.app.ui.config.readConfig.ReadConfig +import io.legado.app.ui.config.themeConfig.ThemeConfig import io.legado.app.utils.canvasrecorder.CanvasRecorderFactory import io.legado.app.utils.getPrefBoolean import io.legado.app.utils.getPrefInt @@ -16,20 +22,19 @@ import io.legado.app.utils.isNightMode import io.legado.app.utils.putPrefBoolean import io.legado.app.utils.putPrefInt import io.legado.app.utils.putPrefString -import io.legado.app.utils.removePref import io.legado.app.utils.sysConfiguration import io.legado.app.utils.toastOnUi import splitties.init.appCtx @Suppress("MemberVisibilityCanBePrivate", "ConstPropertyName") object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { - val isCronet = appCtx.getPrefBoolean(PreferKey.cronet) - var useAntiAlias = appCtx.getPrefBoolean(PreferKey.antiAlias) - var userAgent: String = getPrefUserAgent() + val isCronet get() = DownloadCacheConfig.cronetEnable + val useAntiAlias get() = OtherConfig.antiAlias + val userAgent: String get() = DownloadCacheConfig.userAgent var isEInkMode = appCtx.getPrefString("app_theme", "0") == "4" var isTransparent = appCtx.getPrefString("app_theme", "0") == "13" - var customMode = appCtx.getPrefString(PreferKey.customMode) + val customMode get() = ThemeConfig.customMode var clickActionTL = appCtx.getPrefInt(PreferKey.clickActionTL, 2) var clickActionTC = appCtx.getPrefInt(PreferKey.clickActionTC, 2) var clickActionTR = appCtx.getPrefInt(PreferKey.clickActionTR, 1) @@ -51,51 +56,31 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { var mangaClickActionBC = appCtx.getPrefInt(PreferKey.mangaClickActionBC, 1) var mangaClickActionBR = appCtx.getPrefInt(PreferKey.mangaClickActionBR, 1) - var AppTheme = appCtx.getPrefString(PreferKey.appTheme, "0") + val AppTheme get() = ThemeConfig.appTheme - var swipeAnimation = appCtx.getPrefBoolean(PreferKey.swipeAnimation, true) + val swipeAnimation get() = ThemeConfig.swipeAnimation - var useDefaultCover = appCtx.getPrefBoolean(PreferKey.useDefaultCover, false) - var optimizeRender = CanvasRecorderFactory.isSupport - && appCtx.getPrefBoolean(PreferKey.optimizeRender, false) - var recordLog = appCtx.getPrefBoolean(PreferKey.recordLog) + val useDefaultCover get() = CoverConfig.useDefaultCover + var optimizeRender + get() = CanvasRecorderFactory.isSupport && ReadConfig.optimizeRender + set(value) { + ReadConfig.optimizeRender = value + } + val recordLog get() = OtherConfig.recordLog var webServiceAutoStart = appCtx.getPrefBoolean(PreferKey.webServiceAutoStart, false) // -- lyc 版本特性 -- - var adaptSpecialStyle = appCtx.getPrefBoolean(PreferKey.adaptSpecialStyle, true) - var useUnderline = appCtx.getPrefBoolean(PreferKey.useUnderline, false) + val adaptSpecialStyle get() = ReadConfig.adaptSpecialStyle + val useUnderline get() = ReadConfig.useUnderline - private var screenOrientationValue = appCtx.getPrefString(PreferKey.screenOrientation) ?: "0" - private var noAnimScrollPageValue = appCtx.getPrefBoolean(PreferKey.noAnimScrollPage, false) - private var tocUiUseReplaceValue = appCtx.getPrefBoolean(PreferKey.tocUiUseReplace) - private var tocCountWordsValue = appCtx.getPrefBoolean(PreferKey.tocCountWords, true) - private var autoChangeSourceValue = appCtx.getPrefBoolean(PreferKey.autoChangeSource, true) - private var clickImgWayValue = appCtx.getPrefString(PreferKey.clickImgWay, "2") ?: "2" - private var doublePageHorizontalValue = appCtx.getPrefString(PreferKey.doublePageHorizontal, "0") ?: "0" - private var progressBarBehaviorValue = appCtx.getPrefString(PreferKey.progressBarBehavior, "page") ?: "page" - private var keyPageOnLongPressValue = appCtx.getPrefBoolean(PreferKey.keyPageOnLongPress, false) - private var volumeKeyPageValue = appCtx.getPrefBoolean(PreferKey.volumeKeyPage, true) - private var volumeKeyPageOnPlayValue = appCtx.getPrefBoolean(PreferKey.volumeKeyPageOnPlay, true) - private var mouseWheelPageValue = appCtx.getPrefBoolean(PreferKey.mouseWheelPage, true) - private var paddingDisplayCutoutsValue = appCtx.getPrefBoolean(PreferKey.paddingDisplayCutouts, false) - private var pageTouchSlopValue = appCtx.getPrefInt(PreferKey.pageTouchSlop, 0) - private var showReadTitleBarAdditionValue = - appCtx.getPrefBoolean(PreferKey.showReadTitleAddition, true) - private var titleBarModeValue = appCtx.getPrefString(PreferKey.titleBarMode, "1") ?: "1" - private var menuAlphaValue = appCtx.getPrefInt(PreferKey.menuAlpha, 100) - private var readSliderModeValue = appCtx.getPrefString(PreferKey.readSliderMode, "0") ?: "0" private var readBarStyleFollowPageValue = appCtx.getPrefBoolean(PreferKey.readBarStyleFollowPage, false) private var readBarStyleValue = appCtx.getPrefInt(PreferKey.readBarStyle, 0) - private var defaultSourceChangeAllValue = - appCtx.getPrefBoolean(PreferKey.defaultSourceChangeAll, true) - private var sliderVibratorValue = appCtx.getPrefBoolean(PreferKey.sliderVibrator, false) - private var selectVibratorValue = appCtx.getPrefBoolean(PreferKey.selectVibrator, false) fun syncReadPreferences(preferences: ReadPreferences) { - optimizeRender = CanvasRecorderFactory.isSupport && preferences.optimizeRender - adaptSpecialStyle = preferences.adaptSpecialStyle - useUnderline = preferences.useUnderline + ReadConfig.optimizeRender = preferences.optimizeRender + ReadConfig.adaptSpecialStyle = preferences.adaptSpecialStyle + ReadConfig.useUnderline = preferences.useUnderline clickActionTL = preferences.clickActionTL clickActionTC = preferences.clickActionTC clickActionTR = preferences.clickActionTR @@ -105,29 +90,29 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { clickActionBL = preferences.clickActionBL clickActionBC = preferences.clickActionBC clickActionBR = preferences.clickActionBR - screenOrientationValue = preferences.screenOrientation - noAnimScrollPageValue = preferences.noAnimScrollPage - tocUiUseReplaceValue = preferences.tocUiUseReplace - tocCountWordsValue = preferences.tocCountWords - autoChangeSourceValue = preferences.autoChangeSource - clickImgWayValue = preferences.clickImgWay - doublePageHorizontalValue = preferences.doubleHorizontalPage - progressBarBehaviorValue = preferences.progressBarBehavior - keyPageOnLongPressValue = preferences.keyPageOnLongPress - volumeKeyPageValue = preferences.volumeKeyPage - volumeKeyPageOnPlayValue = preferences.volumeKeyPageOnPlay - mouseWheelPageValue = preferences.mouseWheelPage - paddingDisplayCutoutsValue = preferences.paddingDisplayCutouts - pageTouchSlopValue = preferences.pageTouchSlop - showReadTitleBarAdditionValue = preferences.showReadTitleAddition - titleBarModeValue = preferences.titleBarMode - menuAlphaValue = preferences.menuAlpha - readSliderModeValue = preferences.readSliderMode + ReadConfig.screenOrientation = preferences.screenOrientation + ReadConfig.noAnimScrollPage = preferences.noAnimScrollPage + ReadConfig.tocUiUseReplace = preferences.tocUiUseReplace + ReadConfig.tocCountWords = preferences.tocCountWords + ReadConfig.autoChangeSource = preferences.autoChangeSource + ReadConfig.clickImgWay = preferences.clickImgWay + ReadConfig.doubleHorizontalPage = preferences.doubleHorizontalPage + ReadConfig.progressBarBehavior = preferences.progressBarBehavior + ReadConfig.keyPageOnLongPress = preferences.keyPageOnLongPress + ReadConfig.volumeKeyPage = preferences.volumeKeyPage + ReadConfig.volumeKeyPageOnPlay = preferences.volumeKeyPageOnPlay + ReadConfig.mouseWheelPage = preferences.mouseWheelPage + ReadConfig.paddingDisplayCutouts = preferences.paddingDisplayCutouts + ReadConfig.pageTouchSlop = preferences.pageTouchSlop + ReadConfig.showReadTitleAddition = preferences.showReadTitleAddition + ReadConfig.titleBarMode = preferences.titleBarMode + ReadConfig.menuAlpha = preferences.menuAlpha + ReadConfig.readSliderMode = preferences.readSliderMode readBarStyleFollowPageValue = preferences.readBarStyleFollowPage readBarStyleValue = preferences.readBarStyle - defaultSourceChangeAllValue = preferences.defaultSourceChangeAll - sliderVibratorValue = preferences.sliderVibrator - selectVibratorValue = preferences.selectVibrator + ReadConfig.defaultSourceChangeAll = preferences.defaultSourceChangeAll + ReadConfig.sliderVibrator = preferences.sliderVibrator + ReadConfig.selectVibrator = preferences.selectVibrator } fun updateReadBarStyleCache(value: Int) { @@ -136,57 +121,10 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { private fun syncReadPreferenceFromSharedPreferences(key: String?) { when (key) { - PreferKey.optimizeRender -> optimizeRender = CanvasRecorderFactory.isSupport && - appCtx.getPrefBoolean(PreferKey.optimizeRender, false) - PreferKey.adaptSpecialStyle -> adaptSpecialStyle = - appCtx.getPrefBoolean(PreferKey.adaptSpecialStyle, true) - PreferKey.useUnderline -> useUnderline = - appCtx.getPrefBoolean(PreferKey.useUnderline, false) - PreferKey.screenOrientation -> screenOrientationValue = - appCtx.getPrefString(PreferKey.screenOrientation) ?: "0" - PreferKey.noAnimScrollPage -> noAnimScrollPageValue = - appCtx.getPrefBoolean(PreferKey.noAnimScrollPage, false) - PreferKey.tocUiUseReplace -> tocUiUseReplaceValue = - appCtx.getPrefBoolean(PreferKey.tocUiUseReplace) - PreferKey.tocCountWords -> tocCountWordsValue = - appCtx.getPrefBoolean(PreferKey.tocCountWords, true) - PreferKey.autoChangeSource -> autoChangeSourceValue = - appCtx.getPrefBoolean(PreferKey.autoChangeSource, true) - PreferKey.clickImgWay -> clickImgWayValue = - appCtx.getPrefString(PreferKey.clickImgWay, "2") ?: "2" - PreferKey.doublePageHorizontal -> doublePageHorizontalValue = - appCtx.getPrefString(PreferKey.doublePageHorizontal, "0") ?: "0" - PreferKey.progressBarBehavior -> progressBarBehaviorValue = - appCtx.getPrefString(PreferKey.progressBarBehavior, "page") ?: "page" - PreferKey.keyPageOnLongPress -> keyPageOnLongPressValue = - appCtx.getPrefBoolean(PreferKey.keyPageOnLongPress, false) - PreferKey.volumeKeyPage -> volumeKeyPageValue = - appCtx.getPrefBoolean(PreferKey.volumeKeyPage, true) - PreferKey.volumeKeyPageOnPlay -> volumeKeyPageOnPlayValue = - appCtx.getPrefBoolean(PreferKey.volumeKeyPageOnPlay, true) - PreferKey.mouseWheelPage -> mouseWheelPageValue = - appCtx.getPrefBoolean(PreferKey.mouseWheelPage, true) - PreferKey.paddingDisplayCutouts -> paddingDisplayCutoutsValue = - appCtx.getPrefBoolean(PreferKey.paddingDisplayCutouts, false) - PreferKey.pageTouchSlop -> pageTouchSlopValue = - appCtx.getPrefInt(PreferKey.pageTouchSlop, 0) - PreferKey.showReadTitleAddition -> showReadTitleBarAdditionValue = - appCtx.getPrefBoolean(PreferKey.showReadTitleAddition, true) - PreferKey.titleBarMode -> titleBarModeValue = - appCtx.getPrefString(PreferKey.titleBarMode, "1") ?: "1" - PreferKey.menuAlpha -> menuAlphaValue = appCtx.getPrefInt(PreferKey.menuAlpha, 100) - PreferKey.readSliderMode -> readSliderModeValue = - appCtx.getPrefString(PreferKey.readSliderMode, "0") ?: "0" PreferKey.readBarStyleFollowPage -> readBarStyleFollowPageValue = appCtx.getPrefBoolean(PreferKey.readBarStyleFollowPage, false) PreferKey.readBarStyle -> readBarStyleValue = appCtx.getPrefInt(PreferKey.readBarStyle, 0) - PreferKey.defaultSourceChangeAll -> defaultSourceChangeAllValue = - appCtx.getPrefBoolean(PreferKey.defaultSourceChangeAll, true) - PreferKey.sliderVibrator -> sliderVibratorValue = - appCtx.getPrefBoolean(PreferKey.sliderVibrator, false) - PreferKey.selectVibrator -> selectVibratorValue = - appCtx.getPrefBoolean(PreferKey.selectVibrator, false) } } @@ -195,16 +133,6 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { syncReadPreferenceFromSharedPreferences(key) when (key) { - PreferKey.adaptSpecialStyle -> adaptSpecialStyle = - appCtx.getPrefBoolean(PreferKey.adaptSpecialStyle, true) - - PreferKey.useUnderline -> useUnderline = - appCtx.getPrefBoolean(PreferKey.useUnderline, false) - - PreferKey.appTheme -> { - AppTheme = appCtx.getPrefString(PreferKey.appTheme, "0") - } - PreferKey.clickActionTL -> clickActionTL = appCtx.getPrefInt(PreferKey.clickActionTL, 2) @@ -265,18 +193,6 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { PreferKey.useZhLayout -> ReadBookConfig.useZhLayout = appCtx.getPrefBoolean(PreferKey.useZhLayout) - PreferKey.userAgent -> userAgent = getPrefUserAgent() - - PreferKey.antiAlias -> useAntiAlias = appCtx.getPrefBoolean(PreferKey.antiAlias) - - PreferKey.useDefaultCover -> useDefaultCover = - appCtx.getPrefBoolean(PreferKey.useDefaultCover, false) - - PreferKey.optimizeRender -> optimizeRender = CanvasRecorderFactory.isSupport - && appCtx.getPrefBoolean(PreferKey.optimizeRender, false) - - PreferKey.recordLog -> recordLog = appCtx.getPrefBoolean(PreferKey.recordLog) - } } @@ -294,33 +210,33 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } var showUnread: Boolean - get() = appCtx.getPrefBoolean(PreferKey.showUnread, true) + get() = BookshelfConfig.showUnread set(value) { - appCtx.putPrefBoolean(PreferKey.showUnread, value) + BookshelfConfig.showUnread = value } var showTip: Boolean - get() = appCtx.getPrefBoolean(PreferKey.showTip, false) + get() = BookshelfConfig.showTip set(value) { - appCtx.putPrefBoolean(PreferKey.showTip, value) + BookshelfConfig.showTip = value } var showUnreadNew: Boolean - get() = appCtx.getPrefBoolean(PreferKey.showUnreadNew, true) + get() = BookshelfConfig.showUnreadNew set(value) { - appCtx.putPrefBoolean(PreferKey.showUnreadNew, value) + BookshelfConfig.showUnreadNew = value } var showLastUpdateTime: Boolean - get() = appCtx.getPrefBoolean(PreferKey.showLastUpdateTime, false) + get() = BookshelfConfig.showLastUpdateTime set(value) { - appCtx.putPrefBoolean(PreferKey.showLastUpdateTime, value) + BookshelfConfig.showLastUpdateTime = value } var showWaitUpCount: Boolean - get() = appCtx.getPrefBoolean(PreferKey.showWaitUpCount, false) + get() = BookshelfConfig.showWaitUpCount set(value) { - appCtx.putPrefBoolean(PreferKey.showWaitUpCount, value) + BookshelfConfig.showWaitUpCount = value } var readBrightness: Int @@ -353,30 +269,30 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { // get() = appCtx.getPrefBoolean(PreferKey.immNavigationBar, true) val screenOrientation: String? - get() = screenOrientationValue + get() = ReadConfig.screenOrientation var bookGroupStyle: Int - get() = appCtx.getPrefInt(PreferKey.bookGroupStyle, 0) + get() = BookshelfConfig.bookGroupStyle set(value) { - appCtx.putPrefInt(PreferKey.bookGroupStyle, value) + BookshelfConfig.bookGroupStyle = value } var bookshelfLayoutModePortrait: Int - get() = appCtx.getPrefInt(PreferKey.bookshelfLayoutModePortrait, 1) + get() = BookshelfConfig.bookshelfLayoutModePortrait set(value) { - appCtx.putPrefInt(PreferKey.bookshelfLayoutModePortrait, value) + BookshelfConfig.bookshelfLayoutModePortrait = value } var bookshelfLayoutModeLandscape: Int - get() = appCtx.getPrefInt(PreferKey.bookshelfLayoutModeLandscape, 1) + get() = BookshelfConfig.bookshelfLayoutModeLandscape set(value) { - appCtx.putPrefInt(PreferKey.bookshelfLayoutModeLandscape, value) + BookshelfConfig.bookshelfLayoutModeLandscape = value } var bookshelfLayoutGridPortrait: Int - get() = appCtx.getPrefInt(PreferKey.bookshelfLayoutGridPortrait, 3) + get() = BookshelfConfig.bookshelfLayoutGridPortrait set(value) { - appCtx.putPrefInt(PreferKey.bookshelfLayoutGridPortrait, value) + BookshelfConfig.bookshelfLayoutGridPortrait = value } var exploreLayoutGridLandscape: Int @@ -392,9 +308,9 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } var bookshelfLayoutGridLandscape: Int - get() = appCtx.getPrefInt(PreferKey.bookshelfLayoutGridLandscape, 7) + get() = BookshelfConfig.bookshelfLayoutGridLandscape set(value) { - appCtx.putPrefInt(PreferKey.bookshelfLayoutGridLandscape, value) + BookshelfConfig.bookshelfLayoutGridLandscape = value } var bookExportFileName: String? @@ -411,38 +327,34 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } var bookImportFileName: String? - get() = appCtx.getPrefString(PreferKey.bookImportFileName) + get() = ImportBookConfig.bookImportFileName set(value) { - appCtx.putPrefString(PreferKey.bookImportFileName, value) + ImportBookConfig.bookImportFileName = value } var backupPath: String? - get() = appCtx.getPrefString(PreferKey.backupPath) + get() = BackupConfig.backupPath set(value) { - if (value.isNullOrEmpty()) { - appCtx.removePref(PreferKey.backupPath) - } else { - appCtx.putPrefString(PreferKey.backupPath, value) - } + BackupConfig.backupPath = value } val showDiscovery: Boolean - get() = appCtx.getPrefBoolean(PreferKey.showDiscovery, true) + get() = ThemeConfig.showDiscovery val showHome: Boolean - get() = appCtx.getPrefBoolean(PreferKey.showHome, true) + get() = ThemeConfig.showHome val showRSS: Boolean - get() = appCtx.getPrefBoolean(PreferKey.showRss, true) + get() = ThemeConfig.showRss val showStatusBar: Boolean - get() = appCtx.getPrefBoolean(PreferKey.showStatusBar, true) + get() = ThemeConfig.showStatusBar val showBottomView: Boolean - get() = appCtx.getPrefBoolean(PreferKey.showBottomView, true) + get() = ThemeConfig.showBottomView val autoRefreshBook: Boolean - get() = appCtx.getPrefBoolean(PreferKey.autoRefresh) + get() = ThemeConfig.autoRefreshBook var enableReview: Boolean get() = BuildConfig.DEBUG && appCtx.getPrefBoolean(PreferKey.enableReview, false) @@ -451,20 +363,16 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } var threadCount: Int - get() = appCtx.getPrefInt(PreferKey.threadCount, 16) + get() = DownloadCacheConfig.threadCount set(value) { - appCtx.putPrefInt(PreferKey.threadCount, value) + DownloadCacheConfig.threadCount = value } // 添加本地选择的目录 var importBookPath: String? - get() = appCtx.getPrefString("importBookPath") + get() = ImportBookConfig.importBookPath set(value) { - if (value == null) { - appCtx.removePref("importBookPath") - } else { - appCtx.putPrefString("importBookPath", value) - } + ImportBookConfig.importBookPath = value } var ttsFlowSys: Boolean @@ -474,7 +382,7 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } val noAnimScrollPage: Boolean - get() = noAnimScrollPageValue + get() = ReadConfig.noAnimScrollPage const val defaultSpeechRate = 5 @@ -585,23 +493,21 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } var webPort: Int - get() = appCtx.getPrefInt(PreferKey.webPort, 1122) + get() = OtherConfig.webPort set(value) { - appCtx.putPrefInt(PreferKey.webPort, value) + OtherConfig.webPort = value } var tocUiUseReplace: Boolean - get() = tocUiUseReplaceValue + get() = ReadConfig.tocUiUseReplace set(value) { - tocUiUseReplaceValue = value - appCtx.putPrefBoolean(PreferKey.tocUiUseReplace, value) + ReadConfig.tocUiUseReplace = value } var tocCountWords: Boolean - get() = tocCountWordsValue + get() = ReadConfig.tocCountWords set(value) { - tocCountWordsValue = value - appCtx.putPrefBoolean(PreferKey.tocCountWords, value) + ReadConfig.tocCountWords = value } var enableReadRecord: Boolean @@ -611,7 +517,7 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } val autoChangeSource: Boolean - get() = autoChangeSourceValue + get() = ReadConfig.autoChangeSource var changeSourceLoadInfo: Boolean get() = appCtx.getPrefBoolean(PreferKey.changeSourceLoadInfo) @@ -638,9 +544,9 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } var showBookshelfFastScroller: Boolean - get() = appCtx.getPrefBoolean(PreferKey.showBookshelfFastScroller, false) + get() = BookshelfConfig.showBookshelfFastScroller set(value) { - appCtx.putPrefBoolean(PreferKey.showBookshelfFastScroller, value) + BookshelfConfig.showBookshelfFastScroller = value } var contentSelectSpeakMod: Int @@ -670,33 +576,33 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } val clickImgWay: String? - get() = clickImgWayValue + get() = ReadConfig.clickImgWay var preDownloadNum - get() = appCtx.getPrefInt(PreferKey.preDownloadNum, 10) + get() = DownloadCacheConfig.preDownloadNum set(value) { - appCtx.putPrefInt(PreferKey.preDownloadNum, value) + DownloadCacheConfig.preDownloadNum = value } - val syncBookProgress get() = appCtx.getPrefBoolean(PreferKey.syncBookProgress, true) + val syncBookProgress get() = BackupConfig.syncBookProgress - val syncBookProgressPlus get() = appCtx.getPrefBoolean(PreferKey.syncBookProgressPlus, false) + val syncBookProgressPlus get() = BackupConfig.syncBookProgressPlus val mediaButtonOnExit get() = appCtx.getPrefBoolean(PreferKey.mediaButtonOnExit, true) val readAloudByMediaButton get() = appCtx.getPrefBoolean(PreferKey.readAloudByMediaButton, false) - val replaceEnableDefault get() = appCtx.getPrefBoolean(PreferKey.replaceEnableDefault, true) + val replaceEnableDefault get() = OtherConfig.replaceEnableDefault - val webDavDir get() = appCtx.getPrefString(PreferKey.webDavDir, "legado") + val webDavDir get() = BackupConfig.webDavDir - val webDavDeviceName get() = appCtx.getPrefString(PreferKey.webDavDeviceName, Build.MODEL) + val webDavDeviceName get() = BackupConfig.webDavDeviceName - val recordHeapDump get() = appCtx.getPrefBoolean(PreferKey.recordHeapDump, false) + val recordHeapDump get() = OtherConfig.recordHeapDump val loadCoverOnlyWifi get() = appCtx.getPrefBoolean(PreferKey.loadCoverOnlyWifi, false) - val showAddToShelfAlert get() = appCtx.getPrefBoolean(PreferKey.showAddToShelfAlert, true) + val showAddToShelfAlert get() = OtherConfig.showAddToShelfAlert val ignoreAudioFocus get() = appCtx.getPrefBoolean(PreferKey.ignoreAudioFocus, false) @@ -704,36 +610,36 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { get() = appCtx.getPrefBoolean(PreferKey.pauseReadAloudWhilePhoneCalls, false) set(value) = appCtx.putPrefBoolean(PreferKey.pauseReadAloudWhilePhoneCalls, value) - val onlyLatestBackup get() = appCtx.getPrefBoolean(PreferKey.onlyLatestBackup, true) + val onlyLatestBackup get() = BackupConfig.onlyLatestBackup - val autoCheckNewBackup get() = appCtx.getPrefBoolean(PreferKey.autoCheckNewBackup, true) + val autoCheckNewBackup get() = ThemeConfig.autoCheckNewBackup - val defaultHomePage get() = appCtx.getPrefString(PreferKey.defaultHomePage, "bookshelf") + val defaultHomePage get() = ThemeConfig.defaultHomePage - val updateToVariant get() = appCtx.getPrefString(PreferKey.updateToVariant, "official_version") + val updateToVariant get() = OtherConfig.updateToVariant val streamReadAloudAudio get() = appCtx.getPrefBoolean(PreferKey.streamReadAloudAudio, false) val doublePageHorizontal: String? - get() = doublePageHorizontalValue + get() = ReadConfig.doubleHorizontalPage val progressBarBehavior: String? - get() = progressBarBehaviorValue + get() = ReadConfig.progressBarBehavior val keyPageOnLongPress - get() = keyPageOnLongPressValue + get() = ReadConfig.keyPageOnLongPress val volumeKeyPage - get() = volumeKeyPageValue + get() = ReadConfig.volumeKeyPage val volumeKeyPageOnPlay - get() = volumeKeyPageOnPlayValue + get() = ReadConfig.volumeKeyPageOnPlay val mouseWheelPage - get() = mouseWheelPageValue + get() = ReadConfig.mouseWheelPage val paddingDisplayCutouts - get() = paddingDisplayCutoutsValue + get() = ReadConfig.paddingDisplayCutouts var searchScope: String get() = appCtx.getPrefString("searchScope") ?: "" @@ -748,22 +654,21 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } var pageTouchSlop: Int - get() = pageTouchSlopValue + get() = ReadConfig.pageTouchSlop set(value) { - pageTouchSlopValue = value - appCtx.putPrefInt(PreferKey.pageTouchSlop, value) + ReadConfig.pageTouchSlop = value } var bookshelfSort: Int - get() = appCtx.getPrefInt(PreferKey.bookshelfSort, 0) + get() = BookshelfConfig.bookshelfSort set(value) { - appCtx.putPrefInt(PreferKey.bookshelfSort, value) + BookshelfConfig.bookshelfSort = value } var bookshelfSortOrder: Int - get() = appCtx.getPrefInt(PreferKey.bookshelfSortOrder, 1) + get() = BookshelfConfig.bookshelfSortOrder set(value) { - appCtx.putPrefInt(PreferKey.bookshelfSortOrder, value) + BookshelfConfig.bookshelfSortOrder = value } fun getBookSortByGroupId(groupId: Long): Int { @@ -771,31 +676,22 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { ?: bookshelfSort } - private fun getPrefUserAgent(): String { - val ua = appCtx.getPrefString(PreferKey.userAgent) - if (ua.isNullOrBlank()) { - return "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/" + BuildConfig.Cronet_Main_Version + " Safari/537.36" - } - return ua - } - var bitmapCacheSize: Int - get() = appCtx.getPrefInt(PreferKey.bitmapCacheSize, 50) + get() = DownloadCacheConfig.bitmapCacheSize set(value) { - appCtx.putPrefInt(PreferKey.bitmapCacheSize, value) + DownloadCacheConfig.bitmapCacheSize = value } var imageRetainNum: Int - get() = appCtx.getPrefInt(PreferKey.imageRetainNum, 0) + get() = DownloadCacheConfig.imageRetainNum set(value) { - appCtx.putPrefInt(PreferKey.imageRetainNum, value) + DownloadCacheConfig.imageRetainNum = value } var showReadTitleBarAddition: Boolean - get() = showReadTitleBarAdditionValue + get() = ReadConfig.showReadTitleAddition set(value) { - showReadTitleBarAdditionValue = value - appCtx.putPrefBoolean(PreferKey.showReadTitleAddition, value) + ReadConfig.showReadTitleAddition = value } var readBarStyleFollowPage: Boolean @@ -813,15 +709,9 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } var sourceEditMaxLine: Int - get() { - val maxLine = appCtx.getPrefInt(PreferKey.sourceEditMaxLine, Int.MAX_VALUE) - if (maxLine < 10) { - return Int.MAX_VALUE - } - return maxLine - } + get() = OtherConfig.sourceEditMaxLine set(value) { - appCtx.putPrefInt(PreferKey.sourceEditMaxLine, value) + OtherConfig.sourceEditMaxLine = value } var audioPlayUseWakeLock: Boolean @@ -857,9 +747,9 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } var firebaseEnable: Boolean - get() = appCtx.getPrefBoolean(PreferKey.firebaseEnable, false) + get() = OtherConfig.firebaseEnable set(value) { - appCtx.putPrefBoolean(PreferKey.firebaseEnable, value) + OtherConfig.firebaseEnable = value } //跳转到漫画界面不使用富文本模式 @@ -886,10 +776,9 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } var titleBarMode - get() = titleBarModeValue + get() = ReadConfig.titleBarMode set(value) { - titleBarModeValue = value - appCtx.putPrefString(PreferKey.titleBarMode, value) + ReadConfig.titleBarMode = value } //漫画预加载数量 @@ -995,15 +884,15 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } var tabletInterface - get() = appCtx.getPrefString(PreferKey.tabletInterface, "auto") + get() = ThemeConfig.tabletInterface set(value) { - appCtx.putPrefString(PreferKey.tabletInterface, value) + ThemeConfig.tabletInterface = value } var pureBlack - get() = appCtx.getPrefBoolean(PreferKey.pureBlack, false) + get() = ThemeConfig.isPureBlack set(value) { - appCtx.putPrefBoolean(PreferKey.pureBlack, value) + ThemeConfig.isPureBlack = value } val hasLightBg: Boolean @@ -1016,40 +905,38 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { get() = hasLightBg && hasDarkBg var labelVisibilityMode - get() = appCtx.getPrefString(PreferKey.labelVisibilityMode, "auto") + get() = ThemeConfig.labelVisibilityMode set(value) { - appCtx.putPrefString(PreferKey.labelVisibilityMode, value) + ThemeConfig.labelVisibilityMode = value } var paletteStyle - get() = appCtx.getPrefString(PreferKey.paletteStyle, "tonalSpot") + get() = ThemeConfig.paletteStyle set(value) { - appCtx.putPrefString(PreferKey.paletteStyle, value) + ThemeConfig.paletteStyle = value } var enableBlur - get() = appCtx.getPrefBoolean(PreferKey.enableBlur, false) + get() = ThemeConfig.enableBlur set(value) { - appCtx.putPrefBoolean(PreferKey.enableBlur, value) + ThemeConfig.enableBlur = value } var menuAlpha: Int - get() = menuAlphaValue + get() = ReadConfig.menuAlpha set(value) { - menuAlphaValue = value - appCtx.putPrefInt(PreferKey.menuAlpha, value) + ReadConfig.menuAlpha = value } var readSliderMode - get() = readSliderModeValue + get() = ReadConfig.readSliderMode set(value) { - readSliderModeValue = value - appCtx.putPrefString(PreferKey.readSliderMode, value) + ReadConfig.readSliderMode = value } var bookshelfRefreshingLimit: Int - get() = appCtx.getPrefInt(PreferKey.bookshelfRefreshingLimit, 0) + get() = BookshelfConfig.bookshelfRefreshingLimit set(value) { - appCtx.putPrefInt(PreferKey.bookshelfRefreshingLimit, value) + BookshelfConfig.bookshelfRefreshingLimit = value } var systemMediaControlCompatibilityChange: Boolean @@ -1059,15 +946,15 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } var isPredictiveBackEnabled: Boolean - get() = appCtx.getPrefBoolean(PreferKey.isPredictiveBackEnabled, true) + get() = ThemeConfig.isPredictiveBackEnabled set(value) { - appCtx.putPrefBoolean(PreferKey.isPredictiveBackEnabled, value) + ThemeConfig.isPredictiveBackEnabled = value } var shouldShowExpandButton: Boolean - get() = appCtx.getPrefBoolean(PreferKey.shouldShowExpandButton, false) + get() = BookshelfConfig.shouldShowExpandButton set(value) { - appCtx.putPrefBoolean(PreferKey.shouldShowExpandButton, value) + BookshelfConfig.shouldShowExpandButton = value } var exploreLayoutState: Int @@ -1077,24 +964,21 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } var defaultSourceChangeAll: Boolean - get() = defaultSourceChangeAllValue + get() = ReadConfig.defaultSourceChangeAll set(value) { - defaultSourceChangeAllValue = value - appCtx.putPrefBoolean(PreferKey.defaultSourceChangeAll, value) + ReadConfig.defaultSourceChangeAll = value } var sliderVibrator: Boolean - get() = sliderVibratorValue + get() = ReadConfig.sliderVibrator set(value) { - sliderVibratorValue = value - appCtx.putPrefBoolean(PreferKey.sliderVibrator, value) + ReadConfig.sliderVibrator = value } var selectVibrator: Boolean - get() = selectVibratorValue + get() = ReadConfig.selectVibrator set(value) { - selectVibratorValue = value - appCtx.putPrefBoolean(PreferKey.selectVibrator, value) + ReadConfig.selectVibrator = value } val audioPreDownloadNum: Int @@ -1110,8 +994,8 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } var containerOpacity: Int - get() = appCtx.getPrefInt(PreferKey.containerOpacity, 100) + get() = ThemeConfig.containerOpacity set(value) { - appCtx.putPrefInt(PreferKey.containerOpacity, value) + ThemeConfig.containerOpacity = value } } diff --git a/app/src/main/java/io/legado/app/ui/config/PrefDelegate.kt b/app/src/main/java/io/legado/app/ui/config/PrefDelegate.kt index 258d87382..969397317 100644 --- a/app/src/main/java/io/legado/app/ui/config/PrefDelegate.kt +++ b/app/src/main/java/io/legado/app/ui/config/PrefDelegate.kt @@ -3,8 +3,16 @@ package io.legado.app.ui.config import androidx.compose.runtime.MutableState import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf +import androidx.datastore.preferences.core.booleanPreferencesKey +import androidx.datastore.preferences.core.emptyPreferences +import androidx.datastore.preferences.core.floatPreferencesKey +import androidx.datastore.preferences.core.intPreferencesKey +import androidx.datastore.preferences.core.longPreferencesKey +import androidx.datastore.preferences.core.stringPreferencesKey import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner +import io.legado.app.data.repository.dataStore +import io.legado.app.help.config.DsSync import io.legado.app.utils.getPrefBoolean import io.legado.app.utils.getPrefFloat import io.legado.app.utils.getPrefInt @@ -16,20 +24,15 @@ import io.legado.app.utils.putPrefInt import io.legado.app.utils.putPrefLong import io.legado.app.utils.putPrefString import io.legado.app.utils.putPrefStringSync -import io.legado.app.help.config.DsSync -import androidx.datastore.preferences.core.* -import io.legado.app.data.repository.dataStore -import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job -import kotlinx.coroutines.runBlocking import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext +import kotlinx.coroutines.runBlocking import splitties.init.appCtx import java.io.IOException import kotlin.properties.ReadWriteProperty @@ -37,13 +40,11 @@ import kotlin.reflect.KProperty interface PrefDelegate : ReadWriteProperty { val state: State - val ready: CompletableDeferred fun dispose() } class PrefStateDelegate(private val delegate: PrefDelegate) : ReadWriteProperty by delegate { val state: State get() = delegate.state - val ready: CompletableDeferred get() = delegate.ready } fun prefDelegate( @@ -54,24 +55,15 @@ fun prefDelegate( onValueChange: ((T) -> Unit)? = null ): PrefDelegate { return object : PrefDelegate, DefaultLifecycleObserver { - private var _value: MutableState = mutableStateOf(defaultValue) + private var _value: MutableState override val state: State get() = _value private val scope = CoroutineScope(Dispatchers.IO) private var dsObserverJob: Job? = null - override val ready = CompletableDeferred() init { - // 从 DataStore 读取初始值(DS 为唯一读取源) - // 在 IO 线程读取,切换到 Main 线程更新 MutableState,确保 snapshotFlow 能检测到变化 - scope.launch { - val dsValue = readFromDs() - if (dsValue != null) { - withContext(Dispatchers.Main) { - _value.value = dsValue - } - } - ready.complete(Unit) - } + // 同步从 DataStore 读取初始值,确保构造完成后即为最新值 + val initialValue = runBlocking(Dispatchers.IO) { readFromDs() } ?: defaultValue + _value = mutableStateOf(initialValue) // 观察 DataStore 变化,用于跨实例同步 dsObserverJob = scope.launch { appCtx.dataStore.data @@ -100,9 +92,7 @@ fun prefDelegate( .distinctUntilChanged() .collect { dsValue -> if (dsValue != null && _value.value != dsValue) { - withContext(Dispatchers.Main) { - _value.value = dsValue - } + _value.value = dsValue onValueChange?.invoke(dsValue) } } diff --git a/app/src/main/java/io/legado/app/ui/config/downloadCacheConfig/DownloadCacheConfigViewModel.kt b/app/src/main/java/io/legado/app/ui/config/downloadCacheConfig/DownloadCacheConfigViewModel.kt index 4b50c5403..23ffc8365 100644 --- a/app/src/main/java/io/legado/app/ui/config/downloadCacheConfig/DownloadCacheConfigViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/config/downloadCacheConfig/DownloadCacheConfigViewModel.kt @@ -71,6 +71,5 @@ class DownloadCacheConfigViewModel( fun saveUserAgent(input: String) { DownloadCacheConfig.userAgent = input - AppConfig.userAgent = DownloadCacheConfig.userAgent } } diff --git a/app/src/main/java/io/legado/app/ui/config/otherConfig/OtherConfigViewModel.kt b/app/src/main/java/io/legado/app/ui/config/otherConfig/OtherConfigViewModel.kt index 5f5b5e18b..39da7da8d 100644 --- a/app/src/main/java/io/legado/app/ui/config/otherConfig/OtherConfigViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/config/otherConfig/OtherConfigViewModel.kt @@ -14,7 +14,6 @@ import io.legado.app.data.repository.MangaSettingsRepository import io.legado.app.data.repository.ReadAloudPreferences import io.legado.app.data.repository.ReadAloudSettingsRepository import io.legado.app.help.DirectLinkUpload -import io.legado.app.help.config.AppConfig import io.legado.app.help.config.LocalConfig import io.legado.app.model.CheckSource import io.legado.app.receiver.SharedReceiverActivity @@ -122,7 +121,6 @@ class OtherConfigViewModel( fun saveUserAgent(input: String) { DownloadCacheConfig.userAgent = input - AppConfig.userAgent = DownloadCacheConfig.userAgent } fun updateLocalBookDir(path: String) {