Clicks on mentioned accounts opens details

This commit is contained in:
tom79 2017-06-23 20:03:17 +02:00
parent d363fd28c1
commit b92d2a5b51
2 changed files with 70 additions and 9 deletions

View File

@ -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()));

View File

@ -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<Mention>
* @return TextView
*/
public static TextView clickableAccounts(final Context context, TextView statusTV, String fullContent, List<Mention> mentions) {
//Retrieves accounts name
Pattern sPattern = Pattern.compile("@<span>([a-zA-Z0-9_]{1,})<\\/span>");
Matcher m = sPattern.matcher(fullContent);
while (m.find()) {
fullContent = fullContent.replaceAll(m.group(0), "<font color='#000'>" + m.group(0) + "</font>");
}
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;
}
}