Use more performant method to check if message is quoted.

This commit is contained in:
Greyson Parrelli
2022-07-04 12:36:32 -04:00
parent 99f1c9fd65
commit f441b3d0f1
3 changed files with 29 additions and 33 deletions

View File

@@ -32,23 +32,23 @@ public class ConversationMessage {
@Nullable private final SpannableString body;
@NonNull private final MultiselectCollection multiselectCollection;
@NonNull private final MessageStyler.Result styleResult;
private final int quotedCount;
private final boolean hasBeenQuoted;
private ConversationMessage(@NonNull MessageRecord messageRecord) {
this(messageRecord, null, null, 0);
this(messageRecord, null, null, false);
}
private ConversationMessage(@NonNull MessageRecord messageRecord, int quotedCount) {
this(messageRecord, null, null, quotedCount);
private ConversationMessage(@NonNull MessageRecord messageRecord, boolean hasBeenQuoted) {
this(messageRecord, null, null, hasBeenQuoted);
}
private ConversationMessage(@NonNull MessageRecord messageRecord,
@Nullable CharSequence body,
@Nullable List<Mention> mentions,
int quotedCount)
boolean hasBeenQuoted)
{
this.messageRecord = messageRecord;
this.quotedCount = quotedCount;
this.hasBeenQuoted = hasBeenQuoted;
this.mentions = mentions != null ? mentions : Collections.emptyList();
if (body != null) {
@@ -85,11 +85,7 @@ public class ConversationMessage {
}
public boolean hasBeenQuoted() {
return quotedCount > 0;
}
public int getQuoteCount() {
return quotedCount;
return hasBeenQuoted;
}
@Override
@@ -134,8 +130,8 @@ public class ConversationMessage {
* heavy work performed as the message is assumed to not have any mentions.
*/
@AnyThread
public static @NonNull ConversationMessage createWithResolvedData(@NonNull MessageRecord messageRecord, int quotedCount) {
return new ConversationMessage(messageRecord, quotedCount);
public static @NonNull ConversationMessage createWithResolvedData(@NonNull MessageRecord messageRecord, boolean hasBeenQuoted) {
return new ConversationMessage(messageRecord, hasBeenQuoted);
}
/**
@@ -143,16 +139,16 @@ public class ConversationMessage {
* list of actual mentions. No database or heavy work performed as the body and mentions are assumed to be
* fully updated with display names.
*
* @param body Contains appropriate {@link MentionAnnotation}s and is updated with actual profile names.
* @param mentions List of actual mentions (i.e., not placeholder) matching annotation ranges in body.
* @param quotedCount The number of times a message has been quoted
* @param body Contains appropriate {@link MentionAnnotation}s and is updated with actual profile names.
* @param mentions List of actual mentions (i.e., not placeholder) matching annotation ranges in body.
* @param hasBeenQuoted Whether or not the message has been quoted by another message.
*/
@AnyThread
public static @NonNull ConversationMessage createWithResolvedData(@NonNull MessageRecord messageRecord, @Nullable CharSequence body, @Nullable List<Mention> mentions, int quotedCount) {
public static @NonNull ConversationMessage createWithResolvedData(@NonNull MessageRecord messageRecord, @Nullable CharSequence body, @Nullable List<Mention> mentions, boolean hasBeenQuoted) {
if (messageRecord.isMms() && mentions != null && !mentions.isEmpty()) {
return new ConversationMessage(messageRecord, body, mentions, quotedCount);
return new ConversationMessage(messageRecord, body, mentions, hasBeenQuoted);
}
return new ConversationMessage(messageRecord, body, null, quotedCount);
return new ConversationMessage(messageRecord, body, null, hasBeenQuoted);
}
/**
@@ -163,13 +159,13 @@ public class ConversationMessage {
*/
@WorkerThread
public static @NonNull ConversationMessage createWithUnresolvedData(@NonNull Context context, @NonNull MessageRecord messageRecord, @Nullable List<Mention> mentions) {
int quotedCount = SignalDatabase.mmsSms().getQuotedCount(messageRecord);
boolean hasBeenQuoted = SignalDatabase.mmsSms().isQuoted(messageRecord);
if (messageRecord.isMms() && mentions != null && !mentions.isEmpty()) {
MentionUtil.UpdatedBodyAndMentions updated = MentionUtil.updateBodyAndMentionsWithDisplayNames(context, messageRecord, mentions);
return new ConversationMessage(messageRecord, updated.getBody(), updated.getMentions(), quotedCount);
return new ConversationMessage(messageRecord, updated.getBody(), updated.getMentions(), hasBeenQuoted);
}
return createWithResolvedData(messageRecord, quotedCount);
return createWithResolvedData(messageRecord, hasBeenQuoted);
}
/**
@@ -189,16 +185,16 @@ public class ConversationMessage {
*/
@WorkerThread
public static @NonNull ConversationMessage createWithUnresolvedData(@NonNull Context context, @NonNull MessageRecord messageRecord, @NonNull CharSequence body) {
int quotedCount = SignalDatabase.mmsSms().getQuotedCount(messageRecord);
boolean hasBeenQuoted = SignalDatabase.mmsSms().isQuoted(messageRecord);
if (messageRecord.isMms()) {
List<Mention> mentions = SignalDatabase.mentions().getMentionsForMessage(messageRecord.getId());
if (!mentions.isEmpty()) {
MentionUtil.UpdatedBodyAndMentions updated = MentionUtil.updateBodyAndMentionsWithDisplayNames(context, body, mentions);
return new ConversationMessage(messageRecord, updated.getBody(), updated.getMentions(), quotedCount);
return new ConversationMessage(messageRecord, updated.getBody(), updated.getMentions(), hasBeenQuoted);
}
}
return createWithResolvedData(messageRecord, body, null, quotedCount);
return createWithResolvedData(messageRecord, body, null, hasBeenQuoted);
}
/**
@@ -207,15 +203,15 @@ public class ConversationMessage {
* database operations to query for mentions and then to resolve mentions to display names.
*/
@WorkerThread
public static @NonNull ConversationMessage createWithUnresolvedData(@NonNull Context context, @NonNull MessageRecord messageRecord, @NonNull CharSequence body, int quotedCount) {
public static @NonNull ConversationMessage createWithUnresolvedData(@NonNull Context context, @NonNull MessageRecord messageRecord, @NonNull CharSequence body, boolean hasBeenQuoted) {
if (messageRecord.isMms()) {
List<Mention> mentions = SignalDatabase.mentions().getMentionsForMessage(messageRecord.getId());
if (!mentions.isEmpty()) {
MentionUtil.UpdatedBodyAndMentions updated = MentionUtil.updateBodyAndMentionsWithDisplayNames(context, body, mentions);
return new ConversationMessage(messageRecord, updated.getBody(), updated.getMentions(), quotedCount);
return new ConversationMessage(messageRecord, updated.getBody(), updated.getMentions(), hasBeenQuoted);
}
}
return createWithResolvedData(messageRecord, body, null, quotedCount);
return createWithResolvedData(messageRecord, body, null, hasBeenQuoted);
}
}
}

View File

@@ -80,7 +80,7 @@ class MessageQuotesRepository {
fetchReactions()
}
.buildUpdatedModels(listOf(originalRecord))
.map { ConversationMessageFactory.createWithUnresolvedData(application, it, it.getDisplayBody(application), 0) }
.map { ConversationMessageFactory.createWithUnresolvedData(application, it, it.getDisplayBody(application), false) }
return replies + originalMessage
}

View File

@@ -276,17 +276,17 @@ public class MmsSmsDatabase extends Database {
}
/**
* The number of messages that quote the target message
* Whether or not the message has been quoted by another message.
*/
public int getQuotedCount(@NonNull MessageRecord messageRecord) {
public boolean isQuoted(@NonNull MessageRecord messageRecord) {
RecipientId author = messageRecord.isOutgoing() ? Recipient.self().getId() : messageRecord.getRecipient().getId();
long timestamp = messageRecord.getDateSent();
String where = MmsDatabase.QUOTE_ID + " = ? AND " + MmsDatabase.QUOTE_AUTHOR + " = ?";
String[] whereArgs = SqlUtil.buildArgs(timestamp, author);
try (Cursor cursor = getReadableDatabase().query(MmsDatabase.TABLE_NAME, COUNT, where, whereArgs, null, null, null)) {
return cursor.moveToFirst() ? cursor.getInt(0) : 0;
try (Cursor cursor = getReadableDatabase().query(MmsDatabase.TABLE_NAME, new String[]{ "1" }, where, whereArgs, null, null, null, "1")) {
return cursor.moveToFirst();
}
}