From 51fbd1f7babc9482361ad6b26c18c1ed68575ac1 Mon Sep 17 00:00:00 2001 From: 821938089 <821938089@qq.com> Date: Tue, 16 Aug 2022 18:09:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/constant/PreferKey.kt | 1 + .../io/legado/app/data/dao/RssSourceDao.kt | 12 +++++++ .../io/legado/app/help/config/AppConfig.kt | 4 ++- .../io/legado/app/model/localBook/EpubFile.kt | 7 +++-- .../legado/app/model/localBook/LocalBook.kt | 15 +++++++-- .../legado/app/service/CheckSourceService.kt | 4 +-- .../legado/app/ui/book/manage/BookAdapter.kt | 21 +++++++++++++ .../ui/book/manage/BookshelfManageActivity.kt | 1 + .../app/ui/book/read/ReadBookActivity.kt | 17 ++++++---- .../app/ui/book/search/SearchActivity.kt | 6 ++++ .../app/ui/config/BackupConfigFragment.kt | 9 ++++++ .../io/legado/app/ui/main/rss/RssAdapter.kt | 2 ++ .../io/legado/app/ui/main/rss/RssFragment.kt | 6 +++- .../ui/rss/source/manage/GroupManageDialog.kt | 6 +++- .../ui/rss/source/manage/RssSourceActivity.kt | 31 +++++++++++++++++-- .../ui/rss/source/manage/RssSourceAdapter.kt | 20 ++++++++++++ .../rss/source/manage/RssSourceViewModel.kt | 7 +++++ .../io/legado/app/utils/StringExtensions.kt | 3 ++ .../main/res/menu/bookshelf_menage_sel.xml | 4 +++ app/src/main/res/menu/rss_main_item.xml | 4 +++ app/src/main/res/menu/rss_source.xml | 16 ++++++++++ app/src/main/res/menu/rss_source_sel.xml | 5 ++- app/src/main/res/values-es-rES/strings.xml | 2 ++ app/src/main/res/values-ja-rJP/strings.xml | 2 ++ app/src/main/res/values-pt-rBR/strings.xml | 2 ++ app/src/main/res/values-zh-rHK/strings.xml | 2 ++ app/src/main/res/values-zh-rTW/strings.xml | 2 ++ app/src/main/res/values-zh/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/pref_config_other.xml | 6 ++++ 30 files changed, 202 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index ded6d3efb..b1bbf3663 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -109,6 +109,7 @@ object PreferKey { const val welcomeShowIcon = "welcomeShowIcon" const val welcomeShowIconDark = "welcomeShowIconDark" const val pageTouchSlop = "pageTouchSlop" + const val showAddToShelfAlert = "showAddToShelfAlert" const val cPrimary = "colorPrimary" const val cAccent = "colorAccent" diff --git a/app/src/main/java/io/legado/app/data/dao/RssSourceDao.kt b/app/src/main/java/io/legado/app/data/dao/RssSourceDao.kt index d56f11bde..4014b8069 100644 --- a/app/src/main/java/io/legado/app/data/dao/RssSourceDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/RssSourceDao.kt @@ -44,6 +44,15 @@ interface RssSourceDao { @Query("SELECT * FROM rssSources where enabled = 1 order by customOrder") fun flowEnabled(): Flow> + @Query("SELECT * FROM rssSources where enabled = 0 order by customOrder") + fun flowDisabled(): Flow> + + @Query("select * from rssSources where loginUrl is not null and loginUrl != ''") + fun flowLogin(): Flow> + + @Query("select * from rssSources where sourceGroup is null or sourceGroup = '' or sourceGroup like '%未分组%'") + fun flowNoGroup(): Flow> + @Query( """SELECT * FROM rssSources where enabled = 1 @@ -67,6 +76,9 @@ interface RssSourceDao { @Query("select distinct sourceGroup from rssSources where trim(sourceGroup) <> ''") fun flowGroup(): Flow> + @Query("select distinct sourceGroup from rssSources where trim(sourceGroup) <> '' and enabled = 1") + fun flowGroupEnabled(): Flow> + @get:Query("select distinct sourceGroup from rssSources where trim(sourceGroup) <> ''") val allGroup: List diff --git a/app/src/main/java/io/legado/app/help/config/AppConfig.kt b/app/src/main/java/io/legado/app/help/config/AppConfig.kt index 81d15e3fe..60ea20f46 100644 --- a/app/src/main/java/io/legado/app/help/config/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/AppConfig.kt @@ -310,7 +310,9 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { val recordLog get() = appCtx.getPrefBoolean(PreferKey.recordLog) - val loadCoverOnlyWifi = appCtx.getPrefBoolean(PreferKey.loadCoverOnlyWifi, false) + val loadCoverOnlyWifi get() = appCtx.getPrefBoolean(PreferKey.loadCoverOnlyWifi, false) + + val showAddToShelfAlert get() = appCtx.getPrefBoolean(PreferKey.showAddToShelfAlert, true) val doublePageHorizontal: String? get() = appCtx.getPrefString(PreferKey.doublePageHorizontal) diff --git a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt b/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt index 52bcb35a7..764c2b0fa 100644 --- a/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt +++ b/app/src/main/java/io/legado/app/model/localBook/EpubFile.kt @@ -18,6 +18,7 @@ import java.io.File import java.io.FileOutputStream import java.io.IOException import java.io.InputStream +import java.net.URLDecoder import java.nio.charset.Charset class EpubFile(var book: Book) { @@ -117,7 +118,9 @@ class EpubFile(var book: Book) { * * ...titlepage.xhtml */ - if (chapter.url.contains("titlepage.xhtml")) { + if (chapter.url.contains("titlepage.xhtml") || + chapter.url.contains("cover.xhtml") + ) { return "" } /*获取当前章节文本*/ @@ -190,7 +193,7 @@ class EpubFile(var book: Book) { private fun getImage(href: String): InputStream? { if (href == "cover.jpeg") return epubBook?.coverImage?.inputStream - val abHref = href.replace("../", "") + val abHref = URLDecoder.decode(href.replace("../", ""), "UTF-8") return epubBook?.resources?.getByHref(abHref)?.inputStream } diff --git a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt index 68f5ef1f9..c7d5b11b3 100644 --- a/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt +++ b/app/src/main/java/io/legado/app/model/localBook/LocalBook.kt @@ -6,6 +6,7 @@ import androidx.documentfile.provider.DocumentFile import com.script.SimpleBindings import io.legado.app.R import io.legado.app.constant.AppConst +import io.legado.app.constant.AppLog import io.legado.app.data.appDb import io.legado.app.data.entities.BaseSource import io.legado.app.data.entities.Book @@ -16,6 +17,7 @@ import io.legado.app.help.BookHelp import io.legado.app.help.config.AppConfig import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.utils.* +import org.jsoup.nodes.Entities import splitties.init.appCtx import java.io.* import java.util.regex.Pattern @@ -81,7 +83,7 @@ object LocalBook { } fun getContent(book: Book, chapter: BookChapter): String? { - return try { + val content = try { when { book.isEpub() -> { EpubFile.getContent(book, chapter) @@ -95,8 +97,15 @@ object LocalBook { } } catch (e: Exception) { e.printOnDebug() - e.localizedMessage - } + AppLog.put("获取本地书籍内容失败\n${e.localizedMessage}", e) + "获取本地书籍内容失败\n${e.localizedMessage}" + }?.replace("<img", "< img", true) + content ?: return null + return kotlin.runCatching { + Entities.unescape(content) + }.onFailure { + AppLog.put("HTML实体解码失败\n${it.localizedMessage}", it) + }.getOrElse { content } } /** diff --git a/app/src/main/java/io/legado/app/service/CheckSourceService.kt b/app/src/main/java/io/legado/app/service/CheckSourceService.kt index f131b5c19..4005f9023 100644 --- a/app/src/main/java/io/legado/app/service/CheckSourceService.kt +++ b/app/src/main/java/io/legado/app/service/CheckSourceService.kt @@ -136,7 +136,7 @@ class CheckSourceService : BaseService() { source.bookSourceComment = source.bookSourceComment ?.split("\n\n") ?.filterNot { - it.startsWith("Error: ") + it.startsWith("// Error: ") }?.joinToString("\n") //校验搜索书籍 if (CheckSource.checkSearch) { @@ -186,7 +186,7 @@ class CheckSourceService : BaseService() { !is NoStackTraceException -> source.addGroup("网站失效") } source.bookSourceComment = - "Error: ${it.localizedMessage}" + if (source.bookSourceComment.isNullOrBlank()) + "// Error: ${it.localizedMessage}" + if (source.bookSourceComment.isNullOrBlank()) "" else "\n\n${source.bookSourceComment}" Debug.updateFinalMessage(source.bookSourceUrl, "校验失败:${it.localizedMessage}") }.onSuccess(searchCoroutine) { diff --git a/app/src/main/java/io/legado/app/ui/book/manage/BookAdapter.kt b/app/src/main/java/io/legado/app/ui/book/manage/BookAdapter.kt index 1897327ce..59e8238ad 100644 --- a/app/src/main/java/io/legado/app/ui/book/manage/BookAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/manage/BookAdapter.kt @@ -14,6 +14,8 @@ import io.legado.app.databinding.ItemArrangeBookBinding import io.legado.app.lib.theme.backgroundColor import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.ItemTouchCallback +import java.util.* +import kotlin.collections.HashSet class BookAdapter(context: Context, val callBack: CallBack) : RecyclerAdapter(context), @@ -121,6 +123,25 @@ class BookAdapter(context: Context, val callBack: CallBack) : callBack.upSelectCount() } + fun checkSelectedInterval() { + val selectedPosition = linkedSetOf() + getItems().forEachIndexed { index, it -> + if (selectedBooks.contains(it)) { + selectedPosition.add(index) + } + } + val minPosition = Collections.min(selectedPosition) + val maxPosition = Collections.max(selectedPosition) + val itemCount = maxPosition - minPosition + 1 + for (i in minPosition..maxPosition) { + getItem(i)?.let { + selectedBooks.add(it) + } + } + notifyItemRangeChanged(minPosition, itemCount, bundleOf(Pair("selected", null))) + callBack.upSelectCount() + } + private fun getGroupList(groupId: Long): List { val groupNames = arrayListOf() callBack.groupList.forEach { diff --git a/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageActivity.kt b/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageActivity.kt index 08e5a998b..f96bca25b 100644 --- a/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/manage/BookshelfManageActivity.kt @@ -192,6 +192,7 @@ class BookshelfManageActivity : viewModel.upCanUpdate(adapter.selection, false) R.id.menu_add_to_group -> selectGroup(addToGroupRequestCode, 0) R.id.menu_change_source -> showDialogFragment() + R.id.menu_check_selected_interval -> adapter.checkSelectedInterval() } return false } 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 6e63da661..a68c377a8 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 @@ -25,6 +25,7 @@ import io.legado.app.exception.NoStackTraceException import io.legado.app.help.AppWebDav import io.legado.app.help.BookHelp import io.legado.app.help.IntentData +import io.legado.app.help.config.AppConfig import io.legado.app.help.config.ReadBookConfig import io.legado.app.help.config.ReadTipConfig import io.legado.app.help.coroutine.Coroutine @@ -1147,13 +1148,17 @@ class ReadBookActivity : BaseReadBookActivity(), override fun finish() { ReadBook.book?.let { if (!ReadBook.inBookshelf) { - alert(title = getString(R.string.add_to_shelf)) { - setMessage(getString(R.string.check_add_bookshelf, it.name)) - okButton { - ReadBook.inBookshelf = true - setResult(Activity.RESULT_OK) + if (!AppConfig.showAddToShelfAlert) { + viewModel.removeFromBookshelf { super.finish() } + } else { + alert(title = getString(R.string.add_to_shelf)) { + setMessage(getString(R.string.check_add_bookshelf, it.name)) + okButton { + ReadBook.inBookshelf = true + setResult(Activity.RESULT_OK) + } + noButton { viewModel.removeFromBookshelf { super.finish() } } } - noButton { viewModel.removeFromBookshelf { super.finish() } } } } else { super.finish() diff --git a/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt b/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt index bb254de03..134b5bf09 100644 --- a/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt @@ -66,6 +66,7 @@ class SearchActivity : VMBaseActivity() + private var isManualStopSearch = false private val searchFinishCallback: (isEmpty: Boolean) -> Unit = searchFinish@{ isEmpty -> val searchGroup = AppConfig.searchGroup if (!isEmpty || searchGroup.isEmpty()) return@searchFinish @@ -155,6 +156,7 @@ class SearchActivity : VMBaseActivity(PreferKey.webDavDir)?.let { + it.setOnBindEditTextListener { editText -> + editText.text = AppConfig.webDavDir?.toEditable() + } + it.setOnPreferenceChangeListener { _, newValue -> + (newValue as String).isNotBlank() + } + } upPreferenceSummary(PreferKey.webDavUrl, getPrefString(PreferKey.webDavUrl)) upPreferenceSummary(PreferKey.webDavAccount, getPrefString(PreferKey.webDavAccount)) upPreferenceSummary(PreferKey.webDavPassword, getPrefString(PreferKey.webDavPassword)) diff --git a/app/src/main/java/io/legado/app/ui/main/rss/RssAdapter.kt b/app/src/main/java/io/legado/app/ui/main/rss/RssAdapter.kt index 2fb232c24..bedf4eeab 100644 --- a/app/src/main/java/io/legado/app/ui/main/rss/RssAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/main/rss/RssAdapter.kt @@ -63,6 +63,7 @@ class RssAdapter(context: Context, val callBack: CallBack) : R.id.menu_top -> callBack.toTop(rssSource) R.id.menu_edit -> callBack.edit(rssSource) R.id.menu_del -> callBack.del(rssSource) + R.id.menu_disable -> callBack.disable(rssSource) } true } @@ -74,5 +75,6 @@ class RssAdapter(context: Context, val callBack: CallBack) : fun toTop(rssSource: RssSource) fun edit(rssSource: RssSource) fun del(rssSource: RssSource) + fun disable(rssSource: RssSource) } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt b/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt index 9630f1752..427632170 100644 --- a/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt @@ -123,7 +123,7 @@ class RssFragment : VMBaseFragment(R.layout.fragment_rss), private fun initGroupData() { groupsFlowJob?.cancel() groupsFlowJob = launch { - appDb.rssSourceDao.flowGroup().conflate().collect { + appDb.rssSourceDao.flowGroupEnabled().conflate().collect { groups.clear() it.map { group -> groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) @@ -181,4 +181,8 @@ class RssFragment : VMBaseFragment(R.layout.fragment_rss), override fun del(rssSource: RssSource) { viewModel.del(rssSource) } + + override fun disable(rssSource: RssSource) { + viewModel.disable(rssSource) + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/GroupManageDialog.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/GroupManageDialog.kt index c2ff80ab2..bb49cf6f9 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/GroupManageDialog.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/GroupManageDialog.kt @@ -65,7 +65,11 @@ class GroupManageDialog : BaseDialogFragment(R.layout.dialog_recycler_view), it.map { group -> groups.addAll(group.splitNotBlank(AppPattern.splitGroupRegex)) } - adapter.setItems(groups.toList()) + adapter.setItems( + groups.sortedWith { o1, o2 -> + o1.cnCompare(o2) + } + ) } } } diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt index 470e243cb..9c82ea234 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt @@ -50,6 +50,9 @@ class RssSourceActivity : VMBaseActivity() private val importRecordKey = "rssSourceRecordKey" private val adapter by lazy { RssSourceAdapter(this, this) } + private val searchView: SearchView by lazy { + binding.titleBar.findViewById(R.id.search_view) + } private var sourceFlowJob: Job? = null private var groups = hashSetOf() private var groupMenu: SubMenu? = null @@ -120,10 +123,21 @@ class RssSourceActivity : VMBaseActivity qrCodeResult.launch() R.id.menu_group_manage -> showDialogFragment() R.id.menu_import_default -> viewModel.importDefault() + R.id.menu_enabled_group -> { + searchView.setQuery(getString(R.string.enabled), true) + } + R.id.menu_disabled_group -> { + searchView.setQuery(getString(R.string.disabled), true) + } + R.id.menu_group_login -> { + searchView.setQuery(getString(R.string.need_login), true) + } + R.id.menu_group_null -> { + searchView.setQuery(getString(R.string.no_group), true) + } R.id.menu_help -> showHelp() else -> if (item.groupId == R.id.source_group) { - binding.titleBar.findViewById(R.id.search_view) - .setQuery("group:${item.title}", true) + searchView.setQuery("group:${item.title}", true) } } return super.onCompatOptionsItemSelected(item) @@ -144,6 +158,7 @@ class RssSourceActivity : VMBaseActivity viewModel.saveToFile(adapter.selection) { share(it) } + R.id.menu_check_selected_interval -> adapter.checkSelectedInterval() } return true } @@ -240,6 +255,18 @@ class RssSourceActivity : VMBaseActivity { appDb.rssSourceDao.flowAll() } + searchKey == getString(R.string.enabled) -> { + appDb.rssSourceDao.flowEnabled() + } + searchKey == getString(R.string.disabled) -> { + appDb.rssSourceDao.flowDisabled() + } + searchKey == getString(R.string.need_login) -> { + appDb.rssSourceDao.flowLogin() + } + searchKey == getString(R.string.no_group) -> { + appDb.rssSourceDao.flowNoGroup() + } searchKey.startsWith("group:") -> { val key = searchKey.substringAfter("group:") appDb.rssSourceDao.flowGroupSearch(key) diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt index c1f3aa883..44faf60a1 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt @@ -17,6 +17,7 @@ import io.legado.app.lib.theme.backgroundColor import io.legado.app.ui.widget.recycler.DragSelectTouchHelper import io.legado.app.ui.widget.recycler.ItemTouchCallback import io.legado.app.utils.ColorUtils +import java.util.* class RssSourceAdapter(context: Context, val callBack: CallBack) : @@ -151,6 +152,25 @@ class RssSourceAdapter(context: Context, val callBack: CallBack) : callBack.upCountView() } + fun checkSelectedInterval() { + val selectedPosition = linkedSetOf() + getItems().forEachIndexed { index, it -> + if (selected.contains(it)) { + selectedPosition.add(index) + } + } + val minPosition = Collections.min(selectedPosition) + val maxPosition = Collections.max(selectedPosition) + val itemCount = maxPosition - minPosition + 1 + for (i in minPosition..maxPosition) { + getItem(i)?.let { + selected.add(it) + } + } + notifyItemRangeChanged(minPosition, itemCount, bundleOf(Pair("selected", null))) + callBack.upCountView() + } + private fun showMenu(view: View, position: Int) { val source = getItem(position) ?: return val popupMenu = PopupMenu(context, view) diff --git a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt index 8c48c12da..8bf64b790 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt @@ -133,4 +133,11 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application) } } + fun disable(rssSource: RssSource) { + execute { + rssSource.enabled = false + appDb.rssSourceDao.update(rssSource) + } + } + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/utils/StringExtensions.kt b/app/src/main/java/io/legado/app/utils/StringExtensions.kt index a5a6c3f39..f52095a18 100644 --- a/app/src/main/java/io/legado/app/utils/StringExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/StringExtensions.kt @@ -6,6 +6,7 @@ import io.legado.app.constant.AppPattern.dataUriRegex import android.icu.text.Collator import android.icu.util.ULocale import android.net.Uri +import android.text.Editable import java.io.File import java.util.* @@ -13,6 +14,8 @@ fun String?.safeTrim() = if (this.isNullOrBlank()) null else this.trim() fun String?.isContentScheme(): Boolean = this?.startsWith("content://") == true +fun String.toEditable(): Editable = Editable.Factory.getInstance().newEditable(this) + fun String.parseToUri(): Uri { return if (isContentScheme()) { Uri.parse(this) diff --git a/app/src/main/res/menu/bookshelf_menage_sel.xml b/app/src/main/res/menu/bookshelf_menage_sel.xml index 887f91524..859fdabbc 100644 --- a/app/src/main/res/menu/bookshelf_menage_sel.xml +++ b/app/src/main/res/menu/bookshelf_menage_sel.xml @@ -21,4 +21,8 @@ android:id="@+id/menu_change_source" android:title="@string/change_source_batch" /> + + \ No newline at end of file diff --git a/app/src/main/res/menu/rss_main_item.xml b/app/src/main/res/menu/rss_main_item.xml index 19dc2f30a..544e84398 100644 --- a/app/src/main/res/menu/rss_main_item.xml +++ b/app/src/main/res/menu/rss_main_item.xml @@ -9,6 +9,10 @@ android:id="@+id/menu_edit" android:title="@string/edit" /> + + diff --git a/app/src/main/res/menu/rss_source.xml b/app/src/main/res/menu/rss_source.xml index e5836f7d6..111e11dbd 100644 --- a/app/src/main/res/menu/rss_source.xml +++ b/app/src/main/res/menu/rss_source.xml @@ -16,6 +16,22 @@ android:id="@+id/menu_group_manage" android:title="@string/group_manage" /> + + + + + + + + diff --git a/app/src/main/res/menu/rss_source_sel.xml b/app/src/main/res/menu/rss_source_sel.xml index 252927165..542e280c5 100644 --- a/app/src/main/res/menu/rss_source_sel.xml +++ b/app/src/main/res/menu/rss_source_sel.xml @@ -27,11 +27,14 @@ android:title="@string/export_selection" app:showAsAction="never" /> - + diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 2a7ff5263..c94c43ea5 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1008,4 +1008,6 @@ 滑动多长距离才会触发滑动翻页(系统默认值 %s px) Ejemplo 选中所选区间 + 返回时提示放入书架 + 阅读未放入书架的书籍在返回时提示放入书架 diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 67ffe8fd9..0fa495693 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -1011,4 +1011,6 @@ 滑动多长距离才会触发滑动翻页(系统默认值 %s px) 选中所选区间 + 返回时提示放入书架 + 阅读未放入书架的书籍在返回时提示放入书架 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 60d2886bd..3ad76156f 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1011,4 +1011,6 @@ 滑动多长距离才会触发滑动翻页(系统默认值 %s px) Exemplo 选中所选区间 + 返回时提示放入书架 + 阅读未放入书架的书籍在返回时提示放入书架 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 34ba2a46a..9948080db 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1008,4 +1008,6 @@ 滑动多长距离才会触发滑动翻页(系统默认值 %s px) 示例 选中所选区间 + 返回时提示放入书架 + 阅读未放入书架的书籍在返回时提示放入书架 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 7b8de3a1b..5210c961a 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1010,4 +1010,6 @@ 滑动多长距离才会触发滑动翻页(系统默认值 %s px) 示例 选中所选区间 + 返回时提示放入书架 + 阅读未放入书架的书籍在返回时提示放入书架 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index de1f51ece..cc6801538 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1010,4 +1010,6 @@ 滑动多长距离才会触发滑动翻页(系统默认值 %s px) 示例 选中所选区间 + 返回时提示放入书架 + 阅读未放入书架的书籍在返回时提示放入书架 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 18656565b..d64ef8432 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1011,4 +1011,6 @@ 滑动翻页阈值(0 = 系统默认值) 滑动多长距离才会触发滑动翻页(系统默认值 %s px) 选中所选区间 + 返回时提示放入书架 + 阅读未放入书架的书籍在返回时提示放入书架 diff --git a/app/src/main/res/xml/pref_config_other.xml b/app/src/main/res/xml/pref_config_other.xml index 033d88ad1..47d6e7d28 100644 --- a/app/src/main/res/xml/pref_config_other.xml +++ b/app/src/main/res/xml/pref_config_other.xml @@ -112,6 +112,12 @@ android:summary="@string/auto_clear_expired_summary" android:title="@string/auto_clear_expired" /> + +