Show the full reply chain in the 'see replies' bottom sheet.

This commit is contained in:
Greyson Parrelli
2022-07-01 13:36:54 -04:00
committed by GitHub
parent a44c3c5c2f
commit daab296172
6 changed files with 59 additions and 16 deletions

View File

@@ -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) {

View File

@@ -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)
}

View File

@@ -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<List<ConversationMessage>> {
return Observable.create<List<ConversationMessage>> { emitter ->
val records: List<MessageRecord> = 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<MessageRecord> = 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())

View File

@@ -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;
}

View File

@@ -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<DatabaseAttachment> attachments) {
Map<AttachmentId, DatabaseAttachment> attachmentIdMap = new HashMap<>();
for (DatabaseAttachment attachment : attachments) {

View File

@@ -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()