This commit is contained in:
kunfei 2022-11-06 00:17:07 +08:00
parent 5bfb451c11
commit 6f0df97bc7

View File

@ -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)
}
}
}