Skip to content

Commit 8c015da

Browse files
authored
Wait for a room with joined state in /sync after creating it (#3421)
1 parent 0713bb9 commit 8c015da

File tree

1 file changed

+11
-8
lines changed
  • libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl

1 file changed

+11
-8
lines changed

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

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import io.element.android.libraries.matrix.api.notification.NotificationService
2727
import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService
2828
import io.element.android.libraries.matrix.api.oidc.AccountManagementAction
2929
import io.element.android.libraries.matrix.api.pusher.PushersService
30+
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
3031
import io.element.android.libraries.matrix.api.room.MatrixRoom
3132
import io.element.android.libraries.matrix.api.room.MatrixRoomInfo
3233
import 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

Comments
 (0)