mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-02-24 19:56:00 +00:00
Show the full reply chain in the 'see replies' bottom sheet.
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user