From 1559189a6f12b0f22fac48519140666b98c56129 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 9 Oct 2025 11:40:58 +0200 Subject: [PATCH] Filter out direct room in the leave space screen. Closes #5496 --- .../space/impl/leave/LeaveSpacePresenter.kt | 5 ++- .../impl/leave/LeaveSpacePresenterTest.kt | 45 +++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenter.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenter.kt index 31271104a3..19e593bf7c 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenter.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenter.kt @@ -66,7 +66,8 @@ class LeaveSpacePresenter( .orEmpty() .partition { it.spaceRoom.roomId == leaveSpaceHandle.id } // By default select all rooms that can be left - selectedRoomIds = otherRooms + val otherRoomsExcludingDm = otherRooms.filter { it.spaceRoom.isDirect != true } + selectedRoomIds = otherRoomsExcludingDm .filter { it.isLastAdmin.not() } .map { it.spaceRoom.roomId } leaveSpaceRooms = rooms.fold( @@ -74,7 +75,7 @@ class LeaveSpacePresenter( AsyncData.Success( LeaveSpaceRooms( current = currentRoom.firstOrNull(), - others = otherRooms.toImmutableList(), + others = otherRoomsExcludingDm.toImmutableList(), ) ) }, diff --git a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenterTest.kt b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenterTest.kt index 81920dd0f2..3d123f3f41 100644 --- a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenterTest.kt +++ b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenterTest.kt @@ -16,6 +16,7 @@ import io.element.android.libraries.matrix.api.spaces.SpaceRoom import io.element.android.libraries.matrix.test.AN_EXCEPTION import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.A_ROOM_ID_2 +import io.element.android.libraries.matrix.test.A_ROOM_ID_3 import io.element.android.libraries.matrix.test.A_SPACE_ID import io.element.android.libraries.matrix.test.A_SPACE_NAME import io.element.android.libraries.matrix.test.spaces.FakeLeaveSpaceHandle @@ -91,6 +92,50 @@ class LeaveSpacePresenterTest { } } + @Test + fun `present - direct rooms are filtered out`() = runTest { + val leaveResult = lambdaRecorder, Result> { Result.success(Unit) } + val presenter = createLeaveSpacePresenter( + leaveSpaceHandle = FakeLeaveSpaceHandle( + roomsResult = { + Result.success( + listOf( + aLeaveSpaceRoom(spaceRoom = aSpace), + aLeaveSpaceRoom( + spaceRoom = aSpaceRoom(roomId = A_ROOM_ID, isDirect = false) + ), + aLeaveSpaceRoom( + spaceRoom = aSpaceRoom(roomId = A_ROOM_ID_2, isDirect = true) + ), + aLeaveSpaceRoom( + spaceRoom = aSpaceRoom(roomId = A_ROOM_ID_3, isDirect = null) + ), + ) + ) + }, + leaveResult = leaveResult, + ) + ) + presenter.test { + val state = awaitItem() + assertThat(state.spaceName).isNull() + skipItems(3) + val finalState = awaitItem() + // The current state is not in the sub room list + assertThat(finalState.selectableSpaceRooms.dataOrNull()!!.map { it.spaceRoom.roomId }).containsExactly(A_ROOM_ID, A_ROOM_ID_3) + assertThat(finalState.selectedRoomsCount).isEqualTo(2) + // Leaving the space will not include the DM + finalState.eventSink(LeaveSpaceEvents.LeaveSpace) + val stateLeaving = awaitItem() + assertThat(stateLeaving.leaveSpaceAction).isEqualTo(AsyncAction.Loading) + val stateLeft = awaitItem() + assertThat(stateLeft.leaveSpaceAction.isSuccess()).isTrue() + leaveResult.assertions().isCalledOnce().with( + value(listOf(A_ROOM_ID, A_ROOM_ID_3)) + ) + } + } + @Test fun `present - leave space and sub rooms`() = runTest { val leaveResult = lambdaRecorder, Result> { Result.success(Unit) }