From 0d4cb05ac06a0c6a6c7305185f5a5141bf4417da Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 15 Oct 2019 16:25:10 -0300 Subject: [PATCH] [android] fix possible duplicates in list When doing reloads of list items such as when adding test contacts, we loaded different versions of those items and added them to the list. According to the documentation https://developer.android.com/reference/android/support/v7/util/SortedList.html#add > If the sorting criteria of the item is changed, > SortedList won't be able to find its duplicate in the list > which will result in having a duplicate of the Item in the list. For the contact list at least, new contacts caused reloads of the entire list and new messages caused the contacts to be sorted differently. Thus we ended up with duplicate contacts in the list. This commit fixes this by replacing the contacts in the list instead of adding them. It applies the same fix to forums and private groups which use the same logic and are thus also affected. Fixes #1210 --- .../briar/android/contact/ContactListFragment.java | 2 +- .../briarproject/briar/android/forum/ForumListFragment.java | 2 +- .../briar/android/privategroup/list/GroupListFragment.java | 2 +- .../org/briarproject/briar/android/util/BriarAdapter.java | 4 ++++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java index 7b5f1b523..a4d5116b3 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java @@ -267,7 +267,7 @@ public class ContactListFragment extends BaseFragment implements EventListener, if (revision == adapter.getRevision()) { adapter.incrementRevision(); if (contacts.isEmpty()) list.showData(); - else adapter.addAll(contacts); + else adapter.replaceAll(contacts); } else { LOG.info("Concurrent update, reloading"); loadContacts(); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListFragment.java index b5d86fde1..9b02d4151 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListFragment.java @@ -182,7 +182,7 @@ public class ForumListFragment extends BaseEventFragment implements if (revision == adapter.getRevision()) { adapter.incrementRevision(); if (forums.isEmpty()) list.showData(); - else adapter.addAll(forums); + else adapter.replaceAll(forums); } else { LOG.info("Concurrent update, reloading"); loadForums(); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListFragment.java index f6a1f3a0f..83f9e44e6 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListFragment.java @@ -194,7 +194,7 @@ public class GroupListFragment extends BaseFragment implements if (revision == adapter.getRevision()) { adapter.incrementRevision(); if (groups.isEmpty()) list.showData(); - else adapter.addAll(groups); + else adapter.replaceAll(groups); } else { LOG.info("Concurrent update, reloading"); loadGroups(); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/util/BriarAdapter.java b/briar-android/src/main/java/org/briarproject/briar/android/util/BriarAdapter.java index 889fd57f5..eb8276e19 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/util/BriarAdapter.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/util/BriarAdapter.java @@ -79,6 +79,10 @@ public abstract class BriarAdapter this.items.addAll(items); } + public void replaceAll(Collection items) { + this.items.replaceAll(items); + } + public void setItems(Collection items) { this.items.beginBatchedUpdates(); this.items.clear();