From aac9642159f7dc91a7f9804e9060794bd325b3f3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Aug 2025 16:41:14 +0200 Subject: [PATCH] Update dependency org.matrix.rustcomponents:sdk-android to v25.8.18 (#5182) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update dependency org.matrix.rustcomponents:sdk-android to v25.8.18 * Fix broken API changes: - The send queue usage is now mandatory. - The media upload progress now comes back in the send queue state (this still hasn't been applied to the UI in the timeline). * Update screenshots --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jorge Martín Co-authored-by: ElementBot --- .../configureroom/ConfigureRoomPresenter.kt | 2 +- .../preview/AttachmentsPreviewPresenter.kt | 13 +----- .../preview/AttachmentsPreviewState.kt | 2 +- .../AttachmentsPreviewStateProvider.kt | 2 +- .../preview/AttachmentsPreviewView.kt | 2 +- .../MessageComposerPresenter.kt | 1 - ...melineItemEventForTimestampViewProvider.kt | 2 +- ...iewStateForTimelineItemEventRowProvider.kt | 2 +- .../receipt/ReadReceiptViewStateProvider.kt | 2 +- .../receipt/TimelineItemReadReceiptView.kt | 2 +- .../AttachmentsPreviewPresenterTest.kt | 44 +++++++++---------- .../impl/attachments/SendActionStateTest.kt | 19 ++++++-- .../MessageComposerPresenterTest.kt | 2 +- .../VoiceMessageComposerPresenterTest.kt | 3 +- .../features/share/impl/SharePresenterTest.kt | 3 +- gradle/libs.versions.toml | 2 +- .../libraries/matrix/api/MatrixClient.kt | 3 +- .../libraries/matrix/api/timeline/Timeline.kt | 6 --- .../item/event/LocalEventSendState.kt | 9 +++- .../libraries/matrix/impl/RustMatrixClient.kt | 6 +-- .../matrix/impl/timeline/RustTimeline.kt | 21 +-------- .../item/event/EventTimelineItemMapper.kt | 15 ++++++- .../libraries/matrix/test/FakeMatrixClient.kt | 2 - .../matrix/test/timeline/FakeTimeline.kt | 40 +++-------------- .../libraries/mediaupload/api/MediaSender.kt | 13 ------ .../mediaupload/api/MediaSenderTest.kt | 10 ++--- ...tachments.preview_AttachmentsView_4_en.png | 4 +- 27 files changed, 85 insertions(+), 147 deletions(-) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt index 397ae74186..9b2880fb6f 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt @@ -203,6 +203,6 @@ class ConfigureRoomPresenter @Inject constructor( mediaOptimizationConfig = mediaOptimizationConfigProvider.get(), ).getOrThrow() val byteArray = preprocessed.file.readBytes() - return matrixClient.uploadMedia(MimeTypes.Jpeg, byteArray, null).getOrThrow() + return matrixClient.uploadMedia(MimeTypes.Jpeg, byteArray).getOrThrow() } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt index 45c5c33e11..93502d3175 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt @@ -32,7 +32,6 @@ import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeImage import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeVideo import io.element.android.libraries.di.annotations.SessionCoroutineScope import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.permalink.PermalinkBuilder import io.element.android.libraries.mediaupload.api.MediaOptimizationConfig import io.element.android.libraries.mediaupload.api.MediaSender @@ -47,7 +46,6 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import timber.log.Timber -import kotlin.coroutines.coroutineContext class AttachmentsPreviewPresenter @AssistedInject constructor( @Assisted private val attachment: Attachment, @@ -304,20 +302,11 @@ class AttachmentsPreviewPresenter @AssistedInject constructor( dismissAfterSend: Boolean, inReplyToEventId: EventId?, ) = runCatchingExceptions { - val context = coroutineContext - val progressCallback = object : ProgressCallback { - override fun onProgress(current: Long, total: Long) { - // Note will not happen if useSendQueue is true - if (context.isActive) { - sendActionState.value = SendActionState.Sending.Uploading(current.toFloat() / total.toFloat(), mediaUploadInfo) - } - } - } + sendActionState.value = SendActionState.Sending.Uploading(mediaUploadInfo) mediaSender.sendPreProcessedMedia( mediaUploadInfo = mediaUploadInfo, caption = caption, formattedCaption = null, - progressCallback = progressCallback, inReplyToEventId = inReplyToEventId, ).getOrThrow() }.fold( diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewState.kt index 71d29cbfb6..96ff83a8a7 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewState.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewState.kt @@ -30,7 +30,7 @@ sealed interface SendActionState { sealed interface Sending : SendActionState { data class Processing(val displayProgress: Boolean) : Sending data class ReadyToUpload(val mediaInfo: MediaUploadInfo) : Sending - data class Uploading(val progress: Float, val mediaUploadInfo: MediaUploadInfo) : Sending + data class Uploading(val mediaUploadInfo: MediaUploadInfo) : Sending } data class Failure(val error: Throwable, val mediaUploadInfo: MediaUploadInfo?) : SendActionState diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewStateProvider.kt index 43410efa46..ac7034efe7 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewStateProvider.kt @@ -39,7 +39,7 @@ open class AttachmentsPreviewStateProvider : PreviewParameterProvider { ProgressDialog( - type = ProgressDialogType.Determinate(sendActionState.progress), + type = ProgressDialogType.Indeterminate, text = stringResource(id = CommonStrings.common_sending), showCancelButton = true, onDismissRequest = onDismissClick, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt index 8e0cce0e9b..d6cf3dc811 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt @@ -510,7 +510,6 @@ class MessageComposerPresenter @AssistedInject constructor( mediaSender.sendMedia( uri = uri, mimeType = mimeType, - progressCallback = null, mediaOptimizationConfig = mediaOptimizationConfigProvider.get(), ).getOrThrow() } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventForTimestampViewProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventForTimestampViewProvider.kt index 568df86295..96d139bfba 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventForTimestampViewProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventForTimestampViewProvider.kt @@ -19,7 +19,7 @@ class TimelineItemEventForTimestampViewProvider : PreviewParameterProvider get() = sequenceOf( aTimelineItemEvent(), - aTimelineItemEvent().copy(localSendState = LocalEventSendState.Sending), + aTimelineItemEvent().copy(localSendState = LocalEventSendState.Sending.Event), aTimelineItemEvent().copy(localSendState = LocalEventSendState.Failed.Unknown("AN_ERROR")), // Edited aTimelineItemEvent().copy(content = aTimelineItemTextContent().copy(isEdited = true)), diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateForTimelineItemEventRowProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateForTimelineItemEventRowProvider.kt index 22440fd634..d32de08178 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateForTimelineItemEventRowProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateForTimelineItemEventRowProvider.kt @@ -17,7 +17,7 @@ class ReadReceiptViewStateForTimelineItemEventRowProvider : override val values: Sequence get() = sequenceOf( aReadReceiptViewState( - sendState = LocalEventSendState.Sending, + sendState = LocalEventSendState.Sending.Event, ), aReadReceiptViewState( sendState = LocalEventSendState.Sent(EventId("\$eventId")), diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateProvider.kt index 770ffe6721..1295abdacc 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/ReadReceiptViewStateProvider.kt @@ -20,7 +20,7 @@ class ReadReceiptViewStateProvider : PreviewParameterProvider get() = sequenceOf( aReadReceiptViewState(), - aReadReceiptViewState(sendState = LocalEventSendState.Sending), + aReadReceiptViewState(sendState = LocalEventSendState.Sending.Event), aReadReceiptViewState(sendState = LocalEventSendState.Sent(EventId("\$eventId"))), aReadReceiptViewState( sendState = LocalEventSendState.Sent(EventId("\$eventId")), diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt index fd6e5cea53..2d783c394c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/receipt/TimelineItemReadReceiptView.kt @@ -76,7 +76,7 @@ fun TimelineItemReadReceiptView( } } else { when (state.sendState) { - LocalEventSendState.Sending -> { + is LocalEventSendState.Sending -> { ReadReceiptsRow(modifier) { Icon( modifier = Modifier.padding(2.dp), diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt index 7f8e10c5b1..2f24322bf9 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt @@ -26,7 +26,6 @@ import io.element.android.libraries.androidutils.file.TemporaryUriDeleter import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.media.AudioInfo import io.element.android.libraries.matrix.api.media.FileInfo import io.element.android.libraries.matrix.api.media.ImageInfo @@ -90,17 +89,11 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send media success scenario`() = runTest { val sendFileResult = - lambdaRecorder> { _, _, _, _, _, _ -> + lambdaRecorder> { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val room = FakeJoinedRoom( - liveTimeline = FakeTimeline( - progressCallbackValues = listOf( - Pair(0, 10), - Pair(5, 10), - Pair(10, 10) - ), - ).apply { + liveTimeline = FakeTimeline().apply { sendFileLambda = sendFileResult }, ) @@ -120,9 +113,7 @@ class AttachmentsPreviewPresenterTest { initialState.eventSink(AttachmentsPreviewEvents.SendAttachment) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = true)) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.ReadyToUpload(mediaUploadInfo)) - assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Uploading(0f, mediaUploadInfo)) - assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Uploading(0.5f, mediaUploadInfo)) - assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Uploading(1f, mediaUploadInfo)) + assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Uploading(mediaUploadInfo)) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Done) sendFileResult.assertions().isCalledOnce() onDoneListener.assertions().isCalledOnce() @@ -133,7 +124,7 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send media after pre-processing success scenario`() = runTest { val sendFileResult = - lambdaRecorder> { _, _, _, _, _, _ -> + lambdaRecorder> { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val room = FakeJoinedRoom( @@ -160,6 +151,7 @@ class AttachmentsPreviewPresenterTest { assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = false)) initialState.eventSink(AttachmentsPreviewEvents.SendAttachment) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.ReadyToUpload(mediaUploadInfo)) + assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Uploading(mediaUploadInfo)) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Done) sendFileResult.assertions().isCalledOnce() onDoneListener.assertions().isCalledOnce() @@ -170,7 +162,7 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send media before pre-processing success scenario`() = runTest { val sendFileResult = - lambdaRecorder> { _, _, _, _, _, _ -> + lambdaRecorder> { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val room = FakeJoinedRoom( @@ -197,6 +189,7 @@ class AttachmentsPreviewPresenterTest { processLatch.complete(Unit) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = true)) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.ReadyToUpload(mediaUploadInfo)) + assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Uploading(mediaUploadInfo)) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Done) sendFileResult.assertions().isCalledOnce() onDoneListener.assertions().isCalledOnce() @@ -281,7 +274,7 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send image with caption success scenario`() = runTest { val sendImageResult = - lambdaRecorder { _: File, _: File?, _: ImageInfo, _: String?, _: String?, _: ProgressCallback?, _: EventId? -> + lambdaRecorder { _: File, _: File?, _: ImageInfo, _: String?, _: String?, _: EventId? -> Result.success(FakeMediaUploadHandler()) } val mediaPreProcessor = FakeMediaPreProcessor().apply { @@ -307,6 +300,7 @@ class AttachmentsPreviewPresenterTest { initialState.eventSink(AttachmentsPreviewEvents.SendAttachment) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = false)) assertThat(awaitItem().sendActionState).isInstanceOf(SendActionState.Sending.ReadyToUpload::class.java) + assertThat(awaitItem().sendActionState).isInstanceOf(SendActionState.Sending.Uploading::class.java) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Done) sendImageResult.assertions().isCalledOnce().with( any(), @@ -315,7 +309,6 @@ class AttachmentsPreviewPresenterTest { value(A_CAPTION), any(), any(), - any(), ) onDoneListener.assertions().isCalledOnce() } @@ -324,7 +317,7 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send video with caption success scenario`() = runTest { val sendVideoResult = - lambdaRecorder { _: File, _: File?, _: VideoInfo, _: String?, _: String?, _: ProgressCallback?, _: EventId? -> + lambdaRecorder { _: File, _: File?, _: VideoInfo, _: String?, _: String?, _: EventId? -> Result.success(FakeMediaUploadHandler()) } val mediaPreProcessor = FakeMediaPreProcessor().apply { @@ -350,6 +343,7 @@ class AttachmentsPreviewPresenterTest { initialState.eventSink(AttachmentsPreviewEvents.SendAttachment) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = false)) assertThat(awaitItem().sendActionState).isInstanceOf(SendActionState.Sending.ReadyToUpload::class.java) + assertThat(awaitItem().sendActionState).isInstanceOf(SendActionState.Sending.Uploading::class.java) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Done) sendVideoResult.assertions().isCalledOnce().with( any(), @@ -358,7 +352,6 @@ class AttachmentsPreviewPresenterTest { value(A_CAPTION), any(), any(), - any(), ) onDoneListener.assertions().isCalledOnce() } @@ -367,7 +360,7 @@ class AttachmentsPreviewPresenterTest { @Test fun `present - send audio with caption success scenario`() = runTest { val sendAudioResult = - lambdaRecorder> { _, _, _, _, _, _ -> + lambdaRecorder> { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val mediaPreProcessor = FakeMediaPreProcessor().apply { @@ -391,6 +384,7 @@ class AttachmentsPreviewPresenterTest { initialState.eventSink(AttachmentsPreviewEvents.SendAttachment) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = false)) assertThat(awaitItem().sendActionState).isInstanceOf(SendActionState.Sending.ReadyToUpload::class.java) + assertThat(awaitItem().sendActionState).isInstanceOf(SendActionState.Sending.Uploading::class.java) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Done) sendAudioResult.assertions().isCalledOnce().with( any(), @@ -398,7 +392,6 @@ class AttachmentsPreviewPresenterTest { value(A_CAPTION), any(), any(), - any(), ) onDoneListener.assertions().isCalledOnce() } @@ -408,7 +401,7 @@ class AttachmentsPreviewPresenterTest { fun `present - send media failure scenario`() = runTest { val failure = MediaPreProcessor.Failure(null) val sendFileResult = - lambdaRecorder> { _, _, _, _, _, _ -> + lambdaRecorder> { _, _, _, _, _ -> Result.failure(failure) } val onDoneListenerResult = lambdaRecorder {} @@ -426,6 +419,7 @@ class AttachmentsPreviewPresenterTest { initialState.eventSink(AttachmentsPreviewEvents.SendAttachment) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = false)) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.ReadyToUpload(mediaUploadInfo)) + assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Uploading(mediaUploadInfo)) // Check that the onDoneListener is called so the screen would be dismissed onDoneListenerResult.assertions().isCalledOnce() @@ -445,7 +439,7 @@ class AttachmentsPreviewPresenterTest { val presenter = createAttachmentsPreviewPresenter( room = FakeJoinedRoom( liveTimeline = FakeTimeline().apply { - sendFileLambda = { _, _, _, _, _, _ -> + sendFileLambda = { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } } @@ -460,7 +454,9 @@ class AttachmentsPreviewPresenterTest { initialState.eventSink(AttachmentsPreviewEvents.SendAttachment) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = false)) assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.ReadyToUpload(mediaUploadInfo)) + assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Uploading(mediaUploadInfo)) initialState.eventSink(AttachmentsPreviewEvents.CancelAndClearSendState) + assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.ReadyToUpload(mediaUploadInfo)) // The sending is cancelled and the state is kept at ReadyToUpload ensureAllEventsConsumed() @@ -480,7 +476,7 @@ class AttachmentsPreviewPresenterTest { localMedia = localMedia, room = FakeJoinedRoom( liveTimeline = FakeTimeline().apply { - sendFileLambda = { _, _, _, _, _, _ -> + sendFileLambda = { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } } @@ -521,7 +517,7 @@ class AttachmentsPreviewPresenterTest { localMedia = localMedia, room = FakeJoinedRoom( liveTimeline = FakeTimeline().apply { - sendFileLambda = { _, _, _, _, _, _ -> + sendFileLambda = { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/SendActionStateTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/SendActionStateTest.kt index 10290610dc..7a6dc988a4 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/SendActionStateTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/SendActionStateTest.kt @@ -17,10 +17,21 @@ class SendActionStateTest { @Test fun `mediaUploadInfo() should return the value from Uploading class`() { val mediaUploadInfo: MediaUploadInfo = aMediaUploadInfo() - val state: SendActionState = SendActionState.Sending.Uploading( - progress = 0.5f, - mediaUploadInfo = aMediaUploadInfo() - ) + val state: SendActionState = SendActionState.Sending.Uploading(mediaUploadInfo = aMediaUploadInfo()) + assertThat(state.mediaUploadInfo()).isEqualTo(mediaUploadInfo) + } + + @Test + fun `mediaUploadInfo() should return the value from ReadyToUpload class`() { + val mediaUploadInfo: MediaUploadInfo = aMediaUploadInfo() + val state: SendActionState = SendActionState.Sending.ReadyToUpload(mediaInfo = aMediaUploadInfo()) + assertThat(state.mediaUploadInfo()).isEqualTo(mediaUploadInfo) + } + + @Test + fun `mediaUploadInfo() should return the value from Failure class`() { + val mediaUploadInfo: MediaUploadInfo = aMediaUploadInfo() + val state: SendActionState = SendActionState.Failure(error = IllegalStateException("An error"), mediaUploadInfo = aMediaUploadInfo()) assertThat(state.mediaUploadInfo()).isEqualTo(mediaUploadInfo) } } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt index c0df1a2b19..4f9d538244 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt @@ -1181,7 +1181,7 @@ class MessageComposerPresenterTest { room = FakeJoinedRoom( typingNoticeResult = { Result.success(Unit) }, liveTimeline = FakeTimeline().apply { - sendFileLambda = { _, _, _, _, _, _ -> + sendFileLambda = { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerPresenterTest.kt index 9f9b8526a1..347b2f0dfb 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/voicemessages/composer/VoiceMessageComposerPresenterTest.kt @@ -20,7 +20,6 @@ import im.vector.app.features.analytics.plan.Composer import io.element.android.features.messages.impl.messagecomposer.aReplyMode import io.element.android.features.messages.test.FakeMessageComposerContext import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.media.AudioInfo import io.element.android.libraries.matrix.test.media.FakeMediaUploadHandler import io.element.android.libraries.matrix.test.room.FakeJoinedRoom @@ -64,7 +63,7 @@ class VoiceMessageComposerPresenterTest { ) private val analyticsService = FakeAnalyticsService() private val sendVoiceMessageResult = - lambdaRecorder, ProgressCallback?, EventId?, Result> { _, _, _, _, _ -> + lambdaRecorder, EventId?, Result> { _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } private val joinedRoom = FakeJoinedRoom( diff --git a/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/SharePresenterTest.kt b/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/SharePresenterTest.kt index a9346fbf6e..7ddb7d0ae4 100644 --- a/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/SharePresenterTest.kt +++ b/features/share/impl/src/test/kotlin/io/element/android/features/share/impl/SharePresenterTest.kt @@ -17,7 +17,6 @@ import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.media.FileInfo import io.element.android.libraries.matrix.test.A_MESSAGE import io.element.android.libraries.matrix.test.A_ROOM_ID @@ -122,7 +121,7 @@ class SharePresenterTest { @Test fun `present - send media ok`() = runTest { val sendFileResult = - lambdaRecorder> { _, _, _, _, _, _ -> + lambdaRecorder> { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val joinedRoom = FakeJoinedRoom( diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4b29295472..1f3a428cda 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -176,7 +176,7 @@ jsoup = "org.jsoup:jsoup:1.21.1" appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" } molecule-runtime = "app.cash.molecule:molecule-runtime:2.1.0" timber = "com.jakewharton.timber:timber:5.0.1" -matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.8.5" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.8.18" matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" } matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" } sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt index e8c346cf9e..46814f4800 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt @@ -10,7 +10,6 @@ package io.element.android.libraries.matrix.api import io.element.android.libraries.core.data.tryOrNull import io.element.android.libraries.matrix.api.core.DeviceId import io.element.android.libraries.matrix.api.core.MatrixPatterns -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.core.RoomAlias import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomIdOrAlias @@ -94,7 +93,7 @@ interface MatrixClient { */ suspend fun getUserProfile(): Result suspend fun getAccountManagementUrl(action: AccountManagementAction?): Result - suspend fun uploadMedia(mimeType: String, data: ByteArray, progressCallback: ProgressCallback?): Result + suspend fun uploadMedia(mimeType: String, data: ByteArray): Result fun roomMembershipObserver(): RoomMembershipObserver /** diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt index 9bcdafb913..4e7b64e1d5 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt @@ -8,7 +8,6 @@ package io.element.android.libraries.matrix.api.timeline import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.TransactionId import io.element.android.libraries.matrix.api.media.AudioInfo @@ -88,7 +87,6 @@ interface Timeline : AutoCloseable { imageInfo: ImageInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result @@ -98,7 +96,6 @@ interface Timeline : AutoCloseable { videoInfo: VideoInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result @@ -107,7 +104,6 @@ interface Timeline : AutoCloseable { audioInfo: AudioInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result @@ -116,7 +112,6 @@ interface Timeline : AutoCloseable { fileInfo: FileInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result @@ -145,7 +140,6 @@ interface Timeline : AutoCloseable { file: File, audioInfo: AudioInfo, waveform: List, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/LocalEventSendState.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/LocalEventSendState.kt index d43ec0b8ce..f28ef46c66 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/LocalEventSendState.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/LocalEventSendState.kt @@ -14,7 +14,14 @@ import io.element.android.libraries.matrix.api.core.UserId @Immutable sealed interface LocalEventSendState { - data object Sending : LocalEventSendState + sealed interface Sending : LocalEventSendState { + data object Event : Sending + data class MediaWithProgress( + val index: Long, + val progress: Long, + val total: Long + ) : Sending + } sealed interface Failed : LocalEventSendState { data class Unknown(val error: String) : Failed data object SendingFromUnverifiedDevice : Failed 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 bb5ff45e15..f2e2270019 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 @@ -16,7 +16,6 @@ import io.element.android.libraries.core.extensions.mapFailure import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.DeviceId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.core.RoomAlias import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomIdOrAlias @@ -48,7 +47,6 @@ import io.element.android.libraries.matrix.api.sync.SyncState import io.element.android.libraries.matrix.api.user.MatrixSearchUserResults import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.api.verification.SessionVerificationService -import io.element.android.libraries.matrix.impl.core.toProgressWatcher import io.element.android.libraries.matrix.impl.encryption.RustEncryptionService import io.element.android.libraries.matrix.impl.exception.mapClientException import io.element.android.libraries.matrix.impl.media.RustMediaLoader @@ -627,9 +625,9 @@ class RustMatrixClient( } } - override suspend fun uploadMedia(mimeType: String, data: ByteArray, progressCallback: ProgressCallback?): Result = withContext(sessionDispatcher) { + override suspend fun uploadMedia(mimeType: String, data: ByteArray): Result = withContext(sessionDispatcher) { runCatchingExceptions { - innerClient.uploadMedia(mimeType, data, progressCallback?.toProgressWatcher()) + innerClient.uploadMedia(mimeType, data, progressWatcher = null) } } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt index b1540d353d..b3767d821c 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt @@ -9,7 +9,6 @@ package io.element.android.libraries.matrix.impl.timeline import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.media.AudioInfo import io.element.android.libraries.matrix.api.media.FileInfo @@ -27,7 +26,6 @@ import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.TimelineException import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId import io.element.android.libraries.matrix.api.timeline.item.event.InReplyTo -import io.element.android.libraries.matrix.impl.core.toProgressWatcher import io.element.android.libraries.matrix.impl.media.MediaUploadHandlerImpl import io.element.android.libraries.matrix.impl.media.map import io.element.android.libraries.matrix.impl.media.toMSC3246range @@ -336,7 +334,6 @@ class RustTimeline( imageInfo: ImageInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result { return sendAttachment(listOfNotNull(file, thumbnailFile)) { @@ -347,13 +344,11 @@ class RustTimeline( formattedCaption = formattedCaption?.let { FormattedBody(body = it, format = MessageFormat.Html) }, - useSendQueue = true, mentions = null, inReplyTo = inReplyToEventId?.value, ), - thumbnailPath = thumbnailFile?.path, + thumbnailSource = thumbnailFile?.path?.let(UploadSource::File), imageInfo = imageInfo.map(), - progressWatcher = progressCallback?.toProgressWatcher() ) } } @@ -364,7 +359,6 @@ class RustTimeline( videoInfo: VideoInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result { return sendAttachment(listOfNotNull(file, thumbnailFile)) { @@ -375,13 +369,11 @@ class RustTimeline( formattedCaption = formattedCaption?.let { FormattedBody(body = it, format = MessageFormat.Html) }, - useSendQueue = true, mentions = null, inReplyTo = inReplyToEventId?.value, ), - thumbnailPath = thumbnailFile?.path, + thumbnailSource = thumbnailFile?.path?.let(UploadSource::File), videoInfo = videoInfo.map(), - progressWatcher = progressCallback?.toProgressWatcher() ) } } @@ -391,7 +383,6 @@ class RustTimeline( audioInfo: AudioInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result { return sendAttachment(listOf(file)) { @@ -402,12 +393,10 @@ class RustTimeline( formattedCaption = formattedCaption?.let { FormattedBody(body = it, format = MessageFormat.Html) }, - useSendQueue = true, mentions = null, inReplyTo = inReplyToEventId?.value, ), audioInfo = audioInfo.map(), - progressWatcher = progressCallback?.toProgressWatcher() ) } } @@ -417,7 +406,6 @@ class RustTimeline( fileInfo: FileInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result { return sendAttachment(listOf(file)) { @@ -428,12 +416,10 @@ class RustTimeline( formattedCaption = formattedCaption?.let { FormattedBody(body = it, format = MessageFormat.Html) }, - useSendQueue = true, mentions = null, inReplyTo = inReplyToEventId?.value, ), fileInfo = fileInfo.map(), - progressWatcher = progressCallback?.toProgressWatcher(), ) } } @@ -479,7 +465,6 @@ class RustTimeline( file: File, audioInfo: AudioInfo, waveform: List, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result { return sendAttachment(listOf(file)) { @@ -489,13 +474,11 @@ class RustTimeline( // Maybe allow a caption in the future? caption = null, formattedCaption = null, - useSendQueue = true, mentions = null, inReplyTo = inReplyToEventId?.value, ), audioInfo = audioInfo.map(), waveform = waveform.toMSC3246range(), - progressWatcher = progressCallback?.toProgressWatcher(), ) } } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt index 7cea0e29f4..d923cd420c 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/EventTimelineItemMapper.kt @@ -79,7 +79,18 @@ fun RustProfileDetails.map(): ProfileTimelineDetails { fun RustEventSendState?.map(): LocalEventSendState? { return when (this) { null -> null - RustEventSendState.NotSentYet -> LocalEventSendState.Sending + is RustEventSendState.NotSentYet -> { + val mediaUploadProgress = this.progress + if (mediaUploadProgress != null) { + LocalEventSendState.Sending.MediaWithProgress( + index = mediaUploadProgress.index.toLong(), + progress = mediaUploadProgress.progress.current.toLong(), + total = mediaUploadProgress.progress.total.toLong(), + ) + } else { + LocalEventSendState.Sending.Event + } + } is RustEventSendState.SendingFailed -> { when (val queueWedgeError = error) { QueueWedgeError.CrossVerificationRequired -> { @@ -98,7 +109,7 @@ fun RustEventSendState?.map(): LocalEventSendState? { } is QueueWedgeError.GenericApiError -> { if (isRecoverable) { - LocalEventSendState.Sending + LocalEventSendState.Sending.Event } else { LocalEventSendState.Failed.Unknown(queueWedgeError.msg) } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt index 41ceb72200..13b26c8137 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt @@ -9,7 +9,6 @@ package io.element.android.libraries.matrix.test import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.DeviceId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.core.RoomAlias import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomIdOrAlias @@ -201,7 +200,6 @@ class FakeMatrixClient( override suspend fun uploadMedia( mimeType: String, data: ByteArray, - progressCallback: ProgressCallback? ): Result { return uploadMediaResult } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt index dd0bf02d4d..ad5505e426 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt @@ -8,7 +8,6 @@ package io.element.android.libraries.matrix.test.timeline import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.TransactionId import io.element.android.libraries.matrix.api.media.AudioInfo @@ -27,7 +26,6 @@ import io.element.android.libraries.matrix.api.timeline.item.event.InReplyTo import io.element.android.libraries.matrix.test.media.FakeMediaUploadHandler import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.simulateLongTask -import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -49,7 +47,6 @@ class FakeTimeline( ) ), override val membershipChangeEventReceived: Flow = MutableSharedFlow(), - private val progressCallbackValues: List> = emptyList(), private val cancelSendResult: (TransactionId) -> Result = { lambdaError() }, ) : Timeline { var sendMessageLambda: ( @@ -150,9 +147,8 @@ class FakeTimeline( imageInfo: ImageInfo, body: String?, formattedBody: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, - ) -> Result = { _, _, _, _, _, _, _ -> + ) -> Result = { _, _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } @@ -162,17 +158,14 @@ class FakeTimeline( imageInfo: ImageInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, ): Result = simulateLongTask { - simulateSendMediaProgress(progressCallback) sendImageLambda( file, thumbnailFile, imageInfo, caption, formattedCaption, - progressCallback, inReplyToEventId, ) } @@ -183,9 +176,8 @@ class FakeTimeline( videoInfo: VideoInfo, body: String?, formattedBody: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, - ) -> Result = { _, _, _, _, _, _, _ -> + ) -> Result = { _, _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } @@ -195,17 +187,14 @@ class FakeTimeline( videoInfo: VideoInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, ): Result = simulateLongTask { - simulateSendMediaProgress(progressCallback) sendVideoLambda( file, thumbnailFile, videoInfo, caption, formattedCaption, - progressCallback, inReplyToEventId, ) } @@ -215,9 +204,8 @@ class FakeTimeline( audioInfo: AudioInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, - ) -> Result = { _, _, _, _, _, _ -> + ) -> Result = { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } @@ -226,16 +214,13 @@ class FakeTimeline( audioInfo: AudioInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, ): Result = simulateLongTask { - simulateSendMediaProgress(progressCallback) sendAudioLambda( file, audioInfo, caption, formattedCaption, - progressCallback, inReplyToEventId, ) } @@ -245,9 +230,8 @@ class FakeTimeline( fileInfo: FileInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, - ) -> Result = { _, _, _, _, _, _ -> + ) -> Result = { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } @@ -256,16 +240,13 @@ class FakeTimeline( fileInfo: FileInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, ): Result = simulateLongTask { - simulateSendMediaProgress(progressCallback) sendFileLambda( file, fileInfo, caption, formattedCaption, - progressCallback, inReplyToEventId, ) } @@ -274,9 +255,8 @@ class FakeTimeline( file: File, audioInfo: AudioInfo, waveform: List, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, - ) -> Result = { _, _, _, _, _ -> + ) -> Result = { _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } @@ -284,15 +264,12 @@ class FakeTimeline( file: File, audioInfo: AudioInfo, waveform: List, - progressCallback: ProgressCallback?, inReplyToEventId: EventId??, ): Result = simulateLongTask { - simulateSendMediaProgress(progressCallback) sendVoiceMessageLambda( file, audioInfo, waveform, - progressCallback, inReplyToEventId, ) } @@ -460,12 +437,5 @@ class FakeTimeline( closeCounter++ } - private suspend fun simulateSendMediaProgress(progressCallback: ProgressCallback?) { - progressCallbackValues.forEach { (current, total) -> - progressCallback?.onProgress(current, total) - delay(1) - } - } - override fun toString() = "FakeTimeline: $name" } diff --git a/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaSender.kt b/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaSender.kt index a010b892a8..9d893cc1b6 100644 --- a/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaSender.kt +++ b/libraries/mediaupload/api/src/main/kotlin/io/element/android/libraries/mediaupload/api/MediaSender.kt @@ -10,7 +10,6 @@ package io.element.android.libraries.mediaupload.api import android.net.Uri import io.element.android.libraries.core.extensions.flatMapCatching import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.media.MediaUploadHandler import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.timeline.Timeline @@ -45,12 +44,10 @@ class MediaSender @Inject constructor( mediaUploadInfo: MediaUploadInfo, caption: String?, formattedCaption: String?, - progressCallback: ProgressCallback?, inReplyToEventId: EventId?, ): Result { return room.liveTimeline.sendMedia( uploadInfo = mediaUploadInfo, - progressCallback = progressCallback, caption = caption, formattedCaption = formattedCaption, inReplyToEventId = inReplyToEventId, @@ -63,7 +60,6 @@ class MediaSender @Inject constructor( mimeType: String, caption: String? = null, formattedCaption: String? = null, - progressCallback: ProgressCallback? = null, inReplyToEventId: EventId? = null, mediaOptimizationConfig: MediaOptimizationConfig, ): Result { @@ -77,7 +73,6 @@ class MediaSender @Inject constructor( .flatMapCatching { info -> room.liveTimeline.sendMedia( uploadInfo = info, - progressCallback = progressCallback, caption = caption, formattedCaption = formattedCaption, inReplyToEventId = inReplyToEventId, @@ -90,7 +85,6 @@ class MediaSender @Inject constructor( uri: Uri, mimeType: String, waveForm: List, - progressCallback: ProgressCallback? = null, inReplyToEventId: EventId? = null, ): Result { return preProcessor @@ -109,7 +103,6 @@ class MediaSender @Inject constructor( ) room.liveTimeline.sendMedia( uploadInfo = newInfo, - progressCallback = progressCallback, caption = null, formattedCaption = null, inReplyToEventId = inReplyToEventId, @@ -131,7 +124,6 @@ class MediaSender @Inject constructor( private suspend fun Timeline.sendMedia( uploadInfo: MediaUploadInfo, - progressCallback: ProgressCallback?, caption: String?, formattedCaption: String?, inReplyToEventId: EventId?, @@ -144,7 +136,6 @@ class MediaSender @Inject constructor( imageInfo = uploadInfo.imageInfo, caption = caption, formattedCaption = formattedCaption, - progressCallback = progressCallback, inReplyToEventId = inReplyToEventId, ) } @@ -155,7 +146,6 @@ class MediaSender @Inject constructor( videoInfo = uploadInfo.videoInfo, caption = caption, formattedCaption = formattedCaption, - progressCallback = progressCallback, inReplyToEventId = inReplyToEventId, ) } @@ -165,7 +155,6 @@ class MediaSender @Inject constructor( audioInfo = uploadInfo.audioInfo, caption = caption, formattedCaption = formattedCaption, - progressCallback = progressCallback, inReplyToEventId = inReplyToEventId, ) } @@ -174,7 +163,6 @@ class MediaSender @Inject constructor( file = uploadInfo.file, audioInfo = uploadInfo.audioInfo, waveform = uploadInfo.waveform, - progressCallback = progressCallback, inReplyToEventId = inReplyToEventId, ) } @@ -184,7 +172,6 @@ class MediaSender @Inject constructor( fileInfo = uploadInfo.fileInfo, caption = caption, formattedCaption = formattedCaption, - progressCallback = progressCallback, inReplyToEventId = inReplyToEventId, ) } diff --git a/libraries/mediaupload/api/src/test/kotlin/io/element/android/libraries/mediaupload/api/MediaSenderTest.kt b/libraries/mediaupload/api/src/test/kotlin/io/element/android/libraries/mediaupload/api/MediaSenderTest.kt index 7ed36ce492..6978708a61 100644 --- a/libraries/mediaupload/api/src/test/kotlin/io/element/android/libraries/mediaupload/api/MediaSenderTest.kt +++ b/libraries/mediaupload/api/src/test/kotlin/io/element/android/libraries/mediaupload/api/MediaSenderTest.kt @@ -11,7 +11,6 @@ import android.net.Uri import com.google.common.truth.Truth.assertThat import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.matrix.api.core.EventId -import io.element.android.libraries.matrix.api.core.ProgressCallback import io.element.android.libraries.matrix.api.media.FileInfo import io.element.android.libraries.matrix.api.media.ImageInfo import io.element.android.libraries.matrix.api.room.JoinedRoom @@ -50,10 +49,9 @@ class MediaSenderTest { FileInfo, String?, String?, - ProgressCallback?, EventId?, Result, - > { _, _, _, _, _, _ -> + > { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } }, @@ -69,7 +67,7 @@ class MediaSenderTest { @Test fun `given an attachment when sending it the Room will call sendMedia`() = runTest { val sendImageResult = - lambdaRecorder { _: File, _: File?, _: ImageInfo, _: String?, _: String?, _: ProgressCallback?, _: EventId? -> + lambdaRecorder { _: File, _: File?, _: ImageInfo, _: String?, _: String?, _: EventId? -> Result.success(FakeMediaUploadHandler()) } val room = FakeJoinedRoom( @@ -102,7 +100,7 @@ class MediaSenderTest { givenImageResult() } val sendImageResult = - lambdaRecorder { _: File, _: File?, _: ImageInfo, _: String?, _: String?, _: ProgressCallback?, _: EventId? -> + lambdaRecorder { _: File, _: File?, _: ImageInfo, _: String?, _: String?, _: EventId? -> Result.failure(Exception()) } val room = FakeJoinedRoom( @@ -125,7 +123,7 @@ class MediaSenderTest { @Test fun `given a cancellation in the media upload when sending the job is cancelled`() = runTest(StandardTestDispatcher()) { val sendFileResult = - lambdaRecorder> { _, _, _, _, _, _ -> + lambdaRecorder> { _, _, _, _, _ -> Result.success(FakeMediaUploadHandler()) } val room = FakeJoinedRoom( diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_4_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_4_en.png index 4d22ff1440..3dbe80b1b5 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.attachments.preview_AttachmentsView_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b7f8dcc85cdf10964b20bb2db7e74ed0c86c3450c31995ea0f15ca0b9a893356 -size 59333 +oid sha256:8088d0a6abe61b16595574f4cf6b18af122a1e7caba61c560b7bd22af0c1fcad +size 59371