From 7c5945de01c17accfa84af688e3b6c7cbbd084c2 Mon Sep 17 00:00:00 2001
From: Torsten Grote <t@grobox.de>
Date: Wed, 7 Sep 2016 16:50:43 -0300
Subject: [PATCH] Check if activity is still alive before returning results to
 it

---
 .../org/briarproject/android/Destroyable.java |  2 +-
 .../android/blogs/BlogFragment.java           |  9 ++++-----
 .../android/blogs/BlogPostFragment.java       |  2 +-
 .../android/blogs/BlogPostPagerFragment.java  |  4 ++--
 .../android/blogs/FeedFragment.java           |  4 ++--
 .../android/blogs/FeedPostFragment.java       |  2 +-
 .../android/blogs/FeedPostPagerFragment.java  |  4 ++--
 .../android/blogs/ReblogFragment.java         |  4 ++--
 .../handler/UiResultExceptionHandler.java     | 19 +++++++++++--------
 .../controller/handler/UiResultHandler.java   | 14 ++++++++------
 .../android/fragment/BaseFragment.java        |  3 ++-
 11 files changed, 36 insertions(+), 31 deletions(-)

diff --git a/briar-android/src/org/briarproject/android/Destroyable.java b/briar-android/src/org/briarproject/android/Destroyable.java
index a9a9ef8ce5..17c7dc8503 100644
--- a/briar-android/src/org/briarproject/android/Destroyable.java
+++ b/briar-android/src/org/briarproject/android/Destroyable.java
@@ -2,7 +2,7 @@ package org.briarproject.android;
 
 import android.support.annotation.UiThread;
 
-interface Destroyable {
+public interface Destroyable {
 
 	@UiThread
 	boolean hasBeenDestroyed();
diff --git a/briar-android/src/org/briarproject/android/blogs/BlogFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogFragment.java
index 5c175517de..4ff2695e3d 100644
--- a/briar-android/src/org/briarproject/android/blogs/BlogFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/BlogFragment.java
@@ -209,7 +209,7 @@ public class BlogFragment extends BaseFragment implements
 	public void onBlogPostAdded(BlogPostHeader header, final boolean local) {
 		blogController.loadBlogPost(header,
 				new UiResultExceptionHandler<BlogPostItem, DbException>(
-						getActivity()) {
+						listener) {
 					@Override
 					public void onResultUi(BlogPostItem post) {
 						adapter.add(post);
@@ -233,7 +233,7 @@ public class BlogFragment extends BaseFragment implements
 	void loadBlogPosts(final boolean reload) {
 		blogController.loadBlogPosts(
 				new UiResultExceptionHandler<Collection<BlogPostItem>, DbException>(
-						getActivity()) {
+						listener) {
 					@Override
 					public void onResultUi(Collection<BlogPostItem> posts) {
 						if (posts.size() > 0) {
@@ -254,8 +254,7 @@ public class BlogFragment extends BaseFragment implements
 
 	private void loadBlog() {
 		blogController.loadBlog(
-				new UiResultExceptionHandler<BlogItem, DbException>(
-						getActivity()) {
+				new UiResultExceptionHandler<BlogItem, DbException>(listener) {
 					@Override
 					public void onResultUi(BlogItem blog) {
 						setToolbarTitle(blog.getBlog().getAuthor());
@@ -333,7 +332,7 @@ public class BlogFragment extends BaseFragment implements
 
 	private void deleteBlog() {
 		blogController.deleteBlog(
-				new UiResultExceptionHandler<Void, DbException>(getActivity()) {
+				new UiResultExceptionHandler<Void, DbException>(listener) {
 					@Override
 					public void onResultUi(Void result) {
 						Toast.makeText(getActivity(),
diff --git a/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java
index 39c1bf3a5d..ac7b4d504e 100644
--- a/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java
@@ -62,7 +62,7 @@ public class BlogPostFragment extends BasePostFragment {
 		super.onStart();
 		blogController.loadBlogPost(postId,
 				new UiResultExceptionHandler<BlogPostItem, DbException>(
-						getActivity()) {
+						listener) {
 					@Override
 					public void onResultUi(BlogPostItem post) {
 						onBlogPostLoaded(post);
diff --git a/briar-android/src/org/briarproject/android/blogs/BlogPostPagerFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogPostPagerFragment.java
index 3a68030a1e..f0a534b847 100644
--- a/briar-android/src/org/briarproject/android/blogs/BlogPostPagerFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/BlogPostPagerFragment.java
@@ -45,7 +45,7 @@ public class BlogPostPagerFragment extends BasePostPagerFragment {
 	void loadBlogPosts(final MessageId select) {
 		blogController.loadBlogPosts(
 				new UiResultExceptionHandler<Collection<BlogPostItem>, DbException>(
-						getActivity()) {
+						listener) {
 					@Override
 					public void onResultUi(Collection<BlogPostItem> posts) {
 						onBlogPostsLoaded(select, posts);
@@ -61,7 +61,7 @@ public class BlogPostPagerFragment extends BasePostPagerFragment {
 	void loadBlogPost(BlogPostHeader header) {
 		blogController.loadBlogPost(header,
 				new UiResultExceptionHandler<BlogPostItem, DbException>(
-						getActivity()) {
+						listener) {
 					@Override
 					public void onResultUi(BlogPostItem post) {
 						addPost(post);
diff --git a/briar-android/src/org/briarproject/android/blogs/FeedFragment.java b/briar-android/src/org/briarproject/android/blogs/FeedFragment.java
index dbdd111271..41791e962c 100644
--- a/briar-android/src/org/briarproject/android/blogs/FeedFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/FeedFragment.java
@@ -108,7 +108,7 @@ public class FeedFragment extends BaseFragment implements
 				});
 		feedController.loadBlogPosts(
 				new UiResultExceptionHandler<Collection<BlogPostItem>, DbException>(
-						getActivity()) {
+						listener) {
 					@Override
 					public void onResultUi(Collection<BlogPostItem> posts) {
 						if (posts.isEmpty()) {
@@ -175,7 +175,7 @@ public class FeedFragment extends BaseFragment implements
 	public void onBlogPostAdded(BlogPostHeader header, final boolean local) {
 		feedController.loadBlogPost(header,
 				new UiResultExceptionHandler<BlogPostItem, DbException>(
-						getActivity()) {
+						listener) {
 					@Override
 					public void onResultUi(BlogPostItem post) {
 						adapter.add(post);
diff --git a/briar-android/src/org/briarproject/android/blogs/FeedPostFragment.java b/briar-android/src/org/briarproject/android/blogs/FeedPostFragment.java
index 807bcd6e34..442a85ef98 100644
--- a/briar-android/src/org/briarproject/android/blogs/FeedPostFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/FeedPostFragment.java
@@ -65,7 +65,7 @@ public class FeedPostFragment extends BasePostFragment {
 		super.onStart();
 		feedController.loadBlogPost(blogId, postId,
 				new UiResultExceptionHandler<BlogPostItem, DbException>(
-						getActivity()) {
+						listener) {
 					@Override
 					public void onResultUi(BlogPostItem post) {
 						onBlogPostLoaded(post);
diff --git a/briar-android/src/org/briarproject/android/blogs/FeedPostPagerFragment.java b/briar-android/src/org/briarproject/android/blogs/FeedPostPagerFragment.java
index df2c4e33ec..ab9444104c 100644
--- a/briar-android/src/org/briarproject/android/blogs/FeedPostPagerFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/FeedPostPagerFragment.java
@@ -44,7 +44,7 @@ public class FeedPostPagerFragment extends BasePostPagerFragment {
 	void loadBlogPosts(final MessageId select) {
 		feedController.loadBlogPosts(
 				new UiResultExceptionHandler<Collection<BlogPostItem>, DbException>(
-						getActivity()) {
+						listener) {
 					@Override
 					public void onResultUi(Collection<BlogPostItem> posts) {
 						onBlogPostsLoaded(select, posts);
@@ -60,7 +60,7 @@ public class FeedPostPagerFragment extends BasePostPagerFragment {
 	void loadBlogPost(BlogPostHeader header) {
 		feedController.loadBlogPost(header,
 				new UiResultExceptionHandler<BlogPostItem, DbException>(
-						getActivity()) {
+						listener) {
 					@Override
 					public void onResultUi(BlogPostItem post) {
 						addPost(post);
diff --git a/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java b/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java
index 87ac613805..305273ba8d 100644
--- a/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java
@@ -106,7 +106,7 @@ public class ReblogFragment extends BaseFragment {
 		// TODO: Load blog post when fragment is created. #631
 		feedController.loadBlogPost(blogId, postId,
 				new UiResultExceptionHandler<BlogPostItem, DbException>(
-						getActivity()) {
+						listener) {
 					@Override
 					public void onResultUi(BlogPostItem result) {
 						item = result;
@@ -148,7 +148,7 @@ public class ReblogFragment extends BaseFragment {
 	private void send() {
 		String comment = getComment();
 		feedController.repeatPost(item, comment,
-				new UiResultExceptionHandler<Void, DbException>(getActivity()) {
+				new UiResultExceptionHandler<Void, DbException>(listener) {
 					@Override
 					public void onResultUi(Void result) {
 						// do nothing, this fragment is gone already
diff --git a/briar-android/src/org/briarproject/android/controller/handler/UiResultExceptionHandler.java b/briar-android/src/org/briarproject/android/controller/handler/UiResultExceptionHandler.java
index ba2eab195a..1f9cab0937 100644
--- a/briar-android/src/org/briarproject/android/controller/handler/UiResultExceptionHandler.java
+++ b/briar-android/src/org/briarproject/android/controller/handler/UiResultExceptionHandler.java
@@ -1,33 +1,36 @@
 package org.briarproject.android.controller.handler;
 
-import android.app.Activity;
 import android.support.annotation.UiThread;
 
+import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener;
+
 public abstract class UiResultExceptionHandler<R, E extends Exception>
 		implements ResultExceptionHandler<R, E> {
 
-	private final Activity activity;
+	private final BaseFragmentListener listener;
 
-	public UiResultExceptionHandler(Activity activity) {
-		this.activity = activity;
+	protected UiResultExceptionHandler(BaseFragmentListener listener) {
+		this.listener = listener;
 	}
 
 	@Override
 	public void onResult(final R result) {
-		activity.runOnUiThread(new Runnable() {
+		listener.runOnUiThread(new Runnable() {
 			@Override
 			public void run() {
-				onResultUi(result);
+				if (!listener.hasBeenDestroyed())
+					onResultUi(result);
 			}
 		});
 	}
 
 	@Override
 	public void onException(final E exception) {
-		activity.runOnUiThread(new Runnable() {
+		listener.runOnUiThread(new Runnable() {
 			@Override
 			public void run() {
-				onExceptionUi(exception);
+				if (!listener.hasBeenDestroyed())
+					onExceptionUi(exception);
 			}
 		});
 	}
diff --git a/briar-android/src/org/briarproject/android/controller/handler/UiResultHandler.java b/briar-android/src/org/briarproject/android/controller/handler/UiResultHandler.java
index 0616b82a2b..03c68d7ac6 100644
--- a/briar-android/src/org/briarproject/android/controller/handler/UiResultHandler.java
+++ b/briar-android/src/org/briarproject/android/controller/handler/UiResultHandler.java
@@ -1,22 +1,24 @@
 package org.briarproject.android.controller.handler;
 
-import android.app.Activity;
 import android.support.annotation.UiThread;
 
+import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener;
+
 public abstract class UiResultHandler<R> implements ResultHandler<R> {
 
-	private final Activity activity;
+	private final BaseFragmentListener listener;
 
-	public UiResultHandler(Activity activity) {
-		this.activity = activity;
+	protected UiResultHandler(BaseFragmentListener listener) {
+		this.listener = listener;
 	}
 
 	@Override
 	public void onResult(final R result) {
-		activity.runOnUiThread(new Runnable() {
+		listener.runOnUiThread(new Runnable() {
 			@Override
 			public void run() {
-				onResultUi(result);
+				if (!listener.hasBeenDestroyed())
+					onResultUi(result);
 			}
 		});
 	}
diff --git a/briar-android/src/org/briarproject/android/fragment/BaseFragment.java b/briar-android/src/org/briarproject/android/fragment/BaseFragment.java
index c19bcf1eed..d6f4ed363a 100644
--- a/briar-android/src/org/briarproject/android/fragment/BaseFragment.java
+++ b/briar-android/src/org/briarproject/android/fragment/BaseFragment.java
@@ -7,6 +7,7 @@ import android.support.annotation.UiThread;
 import android.support.v4.app.Fragment;
 
 import org.briarproject.android.ActivityComponent;
+import org.briarproject.android.Destroyable;
 
 public abstract class BaseFragment extends Fragment {
 
@@ -45,7 +46,7 @@ public abstract class BaseFragment extends Fragment {
 		getActivity().supportFinishAfterTransition();
 	}
 
-	public interface BaseFragmentListener {
+	public interface BaseFragmentListener extends Destroyable {
 
 		@UiThread
 		void showLoadingScreen(boolean isBlocking, int stringId);
-- 
GitLab