From 411549dc0ac68c745918df7155c8d65252374c51 Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Wed, 9 Nov 2016 14:23:46 +0000
Subject: [PATCH] Code cleanup, use correct fragment class.

---
 .../android/blogs/BaseController.java         |  6 ++-
 .../android/blogs/BaseControllerImpl.java     |  4 +-
 .../android/blogs/BasePostFragment.java       |  9 +++-
 .../android/blogs/BasePostPagerFragment.java  | 49 +++++++++----------
 .../android/blogs/BlogFragment.java           |  8 +--
 .../android/blogs/BlogPostFragment.java       | 11 ++++-
 .../android/blogs/BlogPostItem.java           |  4 +-
 .../android/blogs/BlogPostPagerFragment.java  | 26 ++++++++--
 .../android/blogs/FeedController.java         | 11 +++++
 .../android/blogs/FeedControllerImpl.java     | 25 ++++++++++
 .../android/blogs/FeedFragment.java           | 22 +++++++--
 .../android/blogs/FeedPostFragment.java       | 11 ++++-
 .../android/blogs/FeedPostPagerFragment.java  | 36 +++++++++++---
 13 files changed, 168 insertions(+), 54 deletions(-)

diff --git a/briar-android/src/org/briarproject/android/blogs/BaseController.java b/briar-android/src/org/briarproject/android/blogs/BaseController.java
index 9e94d668de..6b81243ec6 100644
--- a/briar-android/src/org/briarproject/android/blogs/BaseController.java
+++ b/briar-android/src/org/briarproject/android/blogs/BaseController.java
@@ -8,6 +8,7 @@ import org.briarproject.android.controller.handler.ExceptionHandler;
 import org.briarproject.android.controller.handler.ResultExceptionHandler;
 import org.briarproject.api.blogs.BlogPostHeader;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.nullsafety.NotNullByDefault;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageId;
 
@@ -33,9 +34,10 @@ interface BaseController {
 	void repeatPost(BlogPostItem item, @Nullable String comment,
 			ExceptionHandler<DbException> handler);
 
-	void setOnBlogPostAddedListener(OnBlogPostAddedListener listener);
+	void setBlogListener(BlogListener listener);
 
-	interface OnBlogPostAddedListener extends DestroyableContext {
+	@NotNullByDefault
+	interface BlogListener extends DestroyableContext {
 
 		@UiThread
 		void onBlogPostAdded(BlogPostHeader header, boolean local);
diff --git a/briar-android/src/org/briarproject/android/blogs/BaseControllerImpl.java b/briar-android/src/org/briarproject/android/blogs/BaseControllerImpl.java
index ec563fbf37..04d9e2d164 100644
--- a/briar-android/src/org/briarproject/android/blogs/BaseControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/blogs/BaseControllerImpl.java
@@ -46,7 +46,7 @@ abstract class BaseControllerImpl extends DbControllerImpl
 	private final Map<MessageId, BlogPostHeader> headerCache =
 			new ConcurrentHashMap<>();
 
-	private volatile OnBlogPostAddedListener listener;
+	private volatile BlogListener listener;
 
 	BaseControllerImpl(@DatabaseExecutor Executor dbExecutor,
 			LifecycleManager lifecycleManager, EventBus eventBus,
@@ -73,7 +73,7 @@ abstract class BaseControllerImpl extends DbControllerImpl
 	}
 
 	@Override
-	public void setOnBlogPostAddedListener(OnBlogPostAddedListener listener) {
+	public void setBlogListener(BlogListener listener) {
 		this.listener = listener;
 	}
 
diff --git a/briar-android/src/org/briarproject/android/blogs/BasePostFragment.java b/briar-android/src/org/briarproject/android/blogs/BasePostFragment.java
index 9e2db81dc8..d3feae4e48 100644
--- a/briar-android/src/org/briarproject/android/blogs/BasePostFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/BasePostFragment.java
@@ -12,6 +12,8 @@ import android.widget.ProgressBar;
 import org.briarproject.R;
 import org.briarproject.android.fragment.BaseFragment;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
 
 import java.util.logging.Logger;
 
@@ -19,6 +21,9 @@ import static android.view.View.INVISIBLE;
 import static android.view.View.VISIBLE;
 import static org.briarproject.android.util.AndroidUtils.MIN_RESOLUTION;
 
+@UiThread
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
 abstract class BasePostFragment extends BaseFragment {
 
 	private static final Logger LOG =
@@ -33,8 +38,8 @@ abstract class BasePostFragment extends BaseFragment {
 	@CallSuper
 	@Nullable
 	@Override
-	public View onCreateView(LayoutInflater inflater, ViewGroup container,
-			Bundle savedInstanceState) {
+	public View onCreateView(LayoutInflater inflater,
+			@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 		view = inflater.inflate(R.layout.fragment_blog_post, container,
 				false);
 		progressBar = (ProgressBar) view.findViewById(R.id.progressBar);
diff --git a/briar-android/src/org/briarproject/android/blogs/BasePostPagerFragment.java b/briar-android/src/org/briarproject/android/blogs/BasePostPagerFragment.java
index 424fa5d45d..6ba7aa6aca 100644
--- a/briar-android/src/org/briarproject/android/blogs/BasePostPagerFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/BasePostPagerFragment.java
@@ -13,10 +13,12 @@ import android.view.ViewGroup;
 import android.widget.ProgressBar;
 
 import org.briarproject.R;
-import org.briarproject.android.blogs.BaseController.OnBlogPostAddedListener;
+import org.briarproject.android.blogs.BaseController.BlogListener;
 import org.briarproject.android.fragment.BaseFragment;
 import org.briarproject.api.blogs.BlogPostHeader;
-import org.briarproject.api.db.DbException;
+import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
+import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageId;
 
 import java.util.ArrayList;
@@ -28,8 +30,11 @@ import static android.view.View.INVISIBLE;
 import static android.view.View.VISIBLE;
 import static org.briarproject.android.blogs.BasePostPagerFragment.BlogPostPagerAdapter.INVALID_POSITION;
 
+@UiThread
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
 abstract class BasePostPagerFragment extends BaseFragment
-		implements OnBlogPostAddedListener {
+		implements BlogListener {
 
 	static final String POST_ID = "briar.POST_ID";
 
@@ -40,8 +45,8 @@ abstract class BasePostPagerFragment extends BaseFragment
 
 	@Nullable
 	@Override
-	public View onCreateView(LayoutInflater inflater, ViewGroup container,
-			Bundle state) {
+	public View onCreateView(LayoutInflater inflater,
+			@Nullable ViewGroup container, @Nullable Bundle state) {
 
 		Bundle args;
 		if (state == null) args = getArguments();
@@ -65,6 +70,10 @@ abstract class BasePostPagerFragment extends BaseFragment
 	@Override
 	public void onStart() {
 		super.onStart();
+		loadBlogPosts();
+	}
+
+	protected void loadBlogPosts() {
 		if (postId == null) {
 			MessageId selected = getSelectedPost();
 			if (selected != null) loadBlogPosts(selected);
@@ -86,23 +95,23 @@ abstract class BasePostPagerFragment extends BaseFragment
 		loadBlogPost(header);
 	}
 
-	abstract void loadBlogPosts(final MessageId select);
+	abstract Fragment createFragment(GroupId g, MessageId m);
+
+	abstract void loadBlogPosts(MessageId select);
 
 	abstract void loadBlogPost(BlogPostHeader header);
 
-	@UiThread
 	protected void onBlogPostsLoaded(MessageId select,
 			Collection<BlogPostItem> posts) {
-
 		postId = null;
 		postPagerAdapter.setPosts(posts);
 		selectPost(select);
 	}
 
-	@UiThread
-	protected void onBlogPostsLoadedException(DbException exception) {
-		// TODO: Decide how to handle errors in the UI
-		finish();
+	protected void onBlogPostLoaded(BlogPostItem post) {
+		MessageId selected = getSelectedPost();
+		postPagerAdapter.addPost(post);
+		if (selected != null) selectPost(selected);
 	}
 
 	@Nullable
@@ -121,16 +130,11 @@ abstract class BasePostPagerFragment extends BaseFragment
 		}
 	}
 
-	protected void addPost(BlogPostItem post) {
-		MessageId selected = getSelectedPost();
-		postPagerAdapter.addPost(post);
-		if (selected != null) selectPost(selected);
-	}
-
 	@UiThread
-	static class BlogPostPagerAdapter extends FragmentStatePagerAdapter {
+	class BlogPostPagerAdapter extends FragmentStatePagerAdapter {
 
 		static final int INVALID_POSITION = -1;
+
 		private final List<BlogPostItem> posts = new ArrayList<>();
 
 		private BlogPostPagerAdapter(FragmentManager fm) {
@@ -145,7 +149,7 @@ abstract class BasePostPagerFragment extends BaseFragment
 		@Override
 		public Fragment getItem(int position) {
 			BlogPostItem post = posts.get(position);
-			return FeedPostFragment.newInstance(post.getGroupId(), post.getId());
+			return createFragment(post.getGroupId(), post.getId());
 		}
 
 		private BlogPostItem getPost(int position) {
@@ -175,9 +179,4 @@ abstract class BasePostPagerFragment extends BaseFragment
 			return INVALID_POSITION;
 		}
 	}
-
-	@Override
-	public void onBlogRemoved() {
-		finish();
-	}
 }
diff --git a/briar-android/src/org/briarproject/android/blogs/BlogFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogFragment.java
index fb5f43edc7..a7273fd61f 100644
--- a/briar-android/src/org/briarproject/android/blogs/BlogFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/BlogFragment.java
@@ -4,6 +4,7 @@ import android.content.DialogInterface;
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
+import android.support.annotation.UiThread;
 import android.support.design.widget.Snackbar;
 import android.support.v4.app.ActivityOptionsCompat;
 import android.support.v4.content.ContextCompat;
@@ -19,7 +20,7 @@ import android.widget.Toast;
 
 import org.briarproject.R;
 import org.briarproject.android.ActivityComponent;
-import org.briarproject.android.blogs.BaseController.OnBlogPostAddedListener;
+import org.briarproject.android.blogs.BaseController.BlogListener;
 import org.briarproject.android.blogs.BlogPostAdapter.OnBlogPostClickListener;
 import org.briarproject.android.controller.handler.UiResultExceptionHandler;
 import org.briarproject.android.fragment.BaseFragment;
@@ -46,10 +47,11 @@ import static org.briarproject.android.BriarActivity.GROUP_ID;
 import static org.briarproject.android.blogs.BlogActivity.REQUEST_SHARE;
 import static org.briarproject.android.blogs.BlogActivity.REQUEST_WRITE_POST;
 
+@UiThread
 @MethodsNotNullByDefault
 @ParametersNotNullByDefault
 public class BlogFragment extends BaseFragment implements
-		OnBlogPostAddedListener {
+		BlogListener {
 
 	private final static String TAG = BlogFragment.class.getName();
 
@@ -99,7 +101,7 @@ public class BlogFragment extends BaseFragment implements
 	@Override
 	public void injectFragment(ActivityComponent component) {
 		component.inject(this);
-		blogController.setOnBlogPostAddedListener(this);
+		blogController.setBlogListener(this);
 	}
 
 	@Override
diff --git a/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java
index 78b82874fc..bd87bbf333 100644
--- a/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java
@@ -2,6 +2,7 @@ package org.briarproject.android.blogs;
 
 import android.os.Bundle;
 import android.support.annotation.Nullable;
+import android.support.annotation.UiThread;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -9,12 +10,17 @@ import android.view.ViewGroup;
 import org.briarproject.android.ActivityComponent;
 import org.briarproject.android.controller.handler.UiResultExceptionHandler;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
 import org.briarproject.api.sync.MessageId;
 
 import javax.inject.Inject;
 
 import static org.briarproject.android.blogs.BasePostPagerFragment.POST_ID;
 
+@UiThread
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
 public class BlogPostFragment extends BasePostFragment {
 
 	public final static String TAG = BlogPostFragment.class.getName();
@@ -36,8 +42,9 @@ public class BlogPostFragment extends BasePostFragment {
 
 	@Nullable
 	@Override
-	public View onCreateView(LayoutInflater inflater, ViewGroup container,
-			Bundle savedInstanceState) {
+	public View onCreateView(LayoutInflater inflater,
+			@Nullable ViewGroup container,
+			@Nullable Bundle savedInstanceState) {
 
 		Bundle args = getArguments();
 		byte[] p = args.getByteArray(POST_ID);
diff --git a/briar-android/src/org/briarproject/android/blogs/BlogPostItem.java b/briar-android/src/org/briarproject/android/blogs/BlogPostItem.java
index 64295c7317..debcfd5446 100644
--- a/briar-android/src/org/briarproject/android/blogs/BlogPostItem.java
+++ b/briar-android/src/org/briarproject/android/blogs/BlogPostItem.java
@@ -9,7 +9,9 @@ import org.briarproject.api.identity.Author.Status;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageId;
 
-// This class is not thread-safe
+import javax.annotation.concurrent.NotThreadSafe;
+
+@NotThreadSafe
 public class BlogPostItem implements Comparable<BlogPostItem> {
 
 	private final BlogPostHeader header;
diff --git a/briar-android/src/org/briarproject/android/blogs/BlogPostPagerFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogPostPagerFragment.java
index 7c63d5c7d8..c960545cb9 100644
--- a/briar-android/src/org/briarproject/android/blogs/BlogPostPagerFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/BlogPostPagerFragment.java
@@ -1,20 +1,28 @@
 package org.briarproject.android.blogs;
 
 import android.os.Bundle;
+import android.support.annotation.UiThread;
+import android.support.v4.app.Fragment;
 
 import org.briarproject.android.ActivityComponent;
 import org.briarproject.android.controller.handler.UiResultExceptionHandler;
 import org.briarproject.api.blogs.BlogPostHeader;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
+import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageId;
 
 import java.util.Collection;
 
 import javax.inject.Inject;
 
+@UiThread
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
 public class BlogPostPagerFragment extends BasePostPagerFragment {
 
-	public final static String TAG = BlogPostPagerFragment.class.getName();
+	private static final String TAG = BlogPostPagerFragment.class.getName();
 
 	@Inject
 	BlogController blogController;
@@ -32,7 +40,7 @@ public class BlogPostPagerFragment extends BasePostPagerFragment {
 	@Override
 	public void injectFragment(ActivityComponent component) {
 		component.inject(this);
-		blogController.setOnBlogPostAddedListener(this);
+		blogController.setBlogListener(this);
 	}
 
 	@Override
@@ -40,6 +48,10 @@ public class BlogPostPagerFragment extends BasePostPagerFragment {
 		return TAG;
 	}
 
+	@Override
+	Fragment createFragment(final GroupId g, final MessageId m) {
+		return BlogPostFragment.newInstance(m);
+	}
 
 	@Override
 	void loadBlogPosts(final MessageId select) {
@@ -53,7 +65,8 @@ public class BlogPostPagerFragment extends BasePostPagerFragment {
 
 					@Override
 					public void onExceptionUi(DbException exception) {
-						onBlogPostsLoadedException(exception);
+						// TODO: Decide how to handle errors in the UI
+						finish();
 					}
 				});
 	}
@@ -65,7 +78,7 @@ public class BlogPostPagerFragment extends BasePostPagerFragment {
 						this) {
 					@Override
 					public void onResultUi(BlogPostItem post) {
-						addPost(post);
+						onBlogPostLoaded(post);
 					}
 
 					@Override
@@ -75,4 +88,9 @@ public class BlogPostPagerFragment extends BasePostPagerFragment {
 					}
 				});
 	}
+
+	@Override
+	public void onBlogRemoved() {
+		finish();
+	}
 }
diff --git a/briar-android/src/org/briarproject/android/blogs/FeedController.java b/briar-android/src/org/briarproject/android/blogs/FeedController.java
index 90015b066f..76ab1baa23 100644
--- a/briar-android/src/org/briarproject/android/blogs/FeedController.java
+++ b/briar-android/src/org/briarproject/android/blogs/FeedController.java
@@ -1,8 +1,11 @@
 package org.briarproject.android.blogs;
 
+import android.support.annotation.UiThread;
+
 import org.briarproject.android.controller.handler.ResultExceptionHandler;
 import org.briarproject.api.blogs.Blog;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.nullsafety.NotNullByDefault;
 
 import java.util.Collection;
 
@@ -13,4 +16,12 @@ public interface FeedController extends BaseController {
 
 	void loadPersonalBlog(ResultExceptionHandler<Blog, DbException> handler);
 
+	void setFeedListener(FeedListener listener);
+
+	@NotNullByDefault
+	interface FeedListener extends BlogListener {
+
+		@UiThread
+		void onBlogAdded();
+	}
 }
diff --git a/briar-android/src/org/briarproject/android/blogs/FeedControllerImpl.java b/briar-android/src/org/briarproject/android/blogs/FeedControllerImpl.java
index 33cce78e29..f96bd2162b 100644
--- a/briar-android/src/org/briarproject/android/blogs/FeedControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/blogs/FeedControllerImpl.java
@@ -11,6 +11,7 @@ import org.briarproject.api.db.NoSuchMessageException;
 import org.briarproject.api.event.BlogPostAddedEvent;
 import org.briarproject.api.event.Event;
 import org.briarproject.api.event.EventBus;
+import org.briarproject.api.event.GroupAddedEvent;
 import org.briarproject.api.event.GroupRemovedEvent;
 import org.briarproject.api.identity.Author;
 import org.briarproject.api.identity.IdentityManager;
@@ -33,6 +34,8 @@ public class FeedControllerImpl extends BaseControllerImpl
 	private static final Logger LOG =
 			Logger.getLogger(FeedControllerImpl.class.getName());
 
+	private volatile FeedListener listener;
+
 	@Inject
 	FeedControllerImpl(@DatabaseExecutor Executor dbExecutor,
 			LifecycleManager lifecycleManager, EventBus eventBus,
@@ -45,6 +48,7 @@ public class FeedControllerImpl extends BaseControllerImpl
 	@Override
 	public void onStart() {
 		super.onStart();
+		if (listener == null) throw new IllegalStateException();
 		notificationManager.blockAllBlogPostNotifications();
 		notificationManager.clearAllBlogPostNotifications();
 	}
@@ -55,12 +59,24 @@ public class FeedControllerImpl extends BaseControllerImpl
 		notificationManager.unblockAllBlogPostNotifications();
 	}
 
+	@Override
+	public void setFeedListener(FeedListener listener) {
+		super.setBlogListener(listener);
+		this.listener = listener;
+	}
+
 	@Override
 	public void eventOccurred(Event e) {
 		if (e instanceof BlogPostAddedEvent) {
 			BlogPostAddedEvent b = (BlogPostAddedEvent) e;
 			LOG.info("Blog post added");
 			onBlogPostAdded(b.getHeader(), b.isLocal());
+		} else if (e instanceof GroupAddedEvent) {
+			GroupAddedEvent g = (GroupAddedEvent) e;
+			if (g.getGroup().getClientId().equals(CLIENT_ID)) {
+				LOG.info("Blog added");
+				onBlogAdded();
+			}
 		} else if (e instanceof GroupRemovedEvent) {
 			GroupRemovedEvent g = (GroupRemovedEvent) e;
 			if (g.getGroup().getClientId().equals(CLIENT_ID)) {
@@ -70,6 +86,15 @@ public class FeedControllerImpl extends BaseControllerImpl
 		}
 	}
 
+	private void onBlogAdded() {
+		listener.runOnUiThreadUnlessDestroyed(new Runnable() {
+			@Override
+			public void run() {
+				listener.onBlogAdded();
+			}
+		});
+	}
+
 	@Override
 	public void loadBlogPosts(
 			final ResultExceptionHandler<Collection<BlogPostItem>, DbException> handler) {
diff --git a/briar-android/src/org/briarproject/android/blogs/FeedFragment.java b/briar-android/src/org/briarproject/android/blogs/FeedFragment.java
index 60d8ed7c3e..d3bfd765a2 100644
--- a/briar-android/src/org/briarproject/android/blogs/FeedFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/FeedFragment.java
@@ -3,6 +3,7 @@ package org.briarproject.android.blogs;
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
+import android.support.annotation.UiThread;
 import android.support.design.widget.Snackbar;
 import android.support.v4.app.ActivityOptionsCompat;
 import android.support.v4.content.ContextCompat;
@@ -17,14 +18,16 @@ import android.view.ViewGroup;
 
 import org.briarproject.R;
 import org.briarproject.android.ActivityComponent;
-import org.briarproject.android.blogs.BaseController.OnBlogPostAddedListener;
 import org.briarproject.android.blogs.BlogPostAdapter.OnBlogPostClickListener;
+import org.briarproject.android.blogs.FeedController.FeedListener;
 import org.briarproject.android.controller.handler.UiResultExceptionHandler;
 import org.briarproject.android.fragment.BaseFragment;
 import org.briarproject.android.view.BriarRecyclerView;
 import org.briarproject.api.blogs.Blog;
 import org.briarproject.api.blogs.BlogPostHeader;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
 
 import java.util.Collection;
 import java.util.logging.Logger;
@@ -37,8 +40,11 @@ import static android.support.v4.app.ActivityOptionsCompat.makeCustomAnimation;
 import static org.briarproject.android.BriarActivity.GROUP_ID;
 import static org.briarproject.android.blogs.BlogActivity.REQUEST_WRITE_POST;
 
+@UiThread
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
 public class FeedFragment extends BaseFragment implements
-		OnBlogPostClickListener, OnBlogPostAddedListener {
+		OnBlogPostClickListener, FeedListener {
 
 	public final static String TAG = FeedFragment.class.getName();
 	private static final Logger LOG = Logger.getLogger(TAG);
@@ -62,8 +68,9 @@ public class FeedFragment extends BaseFragment implements
 
 	@Nullable
 	@Override
-	public View onCreateView(LayoutInflater inflater, ViewGroup container,
-			Bundle savedInstanceState) {
+	public View onCreateView(LayoutInflater inflater,
+			@Nullable ViewGroup container,
+			@Nullable Bundle savedInstanceState) {
 
 		View v = inflater.inflate(R.layout.fragment_blog, container, false);
 
@@ -81,7 +88,7 @@ public class FeedFragment extends BaseFragment implements
 	@Override
 	public void injectFragment(ActivityComponent component) {
 		component.inject(this);
-		feedController.setOnBlogPostAddedListener(this);
+		feedController.setFeedListener(this);
 	}
 
 	@Override
@@ -253,6 +260,11 @@ public class FeedFragment extends BaseFragment implements
 		s.show();
 	}
 
+	@Override
+	public void onBlogAdded() {
+		loadBlogPosts(false);
+	}
+
 	@Override
 	public void onBlogRemoved() {
 		loadBlogPosts(true);
diff --git a/briar-android/src/org/briarproject/android/blogs/FeedPostFragment.java b/briar-android/src/org/briarproject/android/blogs/FeedPostFragment.java
index 002f69586d..294738a1ce 100644
--- a/briar-android/src/org/briarproject/android/blogs/FeedPostFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/FeedPostFragment.java
@@ -2,6 +2,7 @@ package org.briarproject.android.blogs;
 
 import android.os.Bundle;
 import android.support.annotation.Nullable;
+import android.support.annotation.UiThread;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -9,6 +10,8 @@ import android.view.ViewGroup;
 import org.briarproject.android.ActivityComponent;
 import org.briarproject.android.controller.handler.UiResultExceptionHandler;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageId;
 
@@ -17,6 +20,9 @@ import javax.inject.Inject;
 import static org.briarproject.android.BriarActivity.GROUP_ID;
 import static org.briarproject.android.blogs.BasePostPagerFragment.POST_ID;
 
+@UiThread
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
 public class FeedPostFragment extends BasePostFragment {
 
 	public final static String TAG = FeedPostFragment.class.getName();
@@ -40,8 +46,9 @@ public class FeedPostFragment extends BasePostFragment {
 
 	@Nullable
 	@Override
-	public View onCreateView(LayoutInflater inflater, ViewGroup container,
-			Bundle savedInstanceState) {
+	public View onCreateView(LayoutInflater inflater,
+			@Nullable ViewGroup container,
+			@Nullable Bundle savedInstanceState) {
 
 		Bundle args = getArguments();
 		byte[] b = args.getByteArray(GROUP_ID);
diff --git a/briar-android/src/org/briarproject/android/blogs/FeedPostPagerFragment.java b/briar-android/src/org/briarproject/android/blogs/FeedPostPagerFragment.java
index 5dc75709dc..b8fbd88988 100644
--- a/briar-android/src/org/briarproject/android/blogs/FeedPostPagerFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/FeedPostPagerFragment.java
@@ -1,20 +1,30 @@
 package org.briarproject.android.blogs;
 
 import android.os.Bundle;
+import android.support.annotation.UiThread;
+import android.support.v4.app.Fragment;
 
 import org.briarproject.android.ActivityComponent;
+import org.briarproject.android.blogs.FeedController.FeedListener;
 import org.briarproject.android.controller.handler.UiResultExceptionHandler;
 import org.briarproject.api.blogs.BlogPostHeader;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
+import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageId;
 
 import java.util.Collection;
 
 import javax.inject.Inject;
 
-public class FeedPostPagerFragment extends BasePostPagerFragment {
+@UiThread
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
+public class FeedPostPagerFragment extends BasePostPagerFragment
+	implements FeedListener {
 
-	public final static String TAG = FeedPostPagerFragment.class.getName();
+	private static final String TAG = FeedPostPagerFragment.class.getName();
 
 	@Inject
 	FeedController feedController;
@@ -32,7 +42,7 @@ public class FeedPostPagerFragment extends BasePostPagerFragment {
 	@Override
 	public void injectFragment(ActivityComponent component) {
 		component.inject(this);
-		feedController.setOnBlogPostAddedListener(this);
+		feedController.setFeedListener(this);
 	}
 
 	@Override
@@ -52,6 +62,11 @@ public class FeedPostPagerFragment extends BasePostPagerFragment {
 		feedController.onStop();
 	}
 
+	@Override
+	Fragment createFragment(GroupId g, MessageId m) {
+		return FeedPostFragment.newInstance(g, m);
+	}
+
 	@Override
 	void loadBlogPosts(final MessageId select) {
 		feedController.loadBlogPosts(
@@ -64,7 +79,7 @@ public class FeedPostPagerFragment extends BasePostPagerFragment {
 
 					@Override
 					public void onExceptionUi(DbException exception) {
-						onBlogPostsLoadedException(exception);
+						// TODO: Decide how to handle errors in the UI
 					}
 				});
 	}
@@ -76,14 +91,23 @@ public class FeedPostPagerFragment extends BasePostPagerFragment {
 						this) {
 					@Override
 					public void onResultUi(BlogPostItem post) {
-						addPost(post);
+						onBlogPostLoaded(post);
 					}
 
 					@Override
 					public void onExceptionUi(DbException exception) {
 						// TODO: Decide how to handle errors in the UI
-						finish();
 					}
 				});
 	}
+
+	@Override
+	public void onBlogAdded() {
+		loadBlogPosts();
+	}
+
+	@Override
+	public void onBlogRemoved() {
+		loadBlogPosts();
+	}
 }
-- 
GitLab