From 0ca438ed255143aa2eec2c3bcd0daa0c3aca030a Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 16 Mar 2022 17:32:22 -0400 Subject: [PATCH] Update MSL appending to create a new entry if the original one is gone. --- .../securesms/database/MessageSendLogDatabase.kt | 16 ++++++++++++++-- .../securesms/messages/GroupSendUtil.java | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageSendLogDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MessageSendLogDatabase.kt index 37a492e4e7..417128e9ec 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageSendLogDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageSendLogDatabase.kt @@ -2,6 +2,8 @@ package org.thoughtcrime.securesms.database import android.content.ContentValues import android.content.Context +import net.zetetic.database.sqlcipher.SQLiteConstraintException +import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.database.model.MessageId import org.thoughtcrime.securesms.database.model.MessageLogEntry import org.thoughtcrime.securesms.recipients.Recipient @@ -46,6 +48,8 @@ import org.whispersystems.signalservice.internal.push.SignalServiceProtos class MessageSendLogDatabase constructor(context: Context?, databaseHelper: SignalDatabase?) : Database(context, databaseHelper) { companion object { + private val TAG = Log.tag(MessageSendLogDatabase::class.java) + @JvmField val CREATE_TABLE: Array = arrayOf(PayloadTable.CREATE_TABLE, RecipientTable.CREATE_TABLE, MessageTable.CREATE_TABLE) @@ -193,8 +197,8 @@ class MessageSendLogDatabase constructor(context: Context?, databaseHelper: Sign return insert(recipientDevices, sentTimestamp, content, contentHint, listOf(messageId)) } - fun addRecipientToExistingEntryIfPossible(payloadId: Long, recipientId: RecipientId, sendMessageResult: SendMessageResult) { - if (!FeatureFlags.retryReceipts()) return + fun addRecipientToExistingEntryIfPossible(payloadId: Long, recipientId: RecipientId, sentTimestamp: Long, sendMessageResult: SendMessageResult, contentHint: ContentHint, messageId: MessageId): Long { + if (!FeatureFlags.retryReceipts()) return payloadId if (sendMessageResult.isSuccess && sendMessageResult.success.content.isPresent) { val db = databaseHelper.signalWritableDatabase @@ -210,11 +214,19 @@ class MessageSendLogDatabase constructor(context: Context?, databaseHelper: Sign db.insert(RecipientTable.TABLE_NAME, null, recipientValues) } + db.setTransactionSuccessful() + } catch (e: SQLiteConstraintException) { + Log.w(TAG, "Failed to append to existing entry. Creating a new one.") + val payloadId = insertIfPossible(recipientId, sentTimestamp, sendMessageResult, contentHint, messageId) + db.setTransactionSuccessful() + return payloadId } finally { db.endTransaction() } } + + return payloadId } private fun insert(recipients: List, dateSent: Long, content: SignalServiceProtos.Content, contentHint: ContentHint, messageIds: List): Long { diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java b/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java index 27c2403a87..9b9a0a7213 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java @@ -351,7 +351,7 @@ public final class GroupSendUtil { if (entryId.get() == -1) { entryId.set(messageLogDatabase.insertIfPossible(recipients.requireRecipientId(result.getAddress()), sendOperation.getSentTimestamp(), result, sendOperation.getContentHint(), sendOperation.getRelatedMessageId())); } else { - messageLogDatabase.addRecipientToExistingEntryIfPossible(entryId.get(), recipients.requireRecipientId(result.getAddress()), result); + entryId.set(messageLogDatabase.addRecipientToExistingEntryIfPossible(entryId.get(), recipients.requireRecipientId(result.getAddress()), sendOperation.getSentTimestamp(), result, sendOperation.getContentHint(), sendOperation.getRelatedMessageId())); } } }, cancelationSignal);