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 76c9f902c7..a469904aac 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 @@ -106,6 +106,11 @@ interface MatrixRoom : Closeable { */ suspend fun timelineFocusedOnEvent(eventId: EventId): Result + /** + * Create a new timeline for the pinned events of the room. + */ + suspend fun pinnedEventsTimeline(): Result + fun destroy() suspend fun subscribeToSync() 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 96beb99d5a..111370dcc4 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 @@ -192,6 +192,21 @@ class RustMatrixRoom( } } + override suspend fun pinnedEventsTimeline(): Result { + return runCatching { + innerRoom.pinnedEventsTimeline( + internalIdPrefix = "pinned_events", + maxEventsToLoad = 100u, + ).let { inner -> + createTimeline(inner, isLive = false) + } + }.onFailure { + if (it is CancellationException) { + throw it + } + } + } + override fun destroy() { roomCoroutineScope.cancel() liveTimeline.close() 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 e2be5bcb66..3904de05d3 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 @@ -135,6 +135,7 @@ class FakeMatrixRoom( private val updateMembersResult: () -> Unit = { lambdaError() }, private val getMembersResult: (Int) -> Result> = { lambdaError() }, private val timelineFocusedOnEventResult: (EventId) -> Result = { lambdaError() }, + private val pinnedEventsTimelineResult: () -> Result = { lambdaError() }, private val setSendQueueEnabledLambda: (Boolean) -> Unit = { _: Boolean -> }, private val saveComposerDraftLambda: (ComposerDraft) -> Result = { _: ComposerDraft -> Result.success(Unit) }, private val loadComposerDraftLambda: () -> Result = { Result.success(null) }, @@ -181,6 +182,10 @@ class FakeMatrixRoom( timelineFocusedOnEventResult(eventId) } + override suspend fun pinnedEventsTimeline(): Result = simulateLongTask { + pinnedEventsTimelineResult() + } + override suspend fun subscribeToSync() = Unit override suspend fun powerLevels(): Result {