mirror of
https://github.com/gedoor/legado.git
synced 2025-08-10 00:52:30 +00:00
优化
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<ActivityBookSearchBinding, SearchViewModel
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
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 {
|
||||
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
|
||||
}
|
||||
} else {
|
||||
menu.add(R.id.menu_group_2, Menu.NONE, Menu.NONE, it)
|
||||
}
|
||||
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
|
||||
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)
|
||||
}
|
||||
|
||||
|
||||
@@ -67,6 +67,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
|
||||
@@ -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)
|
||||
groups.forEach {
|
||||
menu.add(R.id.source_group, Menu.NONE, Menu.NONE, it)
|
||||
@@ -648,7 +649,7 @@ class BookSourceActivity : VMBaseActivity<ActivityBookSourceBinding, BookSourceV
|
||||
adapter.itemCount,
|
||||
bundleOf(Pair("checkSourceMessage", null))
|
||||
)
|
||||
groups.map { group ->
|
||||
groups.forEach { group ->
|
||||
if (group.contains("失效") && searchView.query.isEmpty()) {
|
||||
searchView.setQuery("失效", true)
|
||||
toastOnUi("发现有失效书源,已为您自动筛选!")
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<ExploreViewModel>(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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<RssViewModel>(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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<ActivityReplaceRuleBinding, ReplaceRu
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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<ActivityRssSourceBinding, RssSourceView
|
||||
}
|
||||
}
|
||||
|
||||
private fun upGroupMenu() = groupMenu?.let { menu ->
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user