Skip to content

Commit 5a75bad

Browse files
authored
Merge pull request #4785 from mykh-hailo/fix/sort_alphabetical_order
[FIX] Sort is not alphabetically correct
2 parents 350965d + 4dd9891 commit 5a75bad

4 files changed

Lines changed: 36 additions & 12 deletions

File tree

changelog/unreleased/4785

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Bugfix: Sort is not alphabetically correct
2+
3+
Locale-aware collation has been applied to file sorting by name to handle accented characters correctly.
4+
5+
https://github.com/owncloud/android/issues/4760
6+
https://github.com/owncloud/android/pull/4785

owncloudApp/src/main/java/com/owncloud/android/utils/SortFilesUtils.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ package com.owncloud.android.utils
2020

2121
import com.owncloud.android.domain.files.model.OCFile
2222
import com.owncloud.android.presentation.files.SortType
23+
import java.text.Collator
24+
import java.util.Locale
2325

2426
class SortFilesUtils {
2527
fun sortFiles(
@@ -34,12 +36,16 @@ class SortFilesUtils {
3436
}
3537

3638
private fun sortByName(listOfFiles: List<OCFile>, ascending: Boolean): List<OCFile> {
37-
val newListOfFiles =
38-
if (ascending) listOfFiles.sortedBy { it.fileName.lowercase() }
39-
else listOfFiles.sortedByDescending { it.fileName.lowercase() }
39+
val collator = Collator.getInstance(Locale.getDefault()).apply {
40+
strength = Collator.PRIMARY // Ignore accents and case
41+
}
42+
43+
val nameComparator =
44+
if (ascending) compareBy<OCFile, String>(collator) { it.fileName }
45+
else compareByDescending(collator) { it.fileName }
4046

4147
// Show first the folders when sorting by name
42-
return newListOfFiles.sortedByDescending { it.isFolder }
48+
return listOfFiles.sortedWith(compareByDescending<OCFile> { it.isFolder }.then(nameComparator))
4349
}
4450

4551
private fun sortBySize(listOfFiles: List<OCFile>, ascending: Boolean): List<OCFile> =

owncloudDomain/src/main/java/com/owncloud/android/domain/files/usecases/SortFilesUseCase.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ package com.owncloud.android.domain.files.usecases
2020

2121
import com.owncloud.android.domain.BaseUseCase
2222
import com.owncloud.android.domain.files.model.OCFile
23+
import java.text.Collator
24+
import java.util.Locale
2325

2426
class SortFilesUseCase : BaseUseCase<List<OCFile>, SortFilesUseCase.Params>() {
2527

@@ -31,12 +33,16 @@ class SortFilesUseCase : BaseUseCase<List<OCFile>, SortFilesUseCase.Params>() {
3133
}
3234

3335
private fun sortByName(listOfFiles: List<OCFile>, ascending: Boolean): List<OCFile> {
34-
val newListOfFiles =
35-
if (ascending) listOfFiles.sortedBy { it.fileName.lowercase() }
36-
else listOfFiles.sortedByDescending { it.fileName.lowercase() }
36+
val collator = Collator.getInstance(Locale.getDefault()).apply {
37+
strength = Collator.PRIMARY // Ignore accents and case
38+
}
39+
40+
val nameComparator =
41+
if (ascending) compareBy<OCFile, String>(collator) { it.fileName }
42+
else compareByDescending(collator) { it.fileName }
3743

3844
// Show first the folders when sorting by name
39-
return newListOfFiles.sortedByDescending { it.isFolder }
45+
return listOfFiles.sortedWith(compareByDescending<OCFile> { it.isFolder }.then(nameComparator))
4046
}
4147

4248
private fun sortBySize(listOfFiles: List<OCFile>, ascending: Boolean): List<OCFile> =

owncloudDomain/src/main/java/com/owncloud/android/domain/files/usecases/SortFilesWithSyncInfoUseCase.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ package com.owncloud.android.domain.files.usecases
2222

2323
import com.owncloud.android.domain.BaseUseCase
2424
import com.owncloud.android.domain.files.model.OCFileWithSyncInfo
25+
import java.text.Collator
26+
import java.util.Locale
2527

2628
class SortFilesWithSyncInfoUseCase : BaseUseCase<List<OCFileWithSyncInfo>, SortFilesWithSyncInfoUseCase.Params>() {
2729

@@ -33,12 +35,16 @@ class SortFilesWithSyncInfoUseCase : BaseUseCase<List<OCFileWithSyncInfo>, SortF
3335
}
3436

3537
private fun sortByName(listOfFiles: List<OCFileWithSyncInfo>, ascending: Boolean): List<OCFileWithSyncInfo> {
36-
val newListOfFiles =
37-
if (ascending) listOfFiles.sortedBy { it.file.fileName.lowercase() }
38-
else listOfFiles.sortedByDescending { it.file.fileName.lowercase() }
38+
val collator = Collator.getInstance(Locale.getDefault()).apply {
39+
strength = Collator.PRIMARY // Ignore accents and case
40+
}
41+
42+
val nameComparator =
43+
if (ascending) compareBy<OCFileWithSyncInfo, String>(collator) { it.file.fileName }
44+
else compareByDescending(collator) { it.file.fileName }
3945

4046
// Show first the folders when sorting by name
41-
return newListOfFiles.sortedByDescending { it.file.isFolder }
47+
return listOfFiles.sortedWith(compareByDescending<OCFileWithSyncInfo> { it.file.isFolder }.then(nameComparator))
4248
}
4349

4450
private fun sortBySize(listOfFiles: List<OCFileWithSyncInfo>, ascending: Boolean): List<OCFileWithSyncInfo> =

0 commit comments

Comments
 (0)