diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java index cd413e5a76..198d30ee13 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java @@ -356,7 +356,7 @@ public class ConversationAdapter if (scheduledMessagesMode) { viewHolder.setText(DateUtils.getScheduledMessagesDateHeaderString(viewHolder.itemView.getContext(), locale, ((MediaMmsMessageRecord) conversationMessage.getMessageRecord()).getScheduledDate())); } else { - viewHolder.setText(DateUtils.getConversationDateHeaderString(viewHolder.itemView.getContext(), locale, conversationMessage.getMessageRecord().getConversationTimestamp())); + viewHolder.setText(DateUtils.getConversationDateHeaderString(viewHolder.itemView.getContext(), locale, conversationMessage.getConversationTimestamp())); } if (type == HEADER_TYPE_POPOVER_DATE) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java index db2c1e8b1a..d79c182c15 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java @@ -8,11 +8,13 @@ import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; import org.signal.core.util.Conversions; +import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.components.mention.MentionAnnotation; import org.thoughtcrime.securesms.conversation.mutiselect.Multiselect; import org.thoughtcrime.securesms.conversation.mutiselect.MultiselectCollection; import org.thoughtcrime.securesms.database.BodyRangeUtil; import org.thoughtcrime.securesms.database.MentionUtil; +import org.thoughtcrime.securesms.database.NoSuchMessageException; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.database.model.Mention; import org.thoughtcrime.securesms.database.model.MessageRecord; @@ -30,6 +32,9 @@ import java.util.Objects; * for various presentations. */ public class ConversationMessage { + + private static final String TAG = Log.tag(ConversationMessage.class); + @NonNull private final MessageRecord messageRecord; @NonNull private final List mentions; @Nullable private final SpannableString body; @@ -37,19 +42,22 @@ public class ConversationMessage { @NonNull private final MessageStyler.Result styleResult; @NonNull private final Recipient threadRecipient; private final boolean hasBeenQuoted; + @Nullable private final MessageRecord originalMessage; private ConversationMessage(@NonNull MessageRecord messageRecord, @Nullable CharSequence body, @Nullable List mentions, boolean hasBeenQuoted, @Nullable MessageStyler.Result styleResult, - @NonNull Recipient threadRecipient) + @NonNull Recipient threadRecipient, + @Nullable MessageRecord originalMessage) { this.messageRecord = messageRecord; this.hasBeenQuoted = hasBeenQuoted; this.mentions = mentions != null ? mentions : Collections.emptyList(); this.styleResult = styleResult != null ? styleResult : MessageStyler.Result.none(); this.threadRecipient = threadRecipient; + this.originalMessage = originalMessage; if (body != null) { this.body = SpannableString.valueOf(body); @@ -120,6 +128,20 @@ public class ConversationMessage { getBottomButton() == null; } + public long getConversationTimestamp() { + if (originalMessage != null) { + return originalMessage.getDateSent(); + } + return messageRecord.getDateSent(); + } + + public MessageRecord getOriginalMessage() { + if (originalMessage != null) { + return originalMessage; + } + return messageRecord; + } + public boolean hasBeenScheduled() { return MessageRecordUtil.isScheduled(messageRecord); } @@ -163,12 +185,22 @@ public class ConversationMessage { styleResult = MessageStyler.style(messageRecord.getDateSent(), bodyRanges, styledAndMentionBody); } + MessageRecord originalMessage = null; + if (messageRecord.isEditMessage()) { + try { + originalMessage = SignalDatabase.messages().getMessageRecord(messageRecord.getOriginalMessageId().getId()); + } catch (NoSuchMessageException e) { + Log.e(TAG, "Original message of edit message not found!", e); + } + } + return new ConversationMessage(messageRecord, styledAndMentionBody != null ? styledAndMentionBody : mentionsUpdate != null ? mentionsUpdate.getBody() : body, mentionsUpdate != null ? mentionsUpdate.getMentions() : null, hasBeenQuoted, styleResult, - threadRecipient); + threadRecipient, + originalMessage); } /** diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/MenuState.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/MenuState.java index f28b839189..2ce782c00e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/MenuState.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/MenuState.java @@ -162,7 +162,9 @@ public final class MenuState { .shouldShowResendAction(false) .shouldShowEdit(false); } else { - MessageRecord messageRecord = selectedParts.iterator().next().getMessageRecord(); + MultiselectPart multiSelectRecord = selectedParts.iterator().next(); + + MessageRecord messageRecord = multiSelectRecord.getMessageRecord(); builder.shouldShowResendAction(messageRecord.isFailed()) .shouldShowSaveAttachmentAction(mediaIsSelected && @@ -180,7 +182,7 @@ public final class MenuState { builder.shouldShowEdit(!actionMessage && hasText && - MessageConstraintsUtil.isValidEditMessageSend(messageRecord, System.currentTimeMillis())); + MessageConstraintsUtil.isValidEditMessageSend(multiSelectRecord.getConversationMessage().getOriginalMessage(), System.currentTimeMillis())); } return builder.shouldShowCopyAction(!actionMessage && !remoteDelete && hasText && !hasGift && !hasPayment) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/DateHeaderDecoration.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/DateHeaderDecoration.kt index 7dea3d530a..dc3f2fec93 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/DateHeaderDecoration.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/DateHeaderDecoration.kt @@ -116,7 +116,7 @@ class DateHeaderDecoration(hasWallpaper: Boolean = false, private val scheduleMe return if (scheduleMessageMode) { (conversationMessage.messageRecord as MediaMmsMessageRecord).scheduledDate } else { - conversationMessage.messageRecord.conversationTimestamp + conversationMessage.conversationTimestamp } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java index 21f151f8fa..635f2f3228 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java @@ -741,17 +741,6 @@ public abstract class MessageRecord extends DisplayRecord { return originalMessageId; } - /** - * Get the timestamp of a message, shown in the conversation. This is used - * for example when showing the conversation date separators. - */ - public long getConversationTimestamp() { - if (isEditMessage()) { - return getDateReceived(); - } - return getDateSent(); - } - public int getRevisionNumber() { return revisionNumber; }