mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-22 01:40:07 +01:00
Move reactions into their own table.
This commit is contained in:
committed by
Cody Henthorne
parent
3a1f06f510
commit
ab55fec6bd
@@ -167,6 +167,7 @@ import org.thoughtcrime.securesms.database.ThreadDatabase;
|
||||
import org.thoughtcrime.securesms.database.identity.IdentityRecordList;
|
||||
import org.thoughtcrime.securesms.database.model.IdentityRecord;
|
||||
import org.thoughtcrime.securesms.database.model.Mention;
|
||||
import org.thoughtcrime.securesms.database.model.MessageId;
|
||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
||||
import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
|
||||
import org.thoughtcrime.securesms.database.model.ReactionRecord;
|
||||
@@ -2361,9 +2362,9 @@ public class ConversationActivity extends PassphraseRequiredActivity
|
||||
.orElse(null);
|
||||
|
||||
if (oldRecord != null && oldRecord.getEmoji().equals(emoji)) {
|
||||
MessageSender.sendReactionRemoval(context, messageRecord.getId(), messageRecord.isMms(), oldRecord);
|
||||
MessageSender.sendReactionRemoval(context, new MessageId(messageRecord.getId(), messageRecord.isMms()), oldRecord);
|
||||
} else {
|
||||
MessageSender.sendNewReaction(context, messageRecord.getId(), messageRecord.isMms(), emoji);
|
||||
MessageSender.sendNewReaction(context, new MessageId(messageRecord.getId(), messageRecord.isMms()), emoji);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -2381,8 +2382,7 @@ public class ConversationActivity extends PassphraseRequiredActivity
|
||||
reactionDelegate.hide();
|
||||
|
||||
SignalExecutors.BOUNDED.execute(() -> MessageSender.sendReactionRemoval(context,
|
||||
messageRecord.getId(),
|
||||
messageRecord.isMms(),
|
||||
new MessageId(messageRecord.getId(), messageRecord.isMms()),
|
||||
oldRecord));
|
||||
} else {
|
||||
reactionDelegate.hideForReactWithAny();
|
||||
|
||||
@@ -13,7 +13,6 @@ import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
|
||||
import org.thoughtcrime.securesms.conversation.ConversationData.MessageRequestData;
|
||||
import org.thoughtcrime.securesms.conversation.ConversationMessage.ConversationMessageFactory;
|
||||
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
||||
import org.thoughtcrime.securesms.database.MentionDatabase;
|
||||
import org.thoughtcrime.securesms.database.MessageDatabase;
|
||||
import org.thoughtcrime.securesms.database.MmsSmsDatabase;
|
||||
import org.thoughtcrime.securesms.database.model.InMemoryMessageRecord;
|
||||
@@ -21,6 +20,8 @@ import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord;
|
||||
import org.thoughtcrime.securesms.database.model.Mention;
|
||||
import org.thoughtcrime.securesms.database.model.MessageId;
|
||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
||||
import org.thoughtcrime.securesms.database.model.ReactionRecord;
|
||||
import org.thoughtcrime.securesms.database.model.SmsMessageRecord;
|
||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||
import org.thoughtcrime.securesms.util.Stopwatch;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
@@ -72,12 +73,14 @@ class ConversationDataSource implements PagedDataSource<MessageId, ConversationM
|
||||
List<MessageRecord> records = new ArrayList<>(length);
|
||||
MentionHelper mentionHelper = new MentionHelper();
|
||||
AttachmentHelper attachmentHelper = new AttachmentHelper();
|
||||
ReactionHelper reactionHelper = new ReactionHelper();
|
||||
|
||||
try (MmsSmsDatabase.Reader reader = MmsSmsDatabase.readerFor(db.getConversation(threadId, start, length))) {
|
||||
MessageRecord record;
|
||||
while ((record = reader.getNext()) != null && !cancellationSignal.isCanceled()) {
|
||||
records.add(record);
|
||||
mentionHelper.add(record);
|
||||
reactionHelper.add(record);
|
||||
attachmentHelper.add(record);
|
||||
}
|
||||
}
|
||||
@@ -93,15 +96,18 @@ class ConversationDataSource implements PagedDataSource<MessageId, ConversationM
|
||||
stopwatch.split("messages");
|
||||
|
||||
mentionHelper.fetchMentions(context);
|
||||
|
||||
stopwatch.split("mentions");
|
||||
|
||||
attachmentHelper.fetchAttachments(context);
|
||||
reactionHelper.fetchReactions(context);
|
||||
stopwatch.split("reactions");
|
||||
|
||||
records = reactionHelper.buildUpdatedModels(context, records);
|
||||
stopwatch.split("reaction-models");
|
||||
|
||||
attachmentHelper.fetchAttachments(context);
|
||||
stopwatch.split("attachments");
|
||||
|
||||
records = attachmentHelper.buildUpdatedModels(context, records);
|
||||
|
||||
stopwatch.split("attachment-models");
|
||||
|
||||
List<ConversationMessage> messages = Stream.of(records)
|
||||
@@ -133,6 +139,11 @@ class ConversationDataSource implements PagedDataSource<MessageId, ConversationM
|
||||
|
||||
stopwatch.split("mentions");
|
||||
|
||||
List<ReactionRecord> reactions = DatabaseFactory.getReactionDatabase(context).getReactions(messageId);
|
||||
record = ReactionHelper.recordWithReactions(record, reactions);
|
||||
|
||||
stopwatch.split("reactions");
|
||||
|
||||
if (messageId.isMms()) {
|
||||
List<DatabaseAttachment> attachments = DatabaseFactory.getAttachmentDatabase(context).getAttachmentsForMessage(messageId.getId());
|
||||
if (attachments.size() > 0) {
|
||||
@@ -208,4 +219,43 @@ class ConversationDataSource implements PagedDataSource<MessageId, ConversationM
|
||||
}
|
||||
}
|
||||
|
||||
private static class ReactionHelper {
|
||||
|
||||
private Collection<MessageId> messageIds = new LinkedList<>();
|
||||
private Map<MessageId, List<ReactionRecord>> messageIdToReactions = new HashMap<>();
|
||||
|
||||
void add(MessageRecord record) {
|
||||
messageIds.add(new MessageId(record.getId(), record.isMms()));
|
||||
}
|
||||
|
||||
void fetchReactions(Context context) {
|
||||
messageIdToReactions = DatabaseFactory.getReactionDatabase(context).getReactionsForMessages(messageIds);
|
||||
}
|
||||
|
||||
@NonNull List<MessageRecord> buildUpdatedModels(@NonNull Context context, @NonNull List<MessageRecord> records) {
|
||||
return records.stream()
|
||||
.map(record -> {
|
||||
MessageId messageId = new MessageId(record.getId(), record.isMms());
|
||||
List<ReactionRecord> reactions = messageIdToReactions.get(messageId);
|
||||
|
||||
return recordWithReactions(record, reactions);
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
static MessageRecord recordWithReactions(@NonNull MessageRecord record, List<ReactionRecord> reactions) {
|
||||
if (Util.hasItems(reactions)) {
|
||||
if (record instanceof MediaMmsMessageRecord) {
|
||||
return ((MediaMmsMessageRecord) record).withReactions(reactions);
|
||||
} else if (record instanceof SmsMessageRecord) {
|
||||
return ((SmsMessageRecord) record).withReactions(reactions);
|
||||
} else {
|
||||
throw new IllegalStateException("We have reactions for an unsupported record type: " + record.getClass().getName());
|
||||
}
|
||||
} else {
|
||||
return record;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user