From 64efff6f41d373bb36b3e0464de8715293c66c2f Mon Sep 17 00:00:00 2001 From: HapeLee <1321903405@qq.com> Date: Tue, 10 Mar 2026 00:03:09 +0800 Subject: [PATCH] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=20=E5=A2=9E=E5=8A=A0=20?= =?UTF-8?q?=E9=98=85=E8=AF=BBSigma=20=E7=9A=84=E4=B9=A6=E6=BA=90=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=20(@Luoyacheng)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/model/ReadBook.kt | 12 ++-- .../io/legado/app/model/SourceCallBack.kt | 3 +- .../app/ui/book/audio/AudioPlayActivity.kt | 32 ++++++++++- .../app/ui/book/info/BookInfoActivity.kt | 56 ++++++++++++++++--- .../app/ui/book/info/BookInfoViewModel.kt | 13 +++-- .../book/manage/BookshelfManageViewModel.kt | 4 ++ .../app/ui/book/read/ReadBookActivity.kt | 17 ++++++ .../app/ui/book/read/ReadBookViewModel.kt | 25 ++++++++- 8 files changed, 134 insertions(+), 28 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 3893bb4f2..348812dcb 100644 --- a/app/src/main/java/io/legado/app/model/ReadBook.kt +++ b/app/src/main/java/io/legado/app/model/ReadBook.kt @@ -184,12 +184,6 @@ object ReadBook : CoroutineScope by MainScope(), KoinComponent { } else { appDb.bookSourceDao.getBookSource(book.origin)?.let { bookSource = it - SourceCallBack.callBackBook( - SourceCallBack.START_READ, - it, - book, - curTextChapter?.chapter - ) if (book.getImageStyle().isNullOrBlank()) { var imageStyle = it.getContentRule().imageStyle if (imageStyle.isNullOrBlank() && (book.isImage || book.isPdf)) { @@ -639,9 +633,11 @@ object ReadBook : CoroutineScope by MainScope(), KoinComponent { loadContent(durChapterIndex - 1, resetPageOffset = resetPageOffset) } - fun loadOrUpContent() { + fun loadOrUpContent(success: (() -> Unit)? = null) { if (curTextChapter == null) { - loadContent(durChapterIndex) + loadContent(durChapterIndex) { + success?.invoke() + } } else { callBack?.upContent() } diff --git a/app/src/main/java/io/legado/app/model/SourceCallBack.kt b/app/src/main/java/io/legado/app/model/SourceCallBack.kt index 498e84d1c..dda31583b 100644 --- a/app/src/main/java/io/legado/app/model/SourceCallBack.kt +++ b/app/src/main/java/io/legado/app/model/SourceCallBack.kt @@ -43,6 +43,7 @@ object SourceCallBack { source: BookSource?, book: Book, chapter: BookChapter?, + bookType: Int = 0, noCall: (() -> Unit)? = null ) { if (source == null || !source.eventListener) { @@ -55,7 +56,7 @@ object SourceCallBack { return } activity.lifecycleScope.launch(IO) { - val java = SourceLoginJsExtensions(activity, source) + val java = SourceLoginJsExtensions(activity, source, bookType) kotlin.runCatching { val result = runScriptWithContext { source.evalJS(jsStr) { diff --git a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt index 97fcbd7f5..0cce438a3 100644 --- a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt @@ -45,6 +45,7 @@ import io.legado.app.help.book.removeType import io.legado.app.help.config.AppConfig import io.legado.app.model.AudioPlay import io.legado.app.model.BookCover +import io.legado.app.model.SourceCallBack import io.legado.app.service.AudioPlayService import io.legado.app.ui.about.AppLogDialog import io.legado.app.ui.book.changesource.ChangeBookSourceDialog @@ -164,6 +165,13 @@ class AudioPlayActivity : } } + override fun finish() { + if (AudioPlay.inBookshelf) { + callBackBookEnd() + return super.finish() + } + } + override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.audio_play, menu) return super.onCompatCreateOptionsMenu(menu) @@ -190,7 +198,20 @@ class AudioPlayActivity : } R.id.menu_media_control -> AppConfig.systemMediaControlCompatibilityChange = !AppConfig.systemMediaControlCompatibilityChange R.id.menu_wake_lock -> AppConfig.audioPlayUseWakeLock = !AppConfig.audioPlayUseWakeLock - R.id.menu_copy_audio_url -> sendToClip(AudioPlayService.url) + R.id.menu_copy_audio_url -> { + AudioPlay.book?.let { + SourceCallBack.callBackBtn( + this, + SourceCallBack.CLICK_COPY_PLAY_URL, + AudioPlay.bookSource, + it, + AudioPlay.durChapter, + BookType.audio + ) { + sendToClip(AudioPlayService.url) + } + } + } R.id.menu_edit_source -> AudioPlay.bookSource?.let { sourceEditResult.launch { putExtra("sourceUrl", it.bookSourceUrl) @@ -202,6 +223,15 @@ class AudioPlayActivity : return super.onCompatOptionsItemSelected(item) } + private fun callBackBookEnd() { + SourceCallBack.callBackBook( + SourceCallBack.END_READ, + AudioPlay.bookSource, + AudioPlay.book, + AudioPlay.durChapter + ) + } + private fun initView() { binding.ivTimer.isEnabled = false binding.ivFastForward.isEnabled = false diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index f6edd72bb..8410f6d5a 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -84,7 +84,6 @@ import io.legado.app.utils.gone import io.legado.app.utils.longToastOnUi import io.legado.app.utils.openFileUri import io.legado.app.utils.sendToClip -import io.legado.app.utils.shareWithQr import io.legado.app.utils.showDialogFragment import io.legado.app.utils.startActivity import io.legado.app.utils.toastOnUi @@ -270,9 +269,21 @@ class BookInfoActivity : R.id.menu_share_it -> { viewModel.getBook()?.let { - val bookJson = GSON.toJson(it) - val shareStr = "${it.bookUrl}#$bookJson" - shareWithQr(shareStr, it.name) + SourceCallBack.callBackBtn( + this, + SourceCallBack.CLICK_SHARE_BOOK, + viewModel.bookSource, + it, + null + ) { + val bookJson = GSON.toJson(it) + val shareStr = "${it.bookUrl}#$bookJson" + val intent = Intent(Intent.ACTION_SEND) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + intent.putExtra(Intent.EXTRA_TEXT, shareStr) + intent.type = "text/plain" + startActivity(Intent.createChooser(intent, it.name)) + } } } @@ -294,12 +305,28 @@ class BookInfoActivity : R.id.menu_top -> viewModel.topBook() R.id.menu_set_source_variable -> setSourceVariable() R.id.menu_set_book_variable -> setBookVariable() - R.id.menu_copy_book_url -> viewModel.getBook()?.bookUrl?.let { - sendToClip(it) + R.id.menu_copy_book_url -> viewModel.getBook()?.let { + SourceCallBack.callBackBtn( + this, + SourceCallBack.CLICK_COPY_BOOK_URL, + viewModel.bookSource, + it, + null + ) { + sendToClip(it.bookUrl) + } } - R.id.menu_copy_toc_url -> viewModel.getBook()?.tocUrl?.let { - sendToClip(it) + R.id.menu_copy_toc_url -> viewModel.getBook()?.let { + SourceCallBack.callBackBtn( + this, + SourceCallBack.CLICK_COPY_TOC_URL, + viewModel.bookSource, + it, + null + ) { + sendToClip(it.tocUrl) + } } R.id.menu_can_update -> { @@ -314,7 +341,18 @@ class BookInfoActivity : } } - R.id.menu_clear_cache -> viewModel.clearCache() + R.id.menu_clear_cache -> viewModel.getBook()?.let { + SourceCallBack.callBackBtn( + this, + SourceCallBack.CLICK_CLEAR_CACHE, + viewModel.bookSource, + it, + null + ) { + viewModel.clearCache(it) + } + } + R.id.menu_log -> showDialogFragment() R.id.menu_split_long_chapter -> { upLoading(true) diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt index 958cc52f6..669a7e65c 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt @@ -32,6 +32,7 @@ import io.legado.app.model.AudioPlay import io.legado.app.model.BookCover import io.legado.app.model.ReadBook import io.legado.app.model.ReadManga +import io.legado.app.model.SourceCallBack import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.localBook.LocalBook import io.legado.app.model.webBook.WebBook @@ -446,7 +447,7 @@ class BookInfoViewModel( } } - fun addToBookshelf(success: (() -> Unit)?) { + fun addToBookshelf(success: (() -> Unit)?) { //点击书架按钮或在加分组时触发 execute { bookData.value?.let { book -> book.removeType(BookType.notShelf) @@ -464,6 +465,7 @@ class BookInfoViewModel( AudioPlay.book = book } book.save() + SourceCallBack.callBackBook(SourceCallBack.ADD_BOOK_SHELF, bookSource, book) } chapterListData.value?.let { appDb.bookChapterDao.insert(*it.toTypedArray()) @@ -496,13 +498,13 @@ class BookInfoViewModel( } } - fun clearCache() { + fun clearCache(book: Book) { execute { - BookHelp.clearCache(bookData.value!!) - if (ReadBook.book?.bookUrl == bookData.value!!.bookUrl) { + BookHelp.clearCache(book) + if (ReadBook.book?.bookUrl == book.bookUrl) { ReadBook.clearTextChapter() } - if (ReadManga.book?.bookUrl == bookData.value!!.bookUrl) { + if (ReadManga.book?.bookUrl == book.bookUrl) { ReadManga.clearMangaChapter() } }.onSuccess { @@ -512,7 +514,6 @@ class BookInfoViewModel( } } - fun addToBookshelf(book: Book, toc: List, success: (() -> Unit)? = null) { execute { book.removeType(BookType.notShelf) diff --git a/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageViewModel.kt b/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageViewModel.kt index ded518ae9..07e36a53c 100644 --- a/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageViewModel.kt @@ -14,6 +14,7 @@ import io.legado.app.help.book.isLocal import io.legado.app.help.book.removeType import io.legado.app.help.config.AppConfig import io.legado.app.help.coroutine.Coroutine +import io.legado.app.model.SourceCallBack import io.legado.app.model.localBook.LocalBook import io.legado.app.model.webBook.WebBook import io.legado.app.utils.FileUtils @@ -57,6 +58,9 @@ class BookshelfManageViewModel(application: Application) : BaseViewModel(applica books.forEach { if (it.isLocal) { LocalBook.deleteBook(it, deleteOriginal) + } else { + val source = appDb.bookSourceDao.getBookSource(it.origin) + SourceCallBack.callBackBook(SourceCallBack.DEL_BOOK_SHELF, source, it) } } } 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 ee1ac6095..f14a25a51 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 @@ -62,6 +62,7 @@ import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.selector import io.legado.app.model.ReadAloud import io.legado.app.model.ReadBook +import io.legado.app.model.SourceCallBack import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setChapter import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setCoroutineContext @@ -1864,6 +1865,22 @@ class ReadBookActivity : BaseReadBookActivity(), } } + override fun finish() { + if (ReadBook.inBookshelf) { + callBackBookEnd() + return super.finish() + } + } + + private fun callBackBookEnd() { + SourceCallBack.callBackBook( + SourceCallBack.END_READ, + ReadBook.bookSource, + ReadBook.book, + ReadBook.curTextChapter?.chapter + ) + } + override fun onDestroy() { super.onDestroy() tts?.clearTts() diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index fdf88560c..00a3aab5c 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -25,6 +25,7 @@ import io.legado.app.help.coroutine.Coroutine import io.legado.app.model.ImageProvider import io.legado.app.model.ReadAloud import io.legado.app.model.ReadBook +import io.legado.app.model.SourceCallBack import io.legado.app.model.localBook.LocalBook import io.legado.app.model.webBook.WebBook import io.legado.app.service.BaseReadAloudService @@ -117,14 +118,32 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { } ReadBook.upMsg(null) if (!isSameBook) { - ReadBook.loadContent(resetPageOffset = true) + ReadBook.loadContent(resetPageOffset = true) { + ReadBook.bookSource?.let { + SourceCallBack.callBackBook( + SourceCallBack.START_READ, + it, + book, + ReadBook.curTextChapter?.chapter + ) + } + } } else { - ReadBook.loadOrUpContent() + ReadBook.loadOrUpContent { + ReadBook.bookSource?.let { + SourceCallBack.callBackBook( + SourceCallBack.START_READ, + it, + book, + ReadBook.curTextChapter?.chapter + ) + } + } } if (ReadBook.chapterChanged) { // 有章节跳转不同步阅读进度 ReadBook.chapterChanged = false - } else if (!isSameBook || !BaseReadAloudService.isRun) { + } else if (!(isSameBook && BaseReadAloudService.isRun) && ReadBook.inBookshelf) { if (AppConfig.syncBookProgressPlus) { ReadBook.syncProgress({ progress -> ReadBook.callBack?.sureNewProgress(progress) }) } else {