From f441b3d0f1b7d280fe5b8024222ec748c13dfc44 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Mon, 4 Jul 2022 12:36:32 -0400 Subject: [PATCH] Use more performant method to check if message is quoted. --- .../conversation/ConversationMessage.java | 52 +++++++++---------- .../quotes/MessageQuotesRepository.kt | 2 +- .../securesms/database/MmsSmsDatabase.java | 8 +-- 3 files changed, 29 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java index 6dbb5b1d94..47c2db142e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationMessage.java @@ -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 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 mentions, int quotedCount) { + public static @NonNull ConversationMessage createWithResolvedData(@NonNull MessageRecord messageRecord, @Nullable CharSequence body, @Nullable List 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 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 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 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); } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesRepository.kt index 11bf883691..649bfb1be2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesRepository.kt @@ -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 } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java index f5818f42c8..2fa1aa29c9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java @@ -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(); } }