19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 Esmertec AG.
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylorpackage com.google.android.mms.util;
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentUris;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.UriMatcher;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
23a87afd07c0093cab638e9ef9bc2c53c8200ca711Tom Taylorimport android.provider.Telephony.Mms;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashSet;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class PduCache extends AbstractCache<Uri, PduCacheEntry> {
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "PduCache";
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG = false;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean LOCAL_LOGV = DEBUG ? Config.LOGD : Config.LOGV;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MMS_ALL             = 0;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MMS_ALL_ID          = 1;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MMS_INBOX           = 2;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MMS_INBOX_ID        = 3;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MMS_SENT            = 4;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MMS_SENT_ID         = 5;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MMS_DRAFTS          = 6;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MMS_DRAFTS_ID       = 7;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MMS_OUTBOX          = 8;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MMS_OUTBOX_ID       = 9;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MMS_CONVERSATION    = 10;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MMS_CONVERSATION_ID = 11;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final UriMatcher URI_MATCHER;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final HashMap<Integer, Integer> MATCH_TO_MSGBOX_ID_MAP;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static PduCache sInstance;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static {
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        URI_MATCHER.addURI("mms", null,         MMS_ALL);
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        URI_MATCHER.addURI("mms", "#",          MMS_ALL_ID);
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        URI_MATCHER.addURI("mms", "inbox",      MMS_INBOX);
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        URI_MATCHER.addURI("mms", "inbox/#",    MMS_INBOX_ID);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        URI_MATCHER.addURI("mms", "sent",       MMS_SENT);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        URI_MATCHER.addURI("mms", "sent/#",     MMS_SENT_ID);
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        URI_MATCHER.addURI("mms", "drafts",     MMS_DRAFTS);
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        URI_MATCHER.addURI("mms", "drafts/#",   MMS_DRAFTS_ID);
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        URI_MATCHER.addURI("mms", "outbox",     MMS_OUTBOX);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        URI_MATCHER.addURI("mms", "outbox/#",   MMS_OUTBOX_ID);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        URI_MATCHER.addURI("mms-sms", "conversations",   MMS_CONVERSATION);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        URI_MATCHER.addURI("mms-sms", "conversations/#", MMS_CONVERSATION_ID);
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MATCH_TO_MSGBOX_ID_MAP = new HashMap<Integer, Integer>();
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MATCH_TO_MSGBOX_ID_MAP.put(MMS_INBOX,  Mms.MESSAGE_BOX_INBOX);
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MATCH_TO_MSGBOX_ID_MAP.put(MMS_SENT,   Mms.MESSAGE_BOX_SENT);
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MATCH_TO_MSGBOX_ID_MAP.put(MMS_DRAFTS, Mms.MESSAGE_BOX_DRAFTS);
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MATCH_TO_MSGBOX_ID_MAP.put(MMS_OUTBOX, Mms.MESSAGE_BOX_OUTBOX);
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final HashMap<Integer, HashSet<Uri>> mMessageBoxes;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final HashMap<Long, HashSet<Uri>> mThreads;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PduCache() {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMessageBoxes = new HashMap<Integer, HashSet<Uri>>();
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThreads = new HashMap<Long, HashSet<Uri>>();
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    synchronized public static final PduCache getInstance() {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sInstance == null) {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_LOGV) {
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "Constructing new PduCache instance.");
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sInstance = new PduCache();
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sInstance;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    synchronized public boolean put(Uri uri, PduCacheEntry entry) {
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int msgBoxId = entry.getMessageBox();
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        HashSet<Uri> msgBox = mMessageBoxes.get(msgBoxId);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (msgBox == null) {
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            msgBox = new HashSet<Uri>();
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMessageBoxes.put(msgBoxId, msgBox);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long threadId = entry.getThreadId();
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        HashSet<Uri> thread = mThreads.get(threadId);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (thread == null) {
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            thread = new HashSet<Uri>();
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mThreads.put(threadId, thread);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uri finalKey = normalizeKey(uri);
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean result = super.put(finalKey, entry);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (result) {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            msgBox.add(finalKey);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            thread.add(finalKey);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    synchronized public PduCacheEntry purge(Uri uri) {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int match = URI_MATCHER.match(uri);
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (match) {
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MMS_ALL_ID:
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return purgeSingleEntry(uri);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MMS_INBOX_ID:
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MMS_SENT_ID:
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MMS_DRAFTS_ID:
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MMS_OUTBOX_ID:
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String msgId = uri.getLastPathSegment();
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return purgeSingleEntry(Uri.withAppendedPath(Mms.CONTENT_URI, msgId));
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Implicit batch of purge, return null.
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MMS_ALL:
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MMS_CONVERSATION:
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                purgeAll();
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MMS_INBOX:
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MMS_SENT:
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MMS_DRAFTS:
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MMS_OUTBOX:
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                purgeByMessageBox(MATCH_TO_MSGBOX_ID_MAP.get(match));
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MMS_CONVERSATION_ID:
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                purgeByThreadId(ContentUris.parseId(uri));
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private PduCacheEntry purgeSingleEntry(Uri key) {
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PduCacheEntry entry = super.purge(key);
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (entry != null) {
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeFromThreads(key, entry);
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeFromMessageBoxes(key, entry);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return entry;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    synchronized public void purgeAll() {
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.purgeAll();
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMessageBoxes.clear();
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mThreads.clear();
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param uri The Uri to be normalized.
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Uri The normalized key of cached entry.
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Uri normalizeKey(Uri uri) {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int match = URI_MATCHER.match(uri);
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uri normalizedKey = null;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (match) {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MMS_ALL_ID:
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normalizedKey = uri;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MMS_INBOX_ID:
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MMS_SENT_ID:
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MMS_DRAFTS_ID:
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case MMS_OUTBOX_ID:
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String msgId = uri.getLastPathSegment();
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                normalizedKey = Uri.withAppendedPath(Mms.CONTENT_URI, msgId);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return null;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (LOCAL_LOGV) {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, uri + " -> " + normalizedKey);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return normalizedKey;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void purgeByMessageBox(Integer msgBoxId) {
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (LOCAL_LOGV) {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "Purge cache in message box: " + msgBoxId);
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (msgBoxId != null) {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            HashSet<Uri> msgBox = mMessageBoxes.remove(msgBoxId);
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (msgBox != null) {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Uri key : msgBox) {
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    PduCacheEntry entry = super.purge(key);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (entry != null) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        removeFromThreads(key, entry);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void removeFromThreads(Uri key, PduCacheEntry entry) {
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        HashSet<Uri> thread = mThreads.get(entry.getThreadId());
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (thread != null) {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            thread.remove(key);
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void purgeByThreadId(long threadId) {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (LOCAL_LOGV) {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(TAG, "Purge cache in thread: " + threadId);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        HashSet<Uri> thread = mThreads.remove(threadId);
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (thread != null) {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Uri key : thread) {
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PduCacheEntry entry = super.purge(key);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (entry != null) {
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    removeFromMessageBoxes(key, entry);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void removeFromMessageBoxes(Uri key, PduCacheEntry entry) {
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        HashSet<Uri> msgBox = mThreads.get(entry.getMessageBox());
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (msgBox != null) {
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            msgBox.remove(key);
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
244