From 190aeef34ee96c4c9b0559383ff0c93c861d57cd Mon Sep 17 00:00:00 2001
From: Torsten Grote <t@grobox.de>
Date: Wed, 28 Feb 2018 10:59:07 -0300
Subject: [PATCH] Passing in reference to FragmentManager when clicking links
 to prevent crash on Android 4

---
 .../briar/android/blog/BasePostFragment.java   |  2 +-
 .../briar/android/blog/BlogFragment.java       |  3 ++-
 .../briar/android/blog/BlogPostAdapter.java    | 18 +++++++++++++-----
 .../briar/android/blog/BlogPostViewHolder.java |  9 +++++++--
 .../briar/android/blog/FeedFragment.java       |  3 ++-
 .../briar/android/blog/ReblogFragment.java     |  4 ++--
 .../briar/android/util/UiUtils.java            | 11 +++++++----
 7 files changed, 34 insertions(+), 16 deletions(-)

diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BasePostFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BasePostFragment.java
index 3dd18e0be6..fedded3e93 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BasePostFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BasePostFragment.java
@@ -73,7 +73,7 @@ abstract class BasePostFragment extends BaseFragment {
 				i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
 				getContext().startActivity(i);
 			}
-		});
+		}, getFragmentManager());
 		return view;
 	}
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogFragment.java
index 765d83f202..49260920dd 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogFragment.java
@@ -91,7 +91,8 @@ public class BlogFragment extends BaseFragment
 
 		View v = inflater.inflate(R.layout.fragment_blog, container, false);
 
-		adapter = new BlogPostAdapter(getActivity(), this);
+		adapter =
+				new BlogPostAdapter(getActivity(), this, getFragmentManager());
 		list = v.findViewById(R.id.postList);
 		list.setLayoutManager(new LinearLayoutManager(getActivity()));
 		list.setAdapter(adapter);
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostAdapter.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostAdapter.java
index fd2e8b7d90..d7e5d1fef2 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostAdapter.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostAdapter.java
@@ -1,21 +1,30 @@
 package org.briarproject.briar.android.blog;
 
 import android.content.Context;
+import android.support.annotation.Nullable;
+import android.support.v4.app.FragmentManager;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
+import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
 import org.briarproject.briar.R;
 import org.briarproject.briar.android.util.BriarAdapter;
 
-class BlogPostAdapter
-		extends BriarAdapter<BlogPostItem, BlogPostViewHolder> {
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
+class BlogPostAdapter extends BriarAdapter<BlogPostItem, BlogPostViewHolder> {
 
 	private final OnBlogPostClickListener listener;
+	@Nullable
+	private final FragmentManager fragmentManager;
 
-	BlogPostAdapter(Context ctx, OnBlogPostClickListener listener) {
+	BlogPostAdapter(Context ctx, OnBlogPostClickListener listener,
+			@Nullable FragmentManager fragmentManager) {
 		super(ctx, BlogPostItem.class);
 		this.listener = listener;
+		this.fragmentManager = fragmentManager;
 	}
 
 	@Override
@@ -23,8 +32,7 @@ class BlogPostAdapter
 			int viewType) {
 		View v = LayoutInflater.from(ctx).inflate(
 				R.layout.list_item_blog_post, parent, false);
-		BlogPostViewHolder ui = new BlogPostViewHolder(v, false, listener);
-		return ui;
+		return new BlogPostViewHolder(v, false, listener, fragmentManager);
 	}
 
 	@Override
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java
index e579aea13b..6b34b80756 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostViewHolder.java
@@ -8,6 +8,7 @@ import android.support.annotation.NonNull;
 import android.support.annotation.UiThread;
 import android.support.v4.app.ActivityCompat;
 import android.support.v4.app.ActivityOptionsCompat;
+import android.support.v4.app.FragmentManager;
 import android.support.v4.view.ViewCompat;
 import android.support.v7.widget.RecyclerView;
 import android.text.Spanned;
@@ -52,12 +53,16 @@ class BlogPostViewHolder extends RecyclerView.ViewHolder {
 
 	@NonNull
 	private final OnBlogPostClickListener listener;
+	@Nullable
+	private final FragmentManager fragmentManager;
 
 	BlogPostViewHolder(View v, boolean fullText,
-			@NonNull OnBlogPostClickListener listener) {
+			@NonNull OnBlogPostClickListener listener,
+			@Nullable FragmentManager fragmentManager) {
 		super(v);
 		this.fullText = fullText;
 		this.listener = listener;
+		this.fragmentManager = fragmentManager;
 
 		ctx = v.getContext();
 		layout = v.findViewById(R.id.postLayout);
@@ -117,7 +122,7 @@ class BlogPostViewHolder extends RecyclerView.ViewHolder {
 		if (fullText) {
 			body.setText(bodyText);
 			body.setTextIsSelectable(true);
-			makeLinksClickable(body);
+			makeLinksClickable(body, fragmentManager);
 		} else {
 			body.setTextIsSelectable(false);
 			if (bodyText.length() > TEASER_LENGTH)
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedFragment.java
index 6f7f309903..cab53ff014 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/FeedFragment.java
@@ -74,7 +74,8 @@ public class FeedFragment extends BaseFragment implements
 
 		View v = inflater.inflate(R.layout.fragment_blog, container, false);
 
-		adapter = new BlogPostAdapter(getActivity(), this);
+		adapter =
+				new BlogPostAdapter(getActivity(), this, getFragmentManager());
 
 		layoutManager = new LinearLayoutManager(getActivity());
 		list = v.findViewById(R.id.postList);
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/ReblogFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/ReblogFragment.java
index 8bd99617d3..81434df6ac 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/blog/ReblogFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/ReblogFragment.java
@@ -146,7 +146,7 @@ public class ReblogFragment extends BaseFragment implements TextInputListener {
 		ui.input.setVisibility(VISIBLE);
 	}
 
-	private static class ViewHolder {
+	private class ViewHolder {
 
 		private final ScrollView scrollView;
 		private final ProgressBar progressBar;
@@ -167,7 +167,7 @@ public class ReblogFragment extends BaseFragment implements TextInputListener {
 						public void onAuthorClick(BlogPostItem post) {
 							// probably don't want to allow author clicks here
 						}
-					});
+					}, getFragmentManager());
 			input = v.findViewById(R.id.inputText);
 		}
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java b/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java
index 26e61f37f8..757bb7159d 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java
@@ -11,7 +11,6 @@ import android.support.design.widget.TextInputLayout;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.content.ContextCompat;
 import android.support.v7.app.AlertDialog;
-import android.support.v7.app.AppCompatActivity;
 import android.text.Html;
 import android.text.Spannable;
 import android.text.SpannableString;
@@ -25,6 +24,8 @@ import android.view.View;
 import android.widget.TextView;
 
 import org.briarproject.bramble.api.contact.ContactId;
+import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
+import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
 import org.briarproject.briar.R;
 import org.briarproject.briar.android.view.ArticleMovementMethod;
 import org.briarproject.briar.android.widget.LinkDialogFragment;
@@ -47,6 +48,8 @@ import static android.text.format.DateUtils.WEEK_IN_MILLIS;
 import static org.briarproject.briar.BuildConfig.APPLICATION_ID;
 import static org.briarproject.briar.android.BriarApplication.EXPIRY_DATE;
 
+@MethodsNotNullByDefault
+@ParametersNotNullByDefault
 public class UiUtils {
 
 	public static final long MIN_DATE_RESOLUTION = MINUTE_IN_MILLIS;
@@ -110,7 +113,9 @@ public class UiUtils {
 		return Html.fromHtml(s);
 	}
 
-	public static void makeLinksClickable(TextView v) {
+	public static void makeLinksClickable(TextView v,
+			@Nullable FragmentManager fm) {
+		if (fm == null) return;
 		SpannableStringBuilder ssb = new SpannableStringBuilder(v.getText());
 		URLSpan[] spans = ssb.getSpans(0, ssb.length(), URLSpan.class);
 		for (URLSpan span : spans) {
@@ -122,8 +127,6 @@ public class UiUtils {
 				@Override
 				public void onClick(View v2) {
 					LinkDialogFragment f = LinkDialogFragment.newInstance(url);
-					FragmentManager fm = ((AppCompatActivity) v2.getContext())
-							.getSupportFragmentManager();
 					f.show(fm, f.getUniqueTag());
 				}
 			};
-- 
GitLab