From 3d22d43868c409be0ffaec142d65edcf5c4da148 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 28 Jul 2016 14:30:18 -0300 Subject: [PATCH] Use Client Layer Events in ContactListFragment This prevents trying to access the same group metadata in different groups. Also, the conversation does not need to be reloaded once introduction messages arrive. Closes #535 --- .../android/contact/ContactListFragment.java | 56 +++++++++++++------ .../event/ForumInvitationReceivedEvent.java | 1 - .../api/event/InvitationReceivedEvent.java | 3 +- .../api/sharing/SharingMessage.java | 2 +- .../briarproject/sharing/InviteeEngine.java | 2 +- 5 files changed, 42 insertions(+), 22 deletions(-) diff --git a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java index 08e2d2650..e113a9a08 100644 --- a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java +++ b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java @@ -33,7 +33,9 @@ import org.briarproject.api.event.ContactStatusChangedEvent; import org.briarproject.api.event.Event; import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventListener; -import org.briarproject.api.event.MessageStateChangedEvent; +import org.briarproject.api.event.ForumInvitationReceivedEvent; +import org.briarproject.api.event.IntroductionRequestReceivedEvent; +import org.briarproject.api.event.IntroductionResponseReceivedEvent; import org.briarproject.api.event.PrivateMessageReceivedEvent; import org.briarproject.api.forum.ForumInvitationMessage; import org.briarproject.api.forum.ForumSharingManager; @@ -41,10 +43,11 @@ import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.introduction.IntroductionManager; import org.briarproject.api.introduction.IntroductionMessage; +import org.briarproject.api.introduction.IntroductionRequest; +import org.briarproject.api.introduction.IntroductionResponse; import org.briarproject.api.messaging.MessagingManager; import org.briarproject.api.messaging.PrivateMessageHeader; import org.briarproject.api.plugins.ConnectionRegistry; -import org.briarproject.api.sync.ClientId; import org.briarproject.api.sync.GroupId; import java.util.ArrayList; @@ -58,7 +61,6 @@ import static android.support.v4.app.ActivityOptionsCompat.makeSceneTransitionAn import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; import static org.briarproject.android.BriarActivity.GROUP_ID; -import static org.briarproject.api.sync.ValidationManager.State.DELIVERED; public class ContactListFragment extends BaseFragment implements EventListener { @@ -68,7 +70,7 @@ public class ContactListFragment extends BaseFragment implements EventListener { Logger.getLogger(ContactListFragment.class.getName()); @Inject - protected ConnectionRegistry connectionRegistry; + ConnectionRegistry connectionRegistry; @Inject protected EventBus eventBus; @@ -245,6 +247,7 @@ public class ContactListFragment extends BaseFragment implements EventListener { } } else if (e instanceof ContactStatusChangedEvent) { LOG.info("Contact Status changed, reloading"); + // TODO We can update the contact state without needing to reload loadContacts(); } else if (e instanceof ContactConnectedEvent) { setConnected(((ContactConnectedEvent) e).getContactId(), true); @@ -258,26 +261,31 @@ public class ContactListFragment extends BaseFragment implements EventListener { PrivateMessageReceivedEvent p = (PrivateMessageReceivedEvent) e; PrivateMessageHeader h = p.getMessageHeader(); updateItem(p.getGroupId(), ConversationItem.from(h)); - } else if (e instanceof MessageStateChangedEvent) { - MessageStateChangedEvent m = (MessageStateChangedEvent) e; - ClientId c = m.getClientId(); - if (m.getState() == DELIVERED && - (c.equals(introductionManager.getClientId()) || - c.equals(forumSharingManager.getClientId()))) { - LOG.info("Message added, reloading"); - reloadConversation(m.getMessage().getGroupId()); - } + } else if (e instanceof IntroductionRequestReceivedEvent) { + LOG.info("Introduction Request received, update contact"); + IntroductionRequestReceivedEvent m = + (IntroductionRequestReceivedEvent) e; + IntroductionRequest ir = m.getIntroductionRequest(); + updateItem(m.getContactId(), ConversationItem.from(ir)); + } else if (e instanceof IntroductionResponseReceivedEvent) { + LOG.info("Introduction Response received, update contact"); + IntroductionResponseReceivedEvent m = + (IntroductionResponseReceivedEvent) e; + IntroductionResponse ir = m.getIntroductionResponse(); + updateItem(m.getContactId(), ConversationItem.from(ir)); + } else if (e instanceof ForumInvitationReceivedEvent) { + LOG.info("Forum Invitation received, reloading conversation..."); + ForumInvitationReceivedEvent m = (ForumInvitationReceivedEvent) e; + reloadConversation(m.getContactId()); } } - private void reloadConversation(final GroupId g) { + private void reloadConversation(final ContactId c) { listener.runOnDbThread(new Runnable() { @Override public void run() { try { - ContactId c = messagingManager.getContactId(g); - Collection messages = - getMessages(c); + Collection messages = getMessages(c); updateItem(c, messages); } catch (NoSuchContactException e) { LOG.info("Contact removed"); @@ -304,6 +312,20 @@ public class ContactListFragment extends BaseFragment implements EventListener { }); } + private void updateItem(final ContactId c, final ConversationItem m) { + listener.runOnUiThread(new Runnable() { + @Override + public void run() { + int position = adapter.findItemPosition(c); + ContactListItem item = adapter.getItem(position); + if (item != null) { + item.addMessage(m); + adapter.updateItem(position, item); + } + } + }); + } + private void updateItem(final GroupId g, final ConversationItem m) { listener.runOnUiThread(new Runnable() { @Override diff --git a/briar-api/src/org/briarproject/api/event/ForumInvitationReceivedEvent.java b/briar-api/src/org/briarproject/api/event/ForumInvitationReceivedEvent.java index 63aa3bce1..d823a2a6b 100644 --- a/briar-api/src/org/briarproject/api/event/ForumInvitationReceivedEvent.java +++ b/briar-api/src/org/briarproject/api/event/ForumInvitationReceivedEvent.java @@ -2,7 +2,6 @@ package org.briarproject.api.event; import org.briarproject.api.contact.ContactId; import org.briarproject.api.forum.Forum; -import org.briarproject.api.introduction.IntroductionRequest; public class ForumInvitationReceivedEvent extends InvitationReceivedEvent { diff --git a/briar-api/src/org/briarproject/api/event/InvitationReceivedEvent.java b/briar-api/src/org/briarproject/api/event/InvitationReceivedEvent.java index 4b1b6df2d..834b71edd 100644 --- a/briar-api/src/org/briarproject/api/event/InvitationReceivedEvent.java +++ b/briar-api/src/org/briarproject/api/event/InvitationReceivedEvent.java @@ -1,13 +1,12 @@ package org.briarproject.api.event; import org.briarproject.api.contact.ContactId; -import org.briarproject.api.forum.Forum; public abstract class InvitationReceivedEvent extends Event { private final ContactId contactId; - public InvitationReceivedEvent(ContactId contactId) { + InvitationReceivedEvent(ContactId contactId) { this.contactId = contactId; } diff --git a/briar-api/src/org/briarproject/api/sharing/SharingMessage.java b/briar-api/src/org/briarproject/api/sharing/SharingMessage.java index 78433ff6f..2b14cefde 100644 --- a/briar-api/src/org/briarproject/api/sharing/SharingMessage.java +++ b/briar-api/src/org/briarproject/api/sharing/SharingMessage.java @@ -22,7 +22,7 @@ public interface SharingMessage { private final GroupId groupId; private final SessionId sessionId; - public BaseMessage(GroupId groupId, SessionId sessionId) { + BaseMessage(GroupId groupId, SessionId sessionId) { this.groupId = groupId; this.sessionId = sessionId; diff --git a/briar-core/src/org/briarproject/sharing/InviteeEngine.java b/briar-core/src/org/briarproject/sharing/InviteeEngine.java index e786d9a74..766a37e41 100644 --- a/briar-core/src/org/briarproject/sharing/InviteeEngine.java +++ b/briar-core/src/org/briarproject/sharing/InviteeEngine.java @@ -23,7 +23,7 @@ import static org.briarproject.api.sharing.SharingConstants.TASK_UNSHARE_SHAREAB import static org.briarproject.api.sharing.SharingMessage.BaseMessage; import static org.briarproject.api.sharing.SharingMessage.SimpleMessage; -public class InviteeEngine +class InviteeEngine implements ProtocolEngine { private static final Logger LOG =