diff --git a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultStartDMActionTest.kt b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultStartDMActionTest.kt index 14e31d04601..ef6b3b95170 100644 --- a/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultStartDMActionTest.kt +++ b/features/createroom/impl/src/test/kotlin/io/element/android/features/createroom/impl/DefaultStartDMActionTest.kt @@ -27,7 +27,7 @@ class DefaultStartDMActionTest { @Test fun `when dm is found, assert state is updated with given room id`() = runTest { val matrixClient = FakeMatrixClient().apply { - givenFindDmResult(A_ROOM_ID) + givenFindDmResult(Result.success(A_ROOM_ID)) } val analyticsService = FakeAnalyticsService() val action = createStartDMAction(matrixClient, analyticsService) @@ -37,10 +37,23 @@ class DefaultStartDMActionTest { assertThat(analyticsService.capturedEvents).isEmpty() } + @Test + fun `when finding the dm fails, assert state is updated with given error`() = runTest { + val matrixClient = FakeMatrixClient().apply { + givenFindDmResult(Result.failure(AN_EXCEPTION)) + } + val analyticsService = FakeAnalyticsService() + val action = createStartDMAction(matrixClient, analyticsService) + val state = mutableStateOf>(AsyncAction.Uninitialized) + action.execute(aMatrixUser(), true, state) + assertThat(state.value).isEqualTo(AsyncAction.Failure(AN_EXCEPTION)) + assertThat(analyticsService.capturedEvents).isEmpty() + } + @Test fun `when dm is not found, assert dm is created, state is updated with given room id and analytics get called`() = runTest { val matrixClient = FakeMatrixClient().apply { - givenFindDmResult(null) + givenFindDmResult(Result.success(null)) givenCreateDmResult(Result.success(A_ROOM_ID)) } val analyticsService = FakeAnalyticsService() @@ -54,7 +67,7 @@ class DefaultStartDMActionTest { @Test fun `when dm is not found, and createIfDmDoesNotExist is false, assert dm is not created and state is updated to confirmation state`() = runTest { val matrixClient = FakeMatrixClient().apply { - givenFindDmResult(null) + givenFindDmResult(Result.success(null)) givenCreateDmResult(Result.success(A_ROOM_ID)) } val analyticsService = FakeAnalyticsService() @@ -69,7 +82,7 @@ class DefaultStartDMActionTest { @Test fun `when dm creation fails, assert state is updated with given error`() = runTest { val matrixClient = FakeMatrixClient().apply { - givenFindDmResult(null) + givenFindDmResult(Result.success(null)) givenCreateDmResult(Result.failure(AN_EXCEPTION)) } val analyticsService = FakeAnalyticsService() diff --git a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfilePresenter.kt b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfilePresenter.kt index 237c57fecf0..c743ebfd407 100644 --- a/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfilePresenter.kt +++ b/features/userprofile/impl/src/main/kotlin/io/element/android/features/userprofile/impl/root/UserProfilePresenter.kt @@ -55,7 +55,7 @@ class UserProfilePresenter @AssistedInject constructor( @Composable private fun getDmRoomId(): State { return produceState(initialValue = null) { - value = client.findDM(userId) + value = client.findDM(userId).getOrNull() } } diff --git a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/UserProfilePresenterTest.kt b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/UserProfilePresenterTest.kt index b748430383e..c88872374de 100644 --- a/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/UserProfilePresenterTest.kt +++ b/features/userprofile/impl/src/test/kotlin/io/element/android/features/userprofile/impl/UserProfilePresenterTest.kt @@ -141,7 +141,7 @@ class UserProfilePresenterTest { if (canFindRoom) { givenGetRoomResult(A_ROOM_ID, room) } - givenFindDmResult(dmRoom) + givenFindDmResult(Result.success(dmRoom)) } val presenter = createUserProfilePresenter( userId = A_USER_ID_2, diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt index 56d3bfa1e29..91aa6deeeb9 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt @@ -55,7 +55,7 @@ interface MatrixClient { val ignoredUsersFlow: StateFlow> suspend fun getJoinedRoom(roomId: RoomId): JoinedRoom? suspend fun getRoom(roomId: RoomId): BaseRoom? - suspend fun findDM(userId: UserId): RoomId? + suspend fun findDM(userId: UserId): Result suspend fun ignoreUser(userId: UserId): Result suspend fun unignoreUser(userId: UserId): Result suspend fun createRoom(createRoomParams: CreateRoomParameters): Result diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/StartDM.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/StartDM.kt index 7755d97d8c5..f9b0de2449b 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/StartDM.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/StartDM.kt @@ -18,17 +18,24 @@ suspend fun MatrixClient.startDM( userId: UserId, createIfDmDoesNotExist: Boolean, ): StartDMResult { - val existingDM = findDM(userId) - return if (existingDM != null) { - StartDMResult.Success(existingDM, isNew = false) - } else if (createIfDmDoesNotExist) { - createDM(userId).fold( - { StartDMResult.Success(it, isNew = true) }, - { StartDMResult.Failure(it) } + return findDM(userId) + .fold( + onSuccess = { existingDM -> + if (existingDM != null) { + StartDMResult.Success(existingDM, isNew = false) + } else if (createIfDmDoesNotExist) { + createDM(userId).fold( + { StartDMResult.Success(it, isNew = true) }, + { StartDMResult.Failure(it) } + ) + } else { + StartDMResult.DmDoesNotExist + } + }, + onFailure = { error -> + StartDMResult.Failure(error) + } ) - } else { - StartDMResult.DmDoesNotExist - } } sealed interface StartDMResult { diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index a8954d7dfe2..d944d6ef6ea 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt @@ -297,8 +297,10 @@ class RustMatrixClient( } } - override suspend fun findDM(userId: UserId): RoomId? = withContext(sessionDispatcher) { - innerClient.getDmRoom(userId.value)?.use { RoomId(it.id()) } + override suspend fun findDM(userId: UserId): Result = withContext(sessionDispatcher) { + runCatchingExceptions { + innerClient.getDmRoom(userId.value)?.use { RoomId(it.id()) } + } } override suspend fun ignoreUser(userId: UserId): Result = withContext(sessionDispatcher) { diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt index bc4fc085dfd..50a23b39ffa 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt @@ -103,7 +103,7 @@ class FakeMatrixClient( private var createRoomResult: Result = Result.success(A_ROOM_ID) private var createDmResult: Result = Result.success(A_ROOM_ID) - private var findDmResult: RoomId? = A_ROOM_ID + private var findDmResult: Result = Result.success(A_ROOM_ID) private val getRoomResults = mutableMapOf() private val searchUserResults = mutableMapOf>() private val getProfileResults = mutableMapOf>() @@ -133,7 +133,7 @@ class FakeMatrixClient( return getRoomResults[roomId] as? JoinedRoom } - override suspend fun findDM(userId: UserId): RoomId? { + override suspend fun findDM(userId: UserId): Result { return findDmResult } @@ -248,7 +248,7 @@ class FakeMatrixClient( createDmResult = result } - fun givenFindDmResult(result: RoomId?) { + fun givenFindDmResult(result: Result) { findDmResult = result }