mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-23 18:30:20 +01:00
Reduce number of db calls to getGroup.
This commit is contained in:
@@ -122,8 +122,10 @@ object DataMessageProcessor {
|
||||
val message: DataMessage = content.dataMessage
|
||||
val groupId: GroupId.V2? = if (message.hasGroupContext) GroupId.v2(message.groupV2.groupMasterKey) else null
|
||||
|
||||
var groupProcessResult: MessageContentProcessorV2.Gv2PreProcessResult? = null
|
||||
if (groupId != null) {
|
||||
if (MessageContentProcessorV2.handleGv2PreProcessing(context, envelope.timestamp, content, metadata, groupId, message.groupV2, senderRecipient)) {
|
||||
groupProcessResult = MessageContentProcessorV2.handleGv2PreProcessing(context, envelope.timestamp, content, metadata, groupId, message.groupV2, senderRecipient)
|
||||
if (groupProcessResult == MessageContentProcessorV2.Gv2PreProcessResult.IGNORE) {
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -146,8 +148,14 @@ object DataMessageProcessor {
|
||||
message.hasGroupCallUpdate() -> handleGroupCallUpdateMessage(envelope, message, senderRecipient.id, groupId)
|
||||
}
|
||||
|
||||
if (groupId != null && SignalDatabase.groups.isUnknownGroup(groupId)) {
|
||||
handleUnknownGroupMessage(envelope.timestamp, message.groupV2)
|
||||
if (groupId != null) {
|
||||
val unknownGroup = when (groupProcessResult) {
|
||||
MessageContentProcessorV2.Gv2PreProcessResult.GROUP_UP_TO_DATE -> threadRecipient.isUnknownGroup
|
||||
else -> SignalDatabase.groups.isUnknownGroup(groupId)
|
||||
}
|
||||
if (unknownGroup) {
|
||||
handleUnknownGroupMessage(envelope.timestamp, message.groupV2)
|
||||
}
|
||||
}
|
||||
|
||||
if (message.hasProfileKey()) {
|
||||
|
||||
@@ -78,7 +78,7 @@ object EditMessageProcessor {
|
||||
return
|
||||
}
|
||||
|
||||
if (groupId != null && MessageContentProcessorV2.handleGv2PreProcessing(context, envelope.timestamp, content, metadata, groupId, message.groupV2, senderRecipient)) {
|
||||
if (groupId != null && MessageContentProcessorV2.handleGv2PreProcessing(context, envelope.timestamp, content, metadata, groupId, message.groupV2, senderRecipient) == MessageContentProcessorV2.Gv2PreProcessResult.IGNORE) {
|
||||
warn(envelope.timestamp, "[handleEditMessage] Group processor indicated we should ignore this.")
|
||||
return
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ import org.thoughtcrime.securesms.groups.GroupId
|
||||
import org.thoughtcrime.securesms.groups.GroupManager
|
||||
import org.thoughtcrime.securesms.groups.GroupNotAMemberException
|
||||
import org.thoughtcrime.securesms.groups.GroupsV1MigrationUtil
|
||||
import org.thoughtcrime.securesms.groups.v2.processing.GroupsV2StateProcessor
|
||||
import org.thoughtcrime.securesms.jobs.NullMessageSendJob
|
||||
import org.thoughtcrime.securesms.jobs.ResendMessageJob
|
||||
import org.thoughtcrime.securesms.jobs.SenderKeyDistributionSendJob
|
||||
@@ -50,6 +51,12 @@ import java.io.IOException
|
||||
|
||||
open class MessageContentProcessorV2(private val context: Context) {
|
||||
|
||||
enum class Gv2PreProcessResult {
|
||||
IGNORE,
|
||||
GROUP_UPDATE,
|
||||
GROUP_UP_TO_DATE
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TAG = "MessageProcessorV2"
|
||||
|
||||
@@ -133,8 +140,7 @@ open class MessageContentProcessorV2(private val context: Context) {
|
||||
return if (threadRecipient.isGroup && threadRecipient.isBlocked) {
|
||||
true
|
||||
} else if (threadRecipient.isGroup) {
|
||||
val groupId = if (message.hasGroupV2()) GroupId.v2(message.groupV2.groupMasterKey) else null
|
||||
if (groupId != null && SignalDatabase.groups.isUnknownGroup(groupId)) {
|
||||
if (threadRecipient.isUnknownGroup) {
|
||||
return senderRecipient.isBlocked
|
||||
}
|
||||
|
||||
@@ -143,7 +149,7 @@ open class MessageContentProcessorV2(private val context: Context) {
|
||||
val isExpireMessage = message.isExpirationUpdate
|
||||
val isGv2Update = message.hasSignedGroupChange
|
||||
val isContentMessage = !isGv2Update && !isExpireMessage && (isTextMessage || isMediaMessage)
|
||||
val isGroupActive = groupId != null && SignalDatabase.groups.isActive(groupId)
|
||||
val isGroupActive = threadRecipient.isActiveGroup
|
||||
|
||||
isContentMessage && !isGroupActive || senderRecipient.isBlocked && !isGv2Update
|
||||
} else {
|
||||
@@ -214,36 +220,46 @@ open class MessageContentProcessorV2(private val context: Context) {
|
||||
groupId: GroupId.V2,
|
||||
groupV2: SignalServiceProtos.GroupContextV2,
|
||||
senderRecipient: Recipient
|
||||
): Boolean {
|
||||
val possibleGv1 = SignalDatabase.groups.getGroupV1ByExpectedV2(groupId)
|
||||
if (possibleGv1.isPresent) {
|
||||
GroupsV1MigrationUtil.performLocalMigration(context, possibleGv1.get().id.requireV1())
|
||||
): Gv2PreProcessResult {
|
||||
val possibleV1OrV2Group = SignalDatabase.groups.getGroupV1OrV2ByExpectedV2(groupId)
|
||||
val needsV1Migration = possibleV1OrV2Group.isPresent && possibleV1OrV2Group.get().isV1Group
|
||||
if (needsV1Migration) {
|
||||
GroupsV1MigrationUtil.performLocalMigration(context, possibleV1OrV2Group.get().id.requireV1())
|
||||
}
|
||||
|
||||
if (!updateGv2GroupFromServerOrP2PChange(context, timestamp, groupV2)) {
|
||||
val groupUpdateResult = updateGv2GroupFromServerOrP2PChange(context, timestamp, groupV2)
|
||||
if (groupUpdateResult == null) {
|
||||
log(timestamp, "Ignoring GV2 message for group we are not currently in $groupId")
|
||||
return true
|
||||
return Gv2PreProcessResult.IGNORE
|
||||
}
|
||||
|
||||
val groupRecord = if (groupUpdateResult.groupState == GroupsV2StateProcessor.GroupState.GROUP_UPDATED || needsV1Migration) {
|
||||
SignalDatabase.groups.getGroup(groupId)
|
||||
} else {
|
||||
possibleV1OrV2Group
|
||||
}
|
||||
|
||||
val groupRecord = SignalDatabase.groups.getGroup(groupId)
|
||||
if (groupRecord.isPresent && !groupRecord.get().members.contains(senderRecipient.id)) {
|
||||
log(timestamp, "Ignoring GV2 message from member not in group $groupId. Sender: ${formatSender(senderRecipient.id, metadata.sourceServiceId, metadata.sourceDeviceId)}")
|
||||
return true
|
||||
return Gv2PreProcessResult.IGNORE
|
||||
}
|
||||
|
||||
if (groupRecord.isPresent && groupRecord.get().isAnnouncementGroup && !groupRecord.get().admins.contains(senderRecipient)) {
|
||||
if (content.hasDataMessage()) {
|
||||
if (content.dataMessage.hasDisallowedAnnouncementOnlyContent) {
|
||||
Log.w(TAG, "Ignoring message from ${senderRecipient.id} because it has disallowed content, and they're not an admin in an announcement-only group.")
|
||||
return true
|
||||
return Gv2PreProcessResult.IGNORE
|
||||
}
|
||||
} else if (content.hasTypingMessage()) {
|
||||
Log.w(TAG, "Ignoring typing indicator from ${senderRecipient.id} because they're not an admin in an announcement-only group.")
|
||||
return true
|
||||
return Gv2PreProcessResult.IGNORE
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
return when (groupUpdateResult.groupState) {
|
||||
GroupsV2StateProcessor.GroupState.GROUP_UPDATED -> Gv2PreProcessResult.GROUP_UPDATE
|
||||
GroupsV2StateProcessor.GroupState.GROUP_CONSISTENT_OR_AHEAD -> Gv2PreProcessResult.GROUP_UP_TO_DATE
|
||||
}
|
||||
}
|
||||
|
||||
@Throws(IOException::class, GroupChangeBusyException::class)
|
||||
@@ -251,15 +267,14 @@ open class MessageContentProcessorV2(private val context: Context) {
|
||||
context: Context,
|
||||
timestamp: Long,
|
||||
groupV2: SignalServiceProtos.GroupContextV2
|
||||
): Boolean {
|
||||
): GroupsV2StateProcessor.GroupUpdateResult? {
|
||||
return try {
|
||||
val signedGroupChange: ByteArray? = if (groupV2.hasSignedGroupChange) groupV2.signedGroupChange else null
|
||||
val updatedTimestamp = if (signedGroupChange != null) timestamp else timestamp - 1
|
||||
GroupManager.updateGroupFromServer(context, groupV2.groupMasterKey, groupV2.revision, updatedTimestamp, signedGroupChange)
|
||||
true
|
||||
} catch (e: GroupNotAMemberException) {
|
||||
warn(timestamp, "Ignoring message for a group we're not in")
|
||||
false
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -173,7 +173,7 @@ object SyncMessageProcessor {
|
||||
val groupId: GroupId.V2? = if (dataMessage.hasGroupContext) GroupId.v2(dataMessage.groupV2.groupMasterKey) else null
|
||||
|
||||
if (groupId != null) {
|
||||
if (MessageContentProcessorV2.handleGv2PreProcessing(context, envelope.timestamp, content, metadata, groupId, dataMessage.groupV2, senderRecipient)) {
|
||||
if (MessageContentProcessorV2.handleGv2PreProcessing(context, envelope.timestamp, content, metadata, groupId, dataMessage.groupV2, senderRecipient) == MessageContentProcessorV2.Gv2PreProcessResult.IGNORE) {
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -591,7 +591,7 @@ object SyncMessageProcessor {
|
||||
val dataMessage: DataMessage = sent.message
|
||||
val groupId: GroupId.V2? = dataMessage.groupV2.groupId
|
||||
|
||||
if (!MessageContentProcessorV2.updateGv2GroupFromServerOrP2PChange(context, envelope.timestamp, dataMessage.groupV2)) {
|
||||
if (MessageContentProcessorV2.updateGv2GroupFromServerOrP2PChange(context, envelope.timestamp, dataMessage.groupV2) == null) {
|
||||
log(envelope.timestamp, "Ignoring GV2 message for group we are not currently in $groupId")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user