From fa5304c1457d959e018e6d2a8fbf091104c0289f Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Wed, 6 Jul 2016 18:29:51 -0300 Subject: [PATCH 1/4] Add tests to ensure Forum Posts are synchronized both ways even after re-sharing an existing forum. --- .../org/briarproject/ForumManagerTest.java | 12 ++ .../ForumSharingIntegrationTest.java | 150 +++++++++++++++++- 2 files changed, 155 insertions(+), 7 deletions(-) diff --git a/briar-android-tests/src/test/java/org/briarproject/ForumManagerTest.java b/briar-android-tests/src/test/java/org/briarproject/ForumManagerTest.java index a9e21a6b0..cf9d4eff3 100644 --- a/briar-android-tests/src/test/java/org/briarproject/ForumManagerTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/ForumManagerTest.java @@ -209,6 +209,18 @@ public class ForumManagerTest { deliveryWaiter.await(TIMEOUT, 1); assertEquals(1, forumManager1.getPostHeaders(g).size()); + // add another forum post + time = clock.currentTimeMillis(); + ForumPost post2 = createForumPost(g, null, "b", time); + forumManager1.addLocalPost(post2); + assertEquals(1, forumManager0.getPostHeaders(g).size()); + assertEquals(2, forumManager1.getPostHeaders(g).size()); + + // send post to 0 + sync1To0(); + deliveryWaiter.await(TIMEOUT, 1); + assertEquals(2, forumManager1.getPostHeaders(g).size()); + stopLifecycles(); } 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 522ca424e..86ae6ed60 100644 --- a/briar-android-tests/src/test/java/org/briarproject/ForumSharingIntegrationTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/ForumSharingIntegrationTest.java @@ -9,6 +9,10 @@ import org.briarproject.api.clients.SessionId; import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactManager; +import org.briarproject.api.crypto.CryptoComponent; +import org.briarproject.api.crypto.KeyPair; +import org.briarproject.api.crypto.KeyParser; +import org.briarproject.api.crypto.PrivateKey; import org.briarproject.api.crypto.SecretKey; import org.briarproject.api.data.BdfList; import org.briarproject.api.db.DatabaseComponent; @@ -23,6 +27,9 @@ import org.briarproject.api.event.MessageStateChangedEvent; import org.briarproject.api.forum.Forum; import org.briarproject.api.forum.ForumInvitationMessage; import org.briarproject.api.forum.ForumManager; +import org.briarproject.api.forum.ForumPost; +import org.briarproject.api.forum.ForumPostFactory; +import org.briarproject.api.forum.ForumPostHeader; import org.briarproject.api.forum.ForumSharingManager; import org.briarproject.api.identity.AuthorFactory; import org.briarproject.api.identity.IdentityManager; @@ -62,7 +69,6 @@ import javax.inject.Inject; import static org.briarproject.TestPluginsModule.MAX_LATENCY; import static org.briarproject.api.forum.ForumConstants.FORUM_SALT_LENGTH; -import static org.briarproject.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH; import static org.briarproject.api.sharing.SharingConstants.SHARE_MSG_TYPE_INVITATION; import static org.briarproject.api.sync.ValidationManager.State.DELIVERED; import static org.briarproject.api.sync.ValidationManager.State.INVALID; @@ -87,6 +93,10 @@ public class ForumSharingIntegrationTest extends BriarTestCase { Clock clock; @Inject AuthorFactory authorFactory; + @Inject + ForumPostFactory forumPostFactory; + @Inject + CryptoComponent cryptoComponent; // objects accessed from background threads need to be volatile private volatile ForumSharingManager forumSharingManager0; @@ -731,6 +741,119 @@ public class ForumSharingIntegrationTest extends BriarTestCase { } } + @Test + public void testSyncAfterReSharing() throws Exception { + startLifecycles(); + try { + // initialize and let invitee accept all requests + defaultInit(true); + + // send invitation + forumSharingManager0 + .sendInvitation(forum0.getId(), contactId1, "Hi!"); + + // sync first request message + syncToInvitee(); + eventWaiter.await(TIMEOUT, 1); + + // sync response back + syncToSharer(); + eventWaiter.await(TIMEOUT, 1); + + // sharer posts into the forum + long time = clock.currentTimeMillis(); + byte[] body = TestUtils.getRandomBytes(42); + KeyParser keyParser = cryptoComponent.getSignatureKeyParser(); + PrivateKey key = keyParser.parsePrivateKey(author0.getPrivateKey()); + ForumPost p = forumPostFactory + .createPseudonymousPost(forum0.getId(), time, null, author0, + "text/plain", body, key); + forumManager0.addLocalPost(p); + + // sync forum post + syncToInvitee(); + + // make sure forum post arrived + Collection headers = + forumManager1.getPostHeaders(forum0.getId()); + assertEquals(1, headers.size()); + ForumPostHeader header = headers.iterator().next(); + assertEquals(p.getMessage().getId(), header.getId()); + assertEquals(author0, header.getAuthor()); + + // now invitee creates a post + time = clock.currentTimeMillis(); + body = TestUtils.getRandomBytes(42); + key = keyParser.parsePrivateKey(author1.getPrivateKey()); + p = forumPostFactory + .createPseudonymousPost(forum0.getId(), time, null, author1, + "text/plain", body, key); + forumManager1.addLocalPost(p); + + // sync forum post + syncToSharer(); + + // make sure forum post arrived + headers = forumManager1.getPostHeaders(forum0.getId()); + assertEquals(2, headers.size()); + boolean found = false; + for (ForumPostHeader h : headers) { + if (p.getMessage().getId().equals(h.getId())) { + found = true; + assertEquals(author1, h.getAuthor()); + } + } + assertTrue(found); + + // contacts remove each other + contactManager0.removeContact(contactId1); + contactManager1.removeContact(contactId0); + contactManager1.removeContact(contactId2); + contactManager2.removeContact(contactId21); + + // contacts add each other back + addDefaultContacts(); + + // send invitation again + forumSharingManager0 + .sendInvitation(forum0.getId(), contactId1, "Hi!"); + + // sync first request message + syncToInvitee(); + eventWaiter.await(TIMEOUT, 1); + + // sync response back + syncToSharer(); + eventWaiter.await(TIMEOUT, 1); + + // now invitee creates a post + time = clock.currentTimeMillis(); + body = TestUtils.getRandomBytes(42); + key = keyParser.parsePrivateKey(author1.getPrivateKey()); + p = forumPostFactory + .createPseudonymousPost(forum0.getId(), time, null, author1, + "text/plain", body, key); + forumManager1.addLocalPost(p); + + // sync forum post + syncToSharer(); + + // make sure forum post arrived + headers = forumManager1.getPostHeaders(forum0.getId()); + assertEquals(3, headers.size()); + found = false; + for (ForumPostHeader h : headers) { + if (p.getMessage().getId().equals(h.getId())) { + found = true; + assertEquals(author1, h.getAuthor()); + } + } + assertTrue(found); + } finally { + stopLifecycles(); + } + } + @After public void tearDown() throws InterruptedException { @@ -753,6 +876,10 @@ public class ForumSharingIntegrationTest extends BriarTestCase { LOG.info("TEST: Sharer received message in group " + event.getMessage().getGroupId().hashCode()); msgWaiter.resume(); + } else if (s == DELIVERED && !event.isLocal() && + c.equals(forumManager0.getClientId())) { + LOG.info("TEST: Sharer received forum post"); + msgWaiter.resume(); } } else if (e instanceof ForumInvitationResponseReceivedEvent) { ForumInvitationResponseReceivedEvent event = @@ -807,6 +934,10 @@ public class ForumSharingIntegrationTest extends BriarTestCase { LOG.info("TEST: Invitee received message in group " + event.getMessage().getGroupId().hashCode()); msgWaiter.resume(); + } else if (s == DELIVERED && !event.isLocal() && + c.equals(forumManager0.getClientId())) { + LOG.info("TEST: Invitee received forum post"); + msgWaiter.resume(); } } else if (e instanceof ForumInvitationReceivedEvent) { ForumInvitationReceivedEvent event = @@ -866,17 +997,22 @@ public class ForumSharingIntegrationTest extends BriarTestCase { } private void addDefaultIdentities() throws DbException { + KeyPair keyPair = cryptoComponent.generateSignatureKeyPair(); author0 = authorFactory.createLocalAuthor(SHARER, - TestUtils.getRandomBytes(MAX_PUBLIC_KEY_LENGTH), - TestUtils.getRandomBytes(123)); + keyPair.getPublic().getEncoded(), + keyPair.getPrivate().getEncoded()); identityManager0.addLocalAuthor(author0); + + keyPair = cryptoComponent.generateSignatureKeyPair(); author1 = authorFactory.createLocalAuthor(INVITEE, - TestUtils.getRandomBytes(MAX_PUBLIC_KEY_LENGTH), - TestUtils.getRandomBytes(123)); + keyPair.getPublic().getEncoded(), + keyPair.getPrivate().getEncoded()); identityManager1.addLocalAuthor(author1); + + keyPair = cryptoComponent.generateSignatureKeyPair(); author2 = authorFactory.createLocalAuthor(SHARER2, - TestUtils.getRandomBytes(MAX_PUBLIC_KEY_LENGTH), - TestUtils.getRandomBytes(123)); + keyPair.getPublic().getEncoded(), + keyPair.getPrivate().getEncoded()); identityManager2.addLocalAuthor(author2); } From c577efacbece7ed34083a4c0a1f7dbbf3816b334 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 7 Jul 2016 13:43:35 -0300 Subject: [PATCH 2/4] Show all Forum Invitations, not only the first --- .../ForumSharingIntegrationTest.java | 28 ++++--- .../forum/AvailableForumsActivity.java | 2 +- .../android/forum/ForumListFragment.java | 2 +- .../api/blogs/BlogSharingManager.java | 4 +- .../api/forum/ForumSharingManager.java | 4 +- .../api/sharing/SharingConstants.java | 1 - .../api/sharing/SharingManager.java | 8 +- .../sharing/BlogSharingManagerImpl.java | 5 -- .../sharing/ForumSharingManagerImpl.java | 5 -- .../sharing/SharingManagerImpl.java | 77 +++++++++++-------- 10 files changed, 72 insertions(+), 64 deletions(-) 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 86ae6ed60..444f2f4c8 100644 --- a/briar-android-tests/src/test/java/org/briarproject/ForumSharingIntegrationTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/ForumSharingIntegrationTest.java @@ -183,7 +183,7 @@ public class ForumSharingIntegrationTest extends BriarTestCase { assertTrue(listener0.responseReceived); // forum was added successfully - assertEquals(0, forumSharingManager0.getAvailable().size()); + assertEquals(0, forumSharingManager0.getInvited().size()); assertEquals(1, forumManager1.getForums().size()); // invitee has one invitation message from sharer @@ -233,10 +233,10 @@ public class ForumSharingIntegrationTest extends BriarTestCase { assertTrue(listener0.responseReceived); // forum was not added - assertEquals(0, forumSharingManager0.getAvailable().size()); + assertEquals(0, forumSharingManager0.getInvited().size()); assertEquals(0, forumManager1.getForums().size()); // forum is no longer available to invitee who declined - assertEquals(0, forumSharingManager1.getAvailable().size()); + assertEquals(0, forumSharingManager1.getInvited().size()); // invitee has one invitation message from sharer List list = @@ -283,7 +283,7 @@ public class ForumSharingIntegrationTest extends BriarTestCase { assertTrue(listener0.responseReceived); // forum was added successfully - assertEquals(0, forumSharingManager0.getAvailable().size()); + assertEquals(0, forumSharingManager0.getInvited().size()); assertEquals(1, forumManager1.getForums().size()); assertTrue(forumManager1.getForums().contains(forum0)); @@ -303,7 +303,7 @@ public class ForumSharingIntegrationTest extends BriarTestCase { syncToSharer(); // forum is gone - assertEquals(0, forumSharingManager0.getAvailable().size()); + assertEquals(0, forumSharingManager0.getInvited().size()); assertEquals(0, forumManager1.getForums().size()); // sharer no longer shares forum with invitee @@ -343,7 +343,7 @@ public class ForumSharingIntegrationTest extends BriarTestCase { assertTrue(listener0.responseReceived); // forum was added successfully - assertEquals(0, forumSharingManager0.getAvailable().size()); + assertEquals(0, forumSharingManager0.getInvited().size()); assertEquals(1, forumManager1.getForums().size()); assertTrue(forumManager1.getForums().contains(forum0)); @@ -394,8 +394,9 @@ public class ForumSharingIntegrationTest extends BriarTestCase { // sharer un-subscribes from forum forumManager0.removeForum(forum0); - // from here on expect the response to fail with a DbException - thrown.expect(DbException.class); + // from here on expect the response to fail with an AssertionError, + // because there is in fact no invited forum available anymore + thrown.expect(AssertionError.class); // sync first request message and leave message syncToInvitee(); @@ -403,7 +404,7 @@ public class ForumSharingIntegrationTest extends BriarTestCase { assertTrue(listener1.requestReceived); // invitee has no forums available - assertEquals(0, forumSharingManager1.getAvailable().size()); + assertEquals(0, forumSharingManager1.getInvited().size()); } finally { stopLifecycles(); } @@ -709,10 +710,11 @@ public class ForumSharingIntegrationTest extends BriarTestCase { deliverMessage(sync2, contactId2, sync1, contactId1, "Sharer2 to Invitee"); - // make sure we have only one forum available - Collection forums = - forumSharingManager1.getAvailable(); + // make sure we now have two invitations to the same forum available + Collection forums = forumSharingManager1.getInvited(); assertEquals(1, forums.size()); + assertEquals(2, + forumSharingManager1.getSharedBy(forum0.getId()).size()); // make sure both sharers actually share the forum Collection contacts = @@ -946,6 +948,8 @@ public class ForumSharingIntegrationTest extends BriarTestCase { if (!answer) return; Forum f = event.getForum(); try { + eventWaiter.assertEquals(1, + forumSharingManager1.getInvited().size()); Contact c = contactManager1.getContact(event.getContactId()); forumSharingManager1.respondToInvitation(f, c, accept); diff --git a/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java b/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java index f7034475c..c44fbcb01 100644 --- a/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java +++ b/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java @@ -82,7 +82,7 @@ public class AvailableForumsActivity extends BriarActivity try { Collection available = new ArrayList<>(); long now = System.currentTimeMillis(); - for (Forum f : forumSharingManager.getAvailable()) { + for (Forum f : forumSharingManager.getInvited()) { try { Collection c = forumSharingManager.getSharedBy(f.getId()); diff --git a/briar-android/src/org/briarproject/android/forum/ForumListFragment.java b/briar-android/src/org/briarproject/android/forum/ForumListFragment.java index d8c5c81bd..161e4bb80 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumListFragment.java +++ b/briar-android/src/org/briarproject/android/forum/ForumListFragment.java @@ -188,7 +188,7 @@ public class ForumListFragment extends BaseEventFragment implements try { long now = System.currentTimeMillis(); int available = - forumSharingManager.getAvailable().size(); + forumSharingManager.getInvited().size(); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) LOG.info("Loading available took " + duration + " ms"); diff --git a/briar-api/src/org/briarproject/api/blogs/BlogSharingManager.java b/briar-api/src/org/briarproject/api/blogs/BlogSharingManager.java index ec9f23e49..6fed69e19 100644 --- a/briar-api/src/org/briarproject/api/blogs/BlogSharingManager.java +++ b/briar-api/src/org/briarproject/api/blogs/BlogSharingManager.java @@ -38,9 +38,9 @@ public interface BlogSharingManager ContactId contactId) throws DbException; /** - * Returns all blogs to which the user could subscribe. + * Returns all blogs to which the user has been invited. */ - Collection getAvailable() throws DbException; + Collection getInvited() 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 55da0615f..365cf18e7 100644 --- a/briar-api/src/org/briarproject/api/forum/ForumSharingManager.java +++ b/briar-api/src/org/briarproject/api/forum/ForumSharingManager.java @@ -34,8 +34,8 @@ public interface ForumSharingManager extends SharingManager getInvitationMessages( ContactId contactId) throws DbException; - /** Returns all forums to which the user could subscribe. */ - Collection getAvailable() throws DbException; + /** Returns all forums to which the user has been invited. */ + Collection getInvited() throws DbException; /** Returns all contacts who are sharing the given forum with us. */ Collection getSharedBy(GroupId g) throws DbException; diff --git a/briar-api/src/org/briarproject/api/sharing/SharingConstants.java b/briar-api/src/org/briarproject/api/sharing/SharingConstants.java index 952bfd660..43d689729 100644 --- a/briar-api/src/org/briarproject/api/sharing/SharingConstants.java +++ b/briar-api/src/org/briarproject/api/sharing/SharingConstants.java @@ -25,7 +25,6 @@ public interface SharingConstants { int SHARE_MSG_TYPE_DECLINE = 3; int SHARE_MSG_TYPE_LEAVE = 4; int SHARE_MSG_TYPE_ABORT = 5; - String TASK = "task"; int TASK_ADD_SHAREABLE_TO_LIST_SHARED_WITH_US = 0; int TASK_REMOVE_SHAREABLE_FROM_LIST_SHARED_WITH_US = 1; int TASK_ADD_SHARED_SHAREABLE = 2; diff --git a/briar-api/src/org/briarproject/api/sharing/SharingManager.java b/briar-api/src/org/briarproject/api/sharing/SharingManager.java index 8c5db480b..100ab5dc4 100644 --- a/briar-api/src/org/briarproject/api/sharing/SharingManager.java +++ b/briar-api/src/org/briarproject/api/sharing/SharingManager.java @@ -3,8 +3,6 @@ package org.briarproject.api.sharing; import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.db.DbException; -import org.briarproject.api.forum.Forum; -import org.briarproject.api.forum.ForumInvitationMessage; import org.briarproject.api.sync.ClientId; import org.briarproject.api.sync.GroupId; @@ -16,7 +14,7 @@ public interface SharingManager getInvitationMessages( ContactId contactId) throws DbException; - /** Returns all groups to which the user could subscribe. */ - Collection getAvailable() throws DbException; + /** Returns all shareables to which the user has been invited. */ + Collection getInvited() throws DbException; /** Returns all contacts who are sharing the given group with us. */ Collection getSharedBy(GroupId g) throws DbException; diff --git a/briar-core/src/org/briarproject/sharing/BlogSharingManagerImpl.java b/briar-core/src/org/briarproject/sharing/BlogSharingManagerImpl.java index a25520fac..a8bd64b2a 100644 --- a/briar-core/src/org/briarproject/sharing/BlogSharingManagerImpl.java +++ b/briar-core/src/org/briarproject/sharing/BlogSharingManagerImpl.java @@ -80,11 +80,6 @@ class BlogSharingManagerImpl extends return CLIENT_ID; } - @Override - protected ClientId getShareableClientId() { - return blogManager.getClientId(); - } - @Override protected BlogInvitationMessage createInvitationMessage(MessageId id, BlogInvitation msg, ContactId contactId, boolean available, diff --git a/briar-core/src/org/briarproject/sharing/ForumSharingManagerImpl.java b/briar-core/src/org/briarproject/sharing/ForumSharingManagerImpl.java index eb06dff4c..9cee63463 100644 --- a/briar-core/src/org/briarproject/sharing/ForumSharingManagerImpl.java +++ b/briar-core/src/org/briarproject/sharing/ForumSharingManagerImpl.java @@ -78,11 +78,6 @@ class ForumSharingManagerImpl extends return CLIENT_ID; } - @Override - protected ClientId getShareableClientId() { - return forumManager.getClientId(); - } - @Override protected ForumInvitationMessage createInvitationMessage(MessageId id, ForumInvitation msg, ContactId contactId, boolean available, diff --git a/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java b/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java index e4929fb79..9df89ceb6 100644 --- a/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java +++ b/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java @@ -81,6 +81,7 @@ import static org.briarproject.api.sharing.SharingConstants.TO_BE_SHARED_BY_US; import static org.briarproject.api.sharing.SharingConstants.TYPE; import static org.briarproject.api.sharing.SharingMessage.BaseMessage; import static org.briarproject.api.sharing.SharingMessage.Invitation; +import static org.briarproject.sharing.InviteeSessionState.State.AWAIT_LOCAL_RESPONSE; abstract class SharingManagerImpl extends BdfIncomingMessageHook @@ -116,8 +117,6 @@ abstract class SharingManagerImpl getAvailable() throws DbException { + public Collection getInvited() throws DbException { + Transaction txn = db.startTransaction(true); try { - Set available = new HashSet(); - Transaction txn = db.startTransaction(true); - try { - // Get any shareables we subscribe to - Set subscribed = new HashSet(db.getGroups(txn, - getShareableClientId())); - // Get all shareables shared by contacts - for (Contact c : db.getContacts(txn)) { - Group g = getContactGroup(c); - List shareables = - getShareableList(txn, g.getId(), SHARED_WITH_US); - for (S f : shareables) { - if (!subscribed.contains(f.getGroup())) - available.add(f); - } - } - txn.setComplete(); - } finally { - db.endTransaction(txn); + Set invited = new HashSet(); + Collection contacts = db.getContacts(txn); + for (Contact contact : contacts) { + invited.addAll(getInvited(txn, contact)); } - return Collections.unmodifiableSet(available); - } catch (IOException e) { + txn.setComplete(); + return Collections.unmodifiableCollection(invited); + } catch (FormatException e) { throw new DbException(e); + } finally { + db.endTransaction(txn); } } + private Collection getInvited(Transaction txn, Contact contact) + throws DbException, FormatException { + + // query for all external invitations + BdfDictionary query = BdfDictionary.of( + new BdfEntry(TYPE, SHARE_MSG_TYPE_INVITATION), + new BdfEntry(LOCAL, false) + ); + Group group = getContactGroup(contact); + + Set invited = new HashSet(); + Map map = clientHelper + .getMessageMetadataAsDictionary(txn, group.getId(), query); + for (Map.Entry m : map.entrySet()) { + BdfDictionary d = m.getValue(); + try { + I msg = getIFactory().build(group.getId(), d); + IS iss = (IS) getSessionState(txn, msg.getSessionId(), true); + // get and add the shareable if the invitation is unanswered + if (iss.getState().equals(AWAIT_LOCAL_RESPONSE)) { + S s = getSFactory().parse(iss); + invited.add(s); + } + } catch (FormatException e) { + if (LOG.isLoggable(WARNING)) + LOG.log(WARNING, e.toString(), e); + } + } + return invited; + } + @Override public Collection getSharedBy(GroupId g) throws DbException { try { @@ -473,7 +492,7 @@ abstract class SharingManagerImpl map = clientHelper From 6301b2a9a285096b3509c548fc948e84f6f13160 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 7 Jul 2016 14:47:20 -0300 Subject: [PATCH 3/4] Change Available Forums into Forum Invitations --- briar-android/AndroidManifest.xml | 4 +- .../res/layout/list_item_available_forum.xml | 49 +++++++++++++------ .../layout/list_item_forum_invitation_in.xml | 2 +- briar-android/res/values-pt-rBR/strings.xml | 2 +- briar-android/res/values/strings.xml | 5 +- .../android/ActivityComponent.java | 4 +- .../android/contact/ConversationAdapter.java | 4 +- .../android/forum/AvailableForumsItem.java | 23 --------- ...apter.java => ForumInvitationAdapter.java} | 49 ++++++++++++------- ...Contacts.java => ForumInvitationItem.java} | 12 ++++- ...ity.java => ForumInvitationsActivity.java} | 41 ++++++++-------- .../android/forum/ForumListFragment.java | 2 +- 12 files changed, 106 insertions(+), 91 deletions(-) delete mode 100644 briar-android/src/org/briarproject/android/forum/AvailableForumsItem.java rename briar-android/src/org/briarproject/android/forum/{AvailableForumsAdapter.java => ForumInvitationAdapter.java} (73%) rename briar-android/src/org/briarproject/android/forum/{ForumContacts.java => ForumInvitationItem.java} (61%) rename briar-android/src/org/briarproject/android/forum/{AvailableForumsActivity.java => ForumInvitationsActivity.java} (81%) diff --git a/briar-android/AndroidManifest.xml b/briar-android/AndroidManifest.xml index 2d8dc0223..bb82d0095 100644 --- a/briar-android/AndroidManifest.xml +++ b/briar-android/AndroidManifest.xml @@ -99,8 +99,8 @@ + android:background="?attr/selectableItemBackground" + android:paddingTop="@dimen/listitem_horizontal_margin"> @@ -34,38 +36,55 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/forumNameView" - android:layout_marginBottom="-8dp" + android:layout_marginEnd="@dimen/listitem_horizontal_margin" + android:layout_marginRight="@dimen/listitem_horizontal_margin" android:layout_toEndOf="@+id/avatarView" android:layout_toRightOf="@+id/avatarView" android:paddingTop="@dimen/margin_medium" - android:textColor="@android:color/secondary_text_light" + android:textColor="@color/briar_text_secondary" android:textSize="@dimen/text_size_small" tools:text="Shared by Megalox"/> + +