From 9a5e2a798e11b666670281d64c1039483ad60546 Mon Sep 17 00:00:00 2001 From: Marc Blank Date: Sun, 26 Feb 2012 12:24:06 -0800 Subject: [PATCH] Fix clearing of mailbox notifications Change-Id: Ieb98a8908ec067229dd449790da55085585ef17b --- .../emailcommon/provider/EmailContent.java | 11 ++++++ .../android/emailcommon/utility/Utility.java | 28 +++++++------- .../android/email/NotificationController.java | 38 +++++++++++++++---- .../email/activity/MessageListFragment.java | 3 +- .../android/email/provider/EmailProvider.java | 20 +++------- 5 files changed, 61 insertions(+), 39 deletions(-) diff --git a/emailcommon/src/com/android/emailcommon/provider/EmailContent.java b/emailcommon/src/com/android/emailcommon/provider/EmailContent.java index 99d9f032e..3dec790bc 100755 --- a/emailcommon/src/com/android/emailcommon/provider/EmailContent.java +++ b/emailcommon/src/com/android/emailcommon/provider/EmailContent.java @@ -71,6 +71,17 @@ public abstract class EmailContent { public static final Uri CONTENT_NOTIFIER_URI = Uri.parse("content://" + NOTIFIER_AUTHORITY); + public static final Uri MAILBOX_NOTIFICATION_URI = + Uri.parse("content://" + EmailContent.AUTHORITY + "/mailboxNotification"); + public static final String[] NOTIFICATION_PROJECTION = + new String[] {MailboxColumns.ID, MailboxColumns.UNREAD_COUNT, MailboxColumns.MESSAGE_COUNT}; + public static final int NOTIFICATION_MAILBOX_ID_COLUMN = 0; + public static final int NOTIFICATION_MAILBOX_UNREAD_COUNT_COLUMN = 1; + public static final int NOTIFICATION_MAILBOX_MESSAGE_COUNT_COLUMN = 2; + + public static final Uri MAILBOX_MOST_RECENT_MESSAGE_URI = + Uri.parse("content://" + EmailContent.AUTHORITY + "/mailboxMostRecentMessage"); + public static final String PROVIDER_PERMISSION = "com.android.email.permission.ACCESS_PROVIDER"; // All classes share this diff --git a/emailcommon/src/com/android/emailcommon/utility/Utility.java b/emailcommon/src/com/android/emailcommon/utility/Utility.java index fba57cc07..b74d4b3e0 100644 --- a/emailcommon/src/com/android/emailcommon/utility/Utility.java +++ b/emailcommon/src/com/android/emailcommon/utility/Utility.java @@ -52,7 +52,6 @@ import com.android.emailcommon.provider.EmailContent.AttachmentColumns; import com.android.emailcommon.provider.EmailContent.HostAuthColumns; import com.android.emailcommon.provider.EmailContent.MailboxColumns; import com.android.emailcommon.provider.EmailContent.Message; -import com.android.emailcommon.provider.EmailContent.MessageColumns; import com.android.emailcommon.provider.HostAuth; import com.android.emailcommon.provider.Mailbox; import com.android.emailcommon.provider.ProviderUnavailableException; @@ -926,27 +925,26 @@ public class Utility { // need a point at which we can compare against in the future. By setting this // value, we are claiming that every message before this has potentially been // seen by the user. - long messageId = Utility.getFirstRowLong( - context, - Message.CONTENT_URI, - EmailContent.ID_PROJECTION, - MessageColumns.MAILBOX_KEY + "=?", - new String[] { Long.toString(mailbox.mId) }, - MessageColumns.ID + " DESC", - EmailContent.ID_PROJECTION_COLUMN, 0L); - long oldLastSeenMessageId = Utility.getFirstRowLong( - context, ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailbox.mId), - new String[] { MailboxColumns.LAST_NOTIFIED_MESSAGE_KEY }, - null, null, null, 0, 0L); + long mostRecentMessageId = Utility.getFirstRowLong(context, + ContentUris.withAppendedId( + EmailContent.MAILBOX_MOST_RECENT_MESSAGE_URI, mailboxId), + Message.ID_COLUMN_PROJECTION, null, null, null, + Message.ID_MAILBOX_COLUMN_ID, -1L); + long lastNotifiedMessageId = mailbox.mLastNotifiedMessageKey; // Only update the db if the value has changed - if (messageId != oldLastSeenMessageId) { + if (mostRecentMessageId != lastNotifiedMessageId) { + Log.d(Logging.LOG_TAG, "Most recent = " + mostRecentMessageId + + ", last notified: " + lastNotifiedMessageId + + "; updating last notified"); ContentValues values = mailbox.toContentValues(); - values.put(MailboxColumns.LAST_NOTIFIED_MESSAGE_KEY, messageId); + values.put(MailboxColumns.LAST_NOTIFIED_MESSAGE_KEY, mostRecentMessageId); resolver.update( Mailbox.CONTENT_URI, values, EmailContent.ID_SELECTION, new String[] { Long.toString(mailbox.mId) }); + } else { + Log.d(Logging.LOG_TAG, "Most recent = last notified; no change"); } } } diff --git a/src/com/android/email/NotificationController.java b/src/com/android/email/NotificationController.java index 7bd334c7e..86984e2ae 100644 --- a/src/com/android/email/NotificationController.java +++ b/src/com/android/email/NotificationController.java @@ -42,7 +42,6 @@ import com.android.email.activity.ContactStatusLoader; import com.android.email.activity.Welcome; import com.android.email.activity.setup.AccountSecurity; import com.android.email.activity.setup.AccountSettings; -import com.android.email.provider.EmailProvider; import com.android.emailcommon.Logging; import com.android.emailcommon.mail.Address; import com.android.emailcommon.provider.Account; @@ -286,6 +285,24 @@ public class NotificationController { if (suspend && mailboxId != Mailbox.NO_MAILBOX) { mSuspendMailboxId = mailboxId; } + if (mailboxId == Mailbox.QUERY_ALL_INBOXES) { + // Only go onto the notification handler if we really, absolutely need to + ensureHandlerExists(); + sNotificationHandler.post(new Runnable() { + @Override + public void run() { + for (long accountId: mNotificationMap.keySet()) { + long mailboxId = + Mailbox.findMailboxOfType(mContext, accountId, Mailbox.TYPE_INBOX); + if (mailboxId != Mailbox.NO_MAILBOX) { + mNotificationManager.cancel(getNewMessageNotificationId(mailboxId)); + } + } + } + }); + } else { + mNotificationManager.cancel(getNewMessageNotificationId(mailboxId)); + } } /** @@ -695,21 +712,26 @@ public class NotificationController { ContentResolver resolver = mContext.getContentResolver(); Cursor c = resolver.query(ContentUris.withAppendedId( - EmailProvider.MAILBOX_NOTIFICATION_URI, mAccountId), - EmailProvider.NOTIFICATION_PROJECTION, null, null, null); + EmailContent.MAILBOX_NOTIFICATION_URI, mAccountId), + EmailContent.NOTIFICATION_PROJECTION, null, null, null); try { while (c.moveToNext()) { - long mailboxId = c.getLong(EmailProvider.NOTIFICATION_MAILBOX_ID_COLUMN); + long mailboxId = c.getLong(EmailContent.NOTIFICATION_MAILBOX_ID_COLUMN); int messageCount = - c.getInt(EmailProvider.NOTIFICATION_MAILBOX_MESSAGE_COUNT_COLUMN); + c.getInt(EmailContent.NOTIFICATION_MAILBOX_MESSAGE_COUNT_COLUMN); int unreadCount = - c.getInt(EmailProvider.NOTIFICATION_MAILBOX_UNREAD_COUNT_COLUMN); - System.err.println("Changes in " + c.getLong(0) + ", unread: " + unreadCount); + c.getInt(EmailContent.NOTIFICATION_MAILBOX_UNREAD_COUNT_COLUMN); + + Mailbox m = Mailbox.restoreMailboxWithId(mContext, mailboxId); long newMessageId = Utility.getFirstRowLong(mContext, ContentUris.withAppendedId( - EmailProvider.MAILBOX_MOST_RECENT_MESSAGE_URI, mailboxId), + EmailContent.MAILBOX_MOST_RECENT_MESSAGE_URI, mailboxId), Message.ID_COLUMN_PROJECTION, null, null, null, Message.ID_MAILBOX_COLUMN_ID, -1L); + // TODO: Remove debug logging + Log.d(Logging.LOG_TAG, "Changes to " + account.mDisplayName + "/" + + m.mDisplayName + ", count: " + messageCount + ", lastNotified: " + + m.mLastNotifiedMessageKey + ", mostRecent: " + newMessageId); Notification n = sInstance.createNewMessageNotification(mailboxId, newMessageId, messageCount, unreadCount); if (n != null) { diff --git a/src/com/android/email/activity/MessageListFragment.java b/src/com/android/email/activity/MessageListFragment.java index af7fa6ec4..1571d278b 100644 --- a/src/com/android/email/activity/MessageListFragment.java +++ b/src/com/android/email/activity/MessageListFragment.java @@ -69,7 +69,6 @@ import com.android.emailcommon.provider.Mailbox; import com.android.emailcommon.utility.EmailAsyncTask; import com.android.emailcommon.utility.Utility; import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.Maps; import java.util.HashMap; import java.util.Set; @@ -980,7 +979,7 @@ public class MessageListFragment extends ListFragment return; } - final HashMap setValues = Maps.newHashMap(); + final HashMap setValues = new HashMap(); boolean allWereSet = true; c.moveToPosition(-1); diff --git a/src/com/android/email/provider/EmailProvider.java b/src/com/android/email/provider/EmailProvider.java index 4d5f92b09..b3e9271d0 100644 --- a/src/com/android/email/provider/EmailProvider.java +++ b/src/com/android/email/provider/EmailProvider.java @@ -1143,11 +1143,14 @@ public class EmailProvider extends ContentProvider { c = uiQuery(match, uri, projection); return c; case UI_FOLDER_REFRESH: - return uiFolderRefresh(uri, projection); + c = uiFolderRefresh(uri, projection); + return c; case MAILBOX_NOTIFICATION: - return notificationQuery(uri); + c = notificationQuery(uri); + return c; case MAILBOX_MOST_RECENT_MESSAGE: - return mostRecentMessageQuery(uri); + c = mostRecentMessageQuery(uri); + return c; case ACCOUNT_DEFAULT_ID: // Start with a snapshot of the cache Map accountCache = mCacheAccount.getSnapshot(); @@ -1808,17 +1811,6 @@ outer: mAttachmentService = (as == null) ? DEFAULT_ATTACHMENT_SERVICE : as; } - public static final String[] NOTIFICATION_PROJECTION = - new String[] {MailboxColumns.ID, MailboxColumns.UNREAD_COUNT, MailboxColumns.MESSAGE_COUNT}; - public static final int NOTIFICATION_MAILBOX_ID_COLUMN = 0; - public static final int NOTIFICATION_MAILBOX_UNREAD_COUNT_COLUMN = 1; - public static final int NOTIFICATION_MAILBOX_MESSAGE_COUNT_COLUMN = 2; - - public static final Uri MAILBOX_NOTIFICATION_URI = - Uri.parse("content://" + EmailContent.AUTHORITY + "/mailboxNotification"); - public static final Uri MAILBOX_MOST_RECENT_MESSAGE_URI = - Uri.parse("content://" + EmailContent.AUTHORITY + "/mailboxMostRecentMessage"); - // SELECT DISTINCT Boxes._id, Boxes.unreadCount from Message, (SELECT _id, unreadCount, // messageCount, lastNotifiedMessageCount, lastNotifiedMessageKey // FROM Mailbox WHERE accountKey=6 AND syncInterval!=0 AND syncInterval!=-1) AS Boxes