Leave space: notify the room membership change

This commit is contained in:
ganfra 2025-10-02 19:49:34 +02:00
parent 35dd2c76c1
commit 2c3e4a45e4
3 changed files with 16 additions and 1 deletions

View file

@ -147,6 +147,8 @@ class RustMatrixClient(
private val innerRoomListService = innerSyncService.roomListService() private val innerRoomListService = innerSyncService.roomListService()
private val innerSpaceService = innerClient.spaceService() private val innerSpaceService = innerClient.spaceService()
private val roomMembershipObserver = RoomMembershipObserver()
private val rustSyncService = RustSyncService( private val rustSyncService = RustSyncService(
inner = innerSyncService, inner = innerSyncService,
dispatcher = sessionDispatcher, dispatcher = sessionDispatcher,
@ -189,6 +191,7 @@ class RustMatrixClient(
override val spaceService: SpaceService = RustSpaceService( override val spaceService: SpaceService = RustSpaceService(
innerSpaceService = innerSpaceService, innerSpaceService = innerSpaceService,
roomMembershipObserver = roomMembershipObserver,
sessionCoroutineScope = sessionCoroutineScope, sessionCoroutineScope = sessionCoroutineScope,
sessionDispatcher = sessionDispatcher, sessionDispatcher = sessionDispatcher,
) )
@ -200,7 +203,7 @@ class RustMatrixClient(
) )
private val roomInfoMapper = RoomInfoMapper() private val roomInfoMapper = RoomInfoMapper()
private val roomMembershipObserver = RoomMembershipObserver()
private val roomFactory = RustRoomFactory( private val roomFactory = RustRoomFactory(
roomListService = roomListService, roomListService = roomListService,
innerRoomListService = innerRoomListService, innerRoomListService = innerRoomListService,

View file

@ -9,6 +9,8 @@ package io.element.android.libraries.matrix.impl.spaces
import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.core.extensions.runCatchingExceptions
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
import io.element.android.libraries.matrix.api.room.RoomMembershipObserver
import io.element.android.libraries.matrix.api.spaces.LeaveSpaceHandle import io.element.android.libraries.matrix.api.spaces.LeaveSpaceHandle
import io.element.android.libraries.matrix.api.spaces.LeaveSpaceRoom import io.element.android.libraries.matrix.api.spaces.LeaveSpaceRoom
import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CompletableDeferred
@ -21,6 +23,7 @@ import org.matrix.rustcomponents.sdk.LeaveSpaceHandle as RustLeaveSpaceHandle
class RustLeaveSpaceHandle( class RustLeaveSpaceHandle(
override val id: RoomId, override val id: RoomId,
private val spaceRoomMapper: SpaceRoomMapper, private val spaceRoomMapper: SpaceRoomMapper,
private val roomMembershipObserver: RoomMembershipObserver,
sessionCoroutineScope: CoroutineScope, sessionCoroutineScope: CoroutineScope,
private val innerProvider: suspend () -> RustLeaveSpaceHandle, private val innerProvider: suspend () -> RustLeaveSpaceHandle,
) : LeaveSpaceHandle { ) : LeaveSpaceHandle {
@ -45,6 +48,12 @@ class RustLeaveSpaceHandle(
// Ensure the space is included and is the last room to be left // Ensure the space is included and is the last room to be left
val roomToLeave = roomIds - id + id val roomToLeave = roomIds - id + id
inner.await().leave(roomToLeave.map { it.value }) inner.await().leave(roomToLeave.map { it.value })
}.onSuccess {
roomMembershipObserver.notifyUserLeftRoom(
roomId = id,
isSpace = true,
membershipBeforeLeft = CurrentUserMembership.JOINED,
)
} }
@OptIn(ExperimentalCoroutinesApi::class) @OptIn(ExperimentalCoroutinesApi::class)

View file

@ -10,6 +10,7 @@ package io.element.android.libraries.matrix.impl.spaces
import io.element.android.libraries.core.coroutine.childScope import io.element.android.libraries.core.coroutine.childScope
import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.core.extensions.runCatchingExceptions
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.room.RoomMembershipObserver
import io.element.android.libraries.matrix.api.spaces.LeaveSpaceHandle import io.element.android.libraries.matrix.api.spaces.LeaveSpaceHandle
import io.element.android.libraries.matrix.api.spaces.SpaceRoom import io.element.android.libraries.matrix.api.spaces.SpaceRoom
import io.element.android.libraries.matrix.api.spaces.SpaceRoomList import io.element.android.libraries.matrix.api.spaces.SpaceRoomList
@ -38,6 +39,7 @@ class RustSpaceService(
private val innerSpaceService: ClientSpaceService, private val innerSpaceService: ClientSpaceService,
private val sessionCoroutineScope: CoroutineScope, private val sessionCoroutineScope: CoroutineScope,
private val sessionDispatcher: CoroutineDispatcher, private val sessionDispatcher: CoroutineDispatcher,
private val roomMembershipObserver: RoomMembershipObserver,
) : SpaceService { ) : SpaceService {
private val spaceRoomMapper = SpaceRoomMapper() private val spaceRoomMapper = SpaceRoomMapper()
override val spaceRoomsFlow = MutableSharedFlow<List<SpaceRoom>>(replay = 1, extraBufferCapacity = 1) override val spaceRoomsFlow = MutableSharedFlow<List<SpaceRoom>>(replay = 1, extraBufferCapacity = 1)
@ -69,6 +71,7 @@ class RustSpaceService(
return RustLeaveSpaceHandle( return RustLeaveSpaceHandle(
id = spaceId, id = spaceId,
spaceRoomMapper = spaceRoomMapper, spaceRoomMapper = spaceRoomMapper,
roomMembershipObserver = roomMembershipObserver,
sessionCoroutineScope = sessionCoroutineScope, sessionCoroutineScope = sessionCoroutineScope,
) { ) {
innerSpaceService.leaveSpace(spaceId.value) innerSpaceService.leaveSpace(spaceId.value)