Просмотр исходного кода

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

HapeLee 4 месяцев назад
Родитель
Сommit
fe076b33ea

+ 12 - 3
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<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
 

+ 9 - 2
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)

+ 1 - 1
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())
         }
     }
 

+ 1 - 2
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