summaryrefslogtreecommitdiffstats
path: root/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Account.java
diff options
context:
space:
mode:
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.java384
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){}
+
+ }
+ }
+ }
+
}