diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java index 1c7dbb3dee..52fb0710f3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java @@ -947,7 +947,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo } private boolean hasQuote(MessageRecord messageRecord) { - return MessageRecordUtil.hasQuote(messageRecord) && (!isCondensedMode || !previousMessage.isPresent()); + return MessageRecordUtil.hasQuote(messageRecord); } private boolean hasSharedContact(MessageRecord messageRecord) { @@ -1696,7 +1696,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo } private void setHasBeenQuoted(@NonNull ConversationMessage message) { - if (message.hasBeenQuoted() && quotedIndicator != null) { + if (message.hasBeenQuoted() && !isCondensedMode && quotedIndicator != null) { quotedIndicator.setVisibility(VISIBLE); quotedIndicator.setOnClickListener(quotedIndicatorClickListener); } else if (quotedIndicator != null) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesBottomSheet.kt index 0765e3a232..3bf9792f73 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesBottomSheet.kt @@ -81,6 +81,10 @@ class MessageQuotesBottomSheet : FixedRoundedCornerBottomSheetDialogFragment() { val recyclerViewColorizer = RecyclerViewColorizer(list) disposables += viewModel.getMessages().subscribe { messages -> + if (messages.isEmpty()) { + dismiss() + } + messageAdapter.submitList(messages) { (list.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(messages.size - 1, 100) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesViewModel.kt index 4ab661bccd..70de88a5d4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesViewModel.kt @@ -12,10 +12,13 @@ import org.thoughtcrime.securesms.conversation.ConversationMessage import org.thoughtcrime.securesms.conversation.colors.GroupAuthorNameColorHelper import org.thoughtcrime.securesms.conversation.colors.NameColor import org.thoughtcrime.securesms.database.SignalDatabase +import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord import org.thoughtcrime.securesms.database.model.MessageId import org.thoughtcrime.securesms.database.model.MessageRecord +import org.thoughtcrime.securesms.database.model.Quote import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId +import org.thoughtcrime.securesms.util.getQuote class MessageQuotesViewModel( application: Application, @@ -27,27 +30,36 @@ class MessageQuotesViewModel( fun getMessages(): Observable> { return Observable.create> { emitter -> - val records: List = SignalDatabase.mmsSms.getAllMessagesThatQuote(messageId) - - val helper = ConversationDataSource.ReactionHelper() - helper.addAll(records) - helper.fetchReactions() - - val quotes = helper.buildUpdatedModels(records) - .map { ConversationMessage.ConversationMessageFactory.createWithUnresolvedData(getApplication(), it) } - val originalRecord: MessageRecord? = if (messageId.mms) { SignalDatabase.mms.getMessageRecordOrNull(messageId.id) } else { SignalDatabase.sms.getMessageRecordOrNull(messageId.id) } - if (originalRecord != null) { - val originalMessage: ConversationMessage = ConversationMessage.ConversationMessageFactory.createWithUnresolvedData(getApplication(), originalRecord, originalRecord.getDisplayBody(getApplication()), 0) - emitter.onNext(quotes + listOf(originalMessage)) - } else { - emitter.onNext(quotes) + if (originalRecord == null) { + emitter.onNext(emptyList()) + return@create } + + val replyRecords: List = SignalDatabase.mmsSms.getAllMessagesThatQuote(messageId) + + val reactionHelper = ConversationDataSource.ReactionHelper() + reactionHelper.addAll(replyRecords) + reactionHelper.fetchReactions() + + val replies = reactionHelper.buildUpdatedModels(replyRecords) + .map { replyRecord -> + val replyQuote: Quote? = replyRecord.getQuote() + if (replyQuote != null && replyQuote.id == originalRecord.dateSent) { + (replyRecord as MediaMmsMessageRecord).withoutQuote() + } else { + replyRecord + } + } + .map { ConversationMessage.ConversationMessageFactory.createWithUnresolvedData(getApplication(), it) } + + val originalMessage: ConversationMessage = ConversationMessage.ConversationMessageFactory.createWithUnresolvedData(getApplication(), originalRecord, originalRecord.getDisplayBody(getApplication()), 0) + emitter.onNext(replies + listOf(originalMessage)) } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java index a57e773df9..929675b0c5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java @@ -45,6 +45,7 @@ import java.io.Closeable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -307,9 +308,20 @@ public class MmsSmsDatabase extends Database { MessageRecord record; while ((record = reader.getNext()) != null) { records.add(record); + records.addAll(getAllMessagesThatQuote(new MessageId(record.getId(), record.isMms()))); } } + Collections.sort(records, (lhs, rhs) -> { + if (lhs.getDateReceived() > rhs.getDateReceived()) { + return -1; + } else if (lhs.getDateReceived() < rhs.getDateReceived()) { + return 1; + } else { + return 0; + } + }); + return records; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java index 8a6505cd5e..d8ef180366 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java @@ -158,6 +158,13 @@ public class MediaMmsMessageRecord extends MmsMessageRecord { getNotifiedTimestamp(), getViewedReceiptCount(), getReceiptTimestamp(), getMessageRanges(), getStoryType(), getParentStoryId(), getGiftBadge()); } + public @NonNull MediaMmsMessageRecord withoutQuote() { + return new MediaMmsMessageRecord(getId(), getRecipient(), getIndividualRecipient(), getRecipientDeviceId(), getDateSent(), getDateReceived(), getServerTimestamp(), getDeliveryReceiptCount(), getThreadId(), getBody(), getSlideDeck(), + getPartCount(), getType(), getIdentityKeyMismatches(), getNetworkFailures(), getSubscriptionId(), getExpiresIn(), getExpireStarted(), isViewOnce(), + getReadReceiptCount(), null, getSharedContacts(), getLinkPreviews(), isUnidentified(), getReactions(), isRemoteDelete(), mentionsSelf, + getNotifiedTimestamp(), getViewedReceiptCount(), getReceiptTimestamp(), getMessageRanges(), getStoryType(), getParentStoryId(), getGiftBadge()); + } + public @NonNull MediaMmsMessageRecord withAttachments(@NonNull Context context, @NonNull List attachments) { Map attachmentIdMap = new HashMap<>(); for (DatabaseAttachment attachment : attachments) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/MessageRecordUtil.kt b/app/src/main/java/org/thoughtcrime/securesms/util/MessageRecordUtil.kt index b2a4f2d3c5..db12288b71 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/MessageRecordUtil.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/MessageRecordUtil.kt @@ -8,6 +8,7 @@ import org.thoughtcrime.securesms.database.MmsSmsColumns import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.database.model.MmsMessageRecord +import org.thoughtcrime.securesms.database.model.Quote import org.thoughtcrime.securesms.database.model.databaseprotos.GiftBadge import org.thoughtcrime.securesms.mms.QuoteModel import org.thoughtcrime.securesms.mms.TextSlide @@ -78,6 +79,13 @@ fun MessageRecord.hasExtraText(): Boolean { fun MessageRecord.hasQuote(): Boolean = isMms && (this as MmsMessageRecord).quote != null +fun MessageRecord.getQuote(): Quote? = + if (isMms) { + (this as MmsMessageRecord).quote + } else { + null + } + fun MessageRecord.hasLinkPreview(): Boolean = isMms && (this as MmsMessageRecord).linkPreviews.isNotEmpty()