Fix animated emoji in picker

This commit is contained in:
tom79 2019-08-23 15:31:22 +02:00
parent a775133c0e
commit 31225c092d
2 changed files with 84 additions and 43 deletions

View File

@ -15,6 +15,7 @@
package app.fedilab.android.client.Entities; package app.fedilab.android.client.Entities;
import android.graphics.drawable.Drawable;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
@ -28,6 +29,8 @@ public class Emojis implements Parcelable {
private String static_url; private String static_url;
private String url; private String url;
private boolean visible_in_picker; private boolean visible_in_picker;
private Drawable drawable;
private boolean drawableFound;
public Emojis(){} public Emojis(){}
@ -94,4 +97,20 @@ public class Emojis implements Parcelable {
return new Emojis[size]; return new Emojis[size];
} }
}; };
public Drawable getDrawable() {
return drawable;
}
public void setDrawable(Drawable drawable) {
this.drawable = drawable;
}
public boolean isDrawableFound() {
return drawableFound;
}
public void setDrawableFound(boolean drawableFound) {
this.drawableFound = drawableFound;
}
} }

View File

@ -20,37 +20,33 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.text.Spannable; import android.os.AsyncTask;
import android.text.style.ImageSpan; import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ImageView; import android.widget.ImageView;
import com.bumptech.glide.Glide; 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.SimpleTarget;
import com.bumptech.glide.request.target.Target;
import com.bumptech.glide.request.transition.Transition; import com.bumptech.glide.request.transition.Transition;
import com.github.penfeizhou.animation.apng.APNGDrawable; import com.github.penfeizhou.animation.apng.APNGDrawable;
import com.github.penfeizhou.animation.apng.decode.APNGParser;
import com.github.penfeizhou.animation.gif.GifDrawable; import com.github.penfeizhou.animation.gif.GifDrawable;
import com.github.penfeizhou.animation.gif.decode.GifParser; import com.github.penfeizhou.animation.gif.decode.GifParser;
import java.io.File; import java.io.File;
import java.lang.ref.WeakReference;
import java.util.List; import java.util.List;
import app.fedilab.android.R; import app.fedilab.android.R;
import app.fedilab.android.client.Entities.Emojis; import app.fedilab.android.client.Entities.Emojis;
import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.Helper;
import static app.fedilab.android.helper.Helper.drawableToBitmap;
/** /**
* Created by Thomas on 03/11/2017. * Created by Thomas on 03/11/2017.
@ -95,44 +91,70 @@ public class CustomEmojiAdapter extends ArrayAdapter<Emojis> {
imageView = (ImageView) convertView; imageView = (ImageView) convertView;
} }
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
boolean disableAnimatedEmoji = sharedpreferences.getBoolean(Helper.SET_DISABLE_ANIMATED_EMOJI, false);
Glide.with(context)
.asFile()
.load(emoji.getUrl())
.listener(new RequestListener<File>() {
@Override
public boolean onResourceReady(File resource, Object model, Target<File> target, DataSource dataSource, boolean isFirstResource) {
return false;
}
@Override if( !emoji.isDrawableFound() ) {
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { emoji.setDrawableFound(true);
return false; Glide.with(context)
} .asFile()
}) .load(emoji.getUrl())
.into(new SimpleTarget<File>() { .thumbnail(0.1f)
@Override .into(new SimpleTarget<File>() {
public void onResourceReady(@NonNull File resourceFile, @Nullable Transition<? super File> transition) { @Override
Drawable resource; public void onResourceReady(@NonNull File resourceFile, @Nullable Transition<? super File> transition) {
if(GifParser.isGif(resourceFile.getAbsolutePath())){ new transform(context, emoji,resourceFile, imageView).execute();
resource = GifDrawable.fromFile(resourceFile.getAbsolutePath());
}else{
resource = APNGDrawable.fromFile(resourceFile.getAbsolutePath());
} }
});
if( !disableAnimatedEmoji) { }else{
resource.setVisible(true, true); imageView.setImageDrawable(emoji.getDrawable());
imageView.setImageDrawable(resource); }
}else{
Bitmap bitmap = drawableToBitmap(resource.getCurrent());
imageView.setImageBitmap(bitmap);
}
}
});
return convertView; return convertView;
} }
private static class transform extends AsyncTask<Void, Void, Drawable> {
private WeakReference<Context> contextWeakReference;
private File resourceFile;
private Emojis emoji;
private WeakReference<ImageView> imageViewWeakReference;
transform(Context context, Emojis emoji, File resource, ImageView imageView) {
this.contextWeakReference = new WeakReference<>(context);
this.resourceFile = resource;
this.emoji = emoji;
this.imageViewWeakReference = new WeakReference<>(imageView);
}
@Override
protected Drawable doInBackground(Void... params) {
Drawable resource;
SharedPreferences sharedpreferences = contextWeakReference.get().getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
boolean disableAnimatedEmoji = sharedpreferences.getBoolean(Helper.SET_DISABLE_ANIMATED_EMOJI, false);
if( !disableAnimatedEmoji) {
if (GifParser.isGif(resourceFile.getAbsolutePath())) {
resource = GifDrawable.fromFile(resourceFile.getAbsolutePath());
emoji.setDrawable(resource);
} else if (APNGParser.isAPNG(resourceFile.getAbsolutePath())) {
resource = APNGDrawable.fromFile(resourceFile.getAbsolutePath());
emoji.setDrawable(resource);
} else {
resource = Drawable.createFromPath(resourceFile.getAbsolutePath());
emoji.setDrawable(resource);
}
}else{
resource = Drawable.createFromPath(resourceFile.getAbsolutePath());
emoji.setDrawable(resource);
}
return resource;
}
@Override
protected void onPostExecute(Drawable result) {
imageViewWeakReference.get().setImageDrawable(result);
}
}
} }