diff --git a/briar-android-tests/src/test/java/org/briarproject/BlogSharingIntegrationTest.java b/briar-android-tests/src/test/java/org/briarproject/BlogSharingIntegrationTest.java index 96a114d74f9421d85f5f5369e842077376b13086..8bf630581a415ca02826807c6fe8a55e17e2e8cd 100644 --- a/briar-android-tests/src/test/java/org/briarproject/BlogSharingIntegrationTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/BlogSharingIntegrationTest.java @@ -198,7 +198,7 @@ public class BlogSharingIntegrationTest extends BriarTestCase { assertTrue(listener0.responseReceived); // blog was added successfully - assertEquals(0, blogSharingManager0.getInvited().size()); + assertEquals(0, blogSharingManager0.getInvitations().size()); assertEquals(3, blogManager1.getBlogs().size()); // invitee has one invitation message from sharer @@ -257,10 +257,10 @@ public class BlogSharingIntegrationTest extends BriarTestCase { assertTrue(listener0.responseReceived); // blog was not added - assertEquals(0, blogSharingManager0.getInvited().size()); + assertEquals(0, blogSharingManager0.getInvitations().size()); assertEquals(2, blogManager1.getBlogs().size()); // blog is no longer available to invitee who declined - assertEquals(0, blogSharingManager1.getInvited().size()); + assertEquals(0, blogSharingManager1.getInvitations().size()); // invitee has one invitation message from sharer and one response List<InvitationMessage> list = @@ -317,7 +317,7 @@ public class BlogSharingIntegrationTest extends BriarTestCase { assertTrue(listener0.responseReceived); // blog was added successfully - assertEquals(0, blogSharingManager0.getInvited().size()); + assertEquals(0, blogSharingManager0.getInvitations().size()); assertEquals(3, blogManager1.getBlogs().size()); assertTrue(blogManager1.getBlogs().contains(blog2)); @@ -335,7 +335,7 @@ public class BlogSharingIntegrationTest extends BriarTestCase { sync1To0(); // blog is gone - assertEquals(0, blogSharingManager0.getInvited().size()); + assertEquals(0, blogSharingManager0.getInvitations().size()); assertEquals(2, blogManager1.getBlogs().size()); // sharer no longer shares blog with invitee @@ -396,7 +396,7 @@ public class BlogSharingIntegrationTest extends BriarTestCase { assertTrue(listener0.responseReceived); // blog was not added, because it was there already - assertEquals(0, blogSharingManager0.getInvited().size()); + assertEquals(0, blogSharingManager0.getInvitations().size()); assertEquals(3, blogManager1.getBlogs().size()); stopLifecycles(); @@ -495,7 +495,7 @@ public class BlogSharingIntegrationTest extends BriarTestCase { Blog b = event.getBlog(); try { eventWaiter.assertEquals(1, - blogSharingManager1.getInvited().size()); + blogSharingManager1.getInvitations().size()); Contact c = contactManager1.getContact(event.getContactId()); blogSharingManager1.respondToInvitation(b, c, accept); diff --git a/briar-android-tests/src/test/java/org/briarproject/ForumSharingIntegrationTest.java b/briar-android-tests/src/test/java/org/briarproject/ForumSharingIntegrationTest.java index bc6b3d06fb6e8f86239c82e30fc355ed43fa8fca..a3c86cb1f8b7cba391b453629f1018807bc34668 100644 --- a/briar-android-tests/src/test/java/org/briarproject/ForumSharingIntegrationTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/ForumSharingIntegrationTest.java @@ -36,6 +36,7 @@ import org.briarproject.api.identity.AuthorFactory; import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.lifecycle.LifecycleManager; +import org.briarproject.api.sharing.InvitationItem; import org.briarproject.api.sharing.InvitationMessage; import org.briarproject.api.sync.ClientId; import org.briarproject.api.sync.Group; @@ -186,7 +187,7 @@ public class ForumSharingIntegrationTest extends BriarTestCase { assertTrue(listener0.responseReceived); // forum was added successfully - assertEquals(0, forumSharingManager0.getInvited().size()); + assertEquals(0, forumSharingManager0.getInvitations().size()); assertEquals(1, forumManager1.getForums().size()); // invitee has one invitation message from sharer @@ -247,10 +248,10 @@ public class ForumSharingIntegrationTest extends BriarTestCase { assertTrue(listener0.responseReceived); // forum was not added - assertEquals(0, forumSharingManager0.getInvited().size()); + assertEquals(0, forumSharingManager0.getInvitations().size()); assertEquals(0, forumManager1.getForums().size()); // forum is no longer available to invitee who declined - assertEquals(0, forumSharingManager1.getInvited().size()); + assertEquals(0, forumSharingManager1.getInvitations().size()); // invitee has one invitation message from sharer and one response List<InvitationMessage> list = @@ -308,7 +309,7 @@ public class ForumSharingIntegrationTest extends BriarTestCase { assertTrue(listener0.responseReceived); // forum was added successfully - assertEquals(0, forumSharingManager0.getInvited().size()); + assertEquals(0, forumSharingManager0.getInvitations().size()); assertEquals(1, forumManager1.getForums().size()); assertTrue(forumManager1.getForums().contains(forum0)); @@ -328,7 +329,7 @@ public class ForumSharingIntegrationTest extends BriarTestCase { syncToSharer(); // forum is gone - assertEquals(0, forumSharingManager0.getInvited().size()); + assertEquals(0, forumSharingManager0.getInvitations().size()); assertEquals(0, forumManager1.getForums().size()); // sharer no longer shares forum with invitee @@ -368,7 +369,7 @@ public class ForumSharingIntegrationTest extends BriarTestCase { assertTrue(listener0.responseReceived); // forum was added successfully - assertEquals(0, forumSharingManager0.getInvited().size()); + assertEquals(0, forumSharingManager0.getInvitations().size()); assertEquals(1, forumManager1.getForums().size()); assertTrue(forumManager1.getForums().contains(forum0)); @@ -431,7 +432,7 @@ public class ForumSharingIntegrationTest extends BriarTestCase { msgWaiter.await(TIMEOUT, 1); // ensure that invitee has no forum invitations available - assertEquals(0, forumSharingManager1.getInvited().size()); + assertEquals(0, forumSharingManager1.getInvitations().size()); assertEquals(0, forumManager1.getForums().size()); // Try again, this time allow the response @@ -454,7 +455,7 @@ public class ForumSharingIntegrationTest extends BriarTestCase { msgWaiter.await(TIMEOUT, 1); // ensure that invitee has no forum invitations available - assertEquals(0, forumSharingManager1.getInvited().size()); + assertEquals(0, forumSharingManager1.getInvitations().size()); assertEquals(1, forumManager1.getForums().size()); } finally { stopLifecycles(); @@ -570,6 +571,7 @@ public class ForumSharingIntegrationTest extends BriarTestCase { assertEquals(2, forumSharingManager0.getInvitationMessages(contactId1) .size()); + assertEquals(0, forumSharingManager0.getInvitations().size()); } finally { stopLifecycles(); } @@ -767,8 +769,11 @@ public class ForumSharingIntegrationTest extends BriarTestCase { "Sharer2 to Invitee"); // make sure we now have two invitations to the same forum available - Collection<Forum> forums = forumSharingManager1.getInvited(); + Collection<InvitationItem> forums = + forumSharingManager1.getInvitations(); assertEquals(1, forums.size()); + assertEquals(2, forums.iterator().next().getNewSharers().size()); + assertEquals(forum0, forums.iterator().next().getShareable()); assertEquals(2, forumSharingManager1.getSharedBy(forum0.getId()).size()); @@ -1005,13 +1010,16 @@ public class ForumSharingIntegrationTest extends BriarTestCase { Forum f = event.getForum(); try { eventWaiter.assertEquals(1, - forumSharingManager1.getInvited().size()); - if (respond) { - Contact c = - contactManager1 - .getContact(event.getContactId()); - forumSharingManager1.respondToInvitation(f, c, accept); - } + forumSharingManager1.getInvitations().size()); + InvitationItem invitation = + forumSharingManager1.getInvitations().iterator() + .next(); + eventWaiter.assertEquals(f, invitation.getShareable()); + if (respond) { + Contact c = + contactManager1.getContact(event.getContactId()); + forumSharingManager1.respondToInvitation(f, c, accept); + } } catch (DbException ex) { eventWaiter.rethrow(ex); } finally { diff --git a/briar-android/src/org/briarproject/android/forum/ForumListFragment.java b/briar-android/src/org/briarproject/android/forum/ForumListFragment.java index ec83d6a9780687bb68436c857d7e0117a390488b..0b1486b84e9306fe31df2ac3722a8b7293165115 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumListFragment.java +++ b/briar-android/src/org/briarproject/android/forum/ForumListFragment.java @@ -189,7 +189,7 @@ public class ForumListFragment extends BaseEventFragment implements try { long now = System.currentTimeMillis(); int available = - forumSharingManager.getInvited().size(); + forumSharingManager.getInvitations().size(); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) LOG.info("Loading available took " + duration + " ms"); @@ -206,6 +206,7 @@ public class ForumListFragment extends BaseEventFragment implements listener.runOnUiThread(new Runnable() { @Override public void run() { + if (getActivity() == null) return; if (availableCount == 0) { snackbar.dismiss(); } else { diff --git a/briar-android/src/org/briarproject/android/sharing/BlogInvitationAdapter.java b/briar-android/src/org/briarproject/android/sharing/BlogInvitationAdapter.java index c6127143e659bd754147cd724a07f921739de706..2bcc1bf3519e4ec794dda94a13cf0f508cedf273 100644 --- a/briar-android/src/org/briarproject/android/sharing/BlogInvitationAdapter.java +++ b/briar-android/src/org/briarproject/android/sharing/BlogInvitationAdapter.java @@ -4,6 +4,7 @@ import android.content.Context; import org.briarproject.R; import org.briarproject.api.blogs.Blog; +import org.briarproject.api.sharing.InvitationItem; class BlogInvitationAdapter extends InvitationAdapter { diff --git a/briar-android/src/org/briarproject/android/sharing/ForumInvitationAdapter.java b/briar-android/src/org/briarproject/android/sharing/ForumInvitationAdapter.java index a0e898715eb08e99edad9f553b5b366ebd9c8044..1535b8cdc0f67c1d7eda269e934243b74721c647 100644 --- a/briar-android/src/org/briarproject/android/sharing/ForumInvitationAdapter.java +++ b/briar-android/src/org/briarproject/android/sharing/ForumInvitationAdapter.java @@ -3,6 +3,7 @@ package org.briarproject.android.sharing; import android.content.Context; import org.briarproject.api.forum.Forum; +import org.briarproject.api.sharing.InvitationItem; class ForumInvitationAdapter extends InvitationAdapter { diff --git a/briar-android/src/org/briarproject/android/sharing/InvitationAdapter.java b/briar-android/src/org/briarproject/android/sharing/InvitationAdapter.java index 22a5f3e02357fdab7ef98b4766692d445b50f3a5..f4c988454856d1f8f59c582f37f6639cc4fda225 100644 --- a/briar-android/src/org/briarproject/android/sharing/InvitationAdapter.java +++ b/briar-android/src/org/briarproject/android/sharing/InvitationAdapter.java @@ -12,6 +12,7 @@ import android.widget.TextView; import org.briarproject.R; import org.briarproject.android.util.TextAvatarView; import org.briarproject.api.contact.Contact; +import org.briarproject.api.sharing.InvitationItem; import org.briarproject.util.StringUtils; import java.util.ArrayList; @@ -48,7 +49,8 @@ abstract class InvitationAdapter extends final InvitationItem item = getItem(position); Collection<String> names = new ArrayList<>(); - for (Contact c : item.getContacts()) names.add(c.getAuthor().getName()); + for (Contact c : item.getNewSharers()) + names.add(c.getAuthor().getName()); ui.sharedBy.setText(ctx.getString(R.string.shared_by_format, StringUtils.join(names, ", "))); @@ -153,7 +155,7 @@ abstract class InvitationAdapter extends public boolean areContentsTheSame(InvitationItem oldItem, InvitationItem newItem) { return oldItem.isSubscribed() == newItem.isSubscribed() && - oldItem.getContacts().equals(newItem.getContacts()); + oldItem.getNewSharers().equals(newItem.getNewSharers()); } @Override diff --git a/briar-android/src/org/briarproject/android/sharing/InvitationItem.java b/briar-android/src/org/briarproject/android/sharing/InvitationItem.java deleted file mode 100644 index 65dccd4ffd5715a9bd0d4f4c0aa1d647f4466502..0000000000000000000000000000000000000000 --- a/briar-android/src/org/briarproject/android/sharing/InvitationItem.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.briarproject.android.sharing; - -import org.briarproject.api.contact.Contact; -import org.briarproject.api.sharing.Shareable; - -import java.util.Collection; - -class InvitationItem { - - private final Shareable shareable; - private final boolean subscribed; - private final Collection<Contact> contacts; - - InvitationItem(Shareable shareable, boolean subscribed, - Collection<Contact> contacts) { - - this.shareable = shareable; - this.subscribed = subscribed; - this.contacts = contacts; - } - - Shareable getShareable() { - return shareable; - } - - boolean isSubscribed() { - return subscribed; - } - - Collection<Contact> getContacts() { - return contacts; - } -} diff --git a/briar-android/src/org/briarproject/android/sharing/InvitationsActivity.java b/briar-android/src/org/briarproject/android/sharing/InvitationsActivity.java index ec7ab1f1610e434d0a80771937aac01f12a40446..fc6761e058ee516f8cb7f5ed7da6cee0b6d19189 100644 --- a/briar-android/src/org/briarproject/android/sharing/InvitationsActivity.java +++ b/briar-android/src/org/briarproject/android/sharing/InvitationsActivity.java @@ -12,6 +12,7 @@ import org.briarproject.api.event.ContactRemovedEvent; import org.briarproject.api.event.Event; import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventListener; +import org.briarproject.api.sharing.InvitationItem; import java.util.Collection; import java.util.logging.Logger; diff --git a/briar-android/src/org/briarproject/android/sharing/InvitationsBlogActivity.java b/briar-android/src/org/briarproject/android/sharing/InvitationsBlogActivity.java index a289ac2268159c39a864c766f4070f6cfb0f2461..58e818269f87af830749632353e88d3abbe9241a 100644 --- a/briar-android/src/org/briarproject/android/sharing/InvitationsBlogActivity.java +++ b/briar-android/src/org/briarproject/android/sharing/InvitationsBlogActivity.java @@ -9,11 +9,11 @@ import org.briarproject.api.blogs.BlogManager; import org.briarproject.api.blogs.BlogSharingManager; import org.briarproject.api.contact.Contact; import org.briarproject.api.db.DbException; -import org.briarproject.api.db.NoSuchGroupException; import org.briarproject.api.event.BlogInvitationReceivedEvent; import org.briarproject.api.event.Event; import org.briarproject.api.event.GroupAddedEvent; import org.briarproject.api.event.GroupRemovedEvent; +import org.briarproject.api.sharing.InvitationItem; import org.briarproject.api.sync.ClientId; import java.util.ArrayList; @@ -71,30 +71,18 @@ public class InvitationsBlogActivity extends InvitationsActivity { runOnDbThread(new Runnable() { @Override public void run() { + Collection<InvitationItem> invitations = new ArrayList<>(); try { - Collection<InvitationItem> invitations = new ArrayList<>(); long now = System.currentTimeMillis(); - for (Blog b : blogSharingManager.getInvited()) { - boolean subscribed; - try { - blogManager.getBlog(b.getId()); - subscribed = true; - } catch (NoSuchGroupException e) { - subscribed = false; - } - Collection<Contact> c = - blogSharingManager.getSharedBy(b.getId()); - invitations.add( - new InvitationItem(b, subscribed, c)); - } + invitations.addAll(blogSharingManager.getInvitations()); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) LOG.info("Load took " + duration + " ms"); - displayInvitations(invitations, clear); } catch (DbException e) { if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); } + displayInvitations(invitations, clear); } }); } @@ -106,7 +94,7 @@ public class InvitationsBlogActivity extends InvitationsActivity { public void run() { try { Blog b = (Blog) item.getShareable(); - for (Contact c : item.getContacts()) { + for (Contact c : item.getNewSharers()) { blogSharingManager.respondToInvitation(b, c, accept); } } catch (DbException e) { diff --git a/briar-android/src/org/briarproject/android/sharing/InvitationsForumActivity.java b/briar-android/src/org/briarproject/android/sharing/InvitationsForumActivity.java index a994f9faa22c66d84ceb03462d44028d846d90f7..51ddcc838a73f349f5c40096b6fa089cbe9bf0fb 100644 --- a/briar-android/src/org/briarproject/android/sharing/InvitationsForumActivity.java +++ b/briar-android/src/org/briarproject/android/sharing/InvitationsForumActivity.java @@ -6,7 +6,6 @@ import org.briarproject.R; import org.briarproject.android.ActivityComponent; import org.briarproject.api.contact.Contact; import org.briarproject.api.db.DbException; -import org.briarproject.api.db.NoSuchGroupException; import org.briarproject.api.event.Event; import org.briarproject.api.event.ForumInvitationReceivedEvent; import org.briarproject.api.event.GroupAddedEvent; @@ -14,6 +13,7 @@ import org.briarproject.api.event.GroupRemovedEvent; import org.briarproject.api.forum.Forum; import org.briarproject.api.forum.ForumManager; import org.briarproject.api.forum.ForumSharingManager; +import org.briarproject.api.sharing.InvitationItem; import org.briarproject.api.sync.ClientId; import java.util.ArrayList; @@ -71,30 +71,18 @@ public class InvitationsForumActivity extends InvitationsActivity { runOnDbThread(new Runnable() { @Override public void run() { + Collection<InvitationItem> invitations = new ArrayList<>(); try { - Collection<InvitationItem> forums = new ArrayList<>(); long now = System.currentTimeMillis(); - for (Forum f : forumSharingManager.getInvited()) { - boolean subscribed; - try { - forumManager.getForum(f.getId()); - subscribed = true; - } catch (NoSuchGroupException e) { - subscribed = false; - } - Collection<Contact> c = - forumSharingManager.getSharedBy(f.getId()); - forums.add( - new InvitationItem(f, subscribed, c)); - } + invitations.addAll(forumSharingManager.getInvitations()); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) LOG.info("Load took " + duration + " ms"); - displayInvitations(forums, clear); } catch (DbException e) { if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); } + displayInvitations(invitations, clear); } }); } @@ -106,7 +94,7 @@ public class InvitationsForumActivity extends InvitationsActivity { public void run() { try { Forum f = (Forum) item.getShareable(); - for (Contact c : item.getContacts()) { + for (Contact c : item.getNewSharers()) { forumSharingManager.respondToInvitation(f, c, accept); } } catch (DbException e) { diff --git a/briar-api/src/org/briarproject/api/blogs/BlogSharingManager.java b/briar-api/src/org/briarproject/api/blogs/BlogSharingManager.java index 4e21557f82ca4627c1b46ef97e5ecf451c387d88..5a75b76475527f93a22fa98bf31e2102e4c88d03 100644 --- a/briar-api/src/org/briarproject/api/blogs/BlogSharingManager.java +++ b/briar-api/src/org/briarproject/api/blogs/BlogSharingManager.java @@ -3,6 +3,7 @@ package org.briarproject.api.blogs; import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.db.DbException; +import org.briarproject.api.sharing.InvitationItem; import org.briarproject.api.sharing.InvitationMessage; import org.briarproject.api.sharing.SharingManager; import org.briarproject.api.sync.ClientId; @@ -40,7 +41,7 @@ public interface BlogSharingManager extends SharingManager<Blog> { /** * Returns all blogs to which the user has been invited. */ - Collection<Blog> getInvited() throws DbException; + Collection<InvitationItem> getInvitations() throws DbException; /** * Returns all contacts who are sharing the given blog with us. diff --git a/briar-api/src/org/briarproject/api/forum/ForumSharingManager.java b/briar-api/src/org/briarproject/api/forum/ForumSharingManager.java index 5f1f623c2af870b2c7efe4abac17f447cd1bcd4b..a734abc7d794863f0f0e668d3881d92292dba07a 100644 --- a/briar-api/src/org/briarproject/api/forum/ForumSharingManager.java +++ b/briar-api/src/org/briarproject/api/forum/ForumSharingManager.java @@ -3,6 +3,7 @@ package org.briarproject.api.forum; import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.db.DbException; +import org.briarproject.api.sharing.InvitationItem; import org.briarproject.api.sharing.InvitationMessage; import org.briarproject.api.sharing.SharingManager; import org.briarproject.api.sync.ClientId; @@ -36,7 +37,7 @@ public interface ForumSharingManager extends SharingManager<Forum> { ContactId contactId) throws DbException; /** Returns all forums to which the user has been invited. */ - Collection<Forum> getInvited() throws DbException; + Collection<InvitationItem> getInvitations() throws DbException; /** Returns all contacts who are sharing the given forum with us. */ Collection<Contact> getSharedBy(GroupId g) throws DbException; diff --git a/briar-api/src/org/briarproject/api/sharing/InvitationItem.java b/briar-api/src/org/briarproject/api/sharing/InvitationItem.java new file mode 100644 index 0000000000000000000000000000000000000000..bc180ea13f011cd895048d46c4b54ee79030462b --- /dev/null +++ b/briar-api/src/org/briarproject/api/sharing/InvitationItem.java @@ -0,0 +1,32 @@ +package org.briarproject.api.sharing; + +import org.briarproject.api.contact.Contact; + +import java.util.Collection; + +public class InvitationItem { + + private final Shareable shareable; + private final boolean subscribed; + private final Collection<Contact> newSharers; + + public InvitationItem(Shareable shareable, boolean subscribed, + Collection<Contact> newSharers) { + + this.shareable = shareable; + this.subscribed = subscribed; + this.newSharers = newSharers; + } + + public Shareable getShareable() { + return shareable; + } + + public boolean isSubscribed() { + return subscribed; + } + + public Collection<Contact> getNewSharers() { + return newSharers; + } +} diff --git a/briar-api/src/org/briarproject/api/sharing/SharingManager.java b/briar-api/src/org/briarproject/api/sharing/SharingManager.java index 861edfc4c02cfbfc116d7e3690e7286e5ba143ec..0a66a54588a734d538a73012eccd4a8605306098 100644 --- a/briar-api/src/org/briarproject/api/sharing/SharingManager.java +++ b/briar-api/src/org/briarproject/api/sharing/SharingManager.java @@ -33,8 +33,8 @@ public interface SharingManager<S extends Shareable> { Collection<InvitationMessage> getInvitationMessages( ContactId contactId) throws DbException; - /** Returns all shareables to which the user has been invited. */ - Collection<S> getInvited() throws DbException; + /** Returns all invitations to shareables. */ + Collection<InvitationItem> getInvitations() throws DbException; /** Returns all contacts who are sharing the given group with us. */ Collection<Contact> getSharedBy(GroupId g) throws DbException; diff --git a/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java b/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java index 24b2b5223d50dc0e83c3904f8d806fddc2988617..9528bf88ba88772efd415d48a1b923b82bf9f92c 100644 --- a/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java +++ b/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java @@ -25,6 +25,7 @@ import org.briarproject.api.event.Event; import org.briarproject.api.event.InvitationReceivedEvent; import org.briarproject.api.event.InvitationResponseReceivedEvent; import org.briarproject.api.identity.LocalAuthor; +import org.briarproject.api.sharing.InvitationItem; import org.briarproject.api.sharing.InvitationMessage; import org.briarproject.api.sharing.Shareable; import org.briarproject.api.sharing.SharingManager; @@ -44,6 +45,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -397,16 +399,39 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS } @Override - public Collection<S> getInvited() throws DbException { + public Collection<InvitationItem> getInvitations() throws DbException { + List<InvitationItem> invitations = new ArrayList<InvitationItem>(); Transaction txn = db.startTransaction(true); try { - Set<S> invited = new HashSet<S>(); + Set<S> shareables = new HashSet<S>(); + Map<GroupId, Collection<Contact>> newSharers = + new HashMap<GroupId, Collection<Contact>>(); Collection<Contact> contacts = db.getContacts(txn); + + // get invitations from each contact for (Contact contact : contacts) { - invited.addAll(getInvited(txn, contact)); + Collection<S> newShareables = getInvited(txn, contact); + shareables.addAll(newShareables); + for (S s : newShareables) { + if (newSharers.containsKey(s.getId())) { + newSharers.get(s.getId()).add(contact); + } else { + Collection<Contact> c = new ArrayList<Contact>(); + c.add(contact); + newSharers.put(s.getId(), c); + } + } + } + // construct InvitationItem objects + for (S s : shareables) { + Collection<Contact> newS = newSharers.get(s.getId()); + boolean subscribed = db.containsGroup(txn, s.getId()); + InvitationItem invitation = + new InvitationItem(s, subscribed, newS); + invitations.add(invitation); } txn.setComplete(); - return Collections.unmodifiableCollection(invited); + return Collections.unmodifiableCollection(invitations); } catch (FormatException e) { throw new DbException(e); } finally { @@ -447,20 +472,27 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS @Override public Collection<Contact> getSharedBy(GroupId g) throws DbException { + List<Contact> subscribers; + Transaction txn = db.startTransaction(true); + try { + subscribers = getSharedBy(txn, g); + txn.setComplete(); + } finally { + db.endTransaction(txn); + } + return Collections.unmodifiableList(subscribers); + } + + private List<Contact> getSharedBy(Transaction txn, GroupId g) + throws DbException { try { List<Contact> subscribers = new ArrayList<Contact>(); - Transaction txn = db.startTransaction(true); - try { - for (Contact c : db.getContacts(txn)) { - GroupId contactGroup = getContactGroup(c).getId(); - if (listContains(txn, contactGroup, g, SHARED_WITH_US)) - subscribers.add(c); - } - txn.setComplete(); - } finally { - db.endTransaction(txn); + for (Contact c : db.getContacts(txn)) { + GroupId contactGroup = getContactGroup(c).getId(); + if (listContains(txn, contactGroup, g, SHARED_WITH_US)) + subscribers.add(c); } - return Collections.unmodifiableList(subscribers); + return subscribers; } catch (IOException e) { throw new DbException(e); }