@@ -27,6 +27,7 @@ import io.element.android.libraries.matrix.api.notification.NotificationService
2727import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService
2828import io.element.android.libraries.matrix.api.oidc.AccountManagementAction
2929import io.element.android.libraries.matrix.api.pusher.PushersService
30+ import io.element.android.libraries.matrix.api.room.CurrentUserMembership
3031import io.element.android.libraries.matrix.api.room.MatrixRoom
3132import io.element.android.libraries.matrix.api.room.MatrixRoomInfo
3233import io.element.android.libraries.matrix.api.room.RoomMembershipObserver
@@ -245,18 +246,20 @@ class RustMatrixClient(
245246 }
246247
247248 /* *
248- * Wait for the room to be available in the room list.
249+ * Wait for the room to be available in the room list, with a membership for the current user of [CurrentUserMembership.JOINED] .
249250 * @param roomIdOrAlias the room id or alias to wait for
250251 * @param timeout the timeout to wait for the room to be available
251252 * @throws TimeoutCancellationException if the room is not available after the timeout
252253 */
253- private suspend fun awaitRoom (roomIdOrAlias : RoomIdOrAlias , timeout : Duration ): RoomSummary {
254+ private suspend fun awaitJoinedRoom (roomIdOrAlias : RoomIdOrAlias , timeout : Duration ): RoomSummary {
254255 val predicate: (List <RoomSummary >) -> Boolean = when (roomIdOrAlias) {
255256 is RoomIdOrAlias .Alias -> { roomSummaries: List <RoomSummary > ->
256- roomSummaries.flatMap { it.aliases }.contains(roomIdOrAlias.roomAlias)
257+ val found = roomSummaries.find { it.aliases.contains(roomIdOrAlias.roomAlias) }
258+ found != null && found.currentUserMembership == CurrentUserMembership .JOINED
257259 }
258260 is RoomIdOrAlias .Id -> { roomSummaries: List <RoomSummary > ->
259- roomSummaries.map { it.roomId }.contains(roomIdOrAlias.roomId)
261+ val found = roomSummaries.find { it.roomId == roomIdOrAlias.roomId }
262+ found != null && found.currentUserMembership == CurrentUserMembership .JOINED
260263 }
261264 }
262265 return withTimeout(timeout) {
@@ -306,7 +309,7 @@ class RustMatrixClient(
306309 val roomId = RoomId (client.createRoom(rustParams))
307310 // Wait to receive the room back from the sync but do not returns failure if it fails.
308311 try {
309- awaitRoom (roomId.toRoomIdOrAlias(), 30 .seconds)
312+ awaitJoinedRoom (roomId.toRoomIdOrAlias(), 30 .seconds)
310313 } catch (e: Exception ) {
311314 Timber .e(e, " Timeout waiting for the room to be available in the room list" )
312315 }
@@ -361,7 +364,7 @@ class RustMatrixClient(
361364 runCatching {
362365 client.joinRoomById(roomId.value).destroy()
363366 try {
364- awaitRoom (roomId.toRoomIdOrAlias(), 10 .seconds)
367+ awaitJoinedRoom (roomId.toRoomIdOrAlias(), 10 .seconds)
365368 } catch (e: Exception ) {
366369 Timber .e(e, " Timeout waiting for the room to be available in the room list" )
367370 null
@@ -376,7 +379,7 @@ class RustMatrixClient(
376379 serverNames = serverNames,
377380 ).destroy()
378381 try {
379- awaitRoom (roomIdOrAlias, 10 .seconds)
382+ awaitJoinedRoom (roomIdOrAlias, 10 .seconds)
380383 } catch (e: Exception ) {
381384 Timber .e(e, " Timeout waiting for the room to be available in the room list" )
382385 null
@@ -503,7 +506,7 @@ class RustMatrixClient(
503506 var room = getRoom(roomId)
504507 if (room == null ) {
505508 emit(Optional .empty())
506- awaitRoom (roomId.toRoomIdOrAlias(), INFINITE )
509+ awaitJoinedRoom (roomId.toRoomIdOrAlias(), INFINITE )
507510 room = getRoom(roomId)
508511 }
509512 room?.use {
0 commit comments