diff --git a/src/com/fsck/k9/controller/MessagingController.java b/src/com/fsck/k9/controller/MessagingController.java index 960378779..1242d843d 100644 --- a/src/com/fsck/k9/controller/MessagingController.java +++ b/src/com/fsck/k9/controller/MessagingController.java @@ -971,10 +971,7 @@ public class MessagingController implements Runnable { */ int newMessages = downloadMessages(account, remoteFolder, localFolder, remoteMessages, false); - int unreadMessageCount = setLocalUnreadCountToRemote(localFolder, remoteFolder, newMessages); - setLocalFlaggedCountToRemote(localFolder, remoteFolder); - - + int unreadMessageCount = localFolder.getUnreadMessageCount(); for (MessagingListener l : getListeners()) { l.folderStatusChanged(account, folder, unreadMessageCount); } @@ -1070,38 +1067,6 @@ public class MessagingController implements Runnable { } return true; } - private int setLocalUnreadCountToRemote(LocalFolder localFolder, Folder remoteFolder, int newMessageCount) throws MessagingException { - int remoteUnreadMessageCount = remoteFolder.getUnreadMessageCount(); - if (remoteUnreadMessageCount != -1) { - localFolder.setUnreadMessageCount(remoteUnreadMessageCount); - } else { - int unreadCount = 0; - Message[] messages = localFolder.getMessages(null, false); - for (Message message : messages) { - if (!message.isSet(Flag.SEEN) && !message.isSet(Flag.DELETED)) { - unreadCount++; - } - } - localFolder.setUnreadMessageCount(unreadCount); - } - return localFolder.getUnreadMessageCount(); - } - - private void setLocalFlaggedCountToRemote(LocalFolder localFolder, Folder remoteFolder) throws MessagingException { - int remoteFlaggedMessageCount = remoteFolder.getFlaggedMessageCount(); - if (remoteFlaggedMessageCount != -1) { - localFolder.setFlaggedMessageCount(remoteFlaggedMessageCount); - } else { - int flaggedCount = 0; - Message[] messages = localFolder.getMessages(null, false); - for (Message message : messages) { - if (message.isSet(Flag.FLAGGED) && !message.isSet(Flag.DELETED)) { - flaggedCount++; - } - } - localFolder.setFlaggedMessageCount(flaggedCount); - } - } /** * Fetches the messages described by inputMessages from the remote store and writes them to @@ -2453,7 +2418,7 @@ public class MessagingController implements Runnable { } } } - localFolder.setUnreadMessageCount(0); + for (MessagingListener l : getListeners()) { l.folderStatusChanged(account, folder, 0); } @@ -3947,8 +3912,6 @@ public class MessagingController implements Runnable { localFolder = (LocalFolder) localStore.getFolder(account.getTrashFolderName()); localFolder.open(OpenMode.READ_WRITE); localFolder.setFlags(new Flag[] { Flag.DELETED }, true); - localFolder.setUnreadMessageCount(0); - localFolder.setFlaggedMessageCount(0); for (MessagingListener l : getListeners()) { l.emptyTrashCompleted(account); @@ -4797,9 +4760,8 @@ public class MessagingController implements Runnable { account.setRingNotified(false); int newCount = downloadMessages(account, remoteFolder, localFolder, messages, flagSyncOnly); - int unreadMessageCount = setLocalUnreadCountToRemote(localFolder, remoteFolder, messages.size()); - setLocalFlaggedCountToRemote(localFolder, remoteFolder); + int unreadMessageCount = localFolder.getUnreadMessageCount(); localFolder.setLastPush(System.currentTimeMillis()); localFolder.setStatus(null); diff --git a/src/com/fsck/k9/mail/store/LocalStore.java b/src/com/fsck/k9/mail/store/LocalStore.java index 1466936c4..9b4e2562a 100644 --- a/src/com/fsck/k9/mail/store/LocalStore.java +++ b/src/com/fsck/k9/mail/store/LocalStore.java @@ -38,7 +38,6 @@ import android.net.Uri; import android.util.Log; import com.fsck.k9.Account; -import com.fsck.k9.AccountStats; import com.fsck.k9.K9; import com.fsck.k9.Preferences; import com.fsck.k9.R; @@ -703,81 +702,6 @@ public class LocalStore extends Store implements Serializable { }); } - public void getMessageCounts(final AccountStats stats) throws MessagingException { - final Account.FolderMode displayMode = mAccount.getFolderDisplayMode(); - - database.execute(false, new DbCallback() { - @Override - public Integer doDbWork(final SQLiteDatabase db) { - Cursor cursor = null; - try { - // Always count messages in the INBOX but exclude special folders and possibly - // more (depending on the folder display mode) - String baseQuery = "SELECT SUM(unread_count), SUM(flagged_count) " + - "FROM folders " + - "WHERE (name = ?)" + /* INBOX */ - " OR (" + - "name NOT IN (?, ?, ?, ?, ?)" + /* special folders */ - "%s)"; /* placeholder for additional constraints */ - - List queryParam = new ArrayList(); - queryParam.add(mAccount.getInboxFolderName()); - - queryParam.add((mAccount.getTrashFolderName() != null) ? - mAccount.getTrashFolderName() : ""); - queryParam.add((mAccount.getDraftsFolderName() != null) ? - mAccount.getDraftsFolderName() : ""); - queryParam.add((mAccount.getSpamFolderName() != null) ? - mAccount.getSpamFolderName() : ""); - queryParam.add((mAccount.getOutboxFolderName() != null) ? - mAccount.getOutboxFolderName() : ""); - queryParam.add((mAccount.getSentFolderName() != null) ? - mAccount.getSentFolderName() : ""); - - final String extraWhere; - switch (displayMode) { - case FIRST_CLASS: - // Count messages in the INBOX and non-special first class folders - extraWhere = " AND (display_class = ?)"; - queryParam.add(Folder.FolderClass.FIRST_CLASS.name()); - break; - case FIRST_AND_SECOND_CLASS: - // Count messages in the INBOX and non-special first and second class folders - extraWhere = " AND (display_class IN (?, ?))"; - queryParam.add(Folder.FolderClass.FIRST_CLASS.name()); - queryParam.add(Folder.FolderClass.SECOND_CLASS.name()); - break; - case NOT_SECOND_CLASS: - // Count messages in the INBOX and non-special non-second-class folders - extraWhere = " AND (display_class != ?)"; - queryParam.add(Folder.FolderClass.SECOND_CLASS.name()); - break; - case ALL: - // Count messages in the INBOX and non-special folders - extraWhere = ""; - break; - default: - Log.e(K9.LOG_TAG, "asked to compute account statistics for an impossible folder mode " + displayMode); - stats.unreadMessageCount = 0; - stats.flaggedMessageCount = 0; - return null; - } - - String query = String.format(Locale.US, baseQuery, extraWhere); - cursor = db.rawQuery(query, queryParam.toArray(EMPTY_STRING_ARRAY)); - - cursor.moveToFirst(); - stats.unreadMessageCount = cursor.getInt(0); - stats.flaggedMessageCount = cursor.getInt(1); - return null; - } finally { - Utility.closeQuietly(cursor); - } - } - }); - } - - public int getFolderCount() throws MessagingException { return database.execute(false, new DbCallback() { @Override @@ -1493,8 +1417,36 @@ public class LocalStore extends Store implements Serializable { @Override public int getUnreadMessageCount() throws MessagingException { - open(OpenMode.READ_WRITE); - return mUnreadMessageCount; + if (!isOpen()) { + // open() sums up the number of unread messages in the database + open(OpenMode.READ_WRITE); + return mUnreadMessageCount; + } + + // Folder was already opened. Unread count might be outdated so query the database now. + try { + return database.execute(false, new DbCallback() { + @Override + public Integer doDbWork(final SQLiteDatabase db) throws WrappedException { + int unreadMessageCount = 0; + Cursor cursor = db.query("messages", new String[] { "SUM(read=0)" }, + "folder_id = ? AND (empty IS NULL OR empty != 1) AND deleted = 0", + new String[] { Long.toString(mFolderId) }, null, null, null); + + try { + if (cursor.moveToFirst()) { + unreadMessageCount = cursor.getInt(0); + } + } finally { + cursor.close(); + } + + return unreadMessageCount; + } + }); + } catch (WrappedException e) { + throw(MessagingException) e.getCause(); + } } @Override @@ -1503,16 +1455,6 @@ public class LocalStore extends Store implements Serializable { return mFlaggedMessageCount; } - public void setUnreadMessageCount(final int unreadMessageCount) throws MessagingException { - mUnreadMessageCount = Math.max(0, unreadMessageCount); - updateFolderColumn("unread_count", mUnreadMessageCount); - } - - public void setFlaggedMessageCount(final int flaggedMessageCount) throws MessagingException { - mFlaggedMessageCount = Math.max(0, flaggedMessageCount); - updateFolderColumn("flagged_count", mFlaggedMessageCount); - } - @Override public void setLastChecked(final long lastChecked) throws MessagingException { try { @@ -2152,16 +2094,6 @@ public class LocalStore extends Store implements Serializable { for (Message message : msgs) { LocalMessage lMessage = (LocalMessage)message; - if (!message.isSet(Flag.SEEN)) { - setUnreadMessageCount(getUnreadMessageCount() - 1); - lDestFolder.setUnreadMessageCount(lDestFolder.getUnreadMessageCount() + 1); - } - - if (message.isSet(Flag.FLAGGED)) { - setFlaggedMessageCount(getFlaggedMessageCount() - 1); - lDestFolder.setFlaggedMessageCount(lDestFolder.getFlaggedMessageCount() + 1); - } - String oldUID = message.getUid(); if (K9.DEBUG) { @@ -2476,13 +2408,6 @@ public class LocalStore extends Store implements Serializable { if (oldMessage != null) { oldMessageId = oldMessage.getId(); - - if (!oldMessage.isSet(Flag.SEEN)) { - setUnreadMessageCount(getUnreadMessageCount() - 1); - } - if (oldMessage.isSet(Flag.FLAGGED)) { - setFlaggedMessageCount(getFlaggedMessageCount() - 1); - } } deleteAttachments(message.getUid()); @@ -2576,12 +2501,6 @@ public class LocalStore extends Store implements Serializable { saveAttachment(messageUid, attachment, copy); } saveHeaders(messageUid, (MimeMessage)message); - if (!message.isSet(Flag.SEEN)) { - setUnreadMessageCount(getUnreadMessageCount() + 1); - } - if (message.isSet(Flag.FLAGGED)) { - setFlaggedMessageCount(getFlaggedMessageCount() + 1); - } } catch (Exception e) { throw new MessagingException("Error appending message", e); } @@ -2996,7 +2915,6 @@ public class LocalStore extends Store implements Serializable { return null; } }); - resetUnreadAndFlaggedCounts(); notifyChange(); } @@ -3026,27 +2944,6 @@ public class LocalStore extends Store implements Serializable { setVisibleLimit(mAccount.getDisplayCount()); } - public void resetUnreadAndFlaggedCounts() { - try { - int newUnread = 0; - int newFlagged = 0; - Message[] messages = getMessages(null); - for (Message message : messages) { - if (!message.isSet(Flag.SEEN)) { - newUnread++; - } - if (message.isSet(Flag.FLAGGED)) { - newFlagged++; - } - } - setUnreadMessageCount(newUnread); - setFlaggedMessageCount(newFlagged); - } catch (Exception e) { - Log.e(K9.LOG_TAG, "Unable to fetch all messages from LocalStore", e); - } - } - - @Override public void delete(final boolean recurse) throws MessagingException { try { @@ -3711,9 +3608,6 @@ public class LocalStore extends Store implements Serializable { delete(); } - updateFolderCountsOnFlag(flag, set); - - LocalMessage.super.setFlag(flag, set); } catch (MessagingException e) { throw new WrappedException(e); @@ -3812,7 +3706,6 @@ public class LocalStore extends Store implements Serializable { try { LocalFolder localFolder = (LocalFolder) mFolder; - updateFolderCountsOnFlag(Flag.X_DESTROYED, true); localFolder.deleteAttachments(mId); String id = Long.toString(mId); @@ -3919,39 +3812,6 @@ public class LocalStore extends Store implements Serializable { notifyChange(); } - private void updateFolderCountsOnFlag(Flag flag, boolean set) { - /* - * Update the unread count on the folder. - */ - try { - LocalFolder folder = (LocalFolder)mFolder; - if (flag == Flag.DELETED || flag == Flag.X_DESTROYED) { - if (!isSet(Flag.SEEN)) { - folder.setUnreadMessageCount(folder.getUnreadMessageCount() + (set ? -1 : 1)); - } - if (isSet(Flag.FLAGGED)) { - folder.setFlaggedMessageCount(folder.getFlaggedMessageCount() + (set ? -1 : 1)); - } - } - - - if (!isSet(Flag.DELETED)) { - - if (flag == Flag.SEEN && set != isSet(Flag.SEEN)) { - folder.setUnreadMessageCount(folder.getUnreadMessageCount() + (set ? -1 : 1)); - } - - if (flag == Flag.FLAGGED) { - folder.setFlaggedMessageCount(folder.getFlaggedMessageCount() + (set ? 1 : -1)); - } - } - } catch (MessagingException me) { - Log.e(K9.LOG_TAG, "Unable to update LocalStore unread message count", - me); - throw new RuntimeException(me); - } - } - private void loadHeaders() throws UnavailableStorageException { ArrayList messages = new ArrayList(); messages.add(this); diff --git a/src/com/fsck/k9/provider/UnreadWidgetProvider.java b/src/com/fsck/k9/provider/UnreadWidgetProvider.java index 75acd1073..2d904f1f9 100644 --- a/src/com/fsck/k9/provider/UnreadWidgetProvider.java +++ b/src/com/fsck/k9/provider/UnreadWidgetProvider.java @@ -55,8 +55,7 @@ public class UnreadWidgetProvider extends AppWidgetProvider { try { Account account = Preferences.getPreferences(context).getAccount(accountUuid); if (account != null) { - AccountStats stats = new AccountStats(); - account.getLocalStore().getMessageCounts(stats); + AccountStats stats = account.getStats(context); unreadCount = stats.unreadMessageCount; accountName = account.getDescription(); if (K9.FOLDER_NONE.equals(account.getAutoExpandFolderName())) {