From 78a8ae6b8e4d143d5aca9ef4ba929858e54903e8 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Wed, 14 Nov 2018 15:01:54 +0000 Subject: [PATCH 1/2] Sort headers and eagerly load text of latest message. --- .../conversation/ConversationActivity.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) 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 72f35da1a..a9f8d2a09 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 @@ -96,6 +96,7 @@ import static android.support.v4.view.ViewCompat.setTransitionName; import static android.support.v7.util.SortedList.INVALID_POSITION; import static android.widget.Toast.LENGTH_SHORT; import static java.util.Collections.emptyList; +import static java.util.Collections.sort; import static java.util.Objects.requireNonNull; import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; @@ -330,7 +331,25 @@ public class ConversationActivity extends BriarActivity Collection headers = conversationManager.getMessageHeaders(contactId); logDuration(LOG, "Loading messages", start); - displayMessages(revision, headers); + // Sort headers by timestamp in *descending* order + List sorted = + new ArrayList<>(headers); + sort(sorted, (a, b) -> + Long.compare(b.getTimestamp(), a.getTimestamp())); + // Eagerly load the text of the latest message to avoid jumping + for (ConversationMessageHeader h : sorted) { + if (h instanceof PrivateMessageHeader) { + MessageId id = h.getId(); + String text = textCache.get(id); + if (text == null) { + LOG.info("Eagerly loading text of latest message"); + text = messagingManager.getMessageText(id); + textCache.put(id, text); + } + break; + } + } + displayMessages(revision, sorted); } catch (NoSuchContactException e) { finishOnUiThread(); } catch (DbException e) { From 4db075d6434d5731454fd3df2fce755f21c68c27 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Wed, 14 Nov 2018 15:13:25 +0000 Subject: [PATCH 2/2] Only consider the latest item for preloading. --- .../android/conversation/ConversationActivity.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 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 a9f8d2a09..ae0d3ddad 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 @@ -336,17 +336,19 @@ public class ConversationActivity extends BriarActivity new ArrayList<>(headers); sort(sorted, (a, b) -> Long.compare(b.getTimestamp(), a.getTimestamp())); - // Eagerly load the text of the latest message to avoid jumping - for (ConversationMessageHeader h : sorted) { - if (h instanceof PrivateMessageHeader) { - MessageId id = h.getId(); + if (!sorted.isEmpty()) { + // If the latest header is a private message, eagerly load + // its text so we can set the scroll position correctly + ConversationMessageHeader latest = sorted.get(0); + if (latest instanceof PrivateMessageHeader && + ((PrivateMessageHeader) latest).hasText()) { + MessageId id = latest.getId(); String text = textCache.get(id); if (text == null) { LOG.info("Eagerly loading text of latest message"); text = messagingManager.getMessageText(id); textCache.put(id, text); } - break; } } displayMessages(revision, sorted);