Fuzzy match search queries in app search

This commit is contained in:
MM20 2022-02-19 21:08:26 +01:00
parent 5e9719afa7
commit 05f64ea238
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
2 changed files with 7 additions and 8 deletions

View File

@ -42,6 +42,8 @@ dependencies {
implementation(libs.koin.android) implementation(libs.koin.android)
implementation(libs.commons.text)
implementation(project(":search")) implementation(project(":search"))
implementation(project(":base")) implementation(project(":base"))
implementation(project(":preferences")) implementation(project(":preferences"))

View File

@ -18,6 +18,8 @@ import de.mm20.launcher2.search.data.LauncherApp
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.* import kotlinx.coroutines.flow.*
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.apache.commons.text.similarity.FuzzyScore
import java.util.*
interface AppRepository { interface AppRepository {
fun search(query: String): Flow<List<Application>> fun search(query: String): Flow<List<Application>>
@ -188,22 +190,17 @@ internal class AppRepositoryImpl(
merge(installedApps, hiddenItems, installations).collectLatest { merge(installedApps, hiddenItems, installations).collectLatest {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
val fuzzyScore = FuzzyScore(Locale.getDefault())
val appResults = mutableListOf<Application>() val appResults = mutableListOf<Application>()
if (query.isEmpty()) { if (query.isEmpty()) {
appResults.addAll(installedApps.value) appResults.addAll(installedApps.value)
appResults.addAll(installations.value) appResults.addAll(installations.value)
} else { } else {
appResults.addAll(installedApps.value.filter { appResults.addAll(installedApps.value.filter {
it.label.contains( fuzzyScore.fuzzyScore(it.label, query) >= query.length * 1.5
query,
ignoreCase = true
)
}) })
appResults.addAll(installations.value.filter { appResults.addAll(installations.value.filter {
it.label.contains( fuzzyScore.fuzzyScore(it.label, query) >= query.length * 1.5
query,
ignoreCase = true
)
}) })
} }