diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/PinnedEventsTimelineProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/PinnedEventsTimelineProvider.kt index 6e3ce308cd..1135dcb2d6 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/PinnedEventsTimelineProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/PinnedEventsTimelineProvider.kt @@ -14,6 +14,7 @@ import io.element.android.libraries.di.RoomScope import io.element.android.libraries.di.SingleIn import io.element.android.libraries.featureflag.api.FeatureFlagService import io.element.android.libraries.featureflag.api.FeatureFlags +import io.element.android.libraries.matrix.api.room.CreateTimelineParams import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.sync.SyncService import io.element.android.libraries.matrix.api.timeline.Timeline @@ -104,7 +105,7 @@ class PinnedEventsTimelineProvider @Inject constructor( is AsyncData.Uninitialized, is AsyncData.Failure -> { timelineStateFlow.emit(AsyncData.Loading()) withContext(dispatchers.io) { - room.createTimeline(onlyPinnedEvents = true) + room.createTimeline(CreateTimelineParams.PinnedOnly) } .fold( { timelineStateFlow.emit(AsyncData.Success(it)) }, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineController.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineController.kt index a4916fed31..985d4f6076 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineController.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineController.kt @@ -11,6 +11,7 @@ import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.di.RoomScope import io.element.android.libraries.di.SingleIn import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.room.CreateTimelineParams import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem import io.element.android.libraries.matrix.api.timeline.Timeline @@ -64,7 +65,7 @@ class TimelineController @Inject constructor( } suspend fun focusOnEvent(eventId: EventId): Result { - return room.createTimeline(focusedOnEventId = eventId) + return room.createTimeline(CreateTimelineParams.Focused(eventId)) .onFailure { if (it is CancellationException) { throw it diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt index b25cb1968a..5f6fa1b164 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt @@ -55,7 +55,7 @@ class PinnedMessagesBannerPresenterTest { @Test fun `present - loading state`() = runTest { val room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.success(FakeTimeline()) } + createTimelineResult = { Result.success(FakeTimeline()) } ).apply { givenRoomInfo(aRoomInfo(pinnedEventIds = listOf(AN_EVENT_ID))) } @@ -86,7 +86,7 @@ class PinnedMessagesBannerPresenterTest { ) ) val room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.success(pinnedEventsTimeline) } + createTimelineResult = { Result.success(pinnedEventsTimeline) } ).apply { givenRoomInfo(aRoomInfo(pinnedEventIds = listOf(AN_EVENT_ID, AN_EVENT_ID_2))) } @@ -125,7 +125,7 @@ class PinnedMessagesBannerPresenterTest { ) ) val room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.success(pinnedEventsTimeline) } + createTimelineResult = { Result.success(pinnedEventsTimeline) } ).apply { givenRoomInfo(aRoomInfo(pinnedEventIds = listOf(AN_EVENT_ID, AN_EVENT_ID_2))) } @@ -160,7 +160,7 @@ class PinnedMessagesBannerPresenterTest { @Test fun `present - timeline failed`() = runTest { val room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.failure(Exception()) } + createTimelineResult = { Result.failure(Exception()) } ).apply { givenRoomInfo(aRoomInfo(pinnedEventIds = listOf(AN_EVENT_ID))) } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenterTest.kt index 77f4b3b65f..7fcbfb62eb 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/list/PinnedMessagesListPresenterTest.kt @@ -83,7 +83,7 @@ class PinnedMessagesListPresenterTest { @Test fun `present - timeline failure state`() = runTest { val room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.failure(RuntimeException()) }, + createTimelineResult = { Result.failure(RuntimeException()) }, canRedactOwnResult = { Result.success(true) }, canRedactOtherResult = { Result.success(true) }, canUserPinUnpinResult = { Result.success(true) }, @@ -102,7 +102,7 @@ class PinnedMessagesListPresenterTest { @Test fun `present - empty state`() = runTest { val room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.success(FakeTimeline()) }, + createTimelineResult = { Result.success(FakeTimeline()) }, canRedactOwnResult = { Result.success(true) }, canRedactOtherResult = { Result.success(true) }, canUserPinUnpinResult = { Result.success(true) }, @@ -122,7 +122,7 @@ class PinnedMessagesListPresenterTest { fun `present - filled state`() = runTest { val pinnedEventsTimeline = createPinnedMessagesTimeline() val room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.success(pinnedEventsTimeline) }, + createTimelineResult = { Result.success(pinnedEventsTimeline) }, canRedactOwnResult = { Result.success(true) }, canRedactOtherResult = { Result.success(true) }, canUserPinUnpinResult = { Result.success(true) }, @@ -149,7 +149,7 @@ class PinnedMessagesListPresenterTest { val pinnedEventsTimeline = createPinnedMessagesTimeline() val analyticsService = FakeAnalyticsService() val room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.success(pinnedEventsTimeline) }, + createTimelineResult = { Result.success(pinnedEventsTimeline) }, canRedactOwnResult = { Result.success(true) }, canRedactOtherResult = { Result.success(true) }, canUserPinUnpinResult = { Result.success(true) }, @@ -195,7 +195,7 @@ class PinnedMessagesListPresenterTest { } val pinnedEventsTimeline = createPinnedMessagesTimeline() val room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.success(pinnedEventsTimeline) }, + createTimelineResult = { Result.success(pinnedEventsTimeline) }, canRedactOwnResult = { Result.success(true) }, canRedactOtherResult = { Result.success(true) }, canUserPinUnpinResult = { Result.success(true) }, @@ -224,7 +224,7 @@ class PinnedMessagesListPresenterTest { } val pinnedEventsTimeline = createPinnedMessagesTimeline() val room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.success(pinnedEventsTimeline) }, + createTimelineResult = { Result.success(pinnedEventsTimeline) }, canRedactOwnResult = { Result.success(true) }, canRedactOtherResult = { Result.success(true) }, canUserPinUnpinResult = { Result.success(true) }, @@ -253,7 +253,7 @@ class PinnedMessagesListPresenterTest { } val pinnedEventsTimeline = createPinnedMessagesTimeline() val room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.success(pinnedEventsTimeline) }, + createTimelineResult = { Result.success(pinnedEventsTimeline) }, canRedactOwnResult = { Result.success(true) }, canRedactOtherResult = { Result.success(true) }, canUserPinUnpinResult = { Result.success(true) }, diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineControllerTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineControllerTest.kt index 3d98266d40..83cc05eb52 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineControllerTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelineControllerTest.kt @@ -31,7 +31,7 @@ class TimelineControllerTest { val detachedTimeline = FakeTimeline(name = "detached") val matrixRoom = FakeMatrixRoom( liveTimeline = liveTimeline, - createTimelineResult = { _, _, _ -> Result.success(detachedTimeline) } + createTimelineResult = { Result.success(detachedTimeline) } ) val sut = TimelineController(matrixRoom) @@ -63,7 +63,7 @@ class TimelineControllerTest { var callNumber = 0 val matrixRoom = FakeMatrixRoom( liveTimeline = liveTimeline, - createTimelineResult = { _, _, _ -> + createTimelineResult = { callNumber++ when (callNumber) { 1 -> Result.success(detachedTimeline1) @@ -117,7 +117,7 @@ class TimelineControllerTest { val detachedTimeline = FakeTimeline(name = "detached") val matrixRoom = FakeMatrixRoom( liveTimeline = liveTimeline, - createTimelineResult = { _, _, _ -> Result.success(detachedTimeline) } + createTimelineResult = { Result.success(detachedTimeline) } ) val sut = TimelineController(matrixRoom) sut.activeTimelineFlow().test { @@ -167,7 +167,7 @@ class TimelineControllerTest { } val matrixRoom = FakeMatrixRoom( liveTimeline = liveTimeline, - createTimelineResult = { _, _, _ -> Result.success(detachedTimeline) } + createTimelineResult = { Result.success(detachedTimeline) } ) val sut = TimelineController(matrixRoom) sut.activeTimelineFlow().test { @@ -192,7 +192,7 @@ class TimelineControllerTest { val detachedTimeline = FakeTimeline(name = "detached") val matrixRoom = FakeMatrixRoom( liveTimeline = liveTimeline, - createTimelineResult = { _, _, _ -> Result.success(detachedTimeline) } + createTimelineResult = { Result.success(detachedTimeline) } ) val sut = TimelineController(matrixRoom) diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenterTest.kt index f6f30e5415..6c81745ce4 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenterTest.kt @@ -483,7 +483,7 @@ import kotlin.time.Duration.Companion.seconds ) val room = FakeMatrixRoom( liveTimeline = liveTimeline, - createTimelineResult = { _, _, _ -> Result.success(detachedTimeline) }, + createTimelineResult = { Result.success(detachedTimeline) }, canUserSendMessageResult = { _, _ -> Result.success(true) }, ) val presenter = createTimelinePresenter( @@ -561,7 +561,7 @@ import kotlin.time.Duration.Companion.seconds liveTimeline = FakeTimeline( timelineItems = flowOf(emptyList()), ), - createTimelineResult = { _, _, _ -> Result.failure(Throwable("An error")) }, + createTimelineResult = { Result.failure(Throwable("An error")) }, canUserSendMessageResult = { _, _ -> Result.success(true) }, ) ) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/CreateTimelineParams.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/CreateTimelineParams.kt new file mode 100644 index 0000000000..0bcfb0bf54 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/CreateTimelineParams.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.matrix.api.room + +import io.element.android.libraries.matrix.api.core.EventId + +sealed interface CreateTimelineParams { + data class Focused(val focusedEventId: EventId) : CreateTimelineParams + data object MediaOnly : CreateTimelineParams + data class MediaOnlyFocused(val focusedEventId: EventId) : CreateTimelineParams + data object PinnedOnly : CreateTimelineParams +} 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 c13cce2b11..41b25c0dc0 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 @@ -110,15 +110,10 @@ interface MatrixRoom : Closeable { /** * Create a new timeline. - * @param focusedOnEventId The event to focus on, if any. Note: if not null, and for regular timeline, - * this method should not be used directly, see `TimelineController` to manage the various timelines. - * @param onlyPinnedEvents True to get the timeline for pinned events only. - * @param onlyMedia True to get the timeline for media events only. + * @param createTimelineParams contains parameters about how to filter the timeline. Will also configure the date separators. */ suspend fun createTimeline( - focusedOnEventId: EventId? = null, - onlyPinnedEvents: Boolean = false, - onlyMedia: Boolean = false, + createTimelineParams: CreateTimelineParams, ): Result fun destroy() 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 a2f7580ae9..4834dd79d8 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 @@ -28,6 +28,7 @@ import io.element.android.libraries.matrix.api.media.MediaUploadHandler import io.element.android.libraries.matrix.api.media.VideoInfo import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService import io.element.android.libraries.matrix.api.poll.PollKind +import io.element.android.libraries.matrix.api.room.CreateTimelineParams import io.element.android.libraries.matrix.api.room.IntentionalMention import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.MatrixRoomInfo @@ -215,25 +216,26 @@ class RustMatrixRoom( override suspend fun subscribeToSync() = roomSyncSubscriber.subscribe(roomId) override suspend fun createTimeline( - focusedOnEventId: EventId?, - onlyPinnedEvents: Boolean, - onlyMedia: Boolean, + createTimelineParams: CreateTimelineParams, ): Result = withContext(roomDispatcher) { - val focus = if (onlyPinnedEvents) { - TimelineFocus.PinnedEvents( + val focus = when (createTimelineParams) { + is CreateTimelineParams.PinnedOnly -> TimelineFocus.PinnedEvents( maxEventsToLoad = 100u, maxConcurrentRequests = 10u, ) - } else if (focusedOnEventId != null) { - TimelineFocus.Event( - eventId = focusedOnEventId.value, + is CreateTimelineParams.MediaOnly -> TimelineFocus.Live + is CreateTimelineParams.Focused -> TimelineFocus.Event( + eventId = createTimelineParams.focusedEventId.value, + numContextEvents = 50u, + ) + is CreateTimelineParams.MediaOnlyFocused -> TimelineFocus.Event( + eventId = createTimelineParams.focusedEventId.value, numContextEvents = 50u, ) - } else { - TimelineFocus.Live } - val allowedMessageTypes = if (onlyMedia) { - AllowedMessageTypes.Only( + val allowedMessageTypes = when (createTimelineParams) { + is CreateTimelineParams.MediaOnly, + is CreateTimelineParams.MediaOnlyFocused -> AllowedMessageTypes.Only( types = listOf( RoomMessageEventMessageType.FILE, RoomMessageEventMessageType.IMAGE, @@ -241,28 +243,22 @@ class RustMatrixRoom( RoomMessageEventMessageType.AUDIO, ) ) - } else { - AllowedMessageTypes.All + is CreateTimelineParams.Focused, + CreateTimelineParams.PinnedOnly -> AllowedMessageTypes.All } - val internalIdPrefix = if (onlyPinnedEvents) { - "pinned_events" - } else if (focusedOnEventId != null) { - "focus_$focusedOnEventId" - } else if (onlyMedia) { - "MediaGallery_" - } else { - "live" + val internalIdPrefix = when (createTimelineParams) { + is CreateTimelineParams.PinnedOnly -> "pinned_events" + is CreateTimelineParams.Focused -> "focus_${createTimelineParams.focusedEventId}" + is CreateTimelineParams.MediaOnly -> "MediaGallery_" + is CreateTimelineParams.MediaOnlyFocused -> "MediaGallery_${createTimelineParams.focusedEventId}" } - val dateDividerMode = if (onlyMedia) { - DateDividerMode.MONTHLY - } else { - DateDividerMode.DAILY - } - val mode = when { - onlyPinnedEvents -> Timeline.Mode.PINNED_EVENTS - focusedOnEventId != null -> Timeline.Mode.FOCUSED_ON_EVENT - onlyMedia -> Timeline.Mode.MEDIA - else -> Timeline.Mode.LIVE + // Note that for TimelineFilter.MediaOnlyFocused, the date separator will be filtered out, + // but there is no way to exclude data separator at the moment. + val dateDividerMode = when (createTimelineParams) { + is CreateTimelineParams.MediaOnly, + is CreateTimelineParams.MediaOnlyFocused -> DateDividerMode.MONTHLY + is CreateTimelineParams.Focused, + CreateTimelineParams.PinnedOnly -> DateDividerMode.DAILY } runCatching { innerRoom.timelineWithConfiguration( @@ -273,13 +269,20 @@ class RustMatrixRoom( dateDividerMode = dateDividerMode, ) ).let { inner -> + val mode = when (createTimelineParams) { + is CreateTimelineParams.Focused -> Timeline.Mode.FOCUSED_ON_EVENT + is CreateTimelineParams.MediaOnly -> Timeline.Mode.MEDIA + is CreateTimelineParams.MediaOnlyFocused -> Timeline.Mode.FOCUSED_ON_EVENT + CreateTimelineParams.PinnedOnly -> Timeline.Mode.PINNED_EVENTS + } createTimeline(inner, mode = mode) } }.mapFailure { - if (focusedOnEventId != null) { - it.toFocusEventException() - } else { - it + when (createTimelineParams) { + is CreateTimelineParams.Focused, + is CreateTimelineParams.MediaOnlyFocused -> it.toFocusEventException() + CreateTimelineParams.MediaOnly, + CreateTimelineParams.PinnedOnly -> it } }.onFailure { if (it is CancellationException) { @@ -604,6 +607,7 @@ class RustMatrixRoom( override suspend fun reportContent(eventId: EventId, reason: String, blockUserId: UserId?): Result = withContext(roomDispatcher) { runCatching { + innerRoom.reportContent(eventId = eventId.value, score = null, reason = reason) innerRoom.reportContent(eventId = eventId.value, score = null, reason = reason) if (blockUserId != null) { innerRoom.ignoreUser(blockUserId.value) 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 f643a644be..04c32b5445 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 @@ -24,6 +24,7 @@ import io.element.android.libraries.matrix.api.media.MediaUploadHandler import io.element.android.libraries.matrix.api.media.VideoInfo import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService import io.element.android.libraries.matrix.api.poll.PollKind +import io.element.android.libraries.matrix.api.room.CreateTimelineParams import io.element.android.libraries.matrix.api.room.IntentionalMention import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.MatrixRoomInfo @@ -138,7 +139,7 @@ class FakeMatrixRoom( private val leaveRoomLambda: () -> Result = { lambdaError() }, private val updateMembersResult: () -> Unit = { lambdaError() }, private val getMembersResult: (Int) -> Result> = { lambdaError() }, - private val createTimelineResult: (EventId?, Boolean, Boolean) -> Result = { _, _, _ -> lambdaError() }, + private val createTimelineResult: (CreateTimelineParams) -> Result = { lambdaError() }, private val setSendQueueEnabledLambda: (Boolean) -> Unit = { _: Boolean -> }, private val saveComposerDraftLambda: (ComposerDraft) -> Result = { _: ComposerDraft -> Result.success(Unit) }, private val loadComposerDraftLambda: () -> Result = { Result.success(null) }, @@ -219,11 +220,9 @@ class FakeMatrixRoom( } override suspend fun createTimeline( - focusedOnEventId: EventId?, - onlyPinnedEvents: Boolean, - onlyMedia: Boolean, + createTimelineParams: CreateTimelineParams, ): Result = simulateLongTask { - createTimelineResult(focusedOnEventId, onlyPinnedEvents, onlyMedia) + createTimelineResult(createTimelineParams) } override suspend fun subscribeToSync() { diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaTimeline.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaTimeline.kt index 3ecc5e622b..2d7739cc32 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaTimeline.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaTimeline.kt @@ -12,6 +12,7 @@ import io.element.android.libraries.di.RoomScope import io.element.android.libraries.di.SingleIn import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.UniqueId +import io.element.android.libraries.matrix.api.room.CreateTimelineParams import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.mediaviewer.impl.model.GroupedMediaItems @@ -44,7 +45,7 @@ class LiveMediaTimeline @Inject constructor( override suspend fun getTimeline(): Result = mutex.withLock { val currentTimeline = timeline if (currentTimeline == null) { - room.createTimeline(onlyMedia = true) + room.createTimeline(CreateTimelineParams.MediaOnly) .onSuccess { timeline = it } } else { Result.success(currentTimeline) @@ -68,9 +69,11 @@ class FocusedMediaTimeline( ) : MediaTimeline { override suspend fun getTimeline(): Result { return room.createTimeline( - focusedOnEventId = eventId, - onlyPinnedEvents = onlyPinnedEvents, - onlyMedia = true, + createTimelineParams = if (onlyPinnedEvents) { + CreateTimelineParams.PinnedOnly + } else { + CreateTimelineParams.MediaOnlyFocused(eventId) + }, ) } diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FocusedMediaTimelineTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FocusedMediaTimelineTest.kt index 7e548c7477..5c46ffd910 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FocusedMediaTimelineTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/FocusedMediaTimelineTest.kt @@ -9,6 +9,7 @@ package io.element.android.libraries.mediaviewer.impl.datasource import com.google.common.truth.Truth.assertThat import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.room.CreateTimelineParams import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.test.AN_EVENT_ID @@ -75,7 +76,7 @@ class FocusedMediaTimelineTest { @Test fun `getTimeline returns the timeline provided by the room`() = runTest { - val createTimelineResult = lambdaRecorder> { _, _, _ -> + val createTimelineResult = lambdaRecorder> { Result.success(FakeTimeline()) } val room = FakeMatrixRoom( @@ -87,13 +88,12 @@ class FocusedMediaTimelineTest { ) val timeline = sut.getTimeline() assertThat(timeline.isSuccess).isTrue() - createTimelineResult.assertions().isCalledOnce() - .with(value(AN_EVENT_ID), value(false), value(true)) + createTimelineResult.assertions().isCalledOnce().with(value(CreateTimelineParams.MediaOnlyFocused(AN_EVENT_ID))) } @Test fun `getTimeline returns the timeline provided by the room for pinned Events`() = runTest { - val createTimelineResult = lambdaRecorder> { _, _, _ -> + val createTimelineResult = lambdaRecorder> { Result.success(FakeTimeline()) } val room = FakeMatrixRoom( @@ -106,8 +106,7 @@ class FocusedMediaTimelineTest { ) val timeline = sut.getTimeline() assertThat(timeline.isSuccess).isTrue() - createTimelineResult.assertions().isCalledOnce() - .with(value(AN_EVENT_ID), value(true), value(true)) + createTimelineResult.assertions().isCalledOnce().with(value(CreateTimelineParams.PinnedOnly)) } private fun createFocusedMediaTimeline( diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/LiveMediaTimelineTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/LiveMediaTimelineTest.kt index fdec7eb7d5..839f8798d2 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/LiveMediaTimelineTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/LiveMediaTimelineTest.kt @@ -8,7 +8,7 @@ package io.element.android.libraries.mediaviewer.impl.datasource import com.google.common.truth.Truth.assertThat -import io.element.android.libraries.matrix.api.core.EventId +import io.element.android.libraries.matrix.api.room.CreateTimelineParams import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.test.room.FakeMatrixRoom @@ -28,7 +28,7 @@ class LiveMediaTimelineTest { @Test fun `getTimeline returns the timeline provided by the room, then from cache`() = runTest { - val createTimelineResult = lambdaRecorder> { _, _, _ -> + val createTimelineResult = lambdaRecorder> { Result.success(FakeTimeline()) } val room = FakeMatrixRoom( @@ -39,8 +39,7 @@ class LiveMediaTimelineTest { ) val timeline = sut.getTimeline() assertThat(timeline.isSuccess).isTrue() - createTimelineResult.assertions().isCalledOnce() - .with(value(null), value(false), value(true)) + createTimelineResult.assertions().isCalledOnce().with(value(CreateTimelineParams.MediaOnly)) val timeline2 = sut.getTimeline() assertThat(timeline2.isSuccess).isTrue() // No called another time diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/TimelineMediaGalleryDataSourceTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/TimelineMediaGalleryDataSourceTest.kt index b87f37cc70..8e673ce7aa 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/TimelineMediaGalleryDataSourceTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/TimelineMediaGalleryDataSourceTest.kt @@ -57,7 +57,7 @@ class TimelineMediaGalleryDataSourceTest { val fakeTimeline = FakeTimeline() val sut = createTimelineMediaGalleryDataSource( room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.success(fakeTimeline) }, + createTimelineResult = { Result.success(fakeTimeline) }, roomCoroutineScope = backgroundScope, ) ) @@ -75,7 +75,7 @@ class TimelineMediaGalleryDataSourceTest { runTest { val sut = createTimelineMediaGalleryDataSource( room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.success(fakeTimeline) }, + createTimelineResult = { Result.success(fakeTimeline) }, roomCoroutineScope = backgroundScope, ) ) @@ -112,7 +112,7 @@ class TimelineMediaGalleryDataSourceTest { } val sut = createTimelineMediaGalleryDataSource( room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.success(fakeTimeline) }, + createTimelineResult = { Result.success(fakeTimeline) }, roomCoroutineScope = backgroundScope, ) ) @@ -135,7 +135,7 @@ class TimelineMediaGalleryDataSourceTest { } val sut = createTimelineMediaGalleryDataSource( room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.success(fakeTimeline) }, + createTimelineResult = { Result.success(fakeTimeline) }, roomCoroutineScope = backgroundScope, ) ) @@ -154,7 +154,7 @@ class TimelineMediaGalleryDataSourceTest { fun `test - failing to load timeline should emit an error`() = runTest { val sut = createTimelineMediaGalleryDataSource( room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.failure(AN_EXCEPTION) }, + createTimelineResult = { Result.failure(AN_EXCEPTION) }, roomCoroutineScope = backgroundScope, ) ) @@ -176,7 +176,7 @@ class TimelineMediaGalleryDataSourceTest { ) val sut = createTimelineMediaGalleryDataSource( room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.success(fakeTimeline) }, + createTimelineResult = { Result.success(fakeTimeline) }, roomCoroutineScope = backgroundScope, ) ) diff --git a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenterTest.kt b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenterTest.kt index eec0b4368b..81e270a09f 100644 --- a/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenterTest.kt +++ b/libraries/mediaviewer/impl/src/test/kotlin/io/element/android/libraries/mediaviewer/impl/gallery/MediaGalleryPresenterTest.kt @@ -52,7 +52,7 @@ class MediaGalleryPresenterTest { ), room = FakeMatrixRoom( displayName = A_ROOM_NAME, - createTimelineResult = { _, _, _ -> Result.success(FakeTimeline()) }, + createTimelineResult = { Result.success(FakeTimeline()) }, ) ) presenter.test { @@ -71,7 +71,7 @@ class MediaGalleryPresenterTest { val presenter = createMediaGalleryPresenter( room = FakeMatrixRoom( displayName = A_ROOM_NAME, - createTimelineResult = { _, _, _ -> Result.success(FakeTimeline()) }, + createTimelineResult = { Result.success(FakeTimeline()) }, ) ) presenter.test { @@ -101,7 +101,7 @@ class MediaGalleryPresenterTest { room = FakeMatrixRoom( sessionId = A_USER_ID, displayName = A_ROOM_NAME, - createTimelineResult = { _, _, _ -> Result.success(FakeTimeline()) }, + createTimelineResult = { Result.success(FakeTimeline()) }, canRedactOwnResult = { Result.success(canDeleteOwn) } ) ) @@ -144,7 +144,7 @@ class MediaGalleryPresenterTest { room = FakeMatrixRoom( sessionId = A_USER_ID, displayName = A_ROOM_NAME, - createTimelineResult = { _, _, _ -> Result.success(FakeTimeline()) }, + createTimelineResult = { Result.success(FakeTimeline()) }, canRedactOtherResult = { Result.success(canDeleteOther) } ) ) @@ -177,7 +177,7 @@ class MediaGalleryPresenterTest { val presenter = createMediaGalleryPresenter( room = FakeMatrixRoom( displayName = A_ROOM_NAME, - createTimelineResult = { _, _, _ -> Result.success(FakeTimeline()) }, + createTimelineResult = { Result.success(FakeTimeline()) }, ) ) presenter.test { @@ -244,7 +244,7 @@ class MediaGalleryPresenterTest { ) val presenter = createMediaGalleryPresenter( room = FakeMatrixRoom( - createTimelineResult = { _, _, _ -> Result.success(FakeTimeline()) }, + createTimelineResult = { Result.success(FakeTimeline()) }, ), navigator = navigator, )