fix: prefDelegate 直接读DataStore值

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