From 6d0a8699ceb0588668bea1bba53b1895ba94afd9 Mon Sep 17 00:00:00 2001 From: Yaoliang Date: Mon, 8 Jul 2024 20:21:25 +0800 Subject: [PATCH] =?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