Merge remote-tracking branch 'origin/master'

This commit is contained in:
kunfei
2023-03-11 11:19:21 +08:00
5 changed files with 38 additions and 20 deletions
@@ -74,10 +74,16 @@ class EpubFile(var book: Book) {
private var fileDescriptor: ParcelFileDescriptor? = null private var fileDescriptor: ParcelFileDescriptor? = null
private var epubBook: EpubBook? = null private var epubBook: EpubBook? = null
get() { get() {
if (field != null && fileDescriptor != null) { if (field == null || fileDescriptor == null) {
return field field = readEpub()
}
return field
}
private var epubBookContents: List<Resource>?
get() {
if (field == null || fileDescriptor == null) {
field = epubBook.contents
} }
field = readEpub()
return field return field
} }
@@ -147,7 +153,7 @@ class EpubFile(var book: Book) {
val includeNextChapterResource = !endFragmentId.isNullOrBlank() val includeNextChapterResource = !endFragmentId.isNullOrBlank()
/*一些书籍依靠href索引的resource会包含多个章节,需要依靠fragmentId来截取到当前章节的内容*/ /*一些书籍依靠href索引的resource会包含多个章节,需要依靠fragmentId来截取到当前章节的内容*/
/*注:这里较大增加了内容加载的时间,所以首次获取内容后可存储到本地cache,减少重复加载*/ /*注:这里较大增加了内容加载的时间,所以首次获取内容后可存储到本地cache,减少重复加载*/
for (res in epubBook.contents) { for (res in epubBookContents) {
if (!findChapterFirstSource) { if (!findChapterFirstSource) {
if (currentChapterFirstResourceHref != res.href) continue if (currentChapterFirstResourceHref != res.href) continue
findChapterFirstSource = true findChapterFirstSource = true
@@ -7,6 +7,8 @@ import android.view.ViewGroup
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.Lifecycle.repeatOnLifecycle
import androidx.lifecycle.Lifecycle.State.STARTED
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.BaseDialogFragment import io.legado.app.base.BaseDialogFragment
@@ -67,10 +69,12 @@ class ChangeCoverDialog() : BaseDialogFragment(R.layout.dialog_change_cover),
} }
private fun initData() { private fun initData() {
lifecycleScope.launchWhenStarted { lifecycleScope.launch {
viewModel.dataFlow.conflate().collect { repeatOnLifecycle(STARTED) {
adapter.setItems(it) viewModel.dataFlow.conflate().collect {
delay(1000) adapter.setItems(it)
delay(1000)
}
} }
} }
} }
@@ -10,6 +10,8 @@ import androidx.appcompat.widget.Toolbar
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.Lifecycle.repeatOnLifecycle
import androidx.lifecycle.Lifecycle.State.STARTED
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import io.legado.app.R import io.legado.app.R
@@ -181,10 +183,12 @@ class ChangeBookSourceDialog() : BaseDialogFragment(R.layout.dialog_book_change_
} }
binding.toolBar.menu.applyTint(requireContext()) binding.toolBar.menu.applyTint(requireContext())
} }
lifecycleScope.launchWhenStarted { lifecycleScope.launch {
viewModel.searchDataFlow.conflate().collect { repeatOnLifecycle(STARTED) {
adapter.setItems(it) viewModel.searchDataFlow.conflate().collect {
delay(1000) adapter.setItems(it)
delay(1000)
}
} }
} }
launch { launch {
@@ -10,6 +10,8 @@ import androidx.core.os.bundleOf
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.Lifecycle.repeatOnLifecycle
import androidx.lifecycle.Lifecycle.State.STARTED
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import io.legado.app.R import io.legado.app.R
@@ -202,10 +204,12 @@ class ChangeChapterSourceDialog() : BaseDialogFragment(R.layout.dialog_chapter_c
} }
binding.toolBar.menu.applyTint(requireContext()) binding.toolBar.menu.applyTint(requireContext())
} }
lifecycleScope.launchWhenStarted { lifecycleScope.launch {
viewModel.searchDataFlow.conflate().collect { repeatOnLifecycle(STARTED) {
searchBookAdapter.setItems(it) viewModel.searchDataFlow.conflate().collect {
delay(1000) searchBookAdapter.setItems(it)
delay(1000)
}
} }
} }
launch { launch {
@@ -155,12 +155,12 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
appDb.bookDao.getBook(book.name, book.author)?.let { appDb.bookDao.getBook(book.name, book.author)?.let {
inBookshelf = true inBookshelf = true
} }
bookData.postValue(book) bookData.postValue(it)
if (inBookshelf) { if (inBookshelf) {
appDb.bookDao.update(book) appDb.bookDao.update(it)
} }
if (it.isWebFile) { if (it.isWebFile) {
loadWebFile(book, bookSource, scope) loadWebFile(it, scope)
} else { } else {
loadChapter(it, scope) loadChapter(it, scope)
} }
@@ -234,7 +234,6 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
private fun loadWebFile( private fun loadWebFile(
book: Book, book: Book,
bookSource: BookSource,
scope: CoroutineScope = viewModelScope scope: CoroutineScope = viewModelScope
) { ) {
execute(scope) { execute(scope) {
@@ -263,6 +262,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
LocalBook.saveBookFile(webFile.url, webFile.name, bookSource) LocalBook.saveBookFile(webFile.url, webFile.name, bookSource)
} }
}.onSuccess { }.onSuccess {
@Suppress("unchecked_cast")
success?.invoke(it as T) success?.invoke(it as T)
}.onError { }.onError {
context.toastOnUi("ImportWebFileError\n${it.localizedMessage}") context.toastOnUi("ImportWebFileError\n${it.localizedMessage}")