From b92d2a5b518289af21c2667b84ed056ac90b11e4 Mon Sep 17 00:00:00 2001 From: tom79 Date: Fri, 23 Jun 2017 20:03:17 +0200 Subject: [PATCH] Clicks on mentioned accounts opens details --- .../mastodon/drawers/StatusListAdapter.java | 12 +--- .../gouv/etalab/mastodon/helper/Helper.java | 67 +++++++++++++++++++ 2 files changed, 70 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java index a7adad8e8..7236958cb 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java @@ -33,8 +33,6 @@ import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.text.Html; -import android.text.util.Linkify; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -246,7 +244,7 @@ public class StatusListAdapter extends BaseAdapter implements OnPostActionInterf username = status.getAccount().getUsername(); holder.status_reblog_user.setVisibility(View.GONE); holder.status_account_displayname.setText(displayName); - holder.status_account_username.setText( String.format("@%s",username)); + holder.status_account_username.setText(String.format("@%s",username)); } @@ -262,12 +260,8 @@ public class StatusListAdapter extends BaseAdapter implements OnPostActionInterf }); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - holder.status_content.setText(Html.fromHtml(content, Html.FROM_HTML_MODE_COMPACT)); - else - //noinspection deprecation - holder.status_content.setText(Html.fromHtml(content)); - holder.status_content.setAutoLinkMask(Linkify.WEB_URLS); + holder.status_content = Helper.clickableAccounts(context, holder.status_content,content, status.getReblog() != null?status.getReblog().getMentions():status.getMentions()); + holder.status_favorite_count.setText(String.valueOf(status.getFavourites_count())); holder.status_reblog_count.setText(String.valueOf(status.getReblogs_count())); holder.status_toot_date.setText(Helper.dateDiff(context, status.getCreated_at())); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java b/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java index 4180ec1c0..58c882e49 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/helper/Helper.java @@ -40,7 +40,14 @@ import android.os.Environment; import android.support.design.widget.NavigationView; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; +import android.text.Html; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextPaint; +import android.text.method.LinkMovementMethod; +import android.text.style.ClickableSpan; import android.util.DisplayMetrics; +import android.util.Log; import android.view.MenuItem; import android.view.View; import android.view.WindowManager; @@ -75,6 +82,7 @@ import fr.gouv.etalab.mastodon.activities.LoginActivity; import fr.gouv.etalab.mastodon.activities.ShowAccountActivity; import fr.gouv.etalab.mastodon.asynctasks.RemoveAccountAsyncTask; import fr.gouv.etalab.mastodon.client.Entities.Account; +import fr.gouv.etalab.mastodon.client.Entities.Mention; import fr.gouv.etalab.mastodon.sqlite.AccountDAO; import fr.gouv.etalab.mastodon.sqlite.Sqlite; import mastodon.etalab.gouv.fr.mastodon.R; @@ -772,4 +780,63 @@ public class Helper { } + /** + * Check if the status contents mentions and fills the content with ClickableSpan + * @param context Context + * @param statusTV Textview + * @param fullContent String, should be the st + * @param mentions List + * @return TextView + */ + public static TextView clickableAccounts(final Context context, TextView statusTV, String fullContent, List mentions) { + //Retrieves accounts name + Pattern sPattern = Pattern.compile("@([a-zA-Z0-9_]{1,})<\\/span>"); + Matcher m = sPattern.matcher(fullContent); + while (m.find()) { + fullContent = fullContent.replaceAll(m.group(0), "" + m.group(0) + ""); + } + if( mentions == null || mentions.size() == 0) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) + statusTV.setText(Html.fromHtml(fullContent, Html.FROM_HTML_MODE_COMPACT)); + else + //noinspection deprecation + statusTV.setText(Html.fromHtml(fullContent)); + return statusTV; + } + SpannableString spannableString; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) + spannableString = new SpannableString(Html.fromHtml(fullContent, Html.FROM_HTML_MODE_COMPACT)); + else + //noinspection deprecation + spannableString = new SpannableString(Html.fromHtml(fullContent)); + + //Looping through accounts which are mentioned + for(final Mention mention: mentions){ + String targetedAccount = "@" + mention.getUsername(); + if( spannableString.toString().contains(targetedAccount)){ + + int startPosition = spannableString.toString().indexOf(targetedAccount); + int endPosition = spannableString.toString().lastIndexOf(targetedAccount) + targetedAccount.length(); + spannableString.setSpan(new ClickableSpan() { + @Override + public void onClick(View textView) { + Intent intent = new Intent(context, ShowAccountActivity.class); + Bundle b = new Bundle(); + b.putString("accountId", mention.getId()); + intent.putExtras(b); + context.startActivity(intent); + } + @Override + public void updateDrawState(TextPaint ds) { + super.updateDrawState(ds); + }}, + startPosition, endPosition, + Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + statusTV.setText(spannableString, TextView.BufferType.SPANNABLE); + } + statusTV.setMovementMethod(LinkMovementMethod.getInstance()); + } + return statusTV; + } + }