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 5ec72a7f7e..b903583f12 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 @@ -104,7 +104,6 @@ import org.session.libsignal.utilities.guava.Optional import org.session.libsignal.utilities.hexEncodedPrivateKey import org.thoughtcrime.securesms.ApplicationContext import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity -import org.thoughtcrime.securesms.SessionDialogBuilder import org.thoughtcrime.securesms.attachments.ScreenshotObserver import org.thoughtcrime.securesms.audio.AudioRecorder import org.thoughtcrime.securesms.components.emoji.RecentEmojiPageModel @@ -2208,7 +2207,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe ON_DELETE -> deleteMessages(set) ON_COPY -> copyMessages(set) ON_SAVE -> { - if(message is MmsMessageRecord) saveAttachments(message) + if(message is MmsMessageRecord) saveAttachmentsIfPossible(setOf(message)) } } } @@ -2244,7 +2243,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe return result == PackageManager.PERMISSION_GRANTED } - override fun saveAttachment(messages: Set) { + override fun saveAttachmentsIfPossible(messages: Set) { val message = messages.first() as MmsMessageRecord // Note: The save option is only added to the menu in ConversationReactionOverlay.getMenuActionItems @@ -2431,7 +2430,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe ConversationReactionOverlay.Action.REPLY -> reply(selectedItems) ConversationReactionOverlay.Action.RESYNC -> resyncMessage(selectedItems) ConversationReactionOverlay.Action.RESEND -> resendMessage(selectedItems) - ConversationReactionOverlay.Action.DOWNLOAD -> saveAttachment(selectedItems) + ConversationReactionOverlay.Action.DOWNLOAD -> saveAttachmentsIfPossible(selectedItems) ConversationReactionOverlay.Action.COPY_MESSAGE -> copyMessages(selectedItems) ConversationReactionOverlay.Action.VIEW_INFO -> showMessageDetail(selectedItems) ConversationReactionOverlay.Action.SELECT -> selectMessages(selectedItems) 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 a100530337..bd491bbe70 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 @@ -61,6 +61,7 @@ import org.session.libsession.messaging.sending_receiving.attachments.DatabaseAt import org.thoughtcrime.securesms.MediaPreviewActivity.getPreviewIntent import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity import org.thoughtcrime.securesms.database.Storage +import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord import org.thoughtcrime.securesms.ui.Avatar import org.thoughtcrime.securesms.ui.CarouselNextButton import org.thoughtcrime.securesms.ui.CarouselPrevButton @@ -126,11 +127,16 @@ class MessageDetailActivity : PassphraseRequiredActionBarActivity() { @Composable private fun MessageDetailsScreen() { val state by viewModel.stateFlow.collectAsState() + + // can only save if the there is a media attachment which has finished downloading. + val canSave = state.mmsRecord?.containsMediaSlide() == true + && state.mmsRecord?.isMediaPending == false + MessageDetails( 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, + onSave = if(canSave) { { setResultAndFinish(ON_SAVE) } } else null, onDelete = { setResultAndFinish(ON_DELETE) }, onCopy = { setResultAndFinish(ON_COPY) }, onClickImage = { viewModel.onClickImage(it) }, diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationActionModeCallback.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationActionModeCallback.kt index 720310fa5e..21d5de52cf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationActionModeCallback.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationActionModeCallback.kt @@ -102,7 +102,7 @@ class ConversationActionModeCallback(private val adapter: ConversationAdapter, p R.id.menu_context_resync -> delegate?.resyncMessage(selectedItems) R.id.menu_context_resend -> delegate?.resendMessage(selectedItems) R.id.menu_message_details -> delegate?.showMessageDetail(selectedItems) - R.id.menu_context_save_attachment -> delegate?.saveAttachment(selectedItems) + R.id.menu_context_save_attachment -> delegate?.saveAttachmentsIfPossible(selectedItems) R.id.menu_context_reply -> delegate?.reply(selectedItems) } return true @@ -126,7 +126,7 @@ interface ConversationActionModeCallbackDelegate { fun resyncMessage(messages: Set) fun resendMessage(messages: Set) fun showMessageDetail(messages: Set) - fun saveAttachment(messages: Set) + fun saveAttachmentsIfPossible(messages: Set) fun reply(messages: Set) fun destroyActionMode() } \ No newline at end of file