|
|
@@ -1,12 +1,24 @@
|
|
|
package io.legado.app.ui.association
|
|
|
|
|
|
+import android.app.Application
|
|
|
import android.content.DialogInterface
|
|
|
import android.os.Bundle
|
|
|
import android.view.View
|
|
|
import android.view.ViewGroup
|
|
|
+import androidx.fragment.app.viewModels
|
|
|
+import androidx.lifecycle.MutableLiveData
|
|
|
import io.legado.app.R
|
|
|
import io.legado.app.base.BaseDialogFragment
|
|
|
+import io.legado.app.base.BaseViewModel
|
|
|
+import io.legado.app.data.appDb
|
|
|
+import io.legado.app.data.entities.Book
|
|
|
+import io.legado.app.databinding.DialogAddToBookshelfBinding
|
|
|
+import io.legado.app.exception.NoStackTraceException
|
|
|
+import io.legado.app.model.webBook.WebBook
|
|
|
+import io.legado.app.utils.NetworkUtils
|
|
|
import io.legado.app.utils.setLayout
|
|
|
+import io.legado.app.utils.toastOnUi
|
|
|
+import io.legado.app.utils.viewbindingdelegate.viewBinding
|
|
|
|
|
|
class AddToBookshelfDialog() : BaseDialogFragment(R.layout.dialog_add_to_bookshelf) {
|
|
|
|
|
|
@@ -17,6 +29,9 @@ class AddToBookshelfDialog() : BaseDialogFragment(R.layout.dialog_add_to_bookshe
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ val binding by viewBinding(DialogAddToBookshelfBinding::bind)
|
|
|
+ val viewModel by viewModels<ViewModel>()
|
|
|
+
|
|
|
override fun onStart() {
|
|
|
super.onStart()
|
|
|
setLayout(0.9f, ViewGroup.LayoutParams.WRAP_CONTENT)
|
|
|
@@ -32,9 +47,54 @@ class AddToBookshelfDialog() : BaseDialogFragment(R.layout.dialog_add_to_bookshe
|
|
|
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
|
|
|
val bookUrl = arguments?.getString("bookUrl")
|
|
|
if (bookUrl.isNullOrBlank()) {
|
|
|
-
|
|
|
+ toastOnUi("url不能为空")
|
|
|
+ dismiss()
|
|
|
return
|
|
|
}
|
|
|
+ viewModel.load(bookUrl) {
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ class ViewModel(application: Application) : BaseViewModel(application) {
|
|
|
+
|
|
|
+ val loadStateLiveData = MutableLiveData<Boolean>()
|
|
|
+
|
|
|
+ fun load(bookUrl: String, success: (book: Book) -> Unit) {
|
|
|
+ execute {
|
|
|
+ val sources = appDb.bookSourceDao.hasBookUrlPattern
|
|
|
+ appDb.bookDao.getBook(bookUrl)?.let {
|
|
|
+ throw NoStackTraceException("${it.name} 已在书架")
|
|
|
+ }
|
|
|
+ val baseUrl = NetworkUtils.getBaseUrl(bookUrl)
|
|
|
+ ?: throw NoStackTraceException("书籍地址格式不对")
|
|
|
+ var source = appDb.bookSourceDao.getBookSource(baseUrl)
|
|
|
+ if (source == null) {
|
|
|
+ sources.forEach { bookSource ->
|
|
|
+ if (bookUrl.matches(bookSource.bookUrlPattern!!.toRegex())) {
|
|
|
+ source = bookSource
|
|
|
+ return@forEach
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ source?.let { bookSource ->
|
|
|
+ val book = Book(
|
|
|
+ bookUrl = bookUrl,
|
|
|
+ origin = bookSource.bookSourceUrl,
|
|
|
+ originName = bookSource.bookSourceName
|
|
|
+ )
|
|
|
+ WebBook.getBookInfoAwait(bookSource, book)
|
|
|
+ book.order = appDb.bookDao.minOrder - 1
|
|
|
+ return@execute book
|
|
|
+ } ?: throw NoStackTraceException("未找到匹配书源")
|
|
|
+ }.onSuccess {
|
|
|
+ success.invoke(it)
|
|
|
+ }.onStart {
|
|
|
+ loadStateLiveData.postValue(true)
|
|
|
+ }.onFinally {
|
|
|
+ loadStateLiveData.postValue(false)
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|