1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/* 2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project 3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License. 6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at 7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software 11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and 14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License. 15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */ 16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.util; 18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 19f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.common.BlobCache; 20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.Context; 22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.SharedPreferences; 23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.preference.PreferenceManager; 24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.io.File; 26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.io.IOException; 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.util.HashMap; 28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class CacheManager { 30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "CacheManager"; 31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String KEY_CACHE_UP_TO_DATE = "cache-up-to-date"; 32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static HashMap<String, BlobCache> sCacheMap = 33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin new HashMap<String, BlobCache>(); 34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static boolean sOldCheckDone = false; 35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Return null when we cannot instantiate a BlobCache, e.g.: 37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // there is no SD card found. 38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // This can only be called from data thread. 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static BlobCache getCache(Context context, String filename, 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int maxEntries, int maxBytes, int version) { 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin synchronized (sCacheMap) { 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!sOldCheckDone) { 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin removeOldFilesIfNecessary(context); 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin sOldCheckDone = true; 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin BlobCache cache = sCacheMap.get(filename); 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (cache == null) { 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin File cacheDir = context.getExternalCacheDir(); 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String path = cacheDir.getAbsolutePath() + "/" + filename; 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin cache = new BlobCache(path, maxEntries, maxBytes, false, 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin version); 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin sCacheMap.put(filename, cache); 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (IOException e) { 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.e(TAG, "Cannot instantiate cache!", e); 56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return cache; 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Removes the old files if the data is wiped. 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static void removeOldFilesIfNecessary(Context context) { 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin SharedPreferences pref = PreferenceManager 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .getDefaultSharedPreferences(context); 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int n = 0; 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin n = pref.getInt(KEY_CACHE_UP_TO_DATE, 0); 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } catch (Throwable t) { 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // ignore. 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (n != 0) return; 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin pref.edit().putInt(KEY_CACHE_UP_TO_DATE, 1).commit(); 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin File cacheDir = context.getExternalCacheDir(); 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String prefix = cacheDir.getAbsolutePath() + "/"; 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin BlobCache.deleteFiles(prefix + "imgcache"); 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin BlobCache.deleteFiles(prefix + "rev_geocoding"); 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin BlobCache.deleteFiles(prefix + "bookmark"); 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 83