Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -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}")
|
||||||
|
|||||||
Reference in New Issue
Block a user