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