1721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor/* 2721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor * Copyright (C) 2012 The Android Open Source Project 3721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor * 4721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor * Licensed under the Apache License, Version 2.0 (the "License"); 5721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor * you may not use this file except in compliance with the License. 6721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor * You may obtain a copy of the License at 7721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor * 8721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor * http://www.apache.org/licenses/LICENSE-2.0 9721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor * 10721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor * Unless required by applicable law or agreed to in writing, software 11721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor * distributed under the License is distributed on an "AS IS" BASIS, 12721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor * See the License for the specific language governing permissions and 14721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor * limitations under the License. 15721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor */ 16721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor 17721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylorpackage com.android.mms.util; 18721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor 19ab845dee6565a8dfc384186bc8f2e801a2b087e1Ye Wenimport com.android.mms.LogTag; 20ab845dee6565a8dfc384186bc8f2e801a2b087e1Ye Wen 21d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.io.File; 22d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.io.IOException; 23d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chenimport java.util.HashMap; 24d64419030e1fec1e751695dab3bd7236e2fb0214Roger Chen 25721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylorimport android.content.Context; 26721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylorimport android.content.SharedPreferences; 27721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylorimport android.preference.PreferenceManager; 28721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylorimport android.util.Log; 29721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor 30721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylorpublic class CacheManager { 31ab845dee6565a8dfc384186bc8f2e801a2b087e1Ye Wen private static final String TAG = LogTag.TAG; 32721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor private static final String KEY_CACHE_UP_TO_DATE = "cache-up-to-date"; 33721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor private static HashMap<String, BlobCache> sCacheMap = 34721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor new HashMap<String, BlobCache>(); 35721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor private static boolean sOldCheckDone = false; 36721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor 37721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor private static final boolean PUT_CACHE_ON_SDCARD = false; 38721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor 39721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor // Return null when we cannot instantiate a BlobCache, e.g.: 40721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor // there is no SD card found. 41721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor // This can only be called from data thread. 42721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor public static BlobCache getCache(Context context, String filename, 43721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor int maxEntries, int maxBytes, int version) { 44721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor synchronized (sCacheMap) { 45721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor if (!sOldCheckDone) { 46721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor removeOldFilesIfNecessary(context); 47721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor sOldCheckDone = true; 48721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor } 49721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor BlobCache cache = sCacheMap.get(filename); 50721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor if (cache == null) { 51721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor File cacheDir = PUT_CACHE_ON_SDCARD ? context.getExternalCacheDir() 52721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor : context.getCacheDir(); 53721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor String path = cacheDir.getAbsolutePath() + "/" + filename; 54721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor Log.d(TAG, "Cache dir: " + path); 55721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor try { 56721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor cache = new BlobCache(path, maxEntries, maxBytes, false, 57721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor version); 58721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor sCacheMap.put(filename, cache); 59721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor } catch (IOException e) { 60721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor Log.e(TAG, "Cannot instantiate cache!", e); 61721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor } 62721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor } 63721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor return cache; 64721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor } 65721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor } 66721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor 67721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor // Removes the old files if the data is wiped. 68721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor private static void removeOldFilesIfNecessary(Context context) { 69721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor SharedPreferences pref = PreferenceManager 70721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor .getDefaultSharedPreferences(context); 71721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor int n = 0; 72721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor try { 73721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor n = pref.getInt(KEY_CACHE_UP_TO_DATE, 0); 74721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor } catch (Throwable t) { 75721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor // ignore. 76721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor } 77721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor if (n != 0) return; 78721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor pref.edit().putInt(KEY_CACHE_UP_TO_DATE, 1).commit(); 79721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor 807b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor clear(context); 817b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor } 827b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor 837b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor public static void clear(Context context) { 847b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor File cacheDir = PUT_CACHE_ON_SDCARD ? context.getExternalCacheDir() 857b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor : context.getCacheDir(); 86721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor String prefix = cacheDir.getAbsolutePath() + "/"; 87721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor 887b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor BlobCache.deleteFiles(prefix + ImageCacheService.IMAGE_CACHE_FILE); 897b6fe946f2e1020432e3600c8863f72449cd4e68Tom Taylor sCacheMap.remove(ImageCacheService.IMAGE_CACHE_FILE); 90721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor } 91721ad07121cb9b0cd76bdbbc88494aa8f4d45a6dTom Taylor} 92