/*
* Copyright (c) 2015 Zhang Hai <Dreaming.in.Code.ZH@Gmail.com>
* All Rights Reserved.
*/
package me.zhanghai.android.douya.util;
import android.content.Context;
import android.os.Handler;
import com.google.gson.reflect.TypeToken;
import java.io.File;
import java.lang.reflect.Type;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionException;
import me.zhanghai.android.douya.BuildConfig;
public class DiskCacheHelper {
// 2M
private static final int MAX_DISK_CACHE_BYTES = 2 * 1024 * 1024;
private static final Object DISK_CACHE_LOCK = new Object();
private static volatile DiskCache sDiskCache;
private static final ExecutorService sExecutorService = Executors.newSingleThreadExecutor();
private DiskCacheHelper() {}
public static DiskCache get(Context context) {
if (sDiskCache == null) {
synchronized (DISK_CACHE_LOCK) {
if (sDiskCache == null) {
sDiskCache = DiskCache.open(new File(context.getCacheDir(),
BuildConfig.APPLICATION_ID), 0, MAX_DISK_CACHE_BYTES);
}
}
}
return sDiskCache;
}
private static void executeAsync(Runnable runnable) {
try {
sExecutorService.execute(runnable);
} catch (RejectedExecutionException e) {
e.printStackTrace();
}
}
private static <T> void deliverValue(Handler handler, final Callback<T> callback,
final T value) {
handler.post(new Runnable() {
@Override
public void run() {
callback.onValue(value);
}
});
}
public static void getString(final String key, final Handler handler,
final Callback<String> callback, final Context context) {
executeAsync(new Runnable() {
@Override
public void run() {
DiskCache diskCache = get(context);
deliverValue(handler, callback, diskCache != null ? diskCache.getString(key)
: null);
}
});
}
public static <T> void getGson(final String key, final Type type, final Handler handler,
final Callback<T> callback, final Context context) {
executeAsync(new Runnable() {
@Override
public void run() {
DiskCache diskCache = get(context);
deliverValue(handler, callback, diskCache != null ? diskCache.<T>getGson(key, type)
: null);
}
});
}
public static <T> void getGson(String key, TypeToken<T> typeToken, Handler handler,
Callback<T> callback, Context context) {
getGson(key, typeToken.getType(), handler, callback, context);
}
public static void putBytes(final String key, final byte[] value, final Context context) {
executeAsync(new Runnable() {
@Override
public void run() {
DiskCache diskCache = get(context);
if (diskCache != null) {
diskCache.putBytes(key, value);
}
}
});
}
public static void putString(final String key, final String value, final Context context) {
executeAsync(new Runnable() {
@Override
public void run() {
DiskCache diskCache = get(context);
if (diskCache != null) {
diskCache.putString(key, value);
}
}
});
}
public static <T> void putGson(final String key, final T value, final Type type,
final Context context) {
executeAsync(new Runnable() {
@Override
public void run() {
DiskCache diskCache = get(context);
if (diskCache != null) {
diskCache.putGson(key, value, type);
}
}
});
}
public static <T> void putGson(String key, T value, TypeToken<T> typeToken, Context context) {
putGson(key, value, typeToken.getType(), context);
}
public static void remove(final String key, final Handler handler,
final Callback<Boolean> callback, final Context context) {
executeAsync(new Runnable() {
@Override
public void run() {
DiskCache diskCache = get(context);
if (diskCache != null) {
deliverValue(handler, callback, diskCache.remove(key));
}
}
});
}
public static void remove(final String key, final Context context) {
executeAsync(new Runnable() {
@Override
public void run() {
DiskCache diskCache = get(context);
if (diskCache != null) {
diskCache.remove(key);
}
}
});
}
public static void delete(final Context context) {
executeAsync(new Runnable() {
@Override
public void run() {
DiskCache diskCache = get(context);
if (diskCache != null) {
diskCache.delete();
}
}
});
}
public static void close(final Context context) {
executeAsync(new Runnable() {
@Override
public void run() {
DiskCache diskCache = get(context);
if (diskCache != null) {
diskCache.close();
}
}
});
}
}