fix: 修复朗读退出行为及从选择位置朗读崩溃,CloseReadBook 支持 keepReadAloud
This commit is contained in:
@@ -14,7 +14,9 @@ import io.legado.app.data.entities.HighlightRule
|
|||||||
import io.legado.app.data.entities.HttpTTS
|
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.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.entities.TextPos
|
||||||
import io.legado.app.ui.book.searchContent.SearchResult
|
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.ImmutableList
|
||||||
import kotlinx.collections.immutable.ImmutableMap
|
import kotlinx.collections.immutable.ImmutableMap
|
||||||
import kotlinx.collections.immutable.persistentListOf
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
@@ -140,6 +142,7 @@ data class ReadBookUiState(
|
|||||||
val selectedTtsEngine: String? = null,
|
val selectedTtsEngine: String? = null,
|
||||||
val speakEngineName: String = "",
|
val speakEngineName: String = "",
|
||||||
val editingHttpTts: HttpTTS? = null,
|
val editingHttpTts: HttpTTS? = null,
|
||||||
|
val httpTtsImportState: BaseImportUiState<HttpTTS> = BaseImportUiState.Idle,
|
||||||
val preDownloadNum: Int = 10,
|
val preDownloadNum: Int = 10,
|
||||||
val audioCacheCleanTime: Int = 10,
|
val audioCacheCleanTime: Int = 10,
|
||||||
// Read aloud config
|
// Read aloud config
|
||||||
@@ -430,7 +433,7 @@ sealed interface ReadBookIntent {
|
|||||||
|
|
||||||
// Default font picker (needs Activity for AlertDialog)
|
// Default font picker (needs Activity for AlertDialog)
|
||||||
// Text action menu (moved from Activity)
|
// 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 TextActionBookmark(val bookmark: Bookmark) : ReadBookIntent
|
||||||
data class TextActionReplace(val text: String) : ReadBookIntent
|
data class TextActionReplace(val text: String) : ReadBookIntent
|
||||||
data class TextActionSearchContent(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 class ImportHttpTtsSource(val text: String) : ReadBookIntent
|
||||||
data object ImportHttpTtsFile : ReadBookIntent
|
data object ImportHttpTtsFile : ReadBookIntent
|
||||||
data class ImportHttpTtsFileSelected(val uri: Uri) : 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 ExportAllHttpTts : ReadBookIntent
|
||||||
|
data object ExportAllHttpTtsAsUrl : ReadBookIntent
|
||||||
data class ExportHttpTtsToFile(val uri: Uri) : ReadBookIntent
|
data class ExportHttpTtsToFile(val uri: Uri) : ReadBookIntent
|
||||||
data class SetReadAloudIgnoreAudioFocus(val value: Boolean) : ReadBookIntent
|
data class SetReadAloudIgnoreAudioFocus(val value: Boolean) : ReadBookIntent
|
||||||
data class SetReadAloudPauseOnPhoneCall(val value: Boolean) : ReadBookIntent
|
data class SetReadAloudPauseOnPhoneCall(val value: Boolean) : ReadBookIntent
|
||||||
@@ -510,7 +519,7 @@ sealed interface ReadBookIntent {
|
|||||||
data object OnResume : ReadBookIntent
|
data object OnResume : ReadBookIntent
|
||||||
data object OnPause : ReadBookIntent
|
data object OnPause : ReadBookIntent
|
||||||
data object OnDispose : ReadBookIntent
|
data object OnDispose : ReadBookIntent
|
||||||
data object CloseReadBook : ReadBookIntent
|
data class CloseReadBook(val keepReadAloud: Boolean = false) : ReadBookIntent
|
||||||
data object OpenBooksDirPicker : ReadBookIntent
|
data object OpenBooksDirPicker : ReadBookIntent
|
||||||
data class BooksDirSelected(val uri: Uri) : ReadBookIntent
|
data class BooksDirSelected(val uri: Uri) : ReadBookIntent
|
||||||
}
|
}
|
||||||
@@ -593,7 +602,7 @@ sealed interface ReadBookEffect {
|
|||||||
data class SyncBookProgress(val book: Book) : ReadBookEffect
|
data class SyncBookProgress(val book: Book) : ReadBookEffect
|
||||||
|
|
||||||
// Text action menu (needs Activity for View operations)
|
// 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 TextActionSpeak(val text: String) : ReadBookEffect
|
||||||
data class TextActionReplace(val text: String, val bookName: String?, val bookSourceUrl: 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 {
|
override fun onMenuItemSelected(itemId: Int): Boolean {
|
||||||
when (itemId) {
|
when (itemId) {
|
||||||
R.id.menu_aloud -> {
|
R.id.menu_aloud -> {
|
||||||
viewModel.onIntent(ReadBookIntent.TextActionAloud(selectedText))
|
viewModel.onIntent(
|
||||||
|
ReadBookIntent.TextActionAloud(
|
||||||
|
selectedText,
|
||||||
|
refs?.readView?.curPage?.selectStartPos?.copy(),
|
||||||
|
)
|
||||||
|
)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -715,7 +720,9 @@ class ReadBookController(
|
|||||||
is ReadBookEffect.ToggleAutoPage -> onToggleAutoPage?.invoke() ?: toggleAutoPage()
|
is ReadBookEffect.ToggleAutoPage -> onToggleAutoPage?.invoke() ?: toggleAutoPage()
|
||||||
is ReadBookEffect.StopAutoPage -> onStopAutoPage?.invoke() ?: stopAutoPage()
|
is ReadBookEffect.StopAutoPage -> onStopAutoPage?.invoke() ?: stopAutoPage()
|
||||||
is ReadBookEffect.TextActionAloudSelect -> {
|
is ReadBookEffect.TextActionAloudSelect -> {
|
||||||
activity.lifecycleScope.launch { refs?.readView?.aloudStartSelect() }
|
activity.lifecycleScope.launch {
|
||||||
|
refs?.readView?.aloudStartSelect(effect.selectStartPos.copy())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
is ReadBookEffect.TextActionSpeak -> speak(effect.text)
|
is ReadBookEffect.TextActionSpeak -> speak(effect.text)
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ fun ReadBookScreen(
|
|||||||
state.isShowingSearchResult -> onIntent(ReadBookIntent.ExitSearch)
|
state.isShowingSearchResult -> onIntent(ReadBookIntent.ExitSearch)
|
||||||
state.menuVisible -> onIntent(ReadBookIntent.ReadMenuBack)
|
state.menuVisible -> onIntent(ReadBookIntent.ReadMenuBack)
|
||||||
state.isAutoPage -> onIntent(ReadBookIntent.StopAutoPage)
|
state.isAutoPage -> onIntent(ReadBookIntent.StopAutoPage)
|
||||||
else -> onIntent(ReadBookIntent.CloseReadBook)
|
else -> onIntent(ReadBookIntent.CloseReadBook())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -658,8 +658,7 @@ class ReadView(
|
|||||||
/**
|
/**
|
||||||
* 从选择位置开始朗读
|
* 从选择位置开始朗读
|
||||||
*/
|
*/
|
||||||
suspend fun aloudStartSelect() {
|
suspend fun aloudStartSelect(selectStartPos: TextPos) {
|
||||||
val selectStartPos = curPage.selectStartPos
|
|
||||||
var pagePos = selectStartPos.relativePagePos
|
var pagePos = selectStartPos.relativePagePos
|
||||||
val line = selectStartPos.lineIndex
|
val line = selectStartPos.lineIndex
|
||||||
val column = selectStartPos.columnIndex
|
val column = selectStartPos.columnIndex
|
||||||
|
|||||||
Reference in New Issue
Block a user