Fixes issue with custom emoji from other instances

This commit is contained in:
stom79 2017-11-19 16:08:34 +01:00
parent 9961e31335
commit 78605a6568
6 changed files with 106 additions and 67 deletions

View File

@ -1507,7 +1507,7 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
}
@Override
public void onRetrieveEmoji(int position, SpannableString spannableString, Boolean error) {
public void onRetrieveEmoji(Status status, SpannableString spannableString, Boolean error) {
}

View File

@ -264,11 +264,14 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On
if (content.endsWith("<br/><br/>"))
content = content.substring(0, content.length() - 10);
}
SpannableString spannableString = Helper.clickableElements(context, content,
status, true, NotificationsListAdapter.this);
/*SpannableString spannableString = Helper.clickableElements(context, content,
status.getReblog() != null ? status.getReblog().getMentions() : status.getMentions(),
status.getReblog() != null ? status.getReblog().getEmojis() : status.getEmojis(),
position,
true, NotificationsListAdapter.this);
true, NotificationsListAdapter.this);*/
holder.notification_status_content.setText(spannableString, TextView.BufferType.SPANNABLE);
}
@ -693,6 +696,13 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On
}
private Notification getItemAt(int position){
if( notifications.size() > position)
return notifications.get(position);
else
return null;
}
/**
* Display a validation message for notification deletion
* @param notification Notification
@ -892,12 +902,20 @@ public class NotificationsListAdapter extends RecyclerView.Adapter implements On
holder.status_show_more.setVisibility(View.GONE);
}
@Override
public void onRetrieveEmoji(int position, SpannableString spannableString, Boolean error) {
notifications.get(position).getStatus().setContents(spannableString);
if( !notifications.get(position).getStatus().isEmojiFound()) {
notifications.get(position).getStatus().setEmojiFound(true);
notificationsListAdapter.notifyDataSetChanged();
public void onRetrieveEmoji(Status status, SpannableString spannableString, Boolean error) {
status.setContents(spannableString);
if( !status.isEmojiFound()) {
for (int i = 0; i < notificationsListAdapter.getItemCount(); i++) {
if (notificationsListAdapter.getItemAt(i) != null && notificationsListAdapter.getItemAt(i).getId().equals(status.getId())) {
if( notificationsListAdapter.getItemAt(i).getStatus() != null) {
notificationsListAdapter.getItemAt(i).getStatus().setEmojiFound(true);
notificationsListAdapter.notifyItemChanged(i);
}
}
}
}
}

View File

@ -84,6 +84,7 @@ import fr.gouv.etalab.mastodon.client.APIResponse;
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.Notification;
import fr.gouv.etalab.mastodon.client.Entities.Status;
import fr.gouv.etalab.mastodon.translation.Translate;
import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader;
@ -158,6 +159,13 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
return statuses.size();
}
private Status getItemAt(int position){
if( statuses.size() > position)
return statuses.get(position);
else
return null;
}
@Override
public void onRetrieveReplies(int position, APIResponse apiResponse) {
if( apiResponse.getError() != null || apiResponse.getStatuses() == null || apiResponse.getStatuses().size() == 0){
@ -534,10 +542,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
if( status.getContent_translated() != null && status.getContent_translated().length() > 0){
holder.status_content_translated.setMovementMethod(null);
SpannableString spannableStringTrans = Helper.clickableElements(context,status.getContent_translated(),
status.getReblog() != null?status.getReblog().getMentions():status.getMentions(),
status.getReblog() != null?status.getReblog().getEmojis():status.getEmojis(),
position,
SpannableString spannableStringTrans = Helper.clickableElements(context,status.getContent_translated(), status,
true, StatusListAdapter.this);
holder.status_content_translated.setText(spannableStringTrans, TextView.BufferType.SPANNABLE);
holder.status_content_translated.setOnLongClickListener(new View.OnLongClickListener() {
@ -559,10 +564,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
content = content.substring(0,content.length() -10);
holder.status_content.setMovementMethod(null);
final SpannableString spannableString = Helper.clickableElements(context,content,
status.getReblog() != null?status.getReblog().getMentions():status.getMentions(),
status.getReblog() != null?status.getReblog().getEmojis():status.getEmojis(),
position,
true, StatusListAdapter.this);
status, true, StatusListAdapter.this);
holder.status_content.setText(spannableString, TextView.BufferType.SPANNABLE);
}
holder.status_content.setOnLongClickListener(new View.OnLongClickListener() {
@ -1366,11 +1368,18 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
@Override
public void onRetrieveEmoji(int position, SpannableString spannableString, Boolean error) {
statuses.get(position).setContents(spannableString);
if( !statuses.get(position).isEmojiFound()) {
statuses.get(position).setEmojiFound(true);
statusListAdapter.notifyDataSetChanged();
public void onRetrieveEmoji(Status status, SpannableString spannableString, Boolean error) {
status.setContents(spannableString);
if( !status.isEmojiFound()) {
for (int i = 0; i < statusListAdapter.getItemCount(); i++) {
if (statusListAdapter.getItemAt(i) != null && statusListAdapter.getItemAt(i).getId().equals(status.getId())) {
if( statusListAdapter.getItemAt(i) != null) {
statusListAdapter.getItemAt(i).setEmojiFound(true);
statusListAdapter.notifyItemChanged(i);
}
}
}
}
}

View File

@ -1168,11 +1168,13 @@ public class Helper {
* Click on tag => HashTagActivity
* @param context Context
* @param fullContent String, should be the st
* @param mentions List<Mention>
* @param status Status
* @return TextView
*/
@SuppressWarnings("SameParameterValue")
public static SpannableString clickableElements(final Context context, String fullContent, List<Mention> mentions, final List<Emojis> emojis, final int position, boolean useHTML, final OnRetrieveEmojiInterface listener) {
public static SpannableString clickableElements(final Context context, String fullContent, final Status status, boolean useHTML, final OnRetrieveEmojiInterface listener) {
List<Mention> mentions = status.getReblog() != null ? status.getReblog().getMentions() : status.getMentions();
final List<Emojis> emojis = status.getReblog() != null ? status.getReblog().getEmojis() : status.getEmojis();
final SpannableString spannableString;
SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
if( useHTML) {
@ -1230,37 +1232,44 @@ public class Helper {
.cacheOnDisk(true).resetViewBeforeLoading(true).build();
imageLoader = ImageLoader.getInstance();
for (final Emojis emoji : emojis) {
if( instance != null && emoji.getUrl().contains(instance))
storeEmoji(context, db, emoji);
NonViewAware imageAware = new NonViewAware(new ImageSize(50, 50), ViewScaleType.CROP);
imageLoader.displayImage(emoji.getUrl(), imageAware, options, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
super.onLoadingComplete(imageUri, view, loadedImage);
final String targetedEmoji = ":" + emoji.getShortcode() + ":";
if (spannableString.toString().contains(targetedEmoji)) {
//emojis can be used several times so we have to loop
for (int startPosition = -1; (startPosition = spannableString.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) {
final int endPosition = startPosition + targetedEmoji.length();
spannableString.setSpan(
new ImageSpan(context,
Bitmap.createScaledBitmap(loadedImage, (int) Helper.convertDpToPixel(20, context),
(int) Helper.convertDpToPixel(20, context), false)), startPosition,
endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
}
}
i[0]++;
if( i[0] == (emojis.size()))
listener.onRetrieveEmoji(position, spannableString, false);
boolean sameInstance;
if( instance != null) {
if (status.getReblog() == null)
sameInstance = status.getUri().contains(instance);
else
sameInstance = status.getReblog().getUri().contains(instance);
if (sameInstance)
storeEmoji(context, db, emoji);
}
NonViewAware imageAware = new NonViewAware(new ImageSize(50, 50), ViewScaleType.CROP);
imageLoader.displayImage(emoji.getUrl(), imageAware, options, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
super.onLoadingComplete(imageUri, view, loadedImage);
final String targetedEmoji = ":" + emoji.getShortcode() + ":";
if (spannableString.toString().contains(targetedEmoji)) {
//emojis can be used several times so we have to loop
for (int startPosition = -1; (startPosition = spannableString.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) {
final int endPosition = startPosition + targetedEmoji.length();
spannableString.setSpan(
new ImageSpan(context,
Bitmap.createScaledBitmap(loadedImage, (int) Helper.convertDpToPixel(20, context),
(int) Helper.convertDpToPixel(20, context), false)), startPosition,
endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
}
@Override
public void onLoadingFailed(java.lang.String imageUri, android.view.View view, FailReason failReason) {
i[0]++;
if( i[0] == (emojis.size()))
listener.onRetrieveEmoji(position, spannableString, false);
}
});
}
i[0]++;
if( i[0] == (emojis.size()))
listener.onRetrieveEmoji(status, spannableString, false);
}
@Override
public void onLoadingFailed(java.lang.String imageUri, android.view.View view, FailReason failReason) {
i[0]++;
if( i[0] == (emojis.size()))
listener.onRetrieveEmoji(status, spannableString, false);
}
});
}
@ -1277,19 +1286,19 @@ public class Helper {
for(int startPosition = -1 ; (startPosition = spannableString.toString().indexOf(targetedAccount, startPosition + 1)) != -1 ; startPosition++){
int endPosition = startPosition + targetedAccount.length();
spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View textView) {
Intent intent = new Intent(context, ShowAccountActivity.class);
Bundle b = new Bundle();
b.putString("accountId", mention.getId());
intent.putExtras(b);
context.startActivity(intent);
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
}
},
@Override
public void onClick(View textView) {
Intent intent = new Intent(context, ShowAccountActivity.class);
Bundle b = new Bundle();
b.putString("accountId", mention.getId());
intent.putExtras(b);
context.startActivity(intent);
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
}
},
startPosition, endPosition,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
}
@ -1421,7 +1430,7 @@ public class Helper {
try {
String[] val = search.split("@");
if( val.length > 0 ) {
String username, instance;
String username;
if( val.length == 2){
username = val[1];
Pattern urlAccountPattern = Pattern.compile(

View File

@ -19,6 +19,7 @@ import android.text.SpannableString;
import java.util.List;
import fr.gouv.etalab.mastodon.client.Entities.Emojis;
import fr.gouv.etalab.mastodon.client.Entities.Status;
/**
@ -26,6 +27,6 @@ import fr.gouv.etalab.mastodon.client.Entities.Emojis;
* Interface when retrieving emojis
*/
public interface OnRetrieveEmojiInterface {
void onRetrieveEmoji(int position, SpannableString spannableString, Boolean error);
void onRetrieveEmoji(Status status, SpannableString spannableString, Boolean error);
void onRetrieveSearchEmoji(List<Emojis> emojis);
}

View File

@ -26,7 +26,7 @@ import android.database.sqlite.SQLiteOpenHelper;
@SuppressWarnings("WeakerAccess")
public class Sqlite extends SQLiteOpenHelper {
public static final int DB_VERSION = 5;
public static final int DB_VERSION = 6;
public static final String DB_NAME = "mastodon_etalab_db";
public static SQLiteDatabase db;
private static Sqlite sInstance;
@ -130,6 +130,8 @@ public class Sqlite extends SQLiteOpenHelper {
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_SHORTCODE + " TEXT NOT NULL, " + COL_INSTANCE + " TEXT NOT NULL, "
+ COL_URL + " TEXT NOT NULL, " + COL_URL_STATIC + " TEXT NOT NULL, " + COL_DATE_CREATION + " TEXT NOT NULL)");
case 5:
db.execSQL("delete from "+ TABLE_CUSTOM_EMOJI); //Reset table due to bugs
default:
break;
}