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

[优化] 增加 阅读Sigma 的书源回调 (@Luoyacheng)

HapeLee 8 месяцев назад
Родитель
Сommit
64efff6f41

+ 4 - 8
app/src/main/java/io/legado/app/model/ReadBook.kt

@@ -184,12 +184,6 @@ object ReadBook : CoroutineScope by MainScope(), KoinComponent {
         } else {
         } else {
             appDb.bookSourceDao.getBookSource(book.origin)?.let {
             appDb.bookSourceDao.getBookSource(book.origin)?.let {
                 bookSource = it
                 bookSource = it
-                SourceCallBack.callBackBook(
-                    SourceCallBack.START_READ,
-                    it,
-                    book,
-                    curTextChapter?.chapter
-                )
                 if (book.getImageStyle().isNullOrBlank()) {
                 if (book.getImageStyle().isNullOrBlank()) {
                     var imageStyle = it.getContentRule().imageStyle
                     var imageStyle = it.getContentRule().imageStyle
                     if (imageStyle.isNullOrBlank() && (book.isImage || book.isPdf)) {
                     if (imageStyle.isNullOrBlank() && (book.isImage || book.isPdf)) {
@@ -639,9 +633,11 @@ object ReadBook : CoroutineScope by MainScope(), KoinComponent {
         loadContent(durChapterIndex - 1, resetPageOffset = resetPageOffset)
         loadContent(durChapterIndex - 1, resetPageOffset = resetPageOffset)
     }
     }
 
 
-    fun loadOrUpContent() {
+    fun loadOrUpContent(success: (() -> Unit)? = null) {
         if (curTextChapter == null) {
         if (curTextChapter == null) {
-            loadContent(durChapterIndex)
+            loadContent(durChapterIndex) {
+                success?.invoke()
+            }
         } else {
         } else {
             callBack?.upContent()
             callBack?.upContent()
         }
         }

+ 2 - 1
app/src/main/java/io/legado/app/model/SourceCallBack.kt

@@ -43,6 +43,7 @@ object SourceCallBack {
         source: BookSource?,
         source: BookSource?,
         book: Book,
         book: Book,
         chapter: BookChapter?,
         chapter: BookChapter?,
+        bookType: Int = 0,
         noCall: (() -> Unit)? = null
         noCall: (() -> Unit)? = null
     ) {
     ) {
         if (source == null || !source.eventListener) {
         if (source == null || !source.eventListener) {
@@ -55,7 +56,7 @@ object SourceCallBack {
             return
             return
         }
         }
         activity.lifecycleScope.launch(IO) {
         activity.lifecycleScope.launch(IO) {
-            val java = SourceLoginJsExtensions(activity, source)
+            val java = SourceLoginJsExtensions(activity, source, bookType)
             kotlin.runCatching {
             kotlin.runCatching {
                 val result = runScriptWithContext {
                 val result = runScriptWithContext {
                     source.evalJS(jsStr) {
                     source.evalJS(jsStr) {

+ 31 - 1
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.help.config.AppConfig
 import io.legado.app.model.AudioPlay
 import io.legado.app.model.AudioPlay
 import io.legado.app.model.BookCover
 import io.legado.app.model.BookCover
+import io.legado.app.model.SourceCallBack
 import io.legado.app.service.AudioPlayService
 import io.legado.app.service.AudioPlayService
 import io.legado.app.ui.about.AppLogDialog
 import io.legado.app.ui.about.AppLogDialog
 import io.legado.app.ui.book.changesource.ChangeBookSourceDialog
 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 {
     override fun onCompatCreateOptionsMenu(menu: Menu): Boolean {
         menuInflater.inflate(R.menu.audio_play, menu)
         menuInflater.inflate(R.menu.audio_play, menu)
         return super.onCompatCreateOptionsMenu(menu)
         return super.onCompatCreateOptionsMenu(menu)
@@ -190,7 +198,20 @@ class AudioPlayActivity :
             }
             }
             R.id.menu_media_control -> AppConfig.systemMediaControlCompatibilityChange = !AppConfig.systemMediaControlCompatibilityChange
             R.id.menu_media_control -> AppConfig.systemMediaControlCompatibilityChange = !AppConfig.systemMediaControlCompatibilityChange
             R.id.menu_wake_lock -> AppConfig.audioPlayUseWakeLock = !AppConfig.audioPlayUseWakeLock
             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 {
             R.id.menu_edit_source -> AudioPlay.bookSource?.let {
                 sourceEditResult.launch {
                 sourceEditResult.launch {
                     putExtra("sourceUrl", it.bookSourceUrl)
                     putExtra("sourceUrl", it.bookSourceUrl)
@@ -202,6 +223,15 @@ class AudioPlayActivity :
         return super.onCompatOptionsItemSelected(item)
         return super.onCompatOptionsItemSelected(item)
     }
     }
 
 
+    private fun callBackBookEnd() {
+        SourceCallBack.callBackBook(
+            SourceCallBack.END_READ,
+            AudioPlay.bookSource,
+            AudioPlay.book,
+            AudioPlay.durChapter
+        )
+    }
+
     private fun initView() {
     private fun initView() {
         binding.ivTimer.isEnabled = false
         binding.ivTimer.isEnabled = false
         binding.ivFastForward.isEnabled = false
         binding.ivFastForward.isEnabled = false

+ 47 - 9
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.longToastOnUi
 import io.legado.app.utils.openFileUri
 import io.legado.app.utils.openFileUri
 import io.legado.app.utils.sendToClip
 import io.legado.app.utils.sendToClip
-import io.legado.app.utils.shareWithQr
 import io.legado.app.utils.showDialogFragment
 import io.legado.app.utils.showDialogFragment
 import io.legado.app.utils.startActivity
 import io.legado.app.utils.startActivity
 import io.legado.app.utils.toastOnUi
 import io.legado.app.utils.toastOnUi
@@ -270,9 +269,21 @@ class BookInfoActivity :
 
 
             R.id.menu_share_it -> {
             R.id.menu_share_it -> {
                 viewModel.getBook()?.let {
                 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_top -> viewModel.topBook()
             R.id.menu_set_source_variable -> setSourceVariable()
             R.id.menu_set_source_variable -> setSourceVariable()
             R.id.menu_set_book_variable -> setBookVariable()
             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 -> {
             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<AppLogDialog>()
             R.id.menu_log -> showDialogFragment<AppLogDialog>()
             R.id.menu_split_long_chapter -> {
             R.id.menu_split_long_chapter -> {
                 upLoading(true)
                 upLoading(true)

+ 7 - 6
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.BookCover
 import io.legado.app.model.ReadBook
 import io.legado.app.model.ReadBook
 import io.legado.app.model.ReadManga
 import io.legado.app.model.ReadManga
+import io.legado.app.model.SourceCallBack
 import io.legado.app.model.analyzeRule.AnalyzeUrl
 import io.legado.app.model.analyzeRule.AnalyzeUrl
 import io.legado.app.model.localBook.LocalBook
 import io.legado.app.model.localBook.LocalBook
 import io.legado.app.model.webBook.WebBook
 import io.legado.app.model.webBook.WebBook
@@ -446,7 +447,7 @@ class BookInfoViewModel(
         }
         }
     }
     }
 
 
-    fun addToBookshelf(success: (() -> Unit)?) {
+    fun addToBookshelf(success: (() -> Unit)?) { //点击书架按钮或在加分组时触发
         execute {
         execute {
             bookData.value?.let { book ->
             bookData.value?.let { book ->
                 book.removeType(BookType.notShelf)
                 book.removeType(BookType.notShelf)
@@ -464,6 +465,7 @@ class BookInfoViewModel(
                     AudioPlay.book = book
                     AudioPlay.book = book
                 }
                 }
                 book.save()
                 book.save()
+                SourceCallBack.callBackBook(SourceCallBack.ADD_BOOK_SHELF, bookSource, book)
             }
             }
             chapterListData.value?.let {
             chapterListData.value?.let {
                 appDb.bookChapterDao.insert(*it.toTypedArray())
                 appDb.bookChapterDao.insert(*it.toTypedArray())
@@ -496,13 +498,13 @@ class BookInfoViewModel(
         }
         }
     }
     }
 
 
-    fun clearCache() {
+    fun clearCache(book: Book) {
         execute {
         execute {
-            BookHelp.clearCache(bookData.value!!)
-            if (ReadBook.book?.bookUrl == bookData.value!!.bookUrl) {
+            BookHelp.clearCache(book)
+            if (ReadBook.book?.bookUrl == book.bookUrl) {
                 ReadBook.clearTextChapter()
                 ReadBook.clearTextChapter()
             }
             }
-            if (ReadManga.book?.bookUrl == bookData.value!!.bookUrl) {
+            if (ReadManga.book?.bookUrl == book.bookUrl) {
                 ReadManga.clearMangaChapter()
                 ReadManga.clearMangaChapter()
             }
             }
         }.onSuccess {
         }.onSuccess {
@@ -512,7 +514,6 @@ class BookInfoViewModel(
         }
         }
     }
     }
 
 
-
     fun addToBookshelf(book: Book, toc: List<BookChapter>, success: (() -> Unit)? = null) {
     fun addToBookshelf(book: Book, toc: List<BookChapter>, success: (() -> Unit)? = null) {
         execute {
         execute {
             book.removeType(BookType.notShelf)
             book.removeType(BookType.notShelf)

+ 4 - 0
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.book.removeType
 import io.legado.app.help.config.AppConfig
 import io.legado.app.help.config.AppConfig
 import io.legado.app.help.coroutine.Coroutine
 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.localBook.LocalBook
 import io.legado.app.model.webBook.WebBook
 import io.legado.app.model.webBook.WebBook
 import io.legado.app.utils.FileUtils
 import io.legado.app.utils.FileUtils
@@ -57,6 +58,9 @@ class BookshelfManageViewModel(application: Application) : BaseViewModel(applica
             books.forEach {
             books.forEach {
                 if (it.isLocal) {
                 if (it.isLocal) {
                     LocalBook.deleteBook(it, deleteOriginal)
                     LocalBook.deleteBook(it, deleteOriginal)
+                } else {
+                    val source = appDb.bookSourceDao.getBookSource(it.origin)
+                    SourceCallBack.callBackBook(SourceCallBack.DEL_BOOK_SHELF, source, it)
                 }
                 }
             }
             }
         }
         }

+ 17 - 0
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.lib.dialogs.selector
 import io.legado.app.model.ReadAloud
 import io.legado.app.model.ReadAloud
 import io.legado.app.model.ReadBook
 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
 import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setChapter
 import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setChapter
 import io.legado.app.model.analyzeRule.AnalyzeRule.Companion.setCoroutineContext
 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() {
     override fun onDestroy() {
         super.onDestroy()
         super.onDestroy()
         tts?.clearTts()
         tts?.clearTts()

+ 22 - 3
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.ImageProvider
 import io.legado.app.model.ReadAloud
 import io.legado.app.model.ReadAloud
 import io.legado.app.model.ReadBook
 import io.legado.app.model.ReadBook
+import io.legado.app.model.SourceCallBack
 import io.legado.app.model.localBook.LocalBook
 import io.legado.app.model.localBook.LocalBook
 import io.legado.app.model.webBook.WebBook
 import io.legado.app.model.webBook.WebBook
 import io.legado.app.service.BaseReadAloudService
 import io.legado.app.service.BaseReadAloudService
@@ -117,14 +118,32 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
         }
         }
         ReadBook.upMsg(null)
         ReadBook.upMsg(null)
         if (!isSameBook) {
         if (!isSameBook) {
-            ReadBook.loadContent(resetPageOffset = true)
+            ReadBook.loadContent(resetPageOffset = true) {
+                ReadBook.bookSource?.let {
+                    SourceCallBack.callBackBook(
+                        SourceCallBack.START_READ,
+                        it,
+                        book,
+                        ReadBook.curTextChapter?.chapter
+                    )
+                }
+            }
         } else {
         } else {
-            ReadBook.loadOrUpContent()
+            ReadBook.loadOrUpContent {
+                ReadBook.bookSource?.let {
+                    SourceCallBack.callBackBook(
+                        SourceCallBack.START_READ,
+                        it,
+                        book,
+                        ReadBook.curTextChapter?.chapter
+                    )
+                }
+            }
         }
         }
         if (ReadBook.chapterChanged) {
         if (ReadBook.chapterChanged) {
             // 有章节跳转不同步阅读进度
             // 有章节跳转不同步阅读进度
             ReadBook.chapterChanged = false
             ReadBook.chapterChanged = false
-        } else if (!isSameBook || !BaseReadAloudService.isRun) {
+        } else if (!(isSameBook && BaseReadAloudService.isRun) && ReadBook.inBookshelf) {
             if (AppConfig.syncBookProgressPlus) {
             if (AppConfig.syncBookProgressPlus) {
                 ReadBook.syncProgress({ progress -> ReadBook.callBack?.sureNewProgress(progress) })
                 ReadBook.syncProgress({ progress -> ReadBook.callBack?.sureNewProgress(progress) })
             } else {
             } else {