diff --git a/app/src/main/java/io/legado/app/data/entities/Book.kt b/app/src/main/java/io/legado/app/data/entities/Book.kt index bbf4dd0a1..0be86a106 100644 --- a/app/src/main/java/io/legado/app/data/entities/Book.kt +++ b/app/src/main/java/io/legado/app/data/entities/Book.kt @@ -165,16 +165,16 @@ data class Book( if (config.readSimulating) { val currentDate = LocalDate.now() val daysPassed = between(this.config.startDate, currentDate).days + 1 - // 计算当前应该解锁到哪一章 - val chaptersToUnlock = (config.startChapter ?: 0) + (daysPassed * config.dailyChapters) - return chaptersToUnlock + val chaptersToUnlock = + max(0, (config.startChapter ?: 0) + (daysPassed * config.dailyChapters)) + return min(this.totalChapterNum, chaptersToUnlock) } else return this.totalChapterNum } fun getRealAuthor() = author.replace(AppPattern.authorRegex, "") - fun getUnreadChapterNum() = max(totalChapterNum - durChapterIndex - 1, 0) + fun getUnreadChapterNum() = max(simulatedTotalChapterNum() - durChapterIndex - 1, 0) fun getDisplayCover() = if (customCoverUrl.isNullOrEmpty()) coverUrl else customCoverUrl diff --git a/app/src/main/java/io/legado/app/model/AudioPlay.kt b/app/src/main/java/io/legado/app/model/AudioPlay.kt index b61007f2a..34067650c 100644 --- a/app/src/main/java/io/legado/app/model/AudioPlay.kt +++ b/app/src/main/java/io/legado/app/model/AudioPlay.kt @@ -165,7 +165,7 @@ object AudioPlay { fun next(context: Context) { book?.let { book -> - if (book.durChapterIndex + 1 < book.totalChapterNum) { + if (book.durChapterIndex + 1 < book.simulatedTotalChapterNum()) { book.durChapterIndex += 1 book.durChapterPos = 0 durChapterIndex = book.durChapterIndex diff --git a/app/src/main/java/io/legado/app/model/ReadBook.kt b/app/src/main/java/io/legado/app/model/ReadBook.kt index 5641204eb..61719ee67 100644 --- a/app/src/main/java/io/legado/app/model/ReadBook.kt +++ b/app/src/main/java/io/legado/app/model/ReadBook.kt @@ -229,7 +229,7 @@ object ReadBook : CoroutineScope by MainScope() { } fun moveToNextChapter(upContent: Boolean, upContentInPlace: Boolean = true): Boolean { - if (durChapterIndex < chapterSize - 1) { + if (durChapterIndex < (book?.simulatedTotalChapterNum()?: chapterSize) - 1) { durChapterPos = 0 durChapterIndex++ prevTextChapter?.cancelLayout() diff --git a/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt b/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt index 1c05bfa2b..37876cd7f 100644 --- a/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt +++ b/app/src/main/java/io/legado/app/model/webBook/BookChapterList.kt @@ -119,12 +119,10 @@ object BookChapterList { coroutineContext.ensureActive() //去重 val lh = LinkedHashSet(chapterList) - val fullList = ArrayList(lh) + val list = ArrayList(lh) if (!book.getReverseToc()) { - fullList.reverse() + list.reverse() } - val list = - if (book.getReadSimulating()) fullList.take(book.simulatedTotalChapterNum()) else fullList Debug.log(book.origin, "◇目录总数:${list.size}") coroutineContext.ensureActive() val formatJs = tocRule.formatJs @@ -147,7 +145,8 @@ object BookChapterList { } val replaceRules = ContentProcessor.get(book.name, book.origin).getTitleReplaceRules() book.latestChapterTitle = - list.last().getDisplayTitle(replaceRules, book.getUseReplaceRule()) + list.getOrElse(book.simulatedTotalChapterNum() - 1) { + list.last() }.getDisplayTitle(replaceRules, book.getUseReplaceRule()) book.durChapterTitle = list.getOrElse(book.durChapterIndex) { list.last() } .getDisplayTitle(replaceRules, book.getUseReplaceRule()) if (book.totalChapterNum < list.size) { diff --git a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt index 067a2172b..9172f8e60 100644 --- a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt @@ -116,12 +116,14 @@ class AudioPlayActivity : R.id.menu_change_source -> AudioPlay.book?.let { showDialogFragment(ChangeBookSourceDialog(it.name, it.author)) } + R.id.menu_login -> AudioPlay.bookSource?.let { startActivity { putExtra("type", "bookSource") putExtra("key", it.bookSourceUrl) } } + R.id.menu_wake_lock -> AppConfig.audioPlayUseWakeLock = !AppConfig.audioPlayUseWakeLock R.id.menu_copy_audio_url -> sendToClip(AudioPlayService.url) R.id.menu_edit_source -> AudioPlay.bookSource?.let { @@ -129,6 +131,7 @@ class AudioPlayActivity : putExtra("sourceUrl", it.bookSourceUrl) } } + R.id.menu_log -> showDialogFragment() } return super.onCompatOptionsItemSelected(item) @@ -266,7 +269,8 @@ class AudioPlayActivity : binding.tvSubTitle.text = it AudioPlay.book?.let { book -> binding.ivSkipPrevious.isEnabled = book.durChapterIndex > 0 - binding.ivSkipNext.isEnabled = book.durChapterIndex < book.totalChapterNum - 1 + binding.ivSkipNext.isEnabled = + book.durChapterIndex < book.simulatedTotalChapterNum() - 1 } } observeEventSticky(EventBus.AUDIO_SIZE) { 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 8811c1837..bc70b6306 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 @@ -251,7 +251,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { appDb.bookChapterDao.insert(*it.toTypedArray()) if (book.isSameNameAuthor(ReadBook.book)) { ReadBook.book = book - ReadBook.chapterSize = book.totalChapterNum + ReadBook.chapterSize = book.simulatedTotalChapterNum() } } bookData.postValue(book) diff --git a/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt index 702112f4e..95b8bc61c 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt @@ -409,4 +409,4 @@ abstract class BaseReadBookActivity : val nextKeysStr = getPrefString(PreferKey.nextKeys) return nextKeysStr?.split(",")?.contains(keyCode.toString()) ?: false } -} +} \ No newline at end of file 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 b4af787da..01a81fb7e 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 @@ -229,6 +229,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { AppLog.put("拉取阅读进度失败《${book.name}》\n${it.localizedMessage}", it) }.onSuccess { progress -> if (progress.durChapterIndex < book.durChapterIndex || + progress.durChapterIndex >= book.simulatedTotalChapterNum() || (progress.durChapterIndex == book.durChapterIndex && progress.durChapterPos < book.durChapterPos) ) { diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt index 474306bd5..55ff73577 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt @@ -708,7 +708,8 @@ class ReadView(context: Context, attrs: AttributeSet) : } override fun hasNextChapter(): Boolean { - return ReadBook.durChapterIndex < ReadBook.chapterSize - 1 + return ReadBook.durChapterIndex < ((ReadBook.book?.simulatedTotalChapterNum() + ?: ReadBook.chapterSize) - 1) } override fun hasPrevChapter(): Boolean { diff --git a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt index 2f76982c3..7c3150f1a 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/ChapterListFragment.kt @@ -118,7 +118,10 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt lifecycleScope.launch { withContext(IO) { when { - searchKey.isNullOrBlank() -> appDb.bookChapterDao.getChapterList(viewModel.bookUrl) + searchKey.isNullOrBlank() -> appDb.bookChapterDao.getChapterList( + viewModel.bookUrl + ).take(book?.simulatedTotalChapterNum() ?: Int.MAX_VALUE) + else -> appDb.bookChapterDao.search(viewModel.bookUrl, searchKey) } }.let { @@ -163,9 +166,10 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt override fun openChapter(bookChapter: BookChapter) { activity?.run { - setResult(RESULT_OK, Intent() - .putExtra("index", bookChapter.index) - .putExtra("chapterChanged", bookChapter.index != durChapterIndex) + setResult( + RESULT_OK, Intent() + .putExtra("index", bookChapter.index) + .putExtra("chapterChanged", bookChapter.index != durChapterIndex) ) finish() } diff --git a/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt b/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt index 5f62f1bf0..d86771516 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/TocActivity.kt @@ -192,7 +192,7 @@ class TocActivity : VMBaseActivity(), ReadBook.book?.let { readBook -> if (readBook == book) { ReadBook.book = book - ReadBook.chapterSize = book.totalChapterNum + ReadBook.chapterSize = book.simulatedTotalChapterNum() ReadBook.upMsg(null) ReadBook.loadContent(resetPageOffset = true) } diff --git a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt index ed8efcdff..6f9080a62 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt @@ -163,7 +163,7 @@ class MainViewModel(application: Application) : BaseViewModel(application) { appDb.bookChapterDao.insert(*toc.toTypedArray()) if (book.isSameNameAuthor(ReadBook.book)) { ReadBook.book = book - ReadBook.chapterSize = book.totalChapterNum + ReadBook.chapterSize = book.simulatedTotalChapterNum() } addDownload(source, book) }.onFailure {