Fix emoji in notifications
This commit is contained in:
parent
005ad3363c
commit
fd9cddc607
|
@ -790,6 +790,10 @@ public abstract class BaseMainActivity extends BaseActivity
|
||||||
if( display_direct) {
|
if( display_direct) {
|
||||||
tabLayout.addTab(tabDirect);
|
tabLayout.addTab(tabDirect);
|
||||||
tabPosition.put("direct",i);
|
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);
|
String instanceVersion = sharedpreferences.getString(Helper.INSTANCE_VERSION + userId + instance, null);
|
||||||
if (instanceVersion != null) {
|
if (instanceVersion != null) {
|
||||||
Version currentVersion = new Version(instanceVersion);
|
Version currentVersion = new Version(instanceVersion);
|
||||||
|
|
|
@ -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.Emojis;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Error;
|
import fr.gouv.etalab.mastodon.client.Entities.Error;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Mention;
|
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.Results;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Status;
|
import fr.gouv.etalab.mastodon.client.Entities.Status;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.StoredStatus;
|
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
|
@Override
|
||||||
public void onRetrieveSearchEmoji(final List<Emojis> emojis) {
|
public void onRetrieveSearchEmoji(final List<Emojis> emojis) {
|
||||||
if( pp_progress != null && pp_actionBar != null) {
|
if( pp_progress != null && pp_actionBar != null) {
|
||||||
|
|
|
@ -15,10 +15,30 @@
|
||||||
package fr.gouv.etalab.mastodon.client.Entities;
|
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.Parcel;
|
||||||
import android.os.Parcelable;
|
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.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.
|
* Created by Thomas on 23/04/2017.
|
||||||
|
@ -110,4 +130,101 @@ public class Notification implements Parcelable {
|
||||||
public boolean equals(Object otherNotifications) {
|
public boolean equals(Object otherNotifications) {
|
||||||
return otherNotifications != null && (otherNotifications == this || otherNotifications instanceof Notification && this.getId().equals(((Notification) otherNotifications).getId()));
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ import android.support.v7.widget.PopupMenu;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.text.Html;
|
import android.text.Html;
|
||||||
import android.text.method.LinkMovementMethod;
|
import android.text.method.LinkMovementMethod;
|
||||||
|
import android.util.Log;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
@ -341,7 +342,7 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On
|
||||||
if( !status.isClickable())
|
if( !status.isClickable())
|
||||||
Status.transform(context, status);
|
Status.transform(context, status);
|
||||||
if( !status.isEmojiFound())
|
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.notification_status_content.setText(status.getContentSpan(), TextView.BufferType.SPANNABLE);
|
||||||
holder.status_spoiler.setText(status.getContentSpanCW(), TextView.BufferType.SPANNABLE);
|
holder.status_spoiler.setText(status.getContentSpanCW(), TextView.BufferType.SPANNABLE);
|
||||||
holder.status_spoiler.setMovementMethod(LinkMovementMethod.getInstance());
|
holder.status_spoiler.setMovementMethod(LinkMovementMethod.getInstance());
|
||||||
|
@ -1089,18 +1090,16 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onRetrieveEmoji(Status status, boolean fromTranslation) {
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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.Card;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Emojis;
|
import fr.gouv.etalab.mastodon.client.Entities.Emojis;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Error;
|
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.Status;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.TagTimeline;
|
import fr.gouv.etalab.mastodon.client.Entities.TagTimeline;
|
||||||
import fr.gouv.etalab.mastodon.client.Glide.GlideApp;
|
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
|
@Override
|
||||||
public void onRetrieveSearchEmoji(List<Emojis> emojis) {
|
public void onRetrieveSearchEmoji(List<Emojis> emojis) {
|
||||||
|
|
||||||
|
|
|
@ -14,11 +14,10 @@
|
||||||
* see <http://www.gnu.org/licenses>. */
|
* see <http://www.gnu.org/licenses>. */
|
||||||
package fr.gouv.etalab.mastodon.interfaces;
|
package fr.gouv.etalab.mastodon.interfaces;
|
||||||
|
|
||||||
import android.text.SpannableString;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Emojis;
|
import fr.gouv.etalab.mastodon.client.Entities.Emojis;
|
||||||
|
import fr.gouv.etalab.mastodon.client.Entities.Notification;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Status;
|
import fr.gouv.etalab.mastodon.client.Entities.Status;
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,5 +27,6 @@ import fr.gouv.etalab.mastodon.client.Entities.Status;
|
||||||
*/
|
*/
|
||||||
public interface OnRetrieveEmojiInterface {
|
public interface OnRetrieveEmojiInterface {
|
||||||
void onRetrieveEmoji(Status status, boolean fromTranslation);
|
void onRetrieveEmoji(Status status, boolean fromTranslation);
|
||||||
|
void onRetrieveEmoji(Notification notification);
|
||||||
void onRetrieveSearchEmoji(List<Emojis> emojis);
|
void onRetrieveSearchEmoji(List<Emojis> emojis);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue