package im.actor.sdk.controllers.conversation.view; import android.graphics.Bitmap; import com.facebook.drawee.view.SimpleDraweeView; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import im.actor.sdk.util.images.BitmapUtil; import im.actor.sdk.util.images.common.ImageLoadException; import im.actor.sdk.util.images.ops.ImageLoading; /** * Created by ex3ndr on 27.02.15. */ public class FastThumbLoader { private static Executor executor = Executors.newSingleThreadExecutor(); private SimpleDraweeView preview; private final Object LOCKER = new Object(); private int currentRequest = 0; private byte[] data; private boolean isActive = false; private boolean blur = false; private int blurRadius = 0; public FastThumbLoader(SimpleDraweeView preview) { this.preview = preview; } public void setBlur(int radius) { if (radius > 0) { blur = true; blurRadius = radius; } else { blur = false; blurRadius = 0; } } public void cancel() { synchronized (LOCKER) { this.currentRequest++; this.data = null; this.isActive = false; } preview.getHierarchy().setPlaceholderImage(null); } public void request(byte[] data) { synchronized (LOCKER) { this.currentRequest++; this.data = data; this.isActive = true; } preview.getHierarchy().setPlaceholderImage(null); executor.execute(new CheckRunnable()); } private class CheckRunnable implements Runnable { @Override public void run() { final int req; byte[] d; synchronized (LOCKER) { if (!isActive) { return; } req = currentRequest; d = data; } try { final Bitmap res = blur ? BitmapUtil.fastBlur(ImageLoading.loadBitmap(d), blurRadius) : ImageLoading.loadBitmap(d); im.actor.runtime.Runtime.postToMainThread(new Runnable() { @Override public void run() { synchronized (LOCKER) { if (!isActive) { return; } if (req == currentRequest) { preview.getHierarchy().setPlaceholderImage(new FastBitmapDrawable(res)); isActive = false; } else { return; } } } }); } catch (ImageLoadException e) { e.printStackTrace(); synchronized (LOCKER) { if (isActive && currentRequest == req) { isActive = false; } } } } } }