mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-25 05:27:42 +00:00
Use more performant method to check if message is quoted.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user