Skip to content

Commit 3676451

Browse files
authored
Merge pull request #4050 from element-hq/feature/bma/normalizedFilter
Make the room filter use normalized strings.
2 parents b7dd490 + b12211d commit 3676451

File tree

4 files changed

+37
-3
lines changed

4 files changed

+37
-3
lines changed

libraries/core/src/main/kotlin/io/element/android/libraries/core/extensions/BasicExtensions.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package io.element.android.libraries.core.extensions
99

10+
import java.text.Normalizer
1011
import java.util.Locale
1112

1213
fun Boolean.toOnOff() = if (this) "ON" else "OFF"
@@ -83,3 +84,8 @@ fun String.safeCapitalize(): String {
8384
}
8485
}
8586
}
87+
88+
fun String.withoutAccents(): String {
89+
return Normalizer.normalize(this, Normalizer.Form.NFD)
90+
.replace("\\p{Mn}+".toRegex(), "")
91+
}

libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomListFilter.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
package io.element.android.libraries.matrix.api.roomlist
99

10+
import io.element.android.libraries.core.extensions.withoutAccents
11+
1012
sealed interface RoomListFilter {
1113
companion object {
1214
/**
@@ -73,5 +75,7 @@ sealed interface RoomListFilter {
7375
*/
7476
data class NormalizedMatchRoomName(
7577
val pattern: String
76-
) : RoomListFilter
78+
) : RoomListFilter {
79+
val normalizedPattern: String = pattern.withoutAccents()
80+
}
7781
}

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListFilter.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package io.element.android.libraries.matrix.impl.roomlist
99

10+
import io.element.android.libraries.core.extensions.withoutAccents
1011
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
1112
import io.element.android.libraries.matrix.api.room.isDm
1213
import io.element.android.libraries.matrix.api.roomlist.RoomListFilter
@@ -30,7 +31,7 @@ val RoomListFilter.predicate
3031
!roomSummary.isInvited() && (roomSummary.info.numUnreadNotifications > 0 || roomSummary.info.isMarkedUnread)
3132
}
3233
is RoomListFilter.NormalizedMatchRoomName -> { roomSummary: RoomSummary ->
33-
roomSummary.info.name.orEmpty().contains(pattern, ignoreCase = true)
34+
roomSummary.info.name?.withoutAccents().orEmpty().contains(normalizedPattern, ignoreCase = true)
3435
}
3536
RoomListFilter.Invite -> { roomSummary: RoomSummary ->
3637
roomSummary.isInvited()

libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListFilterTest.kt

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ class RoomListFilterTest {
3434
private val roomToSearch = aRoomSummary(
3535
name = "Room to search"
3636
)
37+
private val roomWithAccent = aRoomSummary(
38+
name = "Frédéric"
39+
)
3740
private val invitedRoom = aRoomSummary(
3841
currentUserMembership = CurrentUserMembership.INVITED
3942
)
@@ -45,6 +48,7 @@ class RoomListFilterTest {
4548
markedAsUnreadRoom,
4649
unreadNotificationRoom,
4750
roomToSearch,
51+
roomWithAccent,
4852
invitedRoom
4953
)
5054

@@ -69,7 +73,14 @@ class RoomListFilterTest {
6973
@Test
7074
fun `Room list filter group`() = runTest {
7175
val filter = RoomListFilter.Category.Group
72-
assertThat(roomSummaries.filter(filter)).containsExactly(regularRoom, favoriteRoom, markedAsUnreadRoom, unreadNotificationRoom, roomToSearch)
76+
assertThat(roomSummaries.filter(filter)).containsExactly(
77+
regularRoom,
78+
favoriteRoom,
79+
markedAsUnreadRoom,
80+
unreadNotificationRoom,
81+
roomToSearch,
82+
roomWithAccent,
83+
)
7384
}
7485

7586
@Test
@@ -96,6 +107,18 @@ class RoomListFilterTest {
96107
assertThat(roomSummaries.filter(filter)).containsExactly(roomToSearch)
97108
}
98109

110+
@Test
111+
fun `Room list filter normalized match room name with accent`() = runTest {
112+
val filter = RoomListFilter.NormalizedMatchRoomName("Fred")
113+
assertThat(roomSummaries.filter(filter)).containsExactly(roomWithAccent)
114+
}
115+
116+
@Test
117+
fun `Room list filter normalized match room name with accent when searching with accent`() = runTest {
118+
val filter = RoomListFilter.NormalizedMatchRoomName("Fréd")
119+
assertThat(roomSummaries.filter(filter)).containsExactly(roomWithAccent)
120+
}
121+
99122
@Test
100123
fun `Room list filter all with one match`() = runTest {
101124
val filter = RoomListFilter.all(

0 commit comments

Comments
 (0)