diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java index bcf6f89eea..e8ca2caa49 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushProcessMessageJob.java @@ -240,6 +240,17 @@ public final class PushProcessMessageJob extends BaseJob { if (messageState == MessageState.DECRYPTED_OK) { SignalServiceContent content = SignalServiceContent.deserialize(serializedPlaintextContent); handleMessage(content, optionalSmsMessageId); + + Optional> earlyContent = ApplicationDependencies.getEarlyMessageCache() + .retrieve(Recipient.externalPush(context, content.getSender()).getId(), + content.getTimestamp()); + if (earlyContent.isPresent()) { + Log.i(TAG, "Found " + earlyContent.get().size() + " dependent item(s) that were retrieved earlier. Processing."); + + for (SignalServiceContent earlyItem : earlyContent.get()) { + handleMessage(earlyItem, Optional.absent()); + } + } } else { //noinspection ConstantConditions handleExceptionMessage(exceptionMetadata, optionalSmsMessageId); @@ -332,14 +343,6 @@ public final class PushProcessMessageJob extends BaseJob { } resetRecipientToPush(Recipient.externalPush(context, content.getSender())); - - Optional earlyContent = ApplicationDependencies.getEarlyMessageCache() - .retrieve(Recipient.externalPush(context, content.getSender()).getId(), - content.getTimestamp()); - if (earlyContent.isPresent()) { - Log.i(TAG, "Found dependent content that was retrieved earlier. Processing."); - handleMessage(earlyContent.get(), Optional.absent()); - } } catch (StorageFailedException e) { Log.w(TAG, e); handleCorruptMessage(e.getSender(), e.getSenderDevice(), timestamp, smsMessageId); @@ -1363,6 +1366,7 @@ public final class PushProcessMessageJob extends BaseJob { .incrementReadReceiptCount(id, content.getTimestamp()); if (!handled) { + Log.w(TAG, "[handleReadReceipt] Could not find matching message! timestamp: " + timestamp + " author: " + sender.getId()); ApplicationDependencies.getEarlyMessageCache().store(sender.getId(), timestamp, content); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/EarlyMessageCache.java b/app/src/main/java/org/thoughtcrime/securesms/util/EarlyMessageCache.java index db68d72f85..c479479c4a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/EarlyMessageCache.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/EarlyMessageCache.java @@ -6,6 +6,8 @@ import org.thoughtcrime.securesms.recipients.RecipientId; import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.messages.SignalServiceContent; +import java.util.LinkedList; +import java.util.List; import java.util.Objects; /** @@ -15,14 +17,23 @@ import java.util.Objects; */ public final class EarlyMessageCache { - private final LRUCache cache = new LRUCache<>(100); + private final LRUCache> cache = new LRUCache<>(100); /** * @param targetSender The sender of the message this message depends on. * @param targetSentTimestamp The sent timestamp of the message this message depends on. */ public void store(@NonNull RecipientId targetSender, long targetSentTimestamp, @NonNull SignalServiceContent content) { - cache.put(new MessageId(targetSender, targetSentTimestamp), content); + MessageId messageId = new MessageId(targetSender, targetSentTimestamp); + List contentList = cache.get(messageId); + + if (contentList == null) { + contentList = new LinkedList<>(); + } + + contentList.add(content); + + cache.put(messageId, contentList); } /** @@ -30,7 +41,7 @@ public final class EarlyMessageCache { * @param sender The sender of the message in question. * @param sentTimestamp The sent timestamp of the message in question. */ - public Optional retrieve(@NonNull RecipientId sender, long sentTimestamp) { + public Optional> retrieve(@NonNull RecipientId sender, long sentTimestamp) { return Optional.fromNullable(cache.remove(new MessageId(sender, sentTimestamp))); }