From 31e95b1634fc45a3169cb499b7cfa8d918e7ab33 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 28 Mar 2024 18:13:40 +0100 Subject: [PATCH 1/2] Fix crash observed when going back to the room list. Protect MatrixRoom access when the room is disposed. --- changelog.d/2619.bugfix | 1 + .../matrix/impl/room/RustMatrixRoom.kt | 30 +++++++------------ 2 files changed, 12 insertions(+), 19 deletions(-) create mode 100644 changelog.d/2619.bugfix diff --git a/changelog.d/2619.bugfix b/changelog.d/2619.bugfix new file mode 100644 index 0000000000..a9d7b3f497 --- /dev/null +++ b/changelog.d/2619.bugfix @@ -0,0 +1 @@ +Fix crash observed when going back to the room list. 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 c0e35707a1..7ab6e3640b 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 @@ -182,48 +182,40 @@ class RustMatrixRoom( } override val name: String? - get() { - return roomListItem.name() - } + get() = runCatching { roomListItem.name() }.getOrDefault(null) override val displayName: String - get() { - return innerRoom.displayName() - } + get() = runCatching { innerRoom.displayName() }.getOrDefault("") override val topic: String? - get() { - return innerRoom.topic() - } + get() = runCatching { innerRoom.topic() }.getOrDefault(null) override val avatarUrl: String? - get() { - return roomListItem.avatarUrl() ?: innerRoom.avatarUrl() - } + get() = runCatching { roomListItem.avatarUrl() ?: innerRoom.avatarUrl() }.getOrDefault(null) override val isEncrypted: Boolean get() = runCatching { innerRoom.isEncrypted() }.getOrDefault(false) override val alias: String? - get() = innerRoom.canonicalAlias() + get() = runCatching { innerRoom.canonicalAlias() }.getOrDefault(null) override val alternativeAliases: List - get() = innerRoom.alternativeAliases() + get() = runCatching { innerRoom.alternativeAliases() }.getOrDefault(emptyList()) override val isPublic: Boolean - get() = innerRoom.isPublic() + get() = runCatching { innerRoom.isPublic() }.getOrDefault(false) override val isSpace: Boolean - get() = innerRoom.isSpace() + get() = runCatching { innerRoom.isSpace() }.getOrDefault(false) override val isDirect: Boolean - get() = innerRoom.isDirect() + get() = runCatching { innerRoom.isDirect() }.getOrDefault(false) override val joinedMemberCount: Long - get() = innerRoom.joinedMembersCount().toLong() + get() = runCatching { innerRoom.joinedMembersCount().toLong() }.getOrDefault(0) override val activeMemberCount: Long - get() = innerRoom.activeMembersCount().toLong() + get() = runCatching { innerRoom.activeMembersCount().toLong() }.getOrDefault(0) override suspend fun updateMembers() { val useCache = membersStateFlow.value is MatrixRoomMembersState.Unknown From e5db80b0ebb409133ea2c952363cc344a6b9fb1f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 28 Mar 2024 18:12:42 +0100 Subject: [PATCH 2/2] Compact code. --- .../libraries/matrix/impl/RustMatrixClient.kt | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) 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 31e439bbec..394d56587b 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 @@ -208,16 +208,15 @@ class RustMatrixClient( } } - private val rustRoomListService: RoomListService = - RustRoomListService( + override val roomListService: RoomListService = RustRoomListService( + innerRoomListService = innerRoomListService, + sessionCoroutineScope = sessionCoroutineScope, + sessionDispatcher = sessionDispatcher, + roomListFactory = RoomListFactory( innerRoomListService = innerRoomListService, sessionCoroutineScope = sessionCoroutineScope, - sessionDispatcher = sessionDispatcher, - roomListFactory = RoomListFactory( - innerRoomListService = innerRoomListService, - sessionCoroutineScope = sessionCoroutineScope, - ), - ) + ), + ) private val eventFilters = TimelineEventTypeFilter.exclude( listOf( @@ -238,12 +237,11 @@ class RustMatrixClient( ).map(FilterTimelineEventType::State) ) - override val roomListService: RoomListService - get() = rustRoomListService - - private val rustMediaLoader = RustMediaLoader(baseCacheDirectory, dispatchers, client) - override val mediaLoader: MatrixMediaLoader - get() = rustMediaLoader + override val mediaLoader: MatrixMediaLoader = RustMediaLoader( + baseCacheDirectory = baseCacheDirectory, + dispatchers = dispatchers, + innerClient = client, + ) private val roomMembershipObserver = RoomMembershipObserver()