mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-22 09:49:30 +01:00
Fetch data in ConversationDataSource in parallel.
This commit is contained in:
committed by
Nicholas Tinsley
parent
e46759f436
commit
95c6f569d6
@@ -5285,7 +5285,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
|
||||
val previews = getLinkPreviews(cursor, attachments)
|
||||
val previewAttachments = previews.mapNotNull { it.thumbnail.orElse(null) }.toSet()
|
||||
|
||||
val slideDeck = buildSlideDeck(context, attachments.filterNot { contactAttachments.contains(it) }.filterNot { previewAttachments.contains(it) })
|
||||
val slideDeck = buildSlideDeck(attachments.filterNot { contactAttachments.contains(it) }.filterNot { previewAttachments.contains(it) })
|
||||
|
||||
val quote = getQuote(cursor)
|
||||
|
||||
@@ -5437,7 +5437,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
|
||||
companion object {
|
||||
|
||||
@JvmStatic
|
||||
fun buildSlideDeck(context: Context, attachments: List<DatabaseAttachment>): SlideDeck {
|
||||
fun buildSlideDeck(attachments: List<DatabaseAttachment>): SlideDeck {
|
||||
val messageAttachments = attachments
|
||||
.filterNot { it.isQuote }
|
||||
.sortedWith(DisplayOrderComparator())
|
||||
|
||||
@@ -70,22 +70,20 @@ class ReactionTable(context: Context, databaseHelper: SignalDatabase) : Database
|
||||
return reactions
|
||||
}
|
||||
|
||||
fun getReactionsForMessages(messageIds: Collection<MessageId>): Map<MessageId, List<ReactionRecord>> {
|
||||
fun getReactionsForMessages(messageIds: Collection<Long>): Map<Long, List<ReactionRecord>> {
|
||||
if (messageIds.isEmpty()) {
|
||||
return emptyMap()
|
||||
}
|
||||
|
||||
val messageIdToReactions: MutableMap<MessageId, MutableList<ReactionRecord>> = mutableMapOf()
|
||||
val messageIdToReactions: MutableMap<Long, MutableList<ReactionRecord>> = mutableMapOf()
|
||||
|
||||
val args: List<Array<String>> = messageIds.map { SqlUtil.buildArgs(it.id) }
|
||||
val args: List<Array<String>> = messageIds.map { SqlUtil.buildArgs(it) }
|
||||
|
||||
for (query: SqlUtil.Query in SqlUtil.buildCustomCollectionQuery("$MESSAGE_ID = ?", args)) {
|
||||
readableDatabase.query(TABLE_NAME, null, query.where, query.whereArgs, null, null, null).use { cursor ->
|
||||
while (cursor.moveToNext()) {
|
||||
val reaction: ReactionRecord = readReaction(cursor)
|
||||
val messageId = MessageId(
|
||||
id = CursorUtil.requireLong(cursor, MESSAGE_ID)
|
||||
)
|
||||
val messageId = CursorUtil.requireLong(cursor, MESSAGE_ID)
|
||||
|
||||
var reactionsList: MutableList<ReactionRecord>? = messageIdToReactions[messageId]
|
||||
|
||||
|
||||
@@ -229,7 +229,7 @@ public class MediaMmsMessageRecord extends MmsMessageRecord {
|
||||
getOriginalMessageId(), getRevisionNumber());
|
||||
}
|
||||
|
||||
public @NonNull MediaMmsMessageRecord withAttachments(@NonNull Context context, @NonNull List<DatabaseAttachment> attachments) {
|
||||
public @NonNull MediaMmsMessageRecord withAttachments(@NonNull List<DatabaseAttachment> attachments) {
|
||||
Map<AttachmentId, DatabaseAttachment> attachmentIdMap = new HashMap<>();
|
||||
for (DatabaseAttachment attachment : attachments) {
|
||||
attachmentIdMap.put(attachment.getAttachmentId(), attachment);
|
||||
@@ -239,10 +239,10 @@ public class MediaMmsMessageRecord extends MmsMessageRecord {
|
||||
Set<Attachment> contactAttachments = contacts.stream().map(Contact::getAvatarAttachment).filter(Objects::nonNull).collect(Collectors.toSet());
|
||||
List<LinkPreview> linkPreviews = updateLinkPreviews(getLinkPreviews(), attachmentIdMap);
|
||||
Set<Attachment> linkPreviewAttachments = linkPreviews.stream().map(LinkPreview::getThumbnail).filter(Optional::isPresent).map(Optional::get).collect(Collectors.toSet());
|
||||
Quote quote = updateQuote(context, getQuote(), attachments);
|
||||
Quote quote = updateQuote(getQuote(), attachments);
|
||||
|
||||
List<DatabaseAttachment> slideAttachments = attachments.stream().filter(a -> !contactAttachments.contains(a)).filter(a -> !linkPreviewAttachments.contains(a)).collect(Collectors.toList());
|
||||
SlideDeck slideDeck = MessageTable.MmsReader.buildSlideDeck(context, slideAttachments);
|
||||
SlideDeck slideDeck = MessageTable.MmsReader.buildSlideDeck(slideAttachments);
|
||||
|
||||
return new MediaMmsMessageRecord(getId(), getFromRecipient(), getFromDeviceId(), getToRecipient(), getDateSent(), getDateReceived(), getServerTimestamp(), getDeliveryReceiptCount(), getThreadId(), getBody(), slideDeck,
|
||||
getType(), getIdentityKeyMismatches(), getNetworkFailures(), getSubscriptionId(), getExpiresIn(), getExpireStarted(), isViewOnce(),
|
||||
@@ -302,7 +302,7 @@ public class MediaMmsMessageRecord extends MmsMessageRecord {
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private static @Nullable Quote updateQuote(@NonNull Context context, @Nullable Quote quote, @NonNull List<DatabaseAttachment> attachments) {
|
||||
private static @Nullable Quote updateQuote(@Nullable Quote quote, @NonNull List<DatabaseAttachment> attachments) {
|
||||
if (quote == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright 2023 Signal Messenger, LLC
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
package org.thoughtcrime.securesms.database.model
|
||||
|
||||
import org.thoughtcrime.securesms.attachments.DatabaseAttachment
|
||||
import org.thoughtcrime.securesms.database.CallTable
|
||||
import org.thoughtcrime.securesms.payments.Payment
|
||||
|
||||
fun MessageRecord.withReactions(reactions: List<ReactionRecord>): MessageRecord {
|
||||
return if (this is MediaMmsMessageRecord) {
|
||||
this.withReactions(reactions)
|
||||
} else {
|
||||
this
|
||||
}
|
||||
}
|
||||
|
||||
fun MessageRecord.withAttachments(attachments: List<DatabaseAttachment>): MessageRecord {
|
||||
return if (this is MediaMmsMessageRecord) {
|
||||
this.withAttachments(attachments)
|
||||
} else {
|
||||
this
|
||||
}
|
||||
}
|
||||
fun MessageRecord.withPayment(payment: Payment): MessageRecord {
|
||||
return if (this is MediaMmsMessageRecord) {
|
||||
this.withPayment(payment)
|
||||
} else {
|
||||
this
|
||||
}
|
||||
}
|
||||
|
||||
fun MessageRecord.withCall(call: CallTable.Call): MessageRecord {
|
||||
return if (this is MediaMmsMessageRecord) {
|
||||
this.withCall(call)
|
||||
} else {
|
||||
this
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user