kunfei 3 năm trước cách đây
mục cha
commit
3a368da11b

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

@@ -60,7 +60,7 @@ class BookInfoActivity :
 
     private val tocActivityResult = registerForActivityResult(TocActivityResult()) {
         it?.let {
-            viewModel.bookData.value?.let { book ->
+            viewModel.getBook(false)?.let { book ->
                 launch {
                     withContext(IO) {
                         book.durChapterIndex = it.first
@@ -155,14 +155,14 @@ class BookInfoActivity :
     override fun onCompatOptionsItemSelected(item: MenuItem): Boolean {
         when (item.itemId) {
             R.id.menu_edit -> {
-                viewModel.bookData.value?.let {
+                viewModel.getBook()?.let {
                     infoEditResult.launch {
                         putExtra("bookUrl", it.bookUrl)
                     }
                 }
             }
             R.id.menu_share_it -> {
-                viewModel.bookData.value?.let {
+                viewModel.getBook()?.let {
                     val bookJson = GSON.toJson(it)
                     val shareStr = "${it.bookUrl}#$bookJson"
                     shareWithQr(shareStr, it.name)
@@ -170,7 +170,7 @@ class BookInfoActivity :
             }
             R.id.menu_refresh -> {
                 upLoading(true)
-                viewModel.bookData.value?.let {
+                viewModel.getBook()?.let {
                     viewModel.refreshBook(it)
                 }
             }
@@ -183,14 +183,14 @@ 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.bookData.value?.bookUrl?.let {
+            R.id.menu_copy_book_url -> viewModel.getBook()?.bookUrl?.let {
                 sendToClip(it)
-            } ?: toastOnUi(R.string.no_book)
-            R.id.menu_copy_toc_url -> viewModel.bookData.value?.tocUrl?.let {
+            }
+            R.id.menu_copy_toc_url -> viewModel.getBook()?.tocUrl?.let {
                 sendToClip(it)
-            } ?: toastOnUi(R.string.no_book)
+            }
             R.id.menu_can_update -> {
-                viewModel.bookData.value?.let {
+                viewModel.getBook()?.let {
                     it.canUpdate = !it.canUpdate
                     if (viewModel.inBookshelf) {
                         viewModel.saveBook(it)
@@ -202,7 +202,7 @@ class BookInfoActivity :
             R.id.menu_split_long_chapter -> {
                 upLoading(true)
                 tocChanged = true
-                viewModel.bookData.value?.let {
+                viewModel.getBook()?.let {
                     it.setSplitLongChapter(!item.isChecked)
                     viewModel.loadBookInfo(it, false)
                 }
@@ -211,7 +211,7 @@ class BookInfoActivity :
             }
             R.id.menu_delete_alert -> LocalConfig.bookInfoDeleteAlert = !item.isChecked
             R.id.menu_upload -> {
-                viewModel.bookData.value?.let { book ->
+                viewModel.getBook()?.let { book ->
                     book.getRemoteUrl()?.let {
                         alert(R.string.draw, R.string.sure_upload) {
                             okButton {
@@ -332,20 +332,20 @@ class BookInfoActivity :
 
     private fun initViewEvent() = binding.run {
         ivCover.setOnClickListener {
-            viewModel.bookData.value?.let {
+            viewModel.getBook()?.let {
                 showDialogFragment(
                     ChangeCoverDialog(it.name, it.author)
                 )
-            } ?: toastOnUi("Book is null")
+            }
         }
         ivCover.setOnLongClickListener {
-            viewModel.bookData.value?.getDisplayCover()?.let { path ->
+            viewModel.getBook()?.getDisplayCover()?.let { path ->
                 showDialogFragment(PhotoDialog(path))
             }
             true
         }
         tvRead.setOnClickListener {
-            viewModel.bookData.value?.let { book ->
+            viewModel.getBook()?.let { book ->
                 if (book.isWebFile) {
                     showWebFileDownloadAlert {
                         readBook(it)
@@ -353,10 +353,10 @@ class BookInfoActivity :
                 } else {
                     readBook(book)
                 }
-            } ?: toastOnUi("Book is null")
+            }
         }
         tvShelf.setOnClickListener {
-            viewModel.bookData.value?.let { book ->
+            viewModel.getBook()?.let { book ->
                 if (viewModel.inBookshelf) {
                     deleteBook()
                 } else {
@@ -371,44 +371,50 @@ class BookInfoActivity :
             }
         }
         tvOrigin.setOnClickListener {
-            viewModel.bookData.value?.let { book ->
+            viewModel.getBook()?.let { book ->
                 if (book.isLocal) return@let
                 startActivity<BookSourceEditActivity> {
                     putExtra("sourceUrl", book.origin)
                 }
-            } ?: toastOnUi("Book is null")
+            }
         }
         tvChangeSource.setOnClickListener {
-            viewModel.bookData.value?.let { book ->
+            viewModel.getBook()?.let { book ->
                 showDialogFragment(ChangeBookSourceDialog(book.name, book.author))
-            } ?: toastOnUi("Book is null")
+            }
         }
         tvTocView.setOnClickListener {
-            if (!viewModel.inBookshelf) {
-                viewModel.saveBook(viewModel.bookData.value) {
-                    viewModel.saveChapterList {
-                        openChapterList()
+            viewModel.getBook()?.let { book ->
+                if (!viewModel.inBookshelf) {
+                    viewModel.saveBook(book) {
+                        viewModel.saveChapterList {
+                            openChapterList()
+                        }
                     }
+                } else {
+                    openChapterList()
                 }
-            } else {
-                openChapterList()
             }
         }
         tvChangeGroup.setOnClickListener {
-            viewModel.bookData.value?.let {
+            viewModel.getBook()?.let {
                 showDialogFragment(
                     GroupSelectDialog(it.group)
                 )
-            } ?: toastOnUi("Book is null")
+            }
         }
         tvAuthor.setOnClickListener {
-            startActivity<SearchActivity> {
-                putExtra("key", viewModel.bookData.value?.author)
+            viewModel.getBook(false)?.let { book ->
+                startActivity<SearchActivity> {
+                    putExtra("key", book.author)
+                }
             }
         }
         tvName.setOnClickListener {
-            startActivity<SearchActivity> {
-                putExtra("key", viewModel.bookData.value?.name)
+            viewModel.getBook(false)?.let { book ->
+                startActivity<SearchActivity> {
+                    putExtra("key", book.name)
+                }
             }
         }
     }
@@ -440,24 +446,23 @@ class BookInfoActivity :
                 toastOnUi("书源不存在")
                 return@launch
             }
-            val book = viewModel.bookData.value
-            if (book == null) {
-                toastOnUi("书籍不存在")
-                return@launch
-            }
+            val book = viewModel.getBook() ?: return@launch
             val variable = withContext(IO) { book.getCustomVariable() }
-            val comment = source.getDisplayVariableComment("""书籍变量可在js中通过book.getVariable("custom")获取""")
-            showDialogFragment(VariableDialog(
-                getString(R.string.set_book_variable),
-                book.bookUrl,
-                variable,
-                comment
-            ))
+            val comment =
+                source.getDisplayVariableComment("""书籍变量可在js中通过book.getVariable("custom")获取""")
+            showDialogFragment(
+                VariableDialog(
+                    getString(R.string.set_book_variable),
+                    book.bookUrl,
+                    variable,
+                    comment
+                )
+            )
         }
     }
 
     override fun setVariable(key: String, variable: String?) {
-        when(key) {
+        when (key) {
             viewModel.bookSource?.getKey() -> viewModel.bookSource?.setVariable(variable)
             viewModel.bookData.value?.bookUrl -> viewModel.bookData.value?.let {
                 it.putCustomVariable(variable)
@@ -468,7 +473,7 @@ class BookInfoActivity :
 
     @SuppressLint("InflateParams")
     private fun deleteBook() {
-        viewModel.bookData.value?.let {
+        viewModel.getBook()?.let {
             if (LocalConfig.bookInfoDeleteAlert) {
                 alert(
                     titleResource = R.string.draw,
@@ -509,7 +514,7 @@ class BookInfoActivity :
             toastOnUi(R.string.chapter_list_empty)
             return
         }
-        viewModel.bookData.value?.let {
+        viewModel.getBook()?.let {
             tocActivityResult.launch(it.bookUrl)
         }
     }
@@ -630,7 +635,7 @@ class BookInfoActivity :
 
     override fun upGroup(requestCode: Int, groupId: Long) {
         upGroup(groupId)
-        viewModel.bookData.value?.let { book ->
+        viewModel.getBook()?.let { book ->
             book.group = groupId
             if (viewModel.inBookshelf) {
                 viewModel.saveBook(book)

+ 8 - 0
app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt

@@ -407,6 +407,14 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
         }
     }
 
+    fun getBook(toastNull: Boolean = true): Book? {
+        val book = bookData.value
+        if (toastNull && book == null) {
+            context.toastOnUi("book is null")
+        }
+        return book
+    }
+
     fun delBook(deleteOriginal: Boolean = false, success: (() -> Unit)? = null) {
         execute {
             bookData.value?.let {