From eac74bda0932931b7ec9d53383f813c748d8a12e Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Mon, 19 Sep 2022 09:37:22 +0200 Subject: [PATCH] Improve nullability check in CreateRoomFromLocalRoomTask --- .../create/CreateRoomFromLocalRoomTask.kt | 45 ++++++++++++------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/create/CreateRoomFromLocalRoomTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/create/CreateRoomFromLocalRoomTask.kt index 57ffe7fb0c..2245eb8513 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/create/CreateRoomFromLocalRoomTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/create/CreateRoomFromLocalRoomTask.kt @@ -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.room.failure.CreateRoomFailure 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.create.CreateRoomParams 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.EventEntityFields @@ -57,56 +57,71 @@ internal class DefaultCreateRoomFromLocalRoomTask @Inject constructor( override suspend fun execute(params: CreateRoomFromLocalRoomTask.Params): String { val localRoomSummary = roomSummaryDataSource.getLocalRoomSummary(params.localRoomId) - ?.takeIf { it.createRoomParams != null && it.roomSummary != null } - ?: error("Invalid LocalRoomSummary for ${params.localRoomId}") + ?: error("## CreateRoomFromLocalRoomTask - Cannot retrieve LocalRoomSummary with roomId ${params.localRoomId}") // If a room has already been created for the given local room, return the existing roomId if (localRoomSummary.replacementRoomId != null) { 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 { - createRoomTask.execute(localRoomSummary.createRoomParams!!) + createRoomTask.execute(createRoomParams) }.fold( { it }, { - updateCreationState(roomId = localRoomSummary.roomId, LocalRoomCreationState.FAILURE) + updateCreationState(localRoomId, LocalRoomCreationState.FAILURE) throw it } ) - updateReplacementRoomId(localRoomSummary.roomId, replacementRoomId) - waitForRoomEvents(replacementRoomId, localRoomSummary.roomSummary!!) - updateCreationState(localRoomSummary.roomId, LocalRoomCreationState.CREATED) + updateReplacementRoomId(localRoomId, replacementRoomId) + waitForRoomEvents(replacementRoomId, localRoomSummary) + updateCreationState(localRoomId, LocalRoomCreationState.CREATED) return replacementRoomId } /** * 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 { awaitNotEmptyResult(realmConfiguration, TimeUnit.MINUTES.toMillis(1L)) { realm -> realm.where(RoomSummaryEntity::class.java) .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 -> EventEntity.whereRoomId(realm, replacementRoomId) .equalTo(EventEntityFields.TYPE, EventType.STATE_ROOM_HISTORY_VISIBILITY) } - if (roomSummary.isEncrypted) { + if (localRoomSummary.isEncrypted) { awaitNotEmptyResult(realmConfiguration, TimeUnit.MINUTES.toMillis(1L)) { realm -> EventEntity.whereRoomId(realm, replacementRoomId) .equalTo(EventEntityFields.TYPE, EventType.STATE_ROOM_ENCRYPTION) } } } catch (exception: TimeoutCancellationException) { - updateCreationState(roomSummary.roomId, LocalRoomCreationState.FAILURE) + updateCreationState(localRoomSummary.roomId, LocalRoomCreationState.FAILURE) throw CreateRoomFailure.CreatedWithTimeout(replacementRoomId) } }