mirror of
https://github.com/oxen-io/session-android.git
synced 2025-02-22 09:58:26 +00:00
manage duplicates outgoing messages
This commit is contained in:
parent
20b5da18fe
commit
fe47a6e958
@ -774,6 +774,11 @@ public class MmsDatabase extends MessagingDatabase {
|
|||||||
quoteAttachments.addAll(message.getOutgoingQuote().getAttachments());
|
quoteAttachments.addAll(message.getOutgoingQuote().getAttachments());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isDuplicate(message, threadId)) {
|
||||||
|
Log.w(TAG, "Ignoring duplicate media message (" + message.getSentTimeMillis() + ")");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
long messageId = insertMediaMessage(message.getBody(), message.getAttachments(), quoteAttachments, message.getSharedContacts(), message.getLinkPreviews(), contentValues, insertListener);
|
long messageId = insertMediaMessage(message.getBody(), message.getAttachments(), quoteAttachments, message.getSharedContacts(), message.getLinkPreviews(), contentValues, insertListener);
|
||||||
|
|
||||||
if (message.getRecipient().getAddress().isGroup()) {
|
if (message.getRecipient().getAddress().isGroup()) {
|
||||||
@ -945,6 +950,19 @@ public class MmsDatabase extends MessagingDatabase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isDuplicate(OutgoingMediaMessage message, long threadId) {
|
||||||
|
SQLiteDatabase database = databaseHelper.getReadableDatabase();
|
||||||
|
Cursor cursor = database.query(TABLE_NAME, null, DATE_SENT + " = ? AND " + ADDRESS + " = ? AND " + THREAD_ID + " = ?",
|
||||||
|
new String[]{String.valueOf(message.getSentTimeMillis()), message.getRecipient().getAddress().serialize(), String.valueOf(threadId)},
|
||||||
|
null, null, null, "1");
|
||||||
|
|
||||||
|
try {
|
||||||
|
return cursor != null && cursor.moveToFirst();
|
||||||
|
} finally {
|
||||||
|
if (cursor != null) cursor.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isSent(long messageId) {
|
public boolean isSent(long messageId) {
|
||||||
SQLiteDatabase database = databaseHelper.getReadableDatabase();
|
SQLiteDatabase database = databaseHelper.getReadableDatabase();
|
||||||
try (Cursor cursor = database.query(TABLE_NAME, new String[] { MESSAGE_BOX }, ID + " = ?", new String[] { String.valueOf(messageId)}, null, null, null)) {
|
try (Cursor cursor = database.query(TABLE_NAME, new String[] { MESSAGE_BOX }, ID + " = ?", new String[] { String.valueOf(messageId)}, null, null, null)) {
|
||||||
|
@ -456,7 +456,7 @@ public class SmsDatabase extends MessagingDatabase {
|
|||||||
contentValues.put(THREAD_ID, threadId);
|
contentValues.put(THREAD_ID, threadId);
|
||||||
contentValues.put(BODY, message.getMessageBody());
|
contentValues.put(BODY, message.getMessageBody());
|
||||||
contentValues.put(DATE_RECEIVED, System.currentTimeMillis());
|
contentValues.put(DATE_RECEIVED, System.currentTimeMillis());
|
||||||
contentValues.put(DATE_SENT, date);
|
contentValues.put(DATE_SENT, message.getSentTimestampMillis());
|
||||||
contentValues.put(READ, 1);
|
contentValues.put(READ, 1);
|
||||||
contentValues.put(TYPE, type);
|
contentValues.put(TYPE, type);
|
||||||
contentValues.put(SUBSCRIPTION_ID, message.getSubscriptionId());
|
contentValues.put(SUBSCRIPTION_ID, message.getSubscriptionId());
|
||||||
@ -464,6 +464,11 @@ public class SmsDatabase extends MessagingDatabase {
|
|||||||
contentValues.put(DELIVERY_RECEIPT_COUNT, Stream.of(earlyDeliveryReceipts.values()).mapToLong(Long::longValue).sum());
|
contentValues.put(DELIVERY_RECEIPT_COUNT, Stream.of(earlyDeliveryReceipts.values()).mapToLong(Long::longValue).sum());
|
||||||
contentValues.put(READ_RECEIPT_COUNT, Stream.of(earlyReadReceipts.values()).mapToLong(Long::longValue).sum());
|
contentValues.put(READ_RECEIPT_COUNT, Stream.of(earlyReadReceipts.values()).mapToLong(Long::longValue).sum());
|
||||||
|
|
||||||
|
if (isDuplicate(message, threadId)) {
|
||||||
|
Log.w(TAG, "Duplicate message (" + message.getSentTimestampMillis() + "), ignoring...");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
||||||
long messageId = db.insert(TABLE_NAME, ADDRESS, contentValues);
|
long messageId = db.insert(TABLE_NAME, ADDRESS, contentValues);
|
||||||
if (insertListener != null) {
|
if (insertListener != null) {
|
||||||
@ -530,6 +535,19 @@ public class SmsDatabase extends MessagingDatabase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isDuplicate(OutgoingTextMessage message, long threadId) {
|
||||||
|
SQLiteDatabase database = databaseHelper.getReadableDatabase();
|
||||||
|
Cursor cursor = database.query(TABLE_NAME, null, DATE_SENT + " = ? AND " + ADDRESS + " = ? AND " + THREAD_ID + " = ?",
|
||||||
|
new String[]{String.valueOf(message.getSentTimestampMillis()), message.getRecipient().getAddress().serialize(), String.valueOf(threadId)},
|
||||||
|
null, null, null, "1");
|
||||||
|
|
||||||
|
try {
|
||||||
|
return cursor != null && cursor.moveToFirst();
|
||||||
|
} finally {
|
||||||
|
if (cursor != null) cursor.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*package */void deleteThread(long threadId) {
|
/*package */void deleteThread(long threadId) {
|
||||||
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
||||||
db.delete(TABLE_NAME, THREAD_ID + " = ?", new String[] {threadId+""});
|
db.delete(TABLE_NAME, THREAD_ID + " = ?", new String[] {threadId+""});
|
||||||
|
@ -471,7 +471,7 @@ public class PushDecryptJob extends BaseJob implements InjectableType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
OutgoingTextMessage tm = new OutgoingTextMessage(Recipient.from(context, targetAddress, false),
|
OutgoingTextMessage tm = new OutgoingTextMessage(Recipient.from(context, targetAddress, false),
|
||||||
body, message.getExpiresInSeconds(), -1);
|
body, message.getExpiresInSeconds(), -1, message.getTimestamp());
|
||||||
|
|
||||||
// Ignore the message if it has no body
|
// Ignore the message if it has no body
|
||||||
if (tm.getMessageBody().length() == 0) { return; }
|
if (tm.getMessageBody().length() == 0) { return; }
|
||||||
|
@ -9,16 +9,18 @@ public class OutgoingTextMessage {
|
|||||||
private final String message;
|
private final String message;
|
||||||
private final int subscriptionId;
|
private final int subscriptionId;
|
||||||
private final long expiresIn;
|
private final long expiresIn;
|
||||||
|
private final long sentTimestampMillis;
|
||||||
|
|
||||||
public OutgoingTextMessage(Recipient recipient, String message, long expiresIn, int subscriptionId) {
|
public OutgoingTextMessage(Recipient recipient, String message, long expiresIn, int subscriptionId, long sentTimestampMillis) {
|
||||||
this.recipient = recipient;
|
this.recipient = recipient;
|
||||||
this.message = message;
|
this.message = message;
|
||||||
this.expiresIn = expiresIn;
|
this.expiresIn = expiresIn;
|
||||||
this.subscriptionId = subscriptionId;
|
this.subscriptionId = subscriptionId;
|
||||||
|
this.sentTimestampMillis = sentTimestampMillis;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static OutgoingTextMessage from(VisibleMessage message, Recipient recipient) {
|
public static OutgoingTextMessage from(VisibleMessage message, Recipient recipient) {
|
||||||
return new OutgoingTextMessage(recipient, message.getText(), recipient.getExpireMessages() * 1000, -1);
|
return new OutgoingTextMessage(recipient, message.getText(), recipient.getExpireMessages() * 1000, -1, message.getSentTimestamp());
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getExpiresIn() {
|
public long getExpiresIn() {
|
||||||
@ -37,6 +39,10 @@ public class OutgoingTextMessage {
|
|||||||
return recipient;
|
return recipient;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long getSentTimestampMillis() {
|
||||||
|
return sentTimestampMillis;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isSecureMessage() {
|
public boolean isSecureMessage() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user