From cf49bf81fc69d6354c2f95f72c4e40b19bae3851 Mon Sep 17 00:00:00 2001 From: Ryan ZHAO Date: Wed, 2 Sep 2020 14:44:15 +1000 Subject: [PATCH] fix missing messages in open groups --- src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java | 5 ++++- .../thoughtcrime/securesms/loki/api/PublicChatPoller.kt | 9 ++++++--- .../securesms/loki/protocol/SessionMetaProtocol.kt | 3 +-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java b/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java index 4b97762c9b..69ce6a08a6 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java @@ -834,6 +834,8 @@ public class PushDecryptJob extends BaseJob implements InjectableType { public long handleSynchronizeSentMediaMessage(@NonNull SentTranscriptMessage message) throws MmsException { + if (SessionMetaProtocol.shouldIgnoreMessage(message.getTimestamp())) { return -1; } + MmsDatabase database = DatabaseFactory.getMmsDatabase(context); Recipient recipients = getSyncMessageMasterDestination(message); Optional quote = getValidatedQuote(message.getMessage().getQuote()); @@ -1002,6 +1004,7 @@ public class PushDecryptJob extends BaseJob implements InjectableType { public long handleSynchronizeSentTextMessage(@NonNull SentTranscriptMessage message) throws MmsException { + if (SessionMetaProtocol.shouldIgnoreMessage(message.getTimestamp())) { return -1; } Recipient recipient = getSyncMessageMasterDestination(message); String body = message.getMessage().getBody().or(""); @@ -1459,7 +1462,7 @@ public class PushDecryptJob extends BaseJob implements InjectableType { return true; } - if (SessionMetaProtocol.shouldIgnoreMessage(content)) { + if (SessionMetaProtocol.shouldIgnoreMessage(content.getTimestamp())) { Log.d("Loki", "Ignoring duplicate message."); return true; } diff --git a/src/org/thoughtcrime/securesms/loki/api/PublicChatPoller.kt b/src/org/thoughtcrime/securesms/loki/api/PublicChatPoller.kt index 6a5ee5dad0..049a991aa8 100644 --- a/src/org/thoughtcrime/securesms/loki/api/PublicChatPoller.kt +++ b/src/org/thoughtcrime/securesms/loki/api/PublicChatPoller.kt @@ -34,6 +34,7 @@ import java.util.* class PublicChatPoller(private val context: Context, private val group: PublicChat) { private val handler = Handler() private var hasStarted = false + private var isPolling = false public var isCaughtUp = false // region Convenience @@ -186,12 +187,10 @@ class PublicChatPoller(private val context: Context, private val group: PublicCh } fun processOutgoingMessage(message: PublicChatMessage) { val messageServerID = message.serverID ?: return - val isDuplicate = DatabaseFactory.getLokiMessageDatabase(context).getMessageID(messageServerID) != null - if (isDuplicate) { return } if (message.body.isEmpty() && message.attachments.isEmpty() && message.quote == null) { return } val userHexEncodedPublicKey = TextSecurePreferences.getLocalNumber(context) val dataMessage = getDataMessage(message) - SessionMetaProtocol.dropFromTimestampCacheIfNeeded(dataMessage.timestamp) + SessionMetaProtocol.dropFromTimestampCacheIfNeeded(message.serverTimestamp) val transcript = SentTranscriptMessage(userHexEncodedPublicKey, message.serverTimestamp, dataMessage, dataMessage.expiresInSeconds.toLong(), Collections.singletonMap(userHexEncodedPublicKey, false)) transcript.messageServerID = messageServerID if (dataMessage.quote.isPresent || (dataMessage.attachments.isPresent && dataMessage.attachments.get().size > 0) || dataMessage.previews.isPresent) { @@ -212,6 +211,8 @@ class PublicChatPoller(private val context: Context, private val group: PublicCh } } } + if (isPolling) { return } + isPolling = true val userDevices = MultiDeviceProtocol.shared.getAllLinkedDevices(userHexEncodedPublicKey) var uniqueDevices = setOf() val userPrivateKey = IdentityKeyUtil.getIdentityKeyPair(context).privateKey.serialize() @@ -249,8 +250,10 @@ class PublicChatPoller(private val context: Context, private val group: PublicCh } } isCaughtUp = true + isPolling = false }.fail { Log.d("Loki", "Failed to get messages for group chat with ID: ${group.channel} on server: ${group.server}.") + isPolling = false } } diff --git a/src/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt b/src/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt index b4a16ed505..c3322f9a08 100644 --- a/src/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt +++ b/src/org/thoughtcrime/securesms/loki/protocol/SessionMetaProtocol.kt @@ -23,8 +23,7 @@ object SessionMetaProtocol { } @JvmStatic - fun shouldIgnoreMessage(content: SignalServiceContent): Boolean { - val timestamp = content.timestamp + fun shouldIgnoreMessage(timestamp: Long): Boolean { val shouldIgnoreMessage = timestamps.contains(timestamp) timestamps.add(timestamp) return shouldIgnoreMessage