package org.ebookdroid.common.cache;
import org.sufficientlysecure.viewer.R;
import org.ebookdroid.common.settings.types.CacheLocation;
import android.content.Context;
import java.io.File;
import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.Map;
import org.emdev.BaseDroidApp;
import org.emdev.common.filesystem.FilePrefixFilter;
import org.emdev.ui.progress.IProgressIndicator;
import org.emdev.ui.tasks.BaseAsyncTask;
import org.emdev.utils.FileUtils;
import org.emdev.utils.LengthUtils;
import org.emdev.utils.StringUtils;
import org.emdev.utils.listeners.ListenerProxy;
public class CacheManager extends org.emdev.common.cache.CacheManager {
private static final Map<String, SoftReference<ThumbnailFile>> thumbmails = new HashMap<String, SoftReference<ThumbnailFile>>();
public static final ListenerProxy listeners = new ListenerProxy(ICacheListener.class);
public static void setCacheLocation(final CacheLocation cacheLocation, final boolean moveFiles) {
File cacheDir = s_context.getFilesDir();
if (cacheLocation == CacheLocation.Custom) {
if (!BaseDroidApp.APP_STORAGE.equals(cacheDir)) {
cacheDir = new File(BaseDroidApp.APP_STORAGE, "files");
}
}
if (setCacheDir(cacheDir, moveFiles, null)) {
thumbmails.clear();
}
}
public static void moveCacheLocation(final Context context, final CacheLocation cacheLocation) {
File cacheDir = s_context.getFilesDir();
if (cacheLocation == CacheLocation.Custom) {
if (!BaseDroidApp.APP_STORAGE.equals(cacheDir)) {
cacheDir = new File(BaseDroidApp.APP_STORAGE, "files");
}
}
new MoveLocationTask(context).execute(cacheDir);
}
public static ThumbnailFile getThumbnailFile(final String path) {
final String amd5 = StringUtils.md5(path);
final String mpath = FileUtils.invertMountPrefix(path);
final String mmd5 = mpath != null ? StringUtils.md5(mpath) : null;
SoftReference<ThumbnailFile> ref = thumbmails.get(amd5);
ThumbnailFile file = ref != null ? ref.get() : null;
if (file != null) {
return file;
}
ref = thumbmails.get(mmd5);
file = ref != null ? ref.get() : null;
if (file != null) {
return file;
}
file = new ThumbnailFile(path, s_cacheDir, amd5 + ".thumbnail");
if (!file.exists()) {
final ThumbnailFile f = new ThumbnailFile(path, s_cacheDir, mmd5 + ".thumbnail");
file = f.exists() ? f : file;
}
thumbmails.put(amd5, new SoftReference<ThumbnailFile>(file));
if (mmd5 != null) {
thumbmails.put(mmd5, new SoftReference<ThumbnailFile>(file));
}
return file;
}
public static PageCacheFile getPageFile(final String path) {
final String amd5 = StringUtils.md5(path);
final PageCacheFile apcf = new PageCacheFile(s_cacheDir, amd5 + ".cache");
if (apcf.exists()) {
return apcf;
}
final String mpath = FileUtils.invertMountPrefix(path);
final String mmd5 = mpath != null ? StringUtils.md5(mpath) : null;
final PageCacheFile mpcf = new PageCacheFile(s_cacheDir, mmd5 + ".cache");
if (mpcf.exists()) {
return mpcf;
}
return apcf;
}
public static DocumentCacheFile getDocumentFile(final String path) {
final String amd5 = StringUtils.md5(path);
final DocumentCacheFile adcf = new DocumentCacheFile(s_cacheDir, amd5 + ".dcache");
if (adcf.exists()) {
return adcf;
}
final String mpath = FileUtils.invertMountPrefix(path);
final String mmd5 = mpath != null ? StringUtils.md5(mpath) : null;
final DocumentCacheFile mdcf = new DocumentCacheFile(s_cacheDir, mmd5 + ".dcache");
if (mdcf.exists()) {
return mdcf;
}
return adcf;
}
public static void clear() {
thumbmails.clear();
org.emdev.common.cache.CacheManager.clear();
}
public static void clear(final String path) {
if (LengthUtils.isEmpty(path)) {
return;
}
final String amd5 = StringUtils.md5(path);
final String mpath = FileUtils.invertMountPrefix(path);
final String mmd5 = mpath != null ? StringUtils.md5(mpath) : null;
clearImpl(amd5);
if (mmd5 != null) {
clearImpl(mmd5);
}
}
private static void clearImpl(final String md5) {
thumbmails.remove(md5);
final String[] files = s_cacheDir != null ? s_cacheDir.list(new FilePrefixFilter(md5 + ".")) : null;
if (LengthUtils.isNotEmpty(files)) {
for (final String file : files) {
new File(s_cacheDir, file).delete();
}
}
}
private static final class MoveLocationTask extends BaseAsyncTask<File, Boolean> implements IProgressIndicator {
public MoveLocationTask(final Context context) {
super(context, R.string.cache_moving_text, false);
}
@Override
protected Boolean doInBackground(final File... params) {
return setCacheDir(params[0], true, this);
}
@Override
protected void onPostExecute(final Boolean result) {
if (result) {
thumbmails.clear();
}
super.onPostExecute(result);
}
@Override
public void setProgressDialogMessage(final int resourceID, final Object... args) {
final String text = context.getResources().getString(R.string.cache_moving_progress, args);
publishProgress(text);
}
}
public static interface ICacheListener {
void onThumbnailChanged(ThumbnailFile tf);
}
}