From 981d93f2fcf63dcd39a3e8e58633141ced1d0eff Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Tue, 3 Sep 2024 19:18:10 +0200 Subject: [PATCH 01/11] making MediaCompressor configurable --- .../amethyst/ui/actions/EditPostViewModel.kt | 2 ++ .../amethyst/ui/actions/NewMediaModel.kt | 2 ++ .../amethyst/ui/actions/NewPostViewModel.kt | 2 ++ .../ui/actions/NewUserMetadataViewModel.kt | 2 ++ .../amethyst/ui/components/MediaCompressor.kt | 31 +++++++++++++++++-- 5 files changed, 37 insertions(+), 2 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostViewModel.kt index 9f0c7d45f..cc22361e9 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostViewModel.kt @@ -41,6 +41,7 @@ import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.FileHeader import com.vitorpamplona.amethyst.service.Nip96Uploader import com.vitorpamplona.amethyst.service.NostrSearchEventOrUserDataSource +import com.vitorpamplona.amethyst.ui.components.CompressorQuality import com.vitorpamplona.amethyst.ui.components.MediaCompressor import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.stringRes @@ -223,6 +224,7 @@ open class EditPostViewModel : ViewModel() { isUploadingImage = false onError(stringRes(context, R.string.failed_to_upload_media_no_details), stringRes(context, it)) }, + mediaQaulity = CompressorQuality.LOW, ) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt index 818463a26..7ba759259 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt @@ -34,6 +34,7 @@ import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.service.FileHeader import com.vitorpamplona.amethyst.service.Nip96MediaServers import com.vitorpamplona.amethyst.service.Nip96Uploader +import com.vitorpamplona.amethyst.ui.components.CompressorQuality import com.vitorpamplona.amethyst.ui.components.MediaCompressor import com.vitorpamplona.amethyst.ui.stringRes import com.vitorpamplona.ammolite.relays.RelaySetupInfo @@ -166,6 +167,7 @@ open class NewMediaModel : ViewModel() { uploadingDescription.value = null onError(stringRes(context, R.string.error_when_compressing_media, it)) }, + mediaQaulity = CompressorQuality.LOW, ) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt index 638e0a78b..de2ac52ca 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt @@ -46,6 +46,7 @@ import com.vitorpamplona.amethyst.service.FileHeader import com.vitorpamplona.amethyst.service.LocationUtil import com.vitorpamplona.amethyst.service.Nip96Uploader import com.vitorpamplona.amethyst.service.NostrSearchEventOrUserDataSource +import com.vitorpamplona.amethyst.ui.components.CompressorQuality import com.vitorpamplona.amethyst.ui.components.MediaCompressor import com.vitorpamplona.amethyst.ui.components.Split import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel @@ -909,6 +910,7 @@ open class NewPostViewModel : ViewModel() { isUploadingImage = false onError(stringRes(context, R.string.failed_to_upload_media_no_details), stringRes(context, it)) }, + mediaQaulity = CompressorQuality.LOW, ) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt index af776e756..fe1444834 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt @@ -30,6 +30,7 @@ import androidx.lifecycle.viewModelScope import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.service.Nip96Uploader +import com.vitorpamplona.amethyst.ui.components.CompressorQuality import com.vitorpamplona.amethyst.ui.components.MediaCompressor import com.vitorpamplona.amethyst.ui.stringRes import com.vitorpamplona.quartz.events.GitHubIdentity @@ -211,6 +212,7 @@ class NewUserMetadataViewModel : ViewModel() { onError(stringRes(context, R.string.error_when_compressing_media), stringRes(context, it)) }, + mediaQaulity = CompressorQuality.MEDIUM, ) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt index 526fd4730..6bd0e6ee5 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt @@ -46,10 +46,20 @@ class MediaCompressor { applicationContext: Context, onReady: (Uri, String?, Long?) -> Unit, onError: (Int) -> Unit, + mediaQaulity: CompressorQuality?, ) { checkNotInMainThread() if (contentType?.startsWith("video", true) == true) { + val videoQuality = + when (mediaQaulity) { + CompressorQuality.VERY_LOW -> VideoQuality.VERY_LOW + CompressorQuality.LOW -> VideoQuality.LOW + CompressorQuality.MEDIUM -> VideoQuality.MEDIUM + CompressorQuality.HIGH -> VideoQuality.HIGH + CompressorQuality.VERY_HIGH -> VideoQuality.VERY_HIGH + else -> VideoQuality.MEDIUM + } VideoCompressor.start( // => This is required context = applicationContext, @@ -65,7 +75,7 @@ class MediaCompressor { appSpecificStorageConfiguration = AppSpecificStorageConfiguration(), configureWith = Configuration( - quality = VideoQuality.MEDIUM, + quality = videoQuality, // => required name videoNames = listOf(UUID.randomUUID().toString()), ), @@ -110,10 +120,19 @@ class MediaCompressor { !contentType.contains("gif") && !contentType.contains("svg") ) { + val imageQuality = + when (mediaQaulity) { + CompressorQuality.VERY_LOW -> 40 + CompressorQuality.LOW -> 50 + CompressorQuality.MEDIUM -> 60 + CompressorQuality.HIGH -> 80 + CompressorQuality.VERY_HIGH -> 90 + else -> 60 + } try { val compressedImageFile = Compressor.compress(applicationContext, from(uri, contentType, applicationContext)) { - default(width = 640, format = Bitmap.CompressFormat.JPEG) + default(width = 640, format = Bitmap.CompressFormat.JPEG, quality = imageQuality) } onReady(compressedImageFile.toUri(), contentType, compressedImageFile.length()) } catch (e: Exception) { @@ -163,3 +182,11 @@ class MediaCompressor { return arrayOf(name, extension) } } + +enum class CompressorQuality { + VERY_LOW, + LOW, + MEDIUM, + HIGH, + VERY_HIGH, +} From b8246d7cd456ac6251398fc237cc24ee33224684 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Tue, 3 Sep 2024 19:23:47 +0200 Subject: [PATCH 02/11] fixing type --- .../vitorpamplona/amethyst/ui/actions/EditPostViewModel.kt | 2 +- .../com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt | 2 +- .../vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt | 2 +- .../amethyst/ui/actions/NewUserMetadataViewModel.kt | 2 +- .../vitorpamplona/amethyst/ui/components/MediaCompressor.kt | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostViewModel.kt index cc22361e9..9886d9cbe 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostViewModel.kt @@ -224,7 +224,7 @@ open class EditPostViewModel : ViewModel() { isUploadingImage = false onError(stringRes(context, R.string.failed_to_upload_media_no_details), stringRes(context, it)) }, - mediaQaulity = CompressorQuality.LOW, + mediaQuality = CompressorQuality.LOW, ) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt index 7ba759259..1969598cf 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt @@ -167,7 +167,7 @@ open class NewMediaModel : ViewModel() { uploadingDescription.value = null onError(stringRes(context, R.string.error_when_compressing_media, it)) }, - mediaQaulity = CompressorQuality.LOW, + mediaQuality = CompressorQuality.LOW, ) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt index de2ac52ca..9afd43265 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt @@ -910,7 +910,7 @@ open class NewPostViewModel : ViewModel() { isUploadingImage = false onError(stringRes(context, R.string.failed_to_upload_media_no_details), stringRes(context, it)) }, - mediaQaulity = CompressorQuality.LOW, + mediaQuality = CompressorQuality.LOW, ) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt index fe1444834..3ab6bb457 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt @@ -212,7 +212,7 @@ class NewUserMetadataViewModel : ViewModel() { onError(stringRes(context, R.string.error_when_compressing_media), stringRes(context, it)) }, - mediaQaulity = CompressorQuality.MEDIUM, + mediaQuality = CompressorQuality.MEDIUM, ) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt index 6bd0e6ee5..e75c0c8bd 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt @@ -46,13 +46,13 @@ class MediaCompressor { applicationContext: Context, onReady: (Uri, String?, Long?) -> Unit, onError: (Int) -> Unit, - mediaQaulity: CompressorQuality?, + mediaQuality: CompressorQuality?, ) { checkNotInMainThread() if (contentType?.startsWith("video", true) == true) { val videoQuality = - when (mediaQaulity) { + when (mediaQuality) { CompressorQuality.VERY_LOW -> VideoQuality.VERY_LOW CompressorQuality.LOW -> VideoQuality.LOW CompressorQuality.MEDIUM -> VideoQuality.MEDIUM @@ -121,7 +121,7 @@ class MediaCompressor { !contentType.contains("svg") ) { val imageQuality = - when (mediaQaulity) { + when (mediaQuality) { CompressorQuality.VERY_LOW -> 40 CompressorQuality.LOW -> 50 CompressorQuality.MEDIUM -> 60 From 272f99be1755c235f88cfcc9e19d79d67c7c9fce Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Tue, 3 Sep 2024 20:44:39 +0200 Subject: [PATCH 03/11] added logging --- .../vitorpamplona/amethyst/ui/components/MediaCompressor.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt index e75c0c8bd..d2812b07a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt @@ -23,6 +23,7 @@ package com.vitorpamplona.amethyst.ui.components import android.content.Context import android.graphics.Bitmap import android.net.Uri +import android.util.Log import android.webkit.MimeTypeMap import androidx.core.net.toUri import com.abedelazizshe.lightcompressorlibrary.CompressionListener @@ -60,6 +61,7 @@ class MediaCompressor { CompressorQuality.VERY_HIGH -> VideoQuality.VERY_HIGH else -> VideoQuality.MEDIUM } + Log.d("MediaCompressor", "Using video compression $mediaQuality") VideoCompressor.start( // => This is required context = applicationContext, @@ -130,6 +132,7 @@ class MediaCompressor { else -> 60 } try { + Log.d("MediaCompressor", "Using image compression $mediaQuality") val compressedImageFile = Compressor.compress(applicationContext, from(uri, contentType, applicationContext)) { default(width = 640, format = Bitmap.CompressFormat.JPEG, quality = imageQuality) From 7e4d9fb7084da3d06eb3414355c5c37161630983 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Wed, 4 Sep 2024 12:32:33 +0200 Subject: [PATCH 04/11] added media quality slider --- .../amethyst/ui/actions/NewPostView.kt | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt index 1941dc8d4..f143eda1b 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt @@ -130,6 +130,7 @@ import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.Nip96MediaServers import com.vitorpamplona.amethyst.service.NostrSearchEventOrUserDataSource import com.vitorpamplona.amethyst.ui.components.BechLink +import com.vitorpamplona.amethyst.ui.components.CompressorQuality import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji import com.vitorpamplona.amethyst.ui.components.InvoiceRequest import com.vitorpamplona.amethyst.ui.components.LoadUrlPreview @@ -1667,6 +1668,7 @@ fun ImageVideoDescription( } var message by remember { mutableStateOf("") } var sensitiveContent by remember { mutableStateOf(false) } + var sliderPosition by remember { mutableStateOf(1f) } // 0 = Low, 1 = Medium, 2 = High Column( modifier = @@ -1845,6 +1847,38 @@ fun ImageVideoDescription( ) } + Row( + verticalAlignment = Alignment.Bottom, + horizontalArrangement = Arrangement.Center, + modifier = Modifier.fillMaxWidth(), + ) { + Text("Media Quality") + } + + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth(), + ) { + Column { + Slider( + value = sliderPosition, + onValueChange = { sliderPosition = it }, + valueRange = 0f..2f, + steps = 1, + ) + + Text( + text = + when (sliderPosition.toInt()) { + 0 -> CompressorQuality.LOW.toString() + 1 -> CompressorQuality.MEDIUM.toString() + 2 -> CompressorQuality.HIGH.toString() + else -> CompressorQuality.MEDIUM.toString() + }, + ) + } + } + Button( modifier = Modifier From fcf5e972d6a67afb6acd2bed6216da4ad445e296 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Thu, 5 Sep 2024 09:09:10 +0200 Subject: [PATCH 05/11] Passing media quality from Slider to Compressor setting media quality to MEDIUM where ui has no option for setting it (ChannelScreen, ChatroomScreen, NewUserMetadataViewModel) --- .../amethyst/ui/actions/EditPostView.kt | 4 ++-- .../amethyst/ui/actions/EditPostViewModel.kt | 4 ++-- .../amethyst/ui/actions/NewPostView.kt | 16 ++++++++-------- .../amethyst/ui/actions/NewPostViewModel.kt | 4 ++-- .../ui/actions/NewUserMetadataViewModel.kt | 1 + .../amethyst/ui/components/MediaCompressor.kt | 16 ++++++++++++++++ .../screen/loggedIn/chatrooms/ChannelScreen.kt | 4 ++++ .../screen/loggedIn/chatrooms/ChatroomScreen.kt | 4 ++++ 8 files changed, 39 insertions(+), 14 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostView.kt index fb6512608..ed92e7a8a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostView.kt @@ -330,8 +330,8 @@ fun EditPostView( ImageVideoDescription( url, accountViewModel.account.settings.defaultFileServer, - onAdd = { alt, server, sensitiveContent -> - postViewModel.upload(url, alt, sensitiveContent, false, server, accountViewModel::toast, context) + onAdd = { alt, server, sensitiveContent, mediaQuality -> + postViewModel.upload(url, alt, sensitiveContent, mediaQuality, false, server, accountViewModel::toast, context) if (!server.isNip95) { accountViewModel.account.settings.changeDefaultFileServer(server.server) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostViewModel.kt index 9886d9cbe..c4aa58e04 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostViewModel.kt @@ -41,7 +41,6 @@ import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.FileHeader import com.vitorpamplona.amethyst.service.Nip96Uploader import com.vitorpamplona.amethyst.service.NostrSearchEventOrUserDataSource -import com.vitorpamplona.amethyst.ui.components.CompressorQuality import com.vitorpamplona.amethyst.ui.components.MediaCompressor import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.stringRes @@ -149,6 +148,7 @@ open class EditPostViewModel : ViewModel() { galleryUri: Uri, alt: String?, sensitiveContent: Boolean, + mediaQuality: Float, isPrivate: Boolean = false, server: ServerOption, onError: (String, String) -> Unit, @@ -224,7 +224,7 @@ open class EditPostViewModel : ViewModel() { isUploadingImage = false onError(stringRes(context, R.string.failed_to_upload_media_no_details), stringRes(context, it)) }, - mediaQuality = CompressorQuality.LOW, + mediaQuality = MediaCompressor().floatToCompressorQuality(mediaQuality), ) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt index f143eda1b..d9efc4cf3 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt @@ -493,8 +493,8 @@ fun NewPostView( ImageVideoDescription( url, accountViewModel.account.settings.defaultFileServer, - onAdd = { alt, server, sensitiveContent -> - postViewModel.upload(url, alt, sensitiveContent, false, server, accountViewModel::toast, context) + onAdd = { alt, server, sensitiveContent, mediaQuality -> + postViewModel.upload(url, alt, sensitiveContent, mediaQuality, false, server, accountViewModel::toast, context) if (!server.isNip95) { accountViewModel.account.settings.changeDefaultFileServer(server.server) } @@ -1610,7 +1610,7 @@ fun CreateButton( fun ImageVideoDescription( uri: Uri, defaultServer: Nip96MediaServers.ServerName, - onAdd: (String, ServerOption, Boolean) -> Unit, + onAdd: (String, ServerOption, Boolean, Float) -> Unit, onCancel: () -> Unit, onError: (Int) -> Unit, accountViewModel: AccountViewModel, @@ -1668,7 +1668,7 @@ fun ImageVideoDescription( } var message by remember { mutableStateOf("") } var sensitiveContent by remember { mutableStateOf(false) } - var sliderPosition by remember { mutableStateOf(1f) } // 0 = Low, 1 = Medium, 2 = High + var mediaQualitySlider by remember { mutableStateOf(1f) } // 0 = Low, 1 = Medium, 2 = High Column( modifier = @@ -1861,15 +1861,15 @@ fun ImageVideoDescription( ) { Column { Slider( - value = sliderPosition, - onValueChange = { sliderPosition = it }, + value = mediaQualitySlider, + onValueChange = { mediaQualitySlider = it }, valueRange = 0f..2f, steps = 1, ) Text( text = - when (sliderPosition.toInt()) { + when (mediaQualitySlider.toInt()) { 0 -> CompressorQuality.LOW.toString() 1 -> CompressorQuality.MEDIUM.toString() 2 -> CompressorQuality.HIGH.toString() @@ -1884,7 +1884,7 @@ fun ImageVideoDescription( Modifier .fillMaxWidth() .padding(vertical = 10.dp), - onClick = { onAdd(message, selectedServer, sensitiveContent) }, + onClick = { onAdd(message, selectedServer, sensitiveContent, mediaQualitySlider) }, shape = QuoteBorder, colors = ButtonDefaults.buttonColors( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt index 9afd43265..ee3358115 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt @@ -46,7 +46,6 @@ import com.vitorpamplona.amethyst.service.FileHeader import com.vitorpamplona.amethyst.service.LocationUtil import com.vitorpamplona.amethyst.service.Nip96Uploader import com.vitorpamplona.amethyst.service.NostrSearchEventOrUserDataSource -import com.vitorpamplona.amethyst.ui.components.CompressorQuality import com.vitorpamplona.amethyst.ui.components.MediaCompressor import com.vitorpamplona.amethyst.ui.components.Split import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel @@ -835,6 +834,7 @@ open class NewPostViewModel : ViewModel() { galleryUri: Uri, alt: String?, sensitiveContent: Boolean, + mediaQuality: Float, isPrivate: Boolean = false, server: ServerOption, onError: (title: String, message: String) -> Unit, @@ -910,7 +910,7 @@ open class NewPostViewModel : ViewModel() { isUploadingImage = false onError(stringRes(context, R.string.failed_to_upload_media_no_details), stringRes(context, it)) }, - mediaQuality = CompressorQuality.LOW, + mediaQuality = MediaCompressor().floatToCompressorQuality(mediaQuality), ) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt index 3ab6bb457..055e24eb5 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewUserMetadataViewModel.kt @@ -212,6 +212,7 @@ class NewUserMetadataViewModel : ViewModel() { onError(stringRes(context, R.string.error_when_compressing_media), stringRes(context, it)) }, + // Use MEDIUM quality as default mediaQuality = CompressorQuality.MEDIUM, ) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt index d2812b07a..4084bbacd 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt @@ -184,6 +184,22 @@ class MediaCompressor { } return arrayOf(name, extension) } + + fun floatToCompressorQuality(mediaQualityFloat: Float): CompressorQuality = + when (mediaQualityFloat) { + 0f -> CompressorQuality.LOW + 1f -> CompressorQuality.MEDIUM + 2f -> CompressorQuality.HIGH + else -> CompressorQuality.MEDIUM + } + + fun compressorQualityToFloat(compressorQuality: CompressorQuality): Float = + when (compressorQuality) { + CompressorQuality.LOW -> 0f + CompressorQuality.MEDIUM -> 1f + CompressorQuality.HIGH -> 2f + else -> 1f + } } enum class CompressorQuality { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChannelScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChannelScreen.kt index 5f2695e0d..896de8212 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChannelScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChannelScreen.kt @@ -116,7 +116,9 @@ import com.vitorpamplona.amethyst.ui.actions.NewPostViewModel import com.vitorpamplona.amethyst.ui.actions.ServerOption import com.vitorpamplona.amethyst.ui.actions.UploadFromGallery import com.vitorpamplona.amethyst.ui.actions.UrlUserTagTransformation +import com.vitorpamplona.amethyst.ui.components.CompressorQuality import com.vitorpamplona.amethyst.ui.components.LoadNote +import com.vitorpamplona.amethyst.ui.components.MediaCompressor import com.vitorpamplona.amethyst.ui.components.RobohashFallbackAsyncImage import com.vitorpamplona.amethyst.ui.components.SensitivityWarning import com.vitorpamplona.amethyst.ui.components.TranslatableRichTextViewer @@ -466,6 +468,8 @@ fun EditFieldRow( galleryUri = it, alt = null, sensitiveContent = false, + // Use MEDIUM quality + mediaQuality = MediaCompressor().compressorQualityToFloat(CompressorQuality.MEDIUM), server = ServerOption(accountViewModel.account.settings.defaultFileServer, false), onError = accountViewModel::toast, context = context, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChatroomScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChatroomScreen.kt index 648eb733f..4b007f53c 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChatroomScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChatroomScreen.kt @@ -92,6 +92,8 @@ import com.vitorpamplona.amethyst.ui.actions.PostButton import com.vitorpamplona.amethyst.ui.actions.ServerOption import com.vitorpamplona.amethyst.ui.actions.UploadFromGallery import com.vitorpamplona.amethyst.ui.actions.UrlUserTagTransformation +import com.vitorpamplona.amethyst.ui.components.CompressorQuality +import com.vitorpamplona.amethyst.ui.components.MediaCompressor import com.vitorpamplona.amethyst.ui.note.ClickableUserPicture import com.vitorpamplona.amethyst.ui.note.IncognitoIconOff import com.vitorpamplona.amethyst.ui.note.IncognitoIconOn @@ -443,6 +445,8 @@ fun PrivateMessageEditFieldRow( galleryUri = it, alt = null, sensitiveContent = false, + // use MEDIUM quality + mediaQuality = MediaCompressor().compressorQualityToFloat(CompressorQuality.MEDIUM), isPrivate = isPrivate, server = ServerOption(accountViewModel.account.settings.defaultFileServer, false), onError = accountViewModel::toast, From c6d2f05f15f473075c22463b6476193585da679a Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Thu, 5 Sep 2024 11:50:52 +0200 Subject: [PATCH 06/11] Styling --- .../amethyst/ui/actions/NewPostView.kt | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt index 0de8c0268..90b5ead9a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt @@ -130,7 +130,6 @@ import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.Nip96MediaServers import com.vitorpamplona.amethyst.service.NostrSearchEventOrUserDataSource import com.vitorpamplona.amethyst.ui.components.BechLink -import com.vitorpamplona.amethyst.ui.components.CompressorQuality import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji import com.vitorpamplona.amethyst.ui.components.InvoiceRequest import com.vitorpamplona.amethyst.ui.components.LoadUrlPreview @@ -1849,18 +1848,37 @@ fun ImageVideoDescription( } Row( - verticalAlignment = Alignment.Bottom, - horizontalArrangement = Arrangement.Center, - modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + modifier = + Modifier + .fillMaxWidth() + .windowInsetsPadding(WindowInsets(0.dp, 0.dp, 0.dp, 0.dp)) + .padding(vertical = 8.dp), ) { - Text("Media Quality") + Column( + modifier = Modifier.weight(1.0f), + verticalArrangement = Arrangement.spacedBy(Size5dp), + ) { + Text( + text = "Media Quality", + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + Text( + text = "Select low quality to generate smaller files with less quality. Select high quality to generate larger files with higher quality.", + style = MaterialTheme.typography.bodySmall, + color = Color.Gray, + maxLines = 4, + overflow = TextOverflow.Ellipsis, + ) + } } Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth(), ) { - Column { + Column(horizontalAlignment = Alignment.CenterHorizontally) { Slider( value = mediaQualitySlider, onValueChange = { mediaQualitySlider = it }, @@ -1871,11 +1889,12 @@ fun ImageVideoDescription( Text( text = when (mediaQualitySlider.toInt()) { - 0 -> CompressorQuality.LOW.toString() - 1 -> CompressorQuality.MEDIUM.toString() - 2 -> CompressorQuality.HIGH.toString() - else -> CompressorQuality.MEDIUM.toString() + 0 -> "Low" + 1 -> "Medium" + 2 -> "High" + else -> "Medium" }, + textAlign = TextAlign.Center, ) } } From 023c0592e806a30293784f408316f3d98e709366 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Thu, 5 Sep 2024 13:09:17 +0200 Subject: [PATCH 07/11] Add compression configuration to VideoScreen uploads --- .../amethyst/ui/actions/NewMediaModel.kt | 4 +- .../amethyst/ui/actions/NewMediaView.kt | 60 ++++++++++++++++++- 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt index 1969598cf..eba29cd0b 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt @@ -34,7 +34,6 @@ import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.service.FileHeader import com.vitorpamplona.amethyst.service.Nip96MediaServers import com.vitorpamplona.amethyst.service.Nip96Uploader -import com.vitorpamplona.amethyst.ui.components.CompressorQuality import com.vitorpamplona.amethyst.ui.components.MediaCompressor import com.vitorpamplona.amethyst.ui.stringRes import com.vitorpamplona.ammolite.relays.RelaySetupInfo @@ -80,6 +79,7 @@ open class NewMediaModel : ViewModel() { fun upload( context: Context, relayList: List? = null, + mediaQuality: Float, onError: (String) -> Unit = {}, ) { isUploadingImage = true @@ -167,7 +167,7 @@ open class NewMediaModel : ViewModel() { uploadingDescription.value = null onError(stringRes(context, R.string.error_when_compressing_media, it)) }, - mediaQuality = CompressorQuality.LOW, + mediaQuality = MediaCompressor().floatToCompressorQuality(mediaQuality), ) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt index 9766d25eb..fe142469a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt @@ -44,22 +44,27 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Slider import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties @@ -72,6 +77,7 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.TextSpinner import com.vitorpamplona.amethyst.ui.screen.loggedIn.TitleExplainer import com.vitorpamplona.amethyst.ui.stringRes +import com.vitorpamplona.amethyst.ui.theme.Size5dp import com.vitorpamplona.amethyst.ui.theme.placeholderText import com.vitorpamplona.quartz.events.FileServersEvent import kotlinx.collections.immutable.toImmutableList @@ -100,6 +106,7 @@ fun NewMediaView( var showRelaysDialog by remember { mutableStateOf(false) } var relayList = remember { accountViewModel.account.activeWriteRelays().toImmutableList() } + var mediaQualitySlider by remember { mutableFloatStateOf(1f) } // 0 = Low, 1 = Medium, 2 = High Dialog( onDismissRequest = { onClose() }, @@ -160,7 +167,7 @@ fun NewMediaView( PostButton( onPost = { onClose() - postViewModel.upload(context, relayList) { + postViewModel.upload(context, relayList, mediaQualitySlider) { accountViewModel.toast(stringRes(context, R.string.failed_to_upload_media_no_details), it) } postViewModel.selectedServer?.let { @@ -180,6 +187,57 @@ fun NewMediaView( modifier = Modifier.fillMaxWidth().verticalScroll(scrollState), ) { ImageVideoPost(postViewModel, accountViewModel) + + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = + Modifier + .fillMaxWidth() + .windowInsetsPadding(WindowInsets(0.dp, 0.dp, 0.dp, 0.dp)) + .padding(vertical = 8.dp), + ) { + Column( + modifier = Modifier.weight(1.0f), + verticalArrangement = Arrangement.spacedBy(Size5dp), + ) { + Text( + text = "Media Quality", + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + Text( + text = "Select low quality to generate smaller files with less quality. Select high quality to generate larger files with higher quality.", + style = MaterialTheme.typography.bodySmall, + color = Color.Gray, + maxLines = 4, + overflow = TextOverflow.Ellipsis, + ) + } + } + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth(), + ) { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Slider( + value = mediaQualitySlider, + onValueChange = { mediaQualitySlider = it }, + valueRange = 0f..2f, + steps = 1, + ) + + Text( + text = + when (mediaQualitySlider.toInt()) { + 0 -> "Low" + 1 -> "Medium" + 2 -> "High" + else -> "Medium" + }, + textAlign = TextAlign.Center, + ) + } + } } } } From 5f0236c015f5b7d1eddecc8891e1c3940d09c4c4 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Thu, 5 Sep 2024 14:27:04 +0200 Subject: [PATCH 08/11] change MediaCompressor API: mandatory mediaQuality --- .../vitorpamplona/amethyst/ui/components/MediaCompressor.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt index 4084bbacd..643153cde 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt @@ -47,7 +47,7 @@ class MediaCompressor { applicationContext: Context, onReady: (Uri, String?, Long?) -> Unit, onError: (Int) -> Unit, - mediaQuality: CompressorQuality?, + mediaQuality: CompressorQuality, ) { checkNotInMainThread() @@ -59,7 +59,6 @@ class MediaCompressor { CompressorQuality.MEDIUM -> VideoQuality.MEDIUM CompressorQuality.HIGH -> VideoQuality.HIGH CompressorQuality.VERY_HIGH -> VideoQuality.VERY_HIGH - else -> VideoQuality.MEDIUM } Log.d("MediaCompressor", "Using video compression $mediaQuality") VideoCompressor.start( @@ -129,7 +128,6 @@ class MediaCompressor { CompressorQuality.MEDIUM -> 60 CompressorQuality.HIGH -> 80 CompressorQuality.VERY_HIGH -> 90 - else -> 60 } try { Log.d("MediaCompressor", "Using image compression $mediaQuality") From e52e2bfdc9958a935677e5c65f97b5bb376a523f Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Thu, 5 Sep 2024 15:09:19 +0200 Subject: [PATCH 09/11] Localise and add czech, swedish, german and PT translations --- .../amethyst/ui/actions/NewMediaView.kt | 12 ++++++------ .../vitorpamplona/amethyst/ui/actions/NewPostView.kt | 12 ++++++------ amethyst/src/main/res/values-cs/strings.xml | 6 ++++++ amethyst/src/main/res/values-de/strings.xml | 5 +++++ amethyst/src/main/res/values-pt-rBR/strings.xml | 5 +++++ amethyst/src/main/res/values-sv-rSE/strings.xml | 6 ++++++ amethyst/src/main/res/values/strings.xml | 6 ++++++ 7 files changed, 40 insertions(+), 12 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt index fe142469a..a6f30f09a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt @@ -201,12 +201,12 @@ fun NewMediaView( verticalArrangement = Arrangement.spacedBy(Size5dp), ) { Text( - text = "Media Quality", + text = stringRes(context, R.string.media_compression_quality_label), maxLines = 1, overflow = TextOverflow.Ellipsis, ) Text( - text = "Select low quality to generate smaller files with less quality. Select high quality to generate larger files with higher quality.", + text = stringRes(context, R.string.media_compression_quality_explainer), style = MaterialTheme.typography.bodySmall, color = Color.Gray, maxLines = 4, @@ -229,10 +229,10 @@ fun NewMediaView( Text( text = when (mediaQualitySlider.toInt()) { - 0 -> "Low" - 1 -> "Medium" - 2 -> "High" - else -> "Medium" + 0 -> stringRes(context, R.string.media_compression_quality_low) + 1 -> stringRes(context, R.string.media_compression_quality_medium) + 2 -> stringRes(context, R.string.media_compression_quality_high) + else -> stringRes(context, R.string.media_compression_quality_medium) }, textAlign = TextAlign.Center, ) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt index 90b5ead9a..bd47e04e0 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt @@ -1860,12 +1860,12 @@ fun ImageVideoDescription( verticalArrangement = Arrangement.spacedBy(Size5dp), ) { Text( - text = "Media Quality", + text = stringRes(R.string.media_compression_quality_label), maxLines = 1, overflow = TextOverflow.Ellipsis, ) Text( - text = "Select low quality to generate smaller files with less quality. Select high quality to generate larger files with higher quality.", + text = stringRes(R.string.media_compression_quality_explainer), style = MaterialTheme.typography.bodySmall, color = Color.Gray, maxLines = 4, @@ -1889,10 +1889,10 @@ fun ImageVideoDescription( Text( text = when (mediaQualitySlider.toInt()) { - 0 -> "Low" - 1 -> "Medium" - 2 -> "High" - else -> "Medium" + 0 -> stringRes(R.string.media_compression_quality_low) + 1 -> stringRes(R.string.media_compression_quality_medium) + 2 -> stringRes(R.string.media_compression_quality_high) + else -> stringRes(R.string.media_compression_quality_medium) }, textAlign = TextAlign.Center, ) diff --git a/amethyst/src/main/res/values-cs/strings.xml b/amethyst/src/main/res/values-cs/strings.xml index bc8cc775d..b70271893 100644 --- a/amethyst/src/main/res/values-cs/strings.xml +++ b/amethyst/src/main/res/values-cs/strings.xml @@ -817,4 +817,10 @@ Stáhnout Nepodařilo se otevřít soubor Pro otevření a stažení souboru nejsou nainstalovány žádné torrent aplikace. + Kvalita médií + Vyberte Nízkou kvalitu pro kompresi médií na menší soubor s nižší kvalitou, nebo vyberte Vysokou kvalitu pro kompresi na větší soubor s vyšší kvalitou. + Nízká + Střední + Vysoká + diff --git a/amethyst/src/main/res/values-de/strings.xml b/amethyst/src/main/res/values-de/strings.xml index 318e70dae..32ccc2151 100644 --- a/amethyst/src/main/res/values-de/strings.xml +++ b/amethyst/src/main/res/values-de/strings.xml @@ -822,4 +822,9 @@ anz der Bedingungen ist erforderlich Herunterladen Fehler beim Öffnen der Datei Keine Torrent-Apps installiert, um die Datei zu öffnen und herunterzuladen. + Medienqualität + Wählen Sie Niedrige Qualität, um Ihre Medien in eine kleinere Datei mit geringerer Qualität zu komprimieren, oder wählen Sie Hohe Qualität, um sie in eine größere Datei mit höherer Qualität zu komprimieren. + Niedrig + Mittel + Hoch diff --git a/amethyst/src/main/res/values-pt-rBR/strings.xml b/amethyst/src/main/res/values-pt-rBR/strings.xml index 17899b311..4363caeb7 100644 --- a/amethyst/src/main/res/values-pt-rBR/strings.xml +++ b/amethyst/src/main/res/values-pt-rBR/strings.xml @@ -817,4 +817,9 @@ Baixar Falha ao abrir o arquivo Nenhum aplicativo torrent instalado para abrir e baixar o arquivo. + Qualidade de Mídia + Selecione Baixa qualidade para comprimir sua mídia para um arquivo menor com menor qualidade ou selecione Alta qualidade para comprimir para um arquivo maior com maior qualidade. + Baixa + Média + Alta diff --git a/amethyst/src/main/res/values-sv-rSE/strings.xml b/amethyst/src/main/res/values-sv-rSE/strings.xml index ae3fc86a4..66d7d2b51 100644 --- a/amethyst/src/main/res/values-sv-rSE/strings.xml +++ b/amethyst/src/main/res/values-sv-rSE/strings.xml @@ -816,4 +816,10 @@ Ladda ner Det gick inte att öppna filen Inga torrent-appar installerade för att öppna och ladda ner filen. + + Mediakvalitet + Välj Låg kvalitet för att komprimera ditt media till en mindre fil med lägre kvalitet, eller välj Hög kvalitet för att komprimera till en större fil med högre kvalitet. + Låg + Medel + Hög diff --git a/amethyst/src/main/res/values/strings.xml b/amethyst/src/main/res/values/strings.xml index deb2b0a4f..588ae1a44 100644 --- a/amethyst/src/main/res/values/strings.xml +++ b/amethyst/src/main/res/values/strings.xml @@ -791,6 +791,12 @@ Compression Cancelled Compression failed to return a file + Media Quality + Select Low quality to compress your media to a smaller file with less quality or select High quality to compress to a larger file with higher quality. + Low + Medium + High + Edit draft Login with QR Code From 3ad21e72a986d8c2bfeff1f05a57ac5fd49ceef8 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Thu, 5 Sep 2024 16:04:18 +0200 Subject: [PATCH 10/11] Clean up by using Int instead of Float for compression level --- .../amethyst/ui/actions/EditPostViewModel.kt | 4 ++-- .../amethyst/ui/actions/NewMediaModel.kt | 4 ++-- .../amethyst/ui/actions/NewMediaView.kt | 10 +++++----- .../amethyst/ui/actions/NewPostView.kt | 11 ++++++----- .../amethyst/ui/actions/NewPostViewModel.kt | 4 ++-- .../amethyst/ui/components/MediaCompressor.kt | 18 +++++++++--------- .../screen/loggedIn/chatrooms/ChannelScreen.kt | 2 +- .../loggedIn/chatrooms/ChatroomScreen.kt | 2 +- 8 files changed, 28 insertions(+), 27 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostViewModel.kt index c4aa58e04..b0d3826a5 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/EditPostViewModel.kt @@ -148,7 +148,7 @@ open class EditPostViewModel : ViewModel() { galleryUri: Uri, alt: String?, sensitiveContent: Boolean, - mediaQuality: Float, + mediaQuality: Int, isPrivate: Boolean = false, server: ServerOption, onError: (String, String) -> Unit, @@ -224,7 +224,7 @@ open class EditPostViewModel : ViewModel() { isUploadingImage = false onError(stringRes(context, R.string.failed_to_upload_media_no_details), stringRes(context, it)) }, - mediaQuality = MediaCompressor().floatToCompressorQuality(mediaQuality), + mediaQuality = MediaCompressor().intToCompressorQuality(mediaQuality), ) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt index eba29cd0b..0c8ac3137 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaModel.kt @@ -79,7 +79,7 @@ open class NewMediaModel : ViewModel() { fun upload( context: Context, relayList: List? = null, - mediaQuality: Float, + mediaQuality: Int, onError: (String) -> Unit = {}, ) { isUploadingImage = true @@ -167,7 +167,7 @@ open class NewMediaModel : ViewModel() { uploadingDescription.value = null onError(stringRes(context, R.string.error_when_compressing_media, it)) }, - mediaQuality = MediaCompressor().floatToCompressorQuality(mediaQuality), + mediaQuality = MediaCompressor().intToCompressorQuality(mediaQuality), ) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt index a6f30f09a..d829c6b24 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt @@ -51,7 +51,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState -import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -106,7 +106,7 @@ fun NewMediaView( var showRelaysDialog by remember { mutableStateOf(false) } var relayList = remember { accountViewModel.account.activeWriteRelays().toImmutableList() } - var mediaQualitySlider by remember { mutableFloatStateOf(1f) } // 0 = Low, 1 = Medium, 2 = High + var mediaQualitySlider by remember { mutableIntStateOf(1) } // 0 = Low, 1 = Medium, 2 = High Dialog( onDismissRequest = { onClose() }, @@ -220,15 +220,15 @@ fun NewMediaView( ) { Column(horizontalAlignment = Alignment.CenterHorizontally) { Slider( - value = mediaQualitySlider, - onValueChange = { mediaQualitySlider = it }, + value = mediaQualitySlider.toFloat(), + onValueChange = { mediaQualitySlider = it.toInt() }, valueRange = 0f..2f, steps = 1, ) Text( text = - when (mediaQualitySlider.toInt()) { + when (mediaQualitySlider) { 0 -> stringRes(context, R.string.media_compression_quality_low) 1 -> stringRes(context, R.string.media_compression_quality_medium) 2 -> stringRes(context, R.string.media_compression_quality_high) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt index bd47e04e0..9e11af688 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt @@ -88,6 +88,7 @@ import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -1610,7 +1611,7 @@ fun CreateButton( fun ImageVideoDescription( uri: Uri, defaultServer: Nip96MediaServers.ServerName, - onAdd: (String, ServerOption, Boolean, Float) -> Unit, + onAdd: (String, ServerOption, Boolean, Int) -> Unit, onCancel: () -> Unit, onError: (Int) -> Unit, accountViewModel: AccountViewModel, @@ -1668,7 +1669,7 @@ fun ImageVideoDescription( } var message by remember { mutableStateOf("") } var sensitiveContent by remember { mutableStateOf(false) } - var mediaQualitySlider by remember { mutableStateOf(1f) } // 0 = Low, 1 = Medium, 2 = High + var mediaQualitySlider by remember { mutableIntStateOf(1) } // 0 = Low, 1 = Medium, 2 = High Column( modifier = @@ -1880,15 +1881,15 @@ fun ImageVideoDescription( ) { Column(horizontalAlignment = Alignment.CenterHorizontally) { Slider( - value = mediaQualitySlider, - onValueChange = { mediaQualitySlider = it }, + value = mediaQualitySlider.toFloat(), + onValueChange = { mediaQualitySlider = it.toInt() }, valueRange = 0f..2f, steps = 1, ) Text( text = - when (mediaQualitySlider.toInt()) { + when (mediaQualitySlider) { 0 -> stringRes(R.string.media_compression_quality_low) 1 -> stringRes(R.string.media_compression_quality_medium) 2 -> stringRes(R.string.media_compression_quality_high) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt index ee3358115..ad7402f66 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt @@ -834,7 +834,7 @@ open class NewPostViewModel : ViewModel() { galleryUri: Uri, alt: String?, sensitiveContent: Boolean, - mediaQuality: Float, + mediaQuality: Int, isPrivate: Boolean = false, server: ServerOption, onError: (title: String, message: String) -> Unit, @@ -910,7 +910,7 @@ open class NewPostViewModel : ViewModel() { isUploadingImage = false onError(stringRes(context, R.string.failed_to_upload_media_no_details), stringRes(context, it)) }, - mediaQuality = MediaCompressor().floatToCompressorQuality(mediaQuality), + mediaQuality = MediaCompressor().intToCompressorQuality(mediaQuality), ) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt index 643153cde..bf53e718d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/MediaCompressor.kt @@ -183,20 +183,20 @@ class MediaCompressor { return arrayOf(name, extension) } - fun floatToCompressorQuality(mediaQualityFloat: Float): CompressorQuality = + fun intToCompressorQuality(mediaQualityFloat: Int): CompressorQuality = when (mediaQualityFloat) { - 0f -> CompressorQuality.LOW - 1f -> CompressorQuality.MEDIUM - 2f -> CompressorQuality.HIGH + 0 -> CompressorQuality.LOW + 1 -> CompressorQuality.MEDIUM + 2 -> CompressorQuality.HIGH else -> CompressorQuality.MEDIUM } - fun compressorQualityToFloat(compressorQuality: CompressorQuality): Float = + fun compressorQualityToInt(compressorQuality: CompressorQuality): Int = when (compressorQuality) { - CompressorQuality.LOW -> 0f - CompressorQuality.MEDIUM -> 1f - CompressorQuality.HIGH -> 2f - else -> 1f + CompressorQuality.LOW -> 0 + CompressorQuality.MEDIUM -> 1 + CompressorQuality.HIGH -> 2 + else -> 1 } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChannelScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChannelScreen.kt index 975d7f9b6..f8a7a2337 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChannelScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChannelScreen.kt @@ -517,7 +517,7 @@ fun EditFieldRow( alt = null, sensitiveContent = false, // Use MEDIUM quality - mediaQuality = MediaCompressor().compressorQualityToFloat(CompressorQuality.MEDIUM), + mediaQuality = MediaCompressor().compressorQualityToInt(CompressorQuality.MEDIUM), server = ServerOption(accountViewModel.account.settings.defaultFileServer, false), onError = accountViewModel::toast, context = context, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChatroomScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChatroomScreen.kt index b7d5559a1..21d028a95 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChatroomScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChatroomScreen.kt @@ -587,7 +587,7 @@ fun PrivateMessageEditFieldRow( alt = null, sensitiveContent = false, // use MEDIUM quality - mediaQuality = MediaCompressor().compressorQualityToFloat(CompressorQuality.MEDIUM), + mediaQuality = MediaCompressor().compressorQualityToInt(CompressorQuality.MEDIUM), isPrivate = isPrivate, server = ServerOption(accountViewModel.account.settings.defaultFileServer, false), onError = accountViewModel::toast, From cfe668ab0da355cb6b4f08f02742818177fbf283 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Thu, 5 Sep 2024 16:58:39 +0200 Subject: [PATCH 11/11] move slider value label to above slider --- .../amethyst/ui/actions/NewMediaView.kt | 25 ++++++++++--------- .../amethyst/ui/actions/NewPostView.kt | 24 ++++++++++-------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt index d829c6b24..cdce79368 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewMediaView.kt @@ -63,7 +63,6 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.input.KeyboardCapitalization -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog @@ -219,23 +218,25 @@ fun NewMediaView( modifier = Modifier.fillMaxWidth(), ) { Column(horizontalAlignment = Alignment.CenterHorizontally) { + Box(modifier = Modifier.fillMaxWidth()) { + Text( + text = + when (mediaQualitySlider) { + 0 -> stringRes(R.string.media_compression_quality_low) + 1 -> stringRes(R.string.media_compression_quality_medium) + 2 -> stringRes(R.string.media_compression_quality_high) + else -> stringRes(R.string.media_compression_quality_medium) + }, + modifier = Modifier.align(Alignment.Center), + ) + } + Slider( value = mediaQualitySlider.toFloat(), onValueChange = { mediaQualitySlider = it.toInt() }, valueRange = 0f..2f, steps = 1, ) - - Text( - text = - when (mediaQualitySlider) { - 0 -> stringRes(context, R.string.media_compression_quality_low) - 1 -> stringRes(context, R.string.media_compression_quality_medium) - 2 -> stringRes(context, R.string.media_compression_quality_high) - else -> stringRes(context, R.string.media_compression_quality_medium) - }, - textAlign = TextAlign.Center, - ) } } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt index 9e11af688..c55c867c9 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt @@ -1880,23 +1880,25 @@ fun ImageVideoDescription( modifier = Modifier.fillMaxWidth(), ) { Column(horizontalAlignment = Alignment.CenterHorizontally) { + Box(modifier = Modifier.fillMaxWidth()) { + Text( + text = + when (mediaQualitySlider) { + 0 -> stringRes(R.string.media_compression_quality_low) + 1 -> stringRes(R.string.media_compression_quality_medium) + 2 -> stringRes(R.string.media_compression_quality_high) + else -> stringRes(R.string.media_compression_quality_medium) + }, + modifier = Modifier.align(Alignment.Center), + ) + } + Slider( value = mediaQualitySlider.toFloat(), onValueChange = { mediaQualitySlider = it.toInt() }, valueRange = 0f..2f, steps = 1, ) - - Text( - text = - when (mediaQualitySlider) { - 0 -> stringRes(R.string.media_compression_quality_low) - 1 -> stringRes(R.string.media_compression_quality_medium) - 2 -> stringRes(R.string.media_compression_quality_high) - else -> stringRes(R.string.media_compression_quality_medium) - }, - textAlign = TextAlign.Center, - ) } }