Merge branch '227-update-contact-list' into 'master'

Update contact list when contacts are deleted. #227

The logic in ConversationActivity for adding or updating items didn't allow for items being removed. We *could* come up with logic for doing that - throw all the items from the adapter into a set, remove any items corresponding to current contacts from the set, then batch update the adapter to remove any items remaining in the set - but I think it would be overly complex. It's simpler to just clear the adapter and add the current contacts.

Also tidied up some adapter code while looking for the bug.


See merge request !70
This commit is contained in:
akwizgran
2016-01-21 12:00:58 +00:00
9 changed files with 35 additions and 75 deletions

View File

@@ -36,7 +36,6 @@ import java.util.logging.Logger;
import javax.inject.Inject;
import static android.support.v7.util.SortedList.INVALID_POSITION;
import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING;
@@ -91,7 +90,6 @@ public class ContactListActivity extends BriarActivity
public void onResume() {
super.onResume();
eventBus.addListener(this);
loadContacts();
}
@@ -133,26 +131,9 @@ public class ContactListActivity extends BriarActivity
private void displayContacts(final List<ContactListItem> contacts) {
runOnUiThread(new Runnable() {
public void run() {
if (contacts.size() > 0) {
if (adapter.getItemCount() > 0) {
// update existing items rather than just adding them,
// because different timestamps in added items change
// sorting criteria and cause duplicates
for (ContactListItem contact : contacts) {
int position = adapter.findItemPosition(contact);
if (position == INVALID_POSITION) {
adapter.add(contact);
} else {
adapter.updateItem(position, contact);
}
}
} else {
adapter.addAll(contacts);
}
} else {
// no contacts to display, make sure progress bar is hidden
list.showData();
}
adapter.clear();
if (contacts.size() == 0) list.showData();
else adapter.addAll(contacts);
}
});
}
@@ -217,10 +198,9 @@ public class ContactListActivity extends BriarActivity
private void removeItem(final ContactId c) {
runOnUiThread(new Runnable() {
public void run() {
ContactListItem item = adapter.findItem(c);
if (item != null) {
adapter.remove(item);
}
int position = adapter.findItemPosition(c);
ContactListItem item = adapter.getItem(position);
if (item != null) adapter.remove(item);
}
});
}

View File

@@ -23,7 +23,7 @@ import static android.support.v7.util.SortedList.INVALID_POSITION;
public class ContactListAdapter
extends RecyclerView.Adapter<ContactListAdapter.ContactHolder> {
private SortedList<ContactListItem> contacts =
private final SortedList<ContactListItem> contacts =
new SortedList<ContactListItem>(ContactListItem.class,
new SortedList.Callback<ContactListItem>() {
@Override
@@ -141,11 +141,7 @@ public class ContactListAdapter
@Override
public int getItemCount() {
return contacts == null ? 0 : contacts.size();
}
public boolean isEmpty() {
return contacts == null || contacts.size() == 0;
return contacts.size();
}
public ContactListItem getItem(int position) {
@@ -159,15 +155,6 @@ public class ContactListAdapter
contacts.updateItemAt(position, item);
}
public ContactListItem findItem(ContactId c) {
int count = getItemCount();
for (int i = 0; i < count; i++) {
ContactListItem item = getItem(i);
if (item.getContact().getId().equals(c)) return item;
}
return null; // Not found
}
public int findItemPosition(ContactListItem item) {
return contacts.indexOf(item);
}
@@ -181,16 +168,16 @@ public class ContactListAdapter
return INVALID_POSITION; // Not found
}
public void addAll(final List<ContactListItem> contacts) {
public void addAll(List<ContactListItem> contacts) {
this.contacts.addAll(contacts);
}
public void add(final ContactListItem contact) {
this.contacts.add(contact);
public void add(ContactListItem contact) {
contacts.add(contact);
}
public void remove(final ContactListItem contact) {
this.contacts.remove(contact);
public void remove(ContactListItem contact) {
contacts.remove(contact);
}
public void clear() {

View File

@@ -14,6 +14,8 @@ import org.briarproject.R;
import org.briarproject.api.messaging.PrivateMessageHeader;
import org.briarproject.util.StringUtils;
import static android.support.v7.util.SortedList.INVALID_POSITION;
class ConversationAdapter extends
RecyclerView.Adapter<ConversationAdapter.MessageHolder> {
@@ -21,7 +23,7 @@ class ConversationAdapter extends
private static final int MSG_IN = 1;
private static final int MSG_IN_UNREAD = 2;
private SortedList<ConversationItem> messages =
private final SortedList<ConversationItem> messages =
new SortedList<ConversationItem>(ConversationItem.class,
new SortedList.Callback<ConversationItem>() {
@Override
@@ -145,14 +147,13 @@ class ConversationAdapter extends
@Override
public int getItemCount() {
return messages == null ? 0 : messages.size();
}
public boolean isEmpty() {
return messages == null || messages.size() == 0;
return messages.size();
}
public ConversationItem getItem(int position) {
if (position == INVALID_POSITION || messages.size() <= position) {
return null; // Not found
}
return messages.get(position);
}
@@ -168,10 +169,6 @@ class ConversationAdapter extends
this.messages.add(message);
}
public void remove(final ConversationItem message) {
this.messages.remove(message);
}
public void clear() {
this.messages.beginBatchedUpdates();

View File

@@ -111,7 +111,6 @@ implements EventListener, OnItemClickListener {
for (ForumContacts f : available)
adapter.add(new AvailableForumsItem(f));
adapter.sort(AvailableForumsItemComparator.INSTANCE);
adapter.notifyDataSetChanged();
}
}
});

View File

@@ -220,7 +220,6 @@ public class ForumActivity extends BriarActivity implements EventListener,
// Scroll to the bottom
list.setSelection(adapter.getCount() - 1);
}
adapter.notifyDataSetChanged();
}
});
}

View File

@@ -180,7 +180,6 @@ public class ForumListActivity extends BriarActivity
available.setVisibility(GONE);
loading.setVisibility(VISIBLE);
adapter.clear();
adapter.notifyDataSetChanged();
}
});
}
@@ -197,7 +196,6 @@ public class ForumListActivity extends BriarActivity
// Add a new item
adapter.add(new ForumListItem(f, headers));
adapter.sort(ForumListItemComparator.INSTANCE);
adapter.notifyDataSetChanged();
selectFirstUnread();
}
});
@@ -298,7 +296,6 @@ public class ForumListActivity extends BriarActivity
ForumListItem item = findForum(g);
if (item != null) {
adapter.remove(item);
adapter.notifyDataSetChanged();
if (adapter.isEmpty()) {
empty.setVisibility(VISIBLE);
list.setVisibility(GONE);

View File

@@ -192,7 +192,6 @@ implements OnItemSelectedListener, OnClickListener {
for (LocalAuthor a : localAuthors)
adapter.add(new LocalAuthorItem(a));
adapter.sort(LocalAuthorItemComparator.INSTANCE);
adapter.notifyDataSetChanged();
int count = adapter.getCount();
for (int i = 0; i < count; i++) {
LocalAuthorItem item = adapter.getItem(i);

View File

@@ -1,17 +1,5 @@
package org.briarproject.android.identity;
import static android.text.TextUtils.TruncateAt.END;
import static org.briarproject.android.identity.LocalAuthorItem.ANONYMOUS;
import static org.briarproject.android.identity.LocalAuthorItem.NEW;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.briarproject.R;
import org.briarproject.android.util.LayoutUtils;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
@@ -19,6 +7,18 @@ import android.widget.BaseAdapter;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
import org.briarproject.R;
import org.briarproject.android.util.LayoutUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import static android.text.TextUtils.TruncateAt.END;
import static org.briarproject.android.identity.LocalAuthorItem.ANONYMOUS;
import static org.briarproject.android.identity.LocalAuthorItem.NEW;
public class LocalAuthorSpinnerAdapter extends BaseAdapter
implements SpinnerAdapter {
@@ -33,10 +33,12 @@ implements SpinnerAdapter {
public void add(LocalAuthorItem item) {
list.add(item);
notifyDataSetChanged();
}
public void clear() {
list.clear();
notifyDataSetChanged();
}
public int getCount() {
@@ -94,5 +96,6 @@ implements SpinnerAdapter {
public void sort(Comparator<LocalAuthorItem> comparator) {
Collections.sort(list, comparator);
notifyDataSetChanged();
}
}

View File

@@ -66,7 +66,6 @@ implements OnItemSelectedListener, OnClickListener {
adapter.clear();
for (LocalAuthor a : authors) adapter.add(new LocalAuthorItem(a));
adapter.sort(LocalAuthorItemComparator.INSTANCE);
adapter.notifyDataSetChanged();
// If a local author has been selected, select it again
AuthorId localAuthorId = container.getLocalAuthorId();
if (localAuthorId == null) return;