From cde2a5fb65efc64e1d16580170a7efb3078f063f Mon Sep 17 00:00:00 2001 From: Max Lv Date: Thu, 25 Feb 2021 10:32:38 +0800 Subject: [PATCH] Add search tool for profiles --- .../github/shadowsocks/ProfilesFragment.kt | 25 ++++++++++++++++++- .../main/res/menu/profile_manager_menu.xml | 4 +++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/mobile/src/main/java/com/github/shadowsocks/ProfilesFragment.kt b/mobile/src/main/java/com/github/shadowsocks/ProfilesFragment.kt index a1e1ab3202..af1a0d858e 100644 --- a/mobile/src/main/java/com/github/shadowsocks/ProfilesFragment.kt +++ b/mobile/src/main/java/com/github/shadowsocks/ProfilesFragment.kt @@ -37,6 +37,7 @@ import android.widget.ImageView import android.widget.TextView import androidx.activity.result.ActivityResultLauncher import androidx.appcompat.widget.PopupMenu +import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.TooltipCompat import androidx.core.os.bundleOf @@ -64,7 +65,7 @@ import com.google.zxing.WriterException import timber.log.Timber import java.nio.charset.StandardCharsets -class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener { +class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener, SearchView.OnQueryTextListener { companion object { /** * used for callback from stateChanged from MainActivity @@ -237,6 +238,17 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener { notifyItemInserted(pos) } + fun filter(name: String) { + val active = ProfileManager.getActiveProfiles()?.toMutableList() ?: mutableListOf() + profiles.clear() + active.forEach { + if (it.name?.contains(name, true) ?: false || it.host.contains(name, true)) { + profiles.add(it) + } + } + notifyDataSetChanged() + } + fun move(from: Int, to: Int) { undoManager.flush() val first = profiles[from] @@ -322,6 +334,13 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener { startActivity(Intent(context, ProfileConfigActivity::class.java).putExtra(Action.EXTRA_PROFILE_ID, profile.id)) } + override fun onQueryTextChange(query: String): Boolean { + profilesAdapter.filter(query) + return false + } + + override fun onQueryTextSubmit(query: String): Boolean = false + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = inflater.inflate(R.layout.layout_list, container, false) @@ -331,6 +350,10 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener { toolbar.setTitle(R.string.profiles) toolbar.inflateMenu(R.menu.profile_manager_menu) toolbar.setOnMenuItemClickListener(this) + val searchView = toolbar.findViewById(R.id.action_search) + searchView.setOnQueryTextListener(this) + searchView.setQueryHint(getString(android.R.string.search_go)) + ProfileManager.ensureNotEmpty() profilesList = view.findViewById(R.id.list) ViewCompat.setOnApplyWindowInsetsListener(profilesList, MainListListener) diff --git a/mobile/src/main/res/menu/profile_manager_menu.xml b/mobile/src/main/res/menu/profile_manager_menu.xml index 625199187b..11d7ec30b5 100644 --- a/mobile/src/main/res/menu/profile_manager_menu.xml +++ b/mobile/src/main/res/menu/profile_manager_menu.xml @@ -47,4 +47,8 @@ app:alphabeticModifiers="CTRL|SHIFT"/> +