mirror of
https://github.com/SchildiChat/SchildiChat-android.git
synced 2024-11-25 10:55:55 +03:00
Improve nullability check in CreateRoomFromLocalRoomTask
This commit is contained in:
parent
3f88811590
commit
eac74bda09
1 changed files with 30 additions and 15 deletions
|
@ -21,8 +21,8 @@ import kotlinx.coroutines.TimeoutCancellationException
|
||||||
import org.matrix.android.sdk.api.session.events.model.EventType
|
import org.matrix.android.sdk.api.session.events.model.EventType
|
||||||
import org.matrix.android.sdk.api.session.room.failure.CreateRoomFailure
|
import org.matrix.android.sdk.api.session.room.failure.CreateRoomFailure
|
||||||
import org.matrix.android.sdk.api.session.room.model.LocalRoomCreationState
|
import org.matrix.android.sdk.api.session.room.model.LocalRoomCreationState
|
||||||
import org.matrix.android.sdk.api.session.room.model.LocalRoomSummary
|
|
||||||
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
||||||
|
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
|
||||||
import org.matrix.android.sdk.internal.database.awaitNotEmptyResult
|
import org.matrix.android.sdk.internal.database.awaitNotEmptyResult
|
||||||
import org.matrix.android.sdk.internal.database.model.EventEntity
|
import org.matrix.android.sdk.internal.database.model.EventEntity
|
||||||
import org.matrix.android.sdk.internal.database.model.EventEntityFields
|
import org.matrix.android.sdk.internal.database.model.EventEntityFields
|
||||||
|
@ -57,56 +57,71 @@ internal class DefaultCreateRoomFromLocalRoomTask @Inject constructor(
|
||||||
|
|
||||||
override suspend fun execute(params: CreateRoomFromLocalRoomTask.Params): String {
|
override suspend fun execute(params: CreateRoomFromLocalRoomTask.Params): String {
|
||||||
val localRoomSummary = roomSummaryDataSource.getLocalRoomSummary(params.localRoomId)
|
val localRoomSummary = roomSummaryDataSource.getLocalRoomSummary(params.localRoomId)
|
||||||
?.takeIf { it.createRoomParams != null && it.roomSummary != null }
|
?: error("## CreateRoomFromLocalRoomTask - Cannot retrieve LocalRoomSummary with roomId ${params.localRoomId}")
|
||||||
?: error("Invalid LocalRoomSummary for ${params.localRoomId}")
|
|
||||||
|
|
||||||
// If a room has already been created for the given local room, return the existing roomId
|
// If a room has already been created for the given local room, return the existing roomId
|
||||||
if (localRoomSummary.replacementRoomId != null) {
|
if (localRoomSummary.replacementRoomId != null) {
|
||||||
return localRoomSummary.replacementRoomId
|
return localRoomSummary.replacementRoomId
|
||||||
}
|
}
|
||||||
|
|
||||||
return createRoom(localRoomSummary)
|
if (localRoomSummary.createRoomParams != null && localRoomSummary.roomSummary != null) {
|
||||||
|
return createRoom(params.localRoomId, localRoomSummary.roomSummary, localRoomSummary.createRoomParams)
|
||||||
|
} else {
|
||||||
|
error("## CreateRoomFromLocalRoomTask - Invalid LocalRoomSummary: $localRoomSummary")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun createRoom(localRoomSummary: LocalRoomSummary): String {
|
/**
|
||||||
updateCreationState(localRoomSummary.roomId, LocalRoomCreationState.CREATING)
|
* Create a room on the server for the given local room.
|
||||||
|
*
|
||||||
|
* @param localRoomId the local room identifier.
|
||||||
|
* @param localRoomSummary the RoomSummary of the local room.
|
||||||
|
* @param createRoomParams the CreateRoomParams object which was used to configure the local room.
|
||||||
|
*
|
||||||
|
* @return the identifier of the created room.
|
||||||
|
*/
|
||||||
|
private suspend fun createRoom(localRoomId: String, localRoomSummary: RoomSummary, createRoomParams: CreateRoomParams): String {
|
||||||
|
updateCreationState(localRoomId, LocalRoomCreationState.CREATING)
|
||||||
val replacementRoomId = runCatching {
|
val replacementRoomId = runCatching {
|
||||||
createRoomTask.execute(localRoomSummary.createRoomParams!!)
|
createRoomTask.execute(createRoomParams)
|
||||||
}.fold(
|
}.fold(
|
||||||
{ it },
|
{ it },
|
||||||
{
|
{
|
||||||
updateCreationState(roomId = localRoomSummary.roomId, LocalRoomCreationState.FAILURE)
|
updateCreationState(localRoomId, LocalRoomCreationState.FAILURE)
|
||||||
throw it
|
throw it
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
updateReplacementRoomId(localRoomSummary.roomId, replacementRoomId)
|
updateReplacementRoomId(localRoomId, replacementRoomId)
|
||||||
waitForRoomEvents(replacementRoomId, localRoomSummary.roomSummary!!)
|
waitForRoomEvents(replacementRoomId, localRoomSummary)
|
||||||
updateCreationState(localRoomSummary.roomId, LocalRoomCreationState.CREATED)
|
updateCreationState(localRoomId, LocalRoomCreationState.CREATED)
|
||||||
return replacementRoomId
|
return replacementRoomId
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wait for all the room events before triggering the created state.
|
* Wait for all the room events before triggering the created state.
|
||||||
|
*
|
||||||
|
* @param replacementRoomId the identifier of the created room
|
||||||
|
* @param localRoomSummary the RoomSummary of the local room.
|
||||||
*/
|
*/
|
||||||
private suspend fun waitForRoomEvents(replacementRoomId: String, roomSummary: RoomSummary) {
|
private suspend fun waitForRoomEvents(replacementRoomId: String, localRoomSummary: RoomSummary) {
|
||||||
try {
|
try {
|
||||||
awaitNotEmptyResult(realmConfiguration, TimeUnit.MINUTES.toMillis(1L)) { realm ->
|
awaitNotEmptyResult(realmConfiguration, TimeUnit.MINUTES.toMillis(1L)) { realm ->
|
||||||
realm.where(RoomSummaryEntity::class.java)
|
realm.where(RoomSummaryEntity::class.java)
|
||||||
.equalTo(RoomSummaryEntityFields.ROOM_ID, replacementRoomId)
|
.equalTo(RoomSummaryEntityFields.ROOM_ID, replacementRoomId)
|
||||||
.equalTo(RoomSummaryEntityFields.INVITED_MEMBERS_COUNT, roomSummary.invitedMembersCount)
|
.equalTo(RoomSummaryEntityFields.INVITED_MEMBERS_COUNT, localRoomSummary.invitedMembersCount)
|
||||||
}
|
}
|
||||||
awaitNotEmptyResult(realmConfiguration, TimeUnit.MINUTES.toMillis(1L)) { realm ->
|
awaitNotEmptyResult(realmConfiguration, TimeUnit.MINUTES.toMillis(1L)) { realm ->
|
||||||
EventEntity.whereRoomId(realm, replacementRoomId)
|
EventEntity.whereRoomId(realm, replacementRoomId)
|
||||||
.equalTo(EventEntityFields.TYPE, EventType.STATE_ROOM_HISTORY_VISIBILITY)
|
.equalTo(EventEntityFields.TYPE, EventType.STATE_ROOM_HISTORY_VISIBILITY)
|
||||||
}
|
}
|
||||||
if (roomSummary.isEncrypted) {
|
if (localRoomSummary.isEncrypted) {
|
||||||
awaitNotEmptyResult(realmConfiguration, TimeUnit.MINUTES.toMillis(1L)) { realm ->
|
awaitNotEmptyResult(realmConfiguration, TimeUnit.MINUTES.toMillis(1L)) { realm ->
|
||||||
EventEntity.whereRoomId(realm, replacementRoomId)
|
EventEntity.whereRoomId(realm, replacementRoomId)
|
||||||
.equalTo(EventEntityFields.TYPE, EventType.STATE_ROOM_ENCRYPTION)
|
.equalTo(EventEntityFields.TYPE, EventType.STATE_ROOM_ENCRYPTION)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (exception: TimeoutCancellationException) {
|
} catch (exception: TimeoutCancellationException) {
|
||||||
updateCreationState(roomSummary.roomId, LocalRoomCreationState.FAILURE)
|
updateCreationState(localRoomSummary.roomId, LocalRoomCreationState.FAILURE)
|
||||||
throw CreateRoomFailure.CreatedWithTimeout(replacementRoomId)
|
throw CreateRoomFailure.CreatedWithTimeout(replacementRoomId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue