Skip to content

Commit d8ccbcf

Browse files
committed
Introduce LoadedDetails, different for Room and Space.
1 parent 67f9c24 commit d8ccbcf

File tree

6 files changed

+71
-56
lines changed

6 files changed

+71
-56
lines changed

features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenter.kt

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -255,8 +255,6 @@ private fun RoomPreviewInfo.toContentState(membershipDetails: RoomMembershipDeta
255255
topic = topic,
256256
alias = canonicalAlias,
257257
numberOfMembers = numberOfJoinedMembers,
258-
isDm = false,
259-
roomType = roomType,
260258
roomAvatarUrl = avatarUrl,
261259
joinAuthorisationStatus = computeJoinAuthorisationStatus(
262260
membership,
@@ -265,8 +263,16 @@ private fun RoomPreviewInfo.toContentState(membershipDetails: RoomMembershipDeta
265263
{ toInviteData() }
266264
),
267265
joinRule = joinRule,
268-
childrenCount = null,
269-
heroes = persistentListOf(),
266+
details = when (roomType) {
267+
is RoomType.Other,
268+
RoomType.Room -> LoadedDetails.Room(
269+
isDm = false,
270+
)
271+
RoomType.Space -> LoadedDetails.Space(
272+
childrenCount = 0,
273+
heroes = persistentListOf(),
274+
)
275+
}
270276
)
271277
}
272278

@@ -277,18 +283,18 @@ private fun SpaceRoom.toContentState(): ContentState {
277283
topic = topic,
278284
alias = canonicalAlias,
279285
numberOfMembers = numJoinedMembers.toLong(),
280-
isDm = false,
281-
roomType = roomType,
282286
roomAvatarUrl = avatarUrl,
283287
joinAuthorisationStatus = computeJoinAuthorisationStatus(
284288
membership = state,
285289
membershipDetails = null,
286290
joinRule = joinRule,
287291
inviteData = { toInviteData() }
288292
),
289-
childrenCount = childrenCount,
290293
joinRule = joinRule,
291-
heroes = heroes.toPersistentList(),
294+
details = LoadedDetails.Space(
295+
childrenCount = childrenCount,
296+
heroes = heroes.toPersistentList(),
297+
)
292298
)
293299
}
294300

@@ -300,15 +306,12 @@ internal fun RoomDescription.toContentState(): ContentState {
300306
topic = topic,
301307
alias = alias,
302308
numberOfMembers = numberOfMembers,
303-
isDm = false,
304-
roomType = RoomType.Room,
305309
roomAvatarUrl = avatarUrl,
306310
joinAuthorisationStatus = when (joinRule) {
307311
RoomDescription.JoinRule.KNOCK -> JoinAuthorisationStatus.CanKnock
308312
RoomDescription.JoinRule.PUBLIC -> JoinAuthorisationStatus.CanJoin
309313
else -> JoinAuthorisationStatus.Unknown
310314
},
311-
childrenCount = null,
312315
joinRule = when (joinRule) {
313316
RoomDescription.JoinRule.KNOCK -> JoinRule.Knock
314317
RoomDescription.JoinRule.PUBLIC -> JoinRule.Public
@@ -317,7 +320,7 @@ internal fun RoomDescription.toContentState(): ContentState {
317320
RoomDescription.JoinRule.INVITE -> JoinRule.Invite
318321
RoomDescription.JoinRule.UNKNOWN -> null
319322
},
320-
heroes = persistentListOf()
323+
details = LoadedDetails.Room(isDm = false)
321324
)
322325
}
323326

@@ -333,8 +336,6 @@ internal fun RoomInfo.toContentState(
333336
topic = topic,
334337
alias = canonicalAlias,
335338
numberOfMembers = joinedMembersCountOverride ?: joinedMembersCount,
336-
isDm = isDm,
337-
roomType = if (isSpace) RoomType.Space else RoomType.Room,
338339
roomAvatarUrl = avatarUrl,
339340
joinAuthorisationStatus = computeJoinAuthorisationStatus(
340341
membership = currentUserMembership,
@@ -343,8 +344,16 @@ internal fun RoomInfo.toContentState(
343344
inviteData = { toInviteData() }
344345
),
345346
joinRule = joinRule,
346-
childrenCount = childrenCount,
347-
heroes = heroes
347+
details = if (isSpace) {
348+
LoadedDetails.Space(
349+
childrenCount = childrenCount ?: 0,
350+
heroes = heroes,
351+
)
352+
} else {
353+
LoadedDetails.Room(
354+
isDm = isDm,
355+
)
356+
},
348357
)
349358
}
350359

features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomState.kt

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarSize
1616
import io.element.android.libraries.matrix.api.core.RoomAlias
1717
import io.element.android.libraries.matrix.api.core.RoomId
1818
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
19-
import io.element.android.libraries.matrix.api.room.RoomType
2019
import io.element.android.libraries.matrix.api.room.join.JoinRoom
2120
import io.element.android.libraries.matrix.api.room.join.JoinRule
2221
import io.element.android.libraries.matrix.api.user.MatrixUser
@@ -77,16 +76,13 @@ sealed interface ContentState {
7776
val topic: String?,
7877
val alias: RoomAlias?,
7978
val numberOfMembers: Long?,
80-
val isDm: Boolean,
81-
val roomType: RoomType,
8279
val roomAvatarUrl: String?,
8380
val joinAuthorisationStatus: JoinAuthorisationStatus,
8481
val joinRule: JoinRule?,
85-
val childrenCount: Int?,
86-
val heroes: ImmutableList<MatrixUser>,
82+
val details: LoadedDetails,
8783
) : ContentState {
8884
val showMemberCount = numberOfMembers != null
89-
val isSpace = roomType is RoomType.Space
85+
val isSpace = details is LoadedDetails.Space
9086

9187
fun avatarData(size: AvatarSize): AvatarData {
9288
return AvatarData(
@@ -99,6 +95,18 @@ sealed interface ContentState {
9995
}
10096
}
10197

98+
@Immutable
99+
sealed interface LoadedDetails {
100+
data class Room(
101+
val isDm: Boolean,
102+
) : LoadedDetails
103+
104+
data class Space(
105+
val childrenCount: Int,
106+
val heroes: ImmutableList<MatrixUser>,
107+
) : LoadedDetails
108+
}
109+
102110
sealed interface JoinAuthorisationStatus {
103111
data object None : JoinAuthorisationStatus
104112
data class IsInvited(val inviteData: InviteData, val inviteSender: InviteSender?) : JoinAuthorisationStatus

features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomStateProvider.kt

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
2020
import io.element.android.libraries.matrix.api.core.UserId
2121
import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias
2222
import io.element.android.libraries.matrix.api.exception.ClientException
23-
import io.element.android.libraries.matrix.api.room.RoomType
2423
import io.element.android.libraries.matrix.api.room.join.JoinRoom
2524
import io.element.android.libraries.matrix.api.room.join.JoinRule
2625
import io.element.android.libraries.matrix.api.user.MatrixUser
@@ -80,14 +79,17 @@ open class JoinRoomStateProvider : PreviewParameterProvider<JoinRoomState> {
8079
name = "A space",
8180
alias = null,
8281
topic = "This is the topic of a space",
83-
roomType = RoomType.Space,
84-
childrenCount = 42,
82+
details = aLoadedDetailsSpace(
83+
childrenCount = 42,
84+
),
8585
)
8686
),
8787
aJoinRoomState(
8888
contentState = aLoadedContentState(
8989
name = "A DM",
90-
isDm = true,
90+
details = aLoadedDetailsRoom(
91+
isDm = true,
92+
),
9193
)
9294
),
9395
aJoinRoomState(
@@ -160,25 +162,33 @@ fun aLoadedContentState(
160162
alias: RoomAlias? = RoomAlias("#exa:matrix.org"),
161163
topic: String? = "Element X is a secure, private and decentralized messenger.",
162164
numberOfMembers: Long? = null,
163-
isDm: Boolean = false,
164-
roomType: RoomType = RoomType.Room,
165165
roomAvatarUrl: String? = null,
166166
joinAuthorisationStatus: JoinAuthorisationStatus = JoinAuthorisationStatus.Unknown,
167-
childrenCount: Int? = null,
168167
joinRule: JoinRule? = null,
169-
heroes: List<MatrixUser> = emptyList()
168+
details: LoadedDetails = aLoadedDetailsRoom(isDm = false),
170169
) = ContentState.Loaded(
171170
roomId = roomId,
172171
name = name,
173172
alias = alias,
174173
topic = topic,
175174
numberOfMembers = numberOfMembers,
176-
isDm = isDm,
177-
roomType = roomType,
178175
roomAvatarUrl = roomAvatarUrl,
179176
joinAuthorisationStatus = joinAuthorisationStatus,
180-
childrenCount = childrenCount,
181177
joinRule = joinRule,
178+
details = details,
179+
)
180+
181+
fun aLoadedDetailsRoom(
182+
isDm: Boolean = false,
183+
) = LoadedDetails.Room(
184+
isDm = isDm
185+
)
186+
187+
fun aLoadedDetailsSpace(
188+
childrenCount: Int = 0,
189+
heroes: List<MatrixUser> = emptyList(),
190+
) = LoadedDetails.Space(
191+
childrenCount = childrenCount,
182192
heroes = heroes.toPersistentList()
183193
)
184194

features/joinroom/impl/src/main/kotlin/io/element/android/features/joinroom/impl/JoinRoomView.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -566,10 +566,10 @@ private fun DefaultLoadedContent(
566566
},
567567
subtitle = {
568568
when {
569-
contentState.isSpace -> {
569+
contentState.details is LoadedDetails.Space -> {
570570
SpaceInfoRow(
571571
joinRule = contentState.joinRule ?: JoinRule.Public,
572-
numberOfRooms = contentState.childrenCount ?: 0,
572+
numberOfRooms = contentState.details.childrenCount,
573573
)
574574
}
575575
contentState.alias != null -> {

features/joinroom/impl/src/test/kotlin/io/element/android/features/joinroom/impl/JoinRoomPresenterTest.kt

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import io.element.android.libraries.matrix.api.exception.ClientException
3333
import io.element.android.libraries.matrix.api.exception.ErrorKind
3434
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
3535
import io.element.android.libraries.matrix.api.room.RoomMembershipDetails
36-
import io.element.android.libraries.matrix.api.room.RoomType
3736
import io.element.android.libraries.matrix.api.room.join.JoinRoom
3837
import io.element.android.libraries.matrix.api.room.join.JoinRule
3938
import io.element.android.libraries.matrix.test.AN_EXCEPTION
@@ -111,7 +110,7 @@ class JoinRoomPresenterTest {
111110
assertThat(contentState.topic).isEqualTo(roomInfo.topic)
112111
assertThat(contentState.alias).isEqualTo(roomInfo.canonicalAlias)
113112
assertThat(contentState.numberOfMembers).isEqualTo(roomInfo.joinedMembersCount)
114-
assertThat(contentState.isDm).isEqualTo(roomInfo.isDirect)
113+
assertThat(contentState.details).isEqualTo(aLoadedDetailsRoom(isDm = roomInfo.isDirect))
115114
assertThat(contentState.roomAvatarUrl).isEqualTo(roomInfo.avatarUrl)
116115
}
117116
}
@@ -464,7 +463,7 @@ class JoinRoomPresenterTest {
464463
assertThat(contentState.topic).isEqualTo(roomDescription.topic)
465464
assertThat(contentState.alias).isEqualTo(roomDescription.alias)
466465
assertThat(contentState.numberOfMembers).isEqualTo(roomDescription.numberOfMembers)
467-
assertThat(contentState.isDm).isFalse()
466+
assertThat(contentState.details).isEqualTo(aLoadedDetailsRoom(isDm = false))
468467
assertThat(contentState.roomAvatarUrl).isEqualTo(roomDescription.avatarUrl)
469468
}
470469
}
@@ -708,13 +707,10 @@ class JoinRoomPresenterTest {
708707
topic = "Room topic",
709708
alias = RoomAlias("#alias:matrix.org"),
710709
numberOfMembers = 2,
711-
isDm = false,
712-
roomType = RoomType.Room,
713710
roomAvatarUrl = "avatarUrl",
714711
joinAuthorisationStatus = JoinAuthorisationStatus.CanJoin,
715712
joinRule = JoinRule.Public,
716-
childrenCount = null,
717-
heroes = persistentListOf()
713+
details = aLoadedDetailsRoom(isDm = false),
718714
)
719715
)
720716
}
@@ -762,8 +758,6 @@ class JoinRoomPresenterTest {
762758
topic = "Room topic",
763759
alias = RoomAlias("#alias:matrix.org"),
764760
numberOfMembers = 2,
765-
isDm = false,
766-
roomType = RoomType.Room,
767761
roomAvatarUrl = "avatarUrl",
768762
joinAuthorisationStatus = JoinAuthorisationStatus.IsInvited(
769763
inviteData = InviteData(
@@ -783,8 +777,7 @@ class JoinRoomPresenterTest {
783777
),
784778
),
785779
joinRule = JoinRule.Public,
786-
childrenCount = null,
787-
heroes = persistentListOf()
780+
details = aLoadedDetailsRoom(isDm = false),
788781
)
789782
)
790783
}
@@ -834,8 +827,6 @@ class JoinRoomPresenterTest {
834827
topic = "Room topic",
835828
alias = RoomAlias("#alias:matrix.org"),
836829
numberOfMembers = 2,
837-
isDm = false,
838-
roomType = RoomType.Room,
839830
roomAvatarUrl = "avatarUrl",
840831
joinAuthorisationStatus = JoinAuthorisationStatus.IsBanned(
841832
banSender = InviteSender(
@@ -851,8 +842,7 @@ class JoinRoomPresenterTest {
851842
reason = null,
852843
),
853844
joinRule = JoinRule.Public,
854-
childrenCount = null,
855-
heroes = persistentListOf()
845+
details = aLoadedDetailsRoom(isDm = false),
856846
)
857847
)
858848
}
@@ -900,13 +890,10 @@ class JoinRoomPresenterTest {
900890
topic = "Room topic",
901891
alias = RoomAlias("#alias:matrix.org"),
902892
numberOfMembers = 2,
903-
isDm = false,
904-
roomType = RoomType.Room,
905893
roomAvatarUrl = "avatarUrl",
906894
joinAuthorisationStatus = JoinAuthorisationStatus.IsKnocked,
907895
joinRule = JoinRule.Public,
908-
childrenCount = null,
909-
heroes = persistentListOf()
896+
details = aLoadedDetailsRoom(isDm = false),
910897
)
911898
)
912899
}

libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/spaces/RustSpaceRoomListTest.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import kotlinx.coroutines.test.runTest
2626
import org.junit.Test
2727
import org.matrix.rustcomponents.sdk.SpaceListUpdate
2828
import uniffi.matrix_sdk_ui.SpaceRoomListPaginationState
29+
import kotlin.jvm.optionals.getOrNull
2930
import org.matrix.rustcomponents.sdk.SpaceRoomList as InnerSpaceRoomList
3031

3132
class RustSpaceRoomListTest {
@@ -93,10 +94,10 @@ class RustSpaceRoomListTest {
9394
spaceRoomCache = spaceRoomCache,
9495
)
9596
sut.currentSpaceFlow().test {
96-
assertThat(awaitItem()).isNull()
97+
assertThat(awaitItem().getOrNull()).isNull()
9798
val spaceRoom = aSpaceRoom(roomId = A_ROOM_ID)
9899
spaceRoomCache.update(listOf(spaceRoom))
99-
assertThat(awaitItem()).isEqualTo(spaceRoom)
100+
assertThat(awaitItem().getOrNull()).isEqualTo(spaceRoom)
100101
}
101102
}
102103

0 commit comments

Comments
 (0)