summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDirk Sierd de Vries <contact@lecapuchon.nl>2026-08-09 21:19:24 +0200
committerDirk Sierd de Vries <contact@lecapuchon.nl>2026-08-09 21:47:25 +0200
commit3c989c6bdf28835355a755ab4ec45be6ca57adf2 (patch)
tree50f3b0715b3c6bfe431c2ab06206c59e91951c6b
parent52930da1bdbd0c51b02c0edca1114af7f680495a (diff)
downloadSidePhOnelauncher-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.kt20
-rw-r--r--app/src/main/java/app/sidephonelauncher/ui/AppDrawerFragment.kt54
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()