maintain order of conversations in share with dialog

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java | 31 
src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java           |  5 
2 files changed, 31 insertions(+), 5 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -55,6 +55,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Hashtable;
@@ -1650,10 +1651,23 @@ public class XmppConnectionService extends Service {
     }
 
 	public void populateWithOrderedConversations(final List<Conversation> list) {
-		populateWithOrderedConversations(list, true);
+		populateWithOrderedConversations(list, true, true);
 	}
 
-	public void populateWithOrderedConversations(final List<Conversation> list, boolean includeNoFileUpload) {
+	public void populateWithOrderedConversations(final List<Conversation> list, final boolean includeNoFileUpload) {
+        populateWithOrderedConversations(list, includeNoFileUpload, true);
+    }
+
+	public void populateWithOrderedConversations(final List<Conversation> list, final boolean includeNoFileUpload, final boolean sort) {
+        final List<String> orderedUuids;
+        if (sort) {
+            orderedUuids = null;
+        } else {
+            orderedUuids = new ArrayList<>();
+            for(Conversation conversation : list) {
+                orderedUuids.add(conversation.getUuid());
+            }
+        }
 		list.clear();
 		if (includeNoFileUpload) {
 			list.addAll(getConversations());
@@ -1666,7 +1680,18 @@ public class XmppConnectionService extends Service {
 			}
 		}
 		try {
-			Collections.sort(list);
+		    if (orderedUuids != null) {
+                Collections.sort(list, (a, b) -> {
+                    final int indexA = orderedUuids.indexOf(a.getUuid());
+                    final int indexB = orderedUuids.indexOf(b.getUuid());
+                    if (indexA == -1 || indexB == -1 || indexA == indexB) {
+                        return a.compareTo(b);
+                    }
+                    return indexA - indexB;
+                });
+            } else {
+                Collections.sort(list);
+            }
 		} catch (IllegalArgumentException e) {
 			//ignore
 		}

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

@@ -141,7 +141,7 @@ public class ShareWithActivity extends XmppActivity implements XmppConnectionSer
             this.share.uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
         }
         if (xmppConnectionServiceBound) {
-            xmppConnectionService.populateWithOrderedConversations(mConversations, this.share.uris.size() == 0);
+            xmppConnectionService.populateWithOrderedConversations(mConversations, this.share.uris.size() == 0, false);
         }
 
     }
@@ -195,7 +195,8 @@ public class ShareWithActivity extends XmppActivity implements XmppConnectionSer
     }
 
     public void refreshUiReal() {
-        xmppConnectionService.populateWithOrderedConversations(mConversations, this.share != null && this.share.uris.size() == 0);
+        //TODO inject desired order to not resort on refresh
+        xmppConnectionService.populateWithOrderedConversations(mConversations, this.share != null && this.share.uris.size() == 0, false);
         mAdapter.notifyDataSetChanged();
     }
 }