mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-21 11:38:36 +00:00
Centralize media message inserts.
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -58,6 +58,6 @@ object MmsHelper {
|
||||
message: IncomingMediaMessage,
|
||||
threadId: Long
|
||||
): Optional<MessageTable.InsertResult> {
|
||||
return SignalDatabase.messages.insertSecureDecryptedMessageInbox(message, threadId)
|
||||
return SignalDatabase.messages.insertMessageInbox(message, threadId)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)!!
|
||||
|
||||
@@ -1107,7 +1107,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
|
||||
}
|
||||
|
||||
fun insertEditMessageInbox(threadId: Long, mediaMessage: IncomingMediaMessage, targetMessage: MediaMmsMessageRecord): Optional<InsertResult> {
|
||||
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<InsertResult> {
|
||||
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<InsertResult> {
|
||||
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<InsertResult> {
|
||||
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),
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -72,6 +72,6 @@ object ReleaseChannel {
|
||||
storyType = storyType
|
||||
)
|
||||
|
||||
return SignalDatabase.messages.insertSecureDecryptedMessageInbox(message, threadId).orElse(null)
|
||||
return SignalDatabase.messages.insertMessageInbox(message, threadId).orElse(null)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user