Merge pull request #5449 from element-hq/feature/fga/room_list_space_invite
Room list space invite
This commit is contained in:
commit
0bec8f038c
17 changed files with 92 additions and 41 deletions
|
|
@ -189,10 +189,14 @@ private fun RoomSummaryScaffoldRow(
|
|||
) {
|
||||
Avatar(
|
||||
avatarData = room.avatarData,
|
||||
avatarType = AvatarType.Room(
|
||||
heroes = room.heroes,
|
||||
isTombstoned = room.isTombstoned,
|
||||
),
|
||||
avatarType = if (room.isSpace) {
|
||||
AvatarType.Space(isTombstoned = room.isTombstoned)
|
||||
} else {
|
||||
AvatarType.Room(
|
||||
heroes = room.heroes,
|
||||
isTombstoned = room.isTombstoned,
|
||||
)
|
||||
},
|
||||
hideImage = hideAvatarImage,
|
||||
)
|
||||
Spacer(modifier = Modifier.width(16.dp))
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ class RoomListRoomSummaryFactory(
|
|||
user.getAvatarData(size = AvatarSize.RoomListItem)
|
||||
}.toImmutableList(),
|
||||
isTombstoned = roomInfo.successorRoom != null,
|
||||
isSpace = roomInfo.isSpace,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ data class RoomListRoomSummary(
|
|||
val inviteSender: InviteSender?,
|
||||
val isTombstoned: Boolean,
|
||||
val heroes: ImmutableList<AvatarData>,
|
||||
val isSpace: Boolean,
|
||||
) {
|
||||
val isHighlighted = userDefinedNotificationMode != RoomNotificationMode.MUTE &&
|
||||
(numberOfUnreadNotifications > 0 || numberOfUnreadMentions > 0) ||
|
||||
|
|
|
|||
|
|
@ -102,6 +102,15 @@ open class RoomListRoomSummaryProvider : PreviewParameterProvider<RoomListRoomSu
|
|||
displayName = "Bob",
|
||||
),
|
||||
),
|
||||
aRoomListRoomSummary(
|
||||
name = "A space invite",
|
||||
displayType = RoomSummaryDisplayType.INVITE,
|
||||
inviteSender = anInviteSender(
|
||||
userId = UserId("@bob:matrix.org"),
|
||||
displayName = "Bob",
|
||||
),
|
||||
isSpace = true
|
||||
),
|
||||
aRoomListRoomSummary(
|
||||
name = "A knocked room",
|
||||
displayType = RoomSummaryDisplayType.KNOCKED,
|
||||
|
|
@ -151,6 +160,7 @@ internal fun aRoomListRoomSummary(
|
|||
canonicalAlias: RoomAlias? = null,
|
||||
heroes: List<AvatarData> = emptyList(),
|
||||
isTombstoned: Boolean = false,
|
||||
isSpace: Boolean = false,
|
||||
) = RoomListRoomSummary(
|
||||
id = id,
|
||||
roomId = RoomId(id),
|
||||
|
|
@ -172,4 +182,5 @@ internal fun aRoomListRoomSummary(
|
|||
canonicalAlias = canonicalAlias,
|
||||
heroes = heroes.toImmutableList(),
|
||||
isTombstoned = isTombstoned,
|
||||
isSpace = isSpace
|
||||
)
|
||||
|
|
|
|||
|
|
@ -85,6 +85,7 @@ internal fun createRoomListRoomSummary(
|
|||
heroes: List<AvatarData> = emptyList(),
|
||||
timestamp: String? = null,
|
||||
isTombstoned: Boolean = false,
|
||||
isSpace: Boolean = false,
|
||||
) = RoomListRoomSummary(
|
||||
id = A_ROOM_ID.value,
|
||||
roomId = A_ROOM_ID,
|
||||
|
|
@ -106,4 +107,5 @@ internal fun createRoomListRoomSummary(
|
|||
isDm = false,
|
||||
heroes = heroes.toPersistentList(),
|
||||
isTombstoned = isTombstoned,
|
||||
isSpace = isSpace
|
||||
)
|
||||
|
|
|
|||
|
|
@ -58,11 +58,12 @@ sealed interface RoomListFilter {
|
|||
data object Invite : RoomListFilter
|
||||
|
||||
/**
|
||||
* A filter that matches either Group or People rooms.
|
||||
* A filter that matches either Group,People rooms or Space.
|
||||
*/
|
||||
sealed interface Category : RoomListFilter {
|
||||
data object Group : Category
|
||||
data object People : Category
|
||||
data object Space : Category
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@ import org.matrix.rustcomponents.sdk.RoomList as InnerRoomList
|
|||
|
||||
private val ROOM_LIST_RUST_FILTERS = listOf(
|
||||
RoomListEntriesDynamicFilterKind.NonLeft,
|
||||
RoomListEntriesDynamicFilterKind.NonSpace,
|
||||
RoomListEntriesDynamicFilterKind.DeduplicateVersions
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -15,41 +15,57 @@ import io.element.android.libraries.matrix.api.roomlist.RoomSummary
|
|||
|
||||
val RoomListFilter.predicate
|
||||
get() = when (this) {
|
||||
is RoomListFilter.All -> { _: RoomSummary -> true }
|
||||
is RoomListFilter.Any -> { _: RoomSummary -> true }
|
||||
RoomListFilter.None -> { _: RoomSummary -> false }
|
||||
is RoomListFilter.All -> { roomSummary -> NonSpacePredicate(roomSummary) || IsInvitedPredicate(roomSummary) }
|
||||
is RoomListFilter.Any -> { roomSummary -> NonSpacePredicate(roomSummary) || IsInvitedPredicate(roomSummary) }
|
||||
RoomListFilter.None -> { _ -> false }
|
||||
RoomListFilter.Category.Group -> { roomSummary: RoomSummary ->
|
||||
!roomSummary.info.isDm && !roomSummary.isInvited()
|
||||
!roomSummary.info.isDm && NonInvitedPredicate(roomSummary) && NonSpacePredicate(roomSummary)
|
||||
}
|
||||
RoomListFilter.Category.People -> { roomSummary: RoomSummary ->
|
||||
roomSummary.info.isDm && !roomSummary.isInvited()
|
||||
roomSummary.info.isDm && NonInvitedPredicate(roomSummary) && NonSpacePredicate(roomSummary)
|
||||
}
|
||||
RoomListFilter.Category.Space -> IsSpacePredicate
|
||||
RoomListFilter.Favorite -> { roomSummary: RoomSummary ->
|
||||
roomSummary.info.isFavorite && !roomSummary.isInvited()
|
||||
roomSummary.info.isFavorite && NonInvitedPredicate(roomSummary) && NonSpacePredicate(roomSummary)
|
||||
}
|
||||
RoomListFilter.Unread -> { roomSummary: RoomSummary ->
|
||||
!roomSummary.isInvited() && (roomSummary.info.numUnreadNotifications > 0 || roomSummary.info.isMarkedUnread)
|
||||
NonInvitedPredicate(roomSummary) &&
|
||||
NonSpacePredicate(roomSummary) &&
|
||||
(roomSummary.info.numUnreadNotifications > 0 || roomSummary.info.isMarkedUnread)
|
||||
}
|
||||
is RoomListFilter.NormalizedMatchRoomName -> { roomSummary: RoomSummary ->
|
||||
roomSummary.info.name?.withoutAccents().orEmpty().contains(normalizedPattern, ignoreCase = true)
|
||||
}
|
||||
RoomListFilter.Invite -> { roomSummary: RoomSummary ->
|
||||
roomSummary.isInvited()
|
||||
roomSummary.info.name?.withoutAccents().orEmpty().contains(normalizedPattern, ignoreCase = true) &&
|
||||
(NonSpacePredicate(roomSummary) || IsInvitedPredicate(roomSummary))
|
||||
}
|
||||
RoomListFilter.Invite -> IsInvitedPredicate
|
||||
}
|
||||
|
||||
fun List<RoomSummary>.filter(filter: RoomListFilter): List<RoomSummary> {
|
||||
return when (filter) {
|
||||
is RoomListFilter.All -> {
|
||||
val predicates = filter.filters.map { it.predicate }
|
||||
val predicates = if (filter.filters.isNotEmpty()) {
|
||||
filter.filters.map { it.predicate }
|
||||
} else {
|
||||
listOf(filter.predicate)
|
||||
}
|
||||
filter { roomSummary -> predicates.all { it(roomSummary) } }
|
||||
}
|
||||
is RoomListFilter.Any -> {
|
||||
val predicates = filter.filters.map { it.predicate }
|
||||
val predicates = if (filter.filters.isNotEmpty()) {
|
||||
filter.filters.map { it.predicate }
|
||||
} else {
|
||||
listOf(filter.predicate)
|
||||
}
|
||||
filter { roomSummary -> predicates.any { it(roomSummary) } }
|
||||
}
|
||||
else -> filter(filter.predicate)
|
||||
}
|
||||
}
|
||||
|
||||
private fun RoomSummary.isInvited() = info.currentUserMembership == CurrentUserMembership.INVITED
|
||||
private val IsSpacePredicate = { roomSummary: RoomSummary -> roomSummary.info.isSpace }
|
||||
|
||||
private val NonSpacePredicate = { roomSummary: RoomSummary -> !IsSpacePredicate(roomSummary) }
|
||||
|
||||
private val IsInvitedPredicate = { roomSummary: RoomSummary -> roomSummary.info.currentUserMembership == CurrentUserMembership.INVITED }
|
||||
|
||||
private val NonInvitedPredicate = { roomSummary: RoomSummary -> !IsInvitedPredicate(roomSummary) }
|
||||
|
|
|
|||
|
|
@ -41,6 +41,14 @@ class RoomListFilterTest {
|
|||
currentUserMembership = CurrentUserMembership.INVITED
|
||||
)
|
||||
|
||||
private val space = aRoomSummary(
|
||||
isSpace = true
|
||||
)
|
||||
private val invitedSpace = aRoomSummary(
|
||||
isSpace = true,
|
||||
currentUserMembership = CurrentUserMembership.INVITED
|
||||
)
|
||||
|
||||
private val roomSummaries = listOf(
|
||||
regularRoom,
|
||||
dmRoom,
|
||||
|
|
@ -49,13 +57,15 @@ class RoomListFilterTest {
|
|||
unreadNotificationRoom,
|
||||
roomToSearch,
|
||||
roomWithAccent,
|
||||
invitedRoom
|
||||
invitedRoom,
|
||||
space,
|
||||
invitedSpace,
|
||||
)
|
||||
|
||||
@Test
|
||||
fun `Room list filter all empty`() = runTest {
|
||||
val filter = RoomListFilter.all()
|
||||
assertThat(roomSummaries.filter(filter)).isEqualTo(roomSummaries)
|
||||
assertThat(roomSummaries.filter(filter)).isEqualTo(roomSummaries - space)
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -83,6 +93,12 @@ class RoomListFilterTest {
|
|||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `Room list filter space`() = runTest {
|
||||
val filter = RoomListFilter.Category.Space
|
||||
assertThat(roomSummaries.filter(filter)).containsExactly(space, invitedSpace)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `Room list filter favorite`() = runTest {
|
||||
val filter = RoomListFilter.Favorite
|
||||
|
|
@ -98,7 +114,7 @@ class RoomListFilterTest {
|
|||
@Test
|
||||
fun `Room list filter invites`() = runTest {
|
||||
val filter = RoomListFilter.Invite
|
||||
assertThat(roomSummaries.filter(filter)).containsExactly(invitedRoom)
|
||||
assertThat(roomSummaries.filter(filter)).containsExactly(invitedRoom, invitedSpace)
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -136,10 +152,4 @@ class RoomListFilterTest {
|
|||
)
|
||||
assertThat(roomSummaries.filter(filter)).isEmpty()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `Room list filter all with empty list`() = runTest {
|
||||
val filter = RoomListFilter.all()
|
||||
assertThat(roomSummaries.filter(filter)).isEqualTo(roomSummaries)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1ad2d62e2ce270b8548ddf611c3b192e756be0896627ccad28fff84c4ce5e2a1
|
||||
size 11938
|
||||
oid sha256:98d4e9152dee861cc7afdb3efe57b086c3d9d58d38eeb1345749d31debbf6017
|
||||
size 21266
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:541b4210ff0acaf6451a0ce9c6cdc4f120c460086e036fc27e319daa23c7082b
|
||||
size 17393
|
||||
oid sha256:1ad2d62e2ce270b8548ddf611c3b192e756be0896627ccad28fff84c4ce5e2a1
|
||||
size 11938
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:697513adb4fa43d68e8a4477f248e68f64ba305f0ecb6a2e681b8a8b04ceee2b
|
||||
size 14823
|
||||
oid sha256:541b4210ff0acaf6451a0ce9c6cdc4f120c460086e036fc27e319daa23c7082b
|
||||
size 17393
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:697513adb4fa43d68e8a4477f248e68f64ba305f0ecb6a2e681b8a8b04ceee2b
|
||||
size 14823
|
||||
|
|
@ -1,3 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:f0c73cab66c885e528bd8723b14cfe28356f0843fd360164c2d6163833a9576b
|
||||
size 11999
|
||||
oid sha256:c24a3b08afe224e9919dd3818c72bd2ff8dd3f38663a6465a10b301ad91e8787
|
||||
size 20377
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:71e4c4f995456a5502fb057bbb37cebcb9b92af6edf315cff63f92b3541a30a2
|
||||
size 17234
|
||||
oid sha256:f0c73cab66c885e528bd8723b14cfe28356f0843fd360164c2d6163833a9576b
|
||||
size 11999
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:466ff5436718dd1871635330108c592ff28727c1628368c11387a9b1f5c73642
|
||||
size 14204
|
||||
oid sha256:71e4c4f995456a5502fb057bbb37cebcb9b92af6edf315cff63f92b3541a30a2
|
||||
size 17234
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:466ff5436718dd1871635330108c592ff28727c1628368c11387a9b1f5c73642
|
||||
size 14204
|
||||
Loading…
Add table
Add a link
Reference in a new issue