1
0
mirror of https://github.com/moparisthebest/k-9 synced 2024-11-24 02:12:15 -05:00

Prevent new mail notifications if they're older than our most recent message.

First attempt at fixing Issue 1276.  Only works with services that use numeric message IDs, like IMAP.
This commit is contained in:
Andrew Chen 2011-01-02 09:01:23 +00:00
parent fe724c8c79
commit e794af0bbf
2 changed files with 76 additions and 16 deletions

View File

@ -431,7 +431,6 @@ public class MessagingController implements Runnable
* TODO this needs to cache the remote folder list * TODO this needs to cache the remote folder list
* *
* @param account * @param account
* @param includeRemote
* @param listener * @param listener
* @throws MessagingException * @throws MessagingException
*/ */
@ -456,7 +455,6 @@ public class MessagingController implements Runnable
* TODO this needs to cache the remote folder list * TODO this needs to cache the remote folder list
* *
* @param account * @param account
* @param includeRemote
* @param listener * @param listener
* @throws MessagingException * @throws MessagingException
*/ */
@ -733,12 +731,6 @@ public class MessagingController implements Runnable
/** /**
* Find all messages in any local account which match the query 'query' * Find all messages in any local account which match the query 'query'
* @param folderNames TODO
* @param query
* @param listener
* @param searchAccounts TODO
* @param account TODO
* @param account
* @throws MessagingException * @throws MessagingException
*/ */
public void searchLocalMessages(final String[] accountUuids, final String[] folderNames, final Message[] messages, final String query, final boolean integrate, public void searchLocalMessages(final String[] accountUuids, final String[] folderNames, final Message[] messages, final String query, final boolean integrate,
@ -1069,6 +1061,7 @@ public class MessagingController implements Runnable
tLocalFolder = localStore.getFolder(folder); tLocalFolder = localStore.getFolder(folder);
final LocalFolder localFolder = tLocalFolder; final LocalFolder localFolder = tLocalFolder;
localFolder.open(OpenMode.READ_WRITE); localFolder.open(OpenMode.READ_WRITE);
localFolder.updateLastUid();
Message[] localMessages = localFolder.getMessages(null); Message[] localMessages = localFolder.getMessages(null);
HashMap<String, Message> localUidMap = new HashMap<String, Message>(); HashMap<String, Message> localUidMap = new HashMap<String, Message>();
for (Message message : localMessages) for (Message message : localMessages)
@ -1878,7 +1871,7 @@ public class MessagingController implements Runnable
} }
// Send a notification of this message // Send a notification of this message
if (shouldNotifyForMessage(account, message)) if (shouldNotifyForMessage(account, localFolder, message))
{ {
newMessages.incrementAndGet(); newMessages.incrementAndGet();
notifyAccount(mApplication, account, message, unreadBeforeStart, newMessages); notifyAccount(mApplication, account, message, unreadBeforeStart, newMessages);
@ -2023,7 +2016,7 @@ public class MessagingController implements Runnable
} }
// Send a notification of this message // Send a notification of this message
if (shouldNotifyForMessage(account, message)) if (shouldNotifyForMessage(account, localFolder, message))
{ {
newMessages.incrementAndGet(); newMessages.incrementAndGet();
notifyAccount(mApplication, account, message, unreadBeforeStart, newMessages); notifyAccount(mApplication, account, message, unreadBeforeStart, newMessages);
@ -3574,7 +3567,6 @@ public class MessagingController implements Runnable
/** /**
* Attempt to send any messages that are sitting in the Outbox. * Attempt to send any messages that are sitting in the Outbox.
* @param account * @param account
* @param listener
*/ */
public void sendPendingMessagesSynchronous(final Account account) public void sendPendingMessagesSynchronous(final Account account)
{ {
@ -4652,7 +4644,7 @@ public class MessagingController implements Runnable
} }
private boolean shouldNotifyForMessage(Account account, Message message) private boolean shouldNotifyForMessage(Account account, LocalFolder localFolder, Message message)
{ {
// Do not notify if the user does not have notifications // Do not notify if the user does not have notifications
// enabled or if the message has been read // enabled or if the message has been read
@ -4661,7 +4653,6 @@ public class MessagingController implements Runnable
return false; return false;
} }
Folder folder = message.getFolder(); Folder folder = message.getFolder();
if (folder != null) if (folder != null)
{ {
@ -4677,6 +4668,24 @@ public class MessagingController implements Runnable
} }
} }
if (message.getUid() != null && localFolder.getLastUid() != null)
{
try
{
Integer messageUid = Integer.parseInt(message.getUid());
if (messageUid <= localFolder.getLastUid())
{
if(K9.DEBUG)
Log.d(K9.LOG_TAG, "Message uid is " + messageUid + ", max message uid is " + localFolder.getLastUid() + ". Skipping notification.");
return false;
}
}
catch (NumberFormatException e)
{
// Nothing to be done here.
}
}
return true; return true;
} }
@ -4786,7 +4795,7 @@ public class MessagingController implements Runnable
/** /**
* @param notification * @param notification
* Object to configure. Never <code>null</code>. * Object to configure. Never <code>null</code>.
* @param rintone * @param ringtone
* String name of ringtone. <code>null</code> if no ringtone should be played * String name of ringtone. <code>null</code> if no ringtone should be played
* @param vibrationPattern * @param vibrationPattern
* <code>long[]</code> vibration pattern. <code>null</code> if no vibration should be played * <code>long[]</code> vibration pattern. <code>null</code> if no vibration should be played
@ -4852,7 +4861,12 @@ public class MessagingController implements Runnable
notifMgr.cancel(-1000 - account.getAccountNumber()); notifMgr.cancel(-1000 - account.getAccountNumber());
} }
/**
* Save a draft message.
* @param account Account we are saving for.
* @param message Message to save.
* @return Message representing the entry in the local store.
*/
public Message saveDraft(final Account account, final Message message) public Message saveDraft(final Account account, final Message message)
{ {
Message localMessage = null; Message localMessage = null;
@ -4861,10 +4875,12 @@ public class MessagingController implements Runnable
LocalStore localStore = account.getLocalStore(); LocalStore localStore = account.getLocalStore();
LocalFolder localFolder = localStore.getFolder(account.getDraftsFolderName()); LocalFolder localFolder = localStore.getFolder(account.getDraftsFolderName());
localFolder.open(OpenMode.READ_WRITE); localFolder.open(OpenMode.READ_WRITE);
// Save the message to the store.
localFolder.appendMessages(new Message[] localFolder.appendMessages(new Message[]
{ {
message message
}); });
// Fetch the message back from the store. This is the Message that's returned to the caller.
localMessage = localFolder.getMessage(message.getUid()); localMessage = localFolder.getMessage(message.getUid());
localMessage.setFlag(Flag.X_DOWNLOADED_FULL, true); localMessage.setFlag(Flag.X_DOWNLOADED_FULL, true);

View File

@ -1068,7 +1068,9 @@ public class LocalStore extends Store implements Serializable
private String prefId = null; private String prefId = null;
private String mPushState = null; private String mPushState = null;
private boolean mIntegrate = false; private boolean mIntegrate = false;
// mLastUid is used during syncs. It holds the highest UID within the local folder so we
// know whether or not an unread message added to the local folder is actually "new" or not.
private Integer mLastUid = null;
public LocalFolder(String name) public LocalFolder(String name)
{ {
@ -5301,6 +5303,48 @@ public class LocalStore extends Store implements Serializable
{ {
this.inTopGroup = inTopGroup; this.inTopGroup = inTopGroup;
} }
public Integer getLastUid()
{
return mLastUid;
}
public void updateLastUid() throws MessagingException
{
Integer lastUid = database.execute(false, new DbCallback<Integer>()
{
@Override
public Integer doDbWork(final SQLiteDatabase db)
{
Cursor cursor = null;
try
{
open(OpenMode.READ_ONLY);
cursor = db.rawQuery("SELECT MAX(uid) FROM messages WHERE folder_id=?", new String[] { Long.toString(mFolderId) });
if (cursor.getCount() > 0)
{
cursor.moveToFirst();
return cursor.getInt(0);
}
}
catch (Exception e)
{
Log.e(K9.LOG_TAG, "Unable to updateLastUid: ", e);
}
finally
{
if (cursor != null)
{
cursor.close();
}
}
return null;
}
});
if(K9.DEBUG)
Log.d(K9.LOG_TAG, "Updated last UID for folder " + mName + " to " + lastUid);
mLastUid = lastUid;
}
} }
public static class LocalTextBody extends TextBody public static class LocalTextBody extends TextBody