diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java index 6cb17a40f2c90b776d718aecf968728ad2364d98..62131cb41ddbe081a3ce3dea326859a76ad6151f 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupActivity.java @@ -6,7 +6,6 @@ import android.content.Intent; import android.os.Bundle; import android.support.annotation.LayoutRes; import android.support.annotation.StringRes; -import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; import android.support.v7.widget.LinearLayoutManager; import android.view.Menu; @@ -14,6 +13,7 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; +import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.identity.AuthorId; import org.briarproject.bramble.api.identity.LocalAuthor; @@ -124,12 +124,6 @@ public class GroupActivity extends @Override protected void onNamedGroupLoaded(final PrivateGroup group) { setTitle(group.getName()); - // Created by - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setSubtitle(getString(R.string.groups_created_by, - group.getCreator().getName())); - } controller.loadLocalAuthor( new UiResultExceptionHandler<LocalAuthor, DbException>(this) { @Override @@ -287,8 +281,13 @@ public class GroupActivity extends } @Override - public void onContactRelationshipRevealed(AuthorId memberId, Visibility v) { + public void onContactRelationshipRevealed(AuthorId memberId, ContactId c, + Visibility v) { adapter.updateVisibility(memberId, v); + + sharingController.add(c); + setToolbarSubTitle(sharingController.getTotalCount(), + sharingController.getOnlineCount()); } @Override diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupController.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupController.java index c3e03c10313aa21b2eba3f5c48b5134df3715ea6..61817fcb4e52ee2e653c4639932748972e2b5535 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupController.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupController.java @@ -2,6 +2,7 @@ package org.briarproject.briar.android.privategroup.conversation; import android.support.annotation.UiThread; +import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.identity.AuthorId; import org.briarproject.bramble.api.identity.LocalAuthor; @@ -23,7 +24,8 @@ public interface GroupController interface GroupListener extends ThreadListListener<GroupMessageHeader> { @UiThread - void onContactRelationshipRevealed(AuthorId memberId, Visibility v); + void onContactRelationshipRevealed(AuthorId memberId, + ContactId contactId, Visibility v); @UiThread void onGroupDissolved(); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupControllerImpl.java index a34e0365eae96720e8ce3932491053493ce8f9e5..0c75305591d4220540a76c85683760b273b31d76 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupControllerImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupControllerImpl.java @@ -18,6 +18,7 @@ import org.briarproject.briar.android.privategroup.conversation.GroupController. import org.briarproject.briar.android.threaded.ThreadListControllerImpl; import org.briarproject.briar.api.android.AndroidNotificationManager; import org.briarproject.briar.api.client.MessageTracker.GroupCount; +import org.briarproject.briar.api.privategroup.GroupMember; import org.briarproject.briar.api.privategroup.GroupMessage; import org.briarproject.briar.api.privategroup.GroupMessageFactory; import org.briarproject.briar.api.privategroup.GroupMessageHeader; @@ -26,8 +27,11 @@ import org.briarproject.briar.api.privategroup.PrivateGroup; import org.briarproject.briar.api.privategroup.PrivateGroupManager; import org.briarproject.briar.api.privategroup.event.ContactRelationshipRevealedEvent; import org.briarproject.briar.api.privategroup.event.GroupDissolvedEvent; +import org.briarproject.briar.api.privategroup.event.GroupInvitationResponseReceivedEvent; import org.briarproject.briar.api.privategroup.event.GroupMessageAddedEvent; +import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse; +import java.util.ArrayList; import java.util.Collection; import java.util.concurrent.Executor; import java.util.logging.Logger; @@ -93,7 +97,20 @@ class GroupControllerImpl extends @Override public void run() { listener.onContactRelationshipRevealed(c.getMemberId(), - c.getVisibility()); + c.getContactId(), c.getVisibility()); + } + }); + } + } else if (e instanceof GroupInvitationResponseReceivedEvent) { + GroupInvitationResponseReceivedEvent g = + (GroupInvitationResponseReceivedEvent) e; + final GroupInvitationResponse r = + (GroupInvitationResponse) g.getResponse(); + if (getGroupId().equals(r.getGroupId()) && r.wasAccepted()) { + listener.runOnUiThreadUnlessDestroyed(new Runnable() { + @Override + public void run() { + listener.onInvitationAccepted(r.getContactId()); } }); } @@ -137,8 +154,26 @@ class GroupControllerImpl extends @Override public void loadSharingContacts( - ResultExceptionHandler<Collection<ContactId>, DbException> handler) { - // TODO + final ResultExceptionHandler<Collection<ContactId>, DbException> handler) { + runOnDbThread(new Runnable() { + @Override + public void run() { + try { + Collection<GroupMember> members = + privateGroupManager.getMembers(getGroupId()); + Collection<ContactId> contactIds = new ArrayList<>(); + for (GroupMember m : members) { + if (m.getContactId() != null) + contactIds.add(m.getContactId()); + } + handler.onResult(contactIds); + } catch (DbException e) { + if (LOG.isLoggable(WARNING)) + LOG.log(WARNING, e.toString(), e); + handler.onException(e); + } + } + }); } @Override diff --git a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/event/ContactRelationshipRevealedEvent.java b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/event/ContactRelationshipRevealedEvent.java index 08fd42b3d8bc4dd8850903def3e601604a7757e6..31a2b2ee09024c97d1721730d973bbaeba05f2cb 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/event/ContactRelationshipRevealedEvent.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/event/ContactRelationshipRevealedEvent.java @@ -1,5 +1,6 @@ package org.briarproject.briar.api.privategroup.event; +import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.identity.AuthorId; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; @@ -14,12 +15,14 @@ public class ContactRelationshipRevealedEvent extends Event { private final GroupId groupId; private final AuthorId memberId; + private final ContactId contactId; private final Visibility visibility; public ContactRelationshipRevealedEvent(GroupId groupId, AuthorId memberId, - Visibility visibility) { + ContactId contactId, Visibility visibility) { this.groupId = groupId; this.memberId = memberId; + this.contactId = contactId; this.visibility = visibility; } @@ -31,6 +34,10 @@ public class ContactRelationshipRevealedEvent extends Event { return memberId; } + public ContactId getContactId() { + return contactId; + } + public Visibility getVisibility() { return visibility; } diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java index 1d1d03c8871070333f7c17402c7c59d2bf560ae7..cdaf0c928ad300024e752cf9aeff40e48cc3246c 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java @@ -402,7 +402,7 @@ class PrivateGroupManagerImpl extends BdfIncomingMessageHook try { Collection<GroupMember> members = new ArrayList<GroupMember>(); Map<Author, Visibility> authors = getMembers(txn, g); - LocalAuthor la = identityManager.getLocalAuthor(); + LocalAuthor la = identityManager.getLocalAuthor(txn); PrivateGroup privateGroup = getPrivateGroup(txn, g); for (Entry<Author, Visibility> m : authors.entrySet()) { Author a = m.getKey(); @@ -488,7 +488,10 @@ class PrivateGroupManagerImpl extends BdfIncomingMessageHook if (!foundMember) throw new ProtocolStateException(); if (changed) { clientHelper.mergeGroupMetadata(txn, g, meta); - txn.attach(new ContactRelationshipRevealedEvent(g, a, v)); + LocalAuthor la = identityManager.getLocalAuthor(txn); + ContactId c = contactManager.getContact(txn, a, la.getId()).getId(); + Event e = new ContactRelationshipRevealedEvent(g, a, c, v); + txn.attach(e); } } diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java index ef5f7e85f55499bac1f2467cb26e27ca021e5716..df59dbece6bf21f9e9855023f45dc242e9b745c6 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java @@ -255,7 +255,7 @@ class CreatorProtocolEngine extends AbstractProtocolEngine<CreatorSession> { 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, + m.getPrivateGroupId(), c, accept, m.getTimestamp(), false, false, true, false); } } 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 4c57e9aff3cee702725a981dcb60ffedd886ced4..87079ac5c28bfc5033dba87ddb23ca6411162d49 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 @@ -380,11 +380,11 @@ class GroupInvitationManagerImpl extends ConversationClientImpl messages.add(parseInvitationRequest(txn, c, contactGroupId, m, meta, status)); } else if (type == JOIN) { - messages.add(parseInvitationResponse(c, contactGroupId, m, - meta, status, true)); + messages.add( + parseInvitationResponse(c, m, meta, status, true)); } else if (type == LEAVE) { - messages.add(parseInvitationResponse(c, contactGroupId, m, - meta, status, false)); + messages.add( + parseInvitationResponse(c, m, meta, status, false)); } } db.commitTransaction(txn); @@ -418,13 +418,13 @@ class GroupInvitationManagerImpl extends ConversationClientImpl } private GroupInvitationResponse parseInvitationResponse(ContactId c, - GroupId contactGroupId, MessageId m, MessageMetadata meta, - MessageStatus status, boolean accept) - throws DbException, FormatException { + MessageId m, MessageMetadata meta, MessageStatus status, + boolean accept) throws DbException, FormatException { SessionId sessionId = getSessionId(meta.getPrivateGroupId()); - return new GroupInvitationResponse(m, sessionId, contactGroupId, c, - accept, meta.getTimestamp(), meta.isLocal(), status.isSent(), - status.isSeen(), meta.isRead()); + return new GroupInvitationResponse(m, sessionId, + meta.getPrivateGroupId(), c, accept, meta.getTimestamp(), + meta.isLocal(), status.isSent(), status.isSeen(), + meta.isRead()); } @Override diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/PrivateGroupManagerIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/PrivateGroupManagerIntegrationTest.java index 9646d1cf11a3219a51460d92e0e0870cbd6977f7..0d680b8b2c7dc5a3bef2255a1e19fb6bda42fadb 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/PrivateGroupManagerIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/PrivateGroupManagerIntegrationTest.java @@ -441,6 +441,9 @@ public class PrivateGroupManagerIntegrationTest Collection<GroupMember> members2 = groupManager2.getMembers(groupId0); assertEquals(3, members2.size()); + // 1 and 2 add each other + addContacts1And2(); + // assert that contact relationship is not revealed initially for (GroupMember m : members1) { if (m.getAuthor().equals(author2)) {