Fix emoji in notifications

This commit is contained in:
stom79 2019-01-02 14:22:57 +01:00
parent 005ad3363c
commit fd9cddc607
6 changed files with 146 additions and 14 deletions

View File

@ -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);

View File

@ -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> emojis) {
if( pp_progress != null && pp_actionBar != null) {

View File

@ -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> emojis = status.getReblog() != null ? status.getReblog().getEmojis() : status.getEmojis();
final List<Emojis> 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<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())) {
listener.onRetrieveEmoji(status,false);
}
return false;
}
})
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> 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);
}
}
});
}
}
}
}

View File

@ -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);
}
}

View File

@ -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> emojis) {

View File

@ -14,11 +14,10 @@
* see <http://www.gnu.org/licenses>. */
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> emojis);
}