diff options
Diffstat (limited to 'app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Account.java')
-rw-r--r-- | app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Account.java | 384 |
1 files changed, 252 insertions, 132 deletions
diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Account.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Account.java index a7c2f8ae7..e97fa2241 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Account.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Account.java @@ -15,8 +15,8 @@ package fr.gouv.etalab.mastodon.client.Entities; import android.app.Activity; -import android.content.*; import android.content.Context; +import android.content.Intent; import android.graphics.Bitmap; import android.os.Build; import android.os.Bundle; @@ -28,9 +28,9 @@ import android.text.Spannable; import android.text.SpannableString; import android.text.Spanned; import android.text.TextPaint; +import android.text.TextUtils; import android.text.style.ClickableSpan; import android.text.style.ImageSpan; -import android.util.Log; import android.view.View; import com.bumptech.glide.Glide; @@ -38,8 +38,8 @@ import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.transition.Transition; import java.util.Date; -import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -48,7 +48,8 @@ import fr.gouv.etalab.mastodon.activities.ShowAccountActivity; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.interfaces.OnRetrieveEmojiAccountInterface; -import static android.text.Html.FROM_HTML_MODE_LEGACY; +import static android.support.v4.text.HtmlCompat.FROM_HTML_MODE_LEGACY; + /** * Created by Thomas on 23/04/2017. @@ -85,12 +86,94 @@ public class Account implements Parcelable { private Account moved_to_account; private boolean muting_notifications; private int metaDataSize; - private HashMap<String, String> fields = new HashMap<>(); - private HashMap<String, SpannableString> fieldsSpan = new HashMap<>(); + private int metaDataSizeVerified; + private LinkedHashMap<String, String> fields; + private LinkedHashMap<String, Boolean> fieldsVerified; + private LinkedHashMap<SpannableString, SpannableString> fieldsSpan; private List<Emojis> emojis; private Account account; + private String host; + protected Account(Parcel in) { + id = in.readString(); + username = in.readString(); + emojis = in.readArrayList(Emojis.class.getClassLoader()); + acct = in.readString(); + display_name = in.readString(); + host = in.readString(); + displayNameSpan = (SpannableString) TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); + noteSpan = (SpannableString) TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); + locked = in.readByte() != 0; + followers_count = in.readInt(); + following_count = in.readInt(); + statuses_count = in.readInt(); + note = in.readString(); + url = in.readString(); + avatar = in.readString(); + avatar_static = in.readString(); + header = in.readString(); + header_static = in.readString(); + token = in.readString(); + instance = in.readString(); + metaDataSize = in.readInt(); + for(int i = 0; i < metaDataSize; i++){ + if( fields == null) + fields = new LinkedHashMap<>(); + String key = in.readString(); + String value = in.readString(); + fields.put(key,value); + } + metaDataSizeVerified = in.readInt(); + for(int i = 0; i < metaDataSizeVerified; i++){ + if( fieldsVerified == null) + fieldsVerified = new LinkedHashMap<>(); + String key = in.readString(); + Boolean value = in.readByte() != 0; + fieldsVerified.put(key,value); + } + + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(id); + dest.writeString(username); + dest.writeList(emojis); + dest.writeString(acct); + dest.writeString(display_name); + dest.writeString(host); + TextUtils.writeToParcel(displayNameSpan, dest, flags); + TextUtils.writeToParcel(noteSpan, dest, flags); + dest.writeByte((byte) (locked ? 1 : 0)); + dest.writeInt(followers_count); + dest.writeInt(following_count); + dest.writeInt(statuses_count); + dest.writeString(note); + dest.writeString(url); + dest.writeString(avatar); + dest.writeString(avatar_static); + dest.writeString(header); + dest.writeString(header_static); + dest.writeString(token); + dest.writeString(instance); + if( fields != null) { + metaDataSize = fields.size(); + dest.writeInt(metaDataSize); + for (Map.Entry<String, String> entry : fields.entrySet()) { + dest.writeString(entry.getKey()); + dest.writeString(entry.getValue()); + } + } + if( fieldsVerified != null) { + metaDataSizeVerified = fieldsVerified.size(); + dest.writeInt(metaDataSizeVerified); + for (Map.Entry<String, Boolean> entry : fieldsVerified.entrySet()) { + dest.writeString(entry.getKey()); + dest.writeByte((byte) (entry.getValue() ? 1 : 0)); + } + } + } public followAction getFollowType() { return followType; @@ -124,23 +207,38 @@ public class Account implements Parcelable { this.muting_notifications = muting_notifications; } - public void setFields(HashMap<String, String> fields) { + public void setFields(LinkedHashMap<String, String> fields) { this.fields = fields; } - public HashMap<String, String> getFields() { + public LinkedHashMap<String, String> getFields() { return fields; } - public void setFieldsSpan(HashMap<String, SpannableString> fieldsSpan) { + public void setFieldsSpan(LinkedHashMap<SpannableString, SpannableString> fieldsSpan) { this.fieldsSpan = fieldsSpan; } - public HashMap<String, SpannableString> getFieldsSpan() { + public LinkedHashMap<SpannableString, SpannableString> getFieldsSpan() { return fieldsSpan; } + public LinkedHashMap<String, Boolean> getFieldsVerified() { + return fieldsVerified; + } + + public void setFieldsVerified(LinkedHashMap<String, Boolean> fieldsVerified) { + this.fieldsVerified = fieldsVerified; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } public enum followAction{ @@ -153,30 +251,7 @@ public class Account implements Parcelable { } - protected Account(Parcel in) { - id = in.readString(); - username = in.readString(); - acct = in.readString(); - display_name = in.readString(); - locked = in.readByte() != 0; - followers_count = in.readInt(); - following_count = in.readInt(); - statuses_count = in.readInt(); - note = in.readString(); - url = in.readString(); - avatar = in.readString(); - avatar_static = in.readString(); - header = in.readString(); - header_static = in.readString(); - token = in.readString(); - instance = in.readString(); - metaDataSize = in.readInt(); - for(int i = 0; i < metaDataSize; i++){ - String key = in.readString(); - String value = in.readString(); - fields.put(key,value); - } - } + public Account(){ this.account = this; @@ -359,33 +434,7 @@ public class Account implements Parcelable { return 0; } - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(id); - dest.writeString(username); - dest.writeString(acct); - dest.writeString(display_name); - dest.writeByte((byte) (locked ? 1 : 0)); - dest.writeInt(followers_count); - dest.writeInt(following_count); - dest.writeInt(statuses_count); - dest.writeString(note); - dest.writeString(url); - dest.writeString(avatar); - dest.writeString(avatar_static); - dest.writeString(header); - dest.writeString(header_static); - dest.writeString(token); - dest.writeString(instance); - metaDataSize = fields.size(); - dest.writeInt(metaDataSize); - for (Map.Entry<String, String> entry : fields.entrySet()) { - dest.writeString(entry.getKey()); - dest.writeString(entry.getValue()); - } - - } public boolean isFollowing() { return isFollowing; @@ -431,33 +480,34 @@ public class Account implements Parcelable { int startPositionTar = spannableString.toString().indexOf("@"+this.getMoved_to_account().getAcct()); int endPositionTar = startPositionTar + ("@"+this.getMoved_to_account().getAcct()).length(); final String idTar = this.getMoved_to_account().getId(); - spannableString.setSpan(new ClickableSpan() { - @Override - public void onClick(View textView) { - Intent intent = new Intent(context, ShowAccountActivity.class); - Bundle b = new Bundle(); - b.putString("accountId", idTar); - intent.putExtras(b); - context.startActivity(intent); - } - @Override - public void updateDrawState(TextPaint ds) { - super.updateDrawState(ds); - } - }, - startPositionTar, endPositionTar, - Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + if( endPositionTar <= spannableString.toString().length() && endPositionTar >= startPositionTar) + spannableString.setSpan(new ClickableSpan() { + @Override + public void onClick(View textView) { + Intent intent = new Intent(context, ShowAccountActivity.class); + Bundle b = new Bundle(); + b.putString("accountId", idTar); + intent.putExtras(b); + context.startActivity(intent); + } + @Override + public void updateDrawState(TextPaint ds) { + super.updateDrawState(ds); + } + }, + startPositionTar, endPositionTar, + Spanned.SPAN_INCLUSIVE_EXCLUSIVE); } return spannableString; } - - public void makeEmojisAccount(final Context context, final OnRetrieveEmojiAccountInterface listener){ + public void makeEmojisAccountProfile(final Context context, final OnRetrieveEmojiAccountInterface listener){ if( ((Activity)context).isFinishing() ) return; - - noteSpan = account.getNoteSpan(); - + if( fields == null) + fields = new LinkedHashMap<>(); + if( fieldsSpan == null) + fieldsSpan = new LinkedHashMap<>(); if( account.getDisplay_name() != null) displayNameSpan = new SpannableString(account.getDisplay_name()); if( account.getFields() != null && account.getFields().size() > 0) { @@ -470,80 +520,150 @@ public class Account implements Parcelable { else //noinspection deprecation fieldSpan = new SpannableString(Html.fromHtml((String)pair.getValue())); - fieldsSpan.put((String) pair.getKey(), fieldSpan); + fieldsSpan.put(new SpannableString((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) { fields = account.getFields(); - Glide.with(context) - .asBitmap() - .load(emoji.getUrl()) - .into(new SimpleTarget<Bitmap>() { - @Override - public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) { - final String targetedEmoji = ":" + emoji.getShortcode() + ":"; - - if (noteSpan != null && noteSpan.toString().contains(targetedEmoji)) { - //emojis can be used several times so we have to loop - for (int startPosition = -1; (startPosition = noteSpan.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) { - final int endPosition = startPosition + targetedEmoji.length(); - 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); - } - } - 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); + try { + Glide.with(context) + .asBitmap() + .load(emoji.getUrl()) + .into(new SimpleTarget<Bitmap>() { + @Override + public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) { + final String targetedEmoji = ":" + emoji.getShortcode() + ":"; + + if (noteSpan != null && noteSpan.toString().contains(targetedEmoji)) { + //emojis can be used several times so we have to loop + for (int startPosition = -1; (startPosition = noteSpan.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) { + final int endPosition = startPosition + targetedEmoji.length(); + 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 = fieldsSpan.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry pair = (Map.Entry)it.next(); - SpannableString fieldSpan = (SpannableString) pair.getValue(); - if (fieldSpan.toString().contains(targetedEmoji)) { + if (displayNameSpan != null && displayNameSpan.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++) { + for (int startPosition = -1; (startPosition = displayNameSpan.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) { final int endPosition = startPosition + targetedEmoji.length(); - if(endPosition <= fieldSpan.toString().length() && endPosition >= startPosition) - fieldSpan.setSpan( + 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); } - fieldsSpan.put((String)pair.getKey(), fieldSpan); } - } + Iterator it = fieldsSpan.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = (Map.Entry) it.next(); + SpannableString fieldSpan = (SpannableString) pair.getValue(); + SpannableString keySpan = (SpannableString) pair.getKey(); + 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++) { + final int endPosition = startPosition + targetedEmoji.length(); + if (endPosition <= fieldSpan.toString().length() && endPosition >= startPosition) + fieldSpan.setSpan( + new ImageSpan(context, + Bitmap.createScaledBitmap(resource, (int) Helper.convertDpToPixel(20, context), + (int) Helper.convertDpToPixel(20, context), false)), startPosition, + endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } + fieldsSpan.put((SpannableString) pair.getKey(), fieldSpan); + }else + fieldsSpan.put(keySpan, fieldSpan); + } - i[0]++; - if( i[0] == (emojis.size())) { - if( noteSpan != null) - account.setNoteSpan(noteSpan); - account.setFieldsSpan(fieldsSpan); - if( listener != null) - listener.onRetrieveEmojiAccount(account); + i[0]++; + if (i[0] == (emojis.size())) { + if (noteSpan != null) + account.setNoteSpan(noteSpan); + account.setFieldsSpan(fieldsSpan); + if (listener != null) + listener.onRetrieveEmojiAccount(account); + } } - } - }); + }); + }catch (Exception ignored){} } } } + public void makeEmojisAccount(final Context context, final OnRetrieveEmojiAccountInterface listener, Account account){ + if( ((Activity)context).isFinishing() ) + return; + + fields = new LinkedHashMap<>(); + fieldsVerified = new LinkedHashMap<>(); + fieldsSpan = new LinkedHashMap<>(); + noteSpan = account.getNoteSpan(); + 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(new SpannableString((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) { + fields = account.getFields(); + try { + Glide.with(context) + .asBitmap() + .load(emoji.getUrl()) + .into(new SimpleTarget<Bitmap>() { + @Override + public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) { + final String targetedEmoji = ":" + emoji.getShortcode() + ":"; + 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); + } + } + i[0]++; + if (i[0] == (emojis.size())) { + if (noteSpan != null) + account.setNoteSpan(noteSpan); + if (listener != null) + listener.onRetrieveEmojiAccount(account); + } + } + }); + }catch (Exception ignored){} + + } + } + } + } |