From 7acbf0eda85f44ee305825de5395f4537fce999b Mon Sep 17 00:00:00 2001 From: Amogh Lele Date: Wed, 7 Apr 2021 11:02:41 +0530 Subject: [PATCH] Switch to sublime text's fuzzy matching (#1372) * refactor(search): use sublime text's fuzzy matching algorithm Signed-off-by: SphericalKat * chore(changelog): update Signed-off-by: SphericalKat * build: fetch sublime-fuzzy from Maven Central Signed-off-by: Harsh Shandilya * chore(changelog): update Co-authored-by: Harsh Shandilya Co-authored-by: Harsh Shandilya --- CHANGELOG.md | 1 + app/build.gradle.kts | 1 + .../SearchableRepositoryViewModel.kt | 28 ++----------------- buildSrc/src/main/java/Dependencies.kt | 1 + 4 files changed, 6 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 245170e4..0304d949 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - Allow doing a merge instead of a rebase when pulling or syncing - Add support for manually providing TOTP parameters - Parse extra content as individual fields +- Improve search result filtering logic ### Fixed diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2b271563..401b29a5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -66,6 +66,7 @@ dependencies { implementation(Dependencies.Kotlin.Coroutines.android) implementation(Dependencies.Kotlin.Coroutines.core) + implementation(Dependencies.FirstParty.sublime_fuzzy) implementation(Dependencies.FirstParty.zxing_android_embedded) implementation(Dependencies.ThirdParty.bouncycastle) diff --git a/app/src/main/java/dev/msfjarvis/aps/util/viewmodel/SearchableRepositoryViewModel.kt b/app/src/main/java/dev/msfjarvis/aps/util/viewmodel/SearchableRepositoryViewModel.kt index c3998d2a..881f98f4 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/viewmodel/SearchableRepositoryViewModel.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/viewmodel/SearchableRepositoryViewModel.kt @@ -31,6 +31,7 @@ import dev.msfjarvis.aps.util.autofill.DirectoryStructure import dev.msfjarvis.aps.util.extensions.sharedPrefs import dev.msfjarvis.aps.util.settings.PasswordSortOrder import dev.msfjarvis.aps.util.settings.PreferenceKeys +import dev.sphericalkat.sublimefuzzy.Fuzzy import java.io.File import java.text.Collator import java.util.Locale @@ -55,31 +56,8 @@ private fun File.toPasswordItem() = else PasswordItem.newCategory(name, this, PasswordRepository.getRepositoryDirectory()) private fun PasswordItem.fuzzyMatch(filter: String): Int { - var i = 0 - var j = 0 - var score = 0 - var bonus = 0 - var bonusIncrement = 0 - - val toMatch = longName - - while (i < filter.length && j < toMatch.length) { - when { - filter[i].isWhitespace() -> i++ - filter[i].toLowerCase() == toMatch[j].toLowerCase() -> { - i++ - bonusIncrement += 1 - bonus += bonusIncrement - score += bonus - } - else -> { - bonus = 0 - bonusIncrement = 0 - } - } - j++ - } - return if (i == filter.length) score else 0 + val (_, score) = Fuzzy.fuzzyMatch(filter, longName) + return score } private val CaseInsensitiveComparator = Collator.getInstance().apply { strength = Collator.PRIMARY } diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 73d34126..e86e381c 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -52,6 +52,7 @@ object Dependencies { object FirstParty { + const val sublime_fuzzy = "com.github.android-password-store:sublime-fuzzy:1.0.0-alpha01" const val zxing_android_embedded = "com.github.android-password-store:zxing-android-embedded:4.1.0-aps" }