From fc0dae9cd74d6edb22464f3a0721a82f0b5f9893 Mon Sep 17 00:00:00 2001 From: Yu Ping Hu Date: Wed, 6 Mar 2013 14:34:18 -0800 Subject: [PATCH] When folder is changed, also update conversation list. Also add the folder's total count to the extras for the conversation list cursor. BUG: 7480726 Change-Id: I3215fed561deb8430fd6d6c680bdb44ca87cc162 --- .../android/email/provider/EmailProvider.java | 47 +++++++++++++++---- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/src/com/android/email/provider/EmailProvider.java b/src/com/android/email/provider/EmailProvider.java index ae03e7d39..2e4585f11 100644 --- a/src/com/android/email/provider/EmailProvider.java +++ b/src/com/android/email/provider/EmailProvider.java @@ -769,8 +769,7 @@ public class EmailProvider extends ContentProvider { notifyUI(UIPROVIDER_ACCOUNT_NOTIFIER, id); resolver.notifyChange(UIPROVIDER_ALL_ACCOUNTS_NOTIFIER, null); } else if (match == MAILBOX_ID) { - notifyUI(UIPROVIDER_FOLDER_NOTIFIER, id); - notifyUI(UIPROVIDER_FOLDERLIST_NOTIFIER, id); + notifyUIFolder(id, null); } else if (match == ATTACHMENT_ID) { notifyUI(UIPROVIDER_ATTACHMENT_NOTIFIER, id); } @@ -1850,8 +1849,8 @@ outer: } } } else if (match == MAILBOX_ID && values.containsKey(Mailbox.UI_SYNC_STATUS)) { - notifyUI(UIPROVIDER_FOLDER_NOTIFIER, id); - notifyUI(UIPROVIDER_FOLDERLIST_NOTIFIER, id); + // TODO: should this notify on keys other than sync status? + notifyUIFolder(id, null); } else if (match == ACCOUNT_ID) { // Notify individual account and "all accounts" notifyUI(UIPROVIDER_ACCOUNT_NOTIFIER, id); @@ -3323,6 +3322,7 @@ outer: mExtras.putInt(UIProvider.CursorExtraKeys.EXTRA_ERROR, mailbox.mUiLastSyncResult); } + mExtras.putInt(UIProvider.CursorExtraKeys.EXTRA_TOTAL_COUNT, mailbox.mTotalCount); } } @@ -4274,8 +4274,7 @@ outer: if (mailbox.mType == Mailbox.TYPE_TRASH || mailbox.mType == Mailbox.TYPE_DRAFTS) { // We actually delete these, including attachments AttachmentUtilities.deleteAllAttachmentFiles(context, msg.mAccountKey, msg.mId); - notifyUI(UIPROVIDER_FOLDER_NOTIFIER, mailbox.mId); - notifyUI(UIPROVIDER_FOLDERLIST_NOTIFIER, mailbox.mAccountKey); + notifyUIFolder(mailbox.mId, mailbox.mAccountKey); return context.getContentResolver().delete( ContentUris.withAppendedId(Message.SYNCED_CONTENT_URI, msg.mId), null, null); } @@ -4286,8 +4285,7 @@ outer: } ContentValues values = new ContentValues(); values.put(MessageColumns.MAILBOX_KEY, trashMailbox.mId); - notifyUI(UIPROVIDER_FOLDER_NOTIFIER, mailbox.mId); - notifyUI(UIPROVIDER_FOLDERLIST_NOTIFIER, mailbox.mId); + notifyUIFolder(mailbox.mId, mailbox.mAccountKey); return uiUpdateMessage(uri, values, true); } @@ -4391,6 +4389,36 @@ outer: notifyUI(UIPROVIDER_ALL_ACCOUNTS_NOTIFIER, null); } + /** + * Notify about a folder update. Because folder changes can affect the conversation cursor's + * extras, the conversation must also be notified here. + * @param folderId the folder id to be notified + * @param accountId the account id to be notified (for folder list notification); if null, then + * lookup the accountId from the folder. + */ + private void notifyUIFolder(String folderId, String accountId) { + notifyUI(UIPROVIDER_CONVERSATION_NOTIFIER, folderId); + notifyUI(UIPROVIDER_FOLDER_NOTIFIER, folderId); + if (accountId == null) { + try { + final Mailbox mailbox = Mailbox.restoreMailboxWithId(getContext(), + Long.parseLong(folderId)); + if (mailbox != null) { + accountId = Long.toString(mailbox.mAccountKey); + } + } catch (NumberFormatException e) { + // Bad folderId, so we can't lookup account. + } + } + if (accountId != null) { + notifyUI(UIPROVIDER_FOLDERLIST_NOTIFIER, accountId); + } + } + + private void notifyUIFolder(long folderId, long accountId) { + notifyUIFolder(Long.toString(folderId), Long.toString(accountId)); + } + private void notifyUI(Uri uri, String id) { final Uri notifyUri = (id != null) ? uri.buildUpon().appendPath(id).build() : uri; getContext().getContentResolver().notifyChange(notifyUri, null); @@ -4526,8 +4554,7 @@ outer: mSearchParams.mTotalCount = service.searchMessages(accountId, mSearchParams, searchMailboxId); //Log.d(TAG, "TotalCount to UI: " + mSearchParams.mTotalCount); - notifyUI(UIPROVIDER_FOLDER_NOTIFIER, searchMailboxId); - notifyUI(UIPROVIDER_FOLDERLIST_NOTIFIER, accountId); + notifyUIFolder(searchMailboxId, accountId); } catch (RemoteException e) { Log.e("searchMessages", "RemoteException", e); }