From 50746bac8d004feed8d04b93bc335b89c17dda42 Mon Sep 17 00:00:00 2001 From: Alraj Kabeer Date: Mon, 18 Nov 2024 11:28:15 +0530 Subject: [PATCH] add simple fuzzy search --- .../java/eu/ottop/yamlauncher/MainActivity.kt | 13 ++++++++++++- .../yamlauncher/settings/GestureAppsFragment.kt | 11 ++++++++++- .../yamlauncher/settings/HiddenAppsFragment.kt | 11 ++++++++++- .../settings/SharedPreferenceManager.kt | 4 ++++ .../eu/ottop/yamlauncher/utils/StringUtils.kt | 15 +++++++++++++++ app/src/main/res/values-fi/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/app_menu_preferences.xml | 7 +++++++ 8 files changed, 60 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt b/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt index 78070aa..b93763a 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/MainActivity.kt @@ -955,6 +955,14 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh updateMenu(updatedApps) } else { isJobActive = false + + val fuzzyPattern = if(sharedPreferenceManager.isFuzzySearchEnabled()) { + stringUtils.getFuzzyPattern(cleanQuery) + } + else { + null + } + updatedApps.forEach { val cleanItemText = stringUtils.cleanString(sharedPreferenceManager.getAppName( it.first.applicationInfo.packageName, @@ -962,7 +970,10 @@ class MainActivity : AppCompatActivity(), SharedPreferences.OnSharedPreferenceCh packageManager.getApplicationLabel(it.first.applicationInfo) ).toString()) if (cleanItemText != null) { - if (cleanItemText.contains(cleanQuery, ignoreCase = true)) { + if ( + (fuzzyPattern != null && cleanItemText.contains(fuzzyPattern)) || + (cleanItemText.contains(cleanQuery, ignoreCase = true)) + ) { newFilteredApps.add(it) } } diff --git a/app/src/main/java/eu/ottop/yamlauncher/settings/GestureAppsFragment.kt b/app/src/main/java/eu/ottop/yamlauncher/settings/GestureAppsFragment.kt index 7e31329..0facebe 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/settings/GestureAppsFragment.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/settings/GestureAppsFragment.kt @@ -114,6 +114,12 @@ class GestureAppsFragment(private val direction: String) : Fragment(), if (cleanQuery.isNullOrEmpty()) { newFilteredApps.addAll(updatedApps) } else { + val fuzzyPattern = if(sharedPreferenceManager.isFuzzySearchEnabled()) { + stringUtils.getFuzzyPattern(cleanQuery) + } + else { + null + } updatedApps.forEach { val cleanItemText = stringUtils.cleanString(sharedPreferenceManager.getAppName( it.first.applicationInfo.packageName, @@ -121,7 +127,10 @@ class GestureAppsFragment(private val direction: String) : Fragment(), requireContext().packageManager.getApplicationLabel(it.first.applicationInfo) ).toString()) if (cleanItemText != null) { - if (cleanItemText.contains(cleanQuery, ignoreCase = true)) { + if ( + (fuzzyPattern != null && cleanItemText.contains(fuzzyPattern)) || + (cleanItemText.contains(cleanQuery, ignoreCase = true)) + ) { newFilteredApps.add(it) } } diff --git a/app/src/main/java/eu/ottop/yamlauncher/settings/HiddenAppsFragment.kt b/app/src/main/java/eu/ottop/yamlauncher/settings/HiddenAppsFragment.kt index 4d83fea..ecd6860 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/settings/HiddenAppsFragment.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/settings/HiddenAppsFragment.kt @@ -114,6 +114,12 @@ class HiddenAppsFragment : Fragment(), HiddenAppsAdapter.OnItemClickListener, Ti if (cleanQuery.isNullOrEmpty()) { newFilteredApps.addAll(updatedApps) } else { + val fuzzyPattern = if(sharedPreferenceManager.isFuzzySearchEnabled()) { + stringUtils.getFuzzyPattern(cleanQuery) + } + else { + null + } updatedApps.forEach { val cleanItemText = stringUtils.cleanString(sharedPreferenceManager.getAppName( it.first.applicationInfo.packageName, @@ -121,7 +127,10 @@ class HiddenAppsFragment : Fragment(), HiddenAppsAdapter.OnItemClickListener, Ti requireContext().packageManager.getApplicationLabel(it.first.applicationInfo) ).toString()) if (cleanItemText != null) { - if (cleanItemText.contains(cleanQuery, ignoreCase = true)) { + if ( + (fuzzyPattern != null && cleanItemText.contains(fuzzyPattern)) || + (cleanItemText.contains(cleanQuery, ignoreCase = true)) + ) { newFilteredApps.add(it) } } diff --git a/app/src/main/java/eu/ottop/yamlauncher/settings/SharedPreferenceManager.kt b/app/src/main/java/eu/ottop/yamlauncher/settings/SharedPreferenceManager.kt index 5977649..401d95a 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/settings/SharedPreferenceManager.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/settings/SharedPreferenceManager.kt @@ -211,6 +211,10 @@ class SharedPreferenceManager (private val context: Context) { return preferences.getString("searchSize", "medium") } + fun isFuzzySearchEnabled(): Boolean { + return preferences.getBoolean("fuzzySearchEnabled", false) + } + fun getAppSpacing(): Int? { return preferences.getString("appSpacing", "20")?.toInt() } diff --git a/app/src/main/java/eu/ottop/yamlauncher/utils/StringUtils.kt b/app/src/main/java/eu/ottop/yamlauncher/utils/StringUtils.kt index deabf24..33dc405 100644 --- a/app/src/main/java/eu/ottop/yamlauncher/utils/StringUtils.kt +++ b/app/src/main/java/eu/ottop/yamlauncher/utils/StringUtils.kt @@ -23,4 +23,19 @@ class StringUtils { view.movementMethod = LinkMovementMethod.getInstance() } + /** Create a Regex pattern for simple Fuzzy search + * + * Example: + * 'cl' will create 'c.*l' which matches 'Clock', 'Calendar' + * 'msg' will create 'm.*s.*g' which matches 'Messages' + * 'cmr' will create 'c.*m.*r' which matches 'Camera' + */ + fun getFuzzyPattern(query: String): Regex { + val pattern = query + .flatMap { char -> listOf(char.toString(), ".*") } + // remove the last unnecessary .* since the char itself is sufficient + .dropLast(1) + .joinToString(separator = "") + return Regex(pattern, RegexOption.IGNORE_CASE) + } } \ No newline at end of file diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index dc80817..f7afb31 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -124,6 +124,7 @@ Näytä Hakupalkki Hakupalkin Sijainti Hakupalkin Koko + Ota sumea haku käyttöön Avaa Näppäimistö Automaattisesti Avaa Hakutulos Automaattisesti Avaa sovellus automaattisesti kun se on viimeinen hakutulos diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5e6fb81..8c71ae3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -126,6 +126,7 @@ Enable Search Search Alignment Search Size + Enable Fuzzy Search Automatically Open Keyboard Automatic App Opening Automatically launch an app when it\'s the last search result diff --git a/app/src/main/res/xml/app_menu_preferences.xml b/app/src/main/res/xml/app_menu_preferences.xml index f88b5ca..aba3536 100644 --- a/app/src/main/res/xml/app_menu_preferences.xml +++ b/app/src/main/res/xml/app_menu_preferences.xml @@ -70,6 +70,13 @@ app:key="searchSize" app:title="@string/search_size" app:useSimpleSummaryProvider="true" /> +