From 6d0a8699ceb0588668bea1bba53b1895ba94afd9 Mon Sep 17 00:00:00 2001 From: Yaoliang Date: Mon, 8 Jul 2024 20:21:25 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat(app):=20=E5=A2=9E=E5=8A=A0=E6=A8=A1?= =?UTF-8?q?=E6=8B=9F=E8=BF=BD=E8=AF=BB=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/data/entities/Book.kt | 65 +++++- .../java/io/legado/app/model/AudioPlay.kt | 4 +- .../main/java/io/legado/app/model/ReadBook.kt | 6 +- .../app/model/webBook/BookChapterList.kt | 5 +- .../io/legado/app/model/webBook/WebBook.kt | 2 +- .../app/ui/book/audio/AudioPlayActivity.kt | 4 +- .../app/ui/book/info/BookInfoViewModel.kt | 2 +- .../app/ui/book/read/BaseReadBookActivity.kt | 60 +++++- .../app/ui/book/read/ReadBookActivity.kt | 1 + .../app/ui/book/read/ReadBookViewModel.kt | 1 + .../legado/app/ui/book/read/page/ReadView.kt | 3 +- .../app/ui/book/toc/ChapterListFragment.kt | 5 +- .../io/legado/app/ui/book/toc/TocActivity.kt | 4 +- .../io/legado/app/ui/main/MainViewModel.kt | 4 +- .../style1/books/BaseBooksAdapter.kt | 3 +- .../res/layout/dialog_simulated_reading.xml | 197 ++++++++++++++++++ app/src/main/res/menu/book_read.xml | 5 + app/src/main/res/values-es-rES/strings.xml | 6 +- app/src/main/res/values-ja-rJP/strings.xml | 4 + app/src/main/res/values-pt-rBR/strings.xml | 4 + app/src/main/res/values-vi/strings.xml | 4 + app/src/main/res/values-zh-rHK/strings.xml | 4 + app/src/main/res/values-zh-rTW/strings.xml | 4 + app/src/main/res/values-zh/strings.xml | 4 + app/src/main/res/values/strings.xml | 4 + 25 files changed, 382 insertions(+), 23 deletions(-) create mode 100644 app/src/main/res/layout/dialog_simulated_reading.xml 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 7bdb74b66..6f2ae39c3 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 @@ -28,6 +28,9 @@ import io.legado.app.utils.fromJsonObject import kotlinx.parcelize.IgnoredOnParcel import kotlinx.parcelize.Parcelize import java.nio.charset.Charset +import java.time.LocalDate +import java.time.Period.between +import java.time.chrono.Chronology import kotlin.math.max import kotlin.math.min @@ -160,9 +163,21 @@ data class Book( @IgnoredOnParcel val lastChapterIndex get() = totalChapterNum - 1 + // 根据当前日期计算章节总数 + fun simulatedTotalChapterNum(): Int { + 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 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 @@ -257,6 +272,46 @@ data class Book( return config.splitLongChapter } + // readSimulating 的 setter 和 getter + fun setReadSimulating(readSimulating: Boolean) { + config.readSimulating = readSimulating + } + + fun getReadSimulating(): Boolean { + return config.readSimulating + } + + // startDate 的 setter 和 getter + fun setStartDate(startDate: LocalDate?) { + config.startDate = startDate + } + + fun getStartDate(): LocalDate? { + if (!config.readSimulating || config.startDate == null) { + return LocalDate.now() + } + return config.startDate + } + + // startChapter 的 setter 和 getter + fun setStartChapter(startChapter: Int) { + config.startChapter = startChapter + } + + fun getStartChapter(): Int { + if(config.readSimulating) return config.startChapter?:0 + return this.durChapterIndex + } + + // dailyChapters 的 setter 和 getter + fun setDailyChapters(dailyChapters: Int) { + config.dailyChapters = dailyChapters + } + + fun getDailyChapters(): Int { + return config.dailyChapters + } + fun getDelTag(tag: Long): Boolean { return config.delTag and tag == tag } @@ -385,7 +440,11 @@ data class Book( var useReplaceRule: Boolean? = null,// 正文使用净化替换规则 var delTag: Long = 0L,//去除标签 var ttsEngine: String? = null, - var splitLongChapter: Boolean = true + var splitLongChapter: Boolean = true, + var readSimulating: Boolean = false, + var startDate: LocalDate? = null, + var startChapter: Int? = null, // 用户设置的起始章节 + var dailyChapters: Int = 3 // 用户设置的每日更新章节数 ) : Parcelable class Converters { @@ -396,4 +455,4 @@ data class Book( @TypeConverter fun stringToReadConfig(json: String?) = GSON.fromJsonObject(json).getOrNull() } -} \ No newline at end of file +} 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..64d2e8b2d 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 @@ -223,4 +223,4 @@ object AudioPlay { } } } -} \ No newline at end of file +} 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 ef1ccc13c..a249c7466 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() @@ -576,7 +576,7 @@ object ReadBook : CoroutineScope by MainScope() { prevTextChapter?.cancelLayout() prevTextChapter = textChapter textChapter.layoutChannel.receiveAsFlow().collect() - if (upContent) callBack?.upContent(offset, resetPageOffset) + if (upContent) callBack?.upContent(offset, resetPageOffset) else TODO() } 1 -> { @@ -589,6 +589,8 @@ object ReadBook : CoroutineScope by MainScope() { if (upContent) callBack?.upContent(offset, resetPageOffset) } } + + else -> {TODO()} } }.onError { AppLog.put("ChapterProvider ERROR", it) 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 31f075d14..9dc8cf1e3 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 @@ -145,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) { @@ -260,4 +261,4 @@ object BookChapterList { return Pair(chapterList, nextUrlList) } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/legado/app/model/webBook/WebBook.kt b/app/src/main/java/io/legado/app/model/webBook/WebBook.kt index 3f42b797a..097641677 100644 --- a/app/src/main/java/io/legado/app/model/webBook/WebBook.kt +++ b/app/src/main/java/io/legado/app/model/webBook/WebBook.kt @@ -404,4 +404,4 @@ object WebBook { } } -} \ No newline at end of file +} 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 49cf4a452..72e7697dd 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 @@ -258,7 +258,7 @@ 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) { @@ -283,4 +283,4 @@ class AudioPlayActivity : } } -} \ 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 0d917bf30..db6abd93d 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 8496ae091..628e7c6b4 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 @@ -1,6 +1,7 @@ package io.legado.app.ui.book.read import android.annotation.SuppressLint +import android.app.DatePickerDialog import android.content.pm.ActivityInfo import android.os.Build import android.os.Bundle @@ -20,6 +21,7 @@ import io.legado.app.constant.PreferKey import io.legado.app.databinding.ActivityBookReadBinding import io.legado.app.databinding.DialogDownloadChoiceBinding import io.legado.app.databinding.DialogEditTextBinding +import io.legado.app.databinding.DialogSimulatedReadingBinding import io.legado.app.help.config.AppConfig import io.legado.app.help.config.LocalConfig import io.legado.app.help.config.ReadBookConfig @@ -48,6 +50,8 @@ import io.legado.app.utils.setNavigationBarColorAuto import io.legado.app.utils.showDialogFragment import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.visible +import java.time.LocalDate +import java.time.format.DateTimeFormatter /** * 阅读界面 @@ -304,6 +308,60 @@ abstract class BaseReadBookActivity : } } + fun showSimulatedReading() { + val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + ReadBook.book?.let { book -> + alert(titleResource = R.string.simulated_reading) { + val alertBinding = DialogSimulatedReadingBinding.inflate(layoutInflater).apply { + root.setBackgroundColor(root.context.backgroundColor) + srEnabled.isChecked = book.getReadSimulating() + editStart.setText(book.getStartChapter().toString()) + editNum.setText(book.getDailyChapters().toString()) + startDate.setText(book.getStartDate()?.format(dateFormatter)) + startDate.isFocusable = false; // 设置为false,不允许获得焦点 + startDate.isCursorVisible = false; // 不显示光标 + startDate.setOnClickListener { + // 获取当前日期 + val localStartDate = LocalDate.parse(startDate.text) + // 创建 DatePickerDialog + val datePickerDialog = DatePickerDialog( + root.context, + { _, yy, mm, dayOfMonth -> + // 使用Java 8的日期和时间API来格式化日期 + val date = LocalDate.of(yy, mm + 1, dayOfMonth) // Java 8的LocalDate,月份从1开始 + val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + val formattedDate = date.format(formatter) + startDate.setText(formattedDate) + }, localStartDate.year, localStartDate.monthValue - 1, localStartDate.dayOfMonth + ) + datePickerDialog.show() + } + } + customView { alertBinding.root } + yesButton { + alertBinding.run { + val start = editStart.text!!.toString().let { + if (it.isEmpty()) 0 else it.toInt() + } + val num = editNum.text!!.toString().let { + if (it.isEmpty()) book.totalChapterNum else it.toInt() + } + val enabled = srEnabled.isChecked + val date = startDate.text!!.toString().let { + if (it.isEmpty()) LocalDate.now() else LocalDate.parse(it, dateFormatter) + } + book.setStartDate(date) + book.setDailyChapters(num) + book.setStartChapter(start) + book.setReadSimulating(enabled) + book.save() + } + } + noButton() + } + } + } + fun showCharsetConfig() { alert(R.string.set_charset) { val alertBinding = DialogEditTextBinding.inflate(layoutInflater).apply { @@ -350,4 +408,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/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index baa990707..162025429 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -473,6 +473,7 @@ class ReadBookActivity : BaseReadBookActivity(), R.id.menu_download -> showDownloadDialog() R.id.menu_add_bookmark -> addBookmark() + R.id.menu_simulated_reading -> showSimulatedReading() R.id.menu_edit_content -> showDialogFragment(ContentEditDialog()) R.id.menu_update_toc -> ReadBook.book?.let { if (it.isEpub) { 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 0374646d5..8774fefa1 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..807de565f 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,8 @@ 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 { @@ -171,4 +172,4 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt } } -} \ No newline at end of file +} 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..dd52305b0 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) } @@ -224,4 +224,4 @@ class TocActivity : VMBaseActivity(), } -} \ No newline at end of file +} 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..420f7a92f 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 { @@ -241,4 +241,4 @@ class MainViewModel(application: Application) : BaseViewModel(application) { } } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BaseBooksAdapter.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BaseBooksAdapter.kt index 14d888884..386107e31 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BaseBooksAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BaseBooksAdapter.kt @@ -28,6 +28,7 @@ abstract class BaseBooksAdapter(context: Context) : oldItem.lastCheckCount != newItem.lastCheckCount -> false oldItem.getDisplayCover() != newItem.getDisplayCover() -> false oldItem.getUnreadChapterNum() != newItem.getUnreadChapterNum() -> false + oldItem.getReadSimulating() -> false else -> true } } @@ -83,4 +84,4 @@ abstract class BaseBooksAdapter(context: Context) : fun openBookInfo(book: Book) fun isUpdate(bookUrl: String): Boolean } -} \ No newline at end of file +} diff --git a/app/src/main/res/layout/dialog_simulated_reading.xml b/app/src/main/res/layout/dialog_simulated_reading.xml new file mode 100644 index 000000000..1d065cdf4 --- /dev/null +++ b/app/src/main/res/layout/dialog_simulated_reading.xml @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/book_read.xml b/app/src/main/res/menu/book_read.xml index 8384f4443..b37e4e3ab 100644 --- a/app/src/main/res/menu/book_read.xml +++ b/app/src/main/res/menu/book_read.xml @@ -49,6 +49,11 @@ android:title="@string/bookmark_add" app:showAsAction="never" /> + + The selected text cannot be spoken in full text speech Extend to cutout Updating Chapters - + Headset buttons are always available Headset buttons are available even exit the app. Contributors @@ -1148,4 +1148,8 @@ 继续滑动以加载下一章… 启用绘制优化 阅读需要请求后台权限以保持服务正常运行 + Lectura Ficticia + Enc/Apag + Comenzar + Cap. al día diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 5888fbbe9..2d50f499a 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -1151,4 +1151,8 @@ 继续滑动以加载下一章… 启用绘制优化 阅读需要请求后台权限以保持服务正常运行 + 模擬追読 + スイッチ + 開始日 + 日更の章数 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 92ecf7155..440e4baf3 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1151,4 +1151,8 @@ 继续滑动以加载下一章… 启用绘制优化 阅读需要请求后台权限以保持服务正常运行 + Leitura Fingida + Lig/Desl + Começar + Cap. por dia diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 042b290ee..a66dab4b0 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1147,4 +1147,8 @@ Còn 继续滑动以加载下一章… 启用绘制优化 阅读需要请求后台权限以保持服务正常运行 + Đọc giả lập + Bật + Bắt đầu + Chương/ngày diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 5bdd280e3..1d8734f4b 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1148,4 +1148,8 @@ 继续滑动以加载下一章… 启用绘制优化 阅读需要请求后台权限以保持服务正常运行 + 模擬追讀 + 開關 + 起始日期 + 日更章數 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 63d40d920..dd90b65b9 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1150,4 +1150,8 @@ 继续滑动以加载下一章… 启用绘制优化 阅读需要请求后台权限以保持服务正常运行 + 模擬追讀 + 開關 + 起始日期 + 日更章數 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 0331f88b0..56687fd2b 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1150,4 +1150,8 @@ 继续滑动以加载下一章… 启用绘制优化 阅读需要请求后台权限以保持服务正常运行 + 模拟追读 + 开关 + 开始日期 + 日更章数 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 94c95a033..cabd1a27b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1151,4 +1151,8 @@ Keep swiping to load the next chapter… 启用绘制优化 阅读需要请求后台权限以保持服务正常运行 + Simulated Reading + Switch + Start from + Daily Chapters From d69fb0d723a3572d3725d015bee2e11d07a95546 Mon Sep 17 00:00:00 2001 From: Yaoliang Date: Tue, 9 Jul 2024 21:58:47 +0800 Subject: [PATCH 2/5] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/data/entities/Book.kt | 13 +++++-------- .../main/java/io/legado/app/model/AudioPlay.kt | 4 ++-- .../main/java/io/legado/app/model/ReadBook.kt | 13 +++++++------ .../legado/app/model/webBook/BookChapterList.kt | 13 +++++++------ .../java/io/legado/app/model/webBook/WebBook.kt | 2 +- .../app/ui/book/audio/AudioPlayActivity.kt | 16 ++++++++++++---- .../legado/app/ui/book/info/BookInfoViewModel.kt | 4 ++-- .../app/ui/book/read/BaseReadBookActivity.kt | 7 ++++--- .../legado/app/ui/book/read/ReadBookViewModel.kt | 3 +-- .../io/legado/app/ui/book/read/page/ReadView.kt | 3 +-- .../app/ui/book/toc/ChapterListFragment.kt | 5 ++--- .../io/legado/app/ui/book/toc/TocActivity.kt | 4 ++-- .../java/io/legado/app/ui/main/MainViewModel.kt | 4 ++-- .../bookshelf/style1/books/BaseBooksAdapter.kt | 1 - .../main/res/layout/dialog_simulated_reading.xml | 14 +------------- app/src/main/res/menu/book_read.xml | 10 +++++----- app/src/main/res/values-es-rES/strings.xml | 1 + app/src/main/res/values-ja-rJP/strings.xml | 1 + app/src/main/res/values-night/strings.xml | 4 ++++ app/src/main/res/values-pt-rBR/strings.xml | 1 + app/src/main/res/values-vi/strings.xml | 1 + app/src/main/res/values-zh-rHK/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 25 files changed, 66 insertions(+), 62 deletions(-) create mode 100644 app/src/main/res/values-night/strings.xml 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 6f2ae39c3..379bc055e 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 @@ -16,12 +16,10 @@ import io.legado.app.help.book.BookHelp import io.legado.app.help.book.ContentProcessor import io.legado.app.help.book.isEpub import io.legado.app.help.book.isImage -import io.legado.app.help.book.isLocal import io.legado.app.help.book.isPdf import io.legado.app.help.config.AppConfig import io.legado.app.help.config.ReadBookConfig import io.legado.app.model.ReadBook -import io.legado.app.model.localBook.LocalBook import io.legado.app.utils.GSON import io.legado.app.utils.MD5Utils import io.legado.app.utils.fromJsonObject @@ -30,7 +28,6 @@ import kotlinx.parcelize.Parcelize import java.nio.charset.Charset import java.time.LocalDate import java.time.Period.between -import java.time.chrono.Chronology import kotlin.math.max import kotlin.math.min @@ -170,14 +167,14 @@ data class Book( val daysPassed = between(this.config.startDate, currentDate).days + 1 // 计算当前应该解锁到哪一章 - val chaptersToUnlock = (config.startChapter?:0) + (daysPassed * config.dailyChapters) - return min(this.totalChapterNum, chaptersToUnlock); - } else return this.totalChapterNum; + val chaptersToUnlock = (config.startChapter ?: 0) + (daysPassed * config.dailyChapters) + return chaptersToUnlock + } else return this.totalChapterNum } fun getRealAuthor() = author.replace(AppPattern.authorRegex, "") - fun getUnreadChapterNum() = max(simulatedTotalChapterNum() - durChapterIndex - 1, 0) + fun getUnreadChapterNum() = max(totalChapterNum - durChapterIndex - 1, 0) fun getDisplayCover() = if (customCoverUrl.isNullOrEmpty()) coverUrl else customCoverUrl @@ -299,7 +296,7 @@ data class Book( } fun getStartChapter(): Int { - if(config.readSimulating) return config.startChapter?:0 + if (config.readSimulating) return config.startChapter ?: 0 return this.durChapterIndex } 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 64d2e8b2d..b61007f2a 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.simulatedTotalChapterNum()) { + if (book.durChapterIndex + 1 < book.totalChapterNum) { book.durChapterIndex += 1 book.durChapterPos = 0 durChapterIndex = book.durChapterIndex @@ -223,4 +223,4 @@ object AudioPlay { } } } -} +} \ No newline at end of file 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 a249c7466..2f11adb6f 100644 --- a/app/src/main/java/io/legado/app/model/ReadBook.kt +++ b/app/src/main/java/io/legado/app/model/ReadBook.kt @@ -151,7 +151,7 @@ object ReadBook : CoroutineScope by MainScope() { fun setProgress(progress: BookProgress) { if (progress.durChapterIndex < chapterSize && (durChapterIndex != progress.durChapterIndex - || durChapterPos != progress.durChapterPos) + || durChapterPos != progress.durChapterPos) ) { durChapterIndex = progress.durChapterIndex durChapterPos = progress.durChapterPos @@ -229,7 +229,7 @@ object ReadBook : CoroutineScope by MainScope() { } fun moveToNextChapter(upContent: Boolean, upContentInPlace: Boolean = true): Boolean { - if (durChapterIndex < (book?.simulatedTotalChapterNum()?: chapterSize) - 1) { + if (durChapterIndex < chapterSize - 1) { durChapterPos = 0 durChapterIndex++ prevTextChapter?.cancelLayout() @@ -576,7 +576,7 @@ object ReadBook : CoroutineScope by MainScope() { prevTextChapter?.cancelLayout() prevTextChapter = textChapter textChapter.layoutChannel.receiveAsFlow().collect() - if (upContent) callBack?.upContent(offset, resetPageOffset) else TODO() + if (upContent) callBack?.upContent(offset, resetPageOffset) } 1 -> { @@ -589,9 +589,10 @@ object ReadBook : CoroutineScope by MainScope() { if (upContent) callBack?.upContent(offset, resetPageOffset) } } - - else -> {TODO()} } + + // put a log to avoid Kotlin K2 compiler take "when" as a return statement + AppLog.putDebug("contentLoadFinish done") }.onError { AppLog.put("ChapterProvider ERROR", it) appCtx.toastOnUi("ChapterProvider ERROR:\n${it.stackTraceStr}") @@ -728,4 +729,4 @@ object ReadBook : CoroutineScope by MainScope() { fun notifyBookChanged() } -} +} \ No newline at end of file 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 9dc8cf1e3..1c05bfa2b 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 @@ -113,16 +113,18 @@ object BookChapterList { if (chapterList.isEmpty()) { throw TocEmptyException(appCtx.getString(R.string.chapter_list_empty)) } - //去重 if (!reverse) { chapterList.reverse() } coroutineContext.ensureActive() + //去重 val lh = LinkedHashSet(chapterList) - val list = ArrayList(lh) + val fullList = ArrayList(lh) if (!book.getReverseToc()) { - list.reverse() + fullList.reverse() } + val list = + if (book.getReadSimulating()) fullList.take(book.simulatedTotalChapterNum()) else fullList Debug.log(book.origin, "◇目录总数:${list.size}") coroutineContext.ensureActive() val formatJs = tocRule.formatJs @@ -145,8 +147,7 @@ object BookChapterList { } val replaceRules = ContentProcessor.get(book.name, book.origin).getTitleReplaceRules() book.latestChapterTitle = - list.getOrElse(book.simulatedTotalChapterNum() - 1) { - list.last() }.getDisplayTitle(replaceRules, book.getUseReplaceRule()) + list.last().getDisplayTitle(replaceRules, book.getUseReplaceRule()) book.durChapterTitle = list.getOrElse(book.durChapterIndex) { list.last() } .getDisplayTitle(replaceRules, book.getUseReplaceRule()) if (book.totalChapterNum < list.size) { @@ -261,4 +262,4 @@ object BookChapterList { return Pair(chapterList, nextUrlList) } -} +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/model/webBook/WebBook.kt b/app/src/main/java/io/legado/app/model/webBook/WebBook.kt index 097641677..3f42b797a 100644 --- a/app/src/main/java/io/legado/app/model/webBook/WebBook.kt +++ b/app/src/main/java/io/legado/app/model/webBook/WebBook.kt @@ -404,4 +404,4 @@ object WebBook { } } -} +} \ No newline at end of file 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 72e7697dd..067a2172b 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 @@ -36,13 +36,21 @@ import io.legado.app.ui.book.source.edit.BookSourceEditActivity import io.legado.app.ui.book.toc.TocActivityResult import io.legado.app.ui.login.SourceLoginActivity import io.legado.app.ui.widget.seekbar.SeekBarChangeListener -import io.legado.app.utils.* +import io.legado.app.utils.StartActivityContract +import io.legado.app.utils.dpToPx +import io.legado.app.utils.invisible +import io.legado.app.utils.observeEvent +import io.legado.app.utils.observeEventSticky +import io.legado.app.utils.sendToClip +import io.legado.app.utils.showDialogFragment +import io.legado.app.utils.startActivity import io.legado.app.utils.viewbindingdelegate.viewBinding +import io.legado.app.utils.visible import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import splitties.views.onLongClick -import java.util.* +import java.util.Locale /** * 音频播放 @@ -258,7 +266,7 @@ class AudioPlayActivity : binding.tvSubTitle.text = it AudioPlay.book?.let { book -> binding.ivSkipPrevious.isEnabled = book.durChapterIndex > 0 - binding.ivSkipNext.isEnabled = book.durChapterIndex < book.simulatedTotalChapterNum() - 1 + binding.ivSkipNext.isEnabled = book.durChapterIndex < book.totalChapterNum - 1 } } observeEventSticky(EventBus.AUDIO_SIZE) { @@ -283,4 +291,4 @@ class AudioPlayActivity : } } -} +} \ 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 db6abd93d..8811c1837 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.simulatedTotalChapterNum() + ReadBook.chapterSize = book.totalChapterNum } } bookData.postValue(book) @@ -517,4 +517,4 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { } -} +} \ No newline at end of file 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 628e7c6b4..d17c0fc06 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 @@ -61,6 +61,8 @@ abstract class BaseReadBookActivity : override val binding by viewBinding(ActivityBookReadBinding::inflate) override val viewModel by viewModels() + val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + var bottomDialog = 0 set(value) { if (field != value) { @@ -309,7 +311,6 @@ abstract class BaseReadBookActivity : } fun showSimulatedReading() { - val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") ReadBook.book?.let { book -> alert(titleResource = R.string.simulated_reading) { val alertBinding = DialogSimulatedReadingBinding.inflate(layoutInflater).apply { @@ -318,8 +319,8 @@ abstract class BaseReadBookActivity : editStart.setText(book.getStartChapter().toString()) editNum.setText(book.getDailyChapters().toString()) startDate.setText(book.getStartDate()?.format(dateFormatter)) - startDate.isFocusable = false; // 设置为false,不允许获得焦点 - startDate.isCursorVisible = false; // 不显示光标 + startDate.isFocusable = false // 设置为false,不允许获得焦点 + startDate.isCursorVisible = false // 不显示光标 startDate.setOnClickListener { // 获取当前日期 val localStartDate = LocalDate.parse(startDate.text) 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 8774fefa1..b4af787da 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,7 +229,6 @@ 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) ) { @@ -545,4 +544,4 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { } } -} +} \ No newline at end of file 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 55ff73577..474306bd5 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,8 +708,7 @@ class ReadView(context: Context, attrs: AttributeSet) : } override fun hasNextChapter(): Boolean { - return ReadBook.durChapterIndex < ((ReadBook.book?.simulatedTotalChapterNum() - ?: ReadBook.chapterSize) - 1) + return ReadBook.durChapterIndex < 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 807de565f..2f76982c3 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,8 +118,7 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt lifecycleScope.launch { withContext(IO) { when { - searchKey.isNullOrBlank() -> appDb.bookChapterDao.getChapterList( - viewModel.bookUrl).take(book?.simulatedTotalChapterNum()?: Int.MAX_VALUE) + searchKey.isNullOrBlank() -> appDb.bookChapterDao.getChapterList(viewModel.bookUrl) else -> appDb.bookChapterDao.search(viewModel.bookUrl, searchKey) } }.let { @@ -172,4 +171,4 @@ class ChapterListFragment : VMBaseFragment(R.layout.fragment_chapt } } -} +} \ No newline at end of file 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 dd52305b0..5f62f1bf0 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.simulatedTotalChapterNum() + ReadBook.chapterSize = book.totalChapterNum ReadBook.upMsg(null) ReadBook.loadContent(resetPageOffset = true) } @@ -224,4 +224,4 @@ class TocActivity : VMBaseActivity(), } -} +} \ No newline at end of file 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 420f7a92f..ed8efcdff 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.simulatedTotalChapterNum() + ReadBook.chapterSize = book.totalChapterNum } addDownload(source, book) }.onFailure { @@ -241,4 +241,4 @@ class MainViewModel(application: Application) : BaseViewModel(application) { } } -} +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BaseBooksAdapter.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BaseBooksAdapter.kt index 386107e31..92b7065e4 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BaseBooksAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BaseBooksAdapter.kt @@ -28,7 +28,6 @@ abstract class BaseBooksAdapter(context: Context) : oldItem.lastCheckCount != newItem.lastCheckCount -> false oldItem.getDisplayCover() != newItem.getDisplayCover() -> false oldItem.getUnreadChapterNum() != newItem.getUnreadChapterNum() -> false - oldItem.getReadSimulating() -> false else -> true } } diff --git a/app/src/main/res/layout/dialog_simulated_reading.xml b/app/src/main/res/layout/dialog_simulated_reading.xml index 1d065cdf4..c57c498f8 100644 --- a/app/src/main/res/layout/dialog_simulated_reading.xml +++ b/app/src/main/res/layout/dialog_simulated_reading.xml @@ -4,7 +4,6 @@ android:id="@+id/ll_content" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@color/background" android:gravity="center" android:padding="20dp" android:orientation="vertical"> @@ -12,7 +11,6 @@ @@ -59,7 +57,6 @@ @@ -116,20 +113,11 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginRight="2dp" - android:text="@string/start" + android:text="@string/start_chapter" android:textColor="@color/primaryText" android:textSize="16sp" tools:ignore="RtlHardcoded" /> - - - + + Enc/Apag Comenzar Cap. al día + Cap. inicio diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 2d50f499a..30ddf4db0 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -1155,4 +1155,5 @@ スイッチ 開始日 日更の章数 + 開始の章 diff --git a/app/src/main/res/values-night/strings.xml b/app/src/main/res/values-night/strings.xml new file mode 100644 index 000000000..9a602ca1b --- /dev/null +++ b/app/src/main/res/values-night/strings.xml @@ -0,0 +1,4 @@ + + + Start Chapter + \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 440e4baf3..c31da9a3e 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1155,4 +1155,5 @@ Lig/Desl Começar Cap. por dia + Início diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index a66dab4b0..873191142 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1151,4 +1151,5 @@ Còn Bật Bắt đầu Chương/ngày + Chương đầu diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 1d8734f4b..46ab974cc 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1152,4 +1152,5 @@ 開關 起始日期 日更章數 + 開始篇章 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index dd90b65b9..8c988fb7a 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1154,4 +1154,5 @@ 開關 起始日期 日更章數 + 開始篇章 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 56687fd2b..f37dee0c7 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1154,4 +1154,5 @@ 开关 开始日期 日更章数 + 起始章节 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cabd1a27b..3d4f887ca 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1155,4 +1155,5 @@ Switch Start from Daily Chapters + Start Chapter From 3166bb5cc3e1a22842e966addfb13be8d72b8f9a Mon Sep 17 00:00:00 2001 From: Yaoliang Date: Wed, 10 Jul 2024 08:32:56 +0800 Subject: [PATCH 3/5] fix: minor changes --- app/src/main/java/io/legado/app/data/entities/Book.kt | 2 +- app/src/main/java/io/legado/app/model/ReadBook.kt | 5 ++--- .../java/io/legado/app/ui/book/read/BaseReadBookActivity.kt | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) 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 379bc055e..bbf4dd0a1 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 @@ -452,4 +452,4 @@ data class Book( @TypeConverter fun stringToReadConfig(json: String?) = GSON.fromJsonObject(json).getOrNull() } -} +} \ No newline at end of file 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 2f11adb6f..5641204eb 100644 --- a/app/src/main/java/io/legado/app/model/ReadBook.kt +++ b/app/src/main/java/io/legado/app/model/ReadBook.kt @@ -591,8 +591,7 @@ object ReadBook : CoroutineScope by MainScope() { } } - // put a log to avoid Kotlin K2 compiler take "when" as a return statement - AppLog.putDebug("contentLoadFinish done") + return@async }.onError { AppLog.put("ChapterProvider ERROR", it) appCtx.toastOnUi("ChapterProvider ERROR:\n${it.stackTraceStr}") @@ -729,4 +728,4 @@ object ReadBook : CoroutineScope by MainScope() { fun notifyBookChanged() } -} \ No newline at end of file +} 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 d17c0fc06..702112f4e 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 @@ -61,7 +61,6 @@ abstract class BaseReadBookActivity : override val binding by viewBinding(ActivityBookReadBinding::inflate) override val viewModel by viewModels() - val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") var bottomDialog = 0 set(value) { @@ -311,6 +310,7 @@ abstract class BaseReadBookActivity : } fun showSimulatedReading() { + val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") ReadBook.book?.let { book -> alert(titleResource = R.string.simulated_reading) { val alertBinding = DialogSimulatedReadingBinding.inflate(layoutInflater).apply { From cbaab6166e258236b2e39f6e1dcf45f88b2efcce Mon Sep 17 00:00:00 2001 From: Yaoliang Date: Wed, 10 Jul 2024 11:08:54 +0800 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20=E4=BD=BF=E7=94=A8=E5=8E=9F=E6=9D=A5?= =?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=8B=9F=E8=BF=BD=E8=AF=BB=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/data/entities/Book.kt | 8 ++++---- app/src/main/java/io/legado/app/model/AudioPlay.kt | 2 +- app/src/main/java/io/legado/app/model/ReadBook.kt | 2 +- .../io/legado/app/model/webBook/BookChapterList.kt | 9 ++++----- .../io/legado/app/ui/book/audio/AudioPlayActivity.kt | 6 +++++- .../io/legado/app/ui/book/info/BookInfoViewModel.kt | 2 +- .../legado/app/ui/book/read/BaseReadBookActivity.kt | 2 +- .../io/legado/app/ui/book/read/ReadBookViewModel.kt | 1 + .../java/io/legado/app/ui/book/read/page/ReadView.kt | 3 ++- .../io/legado/app/ui/book/toc/ChapterListFragment.kt | 12 ++++++++---- .../java/io/legado/app/ui/book/toc/TocActivity.kt | 2 +- .../main/java/io/legado/app/ui/main/MainViewModel.kt | 2 +- 12 files changed, 30 insertions(+), 21 deletions(-) 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 { From 42a06ae6d19f425e5a9cb798062abcba73e208c4 Mon Sep 17 00:00:00 2001 From: Yaoliang Date: Wed, 10 Jul 2024 14:12:20 +0800 Subject: [PATCH 5/5] fix: minor changes --- .../java/io/legado/app/ui/book/info/BookInfoViewModel.kt | 2 +- .../java/io/legado/app/ui/book/read/BaseReadBookActivity.kt | 3 +-- .../java/io/legado/app/ui/book/read/ReadBookViewModel.kt | 5 ++--- app/src/main/res/values-night/strings.xml | 4 ---- 4 files changed, 4 insertions(+), 10 deletions(-) delete mode 100644 app/src/main/res/values-night/strings.xml 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 bc70b6306..db6abd93d 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 @@ -517,4 +517,4 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { } -} \ No newline at end of file +} 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 95b8bc61c..db882dd80 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 @@ -330,8 +330,7 @@ abstract class BaseReadBookActivity : { _, yy, mm, dayOfMonth -> // 使用Java 8的日期和时间API来格式化日期 val date = LocalDate.of(yy, mm + 1, dayOfMonth) // Java 8的LocalDate,月份从1开始 - val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") - val formattedDate = date.format(formatter) + val formattedDate = date.format(dateFormatter) startDate.setText(formattedDate) }, localStartDate.year, localStartDate.monthValue - 1, localStartDate.dayOfMonth ) 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 01a81fb7e..40c21d682 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,12 +229,11 @@ 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) ) { alertSync?.invoke(progress) - } else { + } else if (progress.durChapterIndex < book.simulatedTotalChapterNum()) { ReadBook.setProgress(progress) AppLog.put("自动同步阅读进度成功《${book.name}》 ${progress.durChapterTitle}") } @@ -545,4 +544,4 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { } } -} \ No newline at end of file +} diff --git a/app/src/main/res/values-night/strings.xml b/app/src/main/res/values-night/strings.xml deleted file mode 100644 index 9a602ca1b..000000000 --- a/app/src/main/res/values-night/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - Start Chapter - \ No newline at end of file