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