mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-17 13:19:52 +01:00
Merge branch '977-crash-when-opening-rss-blog' into 'master'
Create correct shareable for RSS blogs Closes #977 See merge request !564
This commit is contained in:
@@ -226,8 +226,8 @@ public class BlogFragment extends BaseFragment
|
|||||||
|
|
||||||
private void loadBlogPosts(final boolean reload) {
|
private void loadBlogPosts(final boolean reload) {
|
||||||
blogController.loadBlogPosts(
|
blogController.loadBlogPosts(
|
||||||
new UiResultExceptionHandler<Collection<BlogPostItem>, DbException>(
|
new UiResultExceptionHandler<Collection<BlogPostItem>,
|
||||||
this) {
|
DbException>(this) {
|
||||||
@Override
|
@Override
|
||||||
public void onResultUi(Collection<BlogPostItem> posts) {
|
public void onResultUi(Collection<BlogPostItem> posts) {
|
||||||
if (posts.isEmpty()) {
|
if (posts.isEmpty()) {
|
||||||
@@ -265,13 +265,13 @@ public class BlogFragment extends BaseFragment
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void setToolbarTitle(Author a) {
|
private void setToolbarTitle(Author a) {
|
||||||
String title = getString(R.string.blogs_personal_blog, a.getName());
|
getActivity().setTitle(a.getName());
|
||||||
getActivity().setTitle(title);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadSharedContacts() {
|
private void loadSharedContacts() {
|
||||||
blogController.loadSharingContacts(
|
blogController.loadSharingContacts(
|
||||||
new UiResultExceptionHandler<Collection<ContactId>, DbException>(this) {
|
new UiResultExceptionHandler<Collection<ContactId>,
|
||||||
|
DbException>(this) {
|
||||||
@Override
|
@Override
|
||||||
public void onResultUi(Collection<ContactId> contacts) {
|
public void onResultUi(Collection<ContactId> contacts) {
|
||||||
sharingController.addAll(contacts);
|
sharingController.addAll(contacts);
|
||||||
|
|||||||
@@ -268,7 +268,6 @@
|
|||||||
<string name="blogs_blog_post_received">New Blog Post Received</string>
|
<string name="blogs_blog_post_received">New Blog Post Received</string>
|
||||||
<string name="blogs_blog_post_scroll_to">Scroll To</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_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">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_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>
|
<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_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_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_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_received">%1$s has shared the blog \"%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_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_invitations_title">Blog Invitations</string>
|
||||||
<string name="blogs_sharing_joined_toast">Subscribed to Blog</string>
|
<string name="blogs_sharing_joined_toast">Subscribed to Blog</string>
|
||||||
<string name="blogs_sharing_declined_toast">Blog Invitation Declined</string>
|
<string name="blogs_sharing_declined_toast">Blog Invitation Declined</string>
|
||||||
|
|||||||
@@ -22,9 +22,9 @@ public interface BlogManager {
|
|||||||
ClientId CLIENT_ID = new ClientId("org.briarproject.briar.blog");
|
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}.
|
* Adds the given {@link Blog} within the given {@link Transaction}.
|
||||||
|
|||||||
@@ -168,9 +168,7 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Blog addBlog(Author author) throws DbException {
|
public void addBlog(Blog b) throws DbException {
|
||||||
Blog b = blogFactory.createBlog(author);
|
|
||||||
|
|
||||||
Transaction txn = db.startTransaction(false);
|
Transaction txn = db.startTransaction(false);
|
||||||
try {
|
try {
|
||||||
db.addGroup(txn, b.getGroup());
|
db.addGroup(txn, b.getGroup());
|
||||||
@@ -178,7 +176,6 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager,
|
|||||||
} finally {
|
} finally {
|
||||||
db.endTransaction(txn);
|
db.endTransaction(txn);
|
||||||
}
|
}
|
||||||
return b;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -32,8 +32,10 @@ class BlogMessageParserImpl extends MessageParserImpl<Blog> {
|
|||||||
throws FormatException {
|
throws FormatException {
|
||||||
String name = descriptor.getString(0);
|
String name = descriptor.getString(0);
|
||||||
byte[] publicKey = descriptor.getRaw(1);
|
byte[] publicKey = descriptor.getRaw(1);
|
||||||
|
boolean rssFeed = descriptor.getBoolean(2);
|
||||||
Author author = authorFactory.createAuthor(name, publicKey);
|
Author author = authorFactory.createAuthor(name, publicKey);
|
||||||
return blogFactory.createBlog(author);
|
if (rssFeed) return blogFactory.createFeedBlog(author);
|
||||||
|
else return blogFactory.createBlog(author);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,12 +139,11 @@ abstract class SharingManagerImpl<S extends Shareable>
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void initializeSharedSession(Transaction txn, Contact c,
|
void initializeSharedSession(Transaction txn, Contact c, S shareable)
|
||||||
S shareable) throws DbException, FormatException {
|
throws DbException, FormatException {
|
||||||
GroupId contactGroupId = getContactGroup(c).getId();
|
GroupId contactGroupId = getContactGroup(c).getId();
|
||||||
Session session =
|
Session session = new Session(SHARING, contactGroupId,
|
||||||
new Session(SHARING, contactGroupId, shareable.getId(), null,
|
shareable.getId(), null, null, 0, 0);
|
||||||
null, 0, 0);
|
|
||||||
MessageId storageId = createStorageId(txn, contactGroupId);
|
MessageId storageId = createStorageId(txn, contactGroupId);
|
||||||
storeSession(txn, storageId, session);
|
storeSession(txn, storageId, session);
|
||||||
}
|
}
|
||||||
@@ -442,8 +441,7 @@ abstract class SharingManagerImpl<S extends Shareable>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void removingShareable(Transaction txn, S shareable)
|
void removingShareable(Transaction txn, S shareable) throws DbException {
|
||||||
throws DbException {
|
|
||||||
SessionId sessionId = getSessionId(shareable.getId());
|
SessionId sessionId = getSessionId(shareable.getId());
|
||||||
// If we have any sessions in progress, tell the contacts we're leaving
|
// If we have any sessions in progress, tell the contacts we're leaving
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
|
|||||||
import org.briarproject.bramble.api.sync.GroupId;
|
import org.briarproject.bramble.api.sync.GroupId;
|
||||||
import org.briarproject.bramble.test.TestDatabaseModule;
|
import org.briarproject.bramble.test.TestDatabaseModule;
|
||||||
import org.briarproject.briar.api.blog.Blog;
|
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.BlogInvitationRequest;
|
||||||
import org.briarproject.briar.api.blog.BlogInvitationResponse;
|
import org.briarproject.briar.api.blog.BlogInvitationResponse;
|
||||||
import org.briarproject.briar.api.blog.BlogManager;
|
import org.briarproject.briar.api.blog.BlogManager;
|
||||||
@@ -42,7 +43,7 @@ public class BlogSharingIntegrationTest
|
|||||||
extends BriarIntegrationTest<BriarIntegrationTestComponent> {
|
extends BriarIntegrationTest<BriarIntegrationTestComponent> {
|
||||||
|
|
||||||
private BlogManager blogManager0, blogManager1;
|
private BlogManager blogManager0, blogManager1;
|
||||||
private Blog blog0, blog1, blog2;
|
private Blog blog0, blog1, blog2, rssBlog;
|
||||||
private SharerListener listener0;
|
private SharerListener listener0;
|
||||||
private InviteeListener listener1;
|
private InviteeListener listener1;
|
||||||
|
|
||||||
@@ -69,6 +70,8 @@ public class BlogSharingIntegrationTest
|
|||||||
blog0 = blogManager0.getPersonalBlog(author0);
|
blog0 = blogManager0.getPersonalBlog(author0);
|
||||||
blog1 = blogManager0.getPersonalBlog(author1);
|
blog1 = blogManager0.getPersonalBlog(author1);
|
||||||
blog2 = blogManager0.getPersonalBlog(author2);
|
blog2 = blogManager0.getPersonalBlog(author2);
|
||||||
|
BlogFactory blogFactory = c0.getBlogFactory();
|
||||||
|
rssBlog = blogFactory.createFeedBlog(author0);
|
||||||
|
|
||||||
// initialize waiters fresh for each test
|
// initialize waiters fresh for each test
|
||||||
eventWaiter = new Waiter();
|
eventWaiter = new Waiter();
|
||||||
@@ -127,8 +130,7 @@ public class BlogSharingIntegrationTest
|
|||||||
|
|
||||||
// get sharing group and assert group message count
|
// get sharing group and assert group message count
|
||||||
GroupId g = contactGroupFactory.createContactGroup(CLIENT_ID,
|
GroupId g = contactGroupFactory.createContactGroup(CLIENT_ID,
|
||||||
contact1From0)
|
contact1From0).getId();
|
||||||
.getId();
|
|
||||||
assertGroupCount(messageTracker0, g, 1, 0);
|
assertGroupCount(messageTracker0, g, 1, 0);
|
||||||
|
|
||||||
// sync first request message
|
// sync first request message
|
||||||
@@ -146,6 +148,7 @@ public class BlogSharingIntegrationTest
|
|||||||
// blog was added successfully
|
// blog was added successfully
|
||||||
assertEquals(0, blogSharingManager0.getInvitations().size());
|
assertEquals(0, blogSharingManager0.getInvitations().size());
|
||||||
assertEquals(3, blogManager1.getBlogs().size());
|
assertEquals(3, blogManager1.getBlogs().size());
|
||||||
|
assertTrue(blogManager1.getBlogs().contains(blog2));
|
||||||
|
|
||||||
// invitee has one invitation message from sharer
|
// invitee has one invitation message from sharer
|
||||||
List<InvitationMessage> list =
|
List<InvitationMessage> list =
|
||||||
@@ -160,6 +163,7 @@ public class BlogSharingIntegrationTest
|
|||||||
assertFalse(invitation.isAvailable());
|
assertFalse(invitation.isAvailable());
|
||||||
assertEquals(blog2.getAuthor().getName(),
|
assertEquals(blog2.getAuthor().getName(),
|
||||||
invitation.getBlogAuthorName());
|
invitation.getBlogAuthorName());
|
||||||
|
assertFalse(invitation.getShareable().isRssFeed());
|
||||||
assertEquals(contactId1From0, invitation.getContactId());
|
assertEquals(contactId1From0, invitation.getContactId());
|
||||||
assertEquals("Hi!", invitation.getMessage());
|
assertEquals("Hi!", invitation.getMessage());
|
||||||
} else {
|
} else {
|
||||||
@@ -185,6 +189,81 @@ public class BlogSharingIntegrationTest
|
|||||||
assertGroupCount(messageTracker1, g, 2, 1);
|
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
|
@Test
|
||||||
public void testDeclinedSharing() throws Exception {
|
public void testDeclinedSharing() throws Exception {
|
||||||
// initialize and let invitee deny all requests
|
// initialize and let invitee deny all requests
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import org.briarproject.bramble.test.TestDatabaseModule;
|
|||||||
import org.briarproject.bramble.test.TestPluginConfigModule;
|
import org.briarproject.bramble.test.TestPluginConfigModule;
|
||||||
import org.briarproject.bramble.test.TestSeedProviderModule;
|
import org.briarproject.bramble.test.TestSeedProviderModule;
|
||||||
import org.briarproject.bramble.transport.TransportModule;
|
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.BlogManager;
|
||||||
import org.briarproject.briar.api.blog.BlogSharingManager;
|
import org.briarproject.briar.api.blog.BlogSharingManager;
|
||||||
import org.briarproject.briar.api.client.MessageTracker;
|
import org.briarproject.briar.api.client.MessageTracker;
|
||||||
@@ -138,4 +139,6 @@ public interface BriarIntegrationTestComponent {
|
|||||||
TransportPropertyManager getTransportPropertyManager();
|
TransportPropertyManager getTransportPropertyManager();
|
||||||
|
|
||||||
AuthorFactory getAuthorFactory();
|
AuthorFactory getAuthorFactory();
|
||||||
|
|
||||||
|
BlogFactory getBlogFactory();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user