From 5f5bd7413c22505b08638c6b29b582fe03b6c636 Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Mon, 23 Apr 2018 21:48:57 +0200 Subject: provide fallback in case synchronizing around message list fails for some reason --- .../pixart/messenger/ui/ConversationFragment.java | 59 ++++++++++++---------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java index 0b399393d..debc7bdd2 100644 --- a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java +++ b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java @@ -143,7 +143,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke private static final String STATE_LAST_MESSAGE_UUID = "state_last_message_uuid"; - final protected List messageList = new ArrayList<>(); + private final List messageList = new ArrayList<>(); final private List mPendingImageUris = new ArrayList<>(); private String lastMessageUuid = null; public Uri mPendingEditorContent = null; @@ -239,33 +239,33 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke return; } runOnUiThread(() -> { - final int oldPosition = binding.messagesView.getFirstVisiblePosition(); - Message message = null; - int childPos; - for (childPos = 0; childPos + oldPosition < messageList.size(); ++childPos) { - message = messageList.get(oldPosition + childPos); - if (message.getType() != Message.TYPE_STATUS) { - break; + synchronized (messageList) { + final int oldPosition = binding.messagesView.getFirstVisiblePosition(); + Message message = null; + int childPos; + for (childPos = 0; childPos + oldPosition < messageList.size(); ++childPos) { + message = messageList.get(oldPosition + childPos); + if (message.getType() != Message.TYPE_STATUS) { + break; + } } + final String uuid = message != null ? message.getUuid() : null; + View v = binding.messagesView.getChildAt(childPos); + final int pxOffset = (v == null) ? 0 : v.getTop(); + ConversationFragment.this.conversation.populateWithMessages(ConversationFragment.this.messageList); + try { + updateStatusMessages(); + } catch (IllegalStateException e) { + Log.d(Config.LOGTAG, "caught illegal state exception while updating status messages"); + } + messageListAdapter.notifyDataSetChanged(); + int pos = Math.max(getIndexOf(uuid, messageList), 0); + binding.messagesView.setSelectionFromTop(pos, pxOffset); + if (messageLoaderToast != null) { + messageLoaderToast.cancel(); + } + conversation.messagesLoaded.set(true); } - final String uuid = message != null ? message.getUuid() : null; - View v = binding.messagesView.getChildAt(childPos); - final int pxOffset = (v == null) ? 0 : v.getTop(); - ConversationFragment.this.conversation.populateWithMessages(ConversationFragment.this.messageList); - try { - updateStatusMessages(); - } catch (IllegalStateException e) { - Log.d(Config.LOGTAG, "caught illegal state exception while updating status messages"); - } - messageListAdapter.notifyDataSetChanged(); - int pos = Math.max(getIndexOf(uuid, messageList), 0); - binding.messagesView.setSmoothScrollbarEnabled(true); - binding.messagesView.setFastScrollEnabled(false); - binding.messagesView.setSelectionFromTop(pos, pxOffset); - if (messageLoaderToast != null) { - messageLoaderToast.cancel(); - } - conversation.messagesLoaded.set(true); }); } @@ -1863,7 +1863,12 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke if (pos >= 0) { Message message = null; for (int i = pos; i >= 0; --i) { - message = (Message) binding.messagesView.getItemAtPosition(i); + try { + message = (Message) binding.messagesView.getItemAtPosition(i); + } catch (ArrayIndexOutOfBoundsException e) { + //should not happen if we synchronize properly. however if that fails we just gonna try item -1 + continue; + } if (message.getType() != Message.TYPE_STATUS) { break; } -- cgit v1.2.3