diff --git a/src/org/thoughtcrime/securesms/database/MmsDatabase.java b/src/org/thoughtcrime/securesms/database/MmsDatabase.java index a43ebb6707..fbd1e52dfb 100644 --- a/src/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/src/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -1053,6 +1053,17 @@ public class MmsDatabase extends MessagingDatabase { } } + public boolean isSent(long messageId) { + SQLiteDatabase database = databaseHelper.getReadableDatabase(); + try (Cursor cursor = database.query(TABLE_NAME, new String[] { MESSAGE_BOX }, ID + " = ?", new String[] { String.valueOf(messageId)}, null, null, null)) { + if (cursor != null && cursor.moveToNext()) { + long type = cursor.getLong(cursor.getColumnIndexOrThrow(MESSAGE_BOX)); + return Types.isSentType(type); + } + } + return false; + } + /*package*/ void deleteThreads(Set threadIds) { SQLiteDatabase db = databaseHelper.getWritableDatabase(); String where = ""; diff --git a/src/org/thoughtcrime/securesms/database/MmsSmsColumns.java b/src/org/thoughtcrime/securesms/database/MmsSmsColumns.java index 81fe7f50fa..3872472a6d 100644 --- a/src/org/thoughtcrime/securesms/database/MmsSmsColumns.java +++ b/src/org/thoughtcrime/securesms/database/MmsSmsColumns.java @@ -117,6 +117,10 @@ public interface MmsSmsColumns { (type & BASE_TYPE_MASK) == BASE_SENDING_TYPE; } + public static boolean isSentType(long type) { + return (type & BASE_TYPE_MASK) == BASE_SENT_TYPE; + } + public static boolean isPendingSmsFallbackType(long type) { return (type & BASE_TYPE_MASK) == BASE_PENDING_INSECURE_SMS_FALLBACK || (type & BASE_TYPE_MASK) == BASE_PENDING_SECURE_SMS_FALLBACK; diff --git a/src/org/thoughtcrime/securesms/jobs/MmsSendJob.java b/src/org/thoughtcrime/securesms/jobs/MmsSendJob.java index 0c6d70b800..e4bd05b553 100644 --- a/src/org/thoughtcrime/securesms/jobs/MmsSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/MmsSendJob.java @@ -92,6 +92,11 @@ public class MmsSendJob extends SendJob { MmsDatabase database = DatabaseFactory.getMmsDatabase(context); OutgoingMediaMessage message = database.getOutgoingMessage(messageId); + if (database.isSent(messageId)) { + Log.w(TAG, "Message " + messageId + " was already sent. Ignoring."); + return; + } + try { Log.i(TAG, "Sending message: " + messageId); diff --git a/src/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java b/src/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java index 3d67237779..cc1df94b69 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java @@ -114,6 +114,11 @@ public class PushGroupSendJob extends PushSendJob implements InjectableType { List existingNetworkFailures = message.getNetworkFailures(); List existingIdentityMismatches = message.getIdentityKeyMismatches(); + if (database.isSent(messageId)) { + Log.w(TAG, "Message " + messageId + " was already sent. Ignoring."); + return; + } + try { Log.i(TAG, "Sending message: " + messageId); diff --git a/src/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java b/src/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java index d15e166734..a1bfe52a9b 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushMediaSendJob.java @@ -85,6 +85,11 @@ public class PushMediaSendJob extends PushSendJob implements InjectableType { MmsDatabase database = DatabaseFactory.getMmsDatabase(context); OutgoingMediaMessage message = database.getOutgoingMessage(messageId); + if (database.isSent(messageId)) { + Log.w(TAG, "Message " + messageId + " was already sent. Ignoring."); + return; + } + try { Log.i(TAG, "Sending message: " + messageId); diff --git a/src/org/thoughtcrime/securesms/jobs/PushTextSendJob.java b/src/org/thoughtcrime/securesms/jobs/PushTextSendJob.java index cbe3d5d06f..3845728ed8 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushTextSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushTextSendJob.java @@ -78,6 +78,11 @@ public class PushTextSendJob extends PushSendJob implements InjectableType { SmsDatabase database = DatabaseFactory.getSmsDatabase(context); SmsMessageRecord record = database.getMessage(messageId); + if (!record.isPending() && !record.isFailed()) { + Log.w(TAG, "Message " + messageId + " was already sent. Ignoring."); + return; + } + try { Log.i(TAG, "Sending message: " + messageId); diff --git a/src/org/thoughtcrime/securesms/jobs/SmsSendJob.java b/src/org/thoughtcrime/securesms/jobs/SmsSendJob.java index 7a5019ed8e..b2de812659 100644 --- a/src/org/thoughtcrime/securesms/jobs/SmsSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/SmsSendJob.java @@ -90,6 +90,11 @@ public class SmsSendJob extends SendJob { SmsDatabase database = DatabaseFactory.getSmsDatabase(context); SmsMessageRecord record = database.getMessage(messageId); + if (!record.isPending() && !record.isFailed()) { + Log.w(TAG, "Message " + messageId + " was already sent. Ignoring."); + return; + } + try { Log.i(TAG, "Sending message: " + messageId + " (attempt " + runAttempt + ")"); deliver(record);