package org.emdev.common.cache;
import android.content.Context;
import android.net.Uri;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.emdev.common.filesystem.FilePrefixFilter;
import org.emdev.common.log.LogContext;
import org.emdev.common.log.LogManager;
import org.emdev.ui.progress.IProgressIndicator;
import org.emdev.ui.progress.UIFileCopying;
import org.emdev.utils.FileUtils;
import org.emdev.utils.LengthUtils;
import org.emdev.utils.StringUtils;
public class CacheManager {
public static final LogContext LCTX = LogManager.root().lctx("CacheManager", false);
protected static Context s_context;
protected static File s_cacheDir;
public static void init(final Context context) {
s_context = context;
s_cacheDir = context.getFilesDir();
LCTX.i("Default app cache dir: " + FileUtils.getAbsolutePath(s_cacheDir));
}
public static File getCacheDir() {
return s_cacheDir;
}
public static boolean setCacheDir(final File newCache, final boolean moveFiles, final IProgressIndicator progress) {
final File oldCache = s_cacheDir;
s_cacheDir = newCache;
if (s_cacheDir == null || s_cacheDir.equals(oldCache)) {
return false;
}
s_cacheDir.mkdir();
LCTX.i("Actual app cache dir: " + s_cacheDir.getAbsolutePath());
if (!moveFiles) {
return true;
}
final String[] files = oldCache.list();
if (LengthUtils.isEmpty(files)) {
return true;
}
final int count = FileUtils.move(oldCache, newCache, files, progress);
LCTX.i("" + count + " files moved");
return true;
}
public static File createTempFile(final InputStream source, final String suffix) throws IOException {
final File tempfile = File.createTempFile("temp", suffix, s_cacheDir);
tempfile.deleteOnExit();
FileUtils.copy(source, new FileOutputStream(tempfile));
return tempfile;
}
public static File createTempDocument(final InputStream source, final String fileName, final UIFileCopying worker)
throws IOException {
final File tempfile = new File(s_cacheDir, fileName);
tempfile.deleteOnExit();
worker.copy(-1, source, new FileOutputStream(tempfile));
return tempfile;
}
public static File createTempFile(final byte[] source, final String suffix) throws IOException {
final File tempfile = File.createTempFile("temp", suffix, s_cacheDir);
tempfile.deleteOnExit();
FileUtils.copy(new ByteArrayInputStream(source), new FileOutputStream(tempfile), source.length, null);
return tempfile;
}
public static File createTempFile(final Uri uri, final String extension, final UIFileCopying worker) throws IOException {
final File tempfile = File.createTempFile("temp", "content." + extension, s_cacheDir);
tempfile.deleteOnExit();
final InputStream source = s_context.getContentResolver().openInputStream(uri);
worker.copy(-1, source, new FileOutputStream(tempfile));
return tempfile;
}
public static File createTempFile(final Uri uri) throws IOException {
final File tempfile = File.createTempFile("temp", "content", s_cacheDir);
tempfile.deleteOnExit();
final InputStream source = s_context.getContentResolver().openInputStream(uri);
FileUtils.copy(source, new FileOutputStream(tempfile));
return tempfile;
}
public static void clear() {
final String[] files = s_cacheDir != null ? s_cacheDir.list() : null;
if (LengthUtils.isNotEmpty(files)) {
for (final String file : files) {
new File(s_cacheDir, file).delete();
}
}
}
public static void copy(final String sourcePath, final String targetPath, final boolean deleteSource) {
final FilePrefixFilter filter = new FilePrefixFilter(StringUtils.md5(sourcePath) + ".");
final String[] files = s_cacheDir != null ? s_cacheDir.list(filter) : null;
if (LengthUtils.isEmpty(files)) {
return;
}
final String targetPrefix = StringUtils.md5(targetPath);
boolean renamed = true;
for (final String file : files) {
final File source = new File(s_cacheDir, file);
final File target = new File(s_cacheDir, targetPrefix + FileUtils.getExtensionWithDot(source));
if (deleteSource) {
renamed = renamed && source.renameTo(target);
if (!renamed) {
try {
FileUtils.copy(source, target);
source.delete();
if (LCTX.isDebugEnabled()) {
LCTX.d("File moving completed: " + target.getName());
}
} catch (final IOException ex) {
LCTX.e("File moving failed: " + ex.getMessage());
}
} else {
if (LCTX.isDebugEnabled()) {
LCTX.d("File renaming completed: " + target.getName());
}
}
} else {
try {
FileUtils.copy(source, target);
if (LCTX.isDebugEnabled()) {
LCTX.d("File copying completed: " + target.getName());
}
} catch (final IOException ex) {
LCTX.e("File copying failed: " + ex.getMessage());
}
}
}
}
}