diff options
| author | Dirk Sierd de Vries <contact@lecapuchon.nl> | 2026-08-09 21:19:24 +0200 |
|---|---|---|
| committer | Dirk Sierd de Vries <contact@lecapuchon.nl> | 2026-08-09 21:47:25 +0200 |
| commit | 3c989c6bdf28835355a755ab4ec45be6ca57adf2 (patch) | |
| tree | 50f3b0715b3c6bfe431c2ab06206c59e91951c6b | |
| parent | 52930da1bdbd0c51b02c0edca1114af7f680495a (diff) | |
| download | SidePhOnelauncher-3c989c6bdf28835355a755ab4ec45be6ca57adf2.tar.gz SidePhOnelauncher-3c989c6bdf28835355a755ab4ec45be6ca57adf2.tar.bz2 SidePhOnelauncher-3c989c6bdf28835355a755ab4ec45be6ca57adf2.zip | |
Fix app drawer search and D-pad focus handling
| -rw-r--r-- | app/src/main/java/app/sidephonelauncher/ui/AppDrawerAdapter.kt | 20 | ||||
| -rw-r--r-- | app/src/main/java/app/sidephonelauncher/ui/AppDrawerFragment.kt | 54 |
2 files changed, 52 insertions, 22 deletions
diff --git a/app/src/main/java/app/sidephonelauncher/ui/AppDrawerAdapter.kt b/app/src/main/java/app/sidephonelauncher/ui/AppDrawerAdapter.kt index 063b519..ba3138e 100644 --- a/app/src/main/java/app/sidephonelauncher/ui/AppDrawerAdapter.kt +++ b/app/src/main/java/app/sidephonelauncher/ui/AppDrawerAdapter.kt @@ -134,10 +134,13 @@ class AppDrawerAdapter( isBangSearch = charSearch?.startsWith("!") ?: false autoLaunch = allowAutoLaunch && (charSearch?.startsWith(" ")?.not() ?: true) - val appFilteredList = (if (charSearch.isNullOrBlank()) appsList - else appsList.filter { app -> - app !is AppModel.PrivateSpaceHeader && appLabelMatches(app.appLabel, charSearch) - } as MutableList<AppModel>) + val appFilteredList = if (charSearch.isNullOrBlank()) { + appsList.toMutableList() + } else { + appsList.filter { app -> + app !is AppModel.PrivateSpaceHeader && appLabelMatches(app.appLabel, charSearch) + }.toMutableList() + } val filterResults = FilterResults() filterResults.values = appFilteredList @@ -165,6 +168,7 @@ class AppDrawerAdapter( && flag == Constants.FLAG_LAUNCH_APP && appFilteredList.isNotEmpty() && appFilteredList[0] !is AppModel.PrivateSpaceHeader + && appFilteredList[0].appPackage.isNotBlank() ) appClickListener(appFilteredList[0]) } catch (e: Exception) { e.printStackTrace() @@ -198,8 +202,14 @@ class AppDrawerAdapter( submitList(appsList) } + fun hasLaunchableResults(): Boolean { + return appFilteredList.any { it !is AppModel.PrivateSpaceHeader && it.appPackage.isNotBlank() } + } + fun launchFirstInList() { - val first = appFilteredList.firstOrNull { it !is AppModel.PrivateSpaceHeader } + val first = appFilteredList.firstOrNull { + it !is AppModel.PrivateSpaceHeader && it.appPackage.isNotBlank() + } if (first != null) appClickListener(first) } diff --git a/app/src/main/java/app/sidephonelauncher/ui/AppDrawerFragment.kt b/app/src/main/java/app/sidephonelauncher/ui/AppDrawerFragment.kt index a60795c..c665adf 100644 --- a/app/src/main/java/app/sidephonelauncher/ui/AppDrawerFragment.kt +++ b/app/src/main/java/app/sidephonelauncher/ui/AppDrawerFragment.kt @@ -45,7 +45,7 @@ class AppDrawerFragment : Fragment() { private lateinit var prefs: Prefs private lateinit var adapter: AppDrawerAdapter private lateinit var linearLayoutManager: LinearLayoutManager - private var searchTextView: TextView? = null + private var searchTextView: SearchView.SearchAutoComplete? = null private var cachedIsCjkKeyboard: Boolean? = null private var flag = Constants.FLAG_LAUNCH_APP @@ -112,33 +112,34 @@ class AppDrawerFragment : Fragment() { binding.search.setOnKeyListener { _, keyCode, event -> if (event.action != KeyEvent.ACTION_DOWN) return@setOnKeyListener false - if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { - focusFirstLaunchableItem() - } else { - false + when (keyCode) { + KeyEvent.KEYCODE_DPAD_DOWN -> { + focusFirstLaunchableItem() + true + } + KeyEvent.KEYCODE_DPAD_LEFT -> handleSearchLeftKey() + else -> false } } searchTextView?.setOnKeyListener { _, keyCode, event -> if (event.action != KeyEvent.ACTION_DOWN) return@setOnKeyListener false when (keyCode) { - KeyEvent.KEYCODE_DPAD_DOWN -> focusFirstLaunchableItem() - KeyEvent.KEYCODE_DPAD_LEFT -> { - val textView = searchTextView - val selectionStart = textView?.selectionStart ?: -1 - val selectionEnd = textView?.selectionEnd ?: -1 - if (selectionStart <= 0 && selectionEnd <= 0) { - findNavController().popBackStack() - true - } else { - false - } + KeyEvent.KEYCODE_DPAD_DOWN -> { + focusFirstLaunchableItem() + true } + KeyEvent.KEYCODE_DPAD_LEFT -> handleSearchLeftKey() else -> false } } } + private fun handleSearchLeftKey(): Boolean { + findNavController().popBackStack() + return true + } + private fun initViews() { if (flag == Constants.FLAG_HIDDEN_APPS) binding.search.queryHint = getString(R.string.hidden_apps) @@ -162,7 +163,7 @@ class AppDrawerFragment : Fragment() { override fun onQueryTextSubmit(query: String?): Boolean { if (query?.startsWith("!") == true) requireContext().openUrl(Constants.URL_DUCK_SEARCH + query.replace(" ", "%20")) - else if (adapter.itemCount == 0) + else if (!adapter.hasLaunchableResults()) requireContext().openSearch(query?.trim()) else adapter.launchFirstInList() @@ -442,12 +443,31 @@ class AppDrawerFragment : Fragment() { viewModel.checkForMessages.call() } + private fun requestInitialSearchFocus() { + binding.search.post { + binding.search.isIconified = false + binding.search.requestFocus() + searchTextView?.apply { + isFocusable = true + isFocusableInTouchMode = true + requestFocus() + setSelection(text?.length ?: 0) + } + } + } + override fun onStart() { super.onStart() cachedIsCjkKeyboard = null + requestInitialSearchFocus() binding.search.showKeyboard(prefs.autoShowKeyboard) } + override fun onResume() { + super.onResume() + requestInitialSearchFocus() + } + override fun onStop() { binding.search.hideKeyboard() super.onStop() |
