provide fallback in case synchronizing around message list fails for some reason

This commit is contained in:
Daniel Gultsch 2018-04-06 13:24:57 +02:00
parent ceac602185
commit 829ab885fd
1 changed files with 32 additions and 25 deletions

View File

@ -131,7 +131,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
public static final String STATE_PHOTO_URI = ConversationFragment.class.getName() + ".take_photo_uri"; public static final String STATE_PHOTO_URI = ConversationFragment.class.getName() + ".take_photo_uri";
private static final String STATE_LAST_MESSAGE_UUID = "state_last_message_uuid"; private static final String STATE_LAST_MESSAGE_UUID = "state_last_message_uuid";
final protected List<Message> messageList = new ArrayList<>(); private final List<Message> messageList = new ArrayList<>();
private final PendingItem<ActivityResult> postponedActivityResult = new PendingItem<>(); private final PendingItem<ActivityResult> postponedActivityResult = new PendingItem<>();
private final PendingItem<String> pendingConversationsUuid = new PendingItem<>(); private final PendingItem<String> pendingConversationsUuid = new PendingItem<>();
private final PendingItem<Bundle> pendingExtras = new PendingItem<>(); private final PendingItem<Bundle> pendingExtras = new PendingItem<>();
@ -214,31 +214,33 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
return; return;
} }
runOnUiThread(() -> { runOnUiThread(() -> {
final int oldPosition = binding.messagesView.getFirstVisiblePosition(); synchronized (messageList) {
Message message = null; final int oldPosition = binding.messagesView.getFirstVisiblePosition();
int childPos; Message message = null;
for (childPos = 0; childPos + oldPosition < messageList.size(); ++childPos) { int childPos;
message = messageList.get(oldPosition + childPos); for (childPos = 0; childPos + oldPosition < messageList.size(); ++childPos) {
if (message.getType() != Message.TYPE_STATUS) { message = messageList.get(oldPosition + childPos);
break; 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.setSelectionFromTop(pos, pxOffset);
if (messageLoaderToast != null) {
messageLoaderToast.cancel();
}
conversation.messagesLoaded.set(true);
}); });
} }
@ -1586,7 +1588,12 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
if (pos >= 0) { if (pos >= 0) {
Message message = null; Message message = null;
for (int i = pos; i >= 0; --i) { 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) { if (message.getType() != Message.TYPE_STATUS) {
break; break;
} }