diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogFragment.java index cb0981f36c42cbecc4b5a18be7f90cba5fd1d681..d1fb275e55a10ceea44dc261368f22d844f50004 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogFragment.java @@ -226,8 +226,8 @@ public class BlogFragment extends BaseFragment private void loadBlogPosts(final boolean reload) { blogController.loadBlogPosts( - new UiResultExceptionHandler<Collection<BlogPostItem>, DbException>( - this) { + new UiResultExceptionHandler<Collection<BlogPostItem>, + DbException>(this) { @Override public void onResultUi(Collection<BlogPostItem> posts) { if (posts.isEmpty()) { @@ -265,13 +265,13 @@ public class BlogFragment extends BaseFragment } private void setToolbarTitle(Author a) { - String title = getString(R.string.blogs_personal_blog, a.getName()); - getActivity().setTitle(title); + getActivity().setTitle(a.getName()); } private void loadSharedContacts() { blogController.loadSharingContacts( - new UiResultExceptionHandler<Collection<ContactId>, DbException>(this) { + new UiResultExceptionHandler<Collection<ContactId>, + DbException>(this) { @Override public void onResultUi(Collection<ContactId> contacts) { sharingController.addAll(contacts); diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index 22c21a1ee2937ebafe92361bbc344c63edfc5e4b..923f2b40a357d64ba007c6658da6c5e08f270104 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -268,7 +268,6 @@ <string name="blogs_blog_post_received">New Blog Post Received</string> <string name="blogs_blog_post_scroll_to">Scroll To</string> <string name="blogs_feed_empty_state">This is the global blog feed.\n\nIt looks like nobody blogged anything, yet.\n\nBe the first and tap the pen icon to write a new blog post.</string> - <string name="blogs_personal_blog">%s\'s Personal Blog</string> <string name="blogs_remove_blog">Remove Blog</string> <string name="blogs_remove_blog_dialog_message">Are you sure that you want to remove this blog and all posts?\nNote that this will not remove the blog from other people\'s devices.</string> <string name="blogs_remove_blog_ok">Remove Blog</string> @@ -285,8 +284,8 @@ <string name="blogs_sharing_response_declined_sent">You declined the blog invitation from %s.</string> <string name="blogs_sharing_response_accepted_received">%s accepted the blog invitation.</string> <string name="blogs_sharing_response_declined_received">%s declined the blog invitation.</string> - <string name="blogs_sharing_invitation_received">%1$s has shared the personal blog of %2$s with you.</string> - <string name="blogs_sharing_invitation_sent">You have shared the personal blog of %1$s with %2$s.</string> + <string name="blogs_sharing_invitation_received">%1$s has shared the blog \"%2$s\" with you.</string> + <string name="blogs_sharing_invitation_sent">You have shared the blog \"%1$s\" with %2$s.</string> <string name="blogs_sharing_invitations_title">Blog Invitations</string> <string name="blogs_sharing_joined_toast">Subscribed to Blog</string> <string name="blogs_sharing_declined_toast">Blog Invitation Declined</string> diff --git a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java index bc56ac377b7139a14d31518c763a169769ac7a0c..4ad7e99eb7d4058271b74c147a7c19f1974aedc1 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java @@ -22,9 +22,9 @@ public interface BlogManager { ClientId CLIENT_ID = new ClientId("org.briarproject.briar.blog"); /** - * Adds a blog from the given author. + * Adds the given {@link Blog).} */ - Blog addBlog(Author author) throws DbException; + void addBlog(Blog b) throws DbException; /** * Adds the given {@link Blog} within the given {@link Transaction}. diff --git a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java index 845e69c69443a06216ce90515bb66af1cba47c22..e42932e1946f2b4d059a1cc476d170ce2a506de3 100644 --- a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java @@ -168,9 +168,7 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager, } @Override - public Blog addBlog(Author author) throws DbException { - Blog b = blogFactory.createBlog(author); - + public void addBlog(Blog b) throws DbException { Transaction txn = db.startTransaction(false); try { db.addGroup(txn, b.getGroup()); @@ -178,7 +176,6 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager, } finally { db.endTransaction(txn); } - return b; } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogMessageParserImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogMessageParserImpl.java index bcf0115191336a50bec271cef6eb9f61695e58f1..6795b0fb05d8142dbba63fe5b9d81c944890e247 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogMessageParserImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogMessageParserImpl.java @@ -32,8 +32,10 @@ class BlogMessageParserImpl extends MessageParserImpl<Blog> { throws FormatException { String name = descriptor.getString(0); byte[] publicKey = descriptor.getRaw(1); + boolean rssFeed = descriptor.getBoolean(2); Author author = authorFactory.createAuthor(name, publicKey); - return blogFactory.createBlog(author); + if (rssFeed) return blogFactory.createFeedBlog(author); + else return blogFactory.createBlog(author); } } 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 0b99d75bf61407d779f7f5026890c23a0f460bfb..461937caab338c38020b71014b590210248773f2 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 @@ -139,12 +139,11 @@ abstract class SharingManagerImpl<S extends Shareable> return false; } - protected void initializeSharedSession(Transaction txn, Contact c, - S shareable) throws DbException, FormatException { + void initializeSharedSession(Transaction txn, Contact c, S shareable) + throws DbException, FormatException { GroupId contactGroupId = getContactGroup(c).getId(); - Session session = - new Session(SHARING, contactGroupId, shareable.getId(), null, - null, 0, 0); + Session session = new Session(SHARING, contactGroupId, + shareable.getId(), null, null, 0, 0); MessageId storageId = createStorageId(txn, contactGroupId); storeSession(txn, storageId, session); } @@ -442,8 +441,7 @@ abstract class SharingManagerImpl<S extends Shareable> } } - protected void removingShareable(Transaction txn, S shareable) - throws DbException { + void removingShareable(Transaction txn, S shareable) throws DbException { SessionId sessionId = getSessionId(shareable.getId()); // If we have any sessions in progress, tell the contacts we're leaving try { diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java index e13718352e8a950e51058205bfdf238ad8ee5835..b66b98124d5c99b42996344397e104b42420eb69 100644 --- a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java @@ -11,6 +11,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.test.TestDatabaseModule; import org.briarproject.briar.api.blog.Blog; +import org.briarproject.briar.api.blog.BlogFactory; import org.briarproject.briar.api.blog.BlogInvitationRequest; import org.briarproject.briar.api.blog.BlogInvitationResponse; import org.briarproject.briar.api.blog.BlogManager; @@ -42,7 +43,7 @@ public class BlogSharingIntegrationTest extends BriarIntegrationTest<BriarIntegrationTestComponent> { private BlogManager blogManager0, blogManager1; - private Blog blog0, blog1, blog2; + private Blog blog0, blog1, blog2, rssBlog; private SharerListener listener0; private InviteeListener listener1; @@ -69,6 +70,8 @@ public class BlogSharingIntegrationTest blog0 = blogManager0.getPersonalBlog(author0); blog1 = blogManager0.getPersonalBlog(author1); blog2 = blogManager0.getPersonalBlog(author2); + BlogFactory blogFactory = c0.getBlogFactory(); + rssBlog = blogFactory.createFeedBlog(author0); // initialize waiters fresh for each test eventWaiter = new Waiter(); @@ -127,8 +130,7 @@ public class BlogSharingIntegrationTest // get sharing group and assert group message count GroupId g = contactGroupFactory.createContactGroup(CLIENT_ID, - contact1From0) - .getId(); + contact1From0).getId(); assertGroupCount(messageTracker0, g, 1, 0); // sync first request message @@ -146,6 +148,7 @@ public class BlogSharingIntegrationTest // blog was added successfully assertEquals(0, blogSharingManager0.getInvitations().size()); assertEquals(3, blogManager1.getBlogs().size()); + assertTrue(blogManager1.getBlogs().contains(blog2)); // invitee has one invitation message from sharer List<InvitationMessage> list = @@ -160,6 +163,7 @@ public class BlogSharingIntegrationTest assertFalse(invitation.isAvailable()); assertEquals(blog2.getAuthor().getName(), invitation.getBlogAuthorName()); + assertFalse(invitation.getShareable().isRssFeed()); assertEquals(contactId1From0, invitation.getContactId()); assertEquals("Hi!", invitation.getMessage()); } else { @@ -185,6 +189,81 @@ public class BlogSharingIntegrationTest assertGroupCount(messageTracker1, g, 2, 1); } + @Test + public void testSuccessfulSharingWithRssBlog() throws Exception { + // initialize and let invitee accept all requests + listenToEvents(true); + + // subscribe to RSS blog + blogManager0.addBlog(rssBlog); + + // send invitation + blogSharingManager0.sendInvitation(rssBlog.getId(), contactId1From0, + "Hi!", clock.currentTimeMillis()); + + // invitee has own blog and that of the sharer + assertEquals(2, blogManager1.getBlogs().size()); + + // get sharing group and assert group message count + GroupId g = contactGroupFactory.createContactGroup(CLIENT_ID, + contact1From0).getId(); + assertGroupCount(messageTracker0, g, 1, 0); + + // sync first request message + sync0To1(1, true); + eventWaiter.await(TIMEOUT, 1); + assertTrue(listener1.requestReceived); + assertGroupCount(messageTracker1, g, 2, 1); + + // sync response back + sync1To0(1, true); + eventWaiter.await(TIMEOUT, 1); + assertTrue(listener0.responseReceived); + assertGroupCount(messageTracker0, g, 2, 1); + + // blog was added successfully + assertEquals(0, blogSharingManager0.getInvitations().size()); + assertEquals(3, blogManager1.getBlogs().size()); + assertTrue(blogManager1.getBlogs().contains(rssBlog)); + + // invitee has one invitation message from sharer + List<InvitationMessage> list = + new ArrayList<InvitationMessage>(blogSharingManager1 + .getInvitationMessages(contactId0From1)); + assertEquals(2, list.size()); + // check other things are alright with the message + for (InvitationMessage m : list) { + if (m instanceof BlogInvitationRequest) { + BlogInvitationRequest invitation = + (BlogInvitationRequest) m; + assertFalse(invitation.isAvailable()); + assertEquals(rssBlog.getAuthor().getName(), + invitation.getBlogAuthorName()); + assertTrue(invitation.getShareable().isRssFeed()); + assertEquals(contactId1From0, invitation.getContactId()); + assertEquals("Hi!", invitation.getMessage()); + } else { + BlogInvitationResponse response = + (BlogInvitationResponse) m; + assertEquals(contactId0From1, response.getContactId()); + assertTrue(response.wasAccepted()); + assertTrue(response.isLocal()); + } + } + // sharer has own invitation message and response + assertEquals(2, blogSharingManager0.getInvitationMessages( + contactId1From0).size()); + // blog can not be shared again + assertFalse(blogSharingManager0.canBeShared(rssBlog.getId(), + contact1From0)); + assertFalse(blogSharingManager1.canBeShared(rssBlog.getId(), + contact0From1)); + + // group message count is still correct + assertGroupCount(messageTracker0, g, 2, 1); + assertGroupCount(messageTracker1, g, 2, 1); + } + @Test public void testDeclinedSharing() throws Exception { // initialize and let invitee deny all requests diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java index c114930bf8c330cb8bfd5ea58fcfe107b13ce773..679d7772aa7798c863aa4129dfbd27e347760b97 100644 --- a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java @@ -24,6 +24,7 @@ import org.briarproject.bramble.test.TestDatabaseModule; import org.briarproject.bramble.test.TestPluginConfigModule; import org.briarproject.bramble.test.TestSeedProviderModule; import org.briarproject.bramble.transport.TransportModule; +import org.briarproject.briar.api.blog.BlogFactory; import org.briarproject.briar.api.blog.BlogManager; import org.briarproject.briar.api.blog.BlogSharingManager; import org.briarproject.briar.api.client.MessageTracker; @@ -138,4 +139,6 @@ public interface BriarIntegrationTestComponent { TransportPropertyManager getTransportPropertyManager(); AuthorFactory getAuthorFactory(); + + BlogFactory getBlogFactory(); }