From 4938f82dcedc23c3b2194e1eb7e30deb5c85fe15 Mon Sep 17 00:00:00 2001 From: stom79 Date: Wed, 24 Oct 2018 18:29:12 +0200 Subject: Prepares release 1.17.6 --- app/build.gradle | 2 +- .../etalab/mastodon/client/Entities/Account.java | 158 ++++++++++++++++++--- 2 files changed, 142 insertions(+), 18 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 80e7097fb..1eebf90f4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,7 +7,7 @@ android { applicationId "fr.gouv.etalab.mastodon" minSdkVersion 15 targetSdkVersion 28 - versionCode 162 + versionCode 163 versionName "1.17.6" } flavorDimensions "default" 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 ff98cbb29..5ab1f8473 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 @@ -18,10 +18,12 @@ import android.app.Activity; import android.content.*; import android.content.Context; import android.graphics.Bitmap; +import android.os.Build; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; +import android.text.Html; import android.text.Spannable; import android.text.SpannableString; import android.text.Spanned; @@ -45,6 +47,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.support.v4.text.HtmlCompat.FROM_HTML_MODE_LEGACY; + /** * Created by Thomas on 23/04/2017. @@ -479,13 +483,127 @@ public class Account implements Parcelable { return spannableString; } - public void makeEmojisAccount(final Context context, final OnRetrieveEmojiAccountInterface listener){ if( ((Activity)context).isFinishing() ) return; 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 = 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() { + @Override + public void onResourceReady(@NonNull Bitmap resource, Transition 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); + } + } + 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); + /*if (keySpan.toString().contains(targetedEmoji)) { + //emojis can be used several times so we have to loop + for (int startPosition = -1; (startPosition = keySpan.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) { + final int endPosition = startPosition + targetedEmoji.length(); + if (endPosition <= keySpan.toString().length() && endPosition >= startPosition) + keySpan.setSpan( + new ImageSpan(context, + Bitmap.createScaledBitmap(resource, (int) Helper.convertDpToPixel(20, context), + (int) Helper.convertDpToPixel(20, context), false)), startPosition, + endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } + + SpannableString obj = fieldsSpan.remove(pair.getKey()); + fieldsSpan.put(keySpan, obj); + }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); + } + } + }); + }catch (Exception ignored){} + + } + } + } + + + /*public void makeEmojisAccount(final Context context, final OnRetrieveEmojiAccountInterface listener){ + if( ((Activity)context).isFinishing() ) + return; + + noteSpan = account.getNoteSpan(); + if( account.getDisplay_name() != null) displayNameSpan = new SpannableString(account.getDisplay_name()); final List emojis = account.getEmojis(); @@ -493,6 +611,7 @@ public class Account implements Parcelable { final int[] i = {0}; for (final Emojis emoji : emojis) { fields = account.getFields(); + Log.v(Helper.TAG,"emoji: " + emoji.getShortcode()); try { Glide.with(context) .asBitmap() @@ -501,7 +620,7 @@ public class Account implements Parcelable { @Override public void onResourceReady(@NonNull Bitmap resource, Transition transition) { final String targetedEmoji = ":" + emoji.getShortcode() + ":"; - + Log.v(Helper.TAG,"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++) { @@ -530,7 +649,11 @@ public class Account implements Parcelable { while (it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); SpannableString fieldSpan = new SpannableString((String)pair.getValue()); + SpannableString keySpan = new SpannableString((String)pair.getKey()); + + if (fieldSpan.toString().contains(targetedEmoji)) { + Log.v(Helper.TAG,"fieldSpan: " + fieldSpan.toString()); //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(); @@ -541,22 +664,23 @@ public class Account implements Parcelable { (int) Helper.convertDpToPixel(20, context), false)), startPosition, endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); } - SpannableString keySpan = new SpannableString((String)pair.getKey()); - if (keySpan.toString().contains(targetedEmoji)) { - //emojis can be used several times so we have to loop - for (int startPosition = -1; (startPosition = keySpan.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) { - final int endPosition = startPosition + targetedEmoji.length(); - if (endPosition <= keySpan.toString().length() && endPosition >= startPosition) - keySpan.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 (keySpan.toString().contains(targetedEmoji)) { + Log.v(Helper.TAG,"keySpan: " + keySpan.toString()); + //emojis can be used several times so we have to loop + for (int startPosition = -1; (startPosition = keySpan.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) { + final int endPosition = startPosition + targetedEmoji.length(); + if (endPosition <= keySpan.toString().length() && endPosition >= startPosition) + keySpan.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(keySpan, fieldSpan); + } + fieldsSpan.put(keySpan, fieldSpan); + } @@ -574,7 +698,7 @@ public class Account implements Parcelable { } } - } + }*/ } -- cgit v1.2.3