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