Ignore duplicate stories in sync messages.

This commit is contained in:
Alex Hart
2022-05-12 11:45:19 -03:00
committed by Cody Henthorne
parent 0fe0765e63
commit 9ed3f95ab8
6 changed files with 73 additions and 38 deletions

View File

@@ -203,6 +203,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
public abstract @NonNull MessageDatabase.Reader getUnreadStories(@NonNull RecipientId recipientId, int limit);
public abstract @Nullable ParentStoryId.GroupReply getParentStoryIdForGroupReply(long messageId);
public abstract void deleteGroupStoryReplies(long parentStoryId);
public abstract boolean isOutgoingStoryAlreadyInDatabase(@NonNull RecipientId recipientId, long sentTimestamp);
public abstract @NonNull StoryViewState getStoryViewState(@NonNull RecipientId recipientId);
public abstract void updateViewedStories(@NonNull Set<SyncMessageId> syncMessageIds);

View File

@@ -695,6 +695,22 @@ public class MmsDatabase extends MessageDatabase {
}
}
@Override
public boolean isOutgoingStoryAlreadyInDatabase(@NonNull RecipientId recipientId, long sentTimestamp) {
SQLiteDatabase database = databaseHelper.getSignalReadableDatabase();
String[] projection = new String[]{"COUNT(*)"};
String where = RECIPIENT_ID + " = ? AND " + STORY_TYPE + " > 0 AND " + DATE_SENT + " = ? AND (" + getOutgoingTypeClause() + ")";
String[] whereArgs = SqlUtil.buildArgs(recipientId, sentTimestamp);
try (Cursor cursor = database.query(TABLE_NAME, projection, where, whereArgs, null, null, null, "1")) {
if (cursor != null && cursor.moveToFirst()) {
return cursor.getInt(0) > 0;
}
}
return false;
}
@Override
public @NonNull MessageId getStoryId(@NonNull RecipientId authorId, long sentTimestamp) throws NoSuchMessageException {
SQLiteDatabase database = databaseHelper.getSignalReadableDatabase();

View File

@@ -1417,6 +1417,10 @@ public class SmsDatabase extends MessageDatabase {
throw new UnsupportedOperationException();
}
public boolean isOutgoingStoryAlreadyInDatabase(@NonNull RecipientId recipientId, long sentTimestamp) {
throw new UnsupportedOperationException();
}
@Override
public @NonNull MessageId getStoryId(@NonNull RecipientId authorId, long sentTimestamp) throws NoSuchMessageException {
throw new UnsupportedOperationException();

View File

@@ -49,7 +49,6 @@ import org.thoughtcrime.securesms.database.SentStorySyncManifest;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.StickerDatabase;
import org.thoughtcrime.securesms.database.ThreadDatabase;
import org.thoughtcrime.securesms.database.model.DistributionListId;
import org.thoughtcrime.securesms.database.model.Mention;
import org.thoughtcrime.securesms.database.model.MessageId;
import org.thoughtcrime.securesms.database.model.MessageLogEntry;
@@ -2062,6 +2061,11 @@ public final class MessageContentProcessor {
@NonNull List<LinkPreview> linkPreviews)
throws MmsException
{
if (SignalDatabase.mms().isOutgoingStoryAlreadyInDatabase(recipient.getId(), sentAtTimestamp)) {
warn(sentAtTimestamp, "Already inserted this story.");
return;
}
OutgoingMediaMessage mediaMessage = new OutgoingMediaMessage(recipient,
textStoryBody,
pendingAttachments,