diff --git a/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationControllerImpl.java b/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationControllerImpl.java index 1fa3eb5c48dcc9026ec258d707a5b7b230c15332..d77f04c25d8293f1233a296df8ae8ca1267eb7ae 100644 --- a/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationControllerImpl.java +++ b/briar-android/src/org/briarproject/android/privategroup/invitation/GroupInvitationControllerImpl.java @@ -7,7 +7,8 @@ import org.briarproject.api.db.DatabaseExecutor; import org.briarproject.api.db.DbException; import org.briarproject.api.event.Event; import org.briarproject.api.event.EventBus; -import org.briarproject.api.event.GroupInvitationReceivedEvent; +import org.briarproject.api.event.GroupInvitationRequestReceivedEvent; +import org.briarproject.api.event.GroupInvitationResponseReceivedEvent; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.privategroup.PrivateGroup; import org.briarproject.api.privategroup.PrivateGroupManager; @@ -44,8 +45,11 @@ public class GroupInvitationControllerImpl public void eventOccurred(Event e) { super.eventOccurred(e); - if (e instanceof GroupInvitationReceivedEvent) { - LOG.info("Group invitation received, reloading"); + if (e instanceof GroupInvitationRequestReceivedEvent) { + LOG.info("Group invitation request received, reloading"); + listener.loadInvitations(false); + } else if (e instanceof GroupInvitationResponseReceivedEvent) { + LOG.info("Group invitation response received, reloading"); listener.loadInvitations(false); } } diff --git a/briar-api/src/org/briarproject/api/event/GroupInvitationReceivedEvent.java b/briar-api/src/org/briarproject/api/event/GroupInvitationRequestReceivedEvent.java similarity index 58% rename from briar-api/src/org/briarproject/api/event/GroupInvitationReceivedEvent.java rename to briar-api/src/org/briarproject/api/event/GroupInvitationRequestReceivedEvent.java index c8244a39248f621d4a829002afb232eed4f7208c..1fc2599c22f77ee4183c7da1836caa31b5a57af8 100644 --- a/briar-api/src/org/briarproject/api/event/GroupInvitationReceivedEvent.java +++ b/briar-api/src/org/briarproject/api/event/GroupInvitationRequestReceivedEvent.java @@ -1,15 +1,14 @@ package org.briarproject.api.event; import org.briarproject.api.contact.ContactId; -import org.briarproject.api.forum.ForumInvitationRequest; import org.briarproject.api.privategroup.PrivateGroup; import org.briarproject.api.privategroup.invitation.GroupInvitationRequest; -public class GroupInvitationReceivedEvent extends +public class GroupInvitationRequestReceivedEvent extends InvitationRequestReceivedEvent<PrivateGroup> { - public GroupInvitationReceivedEvent(PrivateGroup group, ContactId contactId, - GroupInvitationRequest request) { + public GroupInvitationRequestReceivedEvent(PrivateGroup group, + ContactId contactId, GroupInvitationRequest request) { super(group, contactId, request); } diff --git a/briar-api/src/org/briarproject/api/event/GroupInvitationResponseReceivedEvent.java b/briar-api/src/org/briarproject/api/event/GroupInvitationResponseReceivedEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..a72fd313af7b3899b85fc7539b756270456f99cd --- /dev/null +++ b/briar-api/src/org/briarproject/api/event/GroupInvitationResponseReceivedEvent.java @@ -0,0 +1,13 @@ +package org.briarproject.api.event; + +import org.briarproject.api.contact.ContactId; +import org.briarproject.api.sharing.InvitationResponse; + +public class GroupInvitationResponseReceivedEvent + extends InvitationResponseReceivedEvent { + + public GroupInvitationResponseReceivedEvent(ContactId contactId, + InvitationResponse response) { + super(contactId, response); + } +} diff --git a/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java b/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java index 7f86b5a9e45daba4ed905e57afd8537b19ece302..b3048c7779a76b9e878f5cbe0037fb3769ace04c 100644 --- a/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java +++ b/briar-core/src/org/briarproject/privategroup/invitation/AbstractProtocolEngine.java @@ -41,10 +41,10 @@ abstract class AbstractProtocolEngine<S extends Session> protected final DatabaseComponent db; protected final ClientHelper clientHelper; protected final PrivateGroupManager privateGroupManager; + protected final PrivateGroupFactory privateGroupFactory; - private final IdentityManager identityManager; - private final PrivateGroupFactory privateGroupFactory; private final GroupMessageFactory groupMessageFactory; + private final IdentityManager identityManager; private final MessageParser messageParser; private final MessageEncoder messageEncoder; private final Clock clock; diff --git a/briar-core/src/org/briarproject/privategroup/invitation/CreatorProtocolEngine.java b/briar-core/src/org/briarproject/privategroup/invitation/CreatorProtocolEngine.java index 72153ea4d40a72edee85266434e2441150029886..e3e6c0540443c144196cafced5c7fd85ac70ce5c 100644 --- a/briar-core/src/org/briarproject/privategroup/invitation/CreatorProtocolEngine.java +++ b/briar-core/src/org/briarproject/privategroup/invitation/CreatorProtocolEngine.java @@ -3,14 +3,18 @@ package org.briarproject.privategroup.invitation; import org.briarproject.api.FormatException; import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.clients.ProtocolStateException; +import org.briarproject.api.clients.SessionId; +import org.briarproject.api.contact.ContactId; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; import org.briarproject.api.db.Transaction; +import org.briarproject.api.event.GroupInvitationResponseReceivedEvent; import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.nullsafety.NotNullByDefault; import org.briarproject.api.privategroup.GroupMessageFactory; import org.briarproject.api.privategroup.PrivateGroupFactory; import org.briarproject.api.privategroup.PrivateGroupManager; +import org.briarproject.api.privategroup.invitation.GroupInvitationResponse; import org.briarproject.api.sync.Message; import org.briarproject.api.system.Clock; @@ -35,7 +39,7 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> { IdentityManager identityManager, MessageParser messageParser, MessageEncoder messageEncoder, Clock clock) { super(db, clientHelper, privateGroupManager, privateGroupFactory, - groupMessageFactory, identityManager,messageParser, + groupMessageFactory, identityManager, messageParser, messageEncoder, clock); } @@ -170,10 +174,14 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> { // The dependency, if any, must be the last remote message if (!isValidDependency(s, m.getPreviousMessageId())) return abort(txn, s); - // Mark the response visible + // Mark the response visible in the UI markMessageVisibleInUi(txn, m.getId(), true); // Start syncing the private group with the contact syncPrivateGroupWithContact(txn, s, true); + // Broadcast an event + ContactId contactId = getContactId(txn, m.getContactGroupId()); + txn.attach(new GroupInvitationResponseReceivedEvent(contactId, + createInvitationResponse(m, contactId, true))); // Move to the INVITEE_JOINED state return new CreatorSession(s.getContactGroupId(), s.getPrivateGroupId(), s.getLastLocalMessageId(), m.getId(), s.getLocalTimestamp(), @@ -187,8 +195,12 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> { // The dependency, if any, must be the last remote message if (!isValidDependency(s, m.getPreviousMessageId())) return abort(txn, s); - // Mark the response visible + // Mark the response visible in the UI markMessageVisibleInUi(txn, m.getId(), true); + // Broadcast an event + ContactId contactId = getContactId(txn, m.getContactGroupId()); + txn.attach(new GroupInvitationResponseReceivedEvent(contactId, + createInvitationResponse(m, contactId, false))); // Move to the START state return new CreatorSession(s.getContactGroupId(), s.getPrivateGroupId(), s.getLastLocalMessageId(), m.getId(), s.getLocalTimestamp(), @@ -224,4 +236,12 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> { sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(), s.getInviteTimestamp(), ERROR); } + + private GroupInvitationResponse createInvitationResponse( + GroupInvitationMessage m, ContactId c, boolean accept) { + SessionId sessionId = new SessionId(m.getPrivateGroupId().getBytes()); + return new GroupInvitationResponse(m.getId(), sessionId, + m.getContactGroupId(), c, accept, m.getTimestamp(), false, + false, true, false); + } } diff --git a/briar-core/src/org/briarproject/privategroup/invitation/InviteeProtocolEngine.java b/briar-core/src/org/briarproject/privategroup/invitation/InviteeProtocolEngine.java index f42cb2431b4e79b11afb90ddf36632d64ffa9033..1526e23bd923ac65e3c4257d6f68a01643379e0a 100644 --- a/briar-core/src/org/briarproject/privategroup/invitation/InviteeProtocolEngine.java +++ b/briar-core/src/org/briarproject/privategroup/invitation/InviteeProtocolEngine.java @@ -3,16 +3,20 @@ package org.briarproject.privategroup.invitation; import org.briarproject.api.FormatException; import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.clients.ProtocolStateException; +import org.briarproject.api.clients.SessionId; import org.briarproject.api.contact.ContactId; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; import org.briarproject.api.db.Transaction; +import org.briarproject.api.event.GroupInvitationRequestReceivedEvent; import org.briarproject.api.identity.Author; import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.nullsafety.NotNullByDefault; import org.briarproject.api.privategroup.GroupMessageFactory; +import org.briarproject.api.privategroup.PrivateGroup; import org.briarproject.api.privategroup.PrivateGroupFactory; import org.briarproject.api.privategroup.PrivateGroupManager; +import org.briarproject.api.privategroup.invitation.GroupInvitationRequest; import org.briarproject.api.sync.Message; import org.briarproject.api.sync.MessageId; import org.briarproject.api.system.Clock; @@ -196,6 +200,11 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> { // Mark the invite message visible in the UI and available to answer markMessageVisibleInUi(txn, m.getId(), true); markMessageAvailableToAnswer(txn, m.getId(), true); + // Broadcast an event + PrivateGroup privateGroup = privateGroupFactory.createPrivateGroup( + m.getGroupName(), m.getCreator(), m.getSalt()); + txn.attach(new GroupInvitationRequestReceivedEvent(privateGroup, + contactId, createInvitationRequest(m, contactId))); // Move to the INVITED state return new InviteeSession(s.getContactGroupId(), s.getPrivateGroupId(), s.getLastLocalMessageId(), m.getId(), s.getLocalTimestamp(), @@ -239,4 +248,13 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> { sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(), s.getInviteTimestamp(), ERROR); } + + private GroupInvitationRequest createInvitationRequest(InviteMessage m, + ContactId c) { + SessionId sessionId = new SessionId(m.getPrivateGroupId().getBytes()); + return new GroupInvitationRequest(m.getId(), sessionId, + m.getContactGroupId(), c, m.getMessage(), m.getGroupName(), + m.getCreator(), true, m.getTimestamp(), false, false, true, + false); + } }