From d7bd0bf3ea2ddf4f658e7d05f7a40cd2cb1e1372 Mon Sep 17 00:00:00 2001 From: ThomasSession Date: Wed, 4 Sep 2024 14:28:52 +1000 Subject: [PATCH] Can save media in message details page now --- .../conversation/v2/ConversationActivityV2.kt | 4 ++ .../conversation/v2/MessageDetailActivity.kt | 23 ++++++++-- .../securesms/preferences/SettingsActivity.kt | 6 +-- .../thoughtcrime/securesms/ui/Components.kt | 46 ++++++++++++++----- .../securesms/ui/theme/Dimensions.kt | 1 + .../main/res/menu/media_overview_context.xml | 17 ------- app/src/main/res/menu/media_preview.xml | 4 ++ 7 files changed, 64 insertions(+), 37 deletions(-) delete mode 100644 app/src/main/res/menu/media_overview_context.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index c96dc1eb55..5ec72a7f7e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -118,6 +118,7 @@ import org.thoughtcrime.securesms.conversation.v2.MessageDetailActivity.Companio import org.thoughtcrime.securesms.conversation.v2.MessageDetailActivity.Companion.ON_REPLY import org.thoughtcrime.securesms.conversation.v2.MessageDetailActivity.Companion.ON_RESEND import org.thoughtcrime.securesms.conversation.v2.MessageDetailActivity.Companion.ON_COPY +import org.thoughtcrime.securesms.conversation.v2.MessageDetailActivity.Companion.ON_SAVE import org.thoughtcrime.securesms.conversation.v2.dialogs.BlockedDialog import org.thoughtcrime.securesms.conversation.v2.dialogs.LinkPreviewDialog import org.thoughtcrime.securesms.conversation.v2.input_bar.InputBarButton @@ -2206,6 +2207,9 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe ON_RESEND -> resendMessage(set) ON_DELETE -> deleteMessages(set) ON_COPY -> copyMessages(set) + ON_SAVE -> { + if(message is MmsMessageRecord) saveAttachments(message) + } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/MessageDetailActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/MessageDetailActivity.kt index 0ac008792d..98332b8661 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/MessageDetailActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/MessageDetailActivity.kt @@ -96,6 +96,7 @@ class MessageDetailActivity : PassphraseRequiredActionBarActivity() { const val ON_RESEND = 2 const val ON_DELETE = 3 const val ON_COPY = 4 + const val ON_SAVE = 5 } override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) { @@ -126,6 +127,7 @@ class MessageDetailActivity : PassphraseRequiredActionBarActivity() { state = state, onReply = if (state.canReply) { { setResultAndFinish(ON_REPLY) } } else null, onResend = state.error?.let { { setResultAndFinish(ON_RESEND) } }, + onSave = if(state.mmsRecord != null) { { setResultAndFinish(ON_SAVE) } } else null, onDelete = { setResultAndFinish(ON_DELETE) }, onCopy = { setResultAndFinish(ON_COPY) }, onClickImage = { viewModel.onClickImage(it) }, @@ -148,6 +150,7 @@ fun MessageDetails( state: MessageDetailsState, onReply: (() -> Unit)? = null, onResend: (() -> Unit)? = null, + onSave: (() -> Unit)? = null, onDelete: () -> Unit = {}, onCopy: () -> Unit = {}, onClickImage: (Int) -> Unit = {}, @@ -183,10 +186,11 @@ fun MessageDetails( state.nonImageAttachmentFileDetails?.let { FileDetails(it) } CellMetadata(state) CellButtons( - onReply, - onResend, - onDelete, - onCopy + onReply = onReply, + onResend = onResend, + onSave = onSave, + onDelete = onDelete, + onCopy = onCopy ) } } @@ -222,6 +226,7 @@ fun CellMetadata( fun CellButtons( onReply: (() -> Unit)? = null, onResend: (() -> Unit)? = null, + onSave: (() -> Unit)? = null, onDelete: () -> Unit, onCopy: () -> Unit ) { @@ -243,6 +248,15 @@ fun CellButtons( ) Divider() + onSave?.let { + LargeItemButton( + R.string.save, + R.drawable.ic_baseline_save_24, + onClick = it + ) + Divider() + } + onResend?.let { LargeItemButton( R.string.resend, @@ -342,6 +356,7 @@ fun PreviewMessageDetailsButtons( CellButtons( onReply = {}, onResend = {}, + onSave = {}, onDelete = {}, onCopy = {} ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt index c6fa5998d0..75abce49a9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/SettingsActivity.kt @@ -38,8 +38,6 @@ import com.canhub.cropper.CropImage import com.canhub.cropper.CropImageContract import com.squareup.phrase.Phrase import dagger.hilt.android.AndroidEntryPoint -import java.io.File -import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow @@ -60,7 +58,6 @@ import org.session.libsession.messaging.MessagingModuleConfiguration import org.session.libsession.snode.OnionRequestAPI import org.session.libsession.snode.SnodeAPI import org.session.libsession.utilities.Address -import org.session.libsession.utilities.NonTranslatableStringConstants.DEBUG_MENU import org.session.libsession.utilities.ProfileKeyUtil import org.session.libsession.utilities.ProfilePictureUtilities import org.session.libsession.utilities.SSKEnvironment.ProfileManagerProtocol @@ -97,7 +94,8 @@ import org.thoughtcrime.securesms.util.BitmapUtil import org.thoughtcrime.securesms.util.ConfigurationMessageUtilities import org.thoughtcrime.securesms.util.NetworkUtils import org.thoughtcrime.securesms.util.push -import org.thoughtcrime.securesms.util.show +import java.io.File +import javax.inject.Inject @AndroidEntryPoint class SettingsActivity : PassphraseRequiredActionBarActivity() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/ui/Components.kt b/app/src/main/java/org/thoughtcrime/securesms/ui/Components.kt index baf0c1f122..d04d73fda1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ui/Components.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/ui/Components.kt @@ -11,8 +11,12 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.heightIn @@ -45,6 +49,7 @@ import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -126,7 +131,7 @@ fun LargeItemButtonWithDrawable( onClick: () -> Unit ) { ItemButtonWithDrawable( - textId, icon, modifier.heightIn(min = LocalDimensions.current.minLargeItemButtonHeight), + textId, icon, modifier, LocalType.current.h8, colors, onClick ) } @@ -167,8 +172,13 @@ fun LargeItemButton( onClick: () -> Unit ) { ItemButton( - textId, icon, modifier.heightIn(min = LocalDimensions.current.minLargeItemButtonHeight), - LocalType.current.h8, colors, onClick + textId = textId, + icon = icon, + modifier = modifier, + minHeight = LocalDimensions.current.minLargeItemButtonHeight, + textStyle = LocalType.current.h8, + colors = colors, + onClick = onClick ) } @@ -181,8 +191,13 @@ fun LargeItemButton( onClick: () -> Unit ) { ItemButton( - text, icon, modifier.heightIn(min = LocalDimensions.current.minLargeItemButtonHeight), - LocalType.current.h8, colors, onClick + text = text, + icon = icon, + modifier = modifier, + minHeight = LocalDimensions.current.minLargeItemButtonHeight, + textStyle = LocalType.current.h8, + colors = colors, + onClick = onClick ) } @@ -191,6 +206,7 @@ fun ItemButton( text: String, icon: Int, modifier: Modifier, + minHeight: Dp = LocalDimensions.current.minItemButtonHeight, textStyle: TextStyle = LocalType.current.xl, colors: ButtonColors = transparentButtonColors(), onClick: () -> Unit @@ -205,6 +221,7 @@ fun ItemButton( modifier = Modifier.align(Alignment.Center) ) }, + minHeight = minHeight, textStyle = textStyle, colors = colors, onClick = onClick @@ -219,6 +236,7 @@ fun ItemButton( @StringRes textId: Int, @DrawableRes icon: Int, modifier: Modifier = Modifier, + minHeight: Dp = LocalDimensions.current.minItemButtonHeight, textStyle: TextStyle = LocalType.current.xl, colors: ButtonColors = transparentButtonColors(), onClick: () -> Unit @@ -233,6 +251,7 @@ fun ItemButton( modifier = Modifier.align(Alignment.Center) ) }, + minHeight = minHeight, textStyle = textStyle, colors = colors, onClick = onClick @@ -249,20 +268,23 @@ fun ItemButton( text: String, icon: @Composable BoxScope.() -> Unit, modifier: Modifier = Modifier, + minHeight: Dp = LocalDimensions.current.minLargeItemButtonHeight, textStyle: TextStyle = LocalType.current.xl, colors: ButtonColors = transparentButtonColors(), onClick: () -> Unit ) { TextButton( - modifier = modifier.fillMaxWidth(), + modifier = modifier.fillMaxWidth() + .height(IntrinsicSize.Min) + .heightIn(min = minHeight) + .padding(horizontal = LocalDimensions.current.xsSpacing), colors = colors, onClick = onClick, shape = RectangleShape, ) { Box( - modifier = Modifier - .width(50.dp) - .wrapContentHeight() + modifier = Modifier.fillMaxHeight() + .aspectRatio(1f) .align(Alignment.CenterVertically) ) { icon() @@ -274,7 +296,6 @@ fun ItemButton( text, Modifier .fillMaxWidth() - .padding(vertical = LocalDimensions.current.xsSpacing) .align(Alignment.CenterVertically), style = textStyle ) @@ -371,7 +392,8 @@ fun Modifier.fadingEdges( @Composable fun Divider(modifier: Modifier = Modifier, startIndent: Dp = 0.dp) { HorizontalDivider( - modifier = modifier.padding(horizontal = LocalDimensions.current.smallSpacing) + modifier = modifier + .padding(horizontal = LocalDimensions.current.smallSpacing) .padding(start = startIndent), color = LocalColors.current.borders, ) @@ -471,4 +493,4 @@ fun LoadingArcOr(loading: Boolean, content: @Composable () -> Unit) { AnimatedVisibility(!loading) { content() } -} +} \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/ui/theme/Dimensions.kt b/app/src/main/java/org/thoughtcrime/securesms/ui/theme/Dimensions.kt index 66e5b74e8b..ac5ce8c4cf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ui/theme/Dimensions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/ui/theme/Dimensions.kt @@ -17,6 +17,7 @@ data class Dimensions( val dividerIndent: Dp = 60.dp, val appBarHeight: Dp = 64.dp, + val minItemButtonHeight: Dp = 50.dp, val minLargeItemButtonHeight: Dp = 60.dp, val indicatorHeight: Dp = 4.dp, diff --git a/app/src/main/res/menu/media_overview_context.xml b/app/src/main/res/menu/media_overview_context.xml deleted file mode 100644 index a0ff4ab988..0000000000 --- a/app/src/main/res/menu/media_overview_context.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/menu/media_preview.xml b/app/src/main/res/menu/media_preview.xml index 8689bd4c55..9818143be5 100644 --- a/app/src/main/res/menu/media_preview.xml +++ b/app/src/main/res/menu/media_preview.xml @@ -4,24 +4,28 @@