@@ -21,8 +21,8 @@ import kotlinx.coroutines.TimeoutCancellationException
21
21
import org.matrix.android.sdk.api.session.events.model.EventType
22
22
import org.matrix.android.sdk.api.session.room.failure.CreateRoomFailure
23
23
import org.matrix.android.sdk.api.session.room.model.LocalRoomCreationState
24
- import org.matrix.android.sdk.api.session.room.model.LocalRoomSummary
25
24
import org.matrix.android.sdk.api.session.room.model.RoomSummary
25
+ import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
26
26
import org.matrix.android.sdk.internal.database.awaitNotEmptyResult
27
27
import org.matrix.android.sdk.internal.database.model.EventEntity
28
28
import org.matrix.android.sdk.internal.database.model.EventEntityFields
@@ -57,56 +57,71 @@ internal class DefaultCreateRoomFromLocalRoomTask @Inject constructor(
57
57
58
58
override suspend fun execute (params : CreateRoomFromLocalRoomTask .Params ): String {
59
59
val localRoomSummary = roomSummaryDataSource.getLocalRoomSummary(params.localRoomId)
60
- ?.takeIf { it.createRoomParams != null && it.roomSummary != null }
61
- ? : error(" Invalid LocalRoomSummary for ${params.localRoomId} " )
60
+ ? : error(" ## CreateRoomFromLocalRoomTask - Cannot retrieve LocalRoomSummary with roomId ${params.localRoomId} " )
62
61
63
62
// If a room has already been created for the given local room, return the existing roomId
64
63
if (localRoomSummary.replacementRoomId != null ) {
65
64
return localRoomSummary.replacementRoomId
66
65
}
67
66
68
- return createRoom(localRoomSummary)
67
+ if (localRoomSummary.createRoomParams != null && localRoomSummary.roomSummary != null ) {
68
+ return createRoom(params.localRoomId, localRoomSummary.roomSummary, localRoomSummary.createRoomParams)
69
+ } else {
70
+ error(" ## CreateRoomFromLocalRoomTask - Invalid LocalRoomSummary: $localRoomSummary " )
71
+ }
69
72
}
70
73
71
- private suspend fun createRoom (localRoomSummary : LocalRoomSummary ): String {
72
- updateCreationState(localRoomSummary.roomId, LocalRoomCreationState .CREATING )
74
+ /* *
75
+ * Create a room on the server for the given local room.
76
+ *
77
+ * @param localRoomId the local room identifier.
78
+ * @param localRoomSummary the RoomSummary of the local room.
79
+ * @param createRoomParams the CreateRoomParams object which was used to configure the local room.
80
+ *
81
+ * @return the identifier of the created room.
82
+ */
83
+ private suspend fun createRoom (localRoomId : String , localRoomSummary : RoomSummary , createRoomParams : CreateRoomParams ): String {
84
+ updateCreationState(localRoomId, LocalRoomCreationState .CREATING )
73
85
val replacementRoomId = runCatching {
74
- createRoomTask.execute(localRoomSummary. createRoomParams!! )
86
+ createRoomTask.execute(createRoomParams)
75
87
}.fold(
76
88
{ it },
77
89
{
78
- updateCreationState(roomId = localRoomSummary.roomId , LocalRoomCreationState .FAILURE )
90
+ updateCreationState(localRoomId , LocalRoomCreationState .FAILURE )
79
91
throw it
80
92
}
81
93
)
82
- updateReplacementRoomId(localRoomSummary.roomId , replacementRoomId)
83
- waitForRoomEvents(replacementRoomId, localRoomSummary.roomSummary !! )
84
- updateCreationState(localRoomSummary.roomId , LocalRoomCreationState .CREATED )
94
+ updateReplacementRoomId(localRoomId , replacementRoomId)
95
+ waitForRoomEvents(replacementRoomId, localRoomSummary)
96
+ updateCreationState(localRoomId , LocalRoomCreationState .CREATED )
85
97
return replacementRoomId
86
98
}
87
99
88
100
/* *
89
101
* Wait for all the room events before triggering the created state.
102
+ *
103
+ * @param replacementRoomId the identifier of the created room
104
+ * @param localRoomSummary the RoomSummary of the local room.
90
105
*/
91
- private suspend fun waitForRoomEvents (replacementRoomId : String , roomSummary : RoomSummary ) {
106
+ private suspend fun waitForRoomEvents (replacementRoomId : String , localRoomSummary : RoomSummary ) {
92
107
try {
93
108
awaitNotEmptyResult(realmConfiguration, TimeUnit .MINUTES .toMillis(1L )) { realm ->
94
109
realm.where(RoomSummaryEntity ::class .java)
95
110
.equalTo(RoomSummaryEntityFields .ROOM_ID , replacementRoomId)
96
- .equalTo(RoomSummaryEntityFields .INVITED_MEMBERS_COUNT , roomSummary .invitedMembersCount)
111
+ .equalTo(RoomSummaryEntityFields .INVITED_MEMBERS_COUNT , localRoomSummary .invitedMembersCount)
97
112
}
98
113
awaitNotEmptyResult(realmConfiguration, TimeUnit .MINUTES .toMillis(1L )) { realm ->
99
114
EventEntity .whereRoomId(realm, replacementRoomId)
100
115
.equalTo(EventEntityFields .TYPE , EventType .STATE_ROOM_HISTORY_VISIBILITY )
101
116
}
102
- if (roomSummary .isEncrypted) {
117
+ if (localRoomSummary .isEncrypted) {
103
118
awaitNotEmptyResult(realmConfiguration, TimeUnit .MINUTES .toMillis(1L )) { realm ->
104
119
EventEntity .whereRoomId(realm, replacementRoomId)
105
120
.equalTo(EventEntityFields .TYPE , EventType .STATE_ROOM_ENCRYPTION )
106
121
}
107
122
}
108
123
} catch (exception: TimeoutCancellationException ) {
109
- updateCreationState(roomSummary .roomId, LocalRoomCreationState .FAILURE )
124
+ updateCreationState(localRoomSummary .roomId, LocalRoomCreationState .FAILURE )
110
125
throw CreateRoomFailure .CreatedWithTimeout (replacementRoomId)
111
126
}
112
127
}
0 commit comments