From fd9cddc607b295ab6017350b539e1a43009d2d3a Mon Sep 17 00:00:00 2001 From: stom79 Date: Wed, 2 Jan 2019 14:22:57 +0100 Subject: [PATCH] Fix emoji in notifications --- .../mastodon/activities/BaseMainActivity.java | 4 + .../mastodon/activities/TootActivity.java | 6 + .../client/Entities/Notification.java | 117 ++++++++++++++++++ .../drawers/NotificationsListAdapter.java | 23 ++-- .../mastodon/drawers/StatusListAdapter.java | 6 + .../interfaces/OnRetrieveEmojiInterface.java | 4 +- 6 files changed, 146 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java index 75228fa42..b72ba7aa7 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/BaseMainActivity.java @@ -790,6 +790,10 @@ public abstract class BaseMainActivity extends BaseActivity if( display_direct) { tabLayout.addTab(tabDirect); tabPosition.put("direct",i); + + userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); + instance = sharedpreferences.getString(Helper.PREF_INSTANCE, Helper.getLiveInstance(getApplicationContext())); + String instanceVersion = sharedpreferences.getString(Helper.INSTANCE_VERSION + userId + instance, null); if (instanceVersion != null) { Version currentVersion = new Version(instanceVersion); diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java index 0e48925b9..f32f2ea05 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/TootActivity.java @@ -114,6 +114,7 @@ import fr.gouv.etalab.mastodon.client.Entities.Attachment; import fr.gouv.etalab.mastodon.client.Entities.Emojis; import fr.gouv.etalab.mastodon.client.Entities.Error; import fr.gouv.etalab.mastodon.client.Entities.Mention; +import fr.gouv.etalab.mastodon.client.Entities.Notification; import fr.gouv.etalab.mastodon.client.Entities.Results; import fr.gouv.etalab.mastodon.client.Entities.Status; import fr.gouv.etalab.mastodon.client.Entities.StoredStatus; @@ -1761,6 +1762,11 @@ public class TootActivity extends BaseActivity implements OnRetrieveSearcAccount } + @Override + public void onRetrieveEmoji(Notification notification) { + + } + @Override public void onRetrieveSearchEmoji(final List emojis) { if( pp_progress != null && pp_actionBar != null) { diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Notification.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Notification.java index 9a65a0b12..e378b2c10 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Notification.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Notification.java @@ -15,10 +15,30 @@ package fr.gouv.etalab.mastodon.client.Entities; +import android.app.Activity; +import android.content.Context; +import android.graphics.Bitmap; import android.os.Parcel; import android.os.Parcelable; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.style.ImageSpan; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.DataSource; +import com.bumptech.glide.load.engine.GlideException; +import com.bumptech.glide.request.RequestListener; +import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.request.target.Target; +import com.bumptech.glide.request.transition.Transition; import java.util.Date; +import java.util.List; + +import fr.gouv.etalab.mastodon.helper.Helper; +import fr.gouv.etalab.mastodon.interfaces.OnRetrieveEmojiInterface; /** * Created by Thomas on 23/04/2017. @@ -110,4 +130,101 @@ public class Notification implements Parcelable { public boolean equals(Object otherNotifications) { return otherNotifications != null && (otherNotifications == this || otherNotifications instanceof Notification && this.getId().equals(((Notification) otherNotifications).getId())); } + + + public static void makeEmojis(final Context context, final OnRetrieveEmojiInterface listener, Notification notification){ + + if( ((Activity)context).isFinishing() ) + return; + Status status = notification.getStatus(); + if (status == null) + return; + if( status.getReblog() == null && status.getEmojis() == null) + return; + final java.util.List emojis = status.getReblog() != null ? status.getReblog().getEmojis() : status.getEmojis(); + final List emojisAccounts = status.getReblog() != null ?status.getReblog().getAccount().getEmojis():status.getAccount().getEmojis(); + + status.getAccount().makeAccountNameEmoji(context, null, status.getAccount()); + + // SpannableString displayNameSpan = status.getDisplayNameSpan(); + SpannableString contentSpan = status.getContentSpan(); + SpannableString contentSpanCW = status.getContentSpanCW(); + if( emojisAccounts != null) + emojis.addAll(emojisAccounts); + if( emojis != null && emojis.size() > 0 ) { + final int[] i = {0}; + for (final Emojis emoji : emojis) { + Glide.with(context) + .asBitmap() + .load(emoji.getUrl()) + .listener(new RequestListener() { + @Override + public boolean onResourceReady(Bitmap resource, Object model, Target 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())) { + listener.onRetrieveEmoji(status,false); + } + return false; + } + }) + .into(new SimpleTarget() { + @Override + public void onResourceReady(@NonNull Bitmap resource, Transition transition) { + final String targetedEmoji = ":" + emoji.getShortcode() + ":"; + if (contentSpan != null && contentSpan.toString().contains(targetedEmoji)) { + //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( endPosition <= contentSpan.toString().length() && endPosition >= startPosition) + contentSpan.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); + } + } + status.setDisplayNameSpan(displayNameSpan);*/ + if (contentSpanCW != null && 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( endPosition <= contentSpan.toString().length() && endPosition >= startPosition) + contentSpanCW.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())) { + status.setContentSpan(contentSpan); + status.setContentSpanCW(contentSpanCW); + status.setEmojiFound(true); + listener.onRetrieveEmoji(notification); + } + } + }); + + } + } + } + } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java index 708a64ed0..cbbda4338 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/NotificationsListAdapter.java @@ -34,6 +34,7 @@ import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; import android.text.Html; import android.text.method.LinkMovementMethod; +import android.util.Log; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.MenuItem; @@ -341,7 +342,7 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On if( !status.isClickable()) Status.transform(context, status); if( !status.isEmojiFound()) - Status.makeEmojis(context, NotificationsListAdapter.this, status); + Notification.makeEmojis(context, NotificationsListAdapter.this, notification); holder.notification_status_content.setText(status.getContentSpan(), TextView.BufferType.SPANNABLE); holder.status_spoiler.setText(status.getContentSpanCW(), TextView.BufferType.SPANNABLE); holder.status_spoiler.setMovementMethod(LinkMovementMethod.getInstance()); @@ -1089,18 +1090,16 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On @Override public void onRetrieveEmoji(Status status, boolean fromTranslation) { - if( !status.isEmojiFound()) { - for (int i = 0; i < notificationsListAdapter.getItemCount(); i++) { - if (notificationsListAdapter.getItemAt(i) != null && notificationsListAdapter.getItemAt(i).getStatus() != null && notificationsListAdapter.getItemAt(i).getStatus().getId().equals(status.getId())) { - if( notificationsListAdapter.getItemAt(i).getStatus() != null) { - notificationsListAdapter.getItemAt(i).getStatus().setEmojiFound(true); - try { - notificationsListAdapter.notifyItemChanged(i); - }catch (Exception ignored){} - } - } - } + } + + @Override + public void onRetrieveEmoji(Notification notification) { + Log.v(Helper.TAG,"notification: " + notification); + if( notification != null && notification.getStatus() != null) { + Log.v(Helper.TAG,"getContent: " + notification.getStatus().getContent()); + notification.getStatus().setEmojiFound(true); + notifyNotificationChanged(notification); } } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java index 67df9eda6..4cc1429f4 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java @@ -109,6 +109,7 @@ import fr.gouv.etalab.mastodon.client.Entities.Attachment; import fr.gouv.etalab.mastodon.client.Entities.Card; import fr.gouv.etalab.mastodon.client.Entities.Emojis; import fr.gouv.etalab.mastodon.client.Entities.Error; +import fr.gouv.etalab.mastodon.client.Entities.Notification; import fr.gouv.etalab.mastodon.client.Entities.Status; import fr.gouv.etalab.mastodon.client.Entities.TagTimeline; import fr.gouv.etalab.mastodon.client.Glide.GlideApp; @@ -2609,6 +2610,11 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } } + @Override + public void onRetrieveEmoji(Notification notification) { + + } + @Override public void onRetrieveSearchEmoji(List emojis) { diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnRetrieveEmojiInterface.java b/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnRetrieveEmojiInterface.java index 43469eb9e..b25ac1b43 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnRetrieveEmojiInterface.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/interfaces/OnRetrieveEmojiInterface.java @@ -14,11 +14,10 @@ * see . */ package fr.gouv.etalab.mastodon.interfaces; -import android.text.SpannableString; - import java.util.List; import fr.gouv.etalab.mastodon.client.Entities.Emojis; +import fr.gouv.etalab.mastodon.client.Entities.Notification; import fr.gouv.etalab.mastodon.client.Entities.Status; @@ -28,5 +27,6 @@ import fr.gouv.etalab.mastodon.client.Entities.Status; */ public interface OnRetrieveEmojiInterface { void onRetrieveEmoji(Status status, boolean fromTranslation); + void onRetrieveEmoji(Notification notification); void onRetrieveSearchEmoji(List emojis); }