Skip to content

Commit 0bec8f0

Browse files
authored
Merge pull request #5449 from element-hq/feature/fga/room_list_space_invite
Room list space invite
2 parents f3ade6f + 080280a commit 0bec8f0

File tree

17 files changed

+92
-41
lines changed

17 files changed

+92
-41
lines changed

features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryRow.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,10 +189,14 @@ private fun RoomSummaryScaffoldRow(
189189
) {
190190
Avatar(
191191
avatarData = room.avatarData,
192-
avatarType = AvatarType.Room(
193-
heroes = room.heroes,
194-
isTombstoned = room.isTombstoned,
195-
),
192+
avatarType = if (room.isSpace) {
193+
AvatarType.Space(isTombstoned = room.isTombstoned)
194+
} else {
195+
AvatarType.Room(
196+
heroes = room.heroes,
197+
isTombstoned = room.isTombstoned,
198+
)
199+
},
196200
hideImage = hideAvatarImage,
197201
)
198202
Spacer(modifier = Modifier.width(16.dp))

features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListRoomSummaryFactory.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ class RoomListRoomSummaryFactory(
6969
user.getAvatarData(size = AvatarSize.RoomListItem)
7070
}.toImmutableList(),
7171
isTombstoned = roomInfo.successorRoom != null,
72+
isSpace = roomInfo.isSpace,
7273
)
7374
}
7475
}

features/home/impl/src/main/kotlin/io/element/android/features/home/impl/model/RoomListRoomSummary.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ data class RoomListRoomSummary(
3838
val inviteSender: InviteSender?,
3939
val isTombstoned: Boolean,
4040
val heroes: ImmutableList<AvatarData>,
41+
val isSpace: Boolean,
4142
) {
4243
val isHighlighted = userDefinedNotificationMode != RoomNotificationMode.MUTE &&
4344
(numberOfUnreadNotifications > 0 || numberOfUnreadMentions > 0) ||

features/home/impl/src/main/kotlin/io/element/android/features/home/impl/model/RoomListRoomSummaryProvider.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,15 @@ open class RoomListRoomSummaryProvider : PreviewParameterProvider<RoomListRoomSu
102102
displayName = "Bob",
103103
),
104104
),
105+
aRoomListRoomSummary(
106+
name = "A space invite",
107+
displayType = RoomSummaryDisplayType.INVITE,
108+
inviteSender = anInviteSender(
109+
userId = UserId("@bob:matrix.org"),
110+
displayName = "Bob",
111+
),
112+
isSpace = true
113+
),
105114
aRoomListRoomSummary(
106115
name = "A knocked room",
107116
displayType = RoomSummaryDisplayType.KNOCKED,
@@ -151,6 +160,7 @@ internal fun aRoomListRoomSummary(
151160
canonicalAlias: RoomAlias? = null,
152161
heroes: List<AvatarData> = emptyList(),
153162
isTombstoned: Boolean = false,
163+
isSpace: Boolean = false,
154164
) = RoomListRoomSummary(
155165
id = id,
156166
roomId = RoomId(id),
@@ -172,4 +182,5 @@ internal fun aRoomListRoomSummary(
172182
canonicalAlias = canonicalAlias,
173183
heroes = heroes.toImmutableList(),
174184
isTombstoned = isTombstoned,
185+
isSpace = isSpace
175186
)

features/home/impl/src/test/kotlin/io/element/android/features/home/impl/model/RoomListBaseRoomSummaryTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ internal fun createRoomListRoomSummary(
8585
heroes: List<AvatarData> = emptyList(),
8686
timestamp: String? = null,
8787
isTombstoned: Boolean = false,
88+
isSpace: Boolean = false,
8889
) = RoomListRoomSummary(
8990
id = A_ROOM_ID.value,
9091
roomId = A_ROOM_ID,
@@ -106,4 +107,5 @@ internal fun createRoomListRoomSummary(
106107
isDm = false,
107108
heroes = heroes.toPersistentList(),
108109
isTombstoned = isTombstoned,
110+
isSpace = isSpace
109111
)

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,12 @@ sealed interface RoomListFilter {
5858
data object Invite : RoomListFilter
5959

6060
/**
61-
* A filter that matches either Group or People rooms.
61+
* A filter that matches either Group,People rooms or Space.
6262
*/
6363
sealed interface Category : RoomListFilter {
6464
data object Group : Category
6565
data object People : Category
66+
data object Space : Category
6667
}
6768

6869
/**

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import org.matrix.rustcomponents.sdk.RoomList as InnerRoomList
2929

3030
private val ROOM_LIST_RUST_FILTERS = listOf(
3131
RoomListEntriesDynamicFilterKind.NonLeft,
32-
RoomListEntriesDynamicFilterKind.NonSpace,
3332
RoomListEntriesDynamicFilterKind.DeduplicateVersions
3433
)
3534

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

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,41 +15,57 @@ import io.element.android.libraries.matrix.api.roomlist.RoomSummary
1515

1616
val RoomListFilter.predicate
1717
get() = when (this) {
18-
is RoomListFilter.All -> { _: RoomSummary -> true }
19-
is RoomListFilter.Any -> { _: RoomSummary -> true }
20-
RoomListFilter.None -> { _: RoomSummary -> false }
18+
is RoomListFilter.All -> { roomSummary -> NonSpacePredicate(roomSummary) || IsInvitedPredicate(roomSummary) }
19+
is RoomListFilter.Any -> { roomSummary -> NonSpacePredicate(roomSummary) || IsInvitedPredicate(roomSummary) }
20+
RoomListFilter.None -> { _ -> false }
2121
RoomListFilter.Category.Group -> { roomSummary: RoomSummary ->
22-
!roomSummary.info.isDm && !roomSummary.isInvited()
22+
!roomSummary.info.isDm && NonInvitedPredicate(roomSummary) && NonSpacePredicate(roomSummary)
2323
}
2424
RoomListFilter.Category.People -> { roomSummary: RoomSummary ->
25-
roomSummary.info.isDm && !roomSummary.isInvited()
25+
roomSummary.info.isDm && NonInvitedPredicate(roomSummary) && NonSpacePredicate(roomSummary)
2626
}
27+
RoomListFilter.Category.Space -> IsSpacePredicate
2728
RoomListFilter.Favorite -> { roomSummary: RoomSummary ->
28-
roomSummary.info.isFavorite && !roomSummary.isInvited()
29+
roomSummary.info.isFavorite && NonInvitedPredicate(roomSummary) && NonSpacePredicate(roomSummary)
2930
}
3031
RoomListFilter.Unread -> { roomSummary: RoomSummary ->
31-
!roomSummary.isInvited() && (roomSummary.info.numUnreadNotifications > 0 || roomSummary.info.isMarkedUnread)
32+
NonInvitedPredicate(roomSummary) &&
33+
NonSpacePredicate(roomSummary) &&
34+
(roomSummary.info.numUnreadNotifications > 0 || roomSummary.info.isMarkedUnread)
3235
}
3336
is RoomListFilter.NormalizedMatchRoomName -> { roomSummary: RoomSummary ->
34-
roomSummary.info.name?.withoutAccents().orEmpty().contains(normalizedPattern, ignoreCase = true)
35-
}
36-
RoomListFilter.Invite -> { roomSummary: RoomSummary ->
37-
roomSummary.isInvited()
37+
roomSummary.info.name?.withoutAccents().orEmpty().contains(normalizedPattern, ignoreCase = true) &&
38+
(NonSpacePredicate(roomSummary) || IsInvitedPredicate(roomSummary))
3839
}
40+
RoomListFilter.Invite -> IsInvitedPredicate
3941
}
4042

4143
fun List<RoomSummary>.filter(filter: RoomListFilter): List<RoomSummary> {
4244
return when (filter) {
4345
is RoomListFilter.All -> {
44-
val predicates = filter.filters.map { it.predicate }
46+
val predicates = if (filter.filters.isNotEmpty()) {
47+
filter.filters.map { it.predicate }
48+
} else {
49+
listOf(filter.predicate)
50+
}
4551
filter { roomSummary -> predicates.all { it(roomSummary) } }
4652
}
4753
is RoomListFilter.Any -> {
48-
val predicates = filter.filters.map { it.predicate }
54+
val predicates = if (filter.filters.isNotEmpty()) {
55+
filter.filters.map { it.predicate }
56+
} else {
57+
listOf(filter.predicate)
58+
}
4959
filter { roomSummary -> predicates.any { it(roomSummary) } }
5060
}
5161
else -> filter(filter.predicate)
5262
}
5363
}
5464

55-
private fun RoomSummary.isInvited() = info.currentUserMembership == CurrentUserMembership.INVITED
65+
private val IsSpacePredicate = { roomSummary: RoomSummary -> roomSummary.info.isSpace }
66+
67+
private val NonSpacePredicate = { roomSummary: RoomSummary -> !IsSpacePredicate(roomSummary) }
68+
69+
private val IsInvitedPredicate = { roomSummary: RoomSummary -> roomSummary.info.currentUserMembership == CurrentUserMembership.INVITED }
70+
71+
private val NonInvitedPredicate = { roomSummary: RoomSummary -> !IsInvitedPredicate(roomSummary) }

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

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,14 @@ class RoomListFilterTest {
4141
currentUserMembership = CurrentUserMembership.INVITED
4242
)
4343

44+
private val space = aRoomSummary(
45+
isSpace = true
46+
)
47+
private val invitedSpace = aRoomSummary(
48+
isSpace = true,
49+
currentUserMembership = CurrentUserMembership.INVITED
50+
)
51+
4452
private val roomSummaries = listOf(
4553
regularRoom,
4654
dmRoom,
@@ -49,13 +57,15 @@ class RoomListFilterTest {
4957
unreadNotificationRoom,
5058
roomToSearch,
5159
roomWithAccent,
52-
invitedRoom
60+
invitedRoom,
61+
space,
62+
invitedSpace,
5363
)
5464

5565
@Test
5666
fun `Room list filter all empty`() = runTest {
5767
val filter = RoomListFilter.all()
58-
assertThat(roomSummaries.filter(filter)).isEqualTo(roomSummaries)
68+
assertThat(roomSummaries.filter(filter)).isEqualTo(roomSummaries - space)
5969
}
6070

6171
@Test
@@ -83,6 +93,12 @@ class RoomListFilterTest {
8393
)
8494
}
8595

96+
@Test
97+
fun `Room list filter space`() = runTest {
98+
val filter = RoomListFilter.Category.Space
99+
assertThat(roomSummaries.filter(filter)).containsExactly(space, invitedSpace)
100+
}
101+
86102
@Test
87103
fun `Room list filter favorite`() = runTest {
88104
val filter = RoomListFilter.Favorite
@@ -98,7 +114,7 @@ class RoomListFilterTest {
98114
@Test
99115
fun `Room list filter invites`() = runTest {
100116
val filter = RoomListFilter.Invite
101-
assertThat(roomSummaries.filter(filter)).containsExactly(invitedRoom)
117+
assertThat(roomSummaries.filter(filter)).containsExactly(invitedRoom, invitedSpace)
102118
}
103119

104120
@Test
@@ -136,10 +152,4 @@ class RoomListFilterTest {
136152
)
137153
assertThat(roomSummaries.filter(filter)).isEmpty()
138154
}
139-
140-
@Test
141-
fun `Room list filter all with empty list`() = runTest {
142-
val filter = RoomListFilter.all()
143-
assertThat(roomSummaries.filter(filter)).isEqualTo(roomSummaries)
144-
}
145155
}
Lines changed: 2 additions & 2 deletions
Loading

0 commit comments

Comments
 (0)