diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/ConversationItemPreviewer.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/ConversationItemPreviewer.kt index a5cb1322ca..a33f1fe14a 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/ConversationItemPreviewer.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/ConversationItemPreviewer.kt @@ -73,7 +73,7 @@ class ConversationItemPreviewer { attachments = PointerAttachment.forPointers(Optional.of(attachments)) ) - SignalDatabase.messages.insertSecureDecryptedMessageInbox(message, SignalDatabase.threads.getOrCreateThreadIdFor(other)).get() + SignalDatabase.messages.insertMessageInbox(message, SignalDatabase.threads.getOrCreateThreadIdFor(other)).get() ThreadUtil.sleep(1) } @@ -92,7 +92,7 @@ class ConversationItemPreviewer { attachments = PointerAttachment.forPointers(Optional.of(attachments)) ) - val insert = SignalDatabase.messages.insertSecureDecryptedMessageInbox(message, SignalDatabase.threads.getOrCreateThreadIdFor(other)).get() + val insert = SignalDatabase.messages.insertMessageInbox(message, SignalDatabase.threads.getOrCreateThreadIdFor(other)).get() SignalDatabase.attachments.getAttachmentsForMessage(insert.messageId).forEachIndexed { index, attachment -> // if (index != 1) { diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsHelper.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsHelper.kt index 82b487a32b..c9112586d4 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsHelper.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsHelper.kt @@ -58,6 +58,6 @@ object MmsHelper { message: IncomingMediaMessage, threadId: Long ): Optional { - return SignalDatabase.messages.insertSecureDecryptedMessageInbox(message, threadId) + return SignalDatabase.messages.insertMessageInbox(message, threadId) } } diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt index 8c6f34659e..a3e95c7fec 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt @@ -825,9 +825,9 @@ class RecipientTableTest_getAndPossiblyMerge { val smsId2: Long = SignalDatabase.messages.insertMessageInbox(smsMessage(sender = recipientIdE164, time = 1, body = "1")).get().messageId val smsId3: Long = SignalDatabase.messages.insertMessageInbox(smsMessage(sender = recipientIdAci, time = 2, body = "2")).get().messageId - val mmsId1: Long = SignalDatabase.messages.insertSecureDecryptedMessageInbox(mmsMessage(sender = recipientIdAci, time = 3, body = "3"), -1).get().messageId - val mmsId2: Long = SignalDatabase.messages.insertSecureDecryptedMessageInbox(mmsMessage(sender = recipientIdE164, time = 4, body = "4"), -1).get().messageId - val mmsId3: Long = SignalDatabase.messages.insertSecureDecryptedMessageInbox(mmsMessage(sender = recipientIdAci, time = 5, body = "5"), -1).get().messageId + val mmsId1: Long = SignalDatabase.messages.insertMessageInbox(mmsMessage(sender = recipientIdAci, time = 3, body = "3"), -1).get().messageId + val mmsId2: Long = SignalDatabase.messages.insertMessageInbox(mmsMessage(sender = recipientIdE164, time = 4, body = "4"), -1).get().messageId + val mmsId3: Long = SignalDatabase.messages.insertMessageInbox(mmsMessage(sender = recipientIdAci, time = 5, body = "5"), -1).get().messageId val threadIdAci: Long = SignalDatabase.threads.getThreadIdFor(recipientIdAci)!! val threadIdE164: Long = SignalDatabase.threads.getThreadIdFor(recipientIdE164)!! 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 f6a5260e4b..97e4052049 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt @@ -1107,7 +1107,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat } fun insertEditMessageInbox(threadId: Long, mediaMessage: IncomingMediaMessage, targetMessage: MediaMmsMessageRecord): Optional { - val insertResult = insertSecureDecryptedMessageInbox(retrieved = mediaMessage, threadId = threadId, edittedMediaMessage = targetMessage, notifyObservers = false) + val insertResult = insertMessageInbox(retrieved = mediaMessage, candidateThreadId = threadId, editedMessage = targetMessage, notifyObservers = false) if (insertResult.isPresent) { val (messageId) = insertResult.get() @@ -2583,32 +2583,30 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat } ?: throw NoSuchMessageException("No record found for id: $messageId") } + @JvmOverloads @Throws(MmsException::class) - private fun insertMessageInbox( + fun insertMessageInbox( retrieved: IncomingMediaMessage, - contentLocation: String, candidateThreadId: Long, - mailbox: Long, - editedMessage: MediaMmsMessageRecord?, - notifyObservers: Boolean + editedMessage: MediaMmsMessageRecord? = null, + notifyObservers: Boolean = true ): Optional { + val type = retrieved.toMessageType() + val threadId = if (candidateThreadId == -1L || retrieved.isGroupMessage) { getThreadIdFor(retrieved) } else { candidateThreadId } - val silentUpdate = mailbox and MessageTypes.GROUP_UPDATE_BIT > 0 - val contentValues = contentValuesOf( DATE_SENT to retrieved.sentTimeMillis, DATE_SERVER to retrieved.serverTimeMillis, FROM_RECIPIENT_ID to retrieved.from!!.serialize(), TO_RECIPIENT_ID to Recipient.self().id.serialize(), - TYPE to mailbox, + TYPE to type, MMS_MESSAGE_TYPE to PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF, THREAD_ID to threadId, - MMS_CONTENT_LOCATION to contentLocation, MMS_STATUS to MmsStatus.DOWNLOAD_INITIALIZED, DATE_RECEIVED to if (retrieved.isPushMessage) retrieved.receivedTimeMillis else generatePduCompatTimestamp(retrieved.receivedTimeMillis), SMS_SUBSCRIPTION_ID to retrieved.subscriptionId, @@ -2616,7 +2614,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat VIEW_ONCE to if (retrieved.isViewOnce) 1 else 0, STORY_TYPE to retrieved.storyType.code, PARENT_STORY_ID to if (retrieved.parentStoryId != null) retrieved.parentStoryId.serialize() else 0, - READ to if (silentUpdate || retrieved.isExpirationUpdate) 1 else 0, + READ to if (MessageTypes.isGroupUpdate(type) || retrieved.isExpirationUpdate) 1 else 0, UNIDENTIFIED to retrieved.isUnidentified, SERVER_GUID to retrieved.serverGuid, LATEST_REVISION_ID to null, @@ -2687,7 +2685,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat val isNotStoryGroupReply = retrieved.parentStoryId == null || !retrieved.parentStoryId.isGroupReply() - if (!MessageTypes.isPaymentsActivated(mailbox) && !MessageTypes.isPaymentsRequestToActivate(mailbox) && !MessageTypes.isExpirationTimerUpdate(mailbox) && !retrieved.storyType.isStory && isNotStoryGroupReply) { + if (!MessageTypes.isPaymentsActivated(type) && !MessageTypes.isPaymentsRequestToActivate(type) && !MessageTypes.isExpirationTimerUpdate(type) && !retrieved.storyType.isStory && isNotStoryGroupReply) { val incrementUnreadMentions = retrieved.mentions.isNotEmpty() && retrieved.mentions.any { it.recipientId == Recipient.self().id } threads.incrementUnread(threadId, 1, if (incrementUnreadMentions) 1 else 0) ThreadUpdateJob.enqueue(threadId) @@ -2704,91 +2702,6 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat return Optional.of(InsertResult(messageId, threadId, insertedAttachments = insertedAttachments)) } - @Throws(MmsException::class) - fun insertMessageInbox( - retrieved: IncomingMediaMessage, - contentLocation: String, - threadId: Long - ): Optional { - var type = MessageTypes.BASE_INBOX_TYPE - - if (retrieved.isPushMessage) { - type = type or MessageTypes.PUSH_MESSAGE_BIT - } - - if (retrieved.isExpirationUpdate) { - type = type or MessageTypes.EXPIRATION_TIMER_UPDATE_BIT - } - - if (retrieved.isPaymentsNotification) { - type = type or MessageTypes.SPECIAL_TYPE_PAYMENTS_NOTIFICATION - } - - if (retrieved.isActivatePaymentsRequest) { - type = type or MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST - } - - if (retrieved.isPaymentsActivated) { - type = type or MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATED - } - - return insertMessageInbox(retrieved, contentLocation, threadId, type, editedMessage = null, notifyObservers = true) - } - - @JvmOverloads - @Throws(MmsException::class) - fun insertSecureDecryptedMessageInbox(retrieved: IncomingMediaMessage, threadId: Long, edittedMediaMessage: MediaMmsMessageRecord? = null, notifyObservers: Boolean = true): Optional { - var type = MessageTypes.BASE_INBOX_TYPE or MessageTypes.SECURE_MESSAGE_BIT - var hasSpecialType = false - - if (retrieved.isPushMessage) { - type = type or MessageTypes.PUSH_MESSAGE_BIT - } - - if (retrieved.isExpirationUpdate) { - type = type or MessageTypes.EXPIRATION_TIMER_UPDATE_BIT - } - - if (retrieved.isStoryReaction) { - type = type or MessageTypes.SPECIAL_TYPE_STORY_REACTION - hasSpecialType = true - } - - if (retrieved.giftBadge != null) { - if (hasSpecialType) { - throw MmsException("Cannot insert message with multiple special types.") - } - type = type or MessageTypes.SPECIAL_TYPE_GIFT_BADGE - hasSpecialType = true - } - - if (retrieved.isPaymentsNotification) { - if (hasSpecialType) { - throw MmsException("Cannot insert message with multiple special types.") - } - type = type or MessageTypes.SPECIAL_TYPE_PAYMENTS_NOTIFICATION - hasSpecialType = true - } - - if (retrieved.isActivatePaymentsRequest) { - if (hasSpecialType) { - throw MmsException("Cannot insert message with multiple special types.") - } - type = type or MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST - hasSpecialType = true - } - - if (retrieved.isPaymentsActivated) { - if (hasSpecialType) { - throw MmsException("Cannot insert message with multiple special types.") - } - type = type or MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATED - hasSpecialType = true - } - - return insertMessageInbox(retrieved, "", threadId, type, edittedMediaMessage, notifyObservers) - } - fun insertChatSessionRefreshedMessage(recipientId: RecipientId, senderDeviceId: Long, sentTimestamp: Long): InsertResult { val threadId = threads.getOrCreateThreadIdFor(Recipient.resolved(recipientId)) var type = MessageTypes.SECURE_MESSAGE_BIT or MessageTypes.PUSH_MESSAGE_BIT @@ -4909,18 +4822,66 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat ) } - private fun ByteArray?.toIsoString(): String? { - return if (this != null) { - Util.toIsoString(this) - } else { - null - } - } - private fun MessageRecord.getOriginalOrOwnMessageId(): MessageId { return this.originalMessageId ?: MessageId(this.id) } + /** + * Determines the database type bitmask for theh inbound message. + */ + @Throws(MmsException::class) + private fun IncomingMediaMessage.toMessageType(): Long { + var type = MessageTypes.BASE_INBOX_TYPE or MessageTypes.SECURE_MESSAGE_BIT + var hasSpecialType = false + + if (this.isPushMessage) { + type = type or MessageTypes.PUSH_MESSAGE_BIT + } + + if (this.isExpirationUpdate) { + type = type or MessageTypes.EXPIRATION_TIMER_UPDATE_BIT + } + + if (this.isStoryReaction) { + type = type or MessageTypes.SPECIAL_TYPE_STORY_REACTION + hasSpecialType = true + } + + if (this.giftBadge != null) { + if (hasSpecialType) { + throw MmsException("Cannot insert message with multiple special types.") + } + type = type or MessageTypes.SPECIAL_TYPE_GIFT_BADGE + hasSpecialType = true + } + + if (this.isPaymentsNotification) { + if (hasSpecialType) { + throw MmsException("Cannot insert message with multiple special types.") + } + type = type or MessageTypes.SPECIAL_TYPE_PAYMENTS_NOTIFICATION + hasSpecialType = true + } + + if (this.isActivatePaymentsRequest) { + if (hasSpecialType) { + throw MmsException("Cannot insert message with multiple special types.") + } + type = type or MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST + hasSpecialType = true + } + + if (this.isPaymentsActivated) { + if (hasSpecialType) { + throw MmsException("Cannot insert message with multiple special types.") + } + type = type or MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATED + hasSpecialType = true + } + + return type + } + protected enum class ReceiptType(val columnName: String, val groupStatus: Int) { READ(READ_RECEIPT_COUNT, GroupReceiptTable.STATUS_READ), DELIVERY(DELIVERY_RECEIPT_COUNT, GroupReceiptTable.STATUS_DELIVERED), 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 c571b35c0b..727de079cc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt @@ -330,7 +330,7 @@ object DataMessageProcessor { isPushMessage = true ) - val insertResult: InsertResult? = SignalDatabase.messages.insertSecureDecryptedMessageInbox(mediaMessage, -1).orNull() + val insertResult: InsertResult? = SignalDatabase.messages.insertMessageInbox(mediaMessage, -1).orNull() SignalDatabase.recipients.setExpireMessages(threadRecipientId, expiresIn.inWholeSeconds.toInt()) if (insertResult != null) { @@ -433,7 +433,7 @@ object DataMessageProcessor { serverGuid = envelope.serverGuid ) - val insertResult: InsertResult? = SignalDatabase.messages.insertSecureDecryptedMessageInbox(mediaMessage, -1).orNull() + val insertResult: InsertResult? = SignalDatabase.messages.insertMessageInbox(mediaMessage, -1).orNull() if (insertResult != null) { SignalDatabase.messages.setTransactionSuccessful() @@ -595,7 +595,7 @@ object DataMessageProcessor { isPaymentsActivated = isPaymentsActivated ) - val insertResult: InsertResult? = SignalDatabase.messages.insertSecureDecryptedMessageInbox(mediaMessage, -1).orNull() + val insertResult: InsertResult? = SignalDatabase.messages.insertMessageInbox(mediaMessage, -1).orNull() if (insertResult != null) { return MessageId(insertResult.messageId) @@ -651,7 +651,7 @@ object DataMessageProcessor { isPaymentsNotification = true ) - val insertResult: InsertResult? = SignalDatabase.messages.insertSecureDecryptedMessageInbox(mediaMessage, -1).orNull() + val insertResult: InsertResult? = SignalDatabase.messages.insertMessageInbox(mediaMessage, -1).orNull() if (insertResult != null) { val messageId = MessageId(insertResult.messageId) ApplicationDependencies.getMessageNotifier().updateNotification(context, ConversationId.forConversation(insertResult.threadId)) @@ -766,7 +766,7 @@ object DataMessageProcessor { messageRanges = bodyRanges ) - val insertResult: InsertResult? = SignalDatabase.messages.insertSecureDecryptedMessageInbox(mediaMessage, -1).orNull() + val insertResult: InsertResult? = SignalDatabase.messages.insertMessageInbox(mediaMessage, -1).orNull() if (insertResult != null) { SignalDatabase.messages.setTransactionSuccessful() @@ -830,7 +830,7 @@ object DataMessageProcessor { giftBadge = dbGiftBadge ) - SignalDatabase.messages.insertSecureDecryptedMessageInbox(mediaMessage, -1).orNull() + SignalDatabase.messages.insertMessageInbox(mediaMessage, -1).orNull() } catch (e: MmsException) { throw StorageFailedException(e, metadata.sourceServiceId.toString(), metadata.sourceDeviceId) } @@ -894,7 +894,7 @@ object DataMessageProcessor { isPushMessage = true ) - insertResult = SignalDatabase.messages.insertSecureDecryptedMessageInbox(mediaMessage, -1).orNull() + insertResult = SignalDatabase.messages.insertMessageInbox(mediaMessage, -1).orNull() if (insertResult != null) { SignalDatabase.messages.setTransactionSuccessful() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/StoryMessageProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/StoryMessageProcessor.kt index 8873be1e91..fe4fcf0383 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/StoryMessageProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/StoryMessageProcessor.kt @@ -77,7 +77,7 @@ object StoryMessageProcessor { messageRanges = storyMessage.bodyRanges.filter { it.mentionAci == null }.toBodyRangeList() ) - insertResult = SignalDatabase.messages.insertSecureDecryptedMessageInbox(mediaMessage, -1).orNull() + insertResult = SignalDatabase.messages.insertMessageInbox(mediaMessage, -1).orNull() if (insertResult != null) { SignalDatabase.messages.setTransactionSuccessful() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/releasechannel/ReleaseChannel.kt b/app/src/main/java/org/thoughtcrime/securesms/releasechannel/ReleaseChannel.kt index 171dc85014..454808edb4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/releasechannel/ReleaseChannel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/releasechannel/ReleaseChannel.kt @@ -72,6 +72,6 @@ object ReleaseChannel { storyType = storyType ) - return SignalDatabase.messages.insertSecureDecryptedMessageInbox(message, threadId).orElse(null) + return SignalDatabase.messages.insertMessageInbox(message, threadId).orElse(null) } }