From bded1edb2bf043431a2419c2d72be44092188430 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 13 Feb 2020 10:24:36 -0300 Subject: [PATCH] [android] Use ordinary HashMap for to be received attachments Also don't do list stacking from end for now. --- .../conversation/ConversationActivity.java | 1 - .../android/conversation/ImageViewModel.java | 27 ++++++++++--------- 2 files changed, 15 insertions(+), 13 deletions(-) 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 4a73c33e8..7a164c388 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 @@ -260,7 +260,6 @@ public class ConversationActivity extends BriarActivity adapter = new ConversationAdapter(this, this); list = findViewById(R.id.conversationView); layoutManager = new LinearLayoutManager(this); - layoutManager.setStackFromEnd(true); list.setLayoutManager(layoutManager); list.setAdapter(adapter); list.setEmptyText(getString(R.string.no_private_messages)); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ImageViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ImageViewModel.java index d53f26e7b..1a59b02bf 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ImageViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ImageViewModel.java @@ -27,9 +27,9 @@ import java.io.InputStream; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Locale; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.logging.Logger; @@ -60,9 +60,9 @@ public class ImageViewModel extends AndroidViewModel implements EventListener { @IoExecutor private final Executor ioExecutor; - private volatile boolean receivedAttachmentsInitialized = false; - private ConcurrentHashMap> - receivedAttachments = new ConcurrentHashMap<>(); + private boolean receivedAttachmentsInitialized = false; + private HashMap> receivedAttachments = + new HashMap<>(); /** * true means there was an error saving the image, false if image was saved. @@ -93,6 +93,7 @@ public class ImageViewModel extends AndroidViewModel implements EventListener { eventBus.removeListener(this); } + @UiThread @Override public void eventOccurred(Event e) { if (e instanceof AttachmentReceivedEvent) { @@ -100,11 +101,10 @@ public class ImageViewModel extends AndroidViewModel implements EventListener { MutableLiveEvent oldEvent; if (receivedAttachmentsInitialized) { oldEvent = receivedAttachments.get(id); + if (oldEvent != null) oldEvent.postEvent(true); } else { - oldEvent = receivedAttachments - .putIfAbsent(id, new MutableLiveEvent<>(true)); + receivedAttachments.put(id, new MutableLiveEvent<>(true)); } - if (oldEvent != null) oldEvent.postEvent(true); } } @@ -113,18 +113,21 @@ public class ImageViewModel extends AndroidViewModel implements EventListener { for (AttachmentItem item : attachments) { // no need to track items that are in a final state already if (item.getState().isFinal()) continue; - // add new live events, if not added concurrently by Event + // add new live events, if not already added by eventOccurred() MessageId id = item.getMessageId(); - receivedAttachments.putIfAbsent(id, new MutableLiveEvent<>()); + if (!receivedAttachments.containsKey(id)) { + receivedAttachments.put(id, new MutableLiveEvent<>()); + } } receivedAttachmentsInitialized = true; } + /** + * Returns a LiveData for attachments in a non-final state. + * Note that you need to call {@link #expectAttachments(List)} first. + */ @UiThread LiveEvent getOnAttachmentReceived(MessageId messageId) { - if (receivedAttachments.size() == 0) { - throw new IllegalStateException("expectAttachments() not called"); - } return requireNonNull(receivedAttachments.get(messageId)); }