package at.favre.lib.dali; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.support.annotation.Nullable; import android.support.v4.widget.DrawerLayout; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.View; import java.io.File; import java.io.InputStream; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import at.favre.lib.dali.builder.ContextWrapper; import at.favre.lib.dali.builder.ExecutorManager; import at.favre.lib.dali.builder.ImageReference; import at.favre.lib.dali.builder.TwoLevelCache; import at.favre.lib.dali.builder.blur.BlurBuilder; import at.favre.lib.dali.builder.live.LiveBlurBuilder; import at.favre.lib.dali.builder.nav.DaliBlurDrawerToggle; import at.favre.lib.dali.builder.nav.NavigationDrawerListener; import at.favre.lib.dali.util.Precondition; public class Dali { public static final int NO_RESID = -1; private static final String TAG = Dali.class.getSimpleName(); private static TwoLevelCache DISK_CACHE_MANAGER; private static ExecutorManager EXECUTOR_MANAGER; private static Config GLOBAL_CONFIG = new Config(); private ContextWrapper contextWrapper; private Dali(Context ctx) { contextWrapper = new ContextWrapper(ctx); } public static Config getConfig() { return GLOBAL_CONFIG; } /** * Sets a new config and clears the previous cache */ public synchronized static void resetAndSetNewConfig(Context ctx, Config config) { GLOBAL_CONFIG = config; if (DISK_CACHE_MANAGER != null) { DISK_CACHE_MANAGER.clear(); DISK_CACHE_MANAGER = null; createCache(ctx); } if (EXECUTOR_MANAGER != null) { EXECUTOR_MANAGER.shutDown(); EXECUTOR_MANAGER = null; } Log.i(TAG, "New config set"); } public static void setDebugMode(boolean debugMode) { GLOBAL_CONFIG.debugMode = debugMode; } public static Dali create(Context ctx) { Precondition.checkNotNull("Provided context must not be null", ctx); createCache(ctx); Log.i(TAG, "Dali debug mode: " + GLOBAL_CONFIG.debugMode); return new Dali(ctx.getApplicationContext()); } private static TwoLevelCache createCache(Context ctx) { if (DISK_CACHE_MANAGER == null) { DISK_CACHE_MANAGER = new TwoLevelCache(ctx, GLOBAL_CONFIG.globalUseMemoryCache, GLOBAL_CONFIG.globalUseDiskCache, GLOBAL_CONFIG.diskCacheSizeBytes, GLOBAL_CONFIG.diskCacheFolderName, GLOBAL_CONFIG.memoryCacheSizeBytes, GLOBAL_CONFIG.debugMode); } return DISK_CACHE_MANAGER; } public static ExecutorManager getExecutorManager() { if (EXECUTOR_MANAGER == null) { EXECUTOR_MANAGER = new ExecutorManager(GLOBAL_CONFIG.maxBlurWorkerThreads); } return EXECUTOR_MANAGER; } public static void logD(String localTag, String msg) { if (getConfig().debugMode) { Log.d(getConfig().logTag, "[" + localTag + "] " + msg); } } /* NON STATIC CLASS ************************************************************************* */ public static void logV(String localTag, String msg) { if (getConfig().debugMode) { Log.v(getConfig().logTag, "[" + localTag + "] " + msg); } } public BlurBuilder load(Bitmap bitmap) { return new BlurBuilder(contextWrapper, new ImageReference(bitmap), DISK_CACHE_MANAGER); } public BlurBuilder load(Bitmap bitmap, String cacheKey) { return new BlurBuilder(contextWrapper, new ImageReference(bitmap, cacheKey), DISK_CACHE_MANAGER); } public BlurBuilder load(BitmapDrawable drawable) { return new BlurBuilder(contextWrapper, new ImageReference(drawable.getBitmap()), DISK_CACHE_MANAGER); } public BlurBuilder load(int resId) { return new BlurBuilder(contextWrapper, new ImageReference(resId), DISK_CACHE_MANAGER); } public BlurBuilder load(InputStream inputStream) { return new BlurBuilder(contextWrapper, new ImageReference(inputStream), DISK_CACHE_MANAGER); } public BlurBuilder load(View view) { return new BlurBuilder(contextWrapper, new ImageReference(view), DISK_CACHE_MANAGER); } public BlurBuilder load(File file) { checkFile(file); return new BlurBuilder(contextWrapper, new ImageReference(file), DISK_CACHE_MANAGER); } public BlurBuilder load(File file, String cacheKey) { checkFile(file); return new BlurBuilder(contextWrapper, new ImageReference(file, cacheKey), DISK_CACHE_MANAGER); } public BlurBuilder load(URI uri) { return load(new File(uri)); } public BlurBuilder load(String path) { return load(new File(path)); } private void checkFile(File file) { String errMsg = null; if (file == null) { errMsg = "file object is null"; } else if (!file.exists()) { errMsg = "file does not exist"; } else if (!file.isFile()) { errMsg = "is not a file"; } if (errMsg != null) { throw new IllegalArgumentException("Could not load file " + file + ": " + errMsg); } } public LiveBlurBuilder liveBlur(View unblurredContentView, View blurOntoView, View... blurOntoViewMore) { List<View> viewList = new ArrayList<View>(); viewList.add(blurOntoView); viewList.addAll(Arrays.asList(blurOntoViewMore)); return new LiveBlurBuilder(contextWrapper, unblurredContentView, viewList); } public DaliBlurDrawerToggle constructNavToggle(Activity activity, DrawerLayout drawerLayout, Toolbar toolbar, int openDrawerContentDescRes, int closeDrawerContentDescRes,@Nullable NavigationDrawerListener listener) { return new DaliBlurDrawerToggle(activity, drawerLayout, toolbar, openDrawerContentDescRes, closeDrawerContentDescRes, listener); } public ContextWrapper getContextWrapper() { return contextWrapper; } public final static class Config { public boolean debugMode = false; public boolean globalUseMemoryCache = true; public boolean globalUseDiskCache = true; public int diskCacheSizeBytes = 1024 * 1024 * 10; public int memoryCacheSizeBytes = (int) Runtime.getRuntime().maxMemory() / 10; public String diskCacheFolderName = "dali_diskcache"; public int maxBlurWorkerThreads = 4; public String logTag = Dali.class.getSimpleName(); } }