From f83166e576e09dc45a51e4e14c77620f5c01e72c Mon Sep 17 00:00:00 2001 From: davotoula Date: Fri, 29 Aug 2025 09:13:26 +0100 Subject: [PATCH 1/9] Add take video functionality Add take video button to new post screen I18N --- .../ui/actions/uploads/TakePicture.kt | 97 +++++++++++++++++++ .../loggedIn/home/ShortNotePostScreen.kt | 7 ++ amethyst/src/main/res/values/strings.xml | 1 + 3 files changed, 105 insertions(+) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/uploads/TakePicture.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/uploads/TakePicture.kt index b5675ee8a..05bfb1442 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/uploads/TakePicture.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/uploads/TakePicture.kt @@ -29,6 +29,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.layout.height import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.CameraAlt +import androidx.compose.material.icons.filled.Videocam import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme @@ -152,3 +153,99 @@ fun getPhotoUri(context: Context): Uri { ) } } + +@Composable +fun TakeVideoButton(onVideoTaken: (ImmutableList) -> Unit) { + var showCamera by remember { mutableStateOf(false) } + if (showCamera) { + TakeVideo( + onVideoTaken = { uri -> + showCamera = false + if (uri.isNotEmpty()) { + onVideoTaken(uri) + } + }, + ) + } + + VideoButton { showCamera = true } +} + +@OptIn(ExperimentalPermissionsApi::class) +@Composable +fun TakeVideo(onVideoTaken: (ImmutableList) -> Unit) { + val context = LocalContext.current + var videoUri by remember { mutableStateOf(null) } + val scope = rememberCoroutineScope() + + val launcher = + rememberLauncherForActivityResult( + contract = ActivityResultContracts.CaptureVideo(), + ) { success -> + if (success) { + videoUri?.let { + onVideoTaken(persistentListOf(SelectedMedia(it, "video/mp4"))) + } + } else { + onVideoTaken(persistentListOf()) + } + videoUri = null + } + + val cameraPermissionState = + rememberPermissionState( + Manifest.permission.CAMERA, + onPermissionResult = { + if (it) { + scope.launch(Dispatchers.IO) { + videoUri = getVideoUri(context) + videoUri?.let { launcher.launch(it) } + } + } + }, + ) + + if (cameraPermissionState.status.isGranted) { + LaunchedEffect(key1 = Unit) { + launch(Dispatchers.IO) { + videoUri = getVideoUri(context) + videoUri?.let { launcher.launch(it) } + } + } + } else { + LaunchedEffect(key1 = Unit) { + cameraPermissionState.launchPermissionRequest() + } + } +} + +@Composable +fun VideoButton(onClick: () -> Unit) { + IconButton( + onClick = onClick, + ) { + Icon( + imageVector = Icons.Default.Videocam, + contentDescription = stringRes(id = R.string.record_a_video), + modifier = Modifier.height(22.dp), + tint = MaterialTheme.colorScheme.onBackground, + ) + } +} + +fun getVideoUri(context: Context): Uri { + val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date()) + val storageDir: File? = context.getExternalFilesDir(Environment.DIRECTORY_MOVIES) + return File + .createTempFile( + "MP4_${timeStamp}_", + ".mp4", + storageDir, + ).let { + FileProvider.getUriForFile( + context, + "${context.packageName}.provider", + it, + ) + } +} diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/ShortNotePostScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/ShortNotePostScreen.kt index 2d95deecc..1929fc017 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/ShortNotePostScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/ShortNotePostScreen.kt @@ -60,6 +60,7 @@ import com.vitorpamplona.amethyst.ui.actions.mediaServers.ServerType import com.vitorpamplona.amethyst.ui.actions.uploads.SelectFromGallery import com.vitorpamplona.amethyst.ui.actions.uploads.SelectedMedia import com.vitorpamplona.amethyst.ui.actions.uploads.TakePictureButton +import com.vitorpamplona.amethyst.ui.actions.uploads.TakeVideoButton import com.vitorpamplona.amethyst.ui.components.getActivity import com.vitorpamplona.amethyst.ui.navigation.navs.Nav import com.vitorpamplona.amethyst.ui.navigation.topbars.PostingTopBar @@ -431,6 +432,12 @@ private fun BottomRowActions(postViewModel: ShortNotePostViewModel) { }, ) + TakeVideoButton( + onVideoTaken = { + postViewModel.selectImage(it) + }, + ) + if (postViewModel.canUsePoll) { // These should be hashtag recommendations the user selects in the future. // val hashtag = stringRes(R.string.poll_hashtag) diff --git a/amethyst/src/main/res/values/strings.xml b/amethyst/src/main/res/values/strings.xml index 6b7c23159..175d30684 100644 --- a/amethyst/src/main/res/values/strings.xml +++ b/amethyst/src/main/res/values/strings.xml @@ -160,6 +160,7 @@ Failed to save the video Upload Image Take a picture + Record a video Record a message Record a message Click and hold to record a message From 5f8519d737b65f688611896be51dd44a136d65b4 Mon Sep 17 00:00:00 2001 From: davotoula Date: Fri, 29 Aug 2025 09:19:58 +0100 Subject: [PATCH 2/9] added translations --- amethyst/src/main/res/values-cs-rCZ/strings.xml | 1 + amethyst/src/main/res/values-de/strings.xml | 1 + amethyst/src/main/res/values-pt-rBR/strings.xml | 1 + amethyst/src/main/res/values-sv-rSE/strings.xml | 1 + 4 files changed, 4 insertions(+) diff --git a/amethyst/src/main/res/values-cs-rCZ/strings.xml b/amethyst/src/main/res/values-cs-rCZ/strings.xml index f6e4f8aac..b8a0233ca 100644 --- a/amethyst/src/main/res/values-cs-rCZ/strings.xml +++ b/amethyst/src/main/res/values-cs-rCZ/strings.xml @@ -148,6 +148,7 @@ Nepodařilo se uložit video Nahrát obrázek Pořiďte fotografii + Nahrát video Nahrajte zprávu Nahrajte zprávu Stiskněte a podržte pro nahrání zprávy diff --git a/amethyst/src/main/res/values-de/strings.xml b/amethyst/src/main/res/values-de/strings.xml index ff6ebf190..a450fb7a2 100644 --- a/amethyst/src/main/res/values-de/strings.xml +++ b/amethyst/src/main/res/values-de/strings.xml @@ -947,6 +947,7 @@ anz der Bedingungen ist erforderlich Wurde die Signierer-App deinstalliert? Überprüfe, ob sie installiert ist und dieses Konto enthält. Melde dich ab und wieder an, falls sich die App geändert hat. Keine Beschreibung gefunden Ein Foto aufnehmen + Video aufnehmen Eine Nachricht aufnehmen Eine Nachricht aufnehmen Zum Aufnehmen einer Nachricht gedrückt halten diff --git a/amethyst/src/main/res/values-pt-rBR/strings.xml b/amethyst/src/main/res/values-pt-rBR/strings.xml index 037614def..05590d68f 100644 --- a/amethyst/src/main/res/values-pt-rBR/strings.xml +++ b/amethyst/src/main/res/values-pt-rBR/strings.xml @@ -148,6 +148,7 @@ Falha ao salvar o vídeo Enviar Imagem Tirar uma foto + Gravar um vídeo Gravar uma mensagem Gravar uma mensagem Clique e segure para gravar uma mensagem diff --git a/amethyst/src/main/res/values-sv-rSE/strings.xml b/amethyst/src/main/res/values-sv-rSE/strings.xml index fa986f452..7d5512a82 100644 --- a/amethyst/src/main/res/values-sv-rSE/strings.xml +++ b/amethyst/src/main/res/values-sv-rSE/strings.xml @@ -148,6 +148,7 @@ Det gick inte att spara videon Ladda upp bilden Ta en bild + Spela in video Spela in ett meddelande Spela in ett meddelande Tryck och håll in för att spela in ett meddelande From 87afb7f4915518ad209b911477399fc3a59884c6 Mon Sep 17 00:00:00 2001 From: davotoula Date: Fri, 29 Aug 2025 10:26:45 +0100 Subject: [PATCH 3/9] refactor getVideoUri and getPhotoUri to reduce duplication --- .../ui/actions/uploads/TakePicture.kt | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/uploads/TakePicture.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/uploads/TakePicture.kt index 05bfb1442..54a6625c1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/uploads/TakePicture.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/uploads/TakePicture.kt @@ -137,22 +137,13 @@ fun PictureButton(onClick: () -> Unit) { } } -fun getPhotoUri(context: Context): Uri { - val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date()) - val storageDir: File? = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES) - return File - .createTempFile( - "JPEG_${timeStamp}_", - ".jpg", - storageDir, - ).let { - FileProvider.getUriForFile( - context, - "${context.packageName}.provider", - it, - ) - } -} +fun getPhotoUri(context: Context): Uri = + getMediaUri( + context = context, + filePrefix = "JPEG", + fileExtension = ".jpg", + storageDir = Environment.DIRECTORY_PICTURES, + ) @Composable fun TakeVideoButton(onVideoTaken: (ImmutableList) -> Unit) { @@ -233,14 +224,27 @@ fun VideoButton(onClick: () -> Unit) { } } -fun getVideoUri(context: Context): Uri { +fun getVideoUri(context: Context): Uri = + getMediaUri( + context = context, + filePrefix = "MP4", + fileExtension = ".mp4", + storageDir = Environment.DIRECTORY_MOVIES, + ) + +private fun getMediaUri( + context: Context, + filePrefix: String, + fileExtension: String, + storageDir: String, +): Uri { val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date()) - val storageDir: File? = context.getExternalFilesDir(Environment.DIRECTORY_MOVIES) + val storageDirectory: File? = context.getExternalFilesDir(storageDir) return File .createTempFile( - "MP4_${timeStamp}_", - ".mp4", - storageDir, + "${filePrefix}_${timeStamp}_", + fileExtension, + storageDirectory, ).let { FileProvider.getUriForFile( context, From 3dd791fbbeb745904908927eed2eb7719bcdb360 Mon Sep 17 00:00:00 2001 From: davotoula Date: Tue, 26 Aug 2025 12:29:23 +0100 Subject: [PATCH 4/9] Change LOW video compression to use VERY_LOW from lightcompressorlibrary for better streaming experience LOW: 20% of original VERY_LOW: 10% of original --- .../amethyst/service/uploads/MediaCompressor.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/uploads/MediaCompressor.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/uploads/MediaCompressor.kt index 4288337a2..444b29791 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/uploads/MediaCompressor.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/uploads/MediaCompressor.kt @@ -84,14 +84,15 @@ class MediaCompressor { val videoQuality = when (mediaQuality) { CompressorQuality.VERY_LOW -> VideoQuality.VERY_LOW - CompressorQuality.LOW -> VideoQuality.LOW + // Override user selection LOW to use VERY_LOW for better video streaming experience + CompressorQuality.LOW -> VideoQuality.VERY_LOW CompressorQuality.MEDIUM -> VideoQuality.MEDIUM CompressorQuality.HIGH -> VideoQuality.HIGH CompressorQuality.VERY_HIGH -> VideoQuality.VERY_HIGH else -> VideoQuality.MEDIUM } - Log.d("MediaCompressor", "Using video compression $mediaQuality") + Log.d("MediaCompressor", "Using video compression $videoQuality") val result = withTimeoutOrNull(30000) { From 9179e18b06182294ef8d5d2dfa2a62d50dc86a88 Mon Sep 17 00:00:00 2001 From: davotoula Date: Fri, 29 Aug 2025 14:06:39 +0100 Subject: [PATCH 5/9] Added "record and post video" button to media tab --- .../screen/loggedIn/video/NewImageButton.kt | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/video/NewImageButton.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/video/NewImageButton.kt index c5bb56067..5c1d10c64 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/video/NewImageButton.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/video/NewImageButton.kt @@ -33,6 +33,7 @@ import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AddPhotoAlternate import androidx.compose.material.icons.filled.CameraAlt +import androidx.compose.material.icons.filled.Videocam import androidx.compose.material.icons.outlined.Close import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon @@ -53,6 +54,7 @@ import com.vitorpamplona.amethyst.ui.actions.NewMediaView import com.vitorpamplona.amethyst.ui.actions.uploads.GallerySelect import com.vitorpamplona.amethyst.ui.actions.uploads.SelectedMedia import com.vitorpamplona.amethyst.ui.actions.uploads.TakePicture +import com.vitorpamplona.amethyst.ui.actions.uploads.TakeVideo import com.vitorpamplona.amethyst.ui.navigation.navs.INav import com.vitorpamplona.amethyst.ui.painterRes import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel @@ -78,6 +80,8 @@ fun NewImageButton( var wantsToPostFromCamera by remember { mutableStateOf(false) } + var wantsToPostFromVideo by remember { mutableStateOf(false) } + var pickedURIs by remember { mutableStateOf>(persistentListOf()) } val scope = rememberCoroutineScope() @@ -97,6 +101,13 @@ fun NewImageButton( } } + if (wantsToPostFromVideo) { + TakeVideo { uri -> + wantsToPostFromVideo = false + pickedURIs = uri + } + } + if (wantsToPostFromGallery) { GallerySelect( onImageUri = { uri -> @@ -134,7 +145,26 @@ fun NewImageButton( ) { Icon( imageVector = Icons.Default.CameraAlt, - contentDescription = stringRes(id = R.string.upload_image), + contentDescription = stringRes(id = R.string.take_a_picture), + modifier = Modifier.size(26.dp), + tint = Color.White, + ) + } + + Spacer(modifier = Modifier.height(20.dp)) + + FloatingActionButton( + onClick = { + wantsToPostFromVideo = true + isOpen = false + }, + modifier = Size55Modifier, + shape = CircleShape, + containerColor = MaterialTheme.colorScheme.primary, + ) { + Icon( + imageVector = Icons.Default.Videocam, + contentDescription = stringRes(id = R.string.record_a_video), modifier = Modifier.size(26.dp), tint = Color.White, ) From 6a3aae7dbc73af2a23f66cd1d2b654bd47fa2c22 Mon Sep 17 00:00:00 2001 From: davotoula Date: Fri, 29 Aug 2025 14:14:03 +0100 Subject: [PATCH 6/9] Added "record and post video" button to NewGroupDMScreen --- .../chats/privateDM/send/NewGroupDMScreen.kt | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/privateDM/send/NewGroupDMScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/privateDM/send/NewGroupDMScreen.kt index eb7996ddb..27d8bff95 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/privateDM/send/NewGroupDMScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/privateDM/send/NewGroupDMScreen.kt @@ -41,6 +41,7 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AddPhotoAlternate +import androidx.compose.material.icons.filled.Videocam import androidx.compose.material.icons.outlined.CameraAlt import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider @@ -85,6 +86,7 @@ import com.vitorpamplona.amethyst.ui.actions.mediaServers.ServerType import com.vitorpamplona.amethyst.ui.actions.uploads.SelectFromGallery import com.vitorpamplona.amethyst.ui.actions.uploads.SelectedMedia import com.vitorpamplona.amethyst.ui.actions.uploads.TakePictureButton +import com.vitorpamplona.amethyst.ui.actions.uploads.TakeVideoButton import com.vitorpamplona.amethyst.ui.components.ThinPaddingTextField import com.vitorpamplona.amethyst.ui.components.ZoomableContentView import com.vitorpamplona.amethyst.ui.navigation.navs.INav @@ -408,7 +410,26 @@ private fun BottomRowActions( ) { Icon( imageVector = Icons.Outlined.CameraAlt, - contentDescription = stringRes(id = R.string.upload_image), + contentDescription = stringRes(id = R.string.take_a_picture), + modifier = Modifier.height(22.dp), + tint = MaterialTheme.colorScheme.placeholderText, + ) + } + } + + if (postViewModel.room != null) { + TakeVideoButton( + onVideoTaken = { postViewModel.pickedMedia(it) }, + ) + } else { + IconButton( + onClick = { + accountViewModel.toastManager.toast(R.string.messages_cant_upload_title, R.string.messages_cant_upload_explainer) + }, + ) { + Icon( + imageVector = Icons.Default.Videocam, + contentDescription = stringRes(id = R.string.record_a_video), modifier = Modifier.height(22.dp), tint = MaterialTheme.colorScheme.placeholderText, ) From c95ab2d6b7252da48456adb7122d92289cee7680 Mon Sep 17 00:00:00 2001 From: davotoula Date: Fri, 29 Aug 2025 14:26:59 +0100 Subject: [PATCH 7/9] Added "record and post video" button to NewPublicMessageScreen (I'm not sure it's used) --- .../publicMessages/NewPublicMessageScreen.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/notifications/publicMessages/NewPublicMessageScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/notifications/publicMessages/NewPublicMessageScreen.kt index 4f78893ec..09d47edbb 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/notifications/publicMessages/NewPublicMessageScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/notifications/publicMessages/NewPublicMessageScreen.kt @@ -43,7 +43,6 @@ 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.remember import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier @@ -62,6 +61,7 @@ import com.vitorpamplona.amethyst.ui.actions.UrlUserTagTransformation import com.vitorpamplona.amethyst.ui.actions.mediaServers.ServerType import com.vitorpamplona.amethyst.ui.actions.uploads.SelectFromGallery import com.vitorpamplona.amethyst.ui.actions.uploads.TakePictureButton +import com.vitorpamplona.amethyst.ui.actions.uploads.TakeVideoButton import com.vitorpamplona.amethyst.ui.components.ThinPaddingTextField import com.vitorpamplona.amethyst.ui.navigation.navs.INav import com.vitorpamplona.amethyst.ui.navigation.navs.Nav @@ -86,7 +86,6 @@ import com.vitorpamplona.amethyst.ui.note.creators.zapsplits.ForwardZapTo import com.vitorpamplona.amethyst.ui.note.creators.zapsplits.ForwardZapToButton import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.chats.privateDM.send.MessageFieldRow -import com.vitorpamplona.amethyst.ui.screen.loggedIn.chats.privateDM.send.SendDirectMessageTo import com.vitorpamplona.amethyst.ui.stringRes import com.vitorpamplona.amethyst.ui.theme.DividerThickness import com.vitorpamplona.amethyst.ui.theme.Font14SP @@ -322,6 +321,12 @@ private fun BottomRowActions( }, ) + TakeVideoButton( + onVideoTaken = { + postViewModel.selectImage(it) + }, + ) + ForwardZapToButton(postViewModel.wantsForwardZapTo) { postViewModel.wantsForwardZapTo = !postViewModel.wantsForwardZapTo } From 001167ff23254415189457e81ae1a0e5fe552e32 Mon Sep 17 00:00:00 2001 From: davotoula Date: Fri, 29 Aug 2025 14:38:19 +0100 Subject: [PATCH 8/9] Added "record and post video" button to NewProductScreen --- .../loggedIn/discover/nip99Classifieds/NewProductScreen.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/nip99Classifieds/NewProductScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/nip99Classifieds/NewProductScreen.kt index d58e7c48a..f12efbad8 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/nip99Classifieds/NewProductScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/nip99Classifieds/NewProductScreen.kt @@ -53,6 +53,7 @@ import com.vitorpamplona.amethyst.ui.actions.mediaServers.ServerType import com.vitorpamplona.amethyst.ui.actions.uploads.SelectFromGallery import com.vitorpamplona.amethyst.ui.actions.uploads.SelectedMedia import com.vitorpamplona.amethyst.ui.actions.uploads.TakePictureButton +import com.vitorpamplona.amethyst.ui.actions.uploads.TakeVideoButton import com.vitorpamplona.amethyst.ui.navigation.navs.INav import com.vitorpamplona.amethyst.ui.navigation.navs.Nav import com.vitorpamplona.amethyst.ui.navigation.topbars.PostingTopBar @@ -370,6 +371,12 @@ private fun BottomRowActions(postViewModel: NewProductViewModel) { }, ) + TakeVideoButton( + onVideoTaken = { + postViewModel.selectImage(it) + }, + ) + ForwardZapToButton(postViewModel.wantsForwardZapTo) { postViewModel.wantsForwardZapTo = !postViewModel.wantsForwardZapTo } From e387e04b6dce790e4fa35f265aedaecdb0ea7de8 Mon Sep 17 00:00:00 2001 From: davotoula Date: Fri, 29 Aug 2025 14:47:25 +0100 Subject: [PATCH 9/9] Added "record and post video" button to GenericCommentPostScreen.kt (GeoHashTag post and HashTag post) --- .../ui/note/nip22Comments/GenericCommentPostScreen.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/nip22Comments/GenericCommentPostScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/nip22Comments/GenericCommentPostScreen.kt index cde5a69ea..c692fc600 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/nip22Comments/GenericCommentPostScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/nip22Comments/GenericCommentPostScreen.kt @@ -53,6 +53,7 @@ import com.vitorpamplona.amethyst.ui.actions.mediaServers.ServerType import com.vitorpamplona.amethyst.ui.actions.uploads.SelectFromGallery import com.vitorpamplona.amethyst.ui.actions.uploads.SelectedMedia import com.vitorpamplona.amethyst.ui.actions.uploads.TakePictureButton +import com.vitorpamplona.amethyst.ui.actions.uploads.TakeVideoButton import com.vitorpamplona.amethyst.ui.navigation.navs.Nav import com.vitorpamplona.amethyst.ui.navigation.topbars.PostingTopBar import com.vitorpamplona.amethyst.ui.note.BaseUserPicture @@ -390,6 +391,12 @@ private fun BottomRowActions(postViewModel: CommentPostViewModel) { }, ) + TakeVideoButton( + onVideoTaken = { + postViewModel.selectImage(it) + }, + ) + ForwardZapToButton(postViewModel.wantsForwardZapTo) { postViewModel.wantsForwardZapTo = !postViewModel.wantsForwardZapTo }