Skip to content

Commit d04434e

Browse files
committed
Remove FeatureFlag.MediaUploadOnSendQueue
1 parent 34efd2c commit d04434e

File tree

10 files changed

+12
-110
lines changed

10 files changed

+12
-110
lines changed

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ import io.element.android.libraries.core.extensions.runCatchingExceptions
3131
import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeImage
3232
import io.element.android.libraries.core.mimetype.MimeTypes.isMimeTypeVideo
3333
import io.element.android.libraries.di.annotations.SessionCoroutineScope
34-
import io.element.android.libraries.featureflag.api.FeatureFlagService
35-
import io.element.android.libraries.featureflag.api.FeatureFlags
3634
import io.element.android.libraries.matrix.api.core.EventId
3735
import io.element.android.libraries.matrix.api.core.ProgressCallback
3836
import io.element.android.libraries.matrix.api.permalink.PermalinkBuilder
@@ -57,7 +55,6 @@ class AttachmentsPreviewPresenter @AssistedInject constructor(
5755
private val mediaSender: MediaSender,
5856
private val permalinkBuilder: PermalinkBuilder,
5957
private val temporaryUriDeleter: TemporaryUriDeleter,
60-
private val featureFlagService: FeatureFlagService,
6158
private val mediaOptimizationSelectorPresenterFactory: MediaOptimizationSelectorPresenter.Factory,
6259
@SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope,
6360
private val dispatchers: CoroutineDispatchers,
@@ -85,7 +82,6 @@ class AttachmentsPreviewPresenter @AssistedInject constructor(
8582

8683
val ongoingSendAttachmentJob = remember { mutableStateOf<Job?>(null) }
8784

88-
var useSendQueue by remember { mutableStateOf(false) }
8985
var preprocessMediaJob by remember { mutableStateOf<Job?>(null) }
9086

9187
val mediaAttachment = attachment as Attachment.Media
@@ -98,10 +94,6 @@ class AttachmentsPreviewPresenter @AssistedInject constructor(
9894

9995
var displayFileTooLargeError by remember { mutableStateOf(false) }
10096

101-
LaunchedEffect(Unit) {
102-
useSendQueue = featureFlagService.isFeatureEnabled(FeatureFlags.MediaUploadOnSendQueue)
103-
}
104-
10597
LaunchedEffect(mediaOptimizationSelectorState.displayMediaSelectorViews) {
10698
// If the media optimization selector is not displayed, we can pre-process the media
10799
// to prepare it for sending. This is done to avoid blocking the UI thread when the
@@ -174,18 +166,17 @@ class AttachmentsPreviewPresenter @AssistedInject constructor(
174166
.takeIf { it.isNotEmpty() }
175167

176168
// If we're supposed to send the media as a background job, we can dismiss this screen already
177-
if (useSendQueue && coroutineContext.isActive) {
169+
if (coroutineContext.isActive) {
178170
onDoneListener()
179171
}
180172

181-
// If using the send queue, send it using the session coroutine scope so it doesn't matter if this screen or the chat one are closed
182-
val sendMediaCoroutineScope = if (useSendQueue) sessionCoroutineScope else coroutineScope
183-
sendMediaCoroutineScope.launch(dispatchers.io) {
173+
// Send the media using the session coroutine scope so it doesn't matter if this screen or the chat one are closed
174+
sessionCoroutineScope.launch(dispatchers.io) {
184175
sendPreProcessedMedia(
185176
mediaUploadInfo = mediaUploadInfo,
186177
caption = caption,
187178
sendActionState = sendActionState,
188-
dismissAfterSend = !useSendQueue,
179+
dismissAfterSend = false,
189180
inReplyToEventId = null,
190181
)
191182

features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/attachments/AttachmentsPreviewPresenterTest.kt

Lines changed: 3 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ import io.element.android.features.messages.test.attachments.video.FakeMediaOpti
2525
import io.element.android.libraries.androidutils.file.TemporaryUriDeleter
2626
import io.element.android.libraries.architecture.AsyncData
2727
import io.element.android.libraries.core.mimetype.MimeTypes
28-
import io.element.android.libraries.featureflag.api.FeatureFlags
29-
import io.element.android.libraries.featureflag.test.FakeFeatureFlagService
3028
import io.element.android.libraries.matrix.api.core.EventId
3129
import io.element.android.libraries.matrix.api.core.ProgressCallback
3230
import io.element.android.libraries.matrix.api.media.AudioInfo
@@ -407,37 +405,7 @@ class AttachmentsPreviewPresenterTest {
407405
}
408406

409407
@Test
410-
fun `present - send media failure scenario without media queue`() = runTest {
411-
val failure = MediaPreProcessor.Failure(null)
412-
val sendFileResult =
413-
lambdaRecorder<File, FileInfo, String?, String?, ProgressCallback?, EventId?, Result<FakeMediaUploadHandler>> { _, _, _, _, _, _ ->
414-
Result.failure(failure)
415-
}
416-
val room = FakeJoinedRoom(
417-
liveTimeline = FakeTimeline().apply {
418-
sendFileLambda = sendFileResult
419-
},
420-
)
421-
val presenter = createAttachmentsPreviewPresenter(room = room, mediaUploadOnSendQueueEnabled = false)
422-
moleculeFlow(RecompositionMode.Immediate) {
423-
presenter.present()
424-
}.test {
425-
val initialState = awaitItem()
426-
assertThat(initialState.sendActionState).isEqualTo(SendActionState.Idle)
427-
initialState.eventSink(AttachmentsPreviewEvents.SendAttachment)
428-
assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = false))
429-
assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.ReadyToUpload(mediaUploadInfo))
430-
val failureState = awaitItem()
431-
assertThat(failureState.sendActionState).isEqualTo(SendActionState.Failure(failure, mediaUploadInfo))
432-
sendFileResult.assertions().isCalledOnce()
433-
failureState.eventSink(AttachmentsPreviewEvents.CancelAndClearSendState)
434-
val clearedState = awaitLastSequentialItem()
435-
assertThat(clearedState.sendActionState).isEqualTo(SendActionState.Sending.ReadyToUpload(mediaUploadInfo))
436-
}
437-
}
438-
439-
@Test
440-
fun `present - send media failure scenario with media queue`() = runTest {
408+
fun `present - send media failure scenario`() = runTest {
441409
val failure = MediaPreProcessor.Failure(null)
442410
val sendFileResult =
443411
lambdaRecorder<File, FileInfo, String?, String?, ProgressCallback?, EventId?, Result<FakeMediaUploadHandler>> { _, _, _, _, _, _ ->
@@ -449,7 +417,7 @@ class AttachmentsPreviewPresenterTest {
449417
sendFileLambda = sendFileResult
450418
},
451419
)
452-
val presenter = createAttachmentsPreviewPresenter(room = room, mediaUploadOnSendQueueEnabled = true, onDoneListener = onDoneListenerResult)
420+
val presenter = createAttachmentsPreviewPresenter(room = room, onDoneListener = onDoneListenerResult)
453421
moleculeFlow(RecompositionMode.Immediate) {
454422
presenter.present()
455423
}.test {
@@ -472,24 +440,7 @@ class AttachmentsPreviewPresenterTest {
472440
}
473441

474442
@Test
475-
fun `present - dismissing the progress dialog stops media upload without media queue`() = runTest {
476-
val presenter = createAttachmentsPreviewPresenter(mediaUploadOnSendQueueEnabled = false)
477-
moleculeFlow(RecompositionMode.Immediate) {
478-
presenter.present()
479-
}.test {
480-
val initialState = awaitItem()
481-
assertThat(initialState.sendActionState).isEqualTo(SendActionState.Idle)
482-
initialState.eventSink(AttachmentsPreviewEvents.SendAttachment)
483-
assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.Processing(displayProgress = false))
484-
assertThat(awaitItem().sendActionState).isEqualTo(SendActionState.Sending.ReadyToUpload(mediaUploadInfo))
485-
initialState.eventSink(AttachmentsPreviewEvents.CancelAndClearSendState)
486-
// The sending is cancelled and the state is kept at ReadyToUpload
487-
ensureAllEventsConsumed()
488-
}
489-
}
490-
491-
@Test
492-
fun `present - dismissing the progress dialog stops media upload with media queue`() = runTest {
443+
fun `present - dismissing the progress dialog stops media upload`() = runTest {
493444
val onDoneListenerResult = lambdaRecorder<Unit> {}
494445
val presenter = createAttachmentsPreviewPresenter(
495446
room = FakeJoinedRoom(
@@ -499,7 +450,6 @@ class AttachmentsPreviewPresenterTest {
499450
}
500451
}
501452
),
502-
mediaUploadOnSendQueueEnabled = true,
503453
onDoneListener = onDoneListenerResult,
504454
)
505455
moleculeFlow(RecompositionMode.Immediate) {
@@ -535,7 +485,6 @@ class AttachmentsPreviewPresenterTest {
535485
}
536486
}
537487
),
538-
mediaUploadOnSendQueueEnabled = true,
539488
onDoneListener = onDoneListenerResult,
540489
mediaOptimizationSelectorPresenterFactory = FakeMediaOptimizationSelectorPresenterFactory {
541490
MediaOptimizationSelectorState(
@@ -577,7 +526,6 @@ class AttachmentsPreviewPresenterTest {
577526
}
578527
}
579528
),
580-
mediaUploadOnSendQueueEnabled = true,
581529
onDoneListener = onDoneListenerResult,
582530
mediaOptimizationSelectorPresenterFactory = FakeMediaOptimizationSelectorPresenterFactory {
583531
MediaOptimizationSelectorState(
@@ -633,7 +581,6 @@ class AttachmentsPreviewPresenterTest {
633581
mediaPreProcessor: MediaPreProcessor = FakeMediaPreProcessor(),
634582
temporaryUriDeleter: TemporaryUriDeleter = FakeTemporaryUriDeleter(),
635583
onDoneListener: OnDoneListener = OnDoneListener { lambdaError() },
636-
mediaUploadOnSendQueueEnabled: Boolean = true,
637584
displayMediaQualitySelectorViews: Boolean = false,
638585
mediaOptimizationSelectorPresenterFactory: FakeMediaOptimizationSelectorPresenterFactory = FakeMediaOptimizationSelectorPresenterFactory(
639586
fakePresenter = {
@@ -657,11 +604,6 @@ class AttachmentsPreviewPresenterTest {
657604
}),
658605
permalinkBuilder = permalinkBuilder,
659606
temporaryUriDeleter = temporaryUriDeleter,
660-
featureFlagService = FakeFeatureFlagService(
661-
initialState = mapOf(
662-
FeatureFlags.MediaUploadOnSendQueue.key to mediaUploadOnSendQueueEnabled,
663-
),
664-
),
665607
sessionCoroutineScope = this,
666608
dispatchers = testCoroutineDispatchers(),
667609
mediaOptimizationSelectorPresenterFactory = mediaOptimizationSelectorPresenterFactory,

libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,6 @@ enum class FeatureFlags(
7575
defaultValue = { false },
7676
isFinished = false,
7777
),
78-
MediaUploadOnSendQueue(
79-
key = "feature.media_upload_through_send_queue",
80-
title = "Media upload through send queue",
81-
description = "Support for treating media uploads as regular events, with an improved retry and cancellation implementation.",
82-
defaultValue = { true },
83-
isFinished = true,
84-
),
8578
PrintLogsToLogcat(
8679
key = "feature.print_logs_to_logcat",
8780
title = "Print logs to logcat",

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import io.element.android.libraries.core.coroutine.childScope
1414
import io.element.android.libraries.core.data.tryOrNull
1515
import io.element.android.libraries.core.extensions.mapFailure
1616
import io.element.android.libraries.core.extensions.runCatchingExceptions
17-
import io.element.android.libraries.featureflag.api.FeatureFlagService
1817
import io.element.android.libraries.matrix.api.MatrixClient
1918
import io.element.android.libraries.matrix.api.core.DeviceId
2019
import io.element.android.libraries.matrix.api.core.ProgressCallback
@@ -136,7 +135,6 @@ class RustMatrixClient(
136135
baseCacheDirectory: File,
137136
clock: SystemClock,
138137
timelineEventTypeFilterFactory: TimelineEventTypeFilterFactory,
139-
featureFlagService: FeatureFlagService,
140138
) : MatrixClient {
141139
override val sessionId: UserId = UserId(innerClient.userId())
142140
override val deviceId: DeviceId = DeviceId(innerClient.deviceId())
@@ -205,7 +203,6 @@ class RustMatrixClient(
205203
roomContentForwarder = RoomContentForwarder(innerRoomListService),
206204
roomSyncSubscriber = roomSyncSubscriber,
207205
timelineEventTypeFilterFactory = timelineEventTypeFilterFactory,
208-
featureFlagService = featureFlagService,
209206
roomMembershipObserver = roomMembershipObserver,
210207
roomInfoMapper = roomInfoMapper,
211208
)

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ class RustMatrixClientFactory @Inject constructor(
9393
baseCacheDirectory = cacheDirectory,
9494
clock = clock,
9595
timelineEventTypeFilterFactory = timelineEventTypeFilterFactory,
96-
featureFlagService = featureFlagService,
9796
).also {
9897
Timber.tag(it.toString()).d("Creating Client with access token '$anonymizedAccessToken' and refresh token '$anonymizedRefreshToken'")
9998
}

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/JoinedRustRoom.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import io.element.android.libraries.core.coroutine.CoroutineDispatchers
1111
import io.element.android.libraries.core.coroutine.childScope
1212
import io.element.android.libraries.core.extensions.mapFailure
1313
import io.element.android.libraries.core.extensions.runCatchingExceptions
14-
import io.element.android.libraries.featureflag.api.FeatureFlagService
1514
import io.element.android.libraries.matrix.api.core.DeviceId
1615
import io.element.android.libraries.matrix.api.core.EventId
1716
import io.element.android.libraries.matrix.api.core.RoomAlias
@@ -84,7 +83,6 @@ class JoinedRustRoom(
8483
private val coroutineDispatchers: CoroutineDispatchers,
8584
private val systemClock: SystemClock,
8685
private val roomContentForwarder: RoomContentForwarder,
87-
private val featureFlagService: FeatureFlagService,
8886
) : JoinedRoom, BaseRoom by baseRoom {
8987
// Create a dispatcher for all room methods...
9088
private val roomDispatcher = coroutineDispatchers.io.limitedParallelism(32)
@@ -478,7 +476,6 @@ class JoinedRustRoom(
478476
dispatcher = roomDispatcher,
479477
roomContentForwarder = roomContentForwarder,
480478
onNewSyncedEvent = onNewSyncedEvent,
481-
featureFlagsService = featureFlagService,
482479
)
483480
}
484481
}

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustRoomFactory.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ package io.element.android.libraries.matrix.impl.room
99

1010
import io.element.android.appconfig.TimelineConfig
1111
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
12-
import io.element.android.libraries.featureflag.api.FeatureFlagService
1312
import io.element.android.libraries.matrix.api.core.DeviceId
1413
import io.element.android.libraries.matrix.api.core.RoomId
1514
import io.element.android.libraries.matrix.api.core.SessionId
@@ -49,7 +48,6 @@ class RustRoomFactory(
4948
private val innerRoomListService: InnerRoomListService,
5049
private val roomSyncSubscriber: RoomSyncSubscriber,
5150
private val timelineEventTypeFilterFactory: TimelineEventTypeFilterFactory,
52-
private val featureFlagService: FeatureFlagService,
5351
private val roomMembershipObserver: RoomMembershipObserver,
5452
private val roomInfoMapper: RoomInfoMapper,
5553
) {
@@ -127,7 +125,6 @@ class RustRoomFactory(
127125
liveInnerTimeline = timeline,
128126
coroutineDispatchers = dispatchers,
129127
systemClock = systemClock,
130-
featureFlagService = featureFlagService,
131128
)
132129
)
133130
} else {

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
package io.element.android.libraries.matrix.impl.timeline
99

1010
import io.element.android.libraries.core.extensions.runCatchingExceptions
11-
import io.element.android.libraries.featureflag.api.FeatureFlagService
12-
import io.element.android.libraries.featureflag.api.FeatureFlags
1311
import io.element.android.libraries.matrix.api.core.EventId
1412
import io.element.android.libraries.matrix.api.core.ProgressCallback
1513
import io.element.android.libraries.matrix.api.core.RoomId
@@ -89,7 +87,6 @@ class RustTimeline(
8987
private val coroutineScope: CoroutineScope,
9088
private val dispatcher: CoroutineDispatcher,
9189
private val roomContentForwarder: RoomContentForwarder,
92-
private val featureFlagsService: FeatureFlagService,
9390
onNewSyncedEvent: () -> Unit,
9491
) : Timeline {
9592
private val _timelineItems: MutableSharedFlow<List<MatrixTimelineItem>> =
@@ -342,7 +339,6 @@ class RustTimeline(
342339
progressCallback: ProgressCallback?,
343340
inReplyToEventId: EventId?,
344341
): Result<MediaUploadHandler> {
345-
val useSendQueue = featureFlagsService.isFeatureEnabled(FeatureFlags.MediaUploadOnSendQueue)
346342
return sendAttachment(listOfNotNull(file, thumbnailFile)) {
347343
inner.sendImage(
348344
params = UploadParameters(
@@ -351,7 +347,7 @@ class RustTimeline(
351347
formattedCaption = formattedCaption?.let {
352348
FormattedBody(body = it, format = MessageFormat.Html)
353349
},
354-
useSendQueue = useSendQueue,
350+
useSendQueue = true,
355351
mentions = null,
356352
inReplyTo = inReplyToEventId?.value,
357353
),
@@ -371,7 +367,6 @@ class RustTimeline(
371367
progressCallback: ProgressCallback?,
372368
inReplyToEventId: EventId?,
373369
): Result<MediaUploadHandler> {
374-
val useSendQueue = featureFlagsService.isFeatureEnabled(FeatureFlags.MediaUploadOnSendQueue)
375370
return sendAttachment(listOfNotNull(file, thumbnailFile)) {
376371
inner.sendVideo(
377372
params = UploadParameters(
@@ -380,7 +375,7 @@ class RustTimeline(
380375
formattedCaption = formattedCaption?.let {
381376
FormattedBody(body = it, format = MessageFormat.Html)
382377
},
383-
useSendQueue = useSendQueue,
378+
useSendQueue = true,
384379
mentions = null,
385380
inReplyTo = inReplyToEventId?.value,
386381
),
@@ -399,7 +394,6 @@ class RustTimeline(
399394
progressCallback: ProgressCallback?,
400395
inReplyToEventId: EventId?,
401396
): Result<MediaUploadHandler> {
402-
val useSendQueue = featureFlagsService.isFeatureEnabled(FeatureFlags.MediaUploadOnSendQueue)
403397
return sendAttachment(listOf(file)) {
404398
inner.sendAudio(
405399
params = UploadParameters(
@@ -408,7 +402,7 @@ class RustTimeline(
408402
formattedCaption = formattedCaption?.let {
409403
FormattedBody(body = it, format = MessageFormat.Html)
410404
},
411-
useSendQueue = useSendQueue,
405+
useSendQueue = true,
412406
mentions = null,
413407
inReplyTo = inReplyToEventId?.value,
414408
),
@@ -426,7 +420,6 @@ class RustTimeline(
426420
progressCallback: ProgressCallback?,
427421
inReplyToEventId: EventId?,
428422
): Result<MediaUploadHandler> {
429-
val useSendQueue = featureFlagsService.isFeatureEnabled(FeatureFlags.MediaUploadOnSendQueue)
430423
return sendAttachment(listOf(file)) {
431424
inner.sendFile(
432425
params = UploadParameters(
@@ -435,7 +428,7 @@ class RustTimeline(
435428
formattedCaption = formattedCaption?.let {
436429
FormattedBody(body = it, format = MessageFormat.Html)
437430
},
438-
useSendQueue = useSendQueue,
431+
useSendQueue = true,
439432
mentions = null,
440433
inReplyTo = inReplyToEventId?.value,
441434
),
@@ -489,15 +482,14 @@ class RustTimeline(
489482
progressCallback: ProgressCallback?,
490483
inReplyToEventId: EventId?,
491484
): Result<MediaUploadHandler> {
492-
val useSendQueue = featureFlagsService.isFeatureEnabled(FeatureFlags.MediaUploadOnSendQueue)
493485
return sendAttachment(listOf(file)) {
494486
inner.sendVoiceMessage(
495487
params = UploadParameters(
496488
source = UploadSource.File(file.path),
497489
// Maybe allow a caption in the future?
498490
caption = null,
499491
formattedCaption = null,
500-
useSendQueue = useSendQueue,
492+
useSendQueue = true,
501493
mentions = null,
502494
inReplyTo = inReplyToEventId?.value,
503495
),

0 commit comments

Comments
 (0)