Merge branch '1174-link-click-crash' into 'maintenance-0.16'

Backport: Get unwrapped context when clicking links to prevent crash on Android 4

See merge request akwizgran/briar!719
This commit is contained in:
akwizgran
2018-03-07 12:00:27 +00:00
7 changed files with 34 additions and 16 deletions

View File

@@ -73,7 +73,7 @@ abstract class BasePostFragment extends BaseFragment {
i.setFlags(FLAG_ACTIVITY_CLEAR_TOP); i.setFlags(FLAG_ACTIVITY_CLEAR_TOP);
getContext().startActivity(i); getContext().startActivity(i);
} }
}); }, getFragmentManager());
return view; return view;
} }

View File

@@ -91,7 +91,8 @@ public class BlogFragment extends BaseFragment
View v = inflater.inflate(R.layout.fragment_blog, container, false); 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 = v.findViewById(R.id.postList);
list.setLayoutManager(new LinearLayoutManager(getActivity())); list.setLayoutManager(new LinearLayoutManager(getActivity()));
list.setAdapter(adapter); list.setAdapter(adapter);

View File

@@ -1,21 +1,30 @@
package org.briarproject.briar.android.blog; package org.briarproject.briar.android.blog;
import android.content.Context; import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentManager;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; 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.R;
import org.briarproject.briar.android.util.BriarAdapter; import org.briarproject.briar.android.util.BriarAdapter;
class BlogPostAdapter @MethodsNotNullByDefault
extends BriarAdapter<BlogPostItem, BlogPostViewHolder> { @ParametersNotNullByDefault
class BlogPostAdapter extends BriarAdapter<BlogPostItem, BlogPostViewHolder> {
private final OnBlogPostClickListener listener; 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); super(ctx, BlogPostItem.class);
this.listener = listener; this.listener = listener;
this.fragmentManager = fragmentManager;
} }
@Override @Override
@@ -23,8 +32,7 @@ class BlogPostAdapter
int viewType) { int viewType) {
View v = LayoutInflater.from(ctx).inflate( View v = LayoutInflater.from(ctx).inflate(
R.layout.list_item_blog_post, parent, false); R.layout.list_item_blog_post, parent, false);
BlogPostViewHolder ui = new BlogPostViewHolder(v, false, listener); return new BlogPostViewHolder(v, false, listener, fragmentManager);
return ui;
} }
@Override @Override

View File

@@ -8,6 +8,7 @@ import android.support.annotation.NonNull;
import android.support.annotation.UiThread; import android.support.annotation.UiThread;
import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewCompat;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.text.Spanned; import android.text.Spanned;
@@ -52,12 +53,16 @@ class BlogPostViewHolder extends RecyclerView.ViewHolder {
@NonNull @NonNull
private final OnBlogPostClickListener listener; private final OnBlogPostClickListener listener;
@Nullable
private final FragmentManager fragmentManager;
BlogPostViewHolder(View v, boolean fullText, BlogPostViewHolder(View v, boolean fullText,
@NonNull OnBlogPostClickListener listener) { @NonNull OnBlogPostClickListener listener,
@Nullable FragmentManager fragmentManager) {
super(v); super(v);
this.fullText = fullText; this.fullText = fullText;
this.listener = listener; this.listener = listener;
this.fragmentManager = fragmentManager;
ctx = v.getContext(); ctx = v.getContext();
layout = v.findViewById(R.id.postLayout); layout = v.findViewById(R.id.postLayout);
@@ -117,7 +122,7 @@ class BlogPostViewHolder extends RecyclerView.ViewHolder {
if (fullText) { if (fullText) {
body.setText(bodyText); body.setText(bodyText);
body.setTextIsSelectable(true); body.setTextIsSelectable(true);
makeLinksClickable(body); makeLinksClickable(body, fragmentManager);
} else { } else {
body.setTextIsSelectable(false); body.setTextIsSelectable(false);
if (bodyText.length() > TEASER_LENGTH) if (bodyText.length() > TEASER_LENGTH)

View File

@@ -74,7 +74,8 @@ public class FeedFragment extends BaseFragment implements
View v = inflater.inflate(R.layout.fragment_blog, container, false); 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()); layoutManager = new LinearLayoutManager(getActivity());
list = v.findViewById(R.id.postList); list = v.findViewById(R.id.postList);

View File

@@ -146,7 +146,7 @@ public class ReblogFragment extends BaseFragment implements TextInputListener {
ui.input.setVisibility(VISIBLE); ui.input.setVisibility(VISIBLE);
} }
private static class ViewHolder { private class ViewHolder {
private final ScrollView scrollView; private final ScrollView scrollView;
private final ProgressBar progressBar; private final ProgressBar progressBar;
@@ -167,7 +167,7 @@ public class ReblogFragment extends BaseFragment implements TextInputListener {
public void onAuthorClick(BlogPostItem post) { public void onAuthorClick(BlogPostItem post) {
// probably don't want to allow author clicks here // probably don't want to allow author clicks here
} }
}); }, getFragmentManager());
input = v.findViewById(R.id.inputText); input = v.findViewById(R.id.inputText);
} }
} }

View File

@@ -11,7 +11,6 @@ import android.support.design.widget.TextInputLayout;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.text.Html; import android.text.Html;
import android.text.Spannable; import android.text.Spannable;
import android.text.SpannableString; import android.text.SpannableString;
@@ -25,6 +24,8 @@ import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import org.briarproject.bramble.api.contact.ContactId; 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.R;
import org.briarproject.briar.android.view.ArticleMovementMethod; import org.briarproject.briar.android.view.ArticleMovementMethod;
import org.briarproject.briar.android.widget.LinkDialogFragment; 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.BuildConfig.APPLICATION_ID;
import static org.briarproject.briar.android.BriarApplication.EXPIRY_DATE; import static org.briarproject.briar.android.BriarApplication.EXPIRY_DATE;
@MethodsNotNullByDefault
@ParametersNotNullByDefault
public class UiUtils { public class UiUtils {
public static final long MIN_DATE_RESOLUTION = MINUTE_IN_MILLIS; public static final long MIN_DATE_RESOLUTION = MINUTE_IN_MILLIS;
@@ -110,7 +113,9 @@ public class UiUtils {
return Html.fromHtml(s); 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()); SpannableStringBuilder ssb = new SpannableStringBuilder(v.getText());
URLSpan[] spans = ssb.getSpans(0, ssb.length(), URLSpan.class); URLSpan[] spans = ssb.getSpans(0, ssb.length(), URLSpan.class);
for (URLSpan span : spans) { for (URLSpan span : spans) {
@@ -122,8 +127,6 @@ public class UiUtils {
@Override @Override
public void onClick(View v2) { public void onClick(View v2) {
LinkDialogFragment f = LinkDialogFragment.newInstance(url); LinkDialogFragment f = LinkDialogFragment.newInstance(url);
FragmentManager fm = ((AppCompatActivity) v2.getContext())
.getSupportFragmentManager();
f.show(fm, f.getUniqueTag()); f.show(fm, f.getUniqueTag());
} }
}; };