Make sure we clean up the pre-processed and uploaded media (#5039)

* Add `MediaSender.cleanUp()` and `MediaPreProcessor.cleanUp()` methods: this will remove the temporary files created when pre-processing media before sending them.

* Make sure we clean up also the previous temporary media.

* Fix the condition for the custom back handler in the attachments preview screen

* Tests: check the clean up is performed when needed
This commit is contained in:
Jorge Martin Espinosa
2025-07-23 08:55:20 +02:00
committed by GitHub
parent 746699b468
commit b219c05d06
7 changed files with 65 additions and 8 deletions

View File

@@ -131,12 +131,17 @@ class AttachmentsPreviewPresenter @AssistedInject constructor(
dismissAfterSend = !useSendQueue,
replyParameters = null,
)
// Clean up the pre-processed media after it's been sent
mediaSender.cleanUp()
}
}
}
AttachmentsPreviewEvents.CancelAndDismiss -> {
// Cancel media preprocessing and sending
preprocessMediaJob?.cancel()
// If we couldn't send the pre-processed media, remove it
mediaSender.cleanUp()
ongoingSendAttachmentJob.value?.cancel()
// Dismiss the screen

View File

@@ -66,7 +66,7 @@ fun AttachmentsPreviewView(
state.eventSink(AttachmentsPreviewEvents.CancelAndClearSendState)
}
BackHandler(enabled = state.sendActionState !is SendActionState.Sending) {
BackHandler(enabled = state.sendActionState !is SendActionState.Sending.Uploading) {
postCancel()
}

View File

@@ -123,8 +123,10 @@ class AttachmentsPreviewPresenterTest {
},
)
val onDoneListener = lambdaRecorder<Unit> { }
val mediaPreProcessor = FakeMediaPreProcessor()
val presenter = createAttachmentsPreviewPresenter(
room = room,
mediaPreProcessor = mediaPreProcessor,
onDoneListener = { onDoneListener() },
)
moleculeFlow(RecompositionMode.Immediate) {
@@ -143,6 +145,7 @@ class AttachmentsPreviewPresenterTest {
assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Done)
sendFileResult.assertions().isCalledOnce()
onDoneListener.assertions().isCalledOnce()
assertThat(mediaPreProcessor.cleanUpCallCount).isEqualTo(1)
}
}
@@ -159,11 +162,10 @@ class AttachmentsPreviewPresenterTest {
)
val onDoneListener = lambdaRecorder<Unit> { }
val processLatch = CompletableDeferred<Unit>()
val mediaPreProcessor = FakeMediaPreProcessor(processLatch)
val presenter = createAttachmentsPreviewPresenter(
room = room,
mediaPreProcessor = FakeMediaPreProcessor(
processLatch = processLatch,
),
mediaPreProcessor = mediaPreProcessor,
onDoneListener = { onDoneListener() },
)
moleculeFlow(RecompositionMode.Immediate) {
@@ -181,6 +183,7 @@ class AttachmentsPreviewPresenterTest {
assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Done)
sendFileResult.assertions().isCalledOnce()
onDoneListener.assertions().isCalledOnce()
assertThat(mediaPreProcessor.cleanUpCallCount).isEqualTo(1)
}
}
@@ -197,11 +200,10 @@ class AttachmentsPreviewPresenterTest {
)
val onDoneListener = lambdaRecorder<Unit> { }
val processLatch = CompletableDeferred<Unit>()
val mediaPreProcessor = FakeMediaPreProcessor(processLatch)
val presenter = createAttachmentsPreviewPresenter(
room = room,
mediaPreProcessor = FakeMediaPreProcessor(
processLatch = processLatch,
),
mediaPreProcessor = mediaPreProcessor,
onDoneListener = { onDoneListener() },
)
moleculeFlow(RecompositionMode.Immediate) {
@@ -219,6 +221,7 @@ class AttachmentsPreviewPresenterTest {
assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Done)
sendFileResult.assertions().isCalledOnce()
onDoneListener.assertions().isCalledOnce()
assertThat(mediaPreProcessor.cleanUpCallCount).isEqualTo(1)
}
}
@@ -279,7 +282,9 @@ class AttachmentsPreviewPresenterTest {
fun `present - cancel scenario`() = runTest {
val onDoneListener = lambdaRecorder<Unit> { }
val deleteCallback = lambdaRecorder<Uri?, Unit> {}
val mediaPreProcessor = FakeMediaPreProcessor()
val presenter = createAttachmentsPreviewPresenter(
mediaPreProcessor = mediaPreProcessor,
temporaryUriDeleter = FakeTemporaryUriDeleter(deleteCallback),
onDoneListener = { onDoneListener() },
)
@@ -293,6 +298,7 @@ class AttachmentsPreviewPresenterTest {
assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Done)
deleteCallback.assertions().isCalledOnce()
onDoneListener.assertions().isCalledOnce()
assertThat(mediaPreProcessor.cleanUpCallCount).isEqualTo(1)
}
}