From 05f64ea238027b24ff4075d97e15d9487816f067 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sat, 19 Feb 2022 21:08:26 +0100 Subject: [PATCH] Fuzzy match search queries in app search --- applications/build.gradle.kts | 2 ++ .../de/mm20/launcher2/applications/AppRepository.kt | 13 +++++-------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/applications/build.gradle.kts b/applications/build.gradle.kts index 7a5c27e2..65eaee1e 100644 --- a/applications/build.gradle.kts +++ b/applications/build.gradle.kts @@ -42,6 +42,8 @@ dependencies { implementation(libs.koin.android) + implementation(libs.commons.text) + implementation(project(":search")) implementation(project(":base")) implementation(project(":preferences")) diff --git a/applications/src/main/java/de/mm20/launcher2/applications/AppRepository.kt b/applications/src/main/java/de/mm20/launcher2/applications/AppRepository.kt index a18f1298..8a5a8ef1 100644 --- a/applications/src/main/java/de/mm20/launcher2/applications/AppRepository.kt +++ b/applications/src/main/java/de/mm20/launcher2/applications/AppRepository.kt @@ -18,6 +18,8 @@ import de.mm20.launcher2.search.data.LauncherApp import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.* import kotlinx.coroutines.withContext +import org.apache.commons.text.similarity.FuzzyScore +import java.util.* interface AppRepository { fun search(query: String): Flow> @@ -188,22 +190,17 @@ internal class AppRepositoryImpl( merge(installedApps, hiddenItems, installations).collectLatest { withContext(Dispatchers.IO) { + val fuzzyScore = FuzzyScore(Locale.getDefault()) val appResults = mutableListOf() if (query.isEmpty()) { appResults.addAll(installedApps.value) appResults.addAll(installations.value) } else { appResults.addAll(installedApps.value.filter { - it.label.contains( - query, - ignoreCase = true - ) + fuzzyScore.fuzzyScore(it.label, query) >= query.length * 1.5 }) appResults.addAll(installations.value.filter { - it.label.contains( - query, - ignoreCase = true - ) + fuzzyScore.fuzzyScore(it.label, query) >= query.length * 1.5 }) }