From f3b822209590fc67255a77108e716f225b67cdf8 Mon Sep 17 00:00:00 2001 From: Avinash Sharma <133222313+Avinash-Codes@users.noreply.github.com> Date: Sat, 1 Feb 2025 01:52:43 +0530 Subject: [PATCH] resources: smoother search (fixes #5164) (#5175) Co-authored-by: Gideon Okuro Co-authored-by: dogi --- app/build.gradle | 4 +-- .../myplanet/base/BaseRecyclerFragment.kt | 28 ++++++++++++++----- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c3a42525e0..1340fa21d6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "org.ole.planet.myplanet" minSdkVersion 26 targetSdkVersion 34 - versionCode 2262 - versionName "0.22.62" + versionCode 2263 + versionName "0.22.63" ndkVersion '21.3.6528147' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true diff --git a/app/src/main/java/org/ole/planet/myplanet/base/BaseRecyclerFragment.kt b/app/src/main/java/org/ole/planet/myplanet/base/BaseRecyclerFragment.kt index 04fe1aa864..490db8b808 100644 --- a/app/src/main/java/org/ole/planet/myplanet/base/BaseRecyclerFragment.kt +++ b/app/src/main/java/org/ole/planet/myplanet/base/BaseRecyclerFragment.kt @@ -39,6 +39,7 @@ import org.ole.planet.myplanet.model.RealmTag import org.ole.planet.myplanet.service.UserProfileDbHandler import org.ole.planet.myplanet.utilities.Constants.PREFS_NAME import org.ole.planet.myplanet.utilities.Utilities.toast +import java.text.Normalizer import java.util.Locale abstract class BaseRecyclerFragment
  • : BaseRecyclerParentFragment(), OnRatingChangeListener { @@ -188,9 +189,15 @@ abstract class BaseRecyclerFragment
  • : BaseRecyclerParentFragment(), On searchAndMatch(item, c, queryParts) } } else { - mRealm.where(c) - .contains(fieldName, s, Case.INSENSITIVE) - .findAll() + mRealm.where(c).findAll().filter { item -> + val title = when { + c.isAssignableFrom(RealmMyLibrary::class.java) -> (item as RealmMyLibrary).title + else -> (item as RealmMyCourse).courseTitle + } + title?.let { + normalizeText(it).contains(normalizeText(s)) + } ?: false + } } } @@ -198,14 +205,15 @@ abstract class BaseRecyclerFragment
  • : BaseRecyclerParentFragment(), On val title = when { c.isAssignableFrom(RealmMyLibrary::class.java) -> (item as RealmMyLibrary).title else -> (item as RealmMyCourse).courseTitle - }?.lowercase(Locale.getDefault()) ?: return false + }?.let { normalizeText(it) } ?: return false return queryParts.all { queryPart -> - title.contains(queryPart.lowercase(Locale.getDefault())) + title.contains(normalizeText(queryPart)) } } fun filterLibraryByTag(s: String, tags: List): List { + val normalizedSearchTerm = normalizeText(s) var list = getData(s, RealmMyLibrary::class.java) list = if (isMyCourseLib) { getMyLibraryByUserId(model?.id, list) @@ -224,12 +232,18 @@ abstract class BaseRecyclerFragment
  • : BaseRecyclerParentFragment(), On } return libraries.sortedWith(compareBy { library -> - !library.title?.lowercase()?.startsWith(s.lowercase())!! ?: true + val normalizedTitle = normalizeText(library.title ?: "") + !normalizedTitle.contains(normalizedSearchTerm) }.thenBy { library -> - library.title?.lowercase() ?: "" + normalizeText(library.title ?: "") }) } + fun normalizeText(str: String): String { + return Normalizer.normalize(str.lowercase(Locale.getDefault()), Normalizer.Form.NFD) + .replace(Regex("\\p{InCombiningDiacriticalMarks}+"), "") + } + fun filterCourseByTag(s: String, tags: List): List { if (tags.isEmpty() && s.isEmpty()) { return applyCourseFilter(filterRealmMyCourseList(getList(RealmMyCourse::class.java)))