Catch concurrent modification and abort

Stephen Paul Weber created

Someone added an attachment while we were sending or what?

Change summary

src/main/java/eu/siacs/conversations/ui/ConversationFragment.java | 35 
1 file changed, 20 insertions(+), 15 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/ui/ConversationFragment.java 🔗

@@ -1275,22 +1275,27 @@ public class ConversationFragment extends XmppFragment
                     final Runnable next = new Runnable() {
                         @Override
                         public void run() {
-                            final Attachment attachment = i.next();
-                            if (attachment.getType() == Attachment.Type.LOCATION) {
-                                attachLocationToConversation(conversation, attachment.getUri());
-                                if (i.hasNext()) runOnUiThread(this);
-                            } else if (attachment.getType() == Attachment.Type.IMAGE) {
-                                Log.d(
-                                      Config.LOGTAG,
-                                      "ConversationsActivity.commitAttachments() - attaching image to conversations. CHOOSE_IMAGE");
-                                attachImageToConversation(conversation, attachment.getUri(), attachment.getMime(), i.hasNext() ? this : null);
-                            } else {
-                                Log.d(
-                                      Config.LOGTAG,
-                                      "ConversationsActivity.commitAttachments() - attaching file to conversations. CHOOSE_FILE/RECORD_VOICE/RECORD_VIDEO");
-                                attachFileToConversation(conversation, attachment.getUri(), attachment.getMime(), i.hasNext() ? this : null);
+                            try {
+                                final Attachment attachment = i.next();
+                                if (attachment.getType() == Attachment.Type.LOCATION) {
+                                        attachLocationToConversation(conversation, attachment.getUri());
+                                    if (i.hasNext()) runOnUiThread(this);
+                                } else if (attachment.getType() == Attachment.Type.IMAGE) {
+                                    Log.d(
+                                          Config.LOGTAG,
+                                          "ConversationsActivity.commitAttachments() - attaching image to conversations. CHOOSE_IMAGE");
+                                    attachImageToConversation(conversation, attachment.getUri(), attachment.getMime(), i.hasNext() ? this : null);
+                                } else {
+                                    Log.d(
+                                          Config.LOGTAG,
+                                          "ConversationsActivity.commitAttachments() - attaching file to conversations. CHOOSE_FILE/RECORD_VOICE/RECORD_VIDEO");
+                                    attachFileToConversation(conversation, attachment.getUri(), attachment.getMime(), i.hasNext() ? this : null);
+                                }
+                                i.remove();
+                            } catch (final java.util.ConcurrentModificationException e) {
+                                // Abort, leave any unsent attachments alone for the user to try again
+                                Toast.makeText(activity, "Sometimes went wrong with some attachments. Try again?", Toast.LENGTH_SHORT).show();
                             }
-                            i.remove();
                             mediaPreviewAdapter.notifyDataSetChanged();
                             toggleInputMethod();
                         }