Fixes custom emoji in profiles

This commit is contained in:
stom79 2018-08-17 11:53:21 +02:00
parent fb722f67ab
commit 88fc241e21
4 changed files with 76 additions and 34 deletions

View File

@ -923,6 +923,7 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt
@Override
public void onRetrieveEmojiAccount(Account account) {
account_note.setText(account.getNoteSpan(), TextView.BufferType.SPANNABLE);
account_dn.setText(account.getdisplayNameSpanSpan(), TextView.BufferType.SPANNABLE);;
if ( account.getFieldsSpan() != null && account.getFieldsSpan().size() > 0){
HashMap<String, SpannableString> fieldsSpan = account.getFieldsSpan();
Iterator it = fieldsSpan.entrySet().iterator();
@ -971,7 +972,6 @@ public class ShowAccountActivity extends BaseActivity implements OnPostActionInt
labelView.setText(label);
}
i++;
// it.remove();
}
}
}

View File

@ -58,6 +58,7 @@ public class Account implements Parcelable {
private String id;
private String username;
private SpannableString displayNameSpan;
private String acct;
private String display_name;
private boolean locked;
@ -208,6 +209,14 @@ public class Account implements Parcelable {
this.username = username;
}
public SpannableString getdisplayNameSpanSpan() {
return displayNameSpan;
}
public void setdisplayNameSpanSpan(SpannableString displayNameSpan) {
this.displayNameSpan = displayNameSpan;
}
public String getAcct() {
return acct;
}
@ -446,63 +455,73 @@ public class Account implements Parcelable {
if( ((Activity)context).isFinishing() )
return;
SpannableString spannableStringNote = null;
if( account.getNote() != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
spannableStringNote = new SpannableString(Html.fromHtml(account.getNote(), FROM_HTML_MODE_LEGACY));
noteSpan = new SpannableString(Html.fromHtml(account.getNote(), FROM_HTML_MODE_LEGACY));
else
//noinspection deprecation
spannableStringNote = new SpannableString(Html.fromHtml(account.getNote()));
noteSpan = new SpannableString(Html.fromHtml(account.getNote()));
}
if( account.getDisplay_name() != null)
displayNameSpan = new SpannableString(account.getDisplay_name());
if( account.getFields() != null && account.getFields().size() > 0) {
Iterator it = account.getFields().entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry) it.next();
SpannableString fieldSpan;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
fieldSpan = new SpannableString(Html.fromHtml((String)pair.getValue(), FROM_HTML_MODE_LEGACY));
else
//noinspection deprecation
fieldSpan = new SpannableString(Html.fromHtml((String)pair.getValue()));
fieldsSpan.put((String) pair.getKey(), fieldSpan);
}
account.setFieldsSpan(fieldsSpan);
}
final List<Emojis> emojis = account.getEmojis();
if( emojis != null && emojis.size() > 0 ) {
final int[] i = {0};
for (final Emojis emoji : emojis) {
final SpannableString finalSpannableStringNote = spannableStringNote;
fields = account.getFields();
Glide.with(context)
.asBitmap()
.load(emoji.getUrl())
/*.listener(new RequestListener<Bitmap>() {
@Override
public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) {
return false;
}
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
i[0]++;
if( i[0] == (emojis.size())) {
if( finalSpannableStringNote != null)
account.setNoteSpan(finalSpannableStringNote);
listener.onRetrieveEmojiAccount(account);
}
return false;
}
})*/
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
final String targetedEmoji = ":" + emoji.getShortcode() + ":";
if (finalSpannableStringNote != null && finalSpannableStringNote.toString().contains(targetedEmoji)) {
if (noteSpan != null && noteSpan.toString().contains(targetedEmoji)) {
//emojis can be used several times so we have to loop
for (int startPosition = -1; (startPosition = finalSpannableStringNote.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) {
for (int startPosition = -1; (startPosition = noteSpan.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) {
final int endPosition = startPosition + targetedEmoji.length();
if(endPosition <= finalSpannableStringNote.toString().length() && endPosition >= startPosition)
finalSpannableStringNote.setSpan(
if(endPosition <= noteSpan.toString().length() && endPosition >= startPosition)
noteSpan.setSpan(
new ImageSpan(context,
Bitmap.createScaledBitmap(resource, (int) Helper.convertDpToPixel(20, context),
(int) Helper.convertDpToPixel(20, context), false)), startPosition,
endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
}
}
Iterator it = account.getFields().entrySet().iterator();
if (displayNameSpan != null && displayNameSpan.toString().contains(targetedEmoji)) {
//emojis can be used several times so we have to loop
for (int startPosition = -1; (startPosition = displayNameSpan.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) {
final int endPosition = startPosition + targetedEmoji.length();
if(endPosition <= displayNameSpan.toString().length() && endPosition >= startPosition)
displayNameSpan.setSpan(
new ImageSpan(context,
Bitmap.createScaledBitmap(resource, (int) Helper.convertDpToPixel(20, context),
(int) Helper.convertDpToPixel(20, context), false)), startPosition,
endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
}
}
Iterator it = fieldsSpan.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
SpannableString fieldSpan = new SpannableString((String)pair.getValue());
SpannableString fieldSpan = (SpannableString) pair.getValue();
if (fieldSpan.toString().contains(targetedEmoji)) {
//emojis can be used several times so we have to loop
for (int startPosition = -1; (startPosition = fieldSpan.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) {
@ -516,12 +535,15 @@ public class Account implements Parcelable {
}
fieldsSpan.put((String)pair.getKey(), fieldSpan);
}
it.remove();
}
i[0]++;
if( i[0] == (emojis.size())) {
if( finalSpannableStringNote != null)
account.setNoteSpan(finalSpannableStringNote);
if( noteSpan != null)
account.setNoteSpan(noteSpan);
if( displayNameSpan != null)
account.setdisplayNameSpanSpan(displayNameSpan);
account.setFieldsSpan(fieldsSpan);
listener.onRetrieveEmojiAccount(account);
}
}

View File

@ -102,7 +102,7 @@ public class Status implements Parcelable{
private boolean fetchMore = false;
private Status status;
private String content, contentCW, contentTranslated;
private SpannableString contentSpan, contentSpanCW, contentSpanTranslated;
private SpannableString contentSpan, displayNameSpan, contentSpanCW, contentSpanTranslated;
public Status(){
@ -242,6 +242,13 @@ public class Status implements Parcelable{
this.favourites_count = favourites_count;
}
public SpannableString getDisplayNameSpan(){
return this.status.getAccount().getdisplayNameSpanSpan();
}
public void setDisplayNameSpan(SpannableString displayNameSpan){
this.displayNameSpan = displayNameSpan;
}
public boolean isReblogged() {
return reblogged;
}
@ -537,7 +544,7 @@ public class Status implements Parcelable{
//emojis can be used several times so we have to loop
for (int startPosition = -1; (startPosition = contentSpan.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) {
final int endPosition = startPosition + targetedEmoji.length();
if( startPosition >= 0 && endPosition <= contentSpan.toString().length() && endPosition >= startPosition)
if( endPosition <= contentSpan.toString().length() && endPosition >= startPosition)
contentSpan.setSpan(
new ImageSpan(context,
Bitmap.createScaledBitmap(resource, (int) Helper.convertDpToPixel(20, context),
@ -545,11 +552,23 @@ public class Status implements Parcelable{
endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
}
}
if (displayNameSpan != null && displayNameSpan.toString().contains(targetedEmoji)) {
//emojis can be used several times so we have to loop
for (int startPosition = -1; (startPosition = displayNameSpan.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) {
final int endPosition = startPosition + targetedEmoji.length();
if(endPosition <= displayNameSpan.toString().length() && endPosition >= startPosition)
displayNameSpan.setSpan(
new ImageSpan(context,
Bitmap.createScaledBitmap(resource, (int) Helper.convertDpToPixel(20, context),
(int) Helper.convertDpToPixel(20, context), false)), startPosition,
endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
}
}
if (contentSpanCW.toString().contains(targetedEmoji)) {
//emojis can be used several times so we have to loop
for (int startPosition = -1; (startPosition = contentSpanCW.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) {
final int endPosition = startPosition + targetedEmoji.length();
if( startPosition >= 0 && endPosition <= contentSpan.toString().length() && endPosition >= startPosition)
if( endPosition <= contentSpan.toString().length() && endPosition >= startPosition)
contentSpanCW.setSpan(
new ImageSpan(context,
Bitmap.createScaledBitmap(resource, (int) Helper.convertDpToPixel(20, context),

View File

@ -641,6 +641,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
holder.status_content.setText(status.getContentSpan(), 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_content.setMovementMethod(LinkMovementMethod.getInstance());
holder.status_spoiler.setMovementMethod(LinkMovementMethod.getInstance());