From 7f6a526b25ff46ed855c0c432aba185f6fece15c Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Wed, 14 Aug 2024 10:46:42 +0800 Subject: [PATCH] Add profile filtering https://github.com/2dust/v2rayNG/issues/3471 --- .../kotlin/com/v2ray/ang/ui/MainActivity.kt | 21 ++++++++++++++++++- .../com/v2ray/ang/viewmodel/MainViewModel.kt | 13 +++++++++--- V2rayNG/app/src/main/res/menu/menu_main.xml | 6 ++++++ 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt index 25c7784b..d12c9cf1 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt @@ -18,6 +18,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.appcompat.app.ActionBarDrawerToggle import androidx.appcompat.app.AlertDialog +import androidx.appcompat.widget.SearchView import androidx.core.content.ContextCompat import androidx.core.view.GravityCompat import androidx.core.view.isVisible @@ -232,7 +233,25 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_main, menu) - return true + + val searchItem = menu.findItem(R.id.search_view) + if (searchItem != null) { + val searchView = searchItem.actionView as SearchView + searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String?): Boolean { + mainViewModel.filterConfig(query.orEmpty()) + return false + } + + override fun onQueryTextChange(newText: String?): Boolean = false + }) + + searchView.setOnCloseListener { + mainViewModel.filterConfig("") + false + } + } + return super.onCreateOptionsMenu(menu) } override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt index 04bd836b..284d3582 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt @@ -61,7 +61,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { var serverList = MmkvManager.decodeServerList() var subscriptionId: String = settingsStorage.decodeString(AppConfig.CACHE_SUBSCRIPTION_ID, "")?:"" - //var keywordFilter: String = settingsStorage.decodeString(AppConfig.CACHE_KEYWORD_FILTER, "")?:"" + var keywordFilter: String = settingsStorage.decodeString(AppConfig.CACHE_KEYWORD_FILTER, "")?:"" private set val serversCache = mutableListOf() val isRunning by lazy { MutableLiveData() } @@ -166,8 +166,9 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { continue } -// if (keywordFilter.isEmpty() || config.remarks.contains(keywordFilter)) { - serversCache.add(ServersCache(guid, profile)) + if (keywordFilter.isEmpty() || profile.remarks.contains(keywordFilter)) { + serversCache.add(ServersCache(guid, profile)) + } } } @@ -382,6 +383,12 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { } } + fun filterConfig(keyword: String) { + keywordFilter = keyword + settingsStorage.encode(AppConfig.CACHE_KEYWORD_FILTER, keywordFilter) + reloadServerList() + } + private val mMsgReceiver = object : BroadcastReceiver() { override fun onReceive(ctx: Context?, intent: Intent?) { when (intent?.getIntExtra("key", 0)) { diff --git a/V2rayNG/app/src/main/res/menu/menu_main.xml b/V2rayNG/app/src/main/res/menu/menu_main.xml index 0db24869..8edaf8a1 100644 --- a/V2rayNG/app/src/main/res/menu/menu_main.xml +++ b/V2rayNG/app/src/main/res/menu/menu_main.xml @@ -1,6 +1,12 @@ +