From 2a198aed8f7ff82c5ee6e67c1aa70298f05918b4 Mon Sep 17 00:00:00 2001 From: kunfei Date: Fri, 12 Aug 2022 23:06:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=8E=E6=96=87=E5=AD=97=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E5=A4=84=E5=BC=80=E5=A7=8B=E6=9C=97=E8=AF=BB,=E6=9C=AA?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/model/ReadBook.kt | 16 +++++++++--- .../app/service/BaseReadAloudService.kt | 18 ++++++------- .../app/ui/book/read/ReadBookActivity.kt | 4 +-- .../legado/app/ui/book/read/page/PageView.kt | 4 +-- .../legado/app/ui/book/read/page/ReadView.kt | 11 ++++++++ .../ui/book/read/page/entities/TextChapter.kt | 26 +++++++++++++++++-- 6 files changed, 57 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/ReadBook.kt b/app/src/main/java/io/legado/app/model/ReadBook.kt index 199bf05e1..7f9f6d1df 100644 --- a/app/src/main/java/io/legado/app/model/ReadBook.kt +++ b/app/src/main/java/io/legado/app/model/ReadBook.kt @@ -131,10 +131,18 @@ object ReadBook : CoroutineScope by MainScope() { } } - fun moveToNextPage() { - durChapterPos = curTextChapter?.getNextPageLength(durChapterPos) ?: durChapterPos - callBack?.upContent() - saveRead() + fun moveToNextPage(): Boolean { + var hasNextPage = false + curTextChapter?.let { + val nextPagePos = it.getNextPageLength(durChapterPos) + if (nextPagePos >= 0) { + hasNextPage = true + durChapterPos = nextPagePos + callBack?.upContent() + saveRead() + } + } + return hasNextPage } fun moveToNextChapter(upContent: Boolean): Boolean { diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index b1eefc712..fda71a8ce 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -100,13 +100,11 @@ abstract class BaseReadAloudService : BaseService(), override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { when (intent?.action) { - IntentAction.play -> { - textChapter = ReadBook.curTextChapter - pageIndex = intent.getIntExtra("pageIndex", ReadBook.durPageIndex) - newReadAloud( - intent.getBooleanExtra("play", true) - ) - } + IntentAction.play -> newReadAloud( + intent.getBooleanExtra("play", true), + intent.getIntExtra("pageIndex", ReadBook.durPageIndex), + intent.getIntExtra("startPos", 0) + ) IntentAction.pause -> pauseReadAloud(true) IntentAction.resume -> resumeReadAloud() IntentAction.upTtsSpeechRate -> upSpeechRate(true) @@ -119,11 +117,11 @@ abstract class BaseReadAloudService : BaseService(), return super.onStartCommand(intent, flags, startId) } - @CallSuper - open fun newReadAloud(play: Boolean) { + private fun newReadAloud(play: Boolean, pageIndex: Int, startPos: Int) { + textChapter = ReadBook.curTextChapter textChapter?.let { textChapter -> nowSpeak = 0 - readAloudNumber = textChapter.getReadLength(pageIndex) + readAloudNumber = textChapter.getReadLength(pageIndex) + startPos contentList.clear() if (getPrefBoolean(PreferKey.readAloudByPage)) { for (index in pageIndex..textChapter.lastIndex) { diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index 271d3d9ac..6e63da661 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -616,9 +616,7 @@ class ReadBookActivity : BaseReadBookActivity(), */ override fun onMenuItemSelected(itemId: Int): Boolean { when (itemId) { - R.id.menu_aloud -> { - ReadBook.readAloud() - } + R.id.menu_aloud -> binding.readView.aloudStartSelect() R.id.menu_bookmark -> binding.readView.curPage.let { val bookmark = it.createBookmark() if (bookmark == null) { diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt index 5dfb51162..f8d86fa9e 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt @@ -14,7 +14,6 @@ import io.legado.app.help.config.ReadTipConfig import io.legado.app.model.ReadBook import io.legado.app.ui.book.read.ReadBookActivity 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.read.page.provider.ChapterProvider import io.legado.app.ui.widget.BatteryView import io.legado.app.utils.activity @@ -313,8 +312,7 @@ class PageView(context: Context) : FrameLayout(context) { val textPage get() = binding.contentTextView.textPage - val selectStart: TextPos get() = binding.contentTextView.selectStart - val selectedText: String get() = binding.contentTextView.getSelectedText() + val selectStartPos get() = binding.contentTextView.selectStart } \ No newline at end of file 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 afe9a4deb..1c22fd203 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 @@ -531,6 +531,17 @@ class ReadView(context: Context, attrs: AttributeSet) : nextPage.upBattery(battery) } + /** + * 从选择位置开始朗读 + */ + fun aloudStartSelect() { + val selectStartPos = curPage.selectStartPos + if (selectStartPos.relativePagePos > 0) { + ReadBook.moveToNextPage() + } + //TODO 未完成 + } + fun getSelectText(): String { return curPage.selectedText } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextChapter.kt b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextChapter.kt index feb8d40aa..0f7996bb7 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextChapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextChapter.kt @@ -28,10 +28,18 @@ data class TextChapter( val pageSize: Int get() = pages.size + /** + * @param index 页数 + * @return 是否是最后一页 + */ fun isLastIndex(index: Int): Boolean { return index >= pages.size - 1 } + /** + * @param pageIndex 页数 + * @return 已读长度 + */ fun getReadLength(pageIndex: Int): Int { var length = 0 val maxIndex = min(pageIndex, pages.size) @@ -41,10 +49,21 @@ data class TextChapter( return length } + /** + * @param length 当前页面文字在章节中的位置 + * @return 下一页位置,如果没有下一页返回-1 + */ fun getNextPageLength(length: Int): Int { - return getReadLength(getPageIndexByCharIndex(length) + 1) + val pageIndex = getPageIndexByCharIndex(length) + if (pageIndex + 1 >= pageSize) { + return -1 + } + return getReadLength(pageIndex + 1) } + /** + * @return 获取未读文字 + */ fun getUnRead(pageIndex: Int): String { val stringBuilder = StringBuilder() if (pages.isNotEmpty()) { @@ -55,6 +74,9 @@ data class TextChapter( return stringBuilder.toString() } + /** + * 获取内容 + */ fun getContent(): String { val stringBuilder = StringBuilder() pages.forEach { @@ -64,7 +86,7 @@ data class TextChapter( } /** - * 根据索引位置获取所在页 + * @return 根据索引位置获取所在页 */ fun getPageIndexByCharIndex(charIndex: Int): Int { var length = 0