Horis 1 year ago
parent
commit
5fc0d6c028
20 changed files with 81 additions and 75 deletions
  1. 1 1
      app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceAdapter.kt
  2. 3 5
      app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceDialog.kt
  3. 1 1
      app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceAdapter.kt
  4. 3 5
      app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceDialog.kt
  5. 30 27
      app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt
  6. 3 2
      app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt
  7. 1 1
      app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceAdapter.kt
  8. 3 3
      app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt
  9. 1 1
      app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleAdapter.kt
  10. 1 1
      app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleDialog.kt
  11. 1 1
      app/src/main/java/io/legado/app/ui/dict/rule/DictRuleAdapter.kt
  12. 3 5
      app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt
  13. 3 5
      app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt
  14. 5 4
      app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt
  15. 1 1
      app/src/main/java/io/legado/app/ui/replace/ReplaceRuleAdapter.kt
  16. 3 3
      app/src/main/java/io/legado/app/ui/replace/ReplaceRuleViewModel.kt
  17. 3 5
      app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceActivity.kt
  18. 1 1
      app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceAdapter.kt
  19. 3 3
      app/src/main/java/io/legado/app/ui/rss/source/manage/RssSourceViewModel.kt
  20. 11 0
      app/src/main/java/io/legado/app/utils/MenuExtensions.kt

+ 1 - 1
app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceAdapter.kt

@@ -68,7 +68,7 @@ class ChangeBookSourceAdapter(
             } else {
             } else {
                 for (i in payloads.indices) {
                 for (i in payloads.indices) {
                     val bundle = payloads[i] as Bundle
                     val bundle = payloads[i] as Bundle
-                    bundle.keySet().map {
+                    bundle.keySet().forEach {
                         when (it) {
                         when (it) {
                             "name" -> tvOrigin.text = item.originName
                             "name" -> tvOrigin.text = item.originName
                             "latest" -> tvLast.text = item.getDisplayLastChapterTitle()
                             "latest" -> tvLast.text = item.getDisplayLastChapterTitle()

+ 3 - 5
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.ColorUtils
 import io.legado.app.utils.StartActivityContract
 import io.legado.app.utils.StartActivityContract
 import io.legado.app.utils.applyTint
 import io.legado.app.utils.applyTint
-import io.legado.app.utils.cnCompare
 import io.legado.app.utils.dpToPx
 import io.legado.app.utils.dpToPx
 import io.legado.app.utils.getCompatDrawable
 import io.legado.app.utils.getCompatDrawable
 import io.legado.app.utils.observeEvent
 import io.legado.app.utils.observeEvent
 import io.legado.app.utils.setLayout
 import io.legado.app.utils.setLayout
 import io.legado.app.utils.startActivity
 import io.legado.app.utils.startActivity
+import io.legado.app.utils.transaction
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.delay
@@ -407,14 +407,12 @@ class ChangeBookSourceDialog() : BaseDialogFragment(R.layout.dialog_book_change_
      */
      */
     private fun upGroupMenu() {
     private fun upGroupMenu() {
         binding.toolBar.menu.findItem(R.id.menu_group)?.run {
         binding.toolBar.menu.findItem(R.id.menu_group)?.run {
-            subMenu?.let { menu ->
+            subMenu?.transaction { menu ->
                 val selectedGroup = AppConfig.searchGroup
                 val selectedGroup = AppConfig.searchGroup
                 menu.removeGroup(R.id.source_group)
                 menu.removeGroup(R.id.source_group)
                 val allItem = menu.add(R.id.source_group, Menu.NONE, Menu.NONE, R.string.all_source)
                 val allItem = menu.add(R.id.source_group, Menu.NONE, Menu.NONE, R.string.all_source)
                 var hasSelectedGroup = false
                 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 {
                     menu.add(R.id.source_group, Menu.NONE, Menu.NONE, group)?.let {
                         if (group == selectedGroup) {
                         if (group == selectedGroup) {
                             it.isChecked = true
                             it.isChecked = true

+ 1 - 1
app/src/main/java/io/legado/app/ui/book/changesource/ChangeChapterSourceAdapter.kt

@@ -65,7 +65,7 @@ class ChangeChapterSourceAdapter(
             } else {
             } else {
                 for (i in payloads.indices) {
                 for (i in payloads.indices) {
                     val bundle = payloads[i] as Bundle
                     val bundle = payloads[i] as Bundle
-                    bundle.keySet().map {
+                    bundle.keySet().forEach {
                         when (it) {
                         when (it) {
                             "name" -> tvOrigin.text = item.originName
                             "name" -> tvOrigin.text = item.originName
                             "latest" -> tvLast.text = item.getDisplayLastChapterTitle()
                             "latest" -> tvLast.text = item.getDisplayLastChapterTitle()

+ 3 - 5
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.ui.widget.recycler.VerticalDivider
 import io.legado.app.utils.StartActivityContract
 import io.legado.app.utils.StartActivityContract
 import io.legado.app.utils.applyTint
 import io.legado.app.utils.applyTint
-import io.legado.app.utils.cnCompare
 import io.legado.app.utils.dpToPx
 import io.legado.app.utils.dpToPx
 import io.legado.app.utils.gone
 import io.legado.app.utils.gone
 import io.legado.app.utils.observeEvent
 import io.legado.app.utils.observeEvent
 import io.legado.app.utils.setLayout
 import io.legado.app.utils.setLayout
 import io.legado.app.utils.startActivity
 import io.legado.app.utils.startActivity
 import io.legado.app.utils.toastOnUi
 import io.legado.app.utils.toastOnUi
+import io.legado.app.utils.transaction
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import io.legado.app.utils.visible
 import io.legado.app.utils.visible
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Dispatchers.IO
@@ -376,14 +376,12 @@ class ChangeChapterSourceDialog() : BaseDialogFragment(R.layout.dialog_chapter_c
      * 更新分组菜单
      * 更新分组菜单
      */
      */
     private fun upGroupMenu() {
     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
             val selectedGroup = AppConfig.searchGroup
             menu.removeGroup(R.id.source_group)
             menu.removeGroup(R.id.source_group)
             val allItem = menu.add(R.id.source_group, Menu.NONE, Menu.NONE, R.string.all_source)
             val allItem = menu.add(R.id.source_group, Menu.NONE, Menu.NONE, R.string.all_source)
             var hasSelectedGroup = false
             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 {
                 menu.add(R.id.source_group, Menu.NONE, Menu.NONE, group)?.let {
                     if (group == selectedGroup) {
                     if (group == selectedGroup) {
                         it.isChecked = true
                         it.isChecked = true

+ 30 - 27
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.setEdgeEffectColor
 import io.legado.app.utils.showDialogFragment
 import io.legado.app.utils.showDialogFragment
 import io.legado.app.utils.startActivity
 import io.legado.app.utils.startActivity
+import io.legado.app.utils.transaction
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import io.legado.app.utils.visible
 import io.legado.app.utils.visible
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Dispatchers.IO
@@ -109,40 +110,42 @@ class SearchActivity : VMBaseActivity<ActivityBookSearchBinding, SearchViewModel
     }
     }
 
 
     override fun onMenuOpened(featureId: Int, menu: Menu): Boolean {
     override fun onMenuOpened(featureId: Int, menu: Menu): Boolean {
-        menu.removeGroup(R.id.menu_group_1)
-        menu.removeGroup(R.id.menu_group_2)
-        var hasChecked = false
-        val searchScopeNames = viewModel.searchScope.displayNames
-        if (viewModel.searchScope.isSource()) {
-            menu.add(R.id.menu_group_1, Menu.NONE, Menu.NONE, searchScopeNames.first()).apply {
-                isChecked = true
-                hasChecked = true
+        menu.transaction {
+            menu.removeGroup(R.id.menu_group_1)
+            menu.removeGroup(R.id.menu_group_2)
+            var hasChecked = false
+            val searchScopeNames = viewModel.searchScope.displayNames
+            if (viewModel.searchScope.isSource()) {
+                menu.add(R.id.menu_group_1, Menu.NONE, Menu.NONE, searchScopeNames.first()).apply {
+                    isChecked = true
+                    hasChecked = true
+                }
             }
             }
-        }
-        val allSourceMenu =
-            menu.add(R.id.menu_group_2, R.id.menu_1, Menu.NONE, getString(R.string.all_source))
-                .apply {
-                    if (searchScopeNames.isEmpty()) {
+            val allSourceMenu =
+                menu.add(R.id.menu_group_2, R.id.menu_1, Menu.NONE, getString(R.string.all_source))
+                    .apply {
+                        if (searchScopeNames.isEmpty()) {
+                            isChecked = true
+                            hasChecked = true
+                        }
+                    }
+            groups?.forEach {
+                if (searchScopeNames.contains(it)) {
+                    menu.add(R.id.menu_group_1, Menu.NONE, Menu.NONE, it).apply {
                         isChecked = true
                         isChecked = true
                         hasChecked = true
                         hasChecked = true
                     }
                     }
+                } else {
+                    menu.add(R.id.menu_group_2, Menu.NONE, Menu.NONE, it)
                 }
                 }
-        groups?.forEach {
-            if (searchScopeNames.contains(it)) {
-                menu.add(R.id.menu_group_1, Menu.NONE, Menu.NONE, it).apply {
-                    isChecked = true
-                    hasChecked = true
-                }
-            } else {
-                menu.add(R.id.menu_group_2, Menu.NONE, Menu.NONE, it)
             }
             }
+            if (!hasChecked) {
+                viewModel.searchScope.update("")
+                allSourceMenu.isChecked = true
+            }
+            menu.setGroupCheckable(R.id.menu_group_1, true, false)
+            menu.setGroupCheckable(R.id.menu_group_2, true, true)
         }
         }
-        if (!hasChecked) {
-            viewModel.searchScope.update("")
-            allSourceMenu.isChecked = true
-        }
-        menu.setGroupCheckable(R.id.menu_group_1, true, false)
-        menu.setGroupCheckable(R.id.menu_group_2, true, true)
         return super.onMenuOpened(featureId, menu)
         return super.onMenuOpened(featureId, menu)
     }
     }
 
 

+ 3 - 2
app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt

@@ -67,6 +67,7 @@ import io.legado.app.utils.showHelp
 import io.legado.app.utils.splitNotBlank
 import io.legado.app.utils.splitNotBlank
 import io.legado.app.utils.startActivity
 import io.legado.app.utils.startActivity
 import io.legado.app.utils.toastOnUi
 import io.legado.app.utils.toastOnUi
+import io.legado.app.utils.transaction
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.Job
@@ -590,7 +591,7 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
         }
         }
     }
     }
 
 
-    private fun upGroupMenu() = groupMenu?.let { menu ->
+    private fun upGroupMenu() = groupMenu?.transaction { menu ->
         menu.removeGroup(R.id.source_group)
         menu.removeGroup(R.id.source_group)
         groups.forEach {
         groups.forEach {
             menu.add(R.id.source_group, Menu.NONE, Menu.NONE, it)
             menu.add(R.id.source_group, Menu.NONE, Menu.NONE, it)
@@ -648,7 +649,7 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
                 adapter.itemCount,
                 adapter.itemCount,
                 bundleOf(Pair("checkSourceMessage", null))
                 bundleOf(Pair("checkSourceMessage", null))
             )
             )
-            groups.map { group ->
+            groups.forEach { group ->
                 if (group.contains("失效") && searchView.query.isEmpty()) {
                 if (group.contains("失效") && searchView.query.isEmpty()) {
                     searchView.setQuery("失效", true)
                     searchView.setQuery("失效", true)
                     toastOnUi("发现有失效书源,已为您自动筛选!")
                     toastOnUi("发现有失效书源,已为您自动筛选!")

+ 1 - 1
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 {
             } else {
                 for (i in payloads.indices) {
                 for (i in payloads.indices) {
                     val bundle = payloads[i] as Bundle
                     val bundle = payloads[i] as Bundle
-                    bundle.keySet().map {
+                    bundle.keySet().forEach {
                         when (it) {
                         when (it) {
                             "enabled" -> swtEnabled.isChecked = bundle.getBoolean("enabled")
                             "enabled" -> swtEnabled.isChecked = bundle.getBoolean("enabled")
                             "upName" -> cbBookSource.text = item.getDisPlayNameGroup()
                             "upName" -> cbBookSource.text = item.getDisPlayNameGroup()

+ 3 - 3
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) {
     fun addGroup(group: String) {
         execute {
         execute {
             val sources = appDb.bookSourceDao.noGroup
             val sources = appDb.bookSourceDao.noGroup
-            sources.map { source ->
+            sources.forEach { source ->
                 source.bookSourceGroup = group
                 source.bookSourceGroup = group
             }
             }
             appDb.bookSourceDao.update(*sources.toTypedArray())
             appDb.bookSourceDao.update(*sources.toTypedArray())
@@ -264,7 +264,7 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application)
     fun upGroup(oldGroup: String, newGroup: String?) {
     fun upGroup(oldGroup: String, newGroup: String?) {
         execute {
         execute {
             val sources = appDb.bookSourceDao.getByGroup(oldGroup)
             val sources = appDb.bookSourceDao.getByGroup(oldGroup)
-            sources.map { source ->
+            sources.forEach { source ->
                 source.bookSourceGroup?.splitNotBlank(",")?.toHashSet()?.let {
                 source.bookSourceGroup?.splitNotBlank(",")?.toHashSet()?.let {
                     it.remove(oldGroup)
                     it.remove(oldGroup)
                     if (!newGroup.isNullOrEmpty())
                     if (!newGroup.isNullOrEmpty())
@@ -280,7 +280,7 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application)
         execute {
         execute {
             execute {
             execute {
                 val sources = appDb.bookSourceDao.getByGroup(group)
                 val sources = appDb.bookSourceDao.getByGroup(group)
-                sources.map { source ->
+                sources.forEach { source ->
                     source.removeGroup(group)
                     source.removeGroup(group)
                 }
                 }
                 appDb.bookSourceDao.update(*sources.toTypedArray())
                 appDb.bookSourceDao.update(*sources.toTypedArray())

+ 1 - 1
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 {
             } else {
                 for (i in payloads.indices) {
                 for (i in payloads.indices) {
                     val bundle = payloads[i] as Bundle
                     val bundle = payloads[i] as Bundle
-                    bundle.keySet().map {
+                    bundle.keySet().forEach {
                         when (it) {
                         when (it) {
                             "selected" -> cbSource.isChecked = selected.contains(item)
                             "selected" -> cbSource.isChecked = selected.contains(item)
                             "upName" -> cbSource.text = item.name
                             "upName" -> cbSource.text = item.name

+ 1 - 1
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 {
                 } else {
                     for (i in payloads.indices) {
                     for (i in payloads.indices) {
                         val bundle = payloads[i] as Bundle
                         val bundle = payloads[i] as Bundle
-                        bundle.keySet().map {
+                        bundle.keySet().forEach {
                             when (it) {
                             when (it) {
                                 "upName" -> rbRegexName.text = item.name
                                 "upName" -> rbRegexName.text = item.name
                                 "upExample" -> titleExample.text = item.example
                                 "upExample" -> titleExample.text = item.example

+ 1 - 1
app/src/main/java/io/legado/app/ui/dict/rule/DictRuleAdapter.kt

@@ -103,7 +103,7 @@ class DictRuleAdapter(context: Context, var callBack: CallBack) :
             } else {
             } else {
                 for (i in payloads.indices) {
                 for (i in payloads.indices) {
                     val bundle = payloads[i] as Bundle
                     val bundle = payloads[i] as Bundle
-                    bundle.keySet().map {
+                    bundle.keySet().forEach {
                         when (it) {
                         when (it) {
                             "selected" -> cbName.isChecked = selected.contains(item)
                             "selected" -> cbName.isChecked = selected.contains(item)
                             "upName" -> cbName.text = item.name
                             "upName" -> cbName.text = item.name

+ 3 - 5
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.book.source.edit.BookSourceEditActivity
 import io.legado.app.ui.main.MainFragmentInterface
 import io.legado.app.ui.main.MainFragmentInterface
 import io.legado.app.utils.applyTint
 import io.legado.app.utils.applyTint
-import io.legado.app.utils.cnCompare
 import io.legado.app.utils.flowWithLifecycleAndDatabaseChange
 import io.legado.app.utils.flowWithLifecycleAndDatabaseChange
 import io.legado.app.utils.setEdgeEffectColor
 import io.legado.app.utils.setEdgeEffectColor
 import io.legado.app.utils.startActivity
 import io.legado.app.utils.startActivity
+import io.legado.app.utils.transaction
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Dispatchers.IO
@@ -171,11 +171,9 @@ class ExploreFragment() : VMBaseFragment<ExploreViewModel>(R.layout.fragment_exp
         }
         }
     }
     }
 
 
-    private fun upGroupsMenu() = groupsMenu?.let { subMenu ->
+    private fun upGroupsMenu() = groupsMenu?.transaction { subMenu ->
         subMenu.removeGroup(R.id.menu_group_text)
         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)
             subMenu.add(R.id.menu_group_text, Menu.NONE, Menu.NONE, it)
         }
         }
     }
     }

+ 3 - 5
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.source.manage.RssSourceActivity
 import io.legado.app.ui.rss.subscription.RuleSubActivity
 import io.legado.app.ui.rss.subscription.RuleSubActivity
 import io.legado.app.utils.applyTint
 import io.legado.app.utils.applyTint
-import io.legado.app.utils.cnCompare
 import io.legado.app.utils.flowWithLifecycleAndDatabaseChange
 import io.legado.app.utils.flowWithLifecycleAndDatabaseChange
 import io.legado.app.utils.openUrl
 import io.legado.app.utils.openUrl
 import io.legado.app.utils.setEdgeEffectColor
 import io.legado.app.utils.setEdgeEffectColor
 import io.legado.app.utils.startActivity
 import io.legado.app.utils.startActivity
+import io.legado.app.utils.transaction
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.Job
@@ -100,11 +100,9 @@ class RssFragment() : VMBaseFragment<RssViewModel>(R.layout.fragment_rss),
         searchView.clearFocus()
         searchView.clearFocus()
     }
     }
 
 
-    private fun upGroupsMenu() = groupsMenu?.let { subMenu ->
+    private fun upGroupsMenu() = groupsMenu?.transaction { subMenu ->
         subMenu.removeGroup(R.id.menu_group_text)
         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)
             subMenu.add(R.id.menu_group_text, Menu.NONE, Menu.NONE, it)
         }
         }
     }
     }

+ 5 - 4
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.showHelp
 import io.legado.app.utils.splitNotBlank
 import io.legado.app.utils.splitNotBlank
 import io.legado.app.utils.toastOnUi
 import io.legado.app.utils.toastOnUi
+import io.legado.app.utils.transaction
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.Job
@@ -282,10 +283,10 @@ class ReplaceRuleActivity : VMBaseActivity<ActivityReplaceRuleBinding, ReplaceRu
         return false
         return false
     }
     }
 
 
-    private fun upGroupMenu() {
-        groupMenu?.removeGroup(R.id.replace_group)
-        groups.map {
-            groupMenu?.add(R.id.replace_group, Menu.NONE, Menu.NONE, it)
+    private fun upGroupMenu() = groupMenu?.transaction { menu ->
+        menu.removeGroup(R.id.replace_group)
+        groups.forEach {
+            menu.add(R.id.replace_group, Menu.NONE, Menu.NONE, it)
         }
         }
     }
     }
 
 

+ 1 - 1
app/src/main/java/io/legado/app/ui/replace/ReplaceRuleAdapter.kt

@@ -111,7 +111,7 @@ class ReplaceRuleAdapter(context: Context, var callBack: CallBack) :
             } else {
             } else {
                 for (i in payloads.indices) {
                 for (i in payloads.indices) {
                     val bundle = payloads[i] as Bundle
                     val bundle = payloads[i] as Bundle
-                    bundle.keySet().map {
+                    bundle.keySet().forEach {
                         when (it) {
                         when (it) {
                             "selected" -> cbName.isChecked = selected.contains(item)
                             "selected" -> cbName.isChecked = selected.contains(item)
                             "upName" -> cbName.text = item.getDisplayNameGroup()
                             "upName" -> cbName.text = item.getDisplayNameGroup()

+ 3 - 3
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) {
     fun addGroup(group: String) {
         execute {
         execute {
             val sources = appDb.replaceRuleDao.noGroup
             val sources = appDb.replaceRuleDao.noGroup
-            sources.map { source ->
+            sources.forEach { source ->
                 source.group = group
                 source.group = group
             }
             }
             appDb.replaceRuleDao.update(*sources.toTypedArray())
             appDb.replaceRuleDao.update(*sources.toTypedArray())
@@ -106,7 +106,7 @@ class ReplaceRuleViewModel(application: Application) : BaseViewModel(application
     fun upGroup(oldGroup: String, newGroup: String?) {
     fun upGroup(oldGroup: String, newGroup: String?) {
         execute {
         execute {
             val sources = appDb.replaceRuleDao.getByGroup(oldGroup)
             val sources = appDb.replaceRuleDao.getByGroup(oldGroup)
-            sources.map { source ->
+            sources.forEach { source ->
                 source.group?.splitNotBlank(",")?.toHashSet()?.let {
                 source.group?.splitNotBlank(",")?.toHashSet()?.let {
                     it.remove(oldGroup)
                     it.remove(oldGroup)
                     if (!newGroup.isNullOrEmpty())
                     if (!newGroup.isNullOrEmpty())
@@ -122,7 +122,7 @@ class ReplaceRuleViewModel(application: Application) : BaseViewModel(application
         execute {
         execute {
             execute {
             execute {
                 val sources = appDb.replaceRuleDao.getByGroup(group)
                 val sources = appDb.replaceRuleDao.getByGroup(group)
-                sources.map { source ->
+                sources.forEach { source ->
                     source.group?.splitNotBlank(",")?.toHashSet()?.let {
                     source.group?.splitNotBlank(",")?.toHashSet()?.let {
                         it.remove(group)
                         it.remove(group)
                         source.group = TextUtils.join(",", it)
                         source.group = TextUtils.join(",", it)

+ 3 - 5
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.ui.widget.recycler.VerticalDivider
 import io.legado.app.utils.ACache
 import io.legado.app.utils.ACache
 import io.legado.app.utils.applyTint
 import io.legado.app.utils.applyTint
-import io.legado.app.utils.cnCompare
 import io.legado.app.utils.dpToPx
 import io.legado.app.utils.dpToPx
 import io.legado.app.utils.hideSoftInput
 import io.legado.app.utils.hideSoftInput
 import io.legado.app.utils.isAbsUrl
 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.splitNotBlank
 import io.legado.app.utils.startActivity
 import io.legado.app.utils.startActivity
 import io.legado.app.utils.toastOnUi
 import io.legado.app.utils.toastOnUi
+import io.legado.app.utils.transaction
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.Job
@@ -308,11 +308,9 @@ class RssSourceActivity : VMBaseActivity<ActivityRssSourceBinding, RssSourceView
         }
         }
     }
     }
 
 
-    private fun upGroupMenu() = groupMenu?.let { menu ->
+    private fun upGroupMenu() = groupMenu?.transaction { menu ->
         menu.removeGroup(R.id.source_group)
         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)
             menu.add(R.id.source_group, Menu.NONE, Menu.NONE, it)
         }
         }
     }
     }

+ 1 - 1
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 {
             } else {
                 for (i in payloads.indices) {
                 for (i in payloads.indices) {
                     val bundle = payloads[i] as Bundle
                     val bundle = payloads[i] as Bundle
-                    bundle.keySet().map {
+                    bundle.keySet().forEach {
                         when (it) {
                         when (it) {
                             "upName" -> cbSource.text = item.getDisplayNameGroup()
                             "upName" -> cbSource.text = item.getDisplayNameGroup()
                             "enabled" -> swtEnabled.isChecked = bundle.getBoolean("enabled")
                             "enabled" -> swtEnabled.isChecked = bundle.getBoolean("enabled")

+ 3 - 3
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) {
     fun addGroup(group: String) {
         execute {
         execute {
             val sources = appDb.rssSourceDao.noGroup
             val sources = appDb.rssSourceDao.noGroup
-            sources.map { source ->
+            sources.forEach { source ->
                 source.sourceGroup = group
                 source.sourceGroup = group
             }
             }
             appDb.rssSourceDao.update(*sources.toTypedArray())
             appDb.rssSourceDao.update(*sources.toTypedArray())
@@ -123,7 +123,7 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application)
     fun upGroup(oldGroup: String, newGroup: String?) {
     fun upGroup(oldGroup: String, newGroup: String?) {
         execute {
         execute {
             val sources = appDb.rssSourceDao.getByGroup(oldGroup)
             val sources = appDb.rssSourceDao.getByGroup(oldGroup)
-            sources.map { source ->
+            sources.forEach { source ->
                 source.sourceGroup?.splitNotBlank(",")?.toHashSet()?.let {
                 source.sourceGroup?.splitNotBlank(",")?.toHashSet()?.let {
                     it.remove(oldGroup)
                     it.remove(oldGroup)
                     if (!newGroup.isNullOrEmpty())
                     if (!newGroup.isNullOrEmpty())
@@ -139,7 +139,7 @@ class RssSourceViewModel(application: Application) : BaseViewModel(application)
         execute {
         execute {
             execute {
             execute {
                 val sources = appDb.rssSourceDao.getByGroup(group)
                 val sources = appDb.rssSourceDao.getByGroup(group)
-                sources.map { source ->
+                sources.forEach { source ->
                     source.sourceGroup?.splitNotBlank(",")?.toHashSet()?.let {
                     source.sourceGroup?.splitNotBlank(",")?.toHashSet()?.let {
                         it.remove(group)
                         it.remove(group)
                         source.sourceGroup = TextUtils.join(",", it)
                         source.sourceGroup = TextUtils.join(",", it)

+ 11 - 0
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 {
 object MenuExtensions {
 
 
     fun getMenuColor(
     fun getMenuColor(