Parcourir la source

[优化] 增加了部分 Sigma 版本的书源回调参数

HapeLee il y a 8 mois
Parent
commit
8956f1d682

+ 2 - 0
app/src/main/java/io/legado/app/model/AudioPlay.kt

@@ -102,6 +102,7 @@ object AudioPlay : CoroutineScope by MainScope() {
         durPlayUrl = ""
         durPlayUrl = ""
         durAudioSize = 0
         durAudioSize = 0
         upDurChapter()
         upDurChapter()
+        SourceCallBack.callBackBook(SourceCallBack.START_READ, bookSource, book, durChapter)
         postEvent(EventBus.AUDIO_BUFFER_PROGRESS, 0)
         postEvent(EventBus.AUDIO_BUFFER_PROGRESS, 0)
     }
     }
 
 
@@ -360,6 +361,7 @@ object AudioPlay : CoroutineScope by MainScope() {
                         ContentProcessor.get(book.name, book.origin).getTitleReplaceRules(),
                         ContentProcessor.get(book.name, book.origin).getTitleReplaceRules(),
                         book.getUseReplaceRule()
                         book.getUseReplaceRule()
                     )
                     )
+                    SourceCallBack.callBackBook(SourceCallBack.SAVE_READ, bookSource, book, it)
                 }
                 }
             }
             }
             book.update()
             book.update()

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

@@ -56,7 +56,7 @@ object SourceCallBack {
         }
         }
         activity.lifecycleScope.launch(IO) {
         activity.lifecycleScope.launch(IO) {
             val java = SourceLoginJsExtensions(activity, source)
             val java = SourceLoginJsExtensions(activity, source)
-            runCatching {
+            kotlin.runCatching {
                 val result = runScriptWithContext {
                 val result = runScriptWithContext {
                     source.evalJS(jsStr) {
                     source.evalJS(jsStr) {
                         put("event", event)
                         put("event", event)
@@ -114,7 +114,7 @@ object SourceCallBack {
         val jsStr = source.getContentRule().callBackJs
         val jsStr = source.getContentRule().callBackJs
         if (jsStr.isNullOrEmpty()) return
         if (jsStr.isNullOrEmpty()) return
         scope.launch(IO) {
         scope.launch(IO) {
-            runCatching {
+            kotlin.runCatching {
                 withTimeout(30000L) {
                 withTimeout(30000L) {
                     runScriptWithContext {
                     runScriptWithContext {
                         source.evalJS(jsStr) {
                         source.evalJS(jsStr) {

+ 49 - 6
app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt

@@ -59,6 +59,7 @@ import io.legado.app.help.config.LocalConfig
 import io.legado.app.lib.dialogs.alert
 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.BookCover
 import io.legado.app.model.BookCover
+import io.legado.app.model.SourceCallBack
 import io.legado.app.model.remote.RemoteBookWebDav
 import io.legado.app.model.remote.RemoteBookWebDav
 import io.legado.app.ui.about.AppLogDialog
 import io.legado.app.ui.about.AppLogDialog
 import io.legado.app.ui.book.audio.AudioPlayActivity
 import io.legado.app.ui.book.audio.AudioPlayActivity
@@ -828,15 +829,47 @@ class BookInfoActivity :
         }
         }
         tvAuthor.setOnClickListener {
         tvAuthor.setOnClickListener {
             viewModel.getBook(false)?.let { book ->
             viewModel.getBook(false)?.let { book ->
-                startActivity<SearchActivity> {
-                    putExtra("key", book.author)
+                SourceCallBack.callBackBtn(
+                    this@BookInfoActivity,
+                    SourceCallBack.CLICK_AUTHOR,
+                    viewModel.bookSource,
+                    book,
+                    null
+                ) {
+                    startActivity<SearchActivity> {
+                        putExtra("key", book.author)
+                    }
                 }
                 }
             }
             }
         }
         }
+        tvAuthor.setOnLongClickListener {
+            viewModel.getBook(false)?.let { book ->
+                SourceCallBack.callBackBtn(
+                    this@BookInfoActivity,
+                    SourceCallBack.LONG_CLICK_AUTHOR,
+                    viewModel.bookSource,
+                    book,
+                    null
+                ) {
+                    startActivity<SearchActivity> {
+                        putExtra("key", book.author)
+                    }
+                }
+            }
+            true
+        }
         tvName.setOnClickListener {
         tvName.setOnClickListener {
             viewModel.getBook(false)?.let { book ->
             viewModel.getBook(false)?.let { book ->
-                startActivity<SearchActivity> {
-                    putExtra("key", book.name)
+                SourceCallBack.callBackBtn(
+                    this@BookInfoActivity,
+                    SourceCallBack.CLICK_BOOK_NAME,
+                    viewModel.bookSource,
+                    book,
+                    null
+                ) {
+                    startActivity<SearchActivity> {
+                        putExtra("key", book.name)
+                    }
                 }
                 }
             }
             }
         }
         }
@@ -922,14 +955,14 @@ class BookInfoActivity :
 
 
     @SuppressLint("InflateParams")
     @SuppressLint("InflateParams")
     private fun deleteBook() {
     private fun deleteBook() {
-        viewModel.getBook()?.let {
+        viewModel.getBook()?.let { book ->
             if (LocalConfig.bookInfoDeleteAlert) {
             if (LocalConfig.bookInfoDeleteAlert) {
                 alert(
                 alert(
                     titleResource = R.string.draw,
                     titleResource = R.string.draw,
                     messageResource = R.string.sure_del
                     messageResource = R.string.sure_del
                 ) {
                 ) {
                     var checkBox: CheckBox? = null
                     var checkBox: CheckBox? = null
-                    if (it.isLocal) {
+                    if (book.isLocal) {
                         checkBox = CheckBox(this@BookInfoActivity).apply {
                         checkBox = CheckBox(this@BookInfoActivity).apply {
                             setText(R.string.delete_book_file)
                             setText(R.string.delete_book_file)
                             isChecked = LocalConfig.deleteBookOriginal
                             isChecked = LocalConfig.deleteBookOriginal
@@ -944,6 +977,11 @@ class BookInfoActivity :
                         if (checkBox != null) {
                         if (checkBox != null) {
                             LocalConfig.deleteBookOriginal = checkBox.isChecked
                             LocalConfig.deleteBookOriginal = checkBox.isChecked
                         }
                         }
+                        SourceCallBack.callBackBook(
+                            SourceCallBack.DEL_BOOK_SHELF,
+                            viewModel.bookSource,
+                            book
+                        ) //确认后删除书架
                         viewModel.delBook(LocalConfig.deleteBookOriginal) {
                         viewModel.delBook(LocalConfig.deleteBookOriginal) {
                             setResult(RESULT_OK)
                             setResult(RESULT_OK)
                             finish()
                             finish()
@@ -952,6 +990,11 @@ class BookInfoActivity :
                     noButton()
                     noButton()
                 }
                 }
             } else {
             } else {
+                SourceCallBack.callBackBook(
+                    SourceCallBack.DEL_BOOK_SHELF,
+                    viewModel.bookSource,
+                    book
+                ) //点按钮直接删除书架
                 viewModel.delBook(LocalConfig.deleteBookOriginal) {
                 viewModel.delBook(LocalConfig.deleteBookOriginal) {
                     setResult(RESULT_OK)
                     setResult(RESULT_OK)
                     finish()
                     finish()

+ 25 - 1
app/src/main/java/io/legado/app/ui/main/MainViewModel.kt

@@ -23,6 +23,7 @@ import io.legado.app.help.book.sync
 import io.legado.app.help.config.AppConfig
 import io.legado.app.help.config.AppConfig
 import io.legado.app.model.CacheBook
 import io.legado.app.model.CacheBook
 import io.legado.app.model.ReadBook
 import io.legado.app.model.ReadBook
+import io.legado.app.model.SourceCallBack
 import io.legado.app.model.webBook.WebBook
 import io.legado.app.model.webBook.WebBook
 import io.legado.app.service.CacheBookService
 import io.legado.app.service.CacheBookService
 import io.legado.app.utils.onEachParallel
 import io.legado.app.utils.onEachParallel
@@ -53,6 +54,7 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
     val onUpBooksLiveData = MutableLiveData<Int>()
     val onUpBooksLiveData = MutableLiveData<Int>()
     private var upTocJob: Job? = null
     private var upTocJob: Job? = null
     private var cacheBookJob: Job? = null
     private var cacheBookJob: Job? = null
+    private val eventListenerSource = ConcurrentHashMap<BookSource, Boolean>()
     val booksListRecycledViewPool = RecycledViewPool().apply {
     val booksListRecycledViewPool = RecycledViewPool().apply {
         setMaxRecycledViews(0, 30)
         setMaxRecycledViews(0, 30)
     }
     }
@@ -156,6 +158,17 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
             }
             }
             return
             return
         }
         }
+        if (source.eventListener) {
+            // 使用 putIfAbsent 确保只添加一次
+            if (eventListenerSource.putIfAbsent(source, true) == null) {
+                // 通知监听事件的书源,书架刷新开始
+                SourceCallBack.callBackSource(
+                    viewModelScope,
+                    SourceCallBack.START_SHELF_REFRESH,
+                    source
+                )
+            }
+        }
         kotlin.runCatching {
         kotlin.runCatching {
             val oldBook = book.copy()
             val oldBook = book.copy()
             if (book.tocUrl.isBlank()) {
             if (book.tocUrl.isBlank()) {
@@ -210,13 +223,24 @@ class MainViewModel(application: Application) : BaseViewModel(application) {
      * 缓存书籍
      * 缓存书籍
      */
      */
     private fun cacheBook() {
     private fun cacheBook() {
+        //开始缓存前,通知监听事件的书源,书架刷新已完成
+        eventListenerSource.toList().forEach {
+            SourceCallBack.callBackSource(
+                viewModelScope,
+                SourceCallBack.END_SHELF_REFRESH,
+                it.first
+            )
+        }
+        eventListenerSource.clear()
         if (AppConfig.preDownloadNum == 0) return
         if (AppConfig.preDownloadNum == 0) return
         cacheBookJob?.cancel()
         cacheBookJob?.cancel()
         cacheBookJob = viewModelScope.launch(upTocPool) {
         cacheBookJob = viewModelScope.launch(upTocPool) {
             launch {
             launch {
                 while (isActive && CacheBook.isRun) {
                 while (isActive && CacheBook.isRun) {
+                    val isOnUpTocBooksEmpty =
+                        onUpTocBooks.isEmpty()
                     //有目录更新是不缓存,优先更新目录,现在更多网站限制并发
                     //有目录更新是不缓存,优先更新目录,现在更多网站限制并发
-                    CacheBook.setWorkingState(waitUpTocBooks.isEmpty() && onUpTocBooks.isEmpty())
+                    CacheBook.setWorkingState(waitUpTocBooks.isEmpty() && isOnUpTocBooksEmpty)
                     delay(1000)
                     delay(1000)
                 }
                 }
             }
             }