diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v3/MediaSendV3Repository.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v3/MediaSendV3Repository.kt index 2ebf62c941..55b536e4f4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v3/MediaSendV3Repository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v3/MediaSendV3Repository.kt @@ -90,6 +90,12 @@ object MediaSendV3Repository : MediaSendRepository { SignalStore.misc.isCameraFacingFront = value } + override var sentMediaQuality: SentMediaQuality + get() = SignalStore.settings.sentMediaQuality + set(value) { + SignalStore.settings.sentMediaQuality = value + } + override suspend fun getFolders(): List = suspendCancellableCoroutine { continuation -> mediaRepository.getFolders(appContext) { folders -> continuation.resume(folders) diff --git a/feature/media-send/src/main/java/org/signal/mediasend/MediaSendRepository.kt b/feature/media-send/src/main/java/org/signal/mediasend/MediaSendRepository.kt index c299400332..c161518495 100644 --- a/feature/media-send/src/main/java/org/signal/mediasend/MediaSendRepository.kt +++ b/feature/media-send/src/main/java/org/signal/mediasend/MediaSendRepository.kt @@ -59,6 +59,11 @@ interface MediaSendRepository { */ suspend fun deleteBlobs(media: List) + /** + * User's sent-media-quality setting, backed by persistent storage. + */ + var sentMediaQuality: SentMediaQuality + /** * Whether the user has opted out of the warning shown before media is written to shared device storage. */ diff --git a/feature/media-send/src/main/java/org/signal/mediasend/MediaSendState.kt b/feature/media-send/src/main/java/org/signal/mediasend/MediaSendState.kt index f2c81400e0..5682d0b1bf 100644 --- a/feature/media-send/src/main/java/org/signal/mediasend/MediaSendState.kt +++ b/feature/media-send/src/main/java/org/signal/mediasend/MediaSendState.kt @@ -43,7 +43,7 @@ data class MediaSendState( val focusedMedia: Media? = null, val isMeteredConnection: Boolean = false, val isPreUploadEnabled: Boolean = false, - val sentMediaQuality: SentMediaQuality = SentMediaQuality.STANDARD, + val sentMediaQuality: @WriteWith SentMediaQuality = MediaSendDependencies.mediaSendRepository.sentMediaQuality, /** * Per-media editor state keyed by URI (video trim data, image editor data, etc.). */ @@ -190,6 +190,14 @@ data class MediaSendState( override fun MediaConstraints.write(parcel: Parcel, flags: Int) = Unit } + /** + * The repository is the source of truth: every toggle writes through to it, so the value is re-read rather than saved. + */ + private object TransientSentMediaQualityParceler : Parceler { + override fun create(parcel: Parcel): SentMediaQuality = MediaSendDependencies.mediaSendRepository.sentMediaQuality + override fun SentMediaQuality.write(parcel: Parcel, flags: Int) = Unit + } + enum class ViewOnceToggleState(val code: Int) { OFF(0), ONCE(1); diff --git a/feature/media-send/src/main/java/org/signal/mediasend/MediaSendViewModel.kt b/feature/media-send/src/main/java/org/signal/mediasend/MediaSendViewModel.kt index 9acb9dc436..80d0fca18e 100644 --- a/feature/media-send/src/main/java/org/signal/mediasend/MediaSendViewModel.kt +++ b/feature/media-send/src/main/java/org/signal/mediasend/MediaSendViewModel.kt @@ -763,6 +763,7 @@ class MediaSendViewModel( if (snapshot.sentMediaQuality == sentMediaQuality) return updateState { copy(sentMediaQuality = sentMediaQuality, isPreUploadEnabled = false) } + repository.sentMediaQuality = sentMediaQuality preUploadController.cancelAllUploads() // Re-clamp video durations based on new quality