From 2f4e266094a297f817e56e5673bcd40cad30d81f Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Wed, 6 Mar 2024 17:39:44 +0100 Subject: [PATCH] Fix crash when leaving room using `LeaveRoomPresenter` (#2498) This happened because `roomInfoFlow` was shared eagerly and the `initial` part was called after the `Room` Rust object was destroyed. I think there isn't a need for room info to be shared, it was a mistake I forgot to rollback. --- .../element/android/libraries/matrix/api/room/MatrixRoom.kt | 3 +-- .../android/libraries/matrix/impl/room/RustMatrixRoom.kt | 6 +----- .../android/libraries/matrix/test/room/FakeMatrixRoom.kt | 3 +-- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt index 7d9601f710..97285a345a 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt @@ -37,7 +37,6 @@ import io.element.android.libraries.matrix.api.widget.MatrixWidgetSettings import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged @@ -63,7 +62,7 @@ interface MatrixRoom : Closeable { /** Whether the room is a direct message. */ val isDm: Boolean get() = isDirect && isOneToOne - val roomInfoFlow: SharedFlow + val roomInfoFlow: Flow val roomTypingMembersFlow: Flow> /** diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt index 3621ba1fd5..26e0036415 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt @@ -66,13 +66,10 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.SharedFlow -import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.matrix.rustcomponents.sdk.EventTimelineItem @@ -111,7 +108,7 @@ class RustMatrixRoom( ) : MatrixRoom { override val roomId = RoomId(innerRoom.id()) - override val roomInfoFlow: SharedFlow = mxCallbackFlow { + override val roomInfoFlow: Flow = mxCallbackFlow { launch { val initial = innerRoom.roomInfo().use(matrixRoomInfoMapper::map) channel.trySend(initial) @@ -122,7 +119,6 @@ class RustMatrixRoom( } }) } - .shareIn(sessionCoroutineScope, SharingStarted.Eagerly, replay = 1) override val roomTypingMembersFlow: Flow> = mxCallbackFlow { launch { diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt index c43542208d..a1e51b4f7b 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt @@ -62,7 +62,6 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.StateFlow import java.io.File @@ -180,7 +179,7 @@ class FakeMatrixRoom( private var leaveRoomError: Throwable? = null private val _roomInfoFlow: MutableSharedFlow = MutableSharedFlow(replay = 1) - override val roomInfoFlow: SharedFlow = _roomInfoFlow + override val roomInfoFlow: Flow = _roomInfoFlow private val _roomTypingMembersFlow: MutableSharedFlow> = MutableSharedFlow(replay = 1) override val roomTypingMembersFlow: Flow> = _roomTypingMembersFlow