From b6f6c0c5844b085d5cd6208a6096e3762f1a2156 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sat, 5 Mar 2022 13:54:07 +0100 Subject: [PATCH] Add Pinyin support to app search Implement #8 --- applications/build.gradle.kts | 2 ++ .../launcher2/applications/AppRepository.kt | 19 +++++++++++++++---- .../launcher2/licenses/OpenSourceLicenses.kt | 7 +++++++ settings.gradle.kts | 4 ++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/applications/build.gradle.kts b/applications/build.gradle.kts index 65eaee1e..44e63ff0 100644 --- a/applications/build.gradle.kts +++ b/applications/build.gradle.kts @@ -44,6 +44,8 @@ dependencies { implementation(libs.commons.text) + implementation(libs.tinypinyin) + 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 8a5a8ef1..c54ede69 100644 --- a/applications/src/main/java/de/mm20/launcher2/applications/AppRepository.kt +++ b/applications/src/main/java/de/mm20/launcher2/applications/AppRepository.kt @@ -11,6 +11,7 @@ import android.os.Process import android.os.UserHandle import android.os.UserManager import android.util.Log +import com.github.promeg.pinyinhelper.Pinyin import de.mm20.launcher2.hiddenitems.HiddenItemsRepository import de.mm20.launcher2.search.data.AppInstallation import de.mm20.launcher2.search.data.Application @@ -189,18 +190,17 @@ internal class AppRepositoryImpl( override fun search(query: String): Flow> = channelFlow { merge(installedApps, hiddenItems, installations).collectLatest { - withContext(Dispatchers.IO) { - val fuzzyScore = FuzzyScore(Locale.getDefault()) + withContext(Dispatchers.Default) { val appResults = mutableListOf() if (query.isEmpty()) { appResults.addAll(installedApps.value) appResults.addAll(installations.value) } else { appResults.addAll(installedApps.value.filter { - fuzzyScore.fuzzyScore(it.label, query) >= query.length * 1.5 + matches(it.label, query) }) appResults.addAll(installations.value.filter { - fuzzyScore.fuzzyScore(it.label, query) >= query.length * 1.5 + matches(it.label, query) }) } @@ -216,6 +216,17 @@ internal class AppRepositoryImpl( } } + private fun matches(label: String, query: String): Boolean { + val labelLatin = romanize(label) + val fuzzyScore = FuzzyScore(Locale.getDefault()) + return fuzzyScore.fuzzyScore(label, query) >= query.length * 1.5 || + fuzzyScore.fuzzyScore(labelLatin, query) >= query.length * 1.5 + } + + private fun romanize(label: String): String { + return Pinyin.toPinyin(label, "").lowercase(Locale.getDefault()) + } + private fun getActivityByComponentName(componentName: ComponentName?): Application? { componentName ?: return null val intent = Intent().setComponent(componentName) diff --git a/base/src/main/java/de/mm20/launcher2/licenses/OpenSourceLicenses.kt b/base/src/main/java/de/mm20/launcher2/licenses/OpenSourceLicenses.kt index ff1f12cf..1d719a03 100644 --- a/base/src/main/java/de/mm20/launcher2/licenses/OpenSourceLicenses.kt +++ b/base/src/main/java/de/mm20/launcher2/licenses/OpenSourceLicenses.kt @@ -194,4 +194,11 @@ val OpenSourceLicenses = arrayOf( licenseText = R.raw.license_apache_2, url = "https://commons.apache.org/proper/commons-text/" ), + OpenSourceLibrary( + name = "TinyPinyin", + description = "A fast, low-memory Chinese character-to-pinyin library for Java and Android.", + licenseName = R.string.apache_license_name, + licenseText = R.raw.license_apache_2, + url = "https://github.com/promeG/TinyPinyin" + ), ) \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index a1ad419e..aa3189d1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -375,6 +375,10 @@ dependencyResolutionManagement { alias("koin.androidxcompose") .to("io.insert-koin", "koin-androidx-compose") .versionRef("koin") + + alias("tinypinyin") + .to("com.github.promeg", "tinypinyin") + .version("2.0.2") } } }