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 929d557966..5fa5c336e5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt @@ -2552,7 +2552,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat quoteAttachments += retrieved.quote.attachments } - val messageId = insertMediaMessage( + val (messageId, insertedAttachments) = insertMediaMessage( threadId = threadId, body = retrieved.body, attachments = retrieved.attachments, @@ -2607,7 +2607,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat ApplicationDependencies.getDatabaseObserver().notifyStoryObservers(threads.getRecipientIdForThreadId(threadId)!!) } - return Optional.of(InsertResult(messageId, threadId)) + return Optional.of(InsertResult(messageId, threadId, insertedAttachments = insertedAttachments)) } @Throws(MmsException::class) @@ -3024,7 +3024,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat val updatedBodyAndMentions = MentionUtil.updateBodyAndMentionsWithPlaceholders(message.body, message.mentions) val bodyRanges = message.bodyRanges.adjustBodyRanges(updatedBodyAndMentions.bodyAdjustments) - val messageId = insertMediaMessage( + val (messageId, insertedAttachments) = insertMediaMessage( threadId = threadId, body = updatedBodyAndMentions.bodyAsString, attachments = message.attachments, @@ -3131,7 +3131,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat insertListener: InsertListener?, updateThread: Boolean, unarchive: Boolean - ): Long { + ): kotlin.Pair?> { val mentionsSelf = mentions.any { Recipient.resolved(it.recipientId).isSelf } val allAttachments: MutableList = mutableListOf() @@ -3145,11 +3145,11 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat contentValues.put(MESSAGE_RANGES, messageRanges.toByteArray()) } - val messageId = writableDatabase.withinTransaction { db -> + val (messageId, insertedAttachments) = writableDatabase.withinTransaction { db -> val messageId = db.insert(TABLE_NAME, null, contentValues) if (messageId < 0) { Log.w(TAG, "Tried to insert media message but failed. Assuming duplicate.") - return@withinTransaction -1 + return@withinTransaction kotlin.Pair(-1L, null) } SignalDatabase.mentions.insert(threadId, messageId, mentions) @@ -3182,11 +3182,11 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat } } - messageId + kotlin.Pair(messageId, insertedAttachments) } if (messageId < 0) { - return messageId + return kotlin.Pair(messageId, insertedAttachments) } insertListener?.onComplete() @@ -3198,7 +3198,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat threads.update(threadId, unarchive) } - return messageId + return kotlin.Pair(messageId, insertedAttachments) } /** @@ -4913,7 +4913,8 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat data class InsertResult( val messageId: Long, - val threadId: Long + val threadId: Long, + val insertedAttachments: Map? = null ) data class MmsNotificationInfo( diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt index 06b3a892a5..ee8f700e47 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt @@ -12,7 +12,6 @@ import org.signal.core.util.toOptional import org.signal.libsignal.zkgroup.groups.GroupSecretParams import org.signal.libsignal.zkgroup.receipts.ReceiptCredentialPresentation import org.thoughtcrime.securesms.attachments.Attachment -import org.thoughtcrime.securesms.attachments.DatabaseAttachment import org.thoughtcrime.securesms.attachments.PointerAttachment import org.thoughtcrime.securesms.attachments.TombstoneAttachment import org.thoughtcrime.securesms.attachments.UriAttachment @@ -875,14 +874,19 @@ object DataMessageProcessor { return if (insertResult != null) { SignalDatabase.runPostSuccessfulTransaction { - val allAttachments = SignalDatabase.attachments.getAttachmentsForMessage(insertResult.messageId) - val stickerAttachments = allAttachments.filter { it.isSticker }.toList() - val otherAttachments = allAttachments.filterNot { it.isSticker }.toList() - - forceStickerDownloadIfNecessary(context, insertResult.messageId, stickerAttachments) - - for (attachment in otherAttachments) { - ApplicationDependencies.getJobManager().add(AttachmentDownloadJob(insertResult.messageId, attachment.attachmentId, false)) + if (insertResult.insertedAttachments != null) { + val downloadJobs: List = insertResult.insertedAttachments.mapNotNull { (attachment, attachmentId) -> + if (attachment.isSticker) { + if (attachment.transferState != AttachmentTable.TRANSFER_PROGRESS_DONE) { + AttachmentDownloadJob(insertResult.messageId, attachmentId, true) + } else { + null + } + } else { + AttachmentDownloadJob(insertResult.messageId, attachmentId, false) + } + } + ApplicationDependencies.getJobManager().addAll(downloadJobs) } ApplicationDependencies.getMessageNotifier().updateNotification(context, ConversationId.forConversation(insertResult.threadId)) @@ -990,24 +994,6 @@ object DataMessageProcessor { } } - fun forceStickerDownloadIfNecessary(context: Context, messageId: Long, stickerAttachments: List) { - if (stickerAttachments.isEmpty()) { - return - } - - val stickerAttachment = stickerAttachments[0] - if (stickerAttachment.transferState != AttachmentTable.TRANSFER_PROGRESS_DONE) { - val downloadJob = AttachmentDownloadJob(messageId, stickerAttachment.attachmentId, true) - try { - downloadJob.setContext(context) - downloadJob.doWork() - } catch (e: Exception) { - warn("Failed to download sticker inline. Scheduling.") - ApplicationDependencies.getJobManager().add(downloadJob) - } - } - } - private fun insertPlaceholder(sender: RecipientId, senderDevice: Int, timestamp: Long, groupId: GroupId?): InsertResult? { val textMessage = IncomingTextMessage( sender, diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java index 20d36ebfab..fe694c5bba 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java @@ -794,7 +794,7 @@ public class MessageContentProcessor { insertResult = smsDatabase.insertMessageInbox(incomingEndSessionMessage); } else { smsDatabase.markAsEndSession(smsMessageId.get()); - insertResult = Optional.of(new InsertResult(smsMessageId.get(), smsDatabase.getThreadIdForMessage(smsMessageId.get()))); + insertResult = Optional.of(new InsertResult(smsMessageId.get(), smsDatabase.getThreadIdForMessage(smsMessageId.get()), null)); } if (insertResult.isPresent()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt index 50887f1c31..4ada6a04bc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt @@ -771,7 +771,6 @@ object SyncMessageProcessor { val threadId = SignalDatabase.threads.getOrCreateThreadIdFor(recipient) val messageId: Long val attachments: List - val stickerAttachments: List SignalDatabase.messages.beginTransaction() try { @@ -785,9 +784,7 @@ object SyncMessageProcessor { SignalDatabase.messages.markAsSent(messageId, true) - val allAttachments = SignalDatabase.attachments.getAttachmentsForMessage(messageId) - stickerAttachments = allAttachments.filter { it.isSticker } - attachments = allAttachments.filterNot { it.isSticker } + attachments = SignalDatabase.attachments.getAttachmentsForMessage(messageId) if (sent.message.expireTimer > 0) { SignalDatabase.messages.markExpireStarted(messageId, sent.expirationStartTimestamp) @@ -803,11 +800,10 @@ object SyncMessageProcessor { SignalDatabase.messages.endTransaction() } SignalDatabase.runPostSuccessfulTransaction { + val downloadJobs: List = attachments.map { AttachmentDownloadJob(messageId, it.attachmentId, false) } for (attachment in attachments) { - ApplicationDependencies.getJobManager().add(AttachmentDownloadJob(messageId, attachment.attachmentId, false)) + ApplicationDependencies.getJobManager().addAll(downloadJobs) } - - DataMessageProcessor.forceStickerDownloadIfNecessary(context, messageId, stickerAttachments) } return threadId