package fr.prcaen.externalresources; import android.content.Context; import android.os.StatFs; import android.support.annotation.IntDef; import java.io.File; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import static android.os.Build.VERSION.SDK_INT; import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR2; public final class Cache { public static final int POLICY_NONE = 0; public static final int POLICY_OFFLINE = 1; public static final int POLICY_ALL = 2; protected static final int MIN_DISK_CACHE_SIZE = 5 * 1024 * 1024; // 5MB protected static final int MAX_DISK_CACHE_SIZE = 50 * 1024 * 1024; // 50MB private static final String EXTERNAL_RESOURCES_FILE_NAME_CACHE = "external-resources-cache"; private final File cacheDir; private final long cacheSize; @Retention(RetentionPolicy.SOURCE) @IntDef({ POLICY_NONE, POLICY_OFFLINE, POLICY_ALL }) public @interface Policy { } public Cache(Context context) { this.cacheDir = createDefaultCacheDir(context.getApplicationContext()); this.cacheSize = calculateDiskCacheSize(cacheDir); } private static File createDefaultCacheDir(Context context) { File cache = new File(context.getCacheDir(), EXTERNAL_RESOURCES_FILE_NAME_CACHE); if (!cache.exists()) { //noinspection ResultOfMethodCallIgnored cache.mkdirs(); } return cache; } @SuppressWarnings("deprecation") public static long calculateDiskCacheSize(File dir) { long size = MIN_DISK_CACHE_SIZE; try { StatFs statFs = new StatFs(dir.getAbsolutePath()); final long available; if (SDK_INT < JELLY_BEAN_MR2) { available = ((long) statFs.getBlockCount()) * statFs.getBlockSize(); } else { available = statFs.getBlockCountLong() * statFs.getBlockSizeLong(); } size = available / 50; } catch (IllegalArgumentException ignored) { } return Math.max(Math.min(size, MAX_DISK_CACHE_SIZE), MIN_DISK_CACHE_SIZE); } public File getCacheDir() { return cacheDir; } public long getCacheSize() { return cacheSize; } }