diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationActivity.java index 48a133462a55be0b081eb43b5091dc3622bf2e3f..2b7fdfc5333c1df5b8139efaa9dec5f611c3abfd 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationActivity.java @@ -855,8 +855,9 @@ public class ConversationActivity extends BriarActivity @UiThread @Override - public void open(ConversationRequestItem item) { - if (item.getRequestedGroupId() == null) return; + public void openRequestedShareable(ConversationRequestItem item) { + if (item.getRequestedGroupId() == null) + throw new IllegalArgumentException(); Intent i; switch (item.getRequestType()) { case FORUM: diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationAdapter.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationAdapter.java index b748a358c5078f551074bda21d898b30076b41d0..6bb414ad63bd1e848eea62e40a34f41b82f8bdc7 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationAdapter.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationAdapter.java @@ -140,7 +140,7 @@ class ConversationAdapter void respondToRequest(ConversationRequestItem item, boolean accept); - void open(ConversationRequestItem item); + void openRequestedShareable(ConversationRequestItem item); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationItem.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationItem.java index 56fdfa0588e0965a2ad08d6e318511ac4bbd7938..6adad35b62b986ecf98e84d36cb9a8bd6836b5dd 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationItem.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationItem.java @@ -112,7 +112,7 @@ abstract class ConversationItem { return new ConversationRequestItem(ir.getMessageId(), ir.getGroupId(), INTRODUCTION, ir.getSessionId(), text, ir.getMessage(), ir.getTimestamp(), ir.isRead(), null, - ir.wasAnswered()); + ir.wasAnswered(), false); } } @@ -203,7 +203,8 @@ abstract class ConversationItem { return new ConversationRequestItem(ir.getId(), ir.getGroupId(), type, ir.getSessionId(), text, ir.getMessage(), ir.getTimestamp(), ir.isRead(), - ir.getInvitedGroupId(), !ir.isAvailable()); + ir.getInvitedGroupId(), !ir.isAvailable(), + ir.canBeOpened()); } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationRequestItem.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationRequestItem.java index 54203056f0d1c1ca1c74ead2d304115db23d69f1..c0575eeb39236598a8a0a56ce5b73170193ffa0a 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationRequestItem.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationRequestItem.java @@ -21,17 +21,19 @@ class ConversationRequestItem extends ConversationNoticeInItem { private final GroupId requestedGroupId; private final RequestType requestType; private final SessionId sessionId; - private boolean answered; + private final boolean answered, canBeOpened; ConversationRequestItem(MessageId id, GroupId groupId, RequestType requestType, SessionId sessionId, String text, @Nullable String msgText, long time, boolean read, - @Nullable GroupId requestedGroupId, boolean answered) { + @Nullable GroupId requestedGroupId, boolean answered, + boolean canBeOpened) { super(id, groupId, text, msgText, time, read); this.requestType = requestType; this.sessionId = sessionId; this.requestedGroupId = requestedGroupId; this.answered = answered; + this.canBeOpened = canBeOpened; } RequestType getRequestType() { @@ -51,8 +53,8 @@ class ConversationRequestItem extends ConversationNoticeInItem { return answered; } - void setAnswered(boolean answered) { - this.answered = answered; + public boolean canBeOpened() { + return canBeOpened; } @LayoutRes diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationRequestViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationRequestViewHolder.java index e60ad04e920553915091a78669604bddb578dab3..117995b4d6f3d4ba31de9a895b4a02f06de86c8e 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationRequestViewHolder.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ConversationRequestViewHolder.java @@ -11,7 +11,6 @@ import org.briarproject.briar.android.contact.ConversationAdapter.ConversationLi import static android.view.View.GONE; import static android.view.View.VISIBLE; -import static org.briarproject.briar.android.contact.ConversationRequestItem.RequestType.INTRODUCTION; @UiThread @NotNullByDefault @@ -33,27 +32,25 @@ class ConversationRequestViewHolder extends ConversationNoticeInViewHolder { final ConversationRequestItem item = (ConversationRequestItem) conversationItem; - if (item.getRequestType() == INTRODUCTION && item.wasAnswered()) { - acceptButton.setVisibility(GONE); - declineButton.setVisibility(GONE); - } else if (item.wasAnswered()) { + if (item.wasAnswered() && item.canBeOpened()) { acceptButton.setVisibility(VISIBLE); acceptButton.setText(R.string.open); acceptButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - item.setAnswered(true); - listener.open(item); + listener.openRequestedShareable(item); } }); declineButton.setVisibility(GONE); + } else if (item.wasAnswered()) { + acceptButton.setVisibility(GONE); + declineButton.setVisibility(GONE); } else { acceptButton.setVisibility(VISIBLE); acceptButton.setText(R.string.accept); acceptButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - item.setAnswered(true); listener.respondToRequest(item, true); } }); @@ -61,7 +58,6 @@ class ConversationRequestViewHolder extends ConversationNoticeInViewHolder { declineButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - item.setAnswered(true); listener.respondToRequest(item, false); } }); diff --git a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogInvitationRequest.java b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogInvitationRequest.java index 12b389134fd9613cc74d18f5426a95e9c60580a7..d0fabc9cb567257e5af283b1959f964b256bf358 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogInvitationRequest.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogInvitationRequest.java @@ -16,12 +16,12 @@ public class BlogInvitationRequest extends InvitationRequest { public BlogInvitationRequest(MessageId id, SessionId sessionId, GroupId groupId, ContactId contactId, String blogAuthorName, - @Nullable String message, @Nullable GroupId blogId, - boolean available, long time, boolean local, boolean sent, - boolean seen, boolean read) { + @Nullable String message, GroupId blogId, + boolean available, boolean canBeOpened, long time, + boolean local, boolean sent, boolean seen, boolean read) { super(id, sessionId, groupId, contactId, message, blogId, available, - time, local, sent, seen, read); + canBeOpened, time, local, sent, seen, read); this.blogAuthorName = blogAuthorName; } diff --git a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumInvitationRequest.java b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumInvitationRequest.java index ae45c67da4f94af8369a084d4bb5d2666ba21421..72c913c6f8163a4228561f2e1bc4edbefe401d69 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumInvitationRequest.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumInvitationRequest.java @@ -19,11 +19,11 @@ public class ForumInvitationRequest extends InvitationRequest { public ForumInvitationRequest(MessageId id, SessionId sessionId, GroupId groupId, ContactId contactId, GroupId forumId, String forumName, @Nullable String message, boolean available, - long time, boolean local, boolean sent, boolean seen, - boolean read) { + boolean canBeOpened, long time, boolean local, boolean sent, + boolean seen, boolean read) { super(id, sessionId, groupId, contactId, message, forumId, available, - time, local, sent, seen, read); + canBeOpened, time, local, sent, seen, read); this.forumName = forumName; } diff --git a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationRequest.java b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationRequest.java index 7c379b04a0771606b116f89357e007026f2d8475..9ebdb224b6d93bdbf3d7026327917b5e126940ff 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationRequest.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationRequest.java @@ -21,10 +21,10 @@ public class GroupInvitationRequest extends InvitationRequest { public GroupInvitationRequest(MessageId id, SessionId sessionId, GroupId groupId, ContactId contactId, @Nullable String message, GroupId privateGroupId, String groupName, Author creator, - boolean available, long time, boolean local, boolean sent, - boolean seen, boolean read) { + boolean available, boolean canBeOpened, long time, + boolean local, boolean sent, boolean seen, boolean read) { super(id, sessionId, groupId, contactId, message, privateGroupId, - available, time, local, sent, seen, read); + available, canBeOpened, time, local, sent, seen, read); this.groupName = groupName; this.creator = creator; } diff --git a/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationMessage.java b/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationMessage.java index 5a7e39d4959e4b5b4d034f9ba4960272b10a3d6e..7dd97d0503b8596075010540cf0059225d0f3871 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationMessage.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationMessage.java @@ -16,11 +16,10 @@ public abstract class InvitationMessage extends BaseMessageHeader { private final SessionId sessionId; private final ContactId contactId; - @Nullable private final GroupId invitedGroupId; public InvitationMessage(MessageId id, SessionId sessionId, GroupId groupId, - ContactId contactId, @Nullable GroupId invitedGroupId, long time, + ContactId contactId, GroupId invitedGroupId, long time, boolean local, boolean sent, boolean seen, boolean read) { super(id, groupId, time, local, read, sent, seen); diff --git a/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationRequest.java b/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationRequest.java index b0a99e184b2e85362af758cb6e47d974658b59aa..9acc01e7ca5893f6c0ce31c73c7cd26bbf255e64 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationRequest.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationRequest.java @@ -15,17 +15,19 @@ public abstract class InvitationRequest extends InvitationMessage { @Nullable private final String message; - private final boolean available; + private final boolean available, canBeOpened; public InvitationRequest(MessageId id, SessionId sessionId, GroupId groupId, ContactId contactId, @Nullable String message, - @Nullable GroupId invitedGroupId, boolean available, long time, - boolean local, boolean sent, boolean seen, boolean read) { - + GroupId invitedGroupId, boolean available, + boolean canBeOpened, long time, boolean local, boolean sent, + boolean seen, boolean read) { super(id, sessionId, groupId, contactId, invitedGroupId, time, local, sent, seen, read); + if (available && canBeOpened) throw new IllegalArgumentException(); this.message = message; this.available = available; + this.canBeOpened = canBeOpened; } @Nullable @@ -37,4 +39,8 @@ public abstract class InvitationRequest extends InvitationMessage { return available; } + public boolean canBeOpened() { + return canBeOpened; + } + } diff --git a/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationResponse.java b/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationResponse.java index 15051e3b80103f5b6ab82287c2ef58932c54469b..248e443ffd2cba3528d0d2215bb22f88f9779347 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationResponse.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationResponse.java @@ -6,7 +6,6 @@ import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.briar.api.client.SessionId; -import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; @Immutable @@ -17,7 +16,7 @@ public abstract class InvitationResponse extends InvitationMessage { public InvitationResponse(MessageId id, SessionId sessionId, GroupId groupId, ContactId contactId, - @Nullable GroupId invitedGroupId, boolean accept, long time, + GroupId invitedGroupId, boolean accept, long time, boolean local, boolean sent, boolean seen, boolean read) { super(id, sessionId, groupId, contactId, invitedGroupId, time, local, diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java index 645243f5c89ed01c24d5bbcc7ec91b32e2dbedcd..5570ffe41198db078cb978f59cd83e8a323dad26 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java @@ -405,11 +405,13 @@ class GroupInvitationManagerImpl extends ConversationClientImpl SessionId sessionId = getSessionId(meta.getPrivateGroupId()); // Look up the invite message to get the details of the private group InviteMessage invite = getInviteMessage(txn, m); + boolean canBeOpened = db.containsGroup(txn, invite.getPrivateGroupId()); return new GroupInvitationRequest(m, sessionId, contactGroupId, c, invite.getMessage(), invite.getPrivateGroupId(), invite.getGroupName(), invite.getCreator(), - meta.isAvailableToAnswer(), meta.getTimestamp(), meta.isLocal(), - status.isSent(), status.isSeen(), meta.isRead()); + meta.isAvailableToAnswer(), canBeOpened, meta.getTimestamp(), + meta.isLocal(), status.isSent(), status.isSeen(), + meta.isRead()); } private InviteMessage getInviteMessage(Transaction txn, MessageId m) diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java index ba1a7623ad989b5829f1865b6893b89a9b9dec94..e89e57b53849568a519044caf579b12ffa6adbd6 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java @@ -319,7 +319,7 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> { SessionId sessionId = new SessionId(m.getPrivateGroupId().getBytes()); return new GroupInvitationRequest(m.getId(), sessionId, m.getContactGroupId(), c, m.getMessage(), m.getPrivateGroupId(), - m.getGroupName(), m.getCreator(), true, m.getTimestamp(), false, - false, true, false); + m.getGroupName(), m.getCreator(), true, false, m.getTimestamp(), + false, false, true, false); } } diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java index 721b633236a585cb144c049f8890db9f5cc061d2..3b0c0d9846f96869c9f2c943c6dd687433d4a724 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java @@ -135,13 +135,13 @@ class BlogSharingManagerImpl extends @Override protected InvitationMessage createInvitationRequest(MessageId id, BlogInvitation msg, ContactId contactId, GroupId blogId, - boolean available, long time, boolean local, boolean sent, - boolean seen, boolean read) { + boolean available, boolean canBeOpened, long time, boolean local, + boolean sent, boolean seen, boolean read) { return new BlogInvitationRequest(id, msg.getSessionId(), msg.getGroupId(), contactId, msg.getBlogAuthorName(), - msg.getMessage(), blogId, available, time, local, sent, seen, - read); + msg.getMessage(), blogId, available, canBeOpened, time, local, + sent, seen, read); } @Override @@ -345,8 +345,8 @@ class BlogSharingManagerImpl extends localState.getSessionId(), localState.getContactGroupId(), contactId, blog.getAuthor().getName(), msg, - localState.getShareableId(), true, time, false, - false, false, false); + localState.getShareableId(), true, false, time, + false, false, false, false); return new BlogInvitationRequestReceivedEvent(blog, contactId, request); } diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java index 75148d8a7455b1172dc505bf9fcf547ceabb25ef..c845f2c5f2e448b38062a5104890787e450466b5 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java @@ -83,11 +83,12 @@ class ForumSharingManagerImpl extends @Override protected InvitationMessage createInvitationRequest(MessageId id, ForumInvitation msg, ContactId contactId, GroupId forumId, - boolean available, long time, boolean local, boolean sent, - boolean seen, boolean read) { + boolean available, boolean canBeOpened, long time, + boolean local, boolean sent, boolean seen, boolean read) { return new ForumInvitationRequest(id, msg.getSessionId(), msg.getGroupId(), contactId, forumId, msg.getForumName(), - msg.getMessage(), available, time, local, sent, seen, read); + msg.getMessage(), available, canBeOpened, time, local, sent, + seen, read); } @Override @@ -272,7 +273,7 @@ class ForumSharingManagerImpl extends localState.getInvitationId(), localState.getSessionId(), localState.getContactGroupId(), contactId, localState.getShareableId(), forum.getName(), msg, true, - time, false, false, false, false); + false, time, false, false, false, false); return new ForumInvitationRequestReceivedEvent(forum, contactId, request); } diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java index b383a36e82841c9ff253865be663ef4ff202a163..c6be693e5d8b5e000ad35e88b1e7984058da49f2 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java @@ -126,7 +126,8 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS protected abstract InvitationMessage createInvitationRequest(MessageId id, I msg, ContactId contactId, GroupId shareableId, boolean available, - long time, boolean local, boolean sent, boolean seen, boolean read); + boolean canBeOpened, long time, boolean local, boolean sent, + boolean seen, boolean read); protected abstract InvitationMessage createInvitationResponse(MessageId id, SessionId sessionId, GroupId groupId, ContactId contactId, @@ -395,7 +396,7 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS long time = d.getLong(TIME); boolean local = d.getBoolean(LOCAL); boolean read = d.getBoolean(MSG_KEY_READ, false); - boolean available = false; + boolean available = false, canBeOpened = false; if (type == SHARE_MSG_TYPE_INVITATION) { I msg = getIFactory().build(group.getId(), d); @@ -407,12 +408,16 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS continue; available = ((InviteeSessionState) s).getState() == AWAIT_LOCAL_RESPONSE; + if (!available) { + canBeOpened = db.containsGroup(txn, + s.getShareableId()); + } } InvitationMessage im = createInvitationRequest(m.getKey(), msg, contactId, s.getShareableId(), - available, time, local, status.isSent(), - status.isSeen(), read); + available, canBeOpened, time, local, + status.isSent(), status.isSeen(), read); list.add(im); } else if (type == SHARE_MSG_TYPE_ACCEPT || type == SHARE_MSG_TYPE_DECLINE) { diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java index aa1f95ae614b9248f9296d7739e36f29ff6ce56b..620775b541444874f9276567a926a8a682f88354 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java @@ -640,13 +640,17 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { new HashMap<MessageId, BdfDictionary>(); results.put(message.getId(), meta); results.put(messageId2, meta2); - long time1 = 1L, time2 = 2L; + final long time1 = 1L, time2 = 2L; final MessageMetadata messageMetadata1 = new MessageMetadata(INVITE, privateGroup.getId(), time1, true, - true, true, true); + true, true, false); final MessageMetadata messageMetadata2 = new MessageMetadata(JOIN, privateGroup.getId(), time2, true, true, true, true); + final InviteMessage invite = + new InviteMessage(message.getId(), contactGroup.getId(), + privateGroup.getId(), time1, "name", author, + new byte[0], null, new byte[0]); context.checking(new Expectations() {{ oneOf(db).startTransaction(true); @@ -669,6 +673,9 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { oneOf(clientHelper).toList(message); will(returnValue(body)); oneOf(messageParser).parseInviteMessage(message, body); + will(returnValue(invite)); + oneOf(db).containsGroup(txn, privateGroup.getId()); + will(returnValue(true)); // second message oneOf(messageParser).parseMetadata(meta2); will(returnValue(messageMetadata2));