This commit is contained in:
Horis
2024-07-10 16:59:16 +08:00
parent 88c7bc2014
commit 784d5375fc
3 changed files with 55 additions and 51 deletions
@@ -14,6 +14,7 @@ import android.view.WindowManager
import android.widget.FrameLayout import android.widget.FrameLayout
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.VMBaseActivity import io.legado.app.base.VMBaseActivity
import io.legado.app.constant.AppConst.charsets import io.legado.app.constant.AppConst.charsets
@@ -50,6 +51,8 @@ import io.legado.app.utils.setNavigationBarColorAuto
import io.legado.app.utils.showDialogFragment import io.legado.app.utils.showDialogFragment
import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.viewbindingdelegate.viewBinding
import io.legado.app.utils.visible import io.legado.app.utils.visible
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.launch
import java.time.LocalDate import java.time.LocalDate
import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatter
@@ -75,7 +78,9 @@ abstract class BaseReadBookActivity :
FileDoc.fromUri(uri, true).find(book.originName)?.let { doc -> FileDoc.fromUri(uri, true).find(book.originName)?.let { doc ->
book.bookUrl = doc.uri.toString() book.bookUrl = doc.uri.toString()
book.save() book.save()
viewModel.loadChapterList(book) lifecycleScope.launch(IO) {
viewModel.loadChapterList(book)
}
} ?: ReadBook.upMsg("找不到文件") } ?: ReadBook.upMsg("找不到文件")
} }
} ?: ReadBook.upMsg("没有权限访问") } ?: ReadBook.upMsg("没有权限访问")
@@ -355,6 +360,8 @@ abstract class BaseReadBookActivity :
book.setStartChapter(start) book.setStartChapter(start)
book.setReadSimulating(enabled) book.setReadSimulating(enabled)
book.save() book.save()
ReadBook.clearTextChapter()
viewModel.initData(intent)
} }
} }
noButton() noButton()
@@ -924,7 +924,9 @@ class ReadBookActivity : BaseReadBookActivity(),
override fun loadChapterList(book: Book) { override fun loadChapterList(book: Book) {
ReadBook.upMsg(getString(R.string.toc_updateing)) ReadBook.upMsg(getString(R.string.toc_updateing))
viewModel.loadChapterList(book) lifecycleScope.launch(IO) {
viewModel.loadChapterList(book)
}
} }
/** /**
@@ -5,7 +5,6 @@ import android.content.Intent
import android.net.Uri import android.net.Uri
import androidx.documentfile.provider.DocumentFile import androidx.documentfile.provider.DocumentFile
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.BaseViewModel import io.legado.app.base.BaseViewModel
import io.legado.app.constant.AppLog import io.legado.app.constant.AppLog
@@ -40,7 +39,6 @@ import io.legado.app.utils.mapParallelSafe
import io.legado.app.utils.postEvent import io.legado.app.utils.postEvent
import io.legado.app.utils.toStringArray import io.legado.app.utils.toStringArray
import io.legado.app.utils.toastOnUi import io.legado.app.utils.toastOnUi
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
@@ -97,7 +95,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
} }
} }
private fun initBook(book: Book) { private suspend fun initBook(book: Book) {
val isSameBook = ReadBook.book?.bookUrl == book.bookUrl val isSameBook = ReadBook.book?.bookUrl == book.bookUrl
if (isSameBook) { if (isSameBook) {
ReadBook.upData(book) ReadBook.upData(book)
@@ -105,23 +103,23 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
ReadBook.resetData(book) ReadBook.resetData(book)
} }
isInitFinish = true isInitFinish = true
if (ReadBook.chapterSize == 0) { if (!book.isLocal && book.tocUrl.isEmpty() && !loadBookInfo(book)) {
if (book.tocUrl.isEmpty()) { return
loadBookInfo(book) }
} else { if (book.isLocal && !checkLocalBookFileExist(book)) {
loadChapterList(book) return
} }
} else if (book.isLocalModified()) { if ((ReadBook.chapterSize == 0 || book.isLocalModified()) && !loadChapterList(book)) {
loadChapterList(book) return
} else if (isSameBook) { }
ReadBook.loadOrUpContent() ReadBook.upMsg(null)
checkLocalBookFileExist(book) if (ReadBook.durChapterIndex > ReadBook.simulatedChapterSize - 1) {
ReadBook.durChapterIndex = ReadBook.simulatedChapterSize - 1
}
if (!isSameBook) {
ReadBook.loadContent(resetPageOffset = true)
} else { } else {
if (ReadBook.durChapterIndex > ReadBook.simulatedChapterSize - 1) { ReadBook.loadOrUpContent()
ReadBook.durChapterIndex = ReadBook.simulatedChapterSize - 1
}
ReadBook.loadContent(resetPageOffset = false)
checkLocalBookFileExist(book)
} }
if (ReadBook.chapterChanged) { if (ReadBook.chapterChanged) {
// 有章节跳转不同步阅读进度 // 有章节跳转不同步阅读进度
@@ -135,42 +133,38 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
} }
} }
private fun checkLocalBookFileExist(book: Book) { private fun checkLocalBookFileExist(book: Book): Boolean {
if (book.isLocal) { try {
execute { LocalBook.getBookInputStream(book)
LocalBook.getBookInputStream(book) return true
}.onError { } catch (e: Throwable) {
if (it is FileNotFoundException) { if (e is FileNotFoundException) {
permissionDenialLiveData.postValue(0) permissionDenialLiveData.postValue(0)
}
} }
return false
} }
} }
/** /**
* 加载详情页 * 加载详情页
*/ */
private fun loadBookInfo(book: Book) { private suspend fun loadBookInfo(book: Book): Boolean {
if (book.isLocal) { val source = ReadBook.bookSource ?: return false
loadChapterList(book) try {
} else { WebBook.getBookInfoAwait(source, book, canReName = false)
ReadBook.bookSource?.let { source -> return true
WebBook.getBookInfo(viewModelScope, source, book, canReName = false) } catch (e: Throwable) {
.onSuccess { ReadBook.upMsg("详情页出错: ${e.localizedMessage}")
loadChapterList(book) return false
}.onError {
ReadBook.upMsg("详情页出错: ${it.localizedMessage}")
}
}
} }
} }
/** /**
* 加载目录 * 加载目录
*/ */
fun loadChapterList(book: Book) { suspend fun loadChapterList(book: Book): Boolean {
if (book.isLocal) { if (book.isLocal) {
execute { kotlin.runCatching {
LocalBook.getChapterList(book).let { LocalBook.getChapterList(book).let {
book.latestChapterTime = System.currentTimeMillis() book.latestChapterTime = System.currentTimeMillis()
appDb.bookChapterDao.delByBook(book.bookUrl) appDb.bookChapterDao.delByBook(book.bookUrl)
@@ -178,10 +172,9 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
appDb.bookDao.update(book) appDb.bookDao.update(book)
ReadBook.chapterSize = it.size ReadBook.chapterSize = it.size
ReadBook.simulatedChapterSize = book.simulatedTotalChapterNum() ReadBook.simulatedChapterSize = book.simulatedTotalChapterNum()
ReadBook.upMsg(null)
ReadBook.loadContent(resetPageOffset = true)
} }
}.onError { return true
}.onFailure {
when (it) { when (it) {
is SecurityException, is FileNotFoundException -> { is SecurityException, is FileNotFoundException -> {
permissionDenialLiveData.postValue(1) permissionDenialLiveData.postValue(1)
@@ -192,12 +185,13 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
ReadBook.upMsg("LoadTocError:${it.localizedMessage}") ReadBook.upMsg("LoadTocError:${it.localizedMessage}")
} }
} }
return false
} }
} else { } else {
ReadBook.bookSource?.let { ReadBook.bookSource?.let {
val oldBook = book.copy() val oldBook = book.copy()
WebBook.getChapterList(viewModelScope, it, book, true) WebBook.getChapterListAwait(it, book, true)
.onSuccess(IO) { cList -> .onSuccess { cList ->
if (oldBook.bookUrl == book.bookUrl) { if (oldBook.bookUrl == book.bookUrl) {
appDb.bookDao.update(book) appDb.bookDao.update(book)
} else { } else {
@@ -208,13 +202,14 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) {
appDb.bookChapterDao.insert(*cList.toTypedArray()) appDb.bookChapterDao.insert(*cList.toTypedArray())
ReadBook.chapterSize = cList.size ReadBook.chapterSize = cList.size
ReadBook.simulatedChapterSize = book.simulatedTotalChapterNum() ReadBook.simulatedChapterSize = book.simulatedTotalChapterNum()
ReadBook.upMsg(null) return true
ReadBook.loadContent(resetPageOffset = true) }.onFailure {
}.onError {
ReadBook.upMsg(context.getString(R.string.error_load_toc)) ReadBook.upMsg(context.getString(R.string.error_load_toc))
return false
} }
} }
} }
return false
} }
/** /**