diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceAdapter.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceAdapter.kt index 649d3e100..644e1add3 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceAdapter.kt @@ -68,7 +68,7 @@ class ChangeBookSourceAdapter( } else { for (i in payloads.indices) { val bundle = payloads[i] as Bundle - bundle.keySet().map { + bundle.keySet().forEach { when (it) { "name" -> tvOrigin.text = item.originName "latest" -> tvLast.text = item.getDisplayLastChapterTitle() diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceDialog.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceDialog.kt index 636a650cf..5f2ad6a4d 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceDialog.kt @@ -38,12 +38,12 @@ import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.ColorUtils import io.legado.app.utils.StartActivityContract import io.legado.app.utils.applyTint -import io.legado.app.utils.cnCompare import io.legado.app.utils.dpToPx import io.legado.app.utils.getCompatDrawable import io.legado.app.utils.observeEvent import io.legado.app.utils.setLayout import io.legado.app.utils.startActivity +import io.legado.app.utils.transaction import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.delay @@ -407,14 +407,12 @@ class ChangeBookSourceDialog() : BaseDialogFragment(R.layout.dialog_book_change_ */ private fun upGroupMenu() { binding.toolBar.menu.findItem(R.id.menu_group)?.run { - subMenu?.let { menu -> + subMenu?.transaction { menu -> val selectedGroup = AppConfig.searchGroup menu.removeGroup(R.id.source_group) val allItem = menu.add(R.id.source_group, Menu.NONE, Menu.NONE, R.string.all_source) var hasSelectedGroup = false - groups.sortedWith { o1, o2 -> - o1.cnCompare(o2) - }.forEach { group -> + groups.forEach { group -> menu.add(R.id.source_group, Menu.NONE, Menu.NONE, group)?.let { if (group == selectedGroup) { it.isChecked = true diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceAdapter.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceAdapter.kt index 2fce62b58..2eadeb03b 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceAdapter.kt @@ -65,7 +65,7 @@ class ChangeChapterSourceAdapter( } else { for (i in payloads.indices) { val bundle = payloads[i] as Bundle - bundle.keySet().map { + bundle.keySet().forEach { when (it) { "name" -> tvOrigin.text = item.originName "latest" -> tvLast.text = item.getDisplayLastChapterTitle() diff --git a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt index 4bfae56ac..94913e368 100644 --- a/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt @@ -37,13 +37,13 @@ import io.legado.app.ui.book.source.manage.BookSourceActivity import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.StartActivityContract import io.legado.app.utils.applyTint -import io.legado.app.utils.cnCompare import io.legado.app.utils.dpToPx import io.legado.app.utils.gone import io.legado.app.utils.observeEvent import io.legado.app.utils.setLayout import io.legado.app.utils.startActivity import io.legado.app.utils.toastOnUi +import io.legado.app.utils.transaction import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.visible import kotlinx.coroutines.Dispatchers.IO @@ -376,14 +376,12 @@ class ChangeChapterSourceDialog() : BaseDialogFragment(R.layout.dialog_chapter_c * 更新分组菜单 */ private fun upGroupMenu() { - binding.toolBar.menu.findItem(R.id.menu_group)?.subMenu?.let { menu -> + binding.toolBar.menu.findItem(R.id.menu_group)?.subMenu?.transaction { menu -> val selectedGroup = AppConfig.searchGroup menu.removeGroup(R.id.source_group) val allItem = menu.add(R.id.source_group, Menu.NONE, Menu.NONE, R.string.all_source) var hasSelectedGroup = false - groups.sortedWith { o1, o2 -> - o1.cnCompare(o2) - }.forEach { group -> + groups.forEach { group -> menu.add(R.id.source_group, Menu.NONE, Menu.NONE, group)?.let { if (group == selectedGroup) { it.isChecked = true 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 1b64f60ec..0f48da576 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 @@ -44,6 +44,7 @@ import io.legado.app.utils.putPrefBoolean import io.legado.app.utils.setEdgeEffectColor import io.legado.app.utils.showDialogFragment import io.legado.app.utils.startActivity +import io.legado.app.utils.transaction import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.visible import kotlinx.coroutines.Dispatchers.IO @@ -109,40 +110,42 @@ class SearchActivity : VMBaseActivity + private fun upGroupMenu() = groupMenu?.transaction { menu -> menu.removeGroup(R.id.source_group) groups.forEach { menu.add(R.id.source_group, Menu.NONE, Menu.NONE, it) @@ -648,7 +649,7 @@ class BookSourceActivity : VMBaseActivity + groups.forEach { group -> if (group.contains("失效") && searchView.query.isEmpty()) { searchView.setQuery("失效", true) toastOnUi("发现有失效书源,已为您自动筛选!") diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt index 7b8970bf2..6f18074a3 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt @@ -104,7 +104,7 @@ class BookSourceAdapter(context: Context, val callBack: CallBack) : } else { for (i in payloads.indices) { val bundle = payloads[i] as Bundle - bundle.keySet().map { + bundle.keySet().forEach { when (it) { "enabled" -> swtEnabled.isChecked = bundle.getBoolean("enabled") "upName" -> cbBookSource.text = item.getDisPlayNameGroup() diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt index fdde64ff5..499d9f9dc 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt @@ -254,7 +254,7 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) fun addGroup(group: String) { execute { val sources = appDb.bookSourceDao.noGroup - sources.map { source -> + sources.forEach { source -> source.bookSourceGroup = group } appDb.bookSourceDao.update(*sources.toTypedArray()) @@ -264,7 +264,7 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) fun upGroup(oldGroup: String, newGroup: String?) { execute { val sources = appDb.bookSourceDao.getByGroup(oldGroup) - sources.map { source -> + sources.forEach { source -> source.bookSourceGroup?.splitNotBlank(",")?.toHashSet()?.let { it.remove(oldGroup) if (!newGroup.isNullOrEmpty()) @@ -280,7 +280,7 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) execute { execute { val sources = appDb.bookSourceDao.getByGroup(group) - sources.map { source -> + sources.forEach { source -> source.removeGroup(group) } appDb.bookSourceDao.update(*sources.toTypedArray()) diff --git a/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleAdapter.kt b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleAdapter.kt index fe4d9bfd1..1a117ac67 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleAdapter.kt @@ -86,7 +86,7 @@ class TxtTocRuleAdapter(context: Context, private val callBack: CallBack) : } else { for (i in payloads.indices) { val bundle = payloads[i] as Bundle - bundle.keySet().map { + bundle.keySet().forEach { when (it) { "selected" -> cbSource.isChecked = selected.contains(item) "upName" -> cbSource.text = item.name diff --git a/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleDialog.kt b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleDialog.kt index db7db3259..ad0589bd4 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleDialog.kt @@ -259,7 +259,7 @@ class TxtTocRuleDialog() : BaseDialogFragment(R.layout.dialog_toc_regex), } else { for (i in payloads.indices) { val bundle = payloads[i] as Bundle - bundle.keySet().map { + bundle.keySet().forEach { when (it) { "upName" -> rbRegexName.text = item.name "upExample" -> titleExample.text = item.example diff --git a/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleAdapter.kt b/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleAdapter.kt index 4aacc19d5..b54ec69d3 100644 --- a/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleAdapter.kt @@ -103,7 +103,7 @@ class DictRuleAdapter(context: Context, var callBack: CallBack) : } else { for (i in payloads.indices) { val bundle = payloads[i] as Bundle - bundle.keySet().map { + bundle.keySet().forEach { when (it) { "selected" -> cbName.isChecked = selected.contains(item) "upName" -> cbName.text = item.name diff --git a/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt b/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt index a8ca8603e..c2d36f99a 100644 --- a/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt @@ -29,10 +29,10 @@ import io.legado.app.ui.book.search.SearchScope import io.legado.app.ui.book.source.edit.BookSourceEditActivity import io.legado.app.ui.main.MainFragmentInterface import io.legado.app.utils.applyTint -import io.legado.app.utils.cnCompare import io.legado.app.utils.flowWithLifecycleAndDatabaseChange import io.legado.app.utils.setEdgeEffectColor import io.legado.app.utils.startActivity +import io.legado.app.utils.transaction import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers.IO @@ -171,11 +171,9 @@ class ExploreFragment() : VMBaseFragment(R.layout.fragment_exp } } - private fun upGroupsMenu() = groupsMenu?.let { subMenu -> + private fun upGroupsMenu() = groupsMenu?.transaction { subMenu -> subMenu.removeGroup(R.id.menu_group_text) - groups.sortedWith { o1, o2 -> - o1.cnCompare(o2) - }.forEach { + groups.forEach { subMenu.add(R.id.menu_group_text, Menu.NONE, Menu.NONE, it) } } 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 e5f78b929..5bd401267 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 @@ -28,11 +28,11 @@ import io.legado.app.ui.rss.source.edit.RssSourceEditActivity import io.legado.app.ui.rss.source.manage.RssSourceActivity import io.legado.app.ui.rss.subscription.RuleSubActivity import io.legado.app.utils.applyTint -import io.legado.app.utils.cnCompare import io.legado.app.utils.flowWithLifecycleAndDatabaseChange import io.legado.app.utils.openUrl import io.legado.app.utils.setEdgeEffectColor import io.legado.app.utils.startActivity +import io.legado.app.utils.transaction import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Job @@ -100,11 +100,9 @@ class RssFragment() : VMBaseFragment(R.layout.fragment_rss), searchView.clearFocus() } - private fun upGroupsMenu() = groupsMenu?.let { subMenu -> + private fun upGroupsMenu() = groupsMenu?.transaction { subMenu -> subMenu.removeGroup(R.id.menu_group_text) - groups.sortedWith { o1, o2 -> - o1.cnCompare(o2) - }.forEach { + groups.forEach { subMenu.add(R.id.menu_group_text, Menu.NONE, Menu.NONE, it) } } diff --git a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt index 6a7692fed..9b095da71 100644 --- a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt @@ -49,6 +49,7 @@ import io.legado.app.utils.showDialogFragment import io.legado.app.utils.showHelp import io.legado.app.utils.splitNotBlank import io.legado.app.utils.toastOnUi +import io.legado.app.utils.transaction import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Job @@ -282,10 +283,10 @@ class ReplaceRuleActivity : VMBaseActivity + menu.removeGroup(R.id.replace_group) + groups.forEach { + menu.add(R.id.replace_group, Menu.NONE, Menu.NONE, it) } } diff --git a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleAdapter.kt b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleAdapter.kt index 6c4194cbd..69c417dc5 100644 --- a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleAdapter.kt @@ -111,7 +111,7 @@ class ReplaceRuleAdapter(context: Context, var callBack: CallBack) : } else { for (i in payloads.indices) { val bundle = payloads[i] as Bundle - bundle.keySet().map { + bundle.keySet().forEach { when (it) { "selected" -> cbName.isChecked = selected.contains(item) "upName" -> cbName.text = item.getDisplayNameGroup() diff --git a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleViewModel.kt b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleViewModel.kt index 3160b8fb7..f504c8905 100644 --- a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleViewModel.kt @@ -96,7 +96,7 @@ class ReplaceRuleViewModel(application: Application) : BaseViewModel(application fun addGroup(group: String) { execute { val sources = appDb.replaceRuleDao.noGroup - sources.map { source -> + sources.forEach { source -> source.group = group } appDb.replaceRuleDao.update(*sources.toTypedArray()) @@ -106,7 +106,7 @@ class ReplaceRuleViewModel(application: Application) : BaseViewModel(application fun upGroup(oldGroup: String, newGroup: String?) { execute { val sources = appDb.replaceRuleDao.getByGroup(oldGroup) - sources.map { source -> + sources.forEach { source -> source.group?.splitNotBlank(",")?.toHashSet()?.let { it.remove(oldGroup) if (!newGroup.isNullOrEmpty()) @@ -122,7 +122,7 @@ class ReplaceRuleViewModel(application: Application) : BaseViewModel(application execute { execute { val sources = appDb.replaceRuleDao.getByGroup(group) - sources.map { source -> + sources.forEach { source -> source.group?.splitNotBlank(",")?.toHashSet()?.let { it.remove(group) source.group = TextUtils.join(",", it) 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 d9c26e00f..30cd4953c 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 @@ -32,7 +32,6 @@ import io.legado.app.ui.widget.recycler.ItemTouchCallback import io.legado.app.ui.widget.recycler.VerticalDivider import io.legado.app.utils.ACache import io.legado.app.utils.applyTint -import io.legado.app.utils.cnCompare import io.legado.app.utils.dpToPx import io.legado.app.utils.hideSoftInput import io.legado.app.utils.isAbsUrl @@ -47,6 +46,7 @@ import io.legado.app.utils.showHelp import io.legado.app.utils.splitNotBlank import io.legado.app.utils.startActivity import io.legado.app.utils.toastOnUi +import io.legado.app.utils.transaction import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Job @@ -308,11 +308,9 @@ class RssSourceActivity : VMBaseActivity + private fun upGroupMenu() = groupMenu?.transaction { menu -> menu.removeGroup(R.id.source_group) - groups.sortedWith { o1, o2 -> - o1.cnCompare(o2) - }.map { + groups.forEach { menu.add(R.id.source_group, Menu.NONE, Menu.NONE, it) } } 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 2b22fa1e0..b214fbcbc 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 @@ -81,7 +81,7 @@ class RssSourceAdapter(context: Context, val callBack: CallBack) : } else { for (i in payloads.indices) { val bundle = payloads[i] as Bundle - bundle.keySet().map { + bundle.keySet().forEach { when (it) { "upName" -> cbSource.text = item.getDisplayNameGroup() "enabled" -> swtEnabled.isChecked = bundle.getBoolean("enabled") 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 d47c25c85..9b5d70f1f 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 @@ -113,7 +113,7 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application) fun addGroup(group: String) { execute { val sources = appDb.rssSourceDao.noGroup - sources.map { source -> + sources.forEach { source -> source.sourceGroup = group } appDb.rssSourceDao.update(*sources.toTypedArray()) @@ -123,7 +123,7 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application) fun upGroup(oldGroup: String, newGroup: String?) { execute { val sources = appDb.rssSourceDao.getByGroup(oldGroup) - sources.map { source -> + sources.forEach { source -> source.sourceGroup?.splitNotBlank(",")?.toHashSet()?.let { it.remove(oldGroup) if (!newGroup.isNullOrEmpty()) @@ -139,7 +139,7 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application) execute { execute { val sources = appDb.rssSourceDao.getByGroup(group) - sources.map { source -> + sources.forEach { source -> source.sourceGroup?.splitNotBlank(",")?.toHashSet()?.let { it.remove(group) source.sourceGroup = TextUtils.join(",", it) diff --git a/app/src/main/java/io/legado/app/utils/MenuExtensions.kt b/app/src/main/java/io/legado/app/utils/MenuExtensions.kt index 11c0cc559..c922e88da 100644 --- a/app/src/main/java/io/legado/app/utils/MenuExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/MenuExtensions.kt @@ -80,6 +80,17 @@ fun Menu.iconItemOnLongClick(id: Int, function: (view: View) -> Unit) { } } +@SuppressLint("RestrictedApi") +inline fun Menu.transaction(block: (Menu) -> Unit) { + val menuBuilder = this as? MenuBuilder + menuBuilder?.stopDispatchingItemsChanged() + try { + block(this) + } finally { + menuBuilder?.startDispatchingItemsChanged() + } +} + object MenuExtensions { fun getMenuColor(