From 31225c092d88f8d49ec41d375ca225c124fd925d Mon Sep 17 00:00:00 2001 From: tom79 Date: Fri, 23 Aug 2019 15:31:22 +0200 Subject: [PATCH] Fix animated emoji in picker --- .../android/client/Entities/Emojis.java | 19 +++ .../android/drawers/CustomEmojiAdapter.java | 108 +++++++++++------- 2 files changed, 84 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Emojis.java b/app/src/main/java/app/fedilab/android/client/Entities/Emojis.java index 62e3b399a..0e6320307 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Emojis.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Emojis.java @@ -15,6 +15,7 @@ package app.fedilab.android.client.Entities; +import android.graphics.drawable.Drawable; import android.os.Parcel; import android.os.Parcelable; @@ -28,6 +29,8 @@ public class Emojis implements Parcelable { private String static_url; private String url; private boolean visible_in_picker; + private Drawable drawable; + private boolean drawableFound; public Emojis(){} @@ -94,4 +97,20 @@ public class Emojis implements Parcelable { 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; + } } diff --git a/app/src/main/java/app/fedilab/android/drawers/CustomEmojiAdapter.java b/app/src/main/java/app/fedilab/android/drawers/CustomEmojiAdapter.java index 810e96402..4fb766e20 100644 --- a/app/src/main/java/app/fedilab/android/drawers/CustomEmojiAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/CustomEmojiAdapter.java @@ -20,37 +20,33 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import android.content.SharedPreferences; -import android.graphics.Bitmap; import android.graphics.drawable.Drawable; -import android.text.Spannable; -import android.text.style.ImageSpan; +import android.os.AsyncTask; +import android.os.Handler; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; -import android.widget.GridView; import android.widget.ImageView; 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 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.decode.GifParser; import java.io.File; +import java.lang.ref.WeakReference; import java.util.List; import app.fedilab.android.R; import app.fedilab.android.client.Entities.Emojis; import app.fedilab.android.helper.Helper; -import static app.fedilab.android.helper.Helper.drawableToBitmap; /** * Created by Thomas on 03/11/2017. @@ -95,44 +91,70 @@ public class CustomEmojiAdapter extends ArrayAdapter { 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() { - @Override - public boolean onResourceReady(File resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { - return false; - } - @Override - public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { - return false; - } - }) - .into(new SimpleTarget() { - @Override - public void onResourceReady(@NonNull File resourceFile, @Nullable Transition transition) { - Drawable resource; - if(GifParser.isGif(resourceFile.getAbsolutePath())){ - resource = GifDrawable.fromFile(resourceFile.getAbsolutePath()); - }else{ - resource = APNGDrawable.fromFile(resourceFile.getAbsolutePath()); + if( !emoji.isDrawableFound() ) { + emoji.setDrawableFound(true); + Glide.with(context) + .asFile() + .load(emoji.getUrl()) + .thumbnail(0.1f) + .into(new SimpleTarget() { + @Override + public void onResourceReady(@NonNull File resourceFile, @Nullable Transition transition) { + new transform(context, emoji,resourceFile, imageView).execute(); } - - if( !disableAnimatedEmoji) { - resource.setVisible(true, true); - imageView.setImageDrawable(resource); - - }else{ - Bitmap bitmap = drawableToBitmap(resource.getCurrent()); - imageView.setImageBitmap(bitmap); - } - } - }); + }); + }else{ + imageView.setImageDrawable(emoji.getDrawable()); + } return convertView; } + + + private static class transform extends AsyncTask { + + private WeakReference contextWeakReference; + private File resourceFile; + private Emojis emoji; + private WeakReference 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); + } + } } \ No newline at end of file