Do a CDS refresh when a new chat is created.

This commit is contained in:
Greyson Parrelli
2024-03-01 13:40:26 -05:00
committed by Alex Hart
parent 40b4b316b3
commit 58b11f3c47
5 changed files with 130 additions and 59 deletions

View File

@@ -23,7 +23,6 @@ import android.text.SpannableString
import android.text.TextUtils
import androidx.annotation.VisibleForTesting
import androidx.core.content.contentValuesOf
import com.google.android.mms.pdu_alt.NotificationInd
import com.google.android.mms.pdu_alt.PduHeaders
import org.json.JSONArray
import org.json.JSONException
@@ -663,7 +662,11 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
threads.update(threadId, true)
notifyConversationListeners(threadId)
return InsertResult(messageId, threadId)
return InsertResult(
messageId = messageId,
threadId = threadId,
threadWasNewlyCreated = false
)
}
fun updateBundleMessageBody(messageId: Long, body: String): InsertResult {
@@ -773,7 +776,8 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
fun insertCallLog(recipientId: RecipientId, type: Long, timestamp: Long, outgoing: Boolean): InsertResult {
val unread = MessageTypes.isMissedAudioCall(type) || MessageTypes.isMissedVideoCall(type)
val recipient = Recipient.resolved(recipientId)
val threadId = threads.getOrCreateThreadIdFor(recipient)
val threadIdResult = threads.getOrCreateThreadIdResultFor(recipient.id, recipient.isGroup)
val threadId = threadIdResult.threadId
val values = contentValuesOf(
FROM_RECIPIENT_ID to if (outgoing) Recipient.self().id.serialize() else recipientId.serialize(),
@@ -797,7 +801,11 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
notifyConversationListeners(threadId)
TrimThreadJob.enqueueAsync(threadId)
return InsertResult(messageId, threadId)
return InsertResult(
messageId = messageId,
threadId = threadId,
threadWasNewlyCreated = threadIdResult.newlyCreated
)
}
fun updateCallLog(messageId: Long, type: Long) {
@@ -1756,29 +1764,18 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
.readToSingleLong(-1)
}
private fun getThreadIdFor(retrieved: IncomingMessage): Long {
private fun getThreadIdFor(retrieved: IncomingMessage): ThreadTable.ThreadIdResult {
return if (retrieved.groupId != null) {
val groupRecipientId = recipients.getOrInsertFromPossiblyMigratedGroupId(retrieved.groupId)
val groupRecipients = Recipient.resolved(groupRecipientId)
threads.getOrCreateThreadIdFor(groupRecipients)
threads.getOrCreateThreadIdResultFor(groupRecipients.id, isGroup = true)
} else {
val sender = Recipient.resolved(retrieved.from)
threads.getOrCreateThreadIdFor(sender)
threads.getOrCreateThreadIdResultFor(sender.id, isGroup = false)
}
}
private fun getThreadIdFor(notification: NotificationInd): Long {
val fromString = if (notification.from != null && notification.from.textString != null) {
Util.toIsoString(notification.from.textString)
} else {
""
}
val recipient = Recipient.external(context, fromString)
return threads.getOrCreateThreadIdFor(recipient)
}
fun rawQueryWithAttachments(where: String, arguments: Array<String>?, reverse: Boolean = false, limit: Long = 0): Cursor {
private fun rawQueryWithAttachments(where: String, arguments: Array<String>?, reverse: Boolean = false, limit: Long = 0): Cursor {
return rawQueryWithAttachments(MMS_PROJECTION_WITH_ATTACHMENTS, where, arguments, reverse, limit)
}
@@ -2463,11 +2460,12 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
): Optional<InsertResult> {
val type = retrieved.toMessageType()
val threadId = if (candidateThreadId == -1L || retrieved.isGroupMessage) {
val threadIdResult = if (candidateThreadId == -1L || retrieved.isGroupMessage) {
getThreadIdFor(retrieved)
} else {
candidateThreadId
ThreadTable.ThreadIdResult(threadId = candidateThreadId, newlyCreated = false)
}
val threadId = threadIdResult.threadId
if (retrieved.type == MessageType.GROUP_UPDATE && retrieved.groupContext?.let { GroupV2UpdateMessageUtil.isJoinRequestCancel(it) } == true) {
val result = collapseJoinRequestEventsIfPossible(threadId, retrieved)
@@ -2592,11 +2590,20 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
ApplicationDependencies.getDatabaseObserver().notifyStoryObservers(threads.getRecipientIdForThreadId(threadId)!!)
}
return Optional.of(InsertResult(messageId, threadId, insertedAttachments = insertedAttachments))
return Optional.of(
InsertResult(
messageId = messageId,
threadId = threadId,
threadWasNewlyCreated = threadIdResult.newlyCreated,
insertedAttachments = insertedAttachments
)
)
}
fun insertChatSessionRefreshedMessage(recipientId: RecipientId, senderDeviceId: Long, sentTimestamp: Long): InsertResult {
val threadId = threads.getOrCreateThreadIdFor(Recipient.resolved(recipientId))
val recipient = Recipient.resolved(recipientId)
val threadIdResult = threads.getOrCreateThreadIdResultFor(recipient.id, recipient.isGroup)
val threadId = threadIdResult.threadId
var type = MessageTypes.SECURE_MESSAGE_BIT or MessageTypes.PUSH_MESSAGE_BIT
type = type and MessageTypes.TOTAL_MASK - MessageTypes.ENCRYPTION_MASK or MessageTypes.ENCRYPTION_REMOTE_FAILED_BIT
@@ -2622,7 +2629,11 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
notifyConversationListeners(threadId)
TrimThreadJob.enqueueAsync(threadId)
return InsertResult(messageId, threadId)
return InsertResult(
messageId = messageId,
threadId = threadId,
threadWasNewlyCreated = threadIdResult.newlyCreated
)
}
fun insertBadDecryptMessage(recipientId: RecipientId, senderDevice: Int, sentTimestamp: Long, receivedTimestamp: Long, threadId: Long) {
@@ -3533,7 +3544,11 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
.where("$ID = ?", id)
.run()
result = InsertResult(id, threadId)
result = InsertResult(
messageId = id,
threadId = threadId,
threadWasNewlyCreated = false
)
}
}
}
@@ -4874,6 +4889,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
data class InsertResult(
val messageId: Long,
val threadId: Long,
val threadWasNewlyCreated: Boolean,
val insertedAttachments: Map<Attachment, AttachmentId>? = null
)

View File

@@ -1166,9 +1166,23 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa
}
fun getOrCreateThreadIdFor(recipientId: RecipientId, isGroup: Boolean, distributionType: Int = DistributionTypes.DEFAULT): Long {
return getOrCreateThreadIdResultFor(recipientId, isGroup, distributionType).threadId
}
fun getOrCreateThreadIdResultFor(recipientId: RecipientId, isGroup: Boolean, distributionType: Int = DistributionTypes.DEFAULT): ThreadIdResult {
return writableDatabase.withinTransaction {
val threadId = getThreadIdFor(recipientId)
threadId ?: createThreadForRecipient(recipientId, isGroup, distributionType)
if (threadId != null) {
ThreadIdResult(
threadId = threadId,
newlyCreated = false
)
} else {
ThreadIdResult(
threadId = createThreadForRecipient(recipientId, isGroup, distributionType),
newlyCreated = true
)
}
}
}
@@ -2111,4 +2125,9 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa
)
data class MergeResult(val threadId: Long, val previousThreadId: Long, val neededMerge: Boolean)
data class ThreadIdResult(
val threadId: Long,
val newlyCreated: Boolean
)
}