Skip to content

Commit 846dbc2

Browse files
committed
Add media upload setting.
Compress media regarding the settings. Image compression change quality to 78% Video compression change size to 720 x 48
1 parent 01e7986 commit 846dbc2

File tree

22 files changed

+162
-29
lines changed

22 files changed

+162
-29
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ import kotlinx.parcelize.Parcelize
1515
@Immutable
1616
sealed interface Attachment : Parcelable {
1717
@Parcelize
18-
data class Media(val localMedia: LocalMedia, val compressIfPossible: Boolean) : Attachment
18+
data class Media(val localMedia: LocalMedia) : Attachment
1919
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ class AttachmentsPreviewPresenter @AssistedInject constructor(
9696
mediaSender.sendMedia(
9797
uri = mediaAttachment.localMedia.uri,
9898
mimeType = mediaAttachment.localMedia.info.mimeType,
99-
compressIfPossible = mediaAttachment.compressIfPossible,
10099
progressCallback = progressCallback
101100
).getOrThrow()
102101
}.fold(

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ fun anAttachmentsPreviewState(
3131
) = AttachmentsPreviewState(
3232
attachment = Attachment.Media(
3333
localMedia = LocalMedia("file://path".toUri(), mediaInfo),
34-
compressIfPossible = true
3534
),
3635
sendActionState = sendActionState,
3736
eventSink = {}

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ class MessageComposerPresenter @Inject constructor(
169169
handlePickedMedia(attachmentsState, uri, mimeType)
170170
}
171171
val filesPicker = mediaPickerProvider.registerFilePicker(AnyMimeTypes) { uri ->
172-
handlePickedMedia(attachmentsState, uri, compressIfPossible = false)
172+
handlePickedMedia(attachmentsState, uri)
173173
}
174174
val cameraPhotoPicker = mediaPickerProvider.registerCameraPhotoPicker { uri ->
175175
handlePickedMedia(attachmentsState, uri, MimeTypes.IMAGE_JPEG)
@@ -294,7 +294,6 @@ class MessageComposerPresenter @Inject constructor(
294294
name = null,
295295
formattedFileSize = null
296296
),
297-
compressIfPossible = true
298297
),
299298
attachmentState = attachmentsState,
300299
)
@@ -493,7 +492,6 @@ class MessageComposerPresenter @Inject constructor(
493492
attachmentsState: MutableState<AttachmentsState>,
494493
uri: Uri?,
495494
mimeType: String? = null,
496-
compressIfPossible: Boolean = true,
497495
) {
498496
if (uri == null) {
499497
attachmentsState.value = AttachmentsState.None
@@ -505,7 +503,7 @@ class MessageComposerPresenter @Inject constructor(
505503
name = null,
506504
formattedFileSize = null
507505
)
508-
val mediaAttachment = Attachment.Media(localMedia, compressIfPossible)
506+
val mediaAttachment = Attachment.Media(localMedia)
509507
val isPreviewable = when {
510508
MimeTypes.isImage(localMedia.info.mimeType) -> true
511509
MimeTypes.isVideo(localMedia.info.mimeType) -> true
@@ -535,7 +533,6 @@ class MessageComposerPresenter @Inject constructor(
535533
mediaSender.sendMedia(
536534
uri = uri,
537535
mimeType = mimeType,
538-
compressIfPossible = false,
539536
progressCallback = progressCallback
540537
).getOrThrow()
541538
}

features/preferences/impl/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ dependencies {
5555
implementation(projects.features.deactivation.api)
5656
implementation(projects.features.roomlist.api)
5757
implementation(projects.services.analytics.api)
58+
implementation(projects.services.analytics.compose)
5859
implementation(projects.services.toolbox.api)
5960
implementation(libs.datetime)
6061
implementation(libs.coil.compose)

features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsEvents.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import io.element.android.compound.theme.Theme
1212
sealed interface AdvancedSettingsEvents {
1313
data class SetDeveloperModeEnabled(val enabled: Boolean) : AdvancedSettingsEvents
1414
data class SetSharePresenceEnabled(val enabled: Boolean) : AdvancedSettingsEvents
15+
data class SetCompressMedia(val compress: Boolean) : AdvancedSettingsEvents
1516
data object ChangeTheme : AdvancedSettingsEvents
1617
data object CancelChangeTheme : AdvancedSettingsEvents
1718
data class SetTheme(val theme: Theme) : AdvancedSettingsEvents

features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsPresenter.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ class AdvancedSettingsPresenter @Inject constructor(
3535
val isSharePresenceEnabled by sessionPreferencesStore
3636
.isSharePresenceEnabled()
3737
.collectAsState(initial = true)
38+
val doesCompressMedia by sessionPreferencesStore
39+
.doesCompressMedia()
40+
.collectAsState(initial = false)
3841
val theme by remember {
3942
appPreferencesStore.getThemeFlow().mapToTheme()
4043
}
@@ -49,6 +52,9 @@ class AdvancedSettingsPresenter @Inject constructor(
4952
is AdvancedSettingsEvents.SetSharePresenceEnabled -> localCoroutineScope.launch {
5053
sessionPreferencesStore.setSharePresence(event.enabled)
5154
}
55+
is AdvancedSettingsEvents.SetCompressMedia -> localCoroutineScope.launch {
56+
sessionPreferencesStore.setCompressMedia(event.compress)
57+
}
5258
AdvancedSettingsEvents.CancelChangeTheme -> showChangeThemeDialog = false
5359
AdvancedSettingsEvents.ChangeTheme -> showChangeThemeDialog = true
5460
is AdvancedSettingsEvents.SetTheme -> localCoroutineScope.launch {
@@ -61,6 +67,7 @@ class AdvancedSettingsPresenter @Inject constructor(
6167
return AdvancedSettingsState(
6268
isDeveloperModeEnabled = isDeveloperModeEnabled,
6369
isSharePresenceEnabled = isSharePresenceEnabled,
70+
doesCompressMedia = doesCompressMedia,
6471
theme = theme,
6572
showChangeThemeDialog = showChangeThemeDialog,
6673
eventSink = { handleEvents(it) }

features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import io.element.android.compound.theme.Theme
1212
data class AdvancedSettingsState(
1313
val isDeveloperModeEnabled: Boolean,
1414
val isSharePresenceEnabled: Boolean,
15+
val doesCompressMedia: Boolean,
1516
val theme: Theme,
1617
val showChangeThemeDialog: Boolean,
1718
val eventSink: (AdvancedSettingsEvents) -> Unit

features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsStateProvider.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,21 @@ open class AdvancedSettingsStateProvider : PreviewParameterProvider<AdvancedSett
1616
aAdvancedSettingsState(),
1717
aAdvancedSettingsState(isDeveloperModeEnabled = true),
1818
aAdvancedSettingsState(showChangeThemeDialog = true),
19-
aAdvancedSettingsState(isSendPublicReadReceiptsEnabled = true),
19+
aAdvancedSettingsState(isSharePresenceEnabled = true),
20+
aAdvancedSettingsState(doesCompressMedia = true),
2021
)
2122
}
2223

2324
fun aAdvancedSettingsState(
2425
isDeveloperModeEnabled: Boolean = false,
25-
isSendPublicReadReceiptsEnabled: Boolean = false,
26+
isSharePresenceEnabled: Boolean = false,
27+
doesCompressMedia: Boolean = false,
2628
showChangeThemeDialog: Boolean = false,
2729
eventSink: (AdvancedSettingsEvents) -> Unit = {},
2830
) = AdvancedSettingsState(
2931
isDeveloperModeEnabled = isDeveloperModeEnabled,
30-
isSharePresenceEnabled = isSendPublicReadReceiptsEnabled,
32+
isSharePresenceEnabled = isSharePresenceEnabled,
33+
doesCompressMedia = doesCompressMedia,
3134
theme = Theme.System,
3235
showChangeThemeDialog = showChangeThemeDialog,
3336
eventSink = eventSink

features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsView.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import androidx.compose.runtime.Composable
1111
import androidx.compose.ui.Modifier
1212
import androidx.compose.ui.res.stringResource
1313
import androidx.compose.ui.tooling.preview.PreviewParameter
14+
import im.vector.app.features.analytics.plan.Interaction
1415
import io.element.android.compound.theme.Theme
1516
import io.element.android.compound.theme.themes
1617
import io.element.android.features.preferences.impl.R
@@ -23,6 +24,8 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight
2324
import io.element.android.libraries.designsystem.theme.components.ListItem
2425
import io.element.android.libraries.designsystem.theme.components.Text
2526
import io.element.android.libraries.ui.strings.CommonStrings
27+
import io.element.android.services.analytics.compose.LocalAnalyticsService
28+
import io.element.android.services.analyticsproviders.api.trackers.captureInteraction
2629
import kotlinx.collections.immutable.ImmutableList
2730
import kotlinx.collections.immutable.toImmutableList
2831

@@ -32,6 +35,7 @@ fun AdvancedSettingsView(
3235
onBackClick: () -> Unit,
3336
modifier: Modifier = Modifier,
3437
) {
38+
val analyticsService = LocalAnalyticsService.current
3539
PreferencePage(
3640
modifier = modifier,
3741
onBackClick = onBackClick,
@@ -72,6 +76,28 @@ fun AdvancedSettingsView(
7276
),
7377
onClick = { state.eventSink(AdvancedSettingsEvents.SetSharePresenceEnabled(!state.isSharePresenceEnabled)) }
7478
)
79+
ListItem(
80+
headlineContent = {
81+
Text(text = stringResource(id = R.string.screen_advanced_settings_media_compression_title))
82+
},
83+
supportingContent = {
84+
Text(text = stringResource(id = R.string.screen_advanced_settings_media_compression_description))
85+
},
86+
trailingContent = ListItemContent.Switch(
87+
checked = state.doesCompressMedia,
88+
),
89+
onClick = {
90+
val newValue = !state.doesCompressMedia
91+
analyticsService.captureInteraction(
92+
if (newValue) {
93+
Interaction.Name.MobileSettingsOptimizeMediaUploadsEnabled
94+
} else {
95+
Interaction.Name.MobileSettingsOptimizeMediaUploadsDisabled
96+
}
97+
)
98+
state.eventSink(AdvancedSettingsEvents.SetCompressMedia(newValue))
99+
}
100+
)
75101
}
76102

77103
if (state.showChangeThemeDialog) {

0 commit comments

Comments
 (0)