Fixes custom emoji in usernames

This commit is contained in:
stom79 2018-08-17 16:22:26 +02:00
parent 88fc241e21
commit 93f14ed439
3 changed files with 39 additions and 32 deletions

View File

@ -16,7 +16,6 @@ package fr.gouv.etalab.mastodon.asynctasks;
import android.content.Context; import android.content.Context;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.util.Log;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.List; import java.util.List;
@ -128,14 +127,10 @@ public class PostActionAsyncTask extends AsyncTask<Void, Void, Void> {
} }
}else if(remoteAccount != null){ }else if(remoteAccount != null){
String searchString = remoteAccount.getAcct().contains("@")?"@" + remoteAccount.getAcct():"@" + remoteAccount.getAcct() + "@" + Helper.getLiveInstance(contextReference.get()); String searchString = remoteAccount.getAcct().contains("@")?"@" + remoteAccount.getAcct():"@" + remoteAccount.getAcct() + "@" + Helper.getLiveInstance(contextReference.get());
Log.v(Helper.TAG,"searchString: " + searchString);
Results search = api.search(searchString); Results search = api.search(searchString);
Log.v(Helper.TAG,"search: " + search);
if (search != null) { if (search != null) {
List<Account> accounts = search.getAccounts(); List<Account> accounts = search.getAccounts();
Log.v(Helper.TAG,"accounts: " + accounts);
if (accounts != null && accounts.size() > 0) { if (accounts != null && accounts.size() > 0) {
Log.v(Helper.TAG,"accounts.size(): " + accounts.size());
Account accountTmp = accounts.get(0); Account accountTmp = accounts.get(0);
this.targetedId = accountTmp.getId(); this.targetedId = accountTmp.getId();
statusCode = api.postAction(apiAction, targetedId); statusCode = api.postAction(apiAction, targetedId);

View File

@ -243,7 +243,7 @@ public class Status implements Parcelable{
} }
public SpannableString getDisplayNameSpan(){ public SpannableString getDisplayNameSpan(){
return this.status.getAccount().getdisplayNameSpanSpan(); return this.displayNameSpan;
} }
public void setDisplayNameSpan(SpannableString displayNameSpan){ public void setDisplayNameSpan(SpannableString displayNameSpan){
this.displayNameSpan = displayNameSpan; this.displayNameSpan = displayNameSpan;
@ -513,8 +513,22 @@ public class Status implements Parcelable{
if( ((Activity)context).isFinishing() ) if( ((Activity)context).isFinishing() )
return; return;
final List<Emojis> emojis = status.getReblog() != null ? status.getReblog().getEmojis() : status.getEmojis(); final List<Emojis> emojis = status.getReblog() != null ? status.getReblog().getEmojis() : status.getEmojis();
final List<Emojis> emojisAccounts = status.getAccount().getEmojis();
String displayName;
if( status.getReblog() != null){
displayName = Helper.shortnameToUnicode(status.getReblog().getAccount().getDisplay_name(), true);
displayName = String.format("%s @%s",displayName,status.getReblog().getAccount().getAcct());
}else {
displayName = Helper.shortnameToUnicode(status.getAccount().getDisplay_name(), true);
displayName = String.format("%s @%s",displayName,status.getAccount().getAcct());
}
displayNameSpan = new SpannableString(displayName);
if( emojisAccounts != null)
emojis.addAll(emojisAccounts);
if( emojis != null && emojis.size() > 0 ) { if( emojis != null && emojis.size() > 0 ) {
final int[] i = {0}; final int[] i = {0};
for (final Emojis emoji : emojis) { for (final Emojis emoji : emojis) {
@ -635,14 +649,14 @@ public class Status implements Parcelable{
}) })
.into(new SimpleTarget<Bitmap>() { .into(new SimpleTarget<Bitmap>() {
@Override @Override
public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) { public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
final String targetedEmoji = ":" + emoji.getShortcode() + ":"; final String targetedEmoji = ":" + emoji.getShortcode() + ":";
if (finalSpannableStringTranslated != null && finalSpannableStringTranslated.toString().contains(targetedEmoji)) { if (finalSpannableStringTranslated != null && finalSpannableStringTranslated.toString().contains(targetedEmoji)) {
//emojis can be used several times so we have to loop //emojis can be used several times so we have to loop
for (int startPosition = -1; (startPosition = finalSpannableStringTranslated.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) { for (int startPosition = -1; (startPosition = finalSpannableStringTranslated.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) {
final int endPosition = startPosition + targetedEmoji.length(); final int endPosition = startPosition + targetedEmoji.length();
if( startPosition >= 0 && endPosition <= finalSpannableStringTranslated.toString().length() && endPosition >= startPosition) if( endPosition <= finalSpannableStringTranslated.toString().length() && endPosition >= startPosition)
finalSpannableStringTranslated.setSpan( finalSpannableStringTranslated.setSpan(
new ImageSpan(context, new ImageSpan(context,
Bitmap.createScaledBitmap(resource, (int) Helper.convertDpToPixel(20, context), Bitmap.createScaledBitmap(resource, (int) Helper.convertDpToPixel(20, context),
@ -686,7 +700,7 @@ public class Status implements Parcelable{
int matchStart = matcher.start(2); int matchStart = matcher.start(2);
int matchEnd = matcher.end(); int matchEnd = matcher.end();
final String twittername = spannableString.toString().substring(matchStart, matchEnd); final String twittername = spannableString.toString().substring(matchStart, matchEnd);
if( matchStart >= 0 && matchEnd <= spannableString.toString().length() && matchEnd >= matchStart) if( matchEnd <= spannableString.toString().length() && matchEnd >= matchStart)
spannableString.setSpan(new ClickableSpan() { spannableString.setSpan(new ClickableSpan() {
@Override @Override
public void onClick(View textView) { public void onClick(View textView) {
@ -699,7 +713,7 @@ public class Status implements Parcelable{
ds.setUnderlineText(false); ds.setUnderlineText(false);
} }
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); }, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
if( matchStart >= 0 && matchEnd <= spannableString.toString().length() && matchEnd >= matchStart) if( matchEnd <= spannableString.toString().length() && matchEnd >= matchStart)
spannableString.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, (theme==Helper.THEME_DARK||theme==Helper.THEME_BLACK)?R.color.mastodonC2:R.color.mastodonC4)), matchStart, matchEnd, spannableString.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, (theme==Helper.THEME_DARK||theme==Helper.THEME_BLACK)?R.color.mastodonC2:R.color.mastodonC4)), matchStart, matchEnd,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE); Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
} }
@ -709,7 +723,7 @@ public class Status implements Parcelable{
int matchStart = matcher.start(1); int matchStart = matcher.start(1);
int matchEnd = matcher.end(); int matchEnd = matcher.end();
final String url = spannableString.toString().substring(matchStart, matchEnd); final String url = spannableString.toString().substring(matchStart, matchEnd);
if( matchStart >= 0 && matchEnd <= spannableString.toString().length() && matchEnd >= matchStart) if( matchEnd <= spannableString.toString().length() && matchEnd >= matchStart)
spannableString.setSpan(new ClickableSpan() { spannableString.setSpan(new ClickableSpan() {
@Override @Override
public void onClick(View textView) { public void onClick(View textView) {
@ -726,7 +740,7 @@ public class Status implements Parcelable{
}, },
matchStart, matchEnd, matchStart, matchEnd,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE); Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
if( matchStart >= 0 && matchEnd <= spannableString.toString().length() && matchEnd >= matchStart) if( matchEnd <= spannableString.toString().length() && matchEnd >= matchStart)
spannableString.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, (theme==Helper.THEME_DARK||theme==Helper.THEME_BLACK)?R.color.mastodonC2:R.color.mastodonC4)), matchStart, matchEnd, spannableString.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, (theme==Helper.THEME_DARK||theme==Helper.THEME_BLACK)?R.color.mastodonC2:R.color.mastodonC4)), matchStart, matchEnd,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE); Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
} }
@ -740,7 +754,7 @@ public class Status implements Parcelable{
//Accounts can be mentioned several times so we have to loop //Accounts can be mentioned several times so we have to loop
for(int startPosition = -1 ; (startPosition = spannableString.toString().indexOf(targetedAccount, startPosition + 1)) != -1 ; startPosition++){ for(int startPosition = -1 ; (startPosition = spannableString.toString().indexOf(targetedAccount, startPosition + 1)) != -1 ; startPosition++){
int endPosition = startPosition + targetedAccount.length(); int endPosition = startPosition + targetedAccount.length();
if( startPosition >= 0 && endPosition <= spannableString.toString().length() && endPosition >= startPosition) if( endPosition <= spannableString.toString().length() && endPosition >= startPosition)
spannableString.setSpan(new ClickableSpan() { spannableString.setSpan(new ClickableSpan() {
@Override @Override
public void onClick(View textView) { public void onClick(View textView) {
@ -758,7 +772,7 @@ public class Status implements Parcelable{
}, },
startPosition, endPosition, startPosition, endPosition,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE); Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
if( startPosition >= 0 && endPosition <= spannableString.toString().length() && endPosition >= startPosition) if(endPosition <= spannableString.toString().length() && endPosition >= startPosition)
spannableString.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, (theme==Helper.THEME_DARK||theme==Helper.THEME_BLACK)?R.color.mastodonC2:R.color.mastodonC4)), startPosition, endPosition, spannableString.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, (theme==Helper.THEME_DARK||theme==Helper.THEME_BLACK)?R.color.mastodonC2:R.color.mastodonC4)), startPosition, endPosition,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE); Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
} }
@ -771,7 +785,7 @@ public class Status implements Parcelable{
int matchStart = matcher.start(1); int matchStart = matcher.start(1);
int matchEnd = matcher.end(); int matchEnd = matcher.end();
final String tag = spannableString.toString().substring(matchStart, matchEnd); final String tag = spannableString.toString().substring(matchStart, matchEnd);
if( matchStart >= 0 && matchEnd <= spannableString.toString().length() && matchEnd >= matchStart) if( matchEnd <= spannableString.toString().length() && matchEnd >= matchStart)
spannableString.setSpan(new ClickableSpan() { spannableString.setSpan(new ClickableSpan() {
@Override @Override
public void onClick(View textView) { public void onClick(View textView) {
@ -787,7 +801,7 @@ public class Status implements Parcelable{
ds.setUnderlineText(false); ds.setUnderlineText(false);
} }
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); }, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
if( matchStart >= 0 && matchEnd <= spannableString.toString().length() && matchEnd >= matchStart) if( matchEnd <= spannableString.toString().length() && matchEnd >= matchStart)
spannableString.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, (theme==Helper.THEME_DARK||theme==Helper.THEME_BLACK)?R.color.mastodonC2:R.color.mastodonC4)), matchStart, matchEnd, spannableString.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, (theme==Helper.THEME_DARK||theme==Helper.THEME_BLACK)?R.color.mastodonC2:R.color.mastodonC4)), matchStart, matchEnd,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE); Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
} }

View File

@ -40,14 +40,12 @@ import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.text.Html; import android.text.Html;
import android.text.Spannable; import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned; import android.text.Spanned;
import android.text.method.LinkMovementMethod; import android.text.method.LinkMovementMethod;
import android.text.style.ForegroundColorSpan; import android.text.style.ForegroundColorSpan;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.webkit.WebView; import android.webkit.WebView;
@ -641,7 +639,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
holder.status_content.setText(status.getContentSpan(), TextView.BufferType.SPANNABLE); holder.status_content.setText(status.getContentSpan(), TextView.BufferType.SPANNABLE);
holder.status_spoiler.setText(status.getContentSpanCW(), TextView.BufferType.SPANNABLE); holder.status_spoiler.setText(status.getContentSpanCW(), TextView.BufferType.SPANNABLE);
holder.status_account_displayname.setText(status.getAccount().getdisplayNameSpanSpan(), TextView.BufferType.SPANNABLE); holder.status_account_displayname.setText(status.getDisplayNameSpan(), TextView.BufferType.SPANNABLE);
holder.status_content.setMovementMethod(LinkMovementMethod.getInstance()); holder.status_content.setMovementMethod(LinkMovementMethod.getInstance());
holder.status_spoiler.setMovementMethod(LinkMovementMethod.getInstance()); holder.status_spoiler.setMovementMethod(LinkMovementMethod.getInstance());
@ -686,27 +684,18 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
//Displays name & emoji in toot header //Displays name & emoji in toot header
final String displayName;
final String username;
final String ppurl; final String ppurl;
String name;
if( status.getReblog() != null){ if( status.getReblog() != null){
displayName = Helper.shortnameToUnicode(status.getReblog().getAccount().getDisplay_name(), true);
username = status.getReblog().getAccount().getUsername();
holder.status_account_displayname.setText(String.format("%s @%s",displayName, username));
ppurl = status.getReblog().getAccount().getAvatar(); ppurl = status.getReblog().getAccount().getAvatar();
holder.status_account_displayname.setVisibility(View.VISIBLE); holder.status_account_displayname.setVisibility(View.VISIBLE);
holder.status_account_displayname.setText(context.getResources().getString(R.string.reblog_by, status.getAccount().getUsername())); holder.status_account_displayname.setText(context.getResources().getString(R.string.reblog_by, status.getAccount().getUsername()));
name = String.format("%s @%s",displayName,status.getReblog().getAccount().getAcct());
}else { }else {
ppurl = status.getAccount().getAvatar(); ppurl = status.getAccount().getAvatar();
displayName = Helper.shortnameToUnicode(status.getAccount().getDisplay_name(), true);
name = String.format("%s @%s",displayName,status.getAccount().getAcct());
} }
//-------- END -> Displays name & emoji in toot header //-------- END -> Displays name & emoji in toot header
//Change the color in gray for accounts in DARK Theme only //Change the color in gray for accounts in DARK Theme only
Spannable wordtoSpan = new SpannableString(name); Spannable wordtoSpan = status.getDisplayNameSpan();
if( theme == THEME_DARK || theme == Helper.THEME_BLACK) { if( theme == THEME_DARK || theme == Helper.THEME_BLACK) {
Pattern hashAcct; Pattern hashAcct;
if( status.getReblog() != null) if( status.getReblog() != null)
@ -1952,7 +1941,16 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
@Override @Override
public void onRetrieveEmoji(Status status, boolean fromTranslation) { public void onRetrieveEmoji(Status status, boolean fromTranslation) {
if( !fromTranslation) { if( status != null) {
if( !fromTranslation) {
status.setEmojiFound(true);
}else {
status.setEmojiTranslateFound(true);
}
notifyStatusChanged(status);
}
/* if( !fromTranslation) {
if (!status.isEmojiFound()) { if (!status.isEmojiFound()) {
for (int i = 0; i < statusListAdapter.getItemCount(); i++) { for (int i = 0; i < statusListAdapter.getItemCount(); i++) {
//noinspection ConstantConditions //noinspection ConstantConditions
@ -1978,7 +1976,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
} }
} }
} }
} }*/
} }
@Override @Override