From fec28af74f962e9650410855655fcecff9812a76 Mon Sep 17 00:00:00 2001 From: Jan <4600407+jguegel@users.noreply.github.com> Date: Tue, 30 Sep 2025 11:23:51 +0200 Subject: [PATCH] fix: search now ignores accents and diacritics (#274) * compare normalized search and items to ignore accents and diacritics * Update CHANGELOG.md * compare normalized search and items to ignore accents and diacritics * Update CHANGELOG.md * fix change print enconding to base64 #104 Signed-off-by: Jan Guegel * ops.. wrong branch.. Signed-off-by: Jan Guegel * Update CHANGELOG.md * Update CHANGELOG.md Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com> * use normalizeString() from commons libs Signed-off-by: Jan Guegel * use normalizeString() from commons libs also for recentsfragmen Signed-off-by: Jan Guegel * Apply suggestions from code review Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com> * use normalizeString() for StorageFragment Signed-off-by: Jan Guegel * fix last usage of contains() without normalizeString in search context fix missing expection toast Signed-off-by: Jan Guegel * remove Toast from loop Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com> --------- Signed-off-by: Jan Guegel Co-authored-by: Jan Guegel Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com> Refs: https://github.com/FossifyOrg/File-Manager/issues/95 --- CHANGELOG.md | 2 ++ .../filemanager/activities/MimeTypesActivity.kt | 15 +++++++++------ .../filemanager/fragments/ItemsFragment.kt | 5 +++-- .../filemanager/fragments/RecentsFragment.kt | 7 ++++++- .../filemanager/fragments/StorageFragment.kt | 7 ++++++- 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b108ff3..5a598a92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Save button now overwrites files directly in the text editor ([#224]) +- Search now ignores accents and diacritics ([#95]) ## [1.2.3] - 2025-09-15 ### Fixed @@ -85,6 +86,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#267]: https://github.com/FossifyOrg/File-Manager/issues/267 [#250]: https://github.com/FossifyOrg/File-Manager/issues/250 [#85]: https://github.com/FossifyOrg/File-Manager/issues/85 +[#95]: https://github.com/FossifyOrg/File-Manager/issues/95 [#104]: https://github.com/FossifyOrg/File-Manager/issues/104 [#224]: https://github.com/FossifyOrg/File-Manager/issues/224 diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/MimeTypesActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/MimeTypesActivity.kt index 34c929c4..24a41f2f 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/MimeTypesActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/MimeTypesActivity.kt @@ -133,10 +133,11 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener { override fun selectedPaths(paths: ArrayList) {} fun searchQueryChanged(text: String) { - val searchText = text.trim() - lastSearchedText = searchText + val normalizedText = text.normalizeString() + val searchNormalizedText = normalizedText.trim() + lastSearchedText = searchNormalizedText when { - searchText.isEmpty() -> { + searchNormalizedText.isEmpty() -> { binding.apply { mimetypesFastscroller.beVisible() getRecyclerAdapter()?.updateItems(storedItems) @@ -145,7 +146,7 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener { } } - searchText.length == 1 -> { + searchNormalizedText.length == 1 -> { binding.apply { mimetypesFastscroller.beGone() mimetypesPlaceholder.beVisible() @@ -155,11 +156,13 @@ class MimeTypesActivity : SimpleActivity(), ItemOperationsListener { else -> { ensureBackgroundThread { - if (lastSearchedText != searchText) { + if (lastSearchedText != searchNormalizedText) { return@ensureBackgroundThread } - val listItems = storedItems.filter { it.name.contains(searchText, true) } as ArrayList + val listItems = storedItems.filter { + it.name.normalizeString().contains(searchNormalizedText, true) + } as ArrayList runOnUiThread { getRecyclerAdapter()?.updateItems(listItems, text) diff --git a/app/src/main/kotlin/org/fossify/filemanager/fragments/ItemsFragment.kt b/app/src/main/kotlin/org/fossify/filemanager/fragments/ItemsFragment.kt index 02a2b8e0..d7589648 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/fragments/ItemsFragment.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/fragments/ItemsFragment.kt @@ -377,6 +377,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF return files } + val normalizedText = text.normalizeString() val sorting = context!!.config.getFolderSorting(path) FileDirItem.sorting = context!!.config.getFolderSorting(currentPath) val isSortingBySize = sorting and SORT_BY_SIZE != 0 @@ -386,7 +387,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF } if (it.isDirectory) { - if (it.name.contains(text, true)) { + if (it.name.normalizeString().contains(normalizedText, true)) { val fileDirItem = getListItemFromFile(it, isSortingBySize, HashMap(), false) if (fileDirItem != null) { files.add(fileDirItem) @@ -395,7 +396,7 @@ class ItemsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerF files.addAll(searchFiles(text, it.absolutePath)) } else { - if (it.name.contains(text, true)) { + if (it.name.normalizeString().contains(normalizedText, true)) { val fileDirItem = getListItemFromFile(it, isSortingBySize, HashMap(), false) if (fileDirItem != null) { files.add(fileDirItem) diff --git a/app/src/main/kotlin/org/fossify/filemanager/fragments/RecentsFragment.kt b/app/src/main/kotlin/org/fossify/filemanager/fragments/RecentsFragment.kt index f7b1b327..c5da2187 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/fragments/RecentsFragment.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/fragments/RecentsFragment.kt @@ -12,6 +12,7 @@ import org.fossify.commons.extensions.getDoesFilePathExist import org.fossify.commons.extensions.getFilenameFromPath import org.fossify.commons.extensions.getLongValue import org.fossify.commons.extensions.getStringValue +import org.fossify.commons.extensions.normalizeString import org.fossify.commons.extensions.showErrorToast import org.fossify.commons.helpers.VIEW_TYPE_GRID import org.fossify.commons.helpers.VIEW_TYPE_LIST @@ -242,7 +243,11 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage override fun searchQueryChanged(text: String) { lastSearchedText = text - val filtered = filesIgnoringSearch.filter { it.mName.contains(text, true) }.toMutableList() as ArrayList + val normalizedText = text.normalizeString() + val filtered = filesIgnoringSearch.filter { + it.mName.normalizeString().contains(normalizedText, true) + }.toMutableList() as ArrayList + binding.apply { (recentsList.adapter as? ItemsAdapter)?.updateItems(filtered, text) recentsPlaceholder.beVisibleIf(filtered.isEmpty()) diff --git a/app/src/main/kotlin/org/fossify/filemanager/fragments/StorageFragment.kt b/app/src/main/kotlin/org/fossify/filemanager/fragments/StorageFragment.kt index a5502e8c..ecbbaccf 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/fragments/StorageFragment.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/fragments/StorageFragment.kt @@ -28,6 +28,7 @@ import org.fossify.commons.extensions.getLongValue import org.fossify.commons.extensions.getProperBackgroundColor import org.fossify.commons.extensions.getProperPrimaryColor import org.fossify.commons.extensions.getStringValue +import org.fossify.commons.extensions.normalizeString import org.fossify.commons.extensions.queryCursor import org.fossify.commons.extensions.showErrorToast import org.fossify.commons.extensions.updateTextColors @@ -340,6 +341,7 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage } override fun searchQueryChanged(text: String) { + val normalizedText = text.normalizeString() lastSearchedText = text binding.apply { if (text.isNotEmpty()) { @@ -364,7 +366,10 @@ class StorageFragment(context: Context, attributeSet: AttributeSet) : MyViewPage } else { showProgressBar() ensureBackgroundThread { - val filtered = allDeviceListItems.filter { it.mName.contains(text, true) }.toMutableList() as ArrayList + val filtered = allDeviceListItems.filter { + it.mName.normalizeString().contains(normalizedText, true) + }.toMutableList() as ArrayList + if (lastSearchedText != text) { return@ensureBackgroundThread }