diff --git a/briar-android/src/org/briarproject/android/blogs/BlogActivity.java b/briar-android/src/org/briarproject/android/blogs/BlogActivity.java index 35321f390a96ee09c356de2b294552cc812d9696..7519b46ab2c9d6b304085003d91a93d01cf4ebaf 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogActivity.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogActivity.java @@ -21,7 +21,6 @@ import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.MessageId; import java.util.Collection; -import java.util.logging.Logger; import javax.inject.Inject; @@ -38,8 +37,6 @@ public class BlogActivity extends BriarActivity implements BlogPostListener, static final String IS_NEW_BLOG = "briar.IS_NEW_BLOG"; private static final String BLOG_PAGER_ADAPTER = "briar.BLOG_PAGER_ADAPTER"; - private static final Logger LOG = - Logger.getLogger(BlogActivity.class.getName()); private ProgressBar progressBar; private ViewPager pager; diff --git a/briar-android/src/org/briarproject/android/blogs/BlogController.java b/briar-android/src/org/briarproject/android/blogs/BlogController.java index b681c2710fd4bdb6333de478e53c83d2a67cf7aa..532d2dd2505dbb0cd75498f308522df0026e669f 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogController.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogController.java @@ -7,14 +7,14 @@ import org.briarproject.android.controller.handler.ResultHandler; import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.MessageId; -import java.util.TreeSet; +import java.util.SortedSet; public interface BlogController extends ActivityLifecycleController { - void loadBlog(final GroupId groupId, final boolean reload, - final ResultHandler<Boolean> resultHandler); + void loadBlog(GroupId groupId, boolean reload, + ResultHandler<Boolean> resultHandler); - TreeSet<BlogPostItem> getBlogPosts(); + SortedSet<BlogPostItem> getBlogPosts(); @Nullable BlogPostItem getBlogPost(MessageId postId); @@ -22,10 +22,10 @@ public interface BlogController extends ActivityLifecycleController { @Nullable MessageId getBlogPostId(int position); - void deleteBlog(final ResultHandler<Boolean> resultHandler); + void deleteBlog(ResultHandler<Boolean> resultHandler); interface BlogPostListener { - void onBlogPostAdded(final BlogPostItem post, final boolean local); + void onBlogPostAdded(BlogPostItem post, boolean local); } } diff --git a/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java b/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java index 6bb11f312a21245593d2f4151f355fa0c48cd212..f34e63469e100c88d33d796faa766681d46b9444 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java @@ -19,6 +19,7 @@ import org.briarproject.api.sync.MessageId; import java.util.ArrayList; import java.util.Collection; +import java.util.SortedSet; import java.util.TreeSet; import java.util.logging.Logger; @@ -42,6 +43,7 @@ public class BlogControllerImpl extends DbControllerImpl private volatile BlogPostListener listener; private volatile GroupId groupId = null; + // FIXME: This collection isn't thread-safe, isn't updated atomically private volatile TreeSet<BlogPostItem> posts = null; @Inject @@ -81,9 +83,11 @@ public class BlogControllerImpl extends DbControllerImpl LOG.info("New blog post added"); if (posts == null) { LOG.info("Posts have not loaded, yet"); + // FIXME: Race condition, new post may not get loaded return; } final BlogPostHeader header = m.getHeader(); + // FIXME: Don't make blocking calls in event handlers try { final byte[] body = blogManager.getPostBody(header.getId()); final BlogPostItem post = new BlogPostItem(header, body); @@ -112,7 +116,6 @@ public class BlogControllerImpl extends DbControllerImpl public void loadBlog(final GroupId g, final boolean reload, final ResultHandler<Boolean> resultHandler) { - LOG.info("Loading blog..."); runOnDbThread(new Runnable() { @Override public void run() { @@ -132,8 +135,7 @@ public class BlogControllerImpl extends DbControllerImpl posts.addAll(newPosts); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) - LOG.info("Post header load took " + duration + - " ms"); + LOG.info("Loading blog took " + duration + " ms"); } resultHandler.onResult(true); } catch (DbException e) { @@ -147,7 +149,7 @@ public class BlogControllerImpl extends DbControllerImpl @Override @Nullable - public TreeSet<BlogPostItem> getBlogPosts() { + public SortedSet<BlogPostItem> getBlogPosts() { return posts; } diff --git a/briar-android/src/org/briarproject/android/forum/ForumController.java b/briar-android/src/org/briarproject/android/forum/ForumController.java index be8b427919a4e0150281f6f7224c13360473c86a..b492627e41e07a5ba18e7bd971484cc21cea91d1 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumController.java +++ b/briar-android/src/org/briarproject/android/forum/ForumController.java @@ -4,7 +4,6 @@ import android.support.annotation.Nullable; import org.briarproject.android.controller.ActivityLifecycleController; import org.briarproject.android.controller.handler.ResultHandler; -import org.briarproject.android.controller.handler.UiResultHandler; import org.briarproject.api.forum.Forum; import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.MessageId; @@ -15,17 +14,25 @@ import java.util.List; public interface ForumController extends ActivityLifecycleController { void loadForum(GroupId groupId, ResultHandler<Boolean> resultHandler); + @Nullable Forum getForum(); + List<ForumEntry> getForumEntries(); - void unsubscribe(UiResultHandler<Boolean> resultHandler); + + void unsubscribe(ResultHandler<Boolean> resultHandler); + void entryRead(ForumEntry forumEntry); + void entriesRead(Collection<ForumEntry> messageIds); + void createPost(byte[] body); + void createPost(byte[] body, MessageId parentId); interface ForumPostListener { void addLocalEntry(int index, ForumEntry entry); + void addForeignEntry(int index, ForumEntry entry); } diff --git a/briar-android/src/org/briarproject/android/forum/ForumControllerImpl.java b/briar-android/src/org/briarproject/android/forum/ForumControllerImpl.java index 54ff74de204ec58c7c5a65616422a44bcaecc768..638074ca13753aa13438866160f96bbfe343144b 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumControllerImpl.java +++ b/briar-android/src/org/briarproject/android/forum/ForumControllerImpl.java @@ -5,7 +5,6 @@ import android.support.annotation.Nullable; import org.briarproject.android.controller.DbControllerImpl; import org.briarproject.android.controller.handler.ResultHandler; -import org.briarproject.android.controller.handler.UiResultHandler; import org.briarproject.api.FormatException; import org.briarproject.api.clients.MessageTree; import org.briarproject.api.crypto.CryptoComponent; @@ -34,10 +33,10 @@ import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Stack; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.logging.Logger; @@ -69,11 +68,12 @@ public class ForumControllerImpl extends DbControllerImpl @Inject protected volatile IdentityManager identityManager; - private volatile MessageTree<ForumPostHeader> tree = - new MessageTreeImpl<>(); - private volatile Map<MessageId, byte[]> bodyCache = new HashMap<>(); + private final Map<MessageId, byte[]> bodyCache = new ConcurrentHashMap<>(); + private final MessageTree<ForumPostHeader> tree = new MessageTreeImpl<>(); + private volatile LocalAuthor localAuthor = null; private volatile Forum forum = null; + // FIXME: This collection isn't thread-safe, isn't updated atomically private volatile List<ForumEntry> forumEntries = null; private ForumPostListener listener; @@ -116,6 +116,7 @@ public class ForumControllerImpl extends DbControllerImpl ForumPostReceivedEvent pe = (ForumPostReceivedEvent) e; if (pe.getGroupId().equals(forum.getId())) { LOG.info("Forum Post received, adding..."); + // FIXME: Don't make blocking calls in event handlers addNewPost(pe.getForumPostHeader()); } } else if (e instanceof GroupRemovedEvent) { @@ -272,9 +273,10 @@ public class ForumControllerImpl extends DbControllerImpl } @Override - public void unsubscribe(final UiResultHandler<Boolean> resultHandler) { + public void unsubscribe(final ResultHandler<Boolean> resultHandler) { if (forum == null) return; runOnDbThread(new Runnable() { + @Override public void run() { try { long now = System.currentTimeMillis(); @@ -300,6 +302,7 @@ public class ForumControllerImpl extends DbControllerImpl @Override public void entriesRead(final Collection<ForumEntry> forumEntries) { runOnDbThread(new Runnable() { + @Override public void run() { try { long now = System.currentTimeMillis(); @@ -325,6 +328,7 @@ public class ForumControllerImpl extends DbControllerImpl @Override public void createPost(final byte[] body, final MessageId parentId) { cryptoExecutor.execute(new Runnable() { + @Override public void run() { long timestamp = System.currentTimeMillis(); long newestTimeStamp = 0; @@ -353,6 +357,7 @@ public class ForumControllerImpl extends DbControllerImpl } bodyCache.put(p.getMessage().getId(), body); storePost(p); + // FIXME: Don't make DB calls on the crypto executor addNewPost(p); } }); @@ -378,6 +383,7 @@ public class ForumControllerImpl extends DbControllerImpl private void storePost(final ForumPost p) { runOnDbThread(new Runnable() { + @Override public void run() { try { long now = System.currentTimeMillis();