@@ -18,14 +18,17 @@ package org.matrix.android.sdk.internal.session.room.create
1818
1919import com.zhuinden.monarchy.Monarchy
2020import io.realm.Realm
21+ import io.realm.RealmConfiguration
2122import io.realm.kotlin.createObject
23+ import kotlinx.coroutines.TimeoutCancellationException
2224import org.matrix.android.sdk.api.extensions.orFalse
2325import org.matrix.android.sdk.api.extensions.tryOrNull
2426import org.matrix.android.sdk.api.session.events.model.Content
2527import org.matrix.android.sdk.api.session.events.model.Event
2628import org.matrix.android.sdk.api.session.events.model.EventType
2729import org.matrix.android.sdk.api.session.events.model.LocalEcho
2830import org.matrix.android.sdk.api.session.events.model.toContent
31+ import org.matrix.android.sdk.api.session.room.failure.CreateRoomFailure
2932import org.matrix.android.sdk.api.session.room.model.GuestAccess
3033import org.matrix.android.sdk.api.session.room.model.Membership
3134import org.matrix.android.sdk.api.session.room.model.RoomDirectoryVisibility
@@ -38,6 +41,7 @@ import org.matrix.android.sdk.api.session.room.send.SendState
3841import org.matrix.android.sdk.api.session.sync.model.RoomSyncSummary
3942import org.matrix.android.sdk.api.session.user.UserService
4043import org.matrix.android.sdk.api.session.user.model.User
44+ import org.matrix.android.sdk.internal.database.awaitNotEmptyResult
4145import org.matrix.android.sdk.internal.database.helper.addTimelineEvent
4246import org.matrix.android.sdk.internal.database.mapper.asDomain
4347import org.matrix.android.sdk.internal.database.mapper.toEntity
@@ -47,6 +51,7 @@ import org.matrix.android.sdk.internal.database.model.EventInsertType
4751import org.matrix.android.sdk.internal.database.model.RoomEntity
4852import org.matrix.android.sdk.internal.database.model.RoomMembersLoadStatusType
4953import org.matrix.android.sdk.internal.database.model.RoomSummaryEntity
54+ import org.matrix.android.sdk.internal.database.model.RoomSummaryEntityFields
5055import org.matrix.android.sdk.internal.database.query.copyToRealmOrIgnore
5156import org.matrix.android.sdk.internal.database.query.getOrCreate
5257import org.matrix.android.sdk.internal.database.query.getOrNull
@@ -59,6 +64,7 @@ import org.matrix.android.sdk.internal.session.room.timeline.PaginationDirection
5964import org.matrix.android.sdk.internal.task.Task
6065import org.matrix.android.sdk.internal.util.awaitTransaction
6166import org.matrix.android.sdk.internal.util.time.Clock
67+ import java.util.concurrent.TimeUnit
6268import javax.inject.Inject
6369
6470internal interface CreateLocalRoomTask : Task <CreateRoomParams , String >
@@ -68,6 +74,7 @@ internal class DefaultCreateLocalRoomTask @Inject constructor(
6874 @SessionDatabase private val monarchy : Monarchy ,
6975 private val roomMemberEventHandler : RoomMemberEventHandler ,
7076 private val roomSummaryUpdater : RoomSummaryUpdater ,
77+ @SessionDatabase private val realmConfiguration : RealmConfiguration ,
7178 private val createRoomBodyBuilder : CreateRoomBodyBuilder ,
7279 private val userService : UserService ,
7380 private val clock : Clock ,
@@ -81,8 +88,16 @@ internal class DefaultCreateLocalRoomTask @Inject constructor(
8188 createLocalRoomSummaryEntity(realm, roomId, createRoomBody)
8289 }
8390
84- // Ensure that Realm is up to date before returning the roomId.
85- monarchy.doWithRealm { it.refresh() }
91+ // Wait for room to be created in DB
92+ try {
93+ awaitNotEmptyResult(realmConfiguration, TimeUnit .MINUTES .toMillis(1L )) { realm ->
94+ realm.where(RoomSummaryEntity ::class .java)
95+ .equalTo(RoomSummaryEntityFields .ROOM_ID , roomId)
96+ .equalTo(RoomSummaryEntityFields .MEMBERSHIP_STR , Membership .JOIN .name)
97+ }
98+ } catch (exception: TimeoutCancellationException ) {
99+ throw CreateRoomFailure .CreatedWithTimeout (roomId)
100+ }
86101
87102 return roomId
88103 }
0 commit comments