diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookContract.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookContract.kt index 4bb33eed4..7aaafbadd 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookContract.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookContract.kt @@ -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 = 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 diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookController.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookController.kt index 3e0381b48..1b5600a19 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookController.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookController.kt @@ -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) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookScreen.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookScreen.kt index 3bae8d23e..35702677b 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookScreen.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookScreen.kt @@ -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()) } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt index a31bca765..b1a3c09b2 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt @@ -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