Merge pull request #3887 from element-hq/feature/fga/close_room_leave_action
fix : use RoomMembershipObserver to close room screen when leaving
This commit is contained in:
commit
2895d0263c
8 changed files with 44 additions and 33 deletions
|
|
@ -48,9 +48,11 @@ import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
|
||||||
import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias
|
import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias
|
||||||
import io.element.android.libraries.matrix.api.getRoomInfoFlow
|
import io.element.android.libraries.matrix.api.getRoomInfoFlow
|
||||||
import io.element.android.libraries.matrix.api.room.CurrentUserMembership
|
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.room.alias.ResolvedRoomAlias
|
import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias
|
||||||
import kotlinx.coroutines.flow.combine
|
import kotlinx.coroutines.flow.combine
|
||||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
|
import kotlinx.coroutines.flow.first
|
||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
@ -67,6 +69,7 @@ class RoomFlowNode @AssistedInject constructor(
|
||||||
private val joinRoomEntryPoint: JoinRoomEntryPoint,
|
private val joinRoomEntryPoint: JoinRoomEntryPoint,
|
||||||
private val roomAliasResolverEntryPoint: RoomAliasResolverEntryPoint,
|
private val roomAliasResolverEntryPoint: RoomAliasResolverEntryPoint,
|
||||||
private val networkMonitor: NetworkMonitor,
|
private val networkMonitor: NetworkMonitor,
|
||||||
|
private val membershipObserver: RoomMembershipObserver,
|
||||||
) : BaseFlowNode<RoomFlowNode.NavTarget>(
|
) : BaseFlowNode<RoomFlowNode.NavTarget>(
|
||||||
backstack = BackStack(
|
backstack = BackStack(
|
||||||
initialElement = NavTarget.Loading,
|
initialElement = NavTarget.Loading,
|
||||||
|
|
@ -145,10 +148,6 @@ class RoomFlowNode @AssistedInject constructor(
|
||||||
backstack.newRoot(NavTarget.JoinedRoom(roomId))
|
backstack.newRoot(NavTarget.JoinedRoom(roomId))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CurrentUserMembership.LEFT -> {
|
|
||||||
// Left the room, navigate out of this flow
|
|
||||||
navigateUp()
|
|
||||||
}
|
|
||||||
else -> {
|
else -> {
|
||||||
// Was invited or the room is not known, display the join room screen
|
// Was invited or the room is not known, display the join room screen
|
||||||
backstack.newRoot(
|
backstack.newRoot(
|
||||||
|
|
@ -161,6 +160,15 @@ class RoomFlowNode @AssistedInject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.launchIn(lifecycleScope)
|
}.launchIn(lifecycleScope)
|
||||||
|
|
||||||
|
// If the user leaves the room from this client, close the room flow.
|
||||||
|
lifecycleScope.launch {
|
||||||
|
membershipObserver.updates
|
||||||
|
.first { it.roomId == roomId && !it.isUserInRoom }
|
||||||
|
.run {
|
||||||
|
navigateUp()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
|
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
|
||||||
|
|
|
||||||
|
|
@ -43,14 +43,14 @@ class JoinRoomNode @AssistedInject constructor(
|
||||||
state = state,
|
state = state,
|
||||||
onBackClick = ::navigateUp,
|
onBackClick = ::navigateUp,
|
||||||
onJoinSuccess = ::navigateUp,
|
onJoinSuccess = ::navigateUp,
|
||||||
onCancelKnockSuccess = ::navigateUp,
|
onCancelKnockSuccess = {},
|
||||||
onKnockSuccess = { },
|
onKnockSuccess = {},
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
)
|
)
|
||||||
acceptDeclineInviteView.Render(
|
acceptDeclineInviteView.Render(
|
||||||
state = state.acceptDeclineInviteState,
|
state = state.acceptDeclineInviteState,
|
||||||
onAcceptInvite = {},
|
onAcceptInvite = {},
|
||||||
onDeclineInvite = { navigateUp() },
|
onDeclineInvite = {},
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ import io.element.android.libraries.architecture.Presenter
|
||||||
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
||||||
import io.element.android.libraries.matrix.api.MatrixClient
|
import io.element.android.libraries.matrix.api.MatrixClient
|
||||||
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.room.isDm
|
import io.element.android.libraries.matrix.api.room.isDm
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
|
@ -30,7 +29,6 @@ import javax.inject.Inject
|
||||||
|
|
||||||
class LeaveRoomPresenter @Inject constructor(
|
class LeaveRoomPresenter @Inject constructor(
|
||||||
private val client: MatrixClient,
|
private val client: MatrixClient,
|
||||||
private val roomMembershipObserver: RoomMembershipObserver,
|
|
||||||
private val dispatchers: CoroutineDispatchers,
|
private val dispatchers: CoroutineDispatchers,
|
||||||
) : Presenter<LeaveRoomState> {
|
) : Presenter<LeaveRoomState> {
|
||||||
@Composable
|
@Composable
|
||||||
|
|
@ -58,7 +56,6 @@ class LeaveRoomPresenter @Inject constructor(
|
||||||
is LeaveRoomEvent.LeaveRoom -> scope.launch(dispatchers.io) {
|
is LeaveRoomEvent.LeaveRoom -> scope.launch(dispatchers.io) {
|
||||||
client.leaveRoom(
|
client.leaveRoom(
|
||||||
roomId = event.roomId,
|
roomId = event.roomId,
|
||||||
roomMembershipObserver = roomMembershipObserver,
|
|
||||||
confirmation = confirmation,
|
confirmation = confirmation,
|
||||||
progress = progress,
|
progress = progress,
|
||||||
error = error,
|
error = error,
|
||||||
|
|
@ -88,7 +85,6 @@ private suspend fun showLeaveRoomAlert(
|
||||||
|
|
||||||
private suspend fun MatrixClient.leaveRoom(
|
private suspend fun MatrixClient.leaveRoom(
|
||||||
roomId: RoomId,
|
roomId: RoomId,
|
||||||
roomMembershipObserver: RoomMembershipObserver,
|
|
||||||
confirmation: MutableState<LeaveRoomState.Confirmation>,
|
confirmation: MutableState<LeaveRoomState.Confirmation>,
|
||||||
progress: MutableState<LeaveRoomState.Progress>,
|
progress: MutableState<LeaveRoomState.Progress>,
|
||||||
error: MutableState<LeaveRoomState.Error>,
|
error: MutableState<LeaveRoomState.Error>,
|
||||||
|
|
@ -96,12 +92,11 @@ private suspend fun MatrixClient.leaveRoom(
|
||||||
confirmation.value = LeaveRoomState.Confirmation.Hidden
|
confirmation.value = LeaveRoomState.Confirmation.Hidden
|
||||||
progress.value = LeaveRoomState.Progress.Shown
|
progress.value = LeaveRoomState.Progress.Shown
|
||||||
getRoom(roomId)?.use { room ->
|
getRoom(roomId)?.use { room ->
|
||||||
room.leave().onSuccess {
|
room.leave()
|
||||||
roomMembershipObserver.notifyUserLeftRoom(room.roomId)
|
.onFailure {
|
||||||
}.onFailure {
|
Timber.e(it, "Error while leaving room ${room.roomId}")
|
||||||
Timber.e(it, "Error while leaving room ${room.displayName} - ${room.roomId}")
|
error.value = LeaveRoomState.Error.Shown
|
||||||
error.value = LeaveRoomState.Error.Shown
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
progress.value = LeaveRoomState.Progress.Hidden
|
progress.value = LeaveRoomState.Progress.Hidden
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,15 +14,15 @@ import com.google.common.truth.Truth.assertThat
|
||||||
import io.element.android.features.leaveroom.api.LeaveRoomEvent
|
import io.element.android.features.leaveroom.api.LeaveRoomEvent
|
||||||
import io.element.android.features.leaveroom.api.LeaveRoomState
|
import io.element.android.features.leaveroom.api.LeaveRoomState
|
||||||
import io.element.android.libraries.matrix.api.MatrixClient
|
import io.element.android.libraries.matrix.api.MatrixClient
|
||||||
import io.element.android.libraries.matrix.api.room.RoomMembershipObserver
|
|
||||||
import io.element.android.libraries.matrix.api.timeline.item.event.MembershipChange
|
|
||||||
import io.element.android.libraries.matrix.test.A_ROOM_ID
|
import io.element.android.libraries.matrix.test.A_ROOM_ID
|
||||||
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
||||||
import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
|
import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
|
||||||
import io.element.android.tests.testutils.WarmUpRule
|
import io.element.android.tests.testutils.WarmUpRule
|
||||||
|
import io.element.android.tests.testutils.lambda.assert
|
||||||
|
import io.element.android.tests.testutils.lambda.lambdaRecorder
|
||||||
import io.element.android.tests.testutils.testCoroutineDispatchers
|
import io.element.android.tests.testutils.testCoroutineDispatchers
|
||||||
import kotlinx.coroutines.flow.first
|
|
||||||
import kotlinx.coroutines.test.TestScope
|
import kotlinx.coroutines.test.TestScope
|
||||||
|
import kotlinx.coroutines.test.advanceUntilIdle
|
||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
import org.junit.Rule
|
import org.junit.Rule
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
@ -126,26 +126,27 @@ class LeaveRoomPresenterTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `present - leaving a room leaves the room`() = runTest {
|
fun `present - leaving a room leaves the room`() = runTest {
|
||||||
val roomMembershipObserver = RoomMembershipObserver()
|
val leaveRoomLambda = lambdaRecorder<Result<Unit>> { Result.success(Unit) }
|
||||||
val presenter = createLeaveRoomPresenter(
|
val presenter = createLeaveRoomPresenter(
|
||||||
client = FakeMatrixClient().apply {
|
client = FakeMatrixClient().apply {
|
||||||
givenGetRoomResult(
|
givenGetRoomResult(
|
||||||
roomId = A_ROOM_ID,
|
roomId = A_ROOM_ID,
|
||||||
result = FakeMatrixRoom(
|
result = FakeMatrixRoom(
|
||||||
leaveRoomLambda = { Result.success(Unit) }
|
leaveRoomLambda = leaveRoomLambda
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
roomMembershipObserver = roomMembershipObserver
|
|
||||||
)
|
)
|
||||||
moleculeFlow(RecompositionMode.Immediate) {
|
moleculeFlow(RecompositionMode.Immediate) {
|
||||||
presenter.present()
|
presenter.present()
|
||||||
}.test {
|
}.test {
|
||||||
val initialState = awaitItem()
|
val initialState = awaitItem()
|
||||||
initialState.eventSink(LeaveRoomEvent.LeaveRoom(A_ROOM_ID))
|
initialState.eventSink(LeaveRoomEvent.LeaveRoom(A_ROOM_ID))
|
||||||
// Membership observer should receive a 'left room' change
|
advanceUntilIdle()
|
||||||
assertThat(roomMembershipObserver.updates.first().change).isEqualTo(MembershipChange.LEFT)
|
|
||||||
cancelAndIgnoreRemainingEvents()
|
cancelAndIgnoreRemainingEvents()
|
||||||
|
assert(leaveRoomLambda)
|
||||||
|
.isCalledOnce()
|
||||||
|
.withNoParameter()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -227,9 +228,7 @@ class LeaveRoomPresenterTest {
|
||||||
|
|
||||||
private fun TestScope.createLeaveRoomPresenter(
|
private fun TestScope.createLeaveRoomPresenter(
|
||||||
client: MatrixClient = FakeMatrixClient(),
|
client: MatrixClient = FakeMatrixClient(),
|
||||||
roomMembershipObserver: RoomMembershipObserver = RoomMembershipObserver(),
|
|
||||||
): LeaveRoomPresenter = LeaveRoomPresenter(
|
): LeaveRoomPresenter = LeaveRoomPresenter(
|
||||||
client = client,
|
client = client,
|
||||||
roomMembershipObserver = roomMembershipObserver,
|
|
||||||
dispatchers = testCoroutineDispatchers(false),
|
dispatchers = testCoroutineDispatchers(false),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -178,6 +178,8 @@ class RustMatrixClient(
|
||||||
sessionCoroutineScope = sessionCoroutineScope,
|
sessionCoroutineScope = sessionCoroutineScope,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private val roomMembershipObserver = RoomMembershipObserver()
|
||||||
|
|
||||||
private val roomFactory = RustRoomFactory(
|
private val roomFactory = RustRoomFactory(
|
||||||
roomListService = roomListService,
|
roomListService = roomListService,
|
||||||
innerRoomListService = innerRoomListService,
|
innerRoomListService = innerRoomListService,
|
||||||
|
|
@ -191,6 +193,7 @@ class RustMatrixClient(
|
||||||
roomSyncSubscriber = roomSyncSubscriber,
|
roomSyncSubscriber = roomSyncSubscriber,
|
||||||
timelineEventTypeFilterFactory = timelineEventTypeFilterFactory,
|
timelineEventTypeFilterFactory = timelineEventTypeFilterFactory,
|
||||||
featureFlagService = featureFlagService,
|
featureFlagService = featureFlagService,
|
||||||
|
roomMembershipObserver = roomMembershipObserver,
|
||||||
)
|
)
|
||||||
|
|
||||||
override val mediaLoader: MatrixMediaLoader = RustMediaLoader(
|
override val mediaLoader: MatrixMediaLoader = RustMediaLoader(
|
||||||
|
|
@ -199,8 +202,6 @@ class RustMatrixClient(
|
||||||
innerClient = client,
|
innerClient = client,
|
||||||
)
|
)
|
||||||
|
|
||||||
private val roomMembershipObserver = RoomMembershipObserver()
|
|
||||||
|
|
||||||
private var clientDelegateTaskHandle: TaskHandle? = client.setDelegate(sessionDelegate)
|
private var clientDelegateTaskHandle: TaskHandle? = client.setDelegate(sessionDelegate)
|
||||||
|
|
||||||
private val _userProfile: MutableStateFlow<MatrixUser> = MutableStateFlow(
|
private val _userProfile: MutableStateFlow<MatrixUser> = MutableStateFlow(
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@ import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState
|
||||||
import io.element.android.libraries.matrix.api.room.MatrixRoomNotificationSettingsState
|
import io.element.android.libraries.matrix.api.room.MatrixRoomNotificationSettingsState
|
||||||
import io.element.android.libraries.matrix.api.room.MessageEventType
|
import io.element.android.libraries.matrix.api.room.MessageEventType
|
||||||
import io.element.android.libraries.matrix.api.room.RoomMember
|
import io.element.android.libraries.matrix.api.room.RoomMember
|
||||||
|
import io.element.android.libraries.matrix.api.room.RoomMembershipObserver
|
||||||
import io.element.android.libraries.matrix.api.room.StateEventType
|
import io.element.android.libraries.matrix.api.room.StateEventType
|
||||||
import io.element.android.libraries.matrix.api.room.draft.ComposerDraft
|
import io.element.android.libraries.matrix.api.room.draft.ComposerDraft
|
||||||
import io.element.android.libraries.matrix.api.room.location.AssetType
|
import io.element.android.libraries.matrix.api.room.location.AssetType
|
||||||
|
|
@ -60,7 +61,6 @@ import io.element.android.libraries.matrix.impl.widget.RustWidgetDriver
|
||||||
import io.element.android.libraries.matrix.impl.widget.generateWidgetWebViewUrl
|
import io.element.android.libraries.matrix.impl.widget.generateWidgetWebViewUrl
|
||||||
import io.element.android.services.toolbox.api.systemclock.SystemClock
|
import io.element.android.services.toolbox.api.systemclock.SystemClock
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
|
||||||
import kotlinx.coroutines.cancel
|
import kotlinx.coroutines.cancel
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
|
@ -92,7 +92,6 @@ import org.matrix.rustcomponents.sdk.IdentityStatusChange as RustIdentityStateCh
|
||||||
import org.matrix.rustcomponents.sdk.Room as InnerRoom
|
import org.matrix.rustcomponents.sdk.Room as InnerRoom
|
||||||
import org.matrix.rustcomponents.sdk.Timeline as InnerTimeline
|
import org.matrix.rustcomponents.sdk.Timeline as InnerTimeline
|
||||||
|
|
||||||
@OptIn(ExperimentalCoroutinesApi::class)
|
|
||||||
class RustMatrixRoom(
|
class RustMatrixRoom(
|
||||||
override val sessionId: SessionId,
|
override val sessionId: SessionId,
|
||||||
private val deviceId: DeviceId,
|
private val deviceId: DeviceId,
|
||||||
|
|
@ -107,6 +106,7 @@ class RustMatrixRoom(
|
||||||
private val roomSyncSubscriber: RoomSyncSubscriber,
|
private val roomSyncSubscriber: RoomSyncSubscriber,
|
||||||
private val matrixRoomInfoMapper: MatrixRoomInfoMapper,
|
private val matrixRoomInfoMapper: MatrixRoomInfoMapper,
|
||||||
private val featureFlagService: FeatureFlagService,
|
private val featureFlagService: FeatureFlagService,
|
||||||
|
private val roomMembershipObserver: RoomMembershipObserver,
|
||||||
) : MatrixRoom {
|
) : MatrixRoom {
|
||||||
override val roomId = RoomId(innerRoom.id())
|
override val roomId = RoomId(innerRoom.id())
|
||||||
|
|
||||||
|
|
@ -376,6 +376,8 @@ class RustMatrixRoom(
|
||||||
override suspend fun leave(): Result<Unit> = withContext(roomDispatcher) {
|
override suspend fun leave(): Result<Unit> = withContext(roomDispatcher) {
|
||||||
runCatching {
|
runCatching {
|
||||||
innerRoom.leave()
|
innerRoom.leave()
|
||||||
|
}.onSuccess {
|
||||||
|
roomMembershipObserver.notifyUserLeftRoom(roomId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,15 +10,19 @@ package io.element.android.libraries.matrix.impl.room
|
||||||
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.core.SessionId
|
import io.element.android.libraries.matrix.api.core.SessionId
|
||||||
import io.element.android.libraries.matrix.api.room.PendingRoom
|
import io.element.android.libraries.matrix.api.room.PendingRoom
|
||||||
|
import io.element.android.libraries.matrix.api.room.RoomMembershipObserver
|
||||||
import org.matrix.rustcomponents.sdk.RoomPreview
|
import org.matrix.rustcomponents.sdk.RoomPreview
|
||||||
|
|
||||||
class RustPendingRoom(
|
class RustPendingRoom(
|
||||||
override val sessionId: SessionId,
|
override val sessionId: SessionId,
|
||||||
override val roomId: RoomId,
|
override val roomId: RoomId,
|
||||||
private val inner: RoomPreview,
|
private val inner: RoomPreview,
|
||||||
|
private val roomMembershipObserver: RoomMembershipObserver,
|
||||||
) : PendingRoom {
|
) : PendingRoom {
|
||||||
override suspend fun leave(): Result<Unit> = runCatching {
|
override suspend fun leave(): Result<Unit> = runCatching {
|
||||||
inner.leave()
|
inner.leave()
|
||||||
|
}.onSuccess {
|
||||||
|
roomMembershipObserver.notifyUserLeftRoom(roomId)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun close() {
|
override fun close() {
|
||||||
|
|
|
||||||
|
|
@ -17,13 +17,13 @@ import io.element.android.libraries.matrix.api.core.SessionId
|
||||||
import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService
|
import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService
|
||||||
import io.element.android.libraries.matrix.api.room.MatrixRoom
|
import io.element.android.libraries.matrix.api.room.MatrixRoom
|
||||||
import io.element.android.libraries.matrix.api.room.PendingRoom
|
import io.element.android.libraries.matrix.api.room.PendingRoom
|
||||||
|
import io.element.android.libraries.matrix.api.room.RoomMembershipObserver
|
||||||
import io.element.android.libraries.matrix.api.roomlist.RoomListService
|
import io.element.android.libraries.matrix.api.roomlist.RoomListService
|
||||||
import io.element.android.libraries.matrix.api.roomlist.awaitLoaded
|
import io.element.android.libraries.matrix.api.roomlist.awaitLoaded
|
||||||
import io.element.android.libraries.matrix.impl.roomlist.fullRoomWithTimeline
|
import io.element.android.libraries.matrix.impl.roomlist.fullRoomWithTimeline
|
||||||
import io.element.android.libraries.matrix.impl.roomlist.roomOrNull
|
import io.element.android.libraries.matrix.impl.roomlist.roomOrNull
|
||||||
import io.element.android.services.toolbox.api.systemclock.SystemClock
|
import io.element.android.services.toolbox.api.systemclock.SystemClock
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
|
||||||
import kotlinx.coroutines.NonCancellable
|
import kotlinx.coroutines.NonCancellable
|
||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
import kotlinx.coroutines.sync.withLock
|
import kotlinx.coroutines.sync.withLock
|
||||||
|
|
@ -51,8 +51,8 @@ class RustRoomFactory(
|
||||||
private val roomSyncSubscriber: RoomSyncSubscriber,
|
private val roomSyncSubscriber: RoomSyncSubscriber,
|
||||||
private val timelineEventTypeFilterFactory: TimelineEventTypeFilterFactory,
|
private val timelineEventTypeFilterFactory: TimelineEventTypeFilterFactory,
|
||||||
private val featureFlagService: FeatureFlagService,
|
private val featureFlagService: FeatureFlagService,
|
||||||
|
private val roomMembershipObserver: RoomMembershipObserver,
|
||||||
) {
|
) {
|
||||||
@OptIn(ExperimentalCoroutinesApi::class)
|
|
||||||
private val dispatcher = dispatchers.io.limitedParallelism(1)
|
private val dispatcher = dispatchers.io.limitedParallelism(1)
|
||||||
private val mutex = Mutex()
|
private val mutex = Mutex()
|
||||||
private var isDestroyed: Boolean = false
|
private var isDestroyed: Boolean = false
|
||||||
|
|
@ -120,6 +120,7 @@ class RustRoomFactory(
|
||||||
roomSyncSubscriber = roomSyncSubscriber,
|
roomSyncSubscriber = roomSyncSubscriber,
|
||||||
matrixRoomInfoMapper = matrixRoomInfoMapper,
|
matrixRoomInfoMapper = matrixRoomInfoMapper,
|
||||||
featureFlagService = featureFlagService,
|
featureFlagService = featureFlagService,
|
||||||
|
roomMembershipObserver = roomMembershipObserver,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -148,6 +149,7 @@ class RustRoomFactory(
|
||||||
sessionId = sessionId,
|
sessionId = sessionId,
|
||||||
roomId = roomId,
|
roomId = roomId,
|
||||||
inner = innerRoom,
|
inner = innerRoom,
|
||||||
|
roomMembershipObserver = roomMembershipObserver,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue