From b7d3cd7990400a1c710bf53c318843dfc7f9d2ae Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 17 Oct 2019 13:25:04 -0300 Subject: [PATCH] [android] support attachments arriving *before* the message containing them --- .../android/attachment/AttachmentRetriever.java | 11 +++++++++++ .../attachment/AttachmentRetrieverImpl.java | 5 ++++- .../conversation/ConversationActivity.java | 17 ++++++++++++----- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentRetriever.java b/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentRetriever.java index f12b01ecb..9b5d14812 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentRetriever.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentRetriever.java @@ -12,6 +12,9 @@ import org.briarproject.briar.api.messaging.PrivateMessageHeader; import java.io.InputStream; import java.util.List; +import androidx.annotation.Nullable; + + @NotNullByDefault public interface AttachmentRetriever { @@ -33,6 +36,14 @@ public interface AttachmentRetriever { */ AttachmentItem createAttachmentItem(Attachment a, boolean needsSize); + /** + * Load an {@link AttachmentItem} from the database. + * + * @return a pair of the {@link MessageId} of the conversation message + * and the {@link AttachmentItem} + * or {@code null} when the conversation message did not yet arrive. + */ + @Nullable @DatabaseExecutor Pair loadAttachmentItem(MessageId attachmentId) throws DbException; diff --git a/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentRetrieverImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentRetrieverImpl.java index 30ee170bb..f13556b12 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentRetrieverImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentRetrieverImpl.java @@ -22,6 +22,8 @@ import java.util.logging.Logger; import javax.inject.Inject; +import androidx.annotation.Nullable; + import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.briar.android.attachment.AttachmentItem.State.AVAILABLE; @@ -103,11 +105,12 @@ class AttachmentRetrieverImpl implements AttachmentRetriever { } @Override + @Nullable @DatabaseExecutor public Pair loadAttachmentItem( MessageId attachmentId) throws DbException { UnavailableItem unavailableItem = unavailableItems.get(attachmentId); - if (unavailableItem == null) throw new AssertionError(); + if (unavailableItem == null) return null; MessageId conversationMessageId = unavailableItem.getConversationMessageId(); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java index 1aba980d7..fccf6ae59 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java @@ -643,16 +643,21 @@ public class ConversationActivity extends BriarActivity runOnDbThread(() -> { for (AttachmentItem item : items) { if (item.getState() == LOADING) - loadMessageAttachment(item.getMessageId()); + loadMessageAttachment(item.getMessageId(), false); } }); } @DatabaseExecutor - private void loadMessageAttachment(MessageId attachmentId) { + private void loadMessageAttachment(MessageId attachmentId, + boolean allowedToFail) { try { - Pair pair = - attachmentRetriever.loadAttachmentItem(attachmentId); + Pair pair = attachmentRetriever + .loadAttachmentItem(attachmentId); + if (pair == null && allowedToFail) { + LOG.warning("Attachment arrived before message"); + return; + } else if (pair == null) throw new AssertionError(); MessageId conversationMessageId = pair.getFirst(); AttachmentItem item = pair.getSecond(); updateMessageAttachment(conversationMessageId, item); @@ -743,7 +748,9 @@ public class ConversationActivity extends BriarActivity @UiThread private void onAttachmentReceived(MessageId attachmentId) { - runOnDbThread(() -> loadMessageAttachment(attachmentId)); + // This is allowed to fail, because the conversation message + // might arrive *after* the attachment. + runOnDbThread(() -> loadMessageAttachment(attachmentId, true)); } @UiThread