From 6660625ba6a7eacef73a0e6925e6658bf69c66cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20K=C3=BCrten?= Date: Tue, 8 Dec 2020 18:29:20 +0100 Subject: [PATCH] Update avatar in contact list when changed while list is open --- .../bramble/api/nullsafety/NullSafety.java | 8 ++++++++ .../android/contact/BaseContactListAdapter.java | 11 ----------- .../briar/android/contact/ContactListAdapter.java | 7 ++++++- .../briar/android/contact/ContactListFragment.java | 11 ----------- .../briar/android/contact/ContactListItem.java | 12 ++++++++++++ .../briar/android/contact/ContactListViewModel.java | 5 +++++ 6 files changed, 31 insertions(+), 23 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/nullsafety/NullSafety.java b/bramble-api/src/main/java/org/briarproject/bramble/api/nullsafety/NullSafety.java index 5ff717a96..e54bad748 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/nullsafety/NullSafety.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/nullsafety/NullSafety.java @@ -29,4 +29,12 @@ public class NullSafety { public static void requireNull(@Nullable Object o) { if (o != null) throw new AssertionError(); } + + /** + * Stand-in for {@code Objects.equals()}. + */ + public static boolean equals(@Nullable Object a, @Nullable Object b) { + return (a == b) || (a != null && a.equals(b)); + } + } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/BaseContactListAdapter.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/BaseContactListAdapter.java index 2ddac95bc..056d4c77a 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/BaseContactListAdapter.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/BaseContactListAdapter.java @@ -3,14 +3,12 @@ package org.briarproject.briar.android.contact; import android.content.Context; import android.view.View; -import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.briar.android.util.BriarAdapter; import javax.annotation.Nullable; import androidx.annotation.NonNull; -import static androidx.recyclerview.widget.SortedList.INVALID_POSITION; import static org.briarproject.briar.android.util.UiUtils.getContactDisplayName; public abstract class BaseContactListAdapter> @@ -47,15 +45,6 @@ public abstract class BaseContactListAdapter { void onItemClick(View view, I item); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListAdapter.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListAdapter.java index 5ea246827..13b64815e 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListAdapter.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListAdapter.java @@ -5,6 +5,7 @@ import android.view.View; import android.view.ViewGroup; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.nullsafety.NullSafety; import org.briarproject.briar.R; import org.briarproject.briar.android.contact.BaseContactListAdapter.OnContactClickListener; @@ -48,7 +49,11 @@ public class ContactListAdapter extends if (c1.getTimestamp() != c2.getTimestamp()) { return false; } - return c1.isConnected() == c2.isConnected(); + if (c1.isConnected() != c2.isConnected()) { + return false; + } + return NullSafety.equals(c1.getAuthorInfo().getAvatarHeader(), + c2.getAuthorInfo().getAvatarHeader()); } } 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 c0bdd447a..1a803c9a6 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 @@ -23,17 +23,6 @@ import org.briarproject.briar.android.fragment.BaseFragment; import org.briarproject.briar.android.keyagreement.ContactExchangeActivity; import org.briarproject.briar.android.util.BriarSnackbarBuilder; import org.briarproject.briar.android.view.BriarRecyclerView; -import org.briarproject.briar.api.android.AndroidNotificationManager; -import org.briarproject.briar.api.client.MessageTracker.GroupCount; -import org.briarproject.briar.api.conversation.ConversationManager; -import org.briarproject.briar.api.conversation.ConversationMessageHeader; -import org.briarproject.briar.api.conversation.event.ConversationMessageReceivedEvent; -import org.briarproject.briar.api.identity.AuthorInfo; -import org.briarproject.briar.api.identity.AuthorManager; - -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Logger; import javax.annotation.Nullable; import javax.inject.Inject; diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListItem.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListItem.java index 0cad1f26c..8ca5cd004 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListItem.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListItem.java @@ -2,6 +2,7 @@ package org.briarproject.briar.android.contact; import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.briar.api.attachment.AttachmentHeader; import org.briarproject.briar.api.client.MessageTracker.GroupCount; import org.briarproject.briar.api.conversation.ConversationMessageHeader; import org.briarproject.briar.api.identity.AuthorInfo; @@ -44,6 +45,17 @@ public class ContactListItem extends ContactItem Math.max(h.getTimestamp(), item.timestamp)); } + /** + * Creates a new copy of the given item with a new avatar + * referenced by the given attachment header. + */ + ContactListItem(ContactListItem item, + AttachmentHeader attachmentHeader) { + this(item.getContact(), new AuthorInfo(item.getAuthorInfo().getStatus(), + item.getAuthorInfo().getAlias(), attachmentHeader), + item.isConnected(), item.empty, item.unread, item.timestamp); + } + boolean isEmpty() { return empty; } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListViewModel.java index 28239d261..71a1c5740 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListViewModel.java @@ -25,6 +25,7 @@ import org.briarproject.bramble.api.system.AndroidExecutor; import org.briarproject.briar.android.viewmodel.DbViewModel; import org.briarproject.briar.android.viewmodel.LiveResult; import org.briarproject.briar.api.android.AndroidNotificationManager; +import org.briarproject.briar.api.avatar.event.AvatarUpdatedEvent; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.conversation.ConversationManager; import org.briarproject.briar.api.conversation.ConversationMessageHeader; @@ -139,6 +140,10 @@ class ContactListViewModel extends DbViewModel implements EventListener { } else if (e instanceof PendingContactAddedEvent || e instanceof PendingContactRemovedEvent) { checkForPendingContacts(); + } else if (e instanceof AvatarUpdatedEvent) { + AvatarUpdatedEvent a = (AvatarUpdatedEvent) e; + updateItem(a.getContactId(), item -> new ContactListItem(item, + a.getAttachmentHeader()), false); } }