Skip to content

Commit a385cb0

Browse files
greyson-signalcody-signal
authored andcommitted
Dedupe network and identity failures.
1 parent e013813 commit a385cb0

19 files changed

+133
-130
lines changed

app/src/main/java/org/thoughtcrime/securesms/database/MessageDatabase.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import org.signal.core.util.logging.Log;
1818
import org.thoughtcrime.securesms.database.documents.Document;
1919
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
20-
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchList;
20+
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchSet;
2121
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
2222
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
2323
import org.thoughtcrime.securesms.database.model.MessageId;
@@ -138,7 +138,7 @@ public MessageDatabase(Context context, SQLCipherOpenHelper databaseHelper) {
138138
public abstract @NonNull List<MarkedMessageInfo> setIncomingMessagesViewed(@NonNull List<Long> messageIds);
139139

140140
public abstract void addFailures(long messageId, List<NetworkFailure> failure);
141-
public abstract void removeFailure(long messageId, NetworkFailure failure);
141+
public abstract void setNetworkFailures(long messageId, Set<NetworkFailure> failures);
142142

143143
public abstract @NonNull Pair<Long, Long> insertReceivedCall(@NonNull RecipientId address, boolean isVideoOffer);
144144
public abstract @NonNull Pair<Long, Long> insertOutgoingCall(@NonNull RecipientId address, boolean isVideoOffer);
@@ -395,7 +395,7 @@ public void addMismatchedIdentity(long messageId, @NonNull RecipientId recipient
395395
try {
396396
addToDocument(messageId, MISMATCHED_IDENTITIES,
397397
new IdentityKeyMismatch(recipientId, identityKey),
398-
IdentityKeyMismatchList.class);
398+
IdentityKeyMismatchSet.class);
399399
} catch (IOException e) {
400400
Log.w(TAG, e);
401401
}
@@ -405,7 +405,15 @@ public void removeMismatchedIdentity(long messageId, @NonNull RecipientId recipi
405405
try {
406406
removeFromDocument(messageId, MISMATCHED_IDENTITIES,
407407
new IdentityKeyMismatch(recipientId, identityKey),
408-
IdentityKeyMismatchList.class);
408+
IdentityKeyMismatchSet.class);
409+
} catch (IOException e) {
410+
Log.w(TAG, e);
411+
}
412+
}
413+
414+
public void setMismatchedIdentities(long messageId, @NonNull Set<IdentityKeyMismatch> mismatches) {
415+
try {
416+
setDocument(databaseHelper.getSignalWritableDatabase(), messageId, MISMATCHED_IDENTITIES, new IdentityKeyMismatchSet(mismatches));
409417
} catch (IOException e) {
410418
Log.w(TAG, e);
411419
}
@@ -458,7 +466,7 @@ protected <D extends Document<I>, I> void removeFromDocument(long messageId, Str
458466

459467
try {
460468
D document = getDocument(database, messageId, column, clazz);
461-
Iterator<I> iterator = document.getList().iterator();
469+
Iterator<I> iterator = document.getItems().iterator();
462470

463471
while (iterator.hasNext()) {
464472
I item = iterator.next();
@@ -490,7 +498,7 @@ protected <T extends Document<I>, I> void addToDocument(long messageId, String c
490498

491499
try {
492500
T document = getDocument(database, messageId, column, clazz);
493-
document.getList().addAll(objects);
501+
document.getItems().addAll(objects);
494502
setDocument(database, messageId, column, document);
495503

496504
database.setTransactionSuccessful();
@@ -499,7 +507,7 @@ protected <T extends Document<I>, I> void addToDocument(long messageId, String c
499507
}
500508
}
501509

502-
private void setDocument(SQLiteDatabase database, long messageId, String column, Document document) throws IOException {
510+
protected void setDocument(SQLiteDatabase database, long messageId, String column, Document document) throws IOException {
503511
ContentValues contentValues = new ContentValues();
504512

505513
if (document == null || document.size() == 0) {

app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@
4141
import org.thoughtcrime.securesms.attachments.MmsNotificationAttachment;
4242
import org.thoughtcrime.securesms.contactshare.Contact;
4343
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
44-
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchList;
44+
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchSet;
4545
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
46-
import org.thoughtcrime.securesms.database.documents.NetworkFailureList;
46+
import org.thoughtcrime.securesms.database.documents.NetworkFailureSet;
4747
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
4848
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord;
4949
import org.thoughtcrime.securesms.database.model.Mention;
@@ -56,7 +56,6 @@
5656
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList;
5757
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
5858
import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange;
59-
import org.thoughtcrime.securesms.jobs.ThreadUpdateJob;
6059
import org.thoughtcrime.securesms.jobs.TrimThreadJob;
6160
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
6261
import org.thoughtcrime.securesms.mms.IncomingMediaMessage;
@@ -603,16 +602,16 @@ public boolean hasMeaningfulMessage(long threadId) {
603602
@Override
604603
public void addFailures(long messageId, List<NetworkFailure> failure) {
605604
try {
606-
addToDocument(messageId, NETWORK_FAILURE, failure, NetworkFailureList.class);
605+
addToDocument(messageId, NETWORK_FAILURE, failure, NetworkFailureSet.class);
607606
} catch (IOException e) {
608607
Log.w(TAG, e);
609608
}
610609
}
611610

612611
@Override
613-
public void removeFailure(long messageId, NetworkFailure failure) {
612+
public void setNetworkFailures(long messageId, Set<NetworkFailure> failures) {
614613
try {
615-
removeFromDocument(messageId, NETWORK_FAILURE, failure, NetworkFailureList.class);
614+
setDocument(databaseHelper.getSignalWritableDatabase(), messageId, NETWORK_FAILURE, new NetworkFailureSet(failures));
616615
} catch (IOException e) {
617616
Log.w(TAG, e);
618617
}
@@ -1175,26 +1174,26 @@ public OutgoingMediaMessage getOutgoingMessage(long messageId)
11751174
.sorted(new DatabaseAttachment.DisplayOrderComparator())
11761175
.map(a -> (Attachment)a).toList();
11771176

1178-
Recipient recipient = Recipient.resolved(RecipientId.from(recipientId));
1179-
List<NetworkFailure> networkFailures = new LinkedList<>();
1180-
List<IdentityKeyMismatch> mismatches = new LinkedList<>();
1181-
QuoteModel quote = null;
1177+
Recipient recipient = Recipient.resolved(RecipientId.from(recipientId));
1178+
Set<NetworkFailure> networkFailures = new HashSet<>();
1179+
Set<IdentityKeyMismatch> mismatches = new HashSet<>();
1180+
QuoteModel quote = null;
11821181

11831182
if (quoteId > 0 && quoteAuthor > 0 && (!TextUtils.isEmpty(quoteText) || !quoteAttachments.isEmpty())) {
11841183
quote = new QuoteModel(quoteId, RecipientId.from(quoteAuthor), quoteText, quoteMissing, quoteAttachments, quoteMentions);
11851184
}
11861185

11871186
if (!TextUtils.isEmpty(mismatchDocument)) {
11881187
try {
1189-
mismatches = JsonUtils.fromJson(mismatchDocument, IdentityKeyMismatchList.class).getList();
1188+
mismatches = JsonUtils.fromJson(mismatchDocument, IdentityKeyMismatchSet.class).getItems();
11901189
} catch (IOException e) {
11911190
Log.w(TAG, e);
11921191
}
11931192
}
11941193

11951194
if (!TextUtils.isEmpty(networkDocument)) {
11961195
try {
1197-
networkFailures = JsonUtils.fromJson(networkDocument, NetworkFailureList.class).getList();
1196+
networkFailures = JsonUtils.fromJson(networkDocument, NetworkFailureSet.class).getItems();
11981197
} catch (IOException e) {
11991198
Log.w(TAG, e);
12001199
}
@@ -1975,8 +1974,8 @@ public MessageRecord getCurrent() {
19751974
slideDeck,
19761975
slideDeck.getSlides().size(),
19771976
message.isSecure() ? MmsSmsColumns.Types.getOutgoingEncryptedMessageType() : MmsSmsColumns.Types.getOutgoingSmsMessageType(),
1978-
new LinkedList<>(),
1979-
new LinkedList<>(),
1977+
Collections.emptySet(),
1978+
Collections.emptySet(),
19801979
message.getSubscriptionId(),
19811980
message.getExpiresIn(),
19821981
System.currentTimeMillis(),
@@ -2110,16 +2109,16 @@ private MediaMmsMessageRecord getMediaMmsMessageRecord(Cursor cursor) {
21102109
}
21112110
}
21122111

2113-
Recipient recipient = Recipient.live(RecipientId.from(recipientId)).get();
2114-
List<IdentityKeyMismatch> mismatches = getMismatchedIdentities(mismatchDocument);
2115-
List<NetworkFailure> networkFailures = getFailures(networkDocument);
2116-
List<DatabaseAttachment> attachments = DatabaseFactory.getAttachmentDatabase(context).getAttachments(cursor);
2117-
List<Contact> contacts = getSharedContacts(cursor, attachments);
2118-
Set<Attachment> contactAttachments = Stream.of(contacts).map(Contact::getAvatarAttachment).withoutNulls().collect(Collectors.toSet());
2119-
List<LinkPreview> previews = getLinkPreviews(cursor, attachments);
2120-
Set<Attachment> previewAttachments = Stream.of(previews).filter(lp -> lp.getThumbnail().isPresent()).map(lp -> lp.getThumbnail().get()).collect(Collectors.toSet());
2121-
SlideDeck slideDeck = buildSlideDeck(context, Stream.of(attachments).filterNot(contactAttachments::contains).filterNot(previewAttachments::contains).toList());
2122-
Quote quote = getQuote(cursor);
2112+
Recipient recipient = Recipient.live(RecipientId.from(recipientId)).get();
2113+
Set<IdentityKeyMismatch> mismatches = getMismatchedIdentities(mismatchDocument);
2114+
Set<NetworkFailure> networkFailures = getFailures(networkDocument);
2115+
List<DatabaseAttachment> attachments = DatabaseFactory.getAttachmentDatabase(context).getAttachments(cursor);
2116+
List<Contact> contacts = getSharedContacts(cursor, attachments);
2117+
Set<Attachment> contactAttachments = Stream.of(contacts).map(Contact::getAvatarAttachment).withoutNulls().collect(Collectors.toSet());
2118+
List<LinkPreview> previews = getLinkPreviews(cursor, attachments);
2119+
Set<Attachment> previewAttachments = Stream.of(previews).filter(lp -> lp.getThumbnail().isPresent()).map(lp -> lp.getThumbnail().get()).collect(Collectors.toSet());
2120+
SlideDeck slideDeck = buildSlideDeck(context, Stream.of(attachments).filterNot(contactAttachments::contains).filterNot(previewAttachments::contains).toList());
2121+
Quote quote = getQuote(cursor);
21232122

21242123
return new MediaMmsMessageRecord(id, recipient, recipient,
21252124
addressDeviceId, dateSent, dateReceived, dateServer, deliveryReceiptCount,
@@ -2129,28 +2128,28 @@ private MediaMmsMessageRecord getMediaMmsMessageRecord(Cursor cursor) {
21292128
remoteDelete, mentionsSelf, notifiedTimestamp, viewedReceiptCount, receiptTimestamp);
21302129
}
21312130

2132-
private List<IdentityKeyMismatch> getMismatchedIdentities(String document) {
2131+
private Set<IdentityKeyMismatch> getMismatchedIdentities(String document) {
21332132
if (!TextUtils.isEmpty(document)) {
21342133
try {
2135-
return JsonUtils.fromJson(document, IdentityKeyMismatchList.class).getList();
2134+
return JsonUtils.fromJson(document, IdentityKeyMismatchSet.class).getItems();
21362135
} catch (IOException e) {
21372136
Log.w(TAG, e);
21382137
}
21392138
}
21402139

2141-
return new LinkedList<>();
2140+
return Collections.emptySet();
21422141
}
21432142

2144-
private List<NetworkFailure> getFailures(String document) {
2143+
private Set<NetworkFailure> getFailures(String document) {
21452144
if (!TextUtils.isEmpty(document)) {
21462145
try {
2147-
return JsonUtils.fromJson(document, NetworkFailureList.class).getList();
2146+
return JsonUtils.fromJson(document, NetworkFailureSet.class).getItems();
21482147
} catch (IOException ioe) {
21492148
Log.w(TAG, ioe);
21502149
}
21512150
}
21522151

2153-
return new LinkedList<>();
2152+
return Collections.emptySet();
21542153
}
21552154

21562155
public static SlideDeck buildSlideDeck(@NonNull Context context, @NonNull List<DatabaseAttachment> attachments) {

app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
import org.signal.core.util.logging.Log;
3535
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
36-
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchList;
36+
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchSet;
3737
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
3838
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
3939
import org.thoughtcrime.securesms.database.model.GroupCallUpdateDetailsUtil;
@@ -45,7 +45,6 @@
4545
import org.thoughtcrime.securesms.database.model.databaseprotos.ProfileChangeDetails;
4646
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
4747
import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange;
48-
import org.thoughtcrime.securesms.jobs.ThreadUpdateJob;
4948
import org.thoughtcrime.securesms.jobs.TrimThreadJob;
5049
import org.thoughtcrime.securesms.mms.IncomingMediaMessage;
5150
import org.thoughtcrime.securesms.mms.MmsException;
@@ -1548,7 +1547,7 @@ public void addFailures(long messageId, List<NetworkFailure> failure) {
15481547
}
15491548

15501549
@Override
1551-
public void removeFailure(long messageId, NetworkFailure failure) {
1550+
public void setNetworkFailures(long messageId, Set<NetworkFailure> failures) {
15521551
throw new UnsupportedOperationException();
15531552
}
15541553

@@ -1642,7 +1641,7 @@ public MessageRecord getCurrent() {
16421641
message.isSecureMessage() ? MmsSmsColumns.Types.getOutgoingEncryptedMessageType() : MmsSmsColumns.Types.getOutgoingSmsMessageType(),
16431642
threadId,
16441643
0,
1645-
new LinkedList<>(),
1644+
new HashSet<>(),
16461645
message.getSubscriptionId(),
16471646
message.getExpiresIn(),
16481647
System.currentTimeMillis(),
@@ -1704,8 +1703,8 @@ public SmsMessageRecord getCurrent() {
17041703
readReceiptCount = 0;
17051704
}
17061705

1707-
List<IdentityKeyMismatch> mismatches = getMismatches(mismatchDocument);
1708-
Recipient recipient = Recipient.live(RecipientId.from(recipientId)).get();
1706+
Set<IdentityKeyMismatch> mismatches = getMismatches(mismatchDocument);
1707+
Recipient recipient = Recipient.live(RecipientId.from(recipientId)).get();
17091708

17101709
return new SmsMessageRecord(messageId, body, recipient,
17111710
recipient,
@@ -1717,16 +1716,16 @@ public SmsMessageRecord getCurrent() {
17171716
notifiedTimestamp, receiptTimestamp);
17181717
}
17191718

1720-
private List<IdentityKeyMismatch> getMismatches(String document) {
1719+
private Set<IdentityKeyMismatch> getMismatches(String document) {
17211720
try {
17221721
if (!TextUtils.isEmpty(document)) {
1723-
return JsonUtils.fromJson(document, IdentityKeyMismatchList.class).getList();
1722+
return JsonUtils.fromJson(document, IdentityKeyMismatchSet.class).getItems();
17241723
}
17251724
} catch (IOException e) {
17261725
Log.w(TAG, e);
17271726
}
17281727

1729-
return new LinkedList<>();
1728+
return Collections.emptySet();
17301729
}
17311730

17321731
@Override
Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package org.thoughtcrime.securesms.database.documents;
22

3-
import java.util.List;
3+
import java.util.Set;
44

55
public interface Document<T> {
6-
7-
public int size();
8-
public List<T> getList();
9-
6+
int size();
7+
Set<T> getItems();
108
}

app/src/main/java/org/thoughtcrime/securesms/database/documents/IdentityKeyMismatchList.java renamed to app/src/main/java/org/thoughtcrime/securesms/database/documents/IdentityKeyMismatchSet.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,21 @@
33
import com.fasterxml.jackson.annotation.JsonIgnore;
44
import com.fasterxml.jackson.annotation.JsonProperty;
55

6+
import java.util.HashSet;
67
import java.util.LinkedList;
78
import java.util.List;
9+
import java.util.Set;
810

9-
public class IdentityKeyMismatchList implements Document<IdentityKeyMismatch> {
11+
public class IdentityKeyMismatchSet implements Document<IdentityKeyMismatch> {
1012

1113
@JsonProperty(value = "m")
12-
private List<IdentityKeyMismatch> mismatches;
14+
private Set<IdentityKeyMismatch> mismatches;
1315

14-
public IdentityKeyMismatchList() {
15-
this.mismatches = new LinkedList<>();
16+
public IdentityKeyMismatchSet() {
17+
this.mismatches = new HashSet<>();
1618
}
1719

18-
public IdentityKeyMismatchList(List<IdentityKeyMismatch> mismatches) {
20+
public IdentityKeyMismatchSet(Set<IdentityKeyMismatch> mismatches) {
1921
this.mismatches = mismatches;
2022
}
2123

@@ -27,7 +29,7 @@ public int size() {
2729

2830
@Override
2931
@JsonIgnore
30-
public List<IdentityKeyMismatch> getList() {
32+
public Set<IdentityKeyMismatch> getItems() {
3133
return mismatches;
3234
}
3335
}

app/src/main/java/org/thoughtcrime/securesms/database/documents/NetworkFailureList.java renamed to app/src/main/java/org/thoughtcrime/securesms/database/documents/NetworkFailureSet.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,21 @@
33
import com.fasterxml.jackson.annotation.JsonIgnore;
44
import com.fasterxml.jackson.annotation.JsonProperty;
55

6+
import java.util.HashSet;
67
import java.util.LinkedList;
78
import java.util.List;
9+
import java.util.Set;
810

9-
public class NetworkFailureList implements Document<NetworkFailure> {
11+
public class NetworkFailureSet implements Document<NetworkFailure> {
1012

1113
@JsonProperty(value = "l")
12-
private List<NetworkFailure> failures;
14+
private Set<NetworkFailure> failures;
1315

14-
public NetworkFailureList() {
15-
this.failures = new LinkedList<>();
16+
public NetworkFailureSet() {
17+
this.failures = new HashSet<>();
1618
}
1719

18-
public NetworkFailureList(List<NetworkFailure> failures) {
20+
public NetworkFailureSet(Set<NetworkFailure> failures) {
1921
this.failures = failures;
2022
}
2123

@@ -27,7 +29,7 @@ public int size() {
2729

2830
@Override
2931
@JsonIgnore
30-
public List<NetworkFailure> getList() {
32+
public Set<NetworkFailure> getItems() {
3133
return failures;
3234
}
3335
}

app/src/main/java/org/thoughtcrime/securesms/database/model/InMemoryMessageRecord.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ private InMemoryMessageRecord(long id,
4040
0,
4141
0,
4242
type,
43-
Collections.emptyList(),
44-
Collections.emptyList(),
43+
Collections.emptySet(),
44+
Collections.emptySet(),
4545
-1,
4646
0,
4747
System.currentTimeMillis(),

app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ public MediaMmsMessageRecord(long id,
7272
@NonNull SlideDeck slideDeck,
7373
int partCount,
7474
long mailbox,
75-
List<IdentityKeyMismatch> mismatches,
76-
List<NetworkFailure> failures,
75+
Set<IdentityKeyMismatch> mismatches,
76+
Set<NetworkFailure> failures,
7777
int subscriptionId,
7878
long expiresIn,
7979
long expireStarted,

0 commit comments

Comments
 (0)