package com.likebamboo.osa.android.ui.view.blur;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.PorterDuff;
import android.graphics.drawable.BitmapDrawable;
import android.os.AsyncTask;
import android.support.v4.util.LruCache;
import android.view.View;
/**
* <a herf="https://github.com/faradaj/BlurBehind">READ ME</a>
* <p/>
* Created by wentaoli on 2015/5/18.
*/
public class BlurBehind {
private static final String KEY_CACHE_BLURRED_BACKGROUND_IMAGE = "KEY_CACHE_BLURRED_BACKGROUND_IMAGE";
private static final int CONSTANT_BLUR_RADIUS = 10;
private static final int CONSTANT_DEFAULT_ALPHA = 100;
private static final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(1);
private static CacheBlurBehindAndExecuteTask cacheBlurBehindAndExecuteTask;
private int mAlpha = CONSTANT_DEFAULT_ALPHA;
private int mFilterColor = -1;
private enum State {
READY,
EXECUTING
}
private State mState = State.READY;
private static BlurBehind mInstance;
public static BlurBehind getInstance() {
if (mInstance == null) {
mInstance = new BlurBehind();
}
return mInstance;
}
public void execute(Activity activity, OnBlurCompleteListener onBlurCompleteListener) {
if (mState.equals(State.READY)) {
mState = State.EXECUTING;
cacheBlurBehindAndExecuteTask = new CacheBlurBehindAndExecuteTask(activity, onBlurCompleteListener);
cacheBlurBehindAndExecuteTask.execute();
}
}
public BlurBehind withAlpha(int alpha) {
this.mAlpha = alpha;
return this;
}
public BlurBehind withFilterColor(int filterColor) {
this.mFilterColor = filterColor;
return this;
}
public void setBackground(Activity activity) {
if (mImageCache.size() != 0) {
BitmapDrawable bd = new BitmapDrawable(activity.getResources(), mImageCache.get(KEY_CACHE_BLURRED_BACKGROUND_IMAGE));
bd.setAlpha(mAlpha);
if (mFilterColor != -1) {
bd.setColorFilter(mFilterColor, PorterDuff.Mode.DST_ATOP);
}
activity.getWindow().setBackgroundDrawable(bd);
mImageCache.remove(KEY_CACHE_BLURRED_BACKGROUND_IMAGE);
cacheBlurBehindAndExecuteTask = null;
}
}
private class CacheBlurBehindAndExecuteTask extends AsyncTask<Void, Void, Void> {
private Activity activity;
private OnBlurCompleteListener onBlurCompleteListener;
private View decorView;
private Bitmap image;
public CacheBlurBehindAndExecuteTask(Activity activity, OnBlurCompleteListener onBlurCompleteListener) {
this.activity = activity;
this.onBlurCompleteListener = onBlurCompleteListener;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
decorView = activity.getWindow().getDecorView();
decorView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_LOW);
decorView.setDrawingCacheEnabled(true);
decorView.buildDrawingCache();
image = decorView.getDrawingCache();
}
@Override
protected Void doInBackground(Void... params) {
Bitmap blurredBitmap = Blur.apply(activity, image, 0.5F, CONSTANT_BLUR_RADIUS);
mImageCache.put(KEY_CACHE_BLURRED_BACKGROUND_IMAGE, blurredBitmap);
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
decorView.destroyDrawingCache();
decorView.setDrawingCacheEnabled(false);
activity = null;
onBlurCompleteListener.onBlurComplete();
mState = State.READY;
}
}
}