aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/pixart/messenger/ui/util/AvatarWorkerTask.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/de/pixart/messenger/ui/util/AvatarWorkerTask.java')
-rw-r--r--src/main/java/de/pixart/messenger/ui/util/AvatarWorkerTask.java111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/main/java/de/pixart/messenger/ui/util/AvatarWorkerTask.java b/src/main/java/de/pixart/messenger/ui/util/AvatarWorkerTask.java
new file mode 100644
index 000000000..afddb7e8b
--- /dev/null
+++ b/src/main/java/de/pixart/messenger/ui/util/AvatarWorkerTask.java
@@ -0,0 +1,111 @@
+package de.pixart.messenger.ui.util;
+
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.AsyncTask;
+import android.support.annotation.DimenRes;
+import android.widget.ImageView;
+
+import java.lang.ref.WeakReference;
+import java.util.concurrent.RejectedExecutionException;
+
+import de.pixart.messenger.services.AvatarService;
+import de.pixart.messenger.ui.XmppActivity;
+
+public class AvatarWorkerTask extends AsyncTask<AvatarService.Avatarable, Void, Bitmap> {
+ private final WeakReference<ImageView> imageViewReference;
+ private AvatarService.Avatarable avatarable = null;
+ private @DimenRes
+ int size;
+
+ public AvatarWorkerTask(ImageView imageView, @DimenRes int size) {
+ imageViewReference = new WeakReference<>(imageView);
+ this.size = size;
+ }
+
+ @Override
+ protected Bitmap doInBackground(AvatarService.Avatarable... params) {
+ this.avatarable = params[0];
+ final XmppActivity activity = XmppActivity.find(imageViewReference);
+ if (activity == null) {
+ return null;
+ }
+ return activity.avatarService().get(avatarable, (int) activity.getResources().getDimension(size), isCancelled());
+ }
+
+ @Override
+ protected void onPostExecute(Bitmap bitmap) {
+ if (bitmap != null && !isCancelled()) {
+ final ImageView imageView = imageViewReference.get();
+ if (imageView != null) {
+ imageView.setImageBitmap(bitmap);
+ imageView.setBackgroundColor(0x00000000);
+ }
+ }
+ }
+
+ public static boolean cancelPotentialWork(AvatarService.Avatarable avatarable, ImageView imageView) {
+ final AvatarWorkerTask workerTask = getBitmapWorkerTask(imageView);
+
+ if (workerTask != null) {
+ final AvatarService.Avatarable old = workerTask.avatarable;
+ if (old == null || avatarable != old) {
+ workerTask.cancel(true);
+ } else {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static AvatarWorkerTask getBitmapWorkerTask(ImageView imageView) {
+ if (imageView != null) {
+ final Drawable drawable = imageView.getDrawable();
+ if (drawable instanceof AsyncDrawable) {
+ final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable;
+ return asyncDrawable.getAvatarWorkerTask();
+ }
+ }
+ return null;
+ }
+
+ public static void loadAvatar(final AvatarService.Avatarable avatarable, final ImageView imageView, final @DimenRes int size) {
+ if (cancelPotentialWork(avatarable, imageView)) {
+ final XmppActivity activity = XmppActivity.find(imageView);
+ if (activity == null) {
+ return;
+ }
+ final Bitmap bm = activity.avatarService().get(avatarable, (int) activity.getResources().getDimension(size), true);
+ if (bm != null) {
+ cancelPotentialWork(avatarable, imageView);
+ imageView.setImageBitmap(bm);
+ imageView.setBackgroundColor(0x00000000);
+ } else {
+ imageView.setBackgroundColor(avatarable.getAvatarBackgroundColor());
+ imageView.setImageDrawable(null);
+ final AvatarWorkerTask task = new AvatarWorkerTask(imageView, size);
+ final AsyncDrawable asyncDrawable = new AsyncDrawable(activity.getResources(), null, task);
+ imageView.setImageDrawable(asyncDrawable);
+ try {
+ task.execute(avatarable);
+ } catch (final RejectedExecutionException ignored) {
+ }
+ }
+ }
+ }
+
+ static class AsyncDrawable extends BitmapDrawable {
+ private final WeakReference<AvatarWorkerTask> avatarWorkerTaskReference;
+
+ AsyncDrawable(Resources res, Bitmap bitmap, AvatarWorkerTask workerTask) {
+ super(res, bitmap);
+ avatarWorkerTaskReference = new WeakReference<>(workerTask);
+ }
+
+ AvatarWorkerTask getAvatarWorkerTask() {
+ return avatarWorkerTaskReference.get();
+ }
+ }
+}