import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
-import android.os.Environment;
import android.util.Log;
import com.jakewharton.disklrucache.DiskLruCache;
import com.owncloud.android.BuildConfig;
-import com.owncloud.android.utils.Log_OC;
+import com.owncloud.android.lib.common.utils.Log_OC;
public class DiskLruImageCache {
private static final int CACHE_VERSION = 1;
private static final int VALUE_COUNT = 1;
private static final int IO_BUFFER_SIZE = 8 * 1024;
+ private static final Pattern CAPITAL_LETTERS = Pattern.compile("[A-Z]");
+
+ private StringBuffer mValidKeyBuffer = new StringBuffer(64);
+ private StringBuffer mConversionBuffer = new StringBuffer(2).append('_');
+
private static final String TAG = "DiskLruImageCache";
public DiskLruImageCache( Context context,String uniqueName, int diskCacheSize,
- CompressFormat compressFormat, int quality ) {
- try {
- final File diskCacheDir = getDiskCacheDir(context, uniqueName );
- mDiskCache = DiskLruCache.open( diskCacheDir, CACHE_VERSION, VALUE_COUNT, diskCacheSize );
- mCompressFormat = compressFormat;
- mCompressQuality = quality;
- } catch (IOException e) {
- e.printStackTrace();
- }
+ CompressFormat compressFormat, int quality ) throws IOException {
+ final File diskCacheDir = getDiskCacheDir(context, uniqueName );
+ mDiskCache = DiskLruCache.open(
+ diskCacheDir, CACHE_VERSION, VALUE_COUNT, diskCacheSize
+ );
+ mCompressFormat = compressFormat;
+ mCompressQuality = quality;
}
private boolean writeBitmapToFile( Bitmap bitmap, DiskLruCache.Editor editor )
// otherwise use internal cache dir
final String cachePath = context.getExternalCacheDir().getPath();
- Log_OC.d("DiskCache", "create dir: " + cachePath + File.separator + uniqueName);
+ Log_OC.d(TAG, "create dir: " + cachePath + File.separator + uniqueName);
return new File(cachePath + File.separator + uniqueName);
}
public void put( String key, Bitmap data ) {
DiskLruCache.Editor editor = null;
+ String validKey = convertToValidKey(key);
try {
- editor = mDiskCache.edit( key );
+ editor = mDiskCache.edit( validKey );
if ( editor == null ) {
return;
}
mDiskCache.flush();
editor.commit();
if ( BuildConfig.DEBUG ) {
- Log.d( "cache_test_DISK_", "image put on disk cache " + key );
+ Log.d( "cache_test_DISK_", "image put on disk cache " + validKey );
}
} else {
editor.abort();
if ( BuildConfig.DEBUG ) {
- Log.d( "cache_test_DISK_", "ERROR on: image put on disk cache " + key );
+ Log.d( "cache_test_DISK_", "ERROR on: image put on disk cache " + validKey );
}
}
} catch (IOException e) {
if ( BuildConfig.DEBUG ) {
- Log.d( "cache_test_DISK_", "ERROR on: image put on disk cache " + key );
+ Log.d( "cache_test_DISK_", "ERROR on: image put on disk cache " + validKey );
}
try {
if ( editor != null ) {
Bitmap bitmap = null;
DiskLruCache.Snapshot snapshot = null;
+ String validKey = convertToValidKey(key);
try {
- snapshot = mDiskCache.get( key );
+ snapshot = mDiskCache.get( validKey );
if ( snapshot == null ) {
return null;
}
}
if ( BuildConfig.DEBUG ) {
- Log.d( "cache_test_DISK_", bitmap == null ? "not found" : "image read from disk " + key);
+ Log.d("cache_test_DISK_", bitmap == null ? "not found" : "image read from disk " + validKey);
}
return bitmap;
boolean contained = false;
DiskLruCache.Snapshot snapshot = null;
+ String validKey = convertToValidKey(key);
try {
- snapshot = mDiskCache.get( key );
+ snapshot = mDiskCache.get( validKey );
contained = snapshot != null;
} catch (IOException e) {
e.printStackTrace();
public File getCacheFolder() {
return mDiskCache.getDirectory();
}
+
+ private String convertToValidKey(String key) {
+ Matcher capitalLettersMatcher = CAPITAL_LETTERS.matcher(key);
+ mValidKeyBuffer.delete(0, mValidKeyBuffer.length());
+ mConversionBuffer.delete(1, mConversionBuffer.length());
+
+ while (capitalLettersMatcher.find()) {
+ mConversionBuffer.replace(1, 2, capitalLettersMatcher.group(0).toLowerCase());
+ capitalLettersMatcher.appendReplacement(mValidKeyBuffer, mConversionBuffer.toString());
+ }
+ capitalLettersMatcher.appendTail(mValidKeyBuffer);
+ return mValidKeyBuffer.toString();
+ }
}
\ No newline at end of file