Merge pull request #4050 from element-hq/feature/bma/normalizedFilter
Make the room filter use normalized strings.
This commit is contained in:
commit
fe55886182
4 changed files with 37 additions and 3 deletions
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
package io.element.android.libraries.core.extensions
|
package io.element.android.libraries.core.extensions
|
||||||
|
|
||||||
|
import java.text.Normalizer
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
fun Boolean.toOnOff() = if (this) "ON" else "OFF"
|
fun Boolean.toOnOff() = if (this) "ON" else "OFF"
|
||||||
|
|
@ -83,3 +84,8 @@ fun String.safeCapitalize(): String {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun String.withoutAccents(): String {
|
||||||
|
return Normalizer.normalize(this, Normalizer.Form.NFD)
|
||||||
|
.replace("\\p{Mn}+".toRegex(), "")
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,8 @@
|
||||||
|
|
||||||
package io.element.android.libraries.matrix.api.roomlist
|
package io.element.android.libraries.matrix.api.roomlist
|
||||||
|
|
||||||
|
import io.element.android.libraries.core.extensions.withoutAccents
|
||||||
|
|
||||||
sealed interface RoomListFilter {
|
sealed interface RoomListFilter {
|
||||||
companion object {
|
companion object {
|
||||||
/**
|
/**
|
||||||
|
|
@ -73,5 +75,7 @@ sealed interface RoomListFilter {
|
||||||
*/
|
*/
|
||||||
data class NormalizedMatchRoomName(
|
data class NormalizedMatchRoomName(
|
||||||
val pattern: String
|
val pattern: String
|
||||||
) : RoomListFilter
|
) : RoomListFilter {
|
||||||
|
val normalizedPattern: String = pattern.withoutAccents()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
package io.element.android.libraries.matrix.impl.roomlist
|
package io.element.android.libraries.matrix.impl.roomlist
|
||||||
|
|
||||||
|
import io.element.android.libraries.core.extensions.withoutAccents
|
||||||
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
|
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
|
||||||
import io.element.android.libraries.matrix.api.room.isDm
|
import io.element.android.libraries.matrix.api.room.isDm
|
||||||
import io.element.android.libraries.matrix.api.roomlist.RoomListFilter
|
import io.element.android.libraries.matrix.api.roomlist.RoomListFilter
|
||||||
|
|
@ -30,7 +31,7 @@ val RoomListFilter.predicate
|
||||||
!roomSummary.isInvited() && (roomSummary.info.numUnreadNotifications > 0 || roomSummary.info.isMarkedUnread)
|
!roomSummary.isInvited() && (roomSummary.info.numUnreadNotifications > 0 || roomSummary.info.isMarkedUnread)
|
||||||
}
|
}
|
||||||
is RoomListFilter.NormalizedMatchRoomName -> { roomSummary: RoomSummary ->
|
is RoomListFilter.NormalizedMatchRoomName -> { roomSummary: RoomSummary ->
|
||||||
roomSummary.info.name.orEmpty().contains(pattern, ignoreCase = true)
|
roomSummary.info.name?.withoutAccents().orEmpty().contains(normalizedPattern, ignoreCase = true)
|
||||||
}
|
}
|
||||||
RoomListFilter.Invite -> { roomSummary: RoomSummary ->
|
RoomListFilter.Invite -> { roomSummary: RoomSummary ->
|
||||||
roomSummary.isInvited()
|
roomSummary.isInvited()
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,9 @@ class RoomListFilterTest {
|
||||||
private val roomToSearch = aRoomSummary(
|
private val roomToSearch = aRoomSummary(
|
||||||
name = "Room to search"
|
name = "Room to search"
|
||||||
)
|
)
|
||||||
|
private val roomWithAccent = aRoomSummary(
|
||||||
|
name = "Frédéric"
|
||||||
|
)
|
||||||
private val invitedRoom = aRoomSummary(
|
private val invitedRoom = aRoomSummary(
|
||||||
currentUserMembership = CurrentUserMembership.INVITED
|
currentUserMembership = CurrentUserMembership.INVITED
|
||||||
)
|
)
|
||||||
|
|
@ -45,6 +48,7 @@ class RoomListFilterTest {
|
||||||
markedAsUnreadRoom,
|
markedAsUnreadRoom,
|
||||||
unreadNotificationRoom,
|
unreadNotificationRoom,
|
||||||
roomToSearch,
|
roomToSearch,
|
||||||
|
roomWithAccent,
|
||||||
invitedRoom
|
invitedRoom
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -69,7 +73,14 @@ class RoomListFilterTest {
|
||||||
@Test
|
@Test
|
||||||
fun `Room list filter group`() = runTest {
|
fun `Room list filter group`() = runTest {
|
||||||
val filter = RoomListFilter.Category.Group
|
val filter = RoomListFilter.Category.Group
|
||||||
assertThat(roomSummaries.filter(filter)).containsExactly(regularRoom, favoriteRoom, markedAsUnreadRoom, unreadNotificationRoom, roomToSearch)
|
assertThat(roomSummaries.filter(filter)).containsExactly(
|
||||||
|
regularRoom,
|
||||||
|
favoriteRoom,
|
||||||
|
markedAsUnreadRoom,
|
||||||
|
unreadNotificationRoom,
|
||||||
|
roomToSearch,
|
||||||
|
roomWithAccent,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -96,6 +107,18 @@ class RoomListFilterTest {
|
||||||
assertThat(roomSummaries.filter(filter)).containsExactly(roomToSearch)
|
assertThat(roomSummaries.filter(filter)).containsExactly(roomToSearch)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Room list filter normalized match room name with accent`() = runTest {
|
||||||
|
val filter = RoomListFilter.NormalizedMatchRoomName("Fred")
|
||||||
|
assertThat(roomSummaries.filter(filter)).containsExactly(roomWithAccent)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Room list filter normalized match room name with accent when searching with accent`() = runTest {
|
||||||
|
val filter = RoomListFilter.NormalizedMatchRoomName("Fréd")
|
||||||
|
assertThat(roomSummaries.filter(filter)).containsExactly(roomWithAccent)
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `Room list filter all with one match`() = runTest {
|
fun `Room list filter all with one match`() = runTest {
|
||||||
val filter = RoomListFilter.all(
|
val filter = RoomListFilter.all(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue