fix: 朗读配置面板无法标识当前引擎及切换引擎后状态不一致

This commit is contained in:
HapeLee committed 2026-06-08 01:19:47 +08:00
1 parent 40cb04dfab
commit 3647ee7979
3 files changed
+39 -7

No files matched your search

@@ -133,6 +133,7 @@ data class ReadBookUiState(
val contentEditSaveToSource: Boolean = false, val contentEditSaveToSource: Boolean = false,
val ttsEngineItems: ImmutableList<ReadBookTtsEngineItem> = persistentListOf(), val ttsEngineItems: ImmutableList<ReadBookTtsEngineItem> = persistentListOf(),
val selectedTtsEngine: String? = null, val selectedTtsEngine: String? = null,
val speakEngineName: String = "",
val preDownloadNum: Int = 10, val preDownloadNum: Int = 10,
val audioCacheCleanTime: Int = 10, val audioCacheCleanTime: Int = 10,
// Read aloud config // Read aloud config
@@ -39,10 +39,9 @@ import io.legado.app.help.book.removeType
import io.legado.app.help.book.simulatedTotalChapterNum import io.legado.app.help.book.simulatedTotalChapterNum
import io.legado.app.help.config.AppConfig import io.legado.app.help.config.AppConfig
import io.legado.app.help.config.ReadBookConfig import io.legado.app.help.config.ReadBookConfig
import io.legado.app.ui.config.themeConfig.ThemeConfig
import io.legado.app.ui.book.read.config.HighlightRuleStore
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.source.getSourceType import io.legado.app.help.source.getSourceType
import io.legado.app.lib.dialogs.SelectItem
import io.legado.app.model.ImageProvider import io.legado.app.model.ImageProvider
import io.legado.app.model.ReadAloud import io.legado.app.model.ReadAloud
import io.legado.app.model.ReadBook import io.legado.app.model.ReadBook
@@ -53,15 +52,19 @@ import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setCoroutineContext
import io.legado.app.model.localBook.LocalBook import io.legado.app.model.localBook.LocalBook
import io.legado.app.model.webBook.WebBook import io.legado.app.model.webBook.WebBook
import io.legado.app.service.BaseReadAloudService import io.legado.app.service.BaseReadAloudService
import io.legado.app.ui.book.read.config.HighlightRuleStore
import io.legado.app.ui.book.read.page.entities.TextChapter import io.legado.app.ui.book.read.page.entities.TextChapter
import io.legado.app.ui.book.read.page.entities.TextPage import io.legado.app.ui.book.read.page.entities.TextPage
import io.legado.app.ui.book.read.page.provider.ChapterProvider import io.legado.app.ui.book.read.page.provider.ChapterProvider
import io.legado.app.ui.book.read.page.provider.TextChapterLayout import io.legado.app.ui.book.read.page.provider.TextChapterLayout
import splitties.init.appCtx
import io.legado.app.ui.book.searchContent.SearchResult import io.legado.app.ui.book.searchContent.SearchResult
import io.legado.app.ui.config.otherConfig.OtherConfig import io.legado.app.ui.config.otherConfig.OtherConfig
import io.legado.app.ui.config.themeConfig.ThemeConfig
import io.legado.app.utils.GSON
import io.legado.app.utils.ImageSaveUtils import io.legado.app.utils.ImageSaveUtils
import io.legado.app.utils.NetworkUtils import io.legado.app.utils.NetworkUtils
import io.legado.app.utils.fromJsonObject
import io.legado.app.utils.StringUtils
import io.legado.app.utils.hexString import io.legado.app.utils.hexString
import io.legado.app.utils.isAbsUrl import io.legado.app.utils.isAbsUrl
import io.legado.app.utils.isTrue import io.legado.app.utils.isTrue
@@ -525,7 +528,13 @@ class ReadBookViewModel(
} }
is ReadBookIntent.ShowReadAloudConfig -> { is ReadBookIntent.ShowReadAloudConfig -> {
_uiState.update { it.copy(activeSheet = ReadBookSheet.ReadAloudConfig) } _uiState.update {
it.copy(
speakEngineName = computeSpeakEngineName(),
activeSheet = ReadBookSheet.ReadAloudConfig,
)
}
loadTtsEngineItems()
} }
is ReadBookIntent.SelectSpeakEngine -> { is ReadBookIntent.SelectSpeakEngine -> {
@@ -554,7 +563,8 @@ class ReadBookViewModel(
AppConfig.ttsEngine = intent.value AppConfig.ttsEngine = intent.value
_uiState.update { _uiState.update {
it.copy( it.copy(
selectedTtsEngine = intent.value, selectedTtsEngine = ReadAloud.ttsEngine,
speakEngineName = computeSpeakEngineName(),
activeSheet = ReadBookSheet.ReadAloudConfig, activeSheet = ReadBookSheet.ReadAloudConfig,
) )
} }
@@ -850,6 +860,12 @@ class ReadBookViewModel(
} }
private fun showSpeakEngineConfig() { private fun showSpeakEngineConfig() {
loadTtsEngineItems {
_uiState.update { it.copy(activeSheet = ReadBookSheet.SpeakEngineConfig) }
}
}
private fun loadTtsEngineItems(onSuccess: (() -> Unit)? = null) {
execute { execute {
buildList { buildList {
add(ReadBookTtsEngineItem(context.getString(R.string.system_tts), null)) add(ReadBookTtsEngineItem(context.getString(R.string.system_tts), null))
@@ -861,13 +877,25 @@ class ReadBookViewModel(
_uiState.update { _uiState.update {
it.copy( it.copy(
ttsEngineItems = items.toImmutableList(), ttsEngineItems = items.toImmutableList(),
selectedTtsEngine = AppConfig.ttsEngine, selectedTtsEngine = ReadAloud.ttsEngine,
activeSheet = ReadBookSheet.SpeakEngineConfig,
) )
} }
onSuccess?.invoke()
} }
} }
private fun computeSpeakEngineName(): String {
val ttsEngine = ReadAloud.ttsEngine
?: return context.getString(R.string.system_tts)
if (StringUtils.isNumeric(ttsEngine)) {
return appDb.httpTTSDao.getName(ttsEngine.toLong())
?: context.getString(R.string.system_tts)
}
return GSON.fromJsonObject<SelectItem<String>>(ttsEngine)
.getOrNull()?.title
?: context.getString(R.string.system_tts)
}
/** /**
* Called from the network changed listener (registered by route). * Called from the network changed listener (registered by route).
*/ */
@@ -97,6 +97,9 @@ fun ReadAloudConfigSheet(
) )
TinyClickableSettingItem( TinyClickableSettingItem(
title = stringResource(R.string.speak_engine), title = stringResource(R.string.speak_engine),
description = state.speakEngineName.ifEmpty {
stringResource(R.string.system_tts)
},
onClick = { onIntent(ReadBookIntent.SelectSpeakEngine) }, onClick = { onIntent(ReadBookIntent.SelectSpeakEngine) },
) )
TinyClickableSettingItem( TinyClickableSettingItem(