refactor: 拆分ReadConfig为5个职责单一的配置对象

将ReadConfig拆分为ReadDataConfig、ReadInteractionConfig、ReadMenuConfig、
ReadRenderConfig、ReadTtsConfig,各司其职。
menuAlpha迁移至ReadBookConfig.readMenuBlurAlpha。
This commit is contained in:
HapeLee
2026-06-16 01:57:18 +08:00
parent 5718f95f9f
commit c2f4b07f4a
9 changed files with 707 additions and 462 deletions
@@ -125,15 +125,15 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
ReadConfig.pageTouchSlop = preferences.pageTouchSlop ReadConfig.pageTouchSlop = preferences.pageTouchSlop
ReadConfig.showReadTitleAddition = preferences.showReadTitleAddition ReadConfig.showReadTitleAddition = preferences.showReadTitleAddition
ReadConfig.titleBarMode = preferences.titleBarMode ReadConfig.titleBarMode = preferences.titleBarMode
ReadConfig.menuAlpha = preferences.menuAlpha ReadBookConfig.readMenuBlurAlpha = preferences.readMenuBlurAlpha
ReadConfig.readSliderMode = preferences.readSliderMode ReadBookConfig.readSliderMode = preferences.readSliderMode
readBarStyleFollowPageValue = preferences.readBarStyleFollowPage readBarStyleFollowPageValue = preferences.readBarStyleFollowPage
readBarStyleValue = preferences.readBarStyle readBarStyleValue = preferences.readBarStyle
ReadConfig.defaultSourceChangeAll = preferences.defaultSourceChangeAll ReadConfig.defaultSourceChangeAll = preferences.defaultSourceChangeAll
ReadConfig.sliderVibrator = preferences.sliderVibrator ReadConfig.sliderVibrator = preferences.sliderVibrator
ReadConfig.selectVibrator = preferences.selectVibrator ReadConfig.selectVibrator = preferences.selectVibrator
ReadConfig.brightnessVwPos = preferences.brightnessVwPos ReadBookConfig.brightnessVwPos = preferences.brightnessVwPos
ReadConfig.readBrightness = preferences.readBrightness ReadBookConfig.readBrightness = preferences.readBrightness
} }
fun updateReadBarStyleCache(value: Int) { fun updateReadBarStyleCache(value: Int) {
@@ -836,16 +836,18 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
set(value) { set(value) {
ThemeConfig.enableBlur = value ThemeConfig.enableBlur = value
} }
@Deprecated("Use ReadBookConfig.readMenuBlurAlpha instead", ReplaceWith("ReadBookConfig.readMenuBlurAlpha"))
var menuAlpha: Int var menuAlpha: Int
get() = ReadConfig.menuAlpha get() = ReadBookConfig.readMenuBlurAlpha
set(value) { set(value) {
ReadConfig.menuAlpha = value ReadBookConfig.readMenuBlurAlpha = value
} }
var readSliderMode var readSliderMode
get() = ReadConfig.readSliderMode get() = ReadBookConfig.readSliderMode
set(value) { set(value) {
ReadConfig.readSliderMode = value ReadBookConfig.readSliderMode = value
} }
var bookshelfRefreshingLimit: Int var bookshelfRefreshingLimit: Int
@@ -2944,7 +2944,6 @@ class ReadBookViewModel(
postEvent(EventBus.UPDATE_READ_ACTION_BAR, true) postEvent(EventBus.UPDATE_READ_ACTION_BAR, true)
} }
is ConfigUpdate.ReadBodyToLh -> { is ConfigUpdate.ReadBodyToLh -> {
ReadConfig.readBodyToLh = update.value
ReadBookConfig.readBodyToLh = update.value ReadBookConfig.readBodyToLh = update.value
viewModelScope.launch { viewModelScope.launch {
readSettingsRepository.setReadBodyToLh(update.value) readSettingsRepository.setReadBodyToLh(update.value)
@@ -1,470 +1,295 @@
package io.legado.app.ui.config.readConfig package io.legado.app.ui.config.readConfig
import io.legado.app.BuildConfig
import io.legado.app.constant.PreferKey
import io.legado.app.data.repository.ReadPreferences import io.legado.app.data.repository.ReadPreferences
import io.legado.app.ui.config.prefDelegate
import io.legado.app.ui.config.themeConfig.ThemeConfig
import io.legado.app.utils.isNightMode
import io.legado.app.utils.sysConfiguration
/**
* 阅读配置门面
*
* 代理到子配置对象,保持向后兼容。
* 子配置按职责拆分为:
* - [ReadRenderConfig] 渲染/布局
* - [ReadMenuConfig] 菜单/标题栏/进度条/点击区域
* - [ReadInteractionConfig] 按键/触控交互
* - [ReadTtsConfig] TTS/朗读/音频
* - [ReadDataConfig] 数据同步/缓存/屏幕
*
* 注意:textFullJustify、textBottomJustify、useZhLayout、readBodyToLh、
* hideStatusBar、hideNavigationBar、showBrightnessView、brightnessVwPos、
* readBrightness、brightnessAuto、readSliderMode、readMenuBlurAlpha
* 已在 [ReadBookConfig] 中定义,此处不重复。
*/
object ReadConfig { object ReadConfig {
val isEInkMode: Boolean // ── 渲染 ──
get() = ThemeConfig.appTheme == "4"
var isNightTheme: Boolean val isEInkMode get() = ReadRenderConfig.isEInkMode
get() = when (ThemeConfig.themeMode) { var isNightTheme
"1" -> false get() = ReadRenderConfig.isNightTheme
"2" -> true set(value) { ReadRenderConfig.isNightTheme = value }
else -> sysConfiguration.isNightMode val enableReview get() = ReadRenderConfig.enableReview
} var useAntiAlias
set(value) { get() = ReadRenderConfig.useAntiAlias
val newMode = if (value) "2" else "1" set(value) { ReadRenderConfig.useAntiAlias = value }
if (ThemeConfig.themeMode != newMode) { var systemTypefaces
ThemeConfig.themeMode = newMode get() = ReadRenderConfig.systemTypefaces
} set(value) { ReadRenderConfig.systemTypefaces = value }
} var doubleHorizontalPage
get() = ReadRenderConfig.doubleHorizontalPage
set(value) { ReadRenderConfig.doubleHorizontalPage = value }
var adaptSpecialStyle
get() = ReadRenderConfig.adaptSpecialStyle
set(value) { ReadRenderConfig.adaptSpecialStyle = value }
var useUnderline
get() = ReadRenderConfig.useUnderline
set(value) { ReadRenderConfig.useUnderline = value }
var optimizeRender
get() = ReadRenderConfig.optimizeRender
set(value) { ReadRenderConfig.optimizeRender = value }
var noAnimScrollPage
get() = ReadRenderConfig.noAnimScrollPage
set(value) { ReadRenderConfig.noAnimScrollPage = value }
var paddingDisplayCutouts
get() = ReadRenderConfig.paddingDisplayCutouts
set(value) { ReadRenderConfig.paddingDisplayCutouts = value }
var pageTouchSlop
get() = ReadRenderConfig.pageTouchSlop
set(value) { ReadRenderConfig.pageTouchSlop = value }
var selectText
get() = ReadRenderConfig.selectText
set(value) { ReadRenderConfig.selectText = value }
var clickImgWay
get() = ReadRenderConfig.clickImgWay
set(value) { ReadRenderConfig.clickImgWay = value }
var chineseConverterType
get() = ReadRenderConfig.chineseConverterType
set(value) { ReadRenderConfig.chineseConverterType = value }
var useAntiAlias by prefDelegate( // ── 菜单 ──
PreferKey.antiAlias,
false
)
val enableReview: Boolean var titleBarMode
get() = BuildConfig.DEBUG && enableReviewPref get() = ReadMenuConfig.titleBarMode
set(value) { ReadMenuConfig.titleBarMode = value }
var menuAlpha
get() = ReadMenuConfig.menuAlpha
set(value) { ReadMenuConfig.menuAlpha = value }
var readBarStyleFollowPage
get() = ReadMenuConfig.readBarStyleFollowPage
set(value) { ReadMenuConfig.readBarStyleFollowPage = value }
var readBarStyle
get() = ReadMenuConfig.readBarStyle
set(value) { ReadMenuConfig.readBarStyle = value }
var progressBarBehavior
get() = ReadMenuConfig.progressBarBehavior
set(value) { ReadMenuConfig.progressBarBehavior = value }
var expandTextMenu
get() = ReadMenuConfig.expandTextMenu
set(value) { ReadMenuConfig.expandTextMenu = value }
var showReadTitleAddition
get() = ReadMenuConfig.showReadTitleAddition
set(value) { ReadMenuConfig.showReadTitleAddition = value }
var clickActionTL
get() = ReadMenuConfig.clickActionTL
set(value) { ReadMenuConfig.clickActionTL = value }
var clickActionTC
get() = ReadMenuConfig.clickActionTC
set(value) { ReadMenuConfig.clickActionTC = value }
var clickActionTR
get() = ReadMenuConfig.clickActionTR
set(value) { ReadMenuConfig.clickActionTR = value }
var clickActionML
get() = ReadMenuConfig.clickActionML
set(value) { ReadMenuConfig.clickActionML = value }
var clickActionMC
get() = ReadMenuConfig.clickActionMC
set(value) { ReadMenuConfig.clickActionMC = value }
var clickActionMR
get() = ReadMenuConfig.clickActionMR
set(value) { ReadMenuConfig.clickActionMR = value }
var clickActionBL
get() = ReadMenuConfig.clickActionBL
set(value) { ReadMenuConfig.clickActionBL = value }
var clickActionBC
get() = ReadMenuConfig.clickActionBC
set(value) { ReadMenuConfig.clickActionBC = value }
var clickActionBR
get() = ReadMenuConfig.clickActionBR
set(value) { ReadMenuConfig.clickActionBR = value }
fun hasMenuClickArea() = ReadMenuConfig.hasMenuClickArea()
fun detectClickArea() = ReadMenuConfig.detectClickArea()
private var enableReviewPref by prefDelegate( // ── 交互 ──
PreferKey.enableReview,
false
)
var systemTypefaces by prefDelegate( var mouseWheelPage
PreferKey.systemTypefaces, get() = ReadInteractionConfig.mouseWheelPage
0 set(value) { ReadInteractionConfig.mouseWheelPage = value }
) var volumeKeyPage
get() = ReadInteractionConfig.volumeKeyPage
set(value) { ReadInteractionConfig.volumeKeyPage = value }
var volumeKeyPageOnPlay
get() = ReadInteractionConfig.volumeKeyPageOnPlay
set(value) { ReadInteractionConfig.volumeKeyPageOnPlay = value }
var keyPageOnLongPress
get() = ReadInteractionConfig.keyPageOnLongPress
set(value) { ReadInteractionConfig.keyPageOnLongPress = value }
var sliderVibrator
get() = ReadInteractionConfig.sliderVibrator
set(value) { ReadInteractionConfig.sliderVibrator = value }
var selectVibrator
get() = ReadInteractionConfig.selectVibrator
set(value) { ReadInteractionConfig.selectVibrator = value }
var disableReturnKey
get() = ReadInteractionConfig.disableReturnKey
set(value) { ReadInteractionConfig.disableReturnKey = value }
var prevKeys
get() = ReadInteractionConfig.prevKeys
set(value) { ReadInteractionConfig.prevKeys = value }
var nextKeys
get() = ReadInteractionConfig.nextKeys
set(value) { ReadInteractionConfig.nextKeys = value }
var readUrlInBrowser by prefDelegate( // ── TTS ──
PreferKey.readUrlOpenInBrowser,
false
)
var contentSelectSpeakMod by prefDelegate( val speechRatePlay get() = ReadTtsConfig.speechRatePlay
PreferKey.contentSelectSpeakMod, var ttsEngine
0 get() = ReadTtsConfig.ttsEngine
) set(value) { ReadTtsConfig.ttsEngine = value }
var ttsFollowSys
get() = ReadTtsConfig.ttsFollowSys
set(value) { ReadTtsConfig.ttsFollowSys = value }
var ttsSpeechRate
get() = ReadTtsConfig.ttsSpeechRate
set(value) { ReadTtsConfig.ttsSpeechRate = value }
var ttsTimer
get() = ReadTtsConfig.ttsTimer
set(value) { ReadTtsConfig.ttsTimer = value }
var ignoreAudioFocus
get() = ReadTtsConfig.ignoreAudioFocus
set(value) { ReadTtsConfig.ignoreAudioFocus = value }
var pauseReadAloudWhilePhoneCalls
get() = ReadTtsConfig.pauseReadAloudWhilePhoneCalls
set(value) { ReadTtsConfig.pauseReadAloudWhilePhoneCalls = value }
var readAloudWakeLock
get() = ReadTtsConfig.readAloudWakeLock
set(value) { ReadTtsConfig.readAloudWakeLock = value }
var mediaButtonPerNext
get() = ReadTtsConfig.mediaButtonPerNext
set(value) { ReadTtsConfig.mediaButtonPerNext = value }
var readAloudByPage
get() = ReadTtsConfig.readAloudByPage
set(value) { ReadTtsConfig.readAloudByPage = value }
var systemMediaControlCompatibilityChange
get() = ReadTtsConfig.systemMediaControlCompatibilityChange
set(value) { ReadTtsConfig.systemMediaControlCompatibilityChange = value }
var streamReadAloudAudio
get() = ReadTtsConfig.streamReadAloudAudio
set(value) { ReadTtsConfig.streamReadAloudAudio = value }
var contentSelectSpeakMod
get() = ReadTtsConfig.contentSelectSpeakMod
set(value) { ReadTtsConfig.contentSelectSpeakMod = value }
var audioPreDownloadNum
get() = ReadTtsConfig.audioPreDownloadNum
set(value) { ReadTtsConfig.audioPreDownloadNum = value }
var audioCacheCleanTimeOrgin
get() = ReadTtsConfig.audioCacheCleanTimeOrgin
set(value) { ReadTtsConfig.audioCacheCleanTimeOrgin = value }
val audioCacheCleanTime get() = ReadTtsConfig.audioCacheCleanTime
var syncBookProgress by prefDelegate( // ── 数据/屏幕 ──
PreferKey.syncBookProgress,
true
)
var syncBookProgressPlus by prefDelegate( var syncBookProgress
PreferKey.syncBookProgressPlus, get() = ReadDataConfig.syncBookProgress
false set(value) { ReadDataConfig.syncBookProgress = value }
) var syncBookProgressPlus
get() = ReadDataConfig.syncBookProgressPlus
set(value) { ReadDataConfig.syncBookProgressPlus = value }
var autoChangeSource
get() = ReadDataConfig.autoChangeSource
set(value) { ReadDataConfig.autoChangeSource = value }
var defaultSourceChangeAll
get() = ReadDataConfig.defaultSourceChangeAll
set(value) { ReadDataConfig.defaultSourceChangeAll = value }
var readUrlInBrowser
get() = ReadDataConfig.readUrlInBrowser
set(value) { ReadDataConfig.readUrlInBrowser = value }
var tocUiUseReplace
get() = ReadDataConfig.tocUiUseReplace
set(value) { ReadDataConfig.tocUiUseReplace = value }
var tocCountWords
get() = ReadDataConfig.tocCountWords
set(value) { ReadDataConfig.tocCountWords = value }
var preDownloadNum
get() = ReadDataConfig.preDownloadNum
set(value) { ReadDataConfig.preDownloadNum = value }
var imageRetainNum
get() = ReadDataConfig.imageRetainNum
set(value) { ReadDataConfig.imageRetainNum = value }
var keepLight
get() = ReadDataConfig.keepLight
set(value) { ReadDataConfig.keepLight = value }
var screenOrientation
get() = ReadDataConfig.screenOrientation
set(value) { ReadDataConfig.screenOrientation = value }
var preDownloadNum by prefDelegate( // ── 同步 ──
PreferKey.preDownloadNum,
10
)
var imageRetainNum by prefDelegate(
PreferKey.imageRetainNum,
0
)
var audioCacheCleanTimeOrgin by prefDelegate(
PreferKey.audioCacheCleanTime,
10
)
val audioCacheCleanTime: Long
get() = audioCacheCleanTimeOrgin * 60 * 1000L
var audioPreDownloadNum by prefDelegate(
PreferKey.audioPreDownloadNum,
10
)
private const val defaultSpeechRate = 5
val speechRatePlay: Int
get() = if (ttsFollowSys) defaultSpeechRate else ttsSpeechRate
/**
* 从 [ReadPreferences] 批量同步到各子配置。
*
* 注意:textFullJustify、textBottomJustify、useZhLayout、readBodyToLh、
* hideStatusBar、hideNavigationBar、showBrightnessView、brightnessVwPos、
* readBrightness、brightnessAuto、readSliderMode、readMenuBlurAlpha
* 由 [ReadBookConfig] 的 prefDelegate 自动同步,此处不处理。
*/
fun syncReadPreferences(preferences: ReadPreferences) { fun syncReadPreferences(preferences: ReadPreferences) {
optimizeRender = preferences.optimizeRender // 渲染
adaptSpecialStyle = preferences.adaptSpecialStyle ReadRenderConfig.apply {
useUnderline = preferences.useUnderline optimizeRender = preferences.optimizeRender
keepLight = preferences.keepLight adaptSpecialStyle = preferences.adaptSpecialStyle
brightnessVwPos = preferences.brightnessVwPos useUnderline = preferences.useUnderline
readBrightness = preferences.readBrightness chineseConverterType = preferences.chineseConverterType
brightnessAuto = preferences.brightnessAuto doubleHorizontalPage = preferences.doubleHorizontalPage
chineseConverterType = preferences.chineseConverterType noAnimScrollPage = preferences.noAnimScrollPage
clickActionTL = preferences.clickActionTL paddingDisplayCutouts = preferences.paddingDisplayCutouts
clickActionTC = preferences.clickActionTC pageTouchSlop = preferences.pageTouchSlop
clickActionTR = preferences.clickActionTR selectText = preferences.selectText
clickActionML = preferences.clickActionML clickImgWay = preferences.clickImgWay
clickActionMC = preferences.clickActionMC }
clickActionMR = preferences.clickActionMR // 菜单
clickActionBL = preferences.clickActionBL ReadMenuConfig.apply {
clickActionBC = preferences.clickActionBC titleBarMode = preferences.titleBarMode
clickActionBR = preferences.clickActionBR readBarStyleFollowPage = preferences.readBarStyleFollowPage
screenOrientation = preferences.screenOrientation readBarStyle = preferences.readBarStyle
readBodyToLh = preferences.readBodyToLh progressBarBehavior = preferences.progressBarBehavior
noAnimScrollPage = preferences.noAnimScrollPage expandTextMenu = preferences.expandTextMenu
tocUiUseReplace = preferences.tocUiUseReplace showReadTitleAddition = preferences.showReadTitleAddition
tocCountWords = preferences.tocCountWords clickActionTL = preferences.clickActionTL
autoChangeSource = preferences.autoChangeSource clickActionTC = preferences.clickActionTC
clickImgWay = preferences.clickImgWay clickActionTR = preferences.clickActionTR
doubleHorizontalPage = preferences.doubleHorizontalPage clickActionML = preferences.clickActionML
progressBarBehavior = preferences.progressBarBehavior clickActionMC = preferences.clickActionMC
keyPageOnLongPress = preferences.keyPageOnLongPress clickActionMR = preferences.clickActionMR
volumeKeyPage = preferences.volumeKeyPage clickActionBL = preferences.clickActionBL
volumeKeyPageOnPlay = preferences.volumeKeyPageOnPlay clickActionBC = preferences.clickActionBC
mouseWheelPage = preferences.mouseWheelPage clickActionBR = preferences.clickActionBR
paddingDisplayCutouts = preferences.paddingDisplayCutouts }
pageTouchSlop = preferences.pageTouchSlop // 交互
selectText = preferences.selectText ReadInteractionConfig.apply {
disableReturnKey = preferences.disableReturnKey mouseWheelPage = preferences.mouseWheelPage
expandTextMenu = preferences.expandTextMenu volumeKeyPage = preferences.volumeKeyPage
showReadTitleAddition = preferences.showReadTitleAddition volumeKeyPageOnPlay = preferences.volumeKeyPageOnPlay
titleBarMode = preferences.titleBarMode keyPageOnLongPress = preferences.keyPageOnLongPress
menuAlpha = preferences.menuAlpha sliderVibrator = preferences.sliderVibrator
readSliderMode = preferences.readSliderMode selectVibrator = preferences.selectVibrator
readBarStyleFollowPage = preferences.readBarStyleFollowPage disableReturnKey = preferences.disableReturnKey
readBarStyle = preferences.readBarStyle }
defaultSourceChangeAll = preferences.defaultSourceChangeAll // 数据/屏幕
sliderVibrator = preferences.sliderVibrator ReadDataConfig.apply {
selectVibrator = preferences.selectVibrator keepLight = preferences.keepLight
} screenOrientation = preferences.screenOrientation
autoChangeSource = preferences.autoChangeSource
var tocUiUseReplace by prefDelegate( defaultSourceChangeAll = preferences.defaultSourceChangeAll
PreferKey.tocUiUseReplace, tocUiUseReplace = preferences.tocUiUseReplace
false tocCountWords = preferences.tocCountWords
)
var tocCountWords by prefDelegate(
PreferKey.tocCountWords,
true
)
var screenOrientation by prefDelegate(
PreferKey.screenOrientation,
"0"
)
var keepLight by prefDelegate(
PreferKey.keepLight,
"0"
)
var hideStatusBar by prefDelegate(
PreferKey.hideStatusBar,
false
)
var hideNavigationBar by prefDelegate(
PreferKey.hideNavigationBar,
false
)
var paddingDisplayCutouts by prefDelegate(
PreferKey.paddingDisplayCutouts,
false
)
var titleBarMode by prefDelegate(
PreferKey.titleBarMode,
"1"
)
var menuAlpha by prefDelegate(
PreferKey.menuAlpha,
100
)
var readBodyToLh by prefDelegate(
PreferKey.readBodyToLh,
true
)
var defaultSourceChangeAll by prefDelegate(
PreferKey.defaultSourceChangeAll,
true
)
var textFullJustify by prefDelegate(
PreferKey.textFullJustify,
true
)
var textBottomJustify by prefDelegate(
PreferKey.textBottomJustify,
true
)
var adaptSpecialStyle by prefDelegate(
PreferKey.adaptSpecialStyle,
true
)
var useZhLayout by prefDelegate(
PreferKey.useZhLayout,
false
)
var showBrightnessView by prefDelegate(
PreferKey.showBrightnessView,
"1"
)
var brightnessVwPos by prefDelegate(
PreferKey.brightnessVwPos,
"1"
)
var readBrightness by prefDelegate(
PreferKey.brightness,
100
)
var brightnessAuto by prefDelegate(
PreferKey.brightnessAuto,
false
)
var useUnderline by prefDelegate(
PreferKey.useUnderline,
false
)
var readSliderMode by prefDelegate(
PreferKey.readSliderMode,
"0"
)
var doubleHorizontalPage by prefDelegate(
PreferKey.doublePageHorizontal,
"0"
)
var progressBarBehavior by prefDelegate(
PreferKey.progressBarBehavior,
"page"
)
var mouseWheelPage by prefDelegate(
PreferKey.mouseWheelPage,
true
)
var volumeKeyPage by prefDelegate(
PreferKey.volumeKeyPage,
true
)
var volumeKeyPageOnPlay by prefDelegate(
PreferKey.volumeKeyPageOnPlay,
true
)
var keyPageOnLongPress by prefDelegate(
PreferKey.keyPageOnLongPress,
false
)
var pageTouchSlop by prefDelegate(
PreferKey.pageTouchSlop,
0
)
var sliderVibrator by prefDelegate(
PreferKey.sliderVibrator,
false
)
var selectVibrator by prefDelegate(
PreferKey.selectVibrator,
false
)
var autoChangeSource by prefDelegate(
PreferKey.autoChangeSource,
true
)
var selectText by prefDelegate(
PreferKey.selectText,
true
)
var noAnimScrollPage by prefDelegate(
PreferKey.noAnimScrollPage,
false
)
var clickImgWay by prefDelegate(
PreferKey.clickImgWay,
"2"
)
var optimizeRender by prefDelegate(
PreferKey.optimizeRender,
false
)
var disableReturnKey by prefDelegate(
PreferKey.disableReturnKey,
false
)
var expandTextMenu by prefDelegate(
PreferKey.expandTextMenu,
false
)
var showReadTitleAddition by prefDelegate(
PreferKey.showReadTitleAddition,
true
)
var clickActionTL by prefDelegate(
PreferKey.clickActionTL,
2
)
var clickActionTC by prefDelegate(
PreferKey.clickActionTC,
2
)
var clickActionTR by prefDelegate(
PreferKey.clickActionTR,
1
)
var clickActionML by prefDelegate(
PreferKey.clickActionML,
2
)
var clickActionMC by prefDelegate(
PreferKey.clickActionMC,
0
)
var clickActionMR by prefDelegate(
PreferKey.clickActionMR,
1
)
var clickActionBL by prefDelegate(
PreferKey.clickActionBL,
2
)
var clickActionBC by prefDelegate(
PreferKey.clickActionBC,
1
)
var clickActionBR by prefDelegate(
PreferKey.clickActionBR,
1
)
fun hasMenuClickArea(): Boolean {
return clickActionTL * clickActionTC * clickActionTR *
clickActionML * clickActionMC * clickActionMR *
clickActionBL * clickActionBC * clickActionBR == 0
}
fun detectClickArea() {
if (!hasMenuClickArea()) {
clickActionMC = 0
} }
} }
var readBarStyleFollowPage by prefDelegate(
PreferKey.readBarStyleFollowPage,
false
)
var readBarStyle by prefDelegate(
PreferKey.readBarStyle,
0
)
var prevKeys by prefDelegate(
PreferKey.prevKeys,
""
)
var nextKeys by prefDelegate(
PreferKey.nextKeys,
""
)
// --- Read Aloud ---
var ignoreAudioFocus by prefDelegate(
PreferKey.ignoreAudioFocus,
false
)
var pauseReadAloudWhilePhoneCalls by prefDelegate(
PreferKey.pauseReadAloudWhilePhoneCalls,
false
)
var readAloudWakeLock by prefDelegate(
PreferKey.readAloudWakeLock,
false
)
var mediaButtonPerNext by prefDelegate(
"mediaButtonPerNext",
false
)
var readAloudByPage by prefDelegate(
PreferKey.readAloudByPage,
false
)
var systemMediaControlCompatibilityChange by prefDelegate(
PreferKey.systemMediaControlCompatibilityChange,
true
)
var streamReadAloudAudio by prefDelegate(
PreferKey.streamReadAloudAudio,
false
)
var ttsTimer by prefDelegate(
PreferKey.ttsTimer,
0
)
var ttsFollowSys by prefDelegate(
PreferKey.ttsFollowSys,
true
)
var ttsSpeechRate by prefDelegate(
PreferKey.ttsSpeechRate,
5
)
var ttsEngine by prefDelegate<String?>(
PreferKey.ttsEngine,
null
)
var chineseConverterType by prefDelegate(
PreferKey.chineseConverterType,
0
)
} }
@@ -60,13 +60,12 @@ class ReadConfigViewModel(
} }
is ReadConfigIntent.ReadMenuBlurAlphaChanged -> { is ReadConfigIntent.ReadMenuBlurAlphaChanged -> {
ReadConfig.menuAlpha = intent.value ReadBookConfig.readMenuBlurAlpha = intent.value
readSettingsRepository.setMenuAlpha(intent.value) readSettingsRepository.setReadMenuBlurAlpha(intent.value)
postEvent(EventBus.UPDATE_READ_ACTION_BAR, true) postEvent(EventBus.UPDATE_READ_ACTION_BAR, true)
} }
is ReadConfigIntent.ReadBodyToLhChanged -> { is ReadConfigIntent.ReadBodyToLhChanged -> {
ReadConfig.readBodyToLh = intent.value
ReadBookConfig.readBodyToLh = intent.value ReadBookConfig.readBodyToLh = intent.value
readSettingsRepository.setReadBodyToLh(intent.value) readSettingsRepository.setReadBodyToLh(intent.value)
} }
@@ -110,7 +109,7 @@ class ReadConfigViewModel(
} }
is ReadConfigIntent.ReadSliderModeChanged -> { is ReadConfigIntent.ReadSliderModeChanged -> {
ReadConfig.readSliderMode = intent.value ReadBookConfig.readSliderMode = intent.value
readSettingsRepository.setReadSliderMode(intent.value) readSettingsRepository.setReadSliderMode(intent.value)
postEvent(EventBus.UPDATE_READ_ACTION_BAR, true) postEvent(EventBus.UPDATE_READ_ACTION_BAR, true)
} }
@@ -0,0 +1,67 @@
package io.legado.app.ui.config.readConfig
import io.legado.app.constant.PreferKey
import io.legado.app.ui.config.prefDelegate
/**
* 数据同步/缓存/屏幕相关配置
*
* 被 ReadBookViewModel、ReadBook、ReadManga、BookHelp 读取。
*/
object ReadDataConfig {
var syncBookProgress by prefDelegate(
PreferKey.syncBookProgress,
true
)
var syncBookProgressPlus by prefDelegate(
PreferKey.syncBookProgressPlus,
false
)
var autoChangeSource by prefDelegate(
PreferKey.autoChangeSource,
true
)
var defaultSourceChangeAll by prefDelegate(
PreferKey.defaultSourceChangeAll,
true
)
var readUrlInBrowser by prefDelegate(
PreferKey.readUrlOpenInBrowser,
false
)
var tocUiUseReplace by prefDelegate(
PreferKey.tocUiUseReplace,
false
)
var tocCountWords by prefDelegate(
PreferKey.tocCountWords,
true
)
var preDownloadNum by prefDelegate(
PreferKey.preDownloadNum,
10
)
var imageRetainNum by prefDelegate(
PreferKey.imageRetainNum,
0
)
var keepLight by prefDelegate(
PreferKey.keepLight,
"0"
)
var screenOrientation by prefDelegate(
PreferKey.screenOrientation,
"0"
)
}
@@ -0,0 +1,57 @@
package io.legado.app.ui.config.readConfig
import io.legado.app.constant.PreferKey
import io.legado.app.ui.config.prefDelegate
/**
* 按键/触控交互相关配置
*
* 被 ReadBookController 在按键/鼠标事件处理中读取。
*/
object ReadInteractionConfig {
var mouseWheelPage by prefDelegate(
PreferKey.mouseWheelPage,
true
)
var volumeKeyPage by prefDelegate(
PreferKey.volumeKeyPage,
true
)
var volumeKeyPageOnPlay by prefDelegate(
PreferKey.volumeKeyPageOnPlay,
true
)
var keyPageOnLongPress by prefDelegate(
PreferKey.keyPageOnLongPress,
false
)
var sliderVibrator by prefDelegate(
PreferKey.sliderVibrator,
false
)
var selectVibrator by prefDelegate(
PreferKey.selectVibrator,
false
)
var disableReturnKey by prefDelegate(
PreferKey.disableReturnKey,
false
)
var prevKeys by prefDelegate(
PreferKey.prevKeys,
""
)
var nextKeys by prefDelegate(
PreferKey.nextKeys,
""
)
}
@@ -0,0 +1,106 @@
package io.legado.app.ui.config.readConfig
import io.legado.app.constant.PreferKey
import io.legado.app.ui.config.prefDelegate
/**
* 菜单/标题栏/进度条相关配置
*
* 被 ReadBookMenuBar、标题栏、进度条读取。
*/
object ReadMenuConfig {
var titleBarMode by prefDelegate(
PreferKey.titleBarMode,
"1"
)
var menuAlpha by prefDelegate(
PreferKey.menuAlpha,
100
)
var readBarStyleFollowPage by prefDelegate(
PreferKey.readBarStyleFollowPage,
false
)
var readBarStyle by prefDelegate(
PreferKey.readBarStyle,
0
)
var progressBarBehavior by prefDelegate(
PreferKey.progressBarBehavior,
"page"
)
var expandTextMenu by prefDelegate(
PreferKey.expandTextMenu,
false
)
var showReadTitleAddition by prefDelegate(
PreferKey.showReadTitleAddition,
true
)
// --- 点击区域配置 ---
var clickActionTL by prefDelegate(
PreferKey.clickActionTL,
2
)
var clickActionTC by prefDelegate(
PreferKey.clickActionTC,
2
)
var clickActionTR by prefDelegate(
PreferKey.clickActionTR,
1
)
var clickActionML by prefDelegate(
PreferKey.clickActionML,
2
)
var clickActionMC by prefDelegate(
PreferKey.clickActionMC,
0
)
var clickActionMR by prefDelegate(
PreferKey.clickActionMR,
1
)
var clickActionBL by prefDelegate(
PreferKey.clickActionBL,
2
)
var clickActionBC by prefDelegate(
PreferKey.clickActionBC,
1
)
var clickActionBR by prefDelegate(
PreferKey.clickActionBR,
1
)
fun hasMenuClickArea(): Boolean {
return clickActionTL * clickActionTC * clickActionTR *
clickActionML * clickActionMC * clickActionMR *
clickActionBL * clickActionBC * clickActionBR == 0
}
fun detectClickArea() {
if (!hasMenuClickArea()) {
clickActionMC = 0
}
}
}
@@ -0,0 +1,100 @@
package io.legado.app.ui.config.readConfig
import io.legado.app.BuildConfig
import io.legado.app.constant.PreferKey
import io.legado.app.ui.config.prefDelegate
import io.legado.app.ui.config.themeConfig.ThemeConfig
import io.legado.app.utils.isNightMode
import io.legado.app.utils.sysConfiguration
/**
* 渲染/布局相关配置
*
* 被 ChapterProvider、TextLine、ContentTextView、ReadView 在渲染循环中读取。
*/
object ReadRenderConfig {
val isEInkMode: Boolean
get() = ThemeConfig.appTheme == "4"
var isNightTheme: Boolean
get() = when (ThemeConfig.themeMode) {
"1" -> false
"2" -> true
else -> sysConfiguration.isNightMode
}
set(value) {
val newMode = if (value) "2" else "1"
if (ThemeConfig.themeMode != newMode) {
ThemeConfig.themeMode = newMode
}
}
val enableReview: Boolean
get() = BuildConfig.DEBUG && enableReviewPref
private var enableReviewPref by prefDelegate(
PreferKey.enableReview,
false
)
var useAntiAlias by prefDelegate(
PreferKey.antiAlias,
false
)
var systemTypefaces by prefDelegate(
PreferKey.systemTypefaces,
0
)
var doubleHorizontalPage by prefDelegate(
PreferKey.doublePageHorizontal,
"0"
)
var adaptSpecialStyle by prefDelegate(
PreferKey.adaptSpecialStyle,
true
)
var useUnderline by prefDelegate(
PreferKey.useUnderline,
false
)
var optimizeRender by prefDelegate(
PreferKey.optimizeRender,
false
)
var noAnimScrollPage by prefDelegate(
PreferKey.noAnimScrollPage,
false
)
var paddingDisplayCutouts by prefDelegate(
PreferKey.paddingDisplayCutouts,
false
)
var pageTouchSlop by prefDelegate(
PreferKey.pageTouchSlop,
0
)
var selectText by prefDelegate(
PreferKey.selectText,
true
)
var clickImgWay by prefDelegate(
PreferKey.clickImgWay,
"2"
)
var chineseConverterType by prefDelegate(
PreferKey.chineseConverterType,
0
)
}
@@ -0,0 +1,90 @@
package io.legado.app.ui.config.readConfig
import io.legado.app.constant.PreferKey
import io.legado.app.ui.config.prefDelegate
/**
* TTS/朗读/音频相关配置
*
* 被 BaseReadAloudService、TTSReadAloudService、HttpReadAloudService 读取。
*/
object ReadTtsConfig {
private const val defaultSpeechRate = 5
val speechRatePlay: Int
get() = if (ttsFollowSys) defaultSpeechRate else ttsSpeechRate
var ttsEngine by prefDelegate<String?>(
PreferKey.ttsEngine,
null
)
var ttsFollowSys by prefDelegate(
PreferKey.ttsFollowSys,
true
)
var ttsSpeechRate by prefDelegate(
PreferKey.ttsSpeechRate,
5
)
var ttsTimer by prefDelegate(
PreferKey.ttsTimer,
0
)
var ignoreAudioFocus by prefDelegate(
PreferKey.ignoreAudioFocus,
false
)
var pauseReadAloudWhilePhoneCalls by prefDelegate(
PreferKey.pauseReadAloudWhilePhoneCalls,
false
)
var readAloudWakeLock by prefDelegate(
PreferKey.readAloudWakeLock,
false
)
var mediaButtonPerNext by prefDelegate(
"mediaButtonPerNext",
false
)
var readAloudByPage by prefDelegate(
PreferKey.readAloudByPage,
false
)
var systemMediaControlCompatibilityChange by prefDelegate(
PreferKey.systemMediaControlCompatibilityChange,
true
)
var streamReadAloudAudio by prefDelegate(
PreferKey.streamReadAloudAudio,
false
)
var contentSelectSpeakMod by prefDelegate(
PreferKey.contentSelectSpeakMod,
0
)
var audioPreDownloadNum by prefDelegate(
PreferKey.audioPreDownloadNum,
10
)
var audioCacheCleanTimeOrgin by prefDelegate(
PreferKey.audioCacheCleanTime,
10
)
val audioCacheCleanTime: Long
get() = audioCacheCleanTimeOrgin * 60 * 1000L
}