Skip to content

Commit cde2a5f

Browse files
committed
Add search tool for profiles
1 parent 49f3891 commit cde2a5f

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

mobile/src/main/java/com/github/shadowsocks/ProfilesFragment.kt

+24-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import android.widget.ImageView
3737
import android.widget.TextView
3838
import androidx.activity.result.ActivityResultLauncher
3939
import androidx.appcompat.widget.PopupMenu
40+
import androidx.appcompat.widget.SearchView
4041
import androidx.appcompat.widget.Toolbar
4142
import androidx.appcompat.widget.TooltipCompat
4243
import androidx.core.os.bundleOf
@@ -64,7 +65,7 @@ import com.google.zxing.WriterException
6465
import timber.log.Timber
6566
import java.nio.charset.StandardCharsets
6667

67-
class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener {
68+
class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener, SearchView.OnQueryTextListener {
6869
companion object {
6970
/**
7071
* used for callback from stateChanged from MainActivity
@@ -237,6 +238,17 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener {
237238
notifyItemInserted(pos)
238239
}
239240

241+
fun filter(name: String) {
242+
val active = ProfileManager.getActiveProfiles()?.toMutableList() ?: mutableListOf()
243+
profiles.clear()
244+
active.forEach {
245+
if (it.name?.contains(name, true) ?: false || it.host.contains(name, true)) {
246+
profiles.add(it)
247+
}
248+
}
249+
notifyDataSetChanged()
250+
}
251+
240252
fun move(from: Int, to: Int) {
241253
undoManager.flush()
242254
val first = profiles[from]
@@ -322,6 +334,13 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener {
322334
startActivity(Intent(context, ProfileConfigActivity::class.java).putExtra(Action.EXTRA_PROFILE_ID, profile.id))
323335
}
324336

337+
override fun onQueryTextChange(query: String): Boolean {
338+
profilesAdapter.filter(query)
339+
return false
340+
}
341+
342+
override fun onQueryTextSubmit(query: String): Boolean = false
343+
325344
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
326345
inflater.inflate(R.layout.layout_list, container, false)
327346

@@ -331,6 +350,10 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener {
331350
toolbar.setTitle(R.string.profiles)
332351
toolbar.inflateMenu(R.menu.profile_manager_menu)
333352
toolbar.setOnMenuItemClickListener(this)
353+
val searchView = toolbar.findViewById<SearchView>(R.id.action_search)
354+
searchView.setOnQueryTextListener(this)
355+
searchView.setQueryHint(getString(android.R.string.search_go))
356+
334357
ProfileManager.ensureNotEmpty()
335358
profilesList = view.findViewById(R.id.list)
336359
ViewCompat.setOnApplyWindowInsetsListener(profilesList, MainListListener)

mobile/src/main/res/menu/profile_manager_menu.xml

+4
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,8 @@
4747
app:alphabeticModifiers="CTRL|SHIFT"/>
4848
</menu>
4949
</item>
50+
<item android:id="@+id/action_search"
51+
android:title="@android:string/search_go"
52+
app:actionViewClass="androidx.appcompat.widget.SearchView"
53+
app:showAsAction="always"/>
5054
</menu>

0 commit comments

Comments
 (0)