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" />
+