diff --git a/app/src/main/java/io/legado/app/help/BookHelp.kt b/app/src/main/java/io/legado/app/help/BookHelp.kt index 32d63c03a..30ccebd24 100644 --- a/app/src/main/java/io/legado/app/help/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/BookHelp.kt @@ -265,29 +265,20 @@ object BookHelp { */ fun getDurChapter( oldDurChapterIndex: Int, - oldChapterListSize: Int, oldDurChapterName: String?, - newChapterList: List + newChapterList: List, + oldChapterListSize: Int = 0 ): Int { - if (oldChapterListSize == 0) return oldDurChapterIndex + if (oldDurChapterIndex == 0) return oldDurChapterIndex if (newChapterList.isEmpty()) return oldDurChapterIndex val oldChapterNum = getChapterNum(oldDurChapterName) val oldName = getPureChapterName(oldDurChapterName) val newChapterSize = newChapterList.size - val min = max( - 0, - min( - oldDurChapterIndex, - oldDurChapterIndex - oldChapterListSize + newChapterSize - ) - 10 - ) - val max = min( - newChapterSize - 1, - max( - oldDurChapterIndex, - oldDurChapterIndex - oldChapterListSize + newChapterSize - ) + 10 - ) + val durIndex = + if (oldChapterListSize == 0) oldDurChapterIndex + else oldDurChapterIndex * oldChapterListSize / newChapterSize + val min = max(0, min(oldDurChapterIndex, durIndex) - 10) + val max = min(newChapterSize - 1, max(oldDurChapterIndex, durIndex) + 10) var nameSim = 0.0 var newIndex = 0 var newNum = 0 diff --git a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayViewModel.kt b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayViewModel.kt index a21cb3364..5d8e5c2de 100644 --- a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayViewModel.kt @@ -116,9 +116,9 @@ class AudioPlayViewModel(application: Application) : BaseViewModel(application) execute { book.durChapterIndex = BookHelp.getDurChapter( book.durChapterIndex, - oldTocSize, book.durChapterTitle, - chapters + chapters, + oldTocSize ) book.durChapterTitle = chapters[book.durChapterIndex].title appDb.bookDao.update(book) diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt index f3148ff59..71427676a 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt @@ -21,6 +21,7 @@ import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.SearchBook import io.legado.app.databinding.DialogChapterChangeSourceBinding import io.legado.app.help.AppConfig +import io.legado.app.help.BookHelp import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.book.source.edit.BookSourceEditActivity import io.legado.app.ui.book.source.manage.BookSourceActivity @@ -53,6 +54,16 @@ class ChangeChapterSourceDialog() : BaseDialogFragment(R.layout.dialog_chapter_c registerForActivityResult(StartActivityContract(BookSourceEditActivity::class.java)) { viewModel.startSearch() } + private val tocSuccess: (toc: List) -> Unit = { + tocAdapter.durChapterIndex = + BookHelp.getDurChapter(viewModel.chapterIndex, viewModel.chapterTitle, it) + binding.loadingToc.hide() + tocAdapter.setItems(it) + binding.recyclerViewToc.scrollToPosition(tocAdapter.durChapterIndex - 5) + } + private val contentSuccess: (content: String) -> Unit = { + callBack?.replaceContent(it) + } private val searchBookAdapter by lazy { ChangeChapterSourceAdapter(requireContext(), viewModel, this) } @@ -211,13 +222,6 @@ class ChangeChapterSourceDialog() : BaseDialogFragment(R.layout.dialog_chapter_c return false } - private val tocSuccess: (toc: List) -> Unit = { - tocAdapter.durChapterIndex = viewModel.chapterIndex - binding.loadingToc.hide() - tocAdapter.setItems(it) - binding.recyclerViewToc.scrollToPosition(tocAdapter.durChapterIndex - 5) - } - override fun openToc(searchBook: SearchBook) { this.searchBook = searchBook tocAdapter.setItems(null) @@ -259,8 +263,12 @@ class ChangeChapterSourceDialog() : BaseDialogFragment(R.layout.dialog_chapter_c } } - override fun clickChapter(bookChapter: BookChapter) { - TODO("Not yet implemented") + override fun clickChapter(bookChapter: BookChapter, nextChapterUrl: String?) { + searchBook?.let { + viewModel.getContent(it.toBook(), bookChapter, nextChapterUrl, contentSuccess) { msg -> + toastOnUi(msg) + } + } } private fun changeSource(searchBook: SearchBook) { diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceViewModel.kt index 86da71938..8a8f0fc64 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceViewModel.kt @@ -294,6 +294,24 @@ class ChangeChapterSourceViewModel(application: Application) : BaseViewModel(app } } + fun getContent( + book: Book, + chapter: BookChapter, + nextChapterUrl: String?, + success: (content: String) -> Unit, + error: (msg: String) -> Unit + ) { + execute { + val bookSource = appDb.bookSourceDao.getBookSource(book.origin) + ?: throw NoStackTraceException("书源不存在") + WebBook.getContentAwait(this, bookSource, book, chapter, nextChapterUrl, false) + }.onSuccess { + success.invoke(it) + }.onError { + error.invoke(it.localizedMessage ?: "获取正文出错") + } + } + fun disableSource(searchBook: SearchBook) { execute { appDb.bookSourceDao.getBookSource(searchBook.origin)?.let { source -> diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterTocAdapter.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterTocAdapter.kt index 44af00758..722efbbeb 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterTocAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterTocAdapter.kt @@ -59,12 +59,12 @@ class ChangeChapterTocAdapter(context: Context, val callback: Callback) : override fun registerListener(holder: ItemViewHolder, binding: ItemChapterListBinding) { holder.itemView.setOnClickListener { getItem(holder.layoutPosition)?.let { - callback.clickChapter(it) + callback.clickChapter(it, getItem(holder.layoutPosition + 1)?.url) } } } interface Callback { - fun clickChapter(bookChapter: BookChapter) + fun clickChapter(bookChapter: BookChapter, nextChapterUrl: String?) } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt index 01d090cf7..c7e820518 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt @@ -195,9 +195,9 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { execute { book.durChapterIndex = BookHelp.getDurChapter( book.durChapterIndex, - oldTocSize, book.durChapterTitle, - chapters + chapters, + oldTocSize ) book.durChapterTitle = chapters[book.durChapterIndex].title if (inBookshelf) { diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index 035cf77f6..9b2ecc985 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -185,9 +185,9 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { val oldBook = ReadBook.book!! book.durChapterIndex = BookHelp.getDurChapter( oldBook.durChapterIndex, - oldBook.totalChapterNum, oldBook.durChapterTitle, - chapters + chapters, + oldBook.totalChapterNum ) book.durChapterTitle = chapters[book.durChapterIndex].title oldBook.changeTo(book) diff --git a/app/src/main/res/layout/dialog_chapter_change_source.xml b/app/src/main/res/layout/dialog_chapter_change_source.xml index 3f9f6cd9a..ac448641f 100644 --- a/app/src/main/res/layout/dialog_chapter_change_source.xml +++ b/app/src/main/res/layout/dialog_chapter_change_source.xml @@ -60,8 +60,8 @@