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)))