fix: 修复朗读退出行为及从选择位置朗读崩溃,CloseReadBook 支持 keepReadAloud

This commit is contained in:
HapeLee
2026-06-19 00:20:05 +08:00
parent 96214ed856
commit fe076b33ea
4 changed files with 23 additions and 8 deletions
@@ -14,7 +14,9 @@ import io.legado.app.data.entities.HighlightRule
import io.legado.app.data.entities.HttpTTS
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.TextPos
import io.legado.app.ui.book.searchContent.SearchResult
import io.legado.app.ui.widget.components.importComponents.BaseImportUiState
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.ImmutableMap
import kotlinx.collections.immutable.persistentListOf
@@ -140,6 +142,7 @@ data class ReadBookUiState(
val selectedTtsEngine: String? = null,
val speakEngineName: String = "",
val editingHttpTts: HttpTTS? = null,
val httpTtsImportState: BaseImportUiState<HttpTTS> = BaseImportUiState.Idle,
val preDownloadNum: Int = 10,
val audioCacheCleanTime: Int = 10,
// Read aloud config
@@ -430,7 +433,7 @@ sealed interface ReadBookIntent {
// Default font picker (needs Activity for AlertDialog)
// Text action menu (moved from Activity)
data class TextActionAloud(val text: String) : ReadBookIntent
data class TextActionAloud(val text: String, val selectStartPos: TextPos?) : ReadBookIntent
data class TextActionBookmark(val bookmark: Bookmark) : ReadBookIntent
data class TextActionReplace(val text: String) : ReadBookIntent
data class TextActionSearchContent(val text: String) : ReadBookIntent
@@ -467,7 +470,13 @@ sealed interface ReadBookIntent {
data class ImportHttpTtsSource(val text: String) : ReadBookIntent
data object ImportHttpTtsFile : ReadBookIntent
data class ImportHttpTtsFileSelected(val uri: Uri) : ReadBookIntent
data object CancelHttpTtsImport : ReadBookIntent
data class ToggleHttpTtsImportSelection(val index: Int) : ReadBookIntent
data class ToggleHttpTtsImportAll(val isSelected: Boolean) : ReadBookIntent
data class UpdateHttpTtsImportItem(val index: Int, val httpTTS: HttpTTS) : ReadBookIntent
data object SaveImportedHttpTts : ReadBookIntent
data object ExportAllHttpTts : ReadBookIntent
data object ExportAllHttpTtsAsUrl : ReadBookIntent
data class ExportHttpTtsToFile(val uri: Uri) : ReadBookIntent
data class SetReadAloudIgnoreAudioFocus(val value: Boolean) : ReadBookIntent
data class SetReadAloudPauseOnPhoneCall(val value: Boolean) : ReadBookIntent
@@ -510,7 +519,7 @@ sealed interface ReadBookIntent {
data object OnResume : ReadBookIntent
data object OnPause : ReadBookIntent
data object OnDispose : ReadBookIntent
data object CloseReadBook : ReadBookIntent
data class CloseReadBook(val keepReadAloud: Boolean = false) : ReadBookIntent
data object OpenBooksDirPicker : ReadBookIntent
data class BooksDirSelected(val uri: Uri) : ReadBookIntent
}
@@ -593,7 +602,7 @@ sealed interface ReadBookEffect {
data class SyncBookProgress(val book: Book) : ReadBookEffect
// Text action menu (needs Activity for View operations)
data object TextActionAloudSelect : ReadBookEffect
data class TextActionAloudSelect(val selectStartPos: TextPos) : ReadBookEffect
data class TextActionSpeak(val text: String) : ReadBookEffect
data class TextActionReplace(val text: String, val bookName: String?, val bookSourceUrl: String?) : ReadBookEffect
@@ -535,7 +535,12 @@ class ReadBookController(
override fun onMenuItemSelected(itemId: Int): Boolean {
when (itemId) {
R.id.menu_aloud -> {
viewModel.onIntent(ReadBookIntent.TextActionAloud(selectedText))
viewModel.onIntent(
ReadBookIntent.TextActionAloud(
selectedText,
refs?.readView?.curPage?.selectStartPos?.copy(),
)
)
return true
}
@@ -715,7 +720,9 @@ class ReadBookController(
is ReadBookEffect.ToggleAutoPage -> onToggleAutoPage?.invoke() ?: toggleAutoPage()
is ReadBookEffect.StopAutoPage -> onStopAutoPage?.invoke() ?: stopAutoPage()
is ReadBookEffect.TextActionAloudSelect -> {
activity.lifecycleScope.launch { refs?.readView?.aloudStartSelect() }
activity.lifecycleScope.launch {
refs?.readView?.aloudStartSelect(effect.selectStartPos.copy())
}
}
is ReadBookEffect.TextActionSpeak -> speak(effect.text)
@@ -59,7 +59,7 @@ fun ReadBookScreen(
state.isShowingSearchResult -> onIntent(ReadBookIntent.ExitSearch)
state.menuVisible -> onIntent(ReadBookIntent.ReadMenuBack)
state.isAutoPage -> onIntent(ReadBookIntent.StopAutoPage)
else -> onIntent(ReadBookIntent.CloseReadBook)
else -> onIntent(ReadBookIntent.CloseReadBook())
}
}
@@ -658,8 +658,7 @@ class ReadView(
/**
* 从选择位置开始朗读
*/
suspend fun aloudStartSelect() {
val selectStartPos = curPage.selectStartPos
suspend fun aloudStartSelect(selectStartPos: TextPos) {
var pagePos = selectStartPos.relativePagePos
val line = selectStartPos.lineIndex
val column = selectStartPos.columnIndex