diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java index 0f06428538..cd5940ee06 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -106,7 +106,6 @@ import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.attachments.TombstoneAttachment; import org.thoughtcrime.securesms.audio.AudioRecorder; import org.thoughtcrime.securesms.audio.BluetoothVoiceNoteUtil; -import org.thoughtcrime.securesms.audio.BluetoothVoiceNoteUtilKt; import org.thoughtcrime.securesms.badges.gifts.thanks.GiftThanksSheet; import org.thoughtcrime.securesms.components.AnimatingToggle; import org.thoughtcrime.securesms.components.ComposeText; @@ -4073,7 +4072,7 @@ public class ConversationParentFragment extends Fragment SimpleTask.run(() -> { //noinspection CodeBlock2Expr - return SignalDatabase.messages().checkMessageExists(reactionDelegate.getMessageRecord()); + return SignalDatabase.messages().messageExists(reactionDelegate.getMessageRecord()); }, messageExists -> { if (!messageExists) { reactionDelegate.hide(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt index 63859b6d78..f0d1d0c845 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt @@ -269,12 +269,13 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat private const val INDEX_THREAD_DATE = "message_thread_date_index" private const val INDEX_THREAD_STORY_SCHEDULED_DATE_LATEST_REVISION_ID = "message_thread_story_parent_story_scheduled_date_latest_revision_id_index" + private const val INDEX_DATE_SENT_FROM_TO_THREAD = "message_date_sent_from_to_thread_index" @JvmField val CREATE_INDEXS = arrayOf( "CREATE INDEX IF NOT EXISTS message_read_and_notified_and_thread_id_index ON $TABLE_NAME ($READ, $NOTIFIED, $THREAD_ID)", "CREATE INDEX IF NOT EXISTS message_type_index ON $TABLE_NAME ($TYPE)", - "CREATE INDEX IF NOT EXISTS message_date_sent_from_to_thread_index ON $TABLE_NAME ($DATE_SENT, $FROM_RECIPIENT_ID, $TO_RECIPIENT_ID, $THREAD_ID)", + "CREATE INDEX IF NOT EXISTS $INDEX_DATE_SENT_FROM_TO_THREAD ON $TABLE_NAME ($DATE_SENT, $FROM_RECIPIENT_ID, $TO_RECIPIENT_ID, $THREAD_ID)", "CREATE INDEX IF NOT EXISTS message_date_server_index ON $TABLE_NAME ($DATE_SERVER)", "CREATE INDEX IF NOT EXISTS $INDEX_THREAD_DATE ON $TABLE_NAME ($THREAD_ID, $DATE_RECEIVED);", "CREATE INDEX IF NOT EXISTS message_reactions_unread_index ON $TABLE_NAME ($REACTIONS_UNREAD);", @@ -4181,13 +4182,20 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat .readToSingleInt() } - fun checkMessageExists(messageRecord: MessageRecord): Boolean { + fun messageExists(messageRecord: MessageRecord): Boolean { return readableDatabase .exists(TABLE_NAME) .where("$ID = ?", messageRecord.id) .run() } + fun messageExists(sentTimestamp: Long, author: RecipientId): Boolean { + return readableDatabase + .exists("$TABLE_NAME INDEXED BY $INDEX_DATE_SENT_FROM_TO_THREAD") + .where("$DATE_SENT = ? AND $FROM_RECIPIENT_ID = ?", sentTimestamp, author) + .run() + } + fun getReportSpamMessageServerData(threadId: Long, timestamp: Long, limit: Int): List { return getReportSpamMessageServerGuids(threadId, timestamp) .sortedBy { it.dateReceived } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/PendingRetryReceiptManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/PendingRetryReceiptManager.java index a19be54cd4..003fbdaabc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/PendingRetryReceiptManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/PendingRetryReceiptManager.java @@ -18,6 +18,8 @@ import org.thoughtcrime.securesms.database.model.PendingRetryReceiptModel; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.util.FeatureFlags; +import java.util.concurrent.TimeUnit; + /** * Manages the time-based creation of error messages for retries that are pending for messages we couldn't decrypt. @@ -26,6 +28,8 @@ public final class PendingRetryReceiptManager extends TimedEventManager