kopia lustrzana https://github.com/ryukoposting/Signal-Android
Dedupe network and identity failures.
rodzic
e01381379c
commit
a385cb0b68
|
@ -17,7 +17,7 @@ import net.sqlcipher.database.SQLiteStatement;
|
||||||
import org.signal.core.util.logging.Log;
|
import org.signal.core.util.logging.Log;
|
||||||
import org.thoughtcrime.securesms.database.documents.Document;
|
import org.thoughtcrime.securesms.database.documents.Document;
|
||||||
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
|
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
|
||||||
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchList;
|
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchSet;
|
||||||
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
|
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
|
||||||
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
|
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
|
||||||
import org.thoughtcrime.securesms.database.model.MessageId;
|
import org.thoughtcrime.securesms.database.model.MessageId;
|
||||||
|
@ -138,7 +138,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
|
||||||
public abstract @NonNull List<MarkedMessageInfo> setIncomingMessagesViewed(@NonNull List<Long> messageIds);
|
public abstract @NonNull List<MarkedMessageInfo> setIncomingMessagesViewed(@NonNull List<Long> messageIds);
|
||||||
|
|
||||||
public abstract void addFailures(long messageId, List<NetworkFailure> failure);
|
public abstract void addFailures(long messageId, List<NetworkFailure> failure);
|
||||||
public abstract void removeFailure(long messageId, NetworkFailure failure);
|
public abstract void setNetworkFailures(long messageId, Set<NetworkFailure> failures);
|
||||||
|
|
||||||
public abstract @NonNull Pair<Long, Long> insertReceivedCall(@NonNull RecipientId address, boolean isVideoOffer);
|
public abstract @NonNull Pair<Long, Long> insertReceivedCall(@NonNull RecipientId address, boolean isVideoOffer);
|
||||||
public abstract @NonNull Pair<Long, Long> insertOutgoingCall(@NonNull RecipientId address, boolean isVideoOffer);
|
public abstract @NonNull Pair<Long, Long> insertOutgoingCall(@NonNull RecipientId address, boolean isVideoOffer);
|
||||||
|
@ -395,7 +395,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
|
||||||
try {
|
try {
|
||||||
addToDocument(messageId, MISMATCHED_IDENTITIES,
|
addToDocument(messageId, MISMATCHED_IDENTITIES,
|
||||||
new IdentityKeyMismatch(recipientId, identityKey),
|
new IdentityKeyMismatch(recipientId, identityKey),
|
||||||
IdentityKeyMismatchList.class);
|
IdentityKeyMismatchSet.class);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.w(TAG, e);
|
Log.w(TAG, e);
|
||||||
}
|
}
|
||||||
|
@ -405,7 +405,15 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
|
||||||
try {
|
try {
|
||||||
removeFromDocument(messageId, MISMATCHED_IDENTITIES,
|
removeFromDocument(messageId, MISMATCHED_IDENTITIES,
|
||||||
new IdentityKeyMismatch(recipientId, identityKey),
|
new IdentityKeyMismatch(recipientId, identityKey),
|
||||||
IdentityKeyMismatchList.class);
|
IdentityKeyMismatchSet.class);
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.w(TAG, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMismatchedIdentities(long messageId, @NonNull Set<IdentityKeyMismatch> mismatches) {
|
||||||
|
try {
|
||||||
|
setDocument(databaseHelper.getSignalWritableDatabase(), messageId, MISMATCHED_IDENTITIES, new IdentityKeyMismatchSet(mismatches));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.w(TAG, e);
|
Log.w(TAG, e);
|
||||||
}
|
}
|
||||||
|
@ -458,7 +466,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
|
||||||
|
|
||||||
try {
|
try {
|
||||||
D document = getDocument(database, messageId, column, clazz);
|
D document = getDocument(database, messageId, column, clazz);
|
||||||
Iterator<I> iterator = document.getList().iterator();
|
Iterator<I> iterator = document.getItems().iterator();
|
||||||
|
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
I item = iterator.next();
|
I item = iterator.next();
|
||||||
|
@ -490,7 +498,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
|
||||||
|
|
||||||
try {
|
try {
|
||||||
T document = getDocument(database, messageId, column, clazz);
|
T document = getDocument(database, messageId, column, clazz);
|
||||||
document.getList().addAll(objects);
|
document.getItems().addAll(objects);
|
||||||
setDocument(database, messageId, column, document);
|
setDocument(database, messageId, column, document);
|
||||||
|
|
||||||
database.setTransactionSuccessful();
|
database.setTransactionSuccessful();
|
||||||
|
@ -499,7 +507,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setDocument(SQLiteDatabase database, long messageId, String column, Document document) throws IOException {
|
protected void setDocument(SQLiteDatabase database, long messageId, String column, Document document) throws IOException {
|
||||||
ContentValues contentValues = new ContentValues();
|
ContentValues contentValues = new ContentValues();
|
||||||
|
|
||||||
if (document == null || document.size() == 0) {
|
if (document == null || document.size() == 0) {
|
||||||
|
|
|
@ -41,9 +41,9 @@ import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
|
||||||
import org.thoughtcrime.securesms.attachments.MmsNotificationAttachment;
|
import org.thoughtcrime.securesms.attachments.MmsNotificationAttachment;
|
||||||
import org.thoughtcrime.securesms.contactshare.Contact;
|
import org.thoughtcrime.securesms.contactshare.Contact;
|
||||||
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
|
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
|
||||||
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchList;
|
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchSet;
|
||||||
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
|
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
|
||||||
import org.thoughtcrime.securesms.database.documents.NetworkFailureList;
|
import org.thoughtcrime.securesms.database.documents.NetworkFailureSet;
|
||||||
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
|
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
|
||||||
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord;
|
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord;
|
||||||
import org.thoughtcrime.securesms.database.model.Mention;
|
import org.thoughtcrime.securesms.database.model.Mention;
|
||||||
|
@ -56,7 +56,6 @@ import org.thoughtcrime.securesms.database.model.SmsMessageRecord;
|
||||||
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList;
|
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList;
|
||||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||||
import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange;
|
import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange;
|
||||||
import org.thoughtcrime.securesms.jobs.ThreadUpdateJob;
|
|
||||||
import org.thoughtcrime.securesms.jobs.TrimThreadJob;
|
import org.thoughtcrime.securesms.jobs.TrimThreadJob;
|
||||||
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
|
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
|
||||||
import org.thoughtcrime.securesms.mms.IncomingMediaMessage;
|
import org.thoughtcrime.securesms.mms.IncomingMediaMessage;
|
||||||
|
@ -603,16 +602,16 @@ public class MmsDatabase extends MessageDatabase {
|
||||||
@Override
|
@Override
|
||||||
public void addFailures(long messageId, List<NetworkFailure> failure) {
|
public void addFailures(long messageId, List<NetworkFailure> failure) {
|
||||||
try {
|
try {
|
||||||
addToDocument(messageId, NETWORK_FAILURE, failure, NetworkFailureList.class);
|
addToDocument(messageId, NETWORK_FAILURE, failure, NetworkFailureSet.class);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.w(TAG, e);
|
Log.w(TAG, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void removeFailure(long messageId, NetworkFailure failure) {
|
public void setNetworkFailures(long messageId, Set<NetworkFailure> failures) {
|
||||||
try {
|
try {
|
||||||
removeFromDocument(messageId, NETWORK_FAILURE, failure, NetworkFailureList.class);
|
setDocument(databaseHelper.getSignalWritableDatabase(), messageId, NETWORK_FAILURE, new NetworkFailureSet(failures));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.w(TAG, e);
|
Log.w(TAG, e);
|
||||||
}
|
}
|
||||||
|
@ -1176,8 +1175,8 @@ public class MmsDatabase extends MessageDatabase {
|
||||||
.map(a -> (Attachment)a).toList();
|
.map(a -> (Attachment)a).toList();
|
||||||
|
|
||||||
Recipient recipient = Recipient.resolved(RecipientId.from(recipientId));
|
Recipient recipient = Recipient.resolved(RecipientId.from(recipientId));
|
||||||
List<NetworkFailure> networkFailures = new LinkedList<>();
|
Set<NetworkFailure> networkFailures = new HashSet<>();
|
||||||
List<IdentityKeyMismatch> mismatches = new LinkedList<>();
|
Set<IdentityKeyMismatch> mismatches = new HashSet<>();
|
||||||
QuoteModel quote = null;
|
QuoteModel quote = null;
|
||||||
|
|
||||||
if (quoteId > 0 && quoteAuthor > 0 && (!TextUtils.isEmpty(quoteText) || !quoteAttachments.isEmpty())) {
|
if (quoteId > 0 && quoteAuthor > 0 && (!TextUtils.isEmpty(quoteText) || !quoteAttachments.isEmpty())) {
|
||||||
|
@ -1186,7 +1185,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||||
|
|
||||||
if (!TextUtils.isEmpty(mismatchDocument)) {
|
if (!TextUtils.isEmpty(mismatchDocument)) {
|
||||||
try {
|
try {
|
||||||
mismatches = JsonUtils.fromJson(mismatchDocument, IdentityKeyMismatchList.class).getList();
|
mismatches = JsonUtils.fromJson(mismatchDocument, IdentityKeyMismatchSet.class).getItems();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.w(TAG, e);
|
Log.w(TAG, e);
|
||||||
}
|
}
|
||||||
|
@ -1194,7 +1193,7 @@ public class MmsDatabase extends MessageDatabase {
|
||||||
|
|
||||||
if (!TextUtils.isEmpty(networkDocument)) {
|
if (!TextUtils.isEmpty(networkDocument)) {
|
||||||
try {
|
try {
|
||||||
networkFailures = JsonUtils.fromJson(networkDocument, NetworkFailureList.class).getList();
|
networkFailures = JsonUtils.fromJson(networkDocument, NetworkFailureSet.class).getItems();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.w(TAG, e);
|
Log.w(TAG, e);
|
||||||
}
|
}
|
||||||
|
@ -1975,8 +1974,8 @@ public class MmsDatabase extends MessageDatabase {
|
||||||
slideDeck,
|
slideDeck,
|
||||||
slideDeck.getSlides().size(),
|
slideDeck.getSlides().size(),
|
||||||
message.isSecure() ? MmsSmsColumns.Types.getOutgoingEncryptedMessageType() : MmsSmsColumns.Types.getOutgoingSmsMessageType(),
|
message.isSecure() ? MmsSmsColumns.Types.getOutgoingEncryptedMessageType() : MmsSmsColumns.Types.getOutgoingSmsMessageType(),
|
||||||
new LinkedList<>(),
|
Collections.emptySet(),
|
||||||
new LinkedList<>(),
|
Collections.emptySet(),
|
||||||
message.getSubscriptionId(),
|
message.getSubscriptionId(),
|
||||||
message.getExpiresIn(),
|
message.getExpiresIn(),
|
||||||
System.currentTimeMillis(),
|
System.currentTimeMillis(),
|
||||||
|
@ -2111,8 +2110,8 @@ public class MmsDatabase extends MessageDatabase {
|
||||||
}
|
}
|
||||||
|
|
||||||
Recipient recipient = Recipient.live(RecipientId.from(recipientId)).get();
|
Recipient recipient = Recipient.live(RecipientId.from(recipientId)).get();
|
||||||
List<IdentityKeyMismatch> mismatches = getMismatchedIdentities(mismatchDocument);
|
Set<IdentityKeyMismatch> mismatches = getMismatchedIdentities(mismatchDocument);
|
||||||
List<NetworkFailure> networkFailures = getFailures(networkDocument);
|
Set<NetworkFailure> networkFailures = getFailures(networkDocument);
|
||||||
List<DatabaseAttachment> attachments = DatabaseFactory.getAttachmentDatabase(context).getAttachments(cursor);
|
List<DatabaseAttachment> attachments = DatabaseFactory.getAttachmentDatabase(context).getAttachments(cursor);
|
||||||
List<Contact> contacts = getSharedContacts(cursor, attachments);
|
List<Contact> contacts = getSharedContacts(cursor, attachments);
|
||||||
Set<Attachment> contactAttachments = Stream.of(contacts).map(Contact::getAvatarAttachment).withoutNulls().collect(Collectors.toSet());
|
Set<Attachment> contactAttachments = Stream.of(contacts).map(Contact::getAvatarAttachment).withoutNulls().collect(Collectors.toSet());
|
||||||
|
@ -2129,28 +2128,28 @@ public class MmsDatabase extends MessageDatabase {
|
||||||
remoteDelete, mentionsSelf, notifiedTimestamp, viewedReceiptCount, receiptTimestamp);
|
remoteDelete, mentionsSelf, notifiedTimestamp, viewedReceiptCount, receiptTimestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<IdentityKeyMismatch> getMismatchedIdentities(String document) {
|
private Set<IdentityKeyMismatch> getMismatchedIdentities(String document) {
|
||||||
if (!TextUtils.isEmpty(document)) {
|
if (!TextUtils.isEmpty(document)) {
|
||||||
try {
|
try {
|
||||||
return JsonUtils.fromJson(document, IdentityKeyMismatchList.class).getList();
|
return JsonUtils.fromJson(document, IdentityKeyMismatchSet.class).getItems();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.w(TAG, e);
|
Log.w(TAG, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new LinkedList<>();
|
return Collections.emptySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<NetworkFailure> getFailures(String document) {
|
private Set<NetworkFailure> getFailures(String document) {
|
||||||
if (!TextUtils.isEmpty(document)) {
|
if (!TextUtils.isEmpty(document)) {
|
||||||
try {
|
try {
|
||||||
return JsonUtils.fromJson(document, NetworkFailureList.class).getList();
|
return JsonUtils.fromJson(document, NetworkFailureSet.class).getItems();
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
Log.w(TAG, ioe);
|
Log.w(TAG, ioe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new LinkedList<>();
|
return Collections.emptySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SlideDeck buildSlideDeck(@NonNull Context context, @NonNull List<DatabaseAttachment> attachments) {
|
public static SlideDeck buildSlideDeck(@NonNull Context context, @NonNull List<DatabaseAttachment> attachments) {
|
||||||
|
|
|
@ -33,7 +33,7 @@ import net.sqlcipher.database.SQLiteStatement;
|
||||||
|
|
||||||
import org.signal.core.util.logging.Log;
|
import org.signal.core.util.logging.Log;
|
||||||
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
|
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
|
||||||
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchList;
|
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchSet;
|
||||||
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
|
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
|
||||||
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
|
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
|
||||||
import org.thoughtcrime.securesms.database.model.GroupCallUpdateDetailsUtil;
|
import org.thoughtcrime.securesms.database.model.GroupCallUpdateDetailsUtil;
|
||||||
|
@ -45,7 +45,6 @@ import org.thoughtcrime.securesms.database.model.databaseprotos.GroupCallUpdateD
|
||||||
import org.thoughtcrime.securesms.database.model.databaseprotos.ProfileChangeDetails;
|
import org.thoughtcrime.securesms.database.model.databaseprotos.ProfileChangeDetails;
|
||||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||||
import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange;
|
import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange;
|
||||||
import org.thoughtcrime.securesms.jobs.ThreadUpdateJob;
|
|
||||||
import org.thoughtcrime.securesms.jobs.TrimThreadJob;
|
import org.thoughtcrime.securesms.jobs.TrimThreadJob;
|
||||||
import org.thoughtcrime.securesms.mms.IncomingMediaMessage;
|
import org.thoughtcrime.securesms.mms.IncomingMediaMessage;
|
||||||
import org.thoughtcrime.securesms.mms.MmsException;
|
import org.thoughtcrime.securesms.mms.MmsException;
|
||||||
|
@ -1548,7 +1547,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void removeFailure(long messageId, NetworkFailure failure) {
|
public void setNetworkFailures(long messageId, Set<NetworkFailure> failures) {
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1642,7 +1641,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||||
message.isSecureMessage() ? MmsSmsColumns.Types.getOutgoingEncryptedMessageType() : MmsSmsColumns.Types.getOutgoingSmsMessageType(),
|
message.isSecureMessage() ? MmsSmsColumns.Types.getOutgoingEncryptedMessageType() : MmsSmsColumns.Types.getOutgoingSmsMessageType(),
|
||||||
threadId,
|
threadId,
|
||||||
0,
|
0,
|
||||||
new LinkedList<>(),
|
new HashSet<>(),
|
||||||
message.getSubscriptionId(),
|
message.getSubscriptionId(),
|
||||||
message.getExpiresIn(),
|
message.getExpiresIn(),
|
||||||
System.currentTimeMillis(),
|
System.currentTimeMillis(),
|
||||||
|
@ -1704,7 +1703,7 @@ public class SmsDatabase extends MessageDatabase {
|
||||||
readReceiptCount = 0;
|
readReceiptCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<IdentityKeyMismatch> mismatches = getMismatches(mismatchDocument);
|
Set<IdentityKeyMismatch> mismatches = getMismatches(mismatchDocument);
|
||||||
Recipient recipient = Recipient.live(RecipientId.from(recipientId)).get();
|
Recipient recipient = Recipient.live(RecipientId.from(recipientId)).get();
|
||||||
|
|
||||||
return new SmsMessageRecord(messageId, body, recipient,
|
return new SmsMessageRecord(messageId, body, recipient,
|
||||||
|
@ -1717,16 +1716,16 @@ public class SmsDatabase extends MessageDatabase {
|
||||||
notifiedTimestamp, receiptTimestamp);
|
notifiedTimestamp, receiptTimestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<IdentityKeyMismatch> getMismatches(String document) {
|
private Set<IdentityKeyMismatch> getMismatches(String document) {
|
||||||
try {
|
try {
|
||||||
if (!TextUtils.isEmpty(document)) {
|
if (!TextUtils.isEmpty(document)) {
|
||||||
return JsonUtils.fromJson(document, IdentityKeyMismatchList.class).getList();
|
return JsonUtils.fromJson(document, IdentityKeyMismatchSet.class).getItems();
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.w(TAG, e);
|
Log.w(TAG, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new LinkedList<>();
|
return Collections.emptySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
package org.thoughtcrime.securesms.database.documents;
|
package org.thoughtcrime.securesms.database.documents;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.Set;
|
||||||
|
|
||||||
public interface Document<T> {
|
public interface Document<T> {
|
||||||
|
int size();
|
||||||
public int size();
|
Set<T> getItems();
|
||||||
public List<T> getList();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,19 +3,21 @@ package org.thoughtcrime.securesms.database.documents;
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class IdentityKeyMismatchList implements Document<IdentityKeyMismatch> {
|
public class IdentityKeyMismatchSet implements Document<IdentityKeyMismatch> {
|
||||||
|
|
||||||
@JsonProperty(value = "m")
|
@JsonProperty(value = "m")
|
||||||
private List<IdentityKeyMismatch> mismatches;
|
private Set<IdentityKeyMismatch> mismatches;
|
||||||
|
|
||||||
public IdentityKeyMismatchList() {
|
public IdentityKeyMismatchSet() {
|
||||||
this.mismatches = new LinkedList<>();
|
this.mismatches = new HashSet<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public IdentityKeyMismatchList(List<IdentityKeyMismatch> mismatches) {
|
public IdentityKeyMismatchSet(Set<IdentityKeyMismatch> mismatches) {
|
||||||
this.mismatches = mismatches;
|
this.mismatches = mismatches;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,7 +29,7 @@ public class IdentityKeyMismatchList implements Document<IdentityKeyMismatch> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
public List<IdentityKeyMismatch> getList() {
|
public Set<IdentityKeyMismatch> getItems() {
|
||||||
return mismatches;
|
return mismatches;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -3,19 +3,21 @@ package org.thoughtcrime.securesms.database.documents;
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class NetworkFailureList implements Document<NetworkFailure> {
|
public class NetworkFailureSet implements Document<NetworkFailure> {
|
||||||
|
|
||||||
@JsonProperty(value = "l")
|
@JsonProperty(value = "l")
|
||||||
private List<NetworkFailure> failures;
|
private Set<NetworkFailure> failures;
|
||||||
|
|
||||||
public NetworkFailureList() {
|
public NetworkFailureSet() {
|
||||||
this.failures = new LinkedList<>();
|
this.failures = new HashSet<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public NetworkFailureList(List<NetworkFailure> failures) {
|
public NetworkFailureSet(Set<NetworkFailure> failures) {
|
||||||
this.failures = failures;
|
this.failures = failures;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,7 +29,7 @@ public class NetworkFailureList implements Document<NetworkFailure> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
public List<NetworkFailure> getList() {
|
public Set<NetworkFailure> getItems() {
|
||||||
return failures;
|
return failures;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -40,8 +40,8 @@ public class InMemoryMessageRecord extends MessageRecord {
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
type,
|
type,
|
||||||
Collections.emptyList(),
|
Collections.emptySet(),
|
||||||
Collections.emptyList(),
|
Collections.emptySet(),
|
||||||
-1,
|
-1,
|
||||||
0,
|
0,
|
||||||
System.currentTimeMillis(),
|
System.currentTimeMillis(),
|
||||||
|
|
|
@ -72,8 +72,8 @@ public class MediaMmsMessageRecord extends MmsMessageRecord {
|
||||||
@NonNull SlideDeck slideDeck,
|
@NonNull SlideDeck slideDeck,
|
||||||
int partCount,
|
int partCount,
|
||||||
long mailbox,
|
long mailbox,
|
||||||
List<IdentityKeyMismatch> mismatches,
|
Set<IdentityKeyMismatch> mismatches,
|
||||||
List<NetworkFailure> failures,
|
Set<NetworkFailure> failures,
|
||||||
int subscriptionId,
|
int subscriptionId,
|
||||||
long expiresIn,
|
long expiresIn,
|
||||||
long expireStarted,
|
long expireStarted,
|
||||||
|
|
|
@ -61,6 +61,7 @@ import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -78,8 +79,8 @@ public abstract class MessageRecord extends DisplayRecord {
|
||||||
private final Recipient individualRecipient;
|
private final Recipient individualRecipient;
|
||||||
private final int recipientDeviceId;
|
private final int recipientDeviceId;
|
||||||
private final long id;
|
private final long id;
|
||||||
private final List<IdentityKeyMismatch> mismatches;
|
private final Set<IdentityKeyMismatch> mismatches;
|
||||||
private final List<NetworkFailure> networkFailures;
|
private final Set<NetworkFailure> networkFailures;
|
||||||
private final int subscriptionId;
|
private final int subscriptionId;
|
||||||
private final long expiresIn;
|
private final long expiresIn;
|
||||||
private final long expireStarted;
|
private final long expireStarted;
|
||||||
|
@ -94,8 +95,8 @@ public abstract class MessageRecord extends DisplayRecord {
|
||||||
Recipient individualRecipient, int recipientDeviceId,
|
Recipient individualRecipient, int recipientDeviceId,
|
||||||
long dateSent, long dateReceived, long dateServer, long threadId,
|
long dateSent, long dateReceived, long dateServer, long threadId,
|
||||||
int deliveryStatus, int deliveryReceiptCount, long type,
|
int deliveryStatus, int deliveryReceiptCount, long type,
|
||||||
List<IdentityKeyMismatch> mismatches,
|
Set<IdentityKeyMismatch> mismatches,
|
||||||
List<NetworkFailure> networkFailures,
|
Set<NetworkFailure> networkFailures,
|
||||||
int subscriptionId, long expiresIn, long expireStarted,
|
int subscriptionId, long expiresIn, long expireStarted,
|
||||||
int readReceiptCount, boolean unidentified,
|
int readReceiptCount, boolean unidentified,
|
||||||
@NonNull List<ReactionRecord> reactions, boolean remoteDelete, long notifiedTimestamp,
|
@NonNull List<ReactionRecord> reactions, boolean remoteDelete, long notifiedTimestamp,
|
||||||
|
@ -512,11 +513,11 @@ public abstract class MessageRecord extends DisplayRecord {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<IdentityKeyMismatch> getIdentityKeyMismatches() {
|
public Set<IdentityKeyMismatch> getIdentityKeyMismatches() {
|
||||||
return mismatches;
|
return mismatches;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<NetworkFailure> getNetworkFailures() {
|
public Set<NetworkFailure> getNetworkFailures() {
|
||||||
return networkFailures;
|
return networkFailures;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public abstract class MmsMessageRecord extends MessageRecord {
|
public abstract class MmsMessageRecord extends MessageRecord {
|
||||||
|
|
||||||
|
@ -27,8 +28,8 @@ public abstract class MmsMessageRecord extends MessageRecord {
|
||||||
MmsMessageRecord(long id, String body, Recipient conversationRecipient,
|
MmsMessageRecord(long id, String body, Recipient conversationRecipient,
|
||||||
Recipient individualRecipient, int recipientDeviceId, long dateSent,
|
Recipient individualRecipient, int recipientDeviceId, long dateSent,
|
||||||
long dateReceived, long dateServer, long threadId, int deliveryStatus, int deliveryReceiptCount,
|
long dateReceived, long dateServer, long threadId, int deliveryStatus, int deliveryReceiptCount,
|
||||||
long type, List<IdentityKeyMismatch> mismatches,
|
long type, Set<IdentityKeyMismatch> mismatches,
|
||||||
List<NetworkFailure> networkFailures, int subscriptionId, long expiresIn,
|
Set<NetworkFailure> networkFailures, int subscriptionId, long expiresIn,
|
||||||
long expireStarted, boolean viewOnce,
|
long expireStarted, boolean viewOnce,
|
||||||
@NonNull SlideDeck slideDeck, int readReceiptCount,
|
@NonNull SlideDeck slideDeck, int readReceiptCount,
|
||||||
@Nullable Quote quote, @NonNull List<Contact> contacts,
|
@Nullable Quote quote, @NonNull List<Contact> contacts,
|
||||||
|
|
|
@ -28,6 +28,7 @@ import org.thoughtcrime.securesms.mms.SlideDeck;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -56,7 +57,7 @@ public class NotificationMmsMessageRecord extends MmsMessageRecord {
|
||||||
{
|
{
|
||||||
super(id, "", conversationRecipient, individualRecipient, recipientDeviceId,
|
super(id, "", conversationRecipient, individualRecipient, recipientDeviceId,
|
||||||
dateSent, dateReceived, -1, threadId, Status.STATUS_NONE, deliveryReceiptCount, mailbox,
|
dateSent, dateReceived, -1, threadId, Status.STATUS_NONE, deliveryReceiptCount, mailbox,
|
||||||
new LinkedList<>(), new LinkedList<>(), subscriptionId,
|
new HashSet<>(), new HashSet<>(), subscriptionId,
|
||||||
0, 0, false, slideDeck, readReceiptCount, null, Collections.emptyList(), Collections.emptyList(), false,
|
0, 0, false, slideDeck, readReceiptCount, null, Collections.emptyList(), Collections.emptyList(), false,
|
||||||
Collections.emptyList(), false, 0, viewedReceiptCount, receiptTimestamp);
|
Collections.emptyList(), false, 0, viewedReceiptCount, receiptTimestamp);
|
||||||
|
|
||||||
|
|
|
@ -29,8 +29,10 @@ import org.thoughtcrime.securesms.database.SmsDatabase;
|
||||||
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
|
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The message record model which represents standard SMS messages.
|
* The message record model which represents standard SMS messages.
|
||||||
|
@ -48,7 +50,7 @@ public class SmsMessageRecord extends MessageRecord {
|
||||||
long dateSent, long dateReceived, long dateServer,
|
long dateSent, long dateReceived, long dateServer,
|
||||||
int deliveryReceiptCount,
|
int deliveryReceiptCount,
|
||||||
long type, long threadId,
|
long type, long threadId,
|
||||||
int status, List<IdentityKeyMismatch> mismatches,
|
int status, Set<IdentityKeyMismatch> mismatches,
|
||||||
int subscriptionId, long expiresIn, long expireStarted,
|
int subscriptionId, long expiresIn, long expireStarted,
|
||||||
int readReceiptCount, boolean unidentified,
|
int readReceiptCount, boolean unidentified,
|
||||||
@NonNull List<ReactionRecord> reactions, boolean remoteDelete,
|
@NonNull List<ReactionRecord> reactions, boolean remoteDelete,
|
||||||
|
@ -56,7 +58,7 @@ public class SmsMessageRecord extends MessageRecord {
|
||||||
{
|
{
|
||||||
super(id, body, recipient, individualRecipient, recipientDeviceId,
|
super(id, body, recipient, individualRecipient, recipientDeviceId,
|
||||||
dateSent, dateReceived, dateServer, threadId, status, deliveryReceiptCount, type,
|
dateSent, dateReceived, dateServer, threadId, status, deliveryReceiptCount, type,
|
||||||
mismatches, new LinkedList<>(), subscriptionId,
|
mismatches, new HashSet<>(), subscriptionId,
|
||||||
expiresIn, expireStarted, readReceiptCount, unidentified, reactions, remoteDelete, notifiedTimestamp, 0, receiptTimestamp);
|
expiresIn, expireStarted, readReceiptCount, unidentified, reactions, remoteDelete, notifiedTimestamp, 0, receiptTimestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -153,8 +153,8 @@ public final class PushGroupSendJob extends PushSendJob {
|
||||||
MessageDatabase database = DatabaseFactory.getMmsDatabase(context);
|
MessageDatabase database = DatabaseFactory.getMmsDatabase(context);
|
||||||
OutgoingMediaMessage message = database.getOutgoingMessage(messageId);
|
OutgoingMediaMessage message = database.getOutgoingMessage(messageId);
|
||||||
long threadId = database.getMessageRecord(messageId).getThreadId();
|
long threadId = database.getMessageRecord(messageId).getThreadId();
|
||||||
List<NetworkFailure> existingNetworkFailures = message.getNetworkFailures();
|
Set<NetworkFailure> existingNetworkFailures = message.getNetworkFailures();
|
||||||
List<IdentityKeyMismatch> existingIdentityMismatches = message.getIdentityKeyMismatches();
|
Set<IdentityKeyMismatch> existingIdentityMismatches = message.getIdentityKeyMismatches();
|
||||||
|
|
||||||
ApplicationDependencies.getJobManager().cancelAllInQueue(TypingSendJob.getQueue(threadId));
|
ApplicationDependencies.getJobManager().cancelAllInQueue(TypingSendJob.getQueue(threadId));
|
||||||
|
|
||||||
|
@ -183,8 +183,8 @@ public final class PushGroupSendJob extends PushSendJob {
|
||||||
List<Recipient> target;
|
List<Recipient> target;
|
||||||
|
|
||||||
if (filterRecipient != null) target = Collections.singletonList(Recipient.resolved(filterRecipient));
|
if (filterRecipient != null) target = Collections.singletonList(Recipient.resolved(filterRecipient));
|
||||||
else if (!existingNetworkFailures.isEmpty()) target = Stream.of(existingNetworkFailures).map(nf -> Recipient.resolved(nf.getRecipientId(context))).toList();
|
else if (!existingNetworkFailures.isEmpty()) target = Stream.of(existingNetworkFailures).map(nf -> nf.getRecipientId(context)).distinct().map(Recipient::resolved).toList();
|
||||||
else target = getGroupMessageRecipients(groupRecipient.requireGroupId(), messageId);
|
else target = Stream.of(getGroupMessageRecipients(groupRecipient.requireGroupId(), messageId)).distinctBy(Recipient::getId).toList();
|
||||||
|
|
||||||
RecipientAccessList accessList = new RecipientAccessList(target);
|
RecipientAccessList accessList = new RecipientAccessList(target);
|
||||||
|
|
||||||
|
@ -206,23 +206,11 @@ public final class PushGroupSendJob extends PushSendJob {
|
||||||
recipientDatabase.markUnregistered(unregistered.getId());
|
recipientDatabase.markUnregistered(unregistered.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (NetworkFailure resolvedFailure : resolvedNetworkFailures) {
|
existingNetworkFailures.removeAll(resolvedNetworkFailures);
|
||||||
database.removeFailure(messageId, resolvedFailure);
|
database.setNetworkFailures(messageId, existingNetworkFailures);
|
||||||
existingNetworkFailures.remove(resolvedFailure);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (IdentityKeyMismatch resolvedIdentity : resolvedIdentityFailures) {
|
existingIdentityMismatches.removeAll(resolvedIdentityFailures);
|
||||||
database.removeMismatchedIdentity(messageId, resolvedIdentity.getRecipientId(context), resolvedIdentity.getIdentityKey());
|
database.setMismatchedIdentities(messageId, existingIdentityMismatches);
|
||||||
existingIdentityMismatches.remove(resolvedIdentity);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!networkFailures.isEmpty()) {
|
|
||||||
database.addFailures(messageId, networkFailures);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (IdentityKeyMismatch mismatch : identityMismatches) {
|
|
||||||
database.addMismatchedIdentity(messageId, mismatch.getRecipientId(context), mismatch.getIdentityKey());
|
|
||||||
}
|
|
||||||
|
|
||||||
DatabaseFactory.getGroupReceiptDatabase(context).setUnidentified(successUnidentifiedStatus, messageId);
|
DatabaseFactory.getGroupReceiptDatabase(context).setUnidentified(successUnidentifiedStatus, messageId);
|
||||||
|
|
||||||
|
|
|
@ -201,7 +201,7 @@ class MediaSelectionRepository(context: Context) {
|
||||||
isViewOnce,
|
isViewOnce,
|
||||||
ThreadDatabase.DistributionTypes.DEFAULT,
|
ThreadDatabase.DistributionTypes.DEFAULT,
|
||||||
null, emptyList(), emptyList(),
|
null, emptyList(), emptyList(),
|
||||||
mentions, emptyList(), emptyList()
|
mentions, mutableSetOf(), mutableSetOf()
|
||||||
)
|
)
|
||||||
messages.add(OutgoingSecureMediaMessage(message))
|
messages.add(OutgoingSecureMediaMessage(message))
|
||||||
|
|
||||||
|
|
|
@ -1359,7 +1359,7 @@ public final class MessageContentProcessor {
|
||||||
sharedContacts.or(Collections.emptyList()),
|
sharedContacts.or(Collections.emptyList()),
|
||||||
previews.or(Collections.emptyList()),
|
previews.or(Collections.emptyList()),
|
||||||
mentions.or(Collections.emptyList()),
|
mentions.or(Collections.emptyList()),
|
||||||
Collections.emptyList(), Collections.emptyList());
|
Collections.emptySet(), Collections.emptySet());
|
||||||
|
|
||||||
mediaMessage = new OutgoingSecureMediaMessage(mediaMessage);
|
mediaMessage = new OutgoingSecureMediaMessage(mediaMessage);
|
||||||
|
|
||||||
|
|
|
@ -13,8 +13,10 @@ import org.thoughtcrime.securesms.database.model.Mention;
|
||||||
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
|
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class OutgoingMediaMessage {
|
public class OutgoingMediaMessage {
|
||||||
|
|
||||||
|
@ -28,8 +30,8 @@ public class OutgoingMediaMessage {
|
||||||
private final boolean viewOnce;
|
private final boolean viewOnce;
|
||||||
private final QuoteModel outgoingQuote;
|
private final QuoteModel outgoingQuote;
|
||||||
|
|
||||||
private final List<NetworkFailure> networkFailures = new LinkedList<>();
|
private final Set<NetworkFailure> networkFailures = new HashSet<>();
|
||||||
private final List<IdentityKeyMismatch> identityKeyMismatches = new LinkedList<>();
|
private final Set<IdentityKeyMismatch> identityKeyMismatches = new HashSet<>();
|
||||||
private final List<Contact> contacts = new LinkedList<>();
|
private final List<Contact> contacts = new LinkedList<>();
|
||||||
private final List<LinkPreview> linkPreviews = new LinkedList<>();
|
private final List<LinkPreview> linkPreviews = new LinkedList<>();
|
||||||
private final List<Mention> mentions = new LinkedList<>();
|
private final List<Mention> mentions = new LinkedList<>();
|
||||||
|
@ -42,8 +44,8 @@ public class OutgoingMediaMessage {
|
||||||
@NonNull List<Contact> contacts,
|
@NonNull List<Contact> contacts,
|
||||||
@NonNull List<LinkPreview> linkPreviews,
|
@NonNull List<LinkPreview> linkPreviews,
|
||||||
@NonNull List<Mention> mentions,
|
@NonNull List<Mention> mentions,
|
||||||
@NonNull List<NetworkFailure> networkFailures,
|
@NonNull Set<NetworkFailure> networkFailures,
|
||||||
@NonNull List<IdentityKeyMismatch> identityKeyMismatches)
|
@NonNull Set<IdentityKeyMismatch> identityKeyMismatches)
|
||||||
{
|
{
|
||||||
this.recipient = recipient;
|
this.recipient = recipient;
|
||||||
this.body = message;
|
this.body = message;
|
||||||
|
@ -75,7 +77,7 @@ public class OutgoingMediaMessage {
|
||||||
slideDeck.asAttachments(),
|
slideDeck.asAttachments(),
|
||||||
sentTimeMillis, subscriptionId,
|
sentTimeMillis, subscriptionId,
|
||||||
expiresIn, viewOnce, distributionType, outgoingQuote,
|
expiresIn, viewOnce, distributionType, outgoingQuote,
|
||||||
contacts, linkPreviews, mentions, new LinkedList<>(), new LinkedList<>());
|
contacts, linkPreviews, mentions, new HashSet<>(), new HashSet<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
public OutgoingMediaMessage(OutgoingMediaMessage that) {
|
public OutgoingMediaMessage(OutgoingMediaMessage that) {
|
||||||
|
@ -175,11 +177,11 @@ public class OutgoingMediaMessage {
|
||||||
return mentions;
|
return mentions;
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NonNull List<NetworkFailure> getNetworkFailures() {
|
public @NonNull Set<NetworkFailure> getNetworkFailures() {
|
||||||
return networkFailures;
|
return networkFailures;
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NonNull List<IdentityKeyMismatch> getIdentityKeyMismatches() {
|
public @NonNull Set<IdentityKeyMismatch> getIdentityKeyMismatches() {
|
||||||
return identityKeyMismatches;
|
return identityKeyMismatches;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ public class OutgoingSecureMediaMessage extends OutgoingMediaMessage {
|
||||||
@NonNull List<LinkPreview> previews,
|
@NonNull List<LinkPreview> previews,
|
||||||
@NonNull List<Mention> mentions)
|
@NonNull List<Mention> mentions)
|
||||||
{
|
{
|
||||||
super(recipient, body, attachments, sentTimeMillis, -1, expiresIn, viewOnce, distributionType, quote, contacts, previews, mentions, Collections.emptyList(), Collections.emptyList());
|
super(recipient, body, attachments, sentTimeMillis, -1, expiresIn, viewOnce, distributionType, quote, contacts, previews, mentions, Collections.emptySet(), Collections.emptySet());
|
||||||
}
|
}
|
||||||
|
|
||||||
public OutgoingSecureMediaMessage(OutgoingMediaMessage base) {
|
public OutgoingSecureMediaMessage(OutgoingMediaMessage base) {
|
||||||
|
|
|
@ -90,8 +90,8 @@ public class RemoteReplyReceiver extends BroadcastReceiver {
|
||||||
Collections.emptyList(),
|
Collections.emptyList(),
|
||||||
Collections.emptyList(),
|
Collections.emptyList(),
|
||||||
Collections.emptyList(),
|
Collections.emptyList(),
|
||||||
Collections.emptyList(),
|
Collections.emptySet(),
|
||||||
Collections.emptyList());
|
Collections.emptySet());
|
||||||
threadId = MessageSender.send(context, reply, -1, false, null, null);
|
threadId = MessageSender.send(context, reply, -1, false, null, null);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,8 +38,8 @@ object TestMms {
|
||||||
emptyList(),
|
emptyList(),
|
||||||
emptyList(),
|
emptyList(),
|
||||||
emptyList(),
|
emptyList(),
|
||||||
emptyList(),
|
emptySet(),
|
||||||
emptyList()
|
emptySet()
|
||||||
)
|
)
|
||||||
|
|
||||||
return insertMmsMessage(
|
return insertMmsMessage(
|
||||||
|
|
Ładowanie…
Reference in New Issue