1d02a064168ae5c916b977182b764580e601cb084Wink Saville/*
2d02a064168ae5c916b977182b764580e601cb084Wink Saville * Copyright (C) 2008 Esmertec AG.
3d02a064168ae5c916b977182b764580e601cb084Wink Saville * Copyright (C) 2008 The Android Open Source Project
4d02a064168ae5c916b977182b764580e601cb084Wink Saville *
5d02a064168ae5c916b977182b764580e601cb084Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
6d02a064168ae5c916b977182b764580e601cb084Wink Saville * you may not use this file except in compliance with the License.
7d02a064168ae5c916b977182b764580e601cb084Wink Saville * You may obtain a copy of the License at
8d02a064168ae5c916b977182b764580e601cb084Wink Saville *
9d02a064168ae5c916b977182b764580e601cb084Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
10d02a064168ae5c916b977182b764580e601cb084Wink Saville *
11d02a064168ae5c916b977182b764580e601cb084Wink Saville * Unless required by applicable law or agreed to in writing, software
12d02a064168ae5c916b977182b764580e601cb084Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
13d02a064168ae5c916b977182b764580e601cb084Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14d02a064168ae5c916b977182b764580e601cb084Wink Saville * See the License for the specific language governing permissions and
15d02a064168ae5c916b977182b764580e601cb084Wink Saville * limitations under the License.
16d02a064168ae5c916b977182b764580e601cb084Wink Saville */
17d02a064168ae5c916b977182b764580e601cb084Wink Saville
18d02a064168ae5c916b977182b764580e601cb084Wink Savillepackage com.google.android.mms.util;
19d02a064168ae5c916b977182b764580e601cb084Wink Saville
20d02a064168ae5c916b977182b764580e601cb084Wink Savilleimport android.content.ContentUris;
21d02a064168ae5c916b977182b764580e601cb084Wink Savilleimport android.content.UriMatcher;
22d02a064168ae5c916b977182b764580e601cb084Wink Savilleimport android.net.Uri;
23d02a064168ae5c916b977182b764580e601cb084Wink Savilleimport android.provider.Telephony.Mms;
24d02a064168ae5c916b977182b764580e601cb084Wink Savilleimport android.util.Log;
25d02a064168ae5c916b977182b764580e601cb084Wink Saville
26d02a064168ae5c916b977182b764580e601cb084Wink Savilleimport java.util.HashMap;
27d02a064168ae5c916b977182b764580e601cb084Wink Savilleimport java.util.HashSet;
28d02a064168ae5c916b977182b764580e601cb084Wink Saville
29d02a064168ae5c916b977182b764580e601cb084Wink Savillepublic final class PduCache extends AbstractCache<Uri, PduCacheEntry> {
30d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static final String TAG = "PduCache";
31d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static final boolean DEBUG = false;
32d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static final boolean LOCAL_LOGV = false;
33d02a064168ae5c916b977182b764580e601cb084Wink Saville
34d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static final int MMS_ALL             = 0;
35d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static final int MMS_ALL_ID          = 1;
36d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static final int MMS_INBOX           = 2;
37d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static final int MMS_INBOX_ID        = 3;
38d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static final int MMS_SENT            = 4;
39d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static final int MMS_SENT_ID         = 5;
40d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static final int MMS_DRAFTS          = 6;
41d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static final int MMS_DRAFTS_ID       = 7;
42d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static final int MMS_OUTBOX          = 8;
43d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static final int MMS_OUTBOX_ID       = 9;
44d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static final int MMS_CONVERSATION    = 10;
45d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static final int MMS_CONVERSATION_ID = 11;
46d02a064168ae5c916b977182b764580e601cb084Wink Saville
47d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static final UriMatcher URI_MATCHER;
48d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static final HashMap<Integer, Integer> MATCH_TO_MSGBOX_ID_MAP;
49d02a064168ae5c916b977182b764580e601cb084Wink Saville
50d02a064168ae5c916b977182b764580e601cb084Wink Saville    private static PduCache sInstance;
51d02a064168ae5c916b977182b764580e601cb084Wink Saville
52d02a064168ae5c916b977182b764580e601cb084Wink Saville    static {
53d02a064168ae5c916b977182b764580e601cb084Wink Saville        URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
54d02a064168ae5c916b977182b764580e601cb084Wink Saville        URI_MATCHER.addURI("mms", null,         MMS_ALL);
55d02a064168ae5c916b977182b764580e601cb084Wink Saville        URI_MATCHER.addURI("mms", "#",          MMS_ALL_ID);
56d02a064168ae5c916b977182b764580e601cb084Wink Saville        URI_MATCHER.addURI("mms", "inbox",      MMS_INBOX);
57d02a064168ae5c916b977182b764580e601cb084Wink Saville        URI_MATCHER.addURI("mms", "inbox/#",    MMS_INBOX_ID);
58d02a064168ae5c916b977182b764580e601cb084Wink Saville        URI_MATCHER.addURI("mms", "sent",       MMS_SENT);
59d02a064168ae5c916b977182b764580e601cb084Wink Saville        URI_MATCHER.addURI("mms", "sent/#",     MMS_SENT_ID);
60d02a064168ae5c916b977182b764580e601cb084Wink Saville        URI_MATCHER.addURI("mms", "drafts",     MMS_DRAFTS);
61d02a064168ae5c916b977182b764580e601cb084Wink Saville        URI_MATCHER.addURI("mms", "drafts/#",   MMS_DRAFTS_ID);
62d02a064168ae5c916b977182b764580e601cb084Wink Saville        URI_MATCHER.addURI("mms", "outbox",     MMS_OUTBOX);
63d02a064168ae5c916b977182b764580e601cb084Wink Saville        URI_MATCHER.addURI("mms", "outbox/#",   MMS_OUTBOX_ID);
64d02a064168ae5c916b977182b764580e601cb084Wink Saville        URI_MATCHER.addURI("mms-sms", "conversations",   MMS_CONVERSATION);
65d02a064168ae5c916b977182b764580e601cb084Wink Saville        URI_MATCHER.addURI("mms-sms", "conversations/#", MMS_CONVERSATION_ID);
66d02a064168ae5c916b977182b764580e601cb084Wink Saville
67d02a064168ae5c916b977182b764580e601cb084Wink Saville        MATCH_TO_MSGBOX_ID_MAP = new HashMap<Integer, Integer>();
68d02a064168ae5c916b977182b764580e601cb084Wink Saville        MATCH_TO_MSGBOX_ID_MAP.put(MMS_INBOX,  Mms.MESSAGE_BOX_INBOX);
69d02a064168ae5c916b977182b764580e601cb084Wink Saville        MATCH_TO_MSGBOX_ID_MAP.put(MMS_SENT,   Mms.MESSAGE_BOX_SENT);
70d02a064168ae5c916b977182b764580e601cb084Wink Saville        MATCH_TO_MSGBOX_ID_MAP.put(MMS_DRAFTS, Mms.MESSAGE_BOX_DRAFTS);
71d02a064168ae5c916b977182b764580e601cb084Wink Saville        MATCH_TO_MSGBOX_ID_MAP.put(MMS_OUTBOX, Mms.MESSAGE_BOX_OUTBOX);
72d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
73d02a064168ae5c916b977182b764580e601cb084Wink Saville
74d02a064168ae5c916b977182b764580e601cb084Wink Saville    private final HashMap<Integer, HashSet<Uri>> mMessageBoxes;
75d02a064168ae5c916b977182b764580e601cb084Wink Saville    private final HashMap<Long, HashSet<Uri>> mThreads;
76d02a064168ae5c916b977182b764580e601cb084Wink Saville    private final HashSet<Uri> mUpdating;
77d02a064168ae5c916b977182b764580e601cb084Wink Saville
78d02a064168ae5c916b977182b764580e601cb084Wink Saville    private PduCache() {
79d02a064168ae5c916b977182b764580e601cb084Wink Saville        mMessageBoxes = new HashMap<Integer, HashSet<Uri>>();
80d02a064168ae5c916b977182b764580e601cb084Wink Saville        mThreads = new HashMap<Long, HashSet<Uri>>();
81d02a064168ae5c916b977182b764580e601cb084Wink Saville        mUpdating = new HashSet<Uri>();
82d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
83d02a064168ae5c916b977182b764580e601cb084Wink Saville
84d02a064168ae5c916b977182b764580e601cb084Wink Saville    synchronized public static final PduCache getInstance() {
85d02a064168ae5c916b977182b764580e601cb084Wink Saville        if (sInstance == null) {
86d02a064168ae5c916b977182b764580e601cb084Wink Saville            if (LOCAL_LOGV) {
87d02a064168ae5c916b977182b764580e601cb084Wink Saville                Log.v(TAG, "Constructing new PduCache instance.");
88d02a064168ae5c916b977182b764580e601cb084Wink Saville            }
89d02a064168ae5c916b977182b764580e601cb084Wink Saville            sInstance = new PduCache();
90d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
91d02a064168ae5c916b977182b764580e601cb084Wink Saville        return sInstance;
92d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
93d02a064168ae5c916b977182b764580e601cb084Wink Saville
94d02a064168ae5c916b977182b764580e601cb084Wink Saville    @Override
95d02a064168ae5c916b977182b764580e601cb084Wink Saville    synchronized public boolean put(Uri uri, PduCacheEntry entry) {
96d02a064168ae5c916b977182b764580e601cb084Wink Saville        int msgBoxId = entry.getMessageBox();
97d02a064168ae5c916b977182b764580e601cb084Wink Saville        HashSet<Uri> msgBox = mMessageBoxes.get(msgBoxId);
98d02a064168ae5c916b977182b764580e601cb084Wink Saville        if (msgBox == null) {
99d02a064168ae5c916b977182b764580e601cb084Wink Saville            msgBox = new HashSet<Uri>();
100d02a064168ae5c916b977182b764580e601cb084Wink Saville            mMessageBoxes.put(msgBoxId, msgBox);
101d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
102d02a064168ae5c916b977182b764580e601cb084Wink Saville
103d02a064168ae5c916b977182b764580e601cb084Wink Saville        long threadId = entry.getThreadId();
104d02a064168ae5c916b977182b764580e601cb084Wink Saville        HashSet<Uri> thread = mThreads.get(threadId);
105d02a064168ae5c916b977182b764580e601cb084Wink Saville        if (thread == null) {
106d02a064168ae5c916b977182b764580e601cb084Wink Saville            thread = new HashSet<Uri>();
107d02a064168ae5c916b977182b764580e601cb084Wink Saville            mThreads.put(threadId, thread);
108d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
109d02a064168ae5c916b977182b764580e601cb084Wink Saville
110d02a064168ae5c916b977182b764580e601cb084Wink Saville        Uri finalKey = normalizeKey(uri);
111d02a064168ae5c916b977182b764580e601cb084Wink Saville        boolean result = super.put(finalKey, entry);
112d02a064168ae5c916b977182b764580e601cb084Wink Saville        if (result) {
113d02a064168ae5c916b977182b764580e601cb084Wink Saville            msgBox.add(finalKey);
114d02a064168ae5c916b977182b764580e601cb084Wink Saville            thread.add(finalKey);
115d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
116d02a064168ae5c916b977182b764580e601cb084Wink Saville        setUpdating(uri, false);
117d02a064168ae5c916b977182b764580e601cb084Wink Saville        return result;
118d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
119d02a064168ae5c916b977182b764580e601cb084Wink Saville
120d02a064168ae5c916b977182b764580e601cb084Wink Saville    synchronized public void setUpdating(Uri uri, boolean updating) {
121d02a064168ae5c916b977182b764580e601cb084Wink Saville        if (updating) {
122d02a064168ae5c916b977182b764580e601cb084Wink Saville            mUpdating.add(uri);
123d02a064168ae5c916b977182b764580e601cb084Wink Saville        } else {
124d02a064168ae5c916b977182b764580e601cb084Wink Saville            mUpdating.remove(uri);
125d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
126d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
127d02a064168ae5c916b977182b764580e601cb084Wink Saville
128d02a064168ae5c916b977182b764580e601cb084Wink Saville    synchronized public boolean isUpdating(Uri uri) {
129d02a064168ae5c916b977182b764580e601cb084Wink Saville        return mUpdating.contains(uri);
130d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
131d02a064168ae5c916b977182b764580e601cb084Wink Saville
132d02a064168ae5c916b977182b764580e601cb084Wink Saville    @Override
133d02a064168ae5c916b977182b764580e601cb084Wink Saville    synchronized public PduCacheEntry purge(Uri uri) {
134d02a064168ae5c916b977182b764580e601cb084Wink Saville        int match = URI_MATCHER.match(uri);
135d02a064168ae5c916b977182b764580e601cb084Wink Saville        switch (match) {
136d02a064168ae5c916b977182b764580e601cb084Wink Saville            case MMS_ALL_ID:
137d02a064168ae5c916b977182b764580e601cb084Wink Saville                return purgeSingleEntry(uri);
138d02a064168ae5c916b977182b764580e601cb084Wink Saville            case MMS_INBOX_ID:
139d02a064168ae5c916b977182b764580e601cb084Wink Saville            case MMS_SENT_ID:
140d02a064168ae5c916b977182b764580e601cb084Wink Saville            case MMS_DRAFTS_ID:
141d02a064168ae5c916b977182b764580e601cb084Wink Saville            case MMS_OUTBOX_ID:
142d02a064168ae5c916b977182b764580e601cb084Wink Saville                String msgId = uri.getLastPathSegment();
143d02a064168ae5c916b977182b764580e601cb084Wink Saville                return purgeSingleEntry(Uri.withAppendedPath(Mms.CONTENT_URI, msgId));
144d02a064168ae5c916b977182b764580e601cb084Wink Saville            // Implicit batch of purge, return null.
145d02a064168ae5c916b977182b764580e601cb084Wink Saville            case MMS_ALL:
146d02a064168ae5c916b977182b764580e601cb084Wink Saville            case MMS_CONVERSATION:
147d02a064168ae5c916b977182b764580e601cb084Wink Saville                purgeAll();
148d02a064168ae5c916b977182b764580e601cb084Wink Saville                return null;
149d02a064168ae5c916b977182b764580e601cb084Wink Saville            case MMS_INBOX:
150d02a064168ae5c916b977182b764580e601cb084Wink Saville            case MMS_SENT:
151d02a064168ae5c916b977182b764580e601cb084Wink Saville            case MMS_DRAFTS:
152d02a064168ae5c916b977182b764580e601cb084Wink Saville            case MMS_OUTBOX:
153d02a064168ae5c916b977182b764580e601cb084Wink Saville                purgeByMessageBox(MATCH_TO_MSGBOX_ID_MAP.get(match));
154d02a064168ae5c916b977182b764580e601cb084Wink Saville                return null;
155d02a064168ae5c916b977182b764580e601cb084Wink Saville            case MMS_CONVERSATION_ID:
156d02a064168ae5c916b977182b764580e601cb084Wink Saville                purgeByThreadId(ContentUris.parseId(uri));
157d02a064168ae5c916b977182b764580e601cb084Wink Saville                return null;
158d02a064168ae5c916b977182b764580e601cb084Wink Saville            default:
159d02a064168ae5c916b977182b764580e601cb084Wink Saville                return null;
160d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
161d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
162d02a064168ae5c916b977182b764580e601cb084Wink Saville
163d02a064168ae5c916b977182b764580e601cb084Wink Saville    private PduCacheEntry purgeSingleEntry(Uri key) {
164d02a064168ae5c916b977182b764580e601cb084Wink Saville        mUpdating.remove(key);
165d02a064168ae5c916b977182b764580e601cb084Wink Saville        PduCacheEntry entry = super.purge(key);
166d02a064168ae5c916b977182b764580e601cb084Wink Saville        if (entry != null) {
167d02a064168ae5c916b977182b764580e601cb084Wink Saville            removeFromThreads(key, entry);
168d02a064168ae5c916b977182b764580e601cb084Wink Saville            removeFromMessageBoxes(key, entry);
169d02a064168ae5c916b977182b764580e601cb084Wink Saville            return entry;
170d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
171d02a064168ae5c916b977182b764580e601cb084Wink Saville        return null;
172d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
173d02a064168ae5c916b977182b764580e601cb084Wink Saville
174d02a064168ae5c916b977182b764580e601cb084Wink Saville    @Override
175d02a064168ae5c916b977182b764580e601cb084Wink Saville    synchronized public void purgeAll() {
176d02a064168ae5c916b977182b764580e601cb084Wink Saville        super.purgeAll();
177d02a064168ae5c916b977182b764580e601cb084Wink Saville
178d02a064168ae5c916b977182b764580e601cb084Wink Saville        mMessageBoxes.clear();
179d02a064168ae5c916b977182b764580e601cb084Wink Saville        mThreads.clear();
180d02a064168ae5c916b977182b764580e601cb084Wink Saville        mUpdating.clear();
181d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
182d02a064168ae5c916b977182b764580e601cb084Wink Saville
183d02a064168ae5c916b977182b764580e601cb084Wink Saville    /**
184d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @param uri The Uri to be normalized.
185d02a064168ae5c916b977182b764580e601cb084Wink Saville     * @return Uri The normalized key of cached entry.
186d02a064168ae5c916b977182b764580e601cb084Wink Saville     */
187d02a064168ae5c916b977182b764580e601cb084Wink Saville    private Uri normalizeKey(Uri uri) {
188d02a064168ae5c916b977182b764580e601cb084Wink Saville        int match = URI_MATCHER.match(uri);
189d02a064168ae5c916b977182b764580e601cb084Wink Saville        Uri normalizedKey = null;
190d02a064168ae5c916b977182b764580e601cb084Wink Saville
191d02a064168ae5c916b977182b764580e601cb084Wink Saville        switch (match) {
192d02a064168ae5c916b977182b764580e601cb084Wink Saville            case MMS_ALL_ID:
193d02a064168ae5c916b977182b764580e601cb084Wink Saville                normalizedKey = uri;
194d02a064168ae5c916b977182b764580e601cb084Wink Saville                break;
195d02a064168ae5c916b977182b764580e601cb084Wink Saville            case MMS_INBOX_ID:
196d02a064168ae5c916b977182b764580e601cb084Wink Saville            case MMS_SENT_ID:
197d02a064168ae5c916b977182b764580e601cb084Wink Saville            case MMS_DRAFTS_ID:
198d02a064168ae5c916b977182b764580e601cb084Wink Saville            case MMS_OUTBOX_ID:
199d02a064168ae5c916b977182b764580e601cb084Wink Saville                String msgId = uri.getLastPathSegment();
200d02a064168ae5c916b977182b764580e601cb084Wink Saville                normalizedKey = Uri.withAppendedPath(Mms.CONTENT_URI, msgId);
201d02a064168ae5c916b977182b764580e601cb084Wink Saville                break;
202d02a064168ae5c916b977182b764580e601cb084Wink Saville            default:
203d02a064168ae5c916b977182b764580e601cb084Wink Saville                return null;
204d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
205d02a064168ae5c916b977182b764580e601cb084Wink Saville
206d02a064168ae5c916b977182b764580e601cb084Wink Saville        if (LOCAL_LOGV) {
207d02a064168ae5c916b977182b764580e601cb084Wink Saville            Log.v(TAG, uri + " -> " + normalizedKey);
208d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
209d02a064168ae5c916b977182b764580e601cb084Wink Saville        return normalizedKey;
210d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
211d02a064168ae5c916b977182b764580e601cb084Wink Saville
212d02a064168ae5c916b977182b764580e601cb084Wink Saville    private void purgeByMessageBox(Integer msgBoxId) {
213d02a064168ae5c916b977182b764580e601cb084Wink Saville        if (LOCAL_LOGV) {
214d02a064168ae5c916b977182b764580e601cb084Wink Saville            Log.v(TAG, "Purge cache in message box: " + msgBoxId);
215d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
216d02a064168ae5c916b977182b764580e601cb084Wink Saville
217d02a064168ae5c916b977182b764580e601cb084Wink Saville        if (msgBoxId != null) {
218d02a064168ae5c916b977182b764580e601cb084Wink Saville            HashSet<Uri> msgBox = mMessageBoxes.remove(msgBoxId);
219d02a064168ae5c916b977182b764580e601cb084Wink Saville            if (msgBox != null) {
220d02a064168ae5c916b977182b764580e601cb084Wink Saville                for (Uri key : msgBox) {
221d02a064168ae5c916b977182b764580e601cb084Wink Saville                    mUpdating.remove(key);
222d02a064168ae5c916b977182b764580e601cb084Wink Saville                    PduCacheEntry entry = super.purge(key);
223d02a064168ae5c916b977182b764580e601cb084Wink Saville                    if (entry != null) {
224d02a064168ae5c916b977182b764580e601cb084Wink Saville                        removeFromThreads(key, entry);
225d02a064168ae5c916b977182b764580e601cb084Wink Saville                    }
226d02a064168ae5c916b977182b764580e601cb084Wink Saville                }
227d02a064168ae5c916b977182b764580e601cb084Wink Saville            }
228d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
229d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
230d02a064168ae5c916b977182b764580e601cb084Wink Saville
231d02a064168ae5c916b977182b764580e601cb084Wink Saville    private void removeFromThreads(Uri key, PduCacheEntry entry) {
232d02a064168ae5c916b977182b764580e601cb084Wink Saville        HashSet<Uri> thread = mThreads.get(entry.getThreadId());
233d02a064168ae5c916b977182b764580e601cb084Wink Saville        if (thread != null) {
234d02a064168ae5c916b977182b764580e601cb084Wink Saville            thread.remove(key);
235d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
236d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
237d02a064168ae5c916b977182b764580e601cb084Wink Saville
238d02a064168ae5c916b977182b764580e601cb084Wink Saville    private void purgeByThreadId(long threadId) {
239d02a064168ae5c916b977182b764580e601cb084Wink Saville        if (LOCAL_LOGV) {
240d02a064168ae5c916b977182b764580e601cb084Wink Saville            Log.v(TAG, "Purge cache in thread: " + threadId);
241d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
242d02a064168ae5c916b977182b764580e601cb084Wink Saville
243d02a064168ae5c916b977182b764580e601cb084Wink Saville        HashSet<Uri> thread = mThreads.remove(threadId);
244d02a064168ae5c916b977182b764580e601cb084Wink Saville        if (thread != null) {
245d02a064168ae5c916b977182b764580e601cb084Wink Saville            for (Uri key : thread) {
246d02a064168ae5c916b977182b764580e601cb084Wink Saville                mUpdating.remove(key);
247d02a064168ae5c916b977182b764580e601cb084Wink Saville                PduCacheEntry entry = super.purge(key);
248d02a064168ae5c916b977182b764580e601cb084Wink Saville                if (entry != null) {
249d02a064168ae5c916b977182b764580e601cb084Wink Saville                    removeFromMessageBoxes(key, entry);
250d02a064168ae5c916b977182b764580e601cb084Wink Saville                }
251d02a064168ae5c916b977182b764580e601cb084Wink Saville            }
252d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
253d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
254d02a064168ae5c916b977182b764580e601cb084Wink Saville
255d02a064168ae5c916b977182b764580e601cb084Wink Saville    private void removeFromMessageBoxes(Uri key, PduCacheEntry entry) {
256d02a064168ae5c916b977182b764580e601cb084Wink Saville        HashSet<Uri> msgBox = mThreads.get(Long.valueOf(entry.getMessageBox()));
257d02a064168ae5c916b977182b764580e601cb084Wink Saville        if (msgBox != null) {
258d02a064168ae5c916b977182b764580e601cb084Wink Saville            msgBox.remove(key);
259d02a064168ae5c916b977182b764580e601cb084Wink Saville        }
260d02a064168ae5c916b977182b764580e601cb084Wink Saville    }
261d02a064168ae5c916b977182b764580e601cb084Wink Saville}
262