From 351e1bbbe6de697d79bf975cd56a2b519dcc1436 Mon Sep 17 00:00:00 2001 From: akwizgran <akwizgran@users.sourceforge.net> Date: Thu, 17 Dec 2015 16:27:55 +0000 Subject: [PATCH] Facade for forum post headers. #172 --- .../android/forum/ForumActivity.java | 58 +++++++++---------- .../android/forum/ForumAdapter.java | 4 +- .../briarproject/android/forum/ForumItem.java | 8 +-- .../android/forum/ForumListActivity.java | 12 ++-- .../android/forum/ForumListItem.java | 8 +-- .../android/forum/ReadForumPostActivity.java | 16 ++--- .../android/forum/WriteForumPostActivity.java | 26 ++++----- .../briarproject/api/forum/ForumManager.java | 16 +++-- .../api/forum/ForumPostHeader.java | 19 ++++++ .../briarproject/forum/ForumManagerImpl.java | 14 +++-- .../forum/ForumPostHeaderImpl.java | 46 +++++++++++++++ 11 files changed, 148 insertions(+), 79 deletions(-) create mode 100644 briar-api/src/org/briarproject/api/forum/ForumPostHeader.java create mode 100644 briar-core/src/org/briarproject/forum/ForumPostHeaderImpl.java diff --git a/briar-android/src/org/briarproject/android/forum/ForumActivity.java b/briar-android/src/org/briarproject/android/forum/ForumActivity.java index 99df221fc0..2916238f9a 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumActivity.java +++ b/briar-android/src/org/briarproject/android/forum/ForumActivity.java @@ -28,9 +28,9 @@ import org.briarproject.api.event.MessageAddedEvent; import org.briarproject.api.event.SubscriptionRemovedEvent; import org.briarproject.api.forum.Forum; import org.briarproject.api.forum.ForumManager; +import org.briarproject.api.forum.ForumPostHeader; import org.briarproject.api.identity.Author; import org.briarproject.api.sync.GroupId; -import org.briarproject.api.sync.MessageHeader; import org.briarproject.api.sync.MessageId; import java.util.ArrayList; @@ -180,8 +180,8 @@ OnClickListener, OnItemClickListener { public void run() { try { long now = System.currentTimeMillis(); - Collection<MessageHeader> headers = - forumManager.getMessageHeaders(groupId); + Collection<ForumPostHeader> headers = + forumManager.getPostHeaders(groupId); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) LOG.info("Load took " + duration + " ms"); @@ -196,7 +196,7 @@ OnClickListener, OnItemClickListener { }); } - private void displayHeaders(final Collection<MessageHeader> headers) { + private void displayHeaders(final Collection<ForumPostHeader> headers) { runOnUiThread(new Runnable() { public void run() { loading.setVisibility(GONE); @@ -207,10 +207,10 @@ OnClickListener, OnItemClickListener { } else { empty.setVisibility(GONE); list.setVisibility(VISIBLE); - for (MessageHeader h : headers) { + for (ForumPostHeader h : headers) { ForumItem item = new ForumItem(h); byte[] body = bodyCache.get(h.getId()); - if (body == null) loadMessageBody(h); + if (body == null) loadPostBody(h); else item.setBody(body); adapter.add(item); } @@ -223,16 +223,16 @@ OnClickListener, OnItemClickListener { }); } - private void loadMessageBody(final MessageHeader h) { + private void loadPostBody(final ForumPostHeader h) { runOnDbThread(new Runnable() { public void run() { try { long now = System.currentTimeMillis(); - byte[] body = forumManager.getMessageBody(h.getId()); + byte[] body = forumManager.getPostBody(h.getId()); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) LOG.info("Loading message took " + duration + " ms"); - displayMessage(h.getId(), body); + displayPost(h.getId(), body); } catch (NoSuchMessageException e) { // The item will be removed when we get the event } catch (DbException e) { @@ -243,7 +243,7 @@ OnClickListener, OnItemClickListener { }); } - private void displayMessage(final MessageId m, final byte[] body) { + private void displayPost(final MessageId m, final byte[] body) { runOnUiThread(new Runnable() { public void run() { bodyCache.put(m, body); @@ -268,7 +268,7 @@ OnClickListener, OnItemClickListener { if (request == REQUEST_READ && result == RESULT_PREV_NEXT) { int position = data.getIntExtra("briar.POSITION", -1); if (position >= 0 && position < adapter.getCount()) - displayMessage(position); + displayPost(position); } } @@ -276,24 +276,24 @@ OnClickListener, OnItemClickListener { public void onPause() { super.onPause(); eventBus.removeListener(this); - if (isFinishing()) markMessagesRead(); + if (isFinishing()) markPostsRead(); } - private void markMessagesRead() { + private void markPostsRead() { notificationManager.clearForumPostNotification(groupId); List<MessageId> unread = new ArrayList<MessageId>(); int count = adapter.getCount(); for (int i = 0; i < count; i++) { - MessageHeader h = adapter.getItem(i).getHeader(); + ForumPostHeader h = adapter.getItem(i).getHeader(); if (!h.isRead()) unread.add(h.getId()); } if (unread.isEmpty()) return; if (LOG.isLoggable(INFO)) - LOG.info("Marking " + unread.size() + " messages read"); - markMessagesRead(Collections.unmodifiableList(unread)); + LOG.info("Marking " + unread.size() + " posts read"); + markPostsRead(Collections.unmodifiableList(unread)); } - private void markMessagesRead(final Collection<MessageId> unread) { + private void markPostsRead(final Collection<MessageId> unread) { runOnDbThread(new Runnable() { public void run() { try { @@ -331,7 +331,7 @@ OnClickListener, OnItemClickListener { Intent i = new Intent(this, WriteForumPostActivity.class); i.putExtra("briar.GROUP_ID", groupId.getBytes()); i.putExtra("briar.FORUM_NAME", forum.getName()); - i.putExtra("briar.MIN_TIMESTAMP", getMinTimestampForNewMessage()); + i.putExtra("briar.MIN_TIMESTAMP", getMinTimestampForNewPost()); startActivity(i); } else if (view == shareButton) { Intent i = new Intent(this, ShareForumActivity.class); @@ -341,8 +341,8 @@ OnClickListener, OnItemClickListener { } } - private long getMinTimestampForNewMessage() { - // Don't use an earlier timestamp than the newest message + private long getMinTimestampForNewPost() { + // Don't use an earlier timestamp than the newest post long timestamp = 0; int count = adapter.getCount(); for (int i = 0; i < count; i++) { @@ -354,21 +354,21 @@ OnClickListener, OnItemClickListener { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - displayMessage(position); + displayPost(position); } - private void displayMessage(int position) { - MessageHeader item = adapter.getItem(position).getHeader(); + private void displayPost(int position) { + ForumPostHeader header = adapter.getItem(position).getHeader(); Intent i = new Intent(this, ReadForumPostActivity.class); i.putExtra("briar.GROUP_ID", groupId.getBytes()); i.putExtra("briar.FORUM_NAME", forum.getName()); - i.putExtra("briar.MESSAGE_ID", item.getId().getBytes()); - Author author = item.getAuthor(); + i.putExtra("briar.MESSAGE_ID", header.getId().getBytes()); + Author author = header.getAuthor(); if (author != null) i.putExtra("briar.AUTHOR_NAME", author.getName()); - i.putExtra("briar.AUTHOR_STATUS", item.getAuthorStatus().name()); - i.putExtra("briar.CONTENT_TYPE", item.getContentType()); - i.putExtra("briar.TIMESTAMP", item.getTimestamp()); - i.putExtra("briar.MIN_TIMESTAMP", getMinTimestampForNewMessage()); + i.putExtra("briar.AUTHOR_STATUS", header.getAuthorStatus().name()); + i.putExtra("briar.CONTENT_TYPE", header.getContentType()); + i.putExtra("briar.TIMESTAMP", header.getTimestamp()); + i.putExtra("briar.MIN_TIMESTAMP", getMinTimestampForNewPost()); i.putExtra("briar.POSITION", position); startActivityForResult(i, REQUEST_READ); } diff --git a/briar-android/src/org/briarproject/android/forum/ForumAdapter.java b/briar-android/src/org/briarproject/android/forum/ForumAdapter.java index 506796f0b6..ac12114474 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumAdapter.java +++ b/briar-android/src/org/briarproject/android/forum/ForumAdapter.java @@ -13,8 +13,8 @@ import android.widget.TextView; import org.briarproject.R; import org.briarproject.android.util.AuthorView; import org.briarproject.android.util.LayoutUtils; +import org.briarproject.api.forum.ForumPostHeader; import org.briarproject.api.identity.Author; -import org.briarproject.api.sync.MessageHeader; import org.briarproject.util.StringUtils; import java.util.ArrayList; @@ -38,7 +38,7 @@ class ForumAdapter extends ArrayAdapter<ForumItem> { @Override public View getView(int position, View convertView, ViewGroup parent) { ForumItem item = getItem(position); - MessageHeader header = item.getHeader(); + ForumPostHeader header = item.getHeader(); Context ctx = getContext(); Resources res = ctx.getResources(); diff --git a/briar-android/src/org/briarproject/android/forum/ForumItem.java b/briar-android/src/org/briarproject/android/forum/ForumItem.java index ec87cbf034..92ae9320bf 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumItem.java +++ b/briar-android/src/org/briarproject/android/forum/ForumItem.java @@ -1,19 +1,19 @@ package org.briarproject.android.forum; -import org.briarproject.api.sync.MessageHeader; +import org.briarproject.api.forum.ForumPostHeader; // This class is not thread-safe class ForumItem { - private final MessageHeader header; + private final ForumPostHeader header; private byte[] body; - ForumItem(MessageHeader header) { + ForumItem(ForumPostHeader header) { this.header = header; body = null; } - MessageHeader getHeader() { + ForumPostHeader getHeader() { return header; } diff --git a/briar-android/src/org/briarproject/android/forum/ForumListActivity.java b/briar-android/src/org/briarproject/android/forum/ForumListActivity.java index e57ddfee3f..fe1a08b7cd 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumListActivity.java +++ b/briar-android/src/org/briarproject/android/forum/ForumListActivity.java @@ -34,9 +34,9 @@ import org.briarproject.api.event.SubscriptionAddedEvent; import org.briarproject.api.event.SubscriptionRemovedEvent; import org.briarproject.api.forum.Forum; import org.briarproject.api.forum.ForumManager; +import org.briarproject.api.forum.ForumPostHeader; import org.briarproject.api.sync.Group; import org.briarproject.api.sync.GroupId; -import org.briarproject.api.sync.MessageHeader; import java.util.Collection; import java.util.Map; @@ -156,8 +156,8 @@ OnCreateContextMenuListener { long now = System.currentTimeMillis(); for (Forum f : forumManager.getForums()) { try { - Collection<MessageHeader> headers = - forumManager.getMessageHeaders(f.getId()); + Collection<ForumPostHeader> headers = + forumManager.getPostHeaders(f.getId()); displayHeaders(f, headers); } catch (NoSuchSubscriptionException e) { // Continue @@ -191,7 +191,7 @@ OnCreateContextMenuListener { } private void displayHeaders(final Forum f, - final Collection<MessageHeader> headers) { + final Collection<ForumPostHeader> headers) { runOnUiThread(new Runnable() { public void run() { GroupId id = f.getId(); @@ -282,8 +282,8 @@ OnCreateContextMenuListener { try { long now = System.currentTimeMillis(); Forum f = forumManager.getForum(g); - Collection<MessageHeader> headers = - forumManager.getMessageHeaders(g); + Collection<ForumPostHeader> headers = + forumManager.getPostHeaders(g); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) LOG.info("Partial load took " + duration + " ms"); diff --git a/briar-android/src/org/briarproject/android/forum/ForumListItem.java b/briar-android/src/org/briarproject/android/forum/ForumListItem.java index f3d665b47b..f6e55a8a11 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumListItem.java +++ b/briar-android/src/org/briarproject/android/forum/ForumListItem.java @@ -1,7 +1,7 @@ package org.briarproject.android.forum; import org.briarproject.api.forum.Forum; -import org.briarproject.api.sync.MessageHeader; +import org.briarproject.api.forum.ForumPostHeader; import java.util.Collection; @@ -12,17 +12,17 @@ class ForumListItem { private final long timestamp; private final int unread; - ForumListItem(Forum forum, Collection<MessageHeader> headers) { + ForumListItem(Forum forum, Collection<ForumPostHeader> headers) { this.forum = forum; empty = headers.isEmpty(); if (empty) { timestamp = 0; unread = 0; } else { - MessageHeader newest = null; + ForumPostHeader newest = null; long timestamp = -1; int unread = 0; - for (MessageHeader h : headers) { + for (ForumPostHeader h : headers) { if (h.getTimestamp() > timestamp) { timestamp = h.getTimestamp(); newest = h; diff --git a/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java b/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java index 3c3c7dac6c..706cb31fe0 100644 --- a/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java +++ b/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java @@ -120,7 +120,7 @@ implements OnClickListener { content = new TextView(this); content.setPadding(pad, 0, pad, pad); message.addView(content); - loadMessageBody(); + loadPostBody(); } scrollView.addView(message); layout.addView(scrollView); @@ -161,10 +161,10 @@ implements OnClickListener { @Override public void onPause() { super.onPause(); - if (isFinishing()) markMessageRead(); + if (isFinishing()) markPostRead(); } - private void markMessageRead() { + private void markPostRead() { runOnDbThread(new Runnable() { public void run() { try { @@ -181,16 +181,16 @@ implements OnClickListener { }); } - private void loadMessageBody() { + private void loadPostBody() { runOnDbThread(new Runnable() { public void run() { try { long now = System.currentTimeMillis(); - byte[] body = forumManager.getMessageBody(messageId); + byte[] body = forumManager.getPostBody(messageId); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) - LOG.info("Loading message took " + duration + " ms"); - displayMessageBody(StringUtils.fromUtf8(body)); + LOG.info("Loading post took " + duration + " ms"); + displayPostBody(StringUtils.fromUtf8(body)); } catch (NoSuchMessageException e) { finishOnUiThread(); } catch (DbException e) { @@ -201,7 +201,7 @@ implements OnClickListener { }); } - private void displayMessageBody(final String body) { + private void displayPostBody(final String body) { runOnUiThread(new Runnable() { public void run() { content.setText(body); diff --git a/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java b/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java index 62a56a9a98..c3346813c5 100644 --- a/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java +++ b/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java @@ -78,8 +78,8 @@ implements OnItemSelectedListener, OnClickListener { // Fields that are accessed from background threads must be volatile @Inject private volatile IdentityManager identityManager; @Inject private volatile ForumManager forumManager; - @Inject private volatile CryptoComponent crypto; @Inject private volatile ForumPostFactory forumPostFactory; + @Inject private volatile CryptoComponent crypto; private volatile MessageId parentId = null; private volatile long minTimestamp = -1; private volatile LocalAuthor localAuthor = null; @@ -160,10 +160,10 @@ implements OnItemSelectedListener, OnClickListener { @Override public void onResume() { super.onResume(); - loadAuthorsAndGroup(); + loadAuthorsAndForum(); } - private void loadAuthorsAndGroup() { + private void loadAuthorsAndForum() { runOnDbThread(new Runnable() { public void run() { try { @@ -174,7 +174,7 @@ implements OnItemSelectedListener, OnClickListener { long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) LOG.info("Load took " + duration + " ms"); - displayAuthorsAndGroup(localAuthors); + displayAuthorsAndForum(localAuthors); } catch (DbException e) { if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); @@ -183,7 +183,7 @@ implements OnItemSelectedListener, OnClickListener { }); } - private void displayAuthorsAndGroup( + private void displayAuthorsAndForum( final Collection<LocalAuthor> localAuthors) { runOnUiThread(new Runnable() { public void run() { @@ -226,7 +226,7 @@ implements OnItemSelectedListener, OnClickListener { byte[] b = data.getByteArrayExtra("briar.LOCAL_AUTHOR_ID"); if (b == null) throw new IllegalStateException(); localAuthorId = new AuthorId(b); - loadAuthorsAndGroup(); + loadAuthorsAndForum(); } } @@ -254,14 +254,14 @@ implements OnItemSelectedListener, OnClickListener { public void onClick(View view) { if (forum == null) throw new IllegalStateException(); - String message = content.getText().toString(); - if (message.equals("")) return; - createMessage(StringUtils.toUtf8(message)); + String body = content.getText().toString(); + if (body.equals("")) return; + createPost(StringUtils.toUtf8(body)); Toast.makeText(this, R.string.post_sent_toast, LENGTH_LONG).show(); finish(); } - private void createMessage(final byte[] body) { + private void createPost(final byte[] body) { cryptoExecutor.execute(new Runnable() { public void run() { // Don't use an earlier timestamp than the newest post @@ -285,17 +285,17 @@ implements OnItemSelectedListener, OnClickListener { } catch (IOException e) { throw new RuntimeException(e); } - storeMessage(m); + storePost(m); } }); } - private void storeMessage(final Message m) { + private void storePost(final Message m) { runOnDbThread(new Runnable() { public void run() { try { long now = System.currentTimeMillis(); - forumManager.addLocalMessage(m); + forumManager.addLocalPost(m); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) LOG.info("Storing message took " + duration + " ms"); diff --git a/briar-api/src/org/briarproject/api/forum/ForumManager.java b/briar-api/src/org/briarproject/api/forum/ForumManager.java index b2b70b70f3..41df06559b 100644 --- a/briar-api/src/org/briarproject/api/forum/ForumManager.java +++ b/briar-api/src/org/briarproject/api/forum/ForumManager.java @@ -5,7 +5,6 @@ import org.briarproject.api.contact.ContactId; import org.briarproject.api.db.DbException; import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.Message; -import org.briarproject.api.sync.MessageHeader; import org.briarproject.api.sync.MessageId; import java.util.Collection; @@ -18,8 +17,8 @@ public interface ForumManager { */ boolean addForum(Forum f) throws DbException; - /** Stores a local message. */ - void addLocalMessage(Message m) throws DbException; + /** Stores a local forum post. */ + void addLocalPost(Message m) throws DbException; /** Returns all forums to which the user could subscribe. */ Collection<Forum> getAvailableForums() throws DbException; @@ -30,12 +29,11 @@ public interface ForumManager { /** Returns all forums to which the user subscribes. */ Collection<Forum> getForums() throws DbException; - /** Returns the body of the message with the given ID. */ - byte[] getMessageBody(MessageId m) throws DbException; + /** Returns the body of the forum post with the given ID. */ + byte[] getPostBody(MessageId m) throws DbException; - /** Returns the headers of all messages in the given forum. */ - Collection<MessageHeader> getMessageHeaders(GroupId g) - throws DbException; + /** Returns the headers of all posts in the given forum. */ + Collection<ForumPostHeader> getPostHeaders(GroupId g) throws DbException; /** Returns all contacts who subscribe to the given forum. */ Collection<Contact> getSubscribers(GroupId g) throws DbException; @@ -49,7 +47,7 @@ public interface ForumManager { */ void removeForum(Forum f) throws DbException; - /** Marks a message as read or unread. */ + /** Marks a forum post as read or unread. */ void setReadFlag(MessageId m, boolean read) throws DbException; /** diff --git a/briar-api/src/org/briarproject/api/forum/ForumPostHeader.java b/briar-api/src/org/briarproject/api/forum/ForumPostHeader.java new file mode 100644 index 0000000000..ba861fca6f --- /dev/null +++ b/briar-api/src/org/briarproject/api/forum/ForumPostHeader.java @@ -0,0 +1,19 @@ +package org.briarproject.api.forum; + +import org.briarproject.api.identity.Author; +import org.briarproject.api.sync.MessageId; + +public interface ForumPostHeader { + + MessageId getId(); + + Author getAuthor(); + + Author.Status getAuthorStatus(); + + String getContentType(); + + long getTimestamp(); + + boolean isRead(); +} diff --git a/briar-core/src/org/briarproject/forum/ForumManagerImpl.java b/briar-core/src/org/briarproject/forum/ForumManagerImpl.java index caa1e56c48..c78badda84 100644 --- a/briar-core/src/org/briarproject/forum/ForumManagerImpl.java +++ b/briar-core/src/org/briarproject/forum/ForumManagerImpl.java @@ -8,6 +8,7 @@ import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; import org.briarproject.api.forum.Forum; import org.briarproject.api.forum.ForumManager; +import org.briarproject.api.forum.ForumPostHeader; import org.briarproject.api.sync.Group; import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.Message; @@ -35,7 +36,7 @@ class ForumManagerImpl implements ForumManager { } @Override - public void addLocalMessage(Message m) throws DbException { + public void addLocalPost(Message m) throws DbException { db.addLocalMessage(m); } @@ -61,14 +62,19 @@ class ForumManagerImpl implements ForumManager { } @Override - public byte[] getMessageBody(MessageId m) throws DbException { + public byte[] getPostBody(MessageId m) throws DbException { return db.getMessageBody(m); } @Override - public Collection<MessageHeader> getMessageHeaders(GroupId g) + public Collection<ForumPostHeader> getPostHeaders(GroupId g) throws DbException { - return db.getMessageHeaders(g); + Collection<MessageHeader> headers = db.getMessageHeaders(g); + List<ForumPostHeader> postHeaders = + new ArrayList<ForumPostHeader>(headers.size()); + for (MessageHeader m : headers) + postHeaders.add(new ForumPostHeaderImpl(m)); + return Collections.unmodifiableList(postHeaders); } @Override diff --git a/briar-core/src/org/briarproject/forum/ForumPostHeaderImpl.java b/briar-core/src/org/briarproject/forum/ForumPostHeaderImpl.java new file mode 100644 index 0000000000..5aeaa5dece --- /dev/null +++ b/briar-core/src/org/briarproject/forum/ForumPostHeaderImpl.java @@ -0,0 +1,46 @@ +package org.briarproject.forum; + +import org.briarproject.api.forum.ForumPostHeader; +import org.briarproject.api.identity.Author; +import org.briarproject.api.sync.MessageHeader; +import org.briarproject.api.sync.MessageId; + +// Temporary facade during sync protocol refactoring +class ForumPostHeaderImpl implements ForumPostHeader { + + private final MessageHeader messageHeader; + + ForumPostHeaderImpl(MessageHeader messageHeader) { + this.messageHeader = messageHeader; + } + + @Override + public MessageId getId() { + return messageHeader.getId(); + } + + @Override + public Author getAuthor() { + return messageHeader.getAuthor(); + } + + @Override + public Author.Status getAuthorStatus() { + return messageHeader.getAuthorStatus(); + } + + @Override + public String getContentType() { + return messageHeader.getContentType(); + } + + @Override + public long getTimestamp() { + return messageHeader.getTimestamp(); + } + + @Override + public boolean isRead() { + return messageHeader.isRead(); + } +} -- GitLab