[geary/wip/713150-conversations] Sync w/ All Mail and/or Archive when new mail is detected



commit cda6ce9665c8a5e345969be582c599c7a400eeb0
Author: Jim Nelson <jim yorba org>
Date:   Fri Mar 6 15:58:22 2015 -0800

    Sync w/ All Mail and/or Archive when new mail is detected
    
    This could potentially be landed as a separate commit in master; this
    helps the conversation monitor do its work better by informing it of
    "anchor" paths for newly-downloaded email.

 src/engine/api/geary-account.vala                  |   15 ++++++++-
 .../imap-engine-account-synchronizer.vala          |   33 ++++++++++++++++++++
 .../imap-engine/imap-engine-generic-account.vala   |    2 +
 3 files changed, 49 insertions(+), 1 deletions(-)
---
diff --git a/src/engine/api/geary-account.vala b/src/engine/api/geary-account.vala
index 9c1287a..f624274 100644
--- a/src/engine/api/geary-account.vala
+++ b/src/engine/api/geary-account.vala
@@ -128,11 +128,20 @@ public abstract class Geary.Account : BaseObject {
     public signal void folders_contents_altered(Gee.Collection<Geary.Folder> altered);
     
     /**
-     * Fired when emails are appended to a folder in this account.
+     * Fired when emails are appended to a { link Folder} in this account.
+     *
+     * @see Geary.Folder.email_appended
      */
     public signal void email_appended(Geary.Folder folder, Gee.Collection<Geary.EmailIdentifier> ids);
     
     /**
+     * Fired when emails are locally appended to a { link Folder} in this account.
+     *
+     * @see Geary.Folder.email_locally_appended
+     */
+    public signal void email_locally_appended(Geary.Folder folder, Gee.Collection<Geary.EmailIdentifier> 
ids);
+    
+    /**
      * Fired when emails are inserted to a folder in this account.
      *
      * @see Folder.email_inserted
@@ -189,6 +198,10 @@ public abstract class Geary.Account : BaseObject {
         email_appended(folder, ids);
     }
     
+    protected virtual void notify_email_locally_appended(Geary.Folder folder, 
Gee.Collection<Geary.EmailIdentifier> ids) {
+        email_locally_appended(folder, ids);
+    }
+    
     protected virtual void notify_email_inserted(Geary.Folder folder, Gee.Collection<Geary.EmailIdentifier> 
ids) {
         email_inserted(folder, ids);
     }
diff --git a/src/engine/imap-engine/imap-engine-account-synchronizer.vala 
b/src/engine/imap-engine/imap-engine-account-synchronizer.vala
index a6c70e6..57dadc4 100644
--- a/src/engine/imap-engine/imap-engine-account-synchronizer.vala
+++ b/src/engine/imap-engine/imap-engine-account-synchronizer.vala
@@ -31,6 +31,7 @@ private class Geary.ImapEngine.AccountSynchronizer : Geary.BaseObject {
         account.closed.connect(on_account_closed);
         account.folders_available_unavailable.connect(on_folders_available_unavailable);
         account.folders_contents_altered.connect(on_folders_contents_altered);
+        account.email_locally_appended.connect(on_new_account_email);
         account.email_sent.connect(on_email_sent);
     }
     
@@ -39,6 +40,7 @@ private class Geary.ImapEngine.AccountSynchronizer : Geary.BaseObject {
         account.closed.disconnect(on_account_closed);
         account.folders_available_unavailable.disconnect(on_folders_available_unavailable);
         account.folders_contents_altered.disconnect(on_folders_contents_altered);
+        account.email_locally_appended.disconnect(on_new_account_email);
         account.email_sent.disconnect(on_email_sent);
     }
     
@@ -112,6 +114,33 @@ private class Geary.ImapEngine.AccountSynchronizer : Geary.BaseObject {
         delayed_send_all(altered, false, SYNC_DELAY_SEC);
     }
     
+    // Called whenever a new email is added to the local store
+    private void on_new_account_email(Folder folder) {
+        // Since Drafts can come in fast-and-furious, don't adjust sync schedule when new mail is
+        // detected on that folder
+        if (folder.special_folder_type == SpecialFolderType.DRAFTS)
+            return;
+        
+        // schedule refresh of All Mail and/or Archive folder, unless this is that folder
+        if (folder.special_folder_type != SpecialFolderType.ALL_MAIL)
+            synchronize_special_folder(SpecialFolderType.ALL_MAIL);
+        
+        if (folder.special_folder_type != SpecialFolderType.ARCHIVE)
+            synchronize_special_folder(SpecialFolderType.ARCHIVE);
+    }
+    
+    private void synchronize_special_folder(SpecialFolderType special) {
+        MinimalFolder? folder = null;
+        try {
+            folder = account.get_special_folder(special) as MinimalFolder;
+        } catch (Error err) {
+            debug("Unable to get special folder type for %s: %s", account.to_string(), err.message);
+        }
+        
+        if (folder != null && !is_queued(folder))
+            delayed_send_all(iterate<Folder>(folder).to_array_list(), false, SYNC_DELAY_SEC);
+    }
+    
     private void on_email_sent() {
         try {
             Folder? sent_mail = account.get_special_folder(SpecialFolderType.SENT);
@@ -175,6 +204,10 @@ private class Geary.ImapEngine.AccountSynchronizer : Geary.BaseObject {
         }
     }
     
+    private bool is_queued(MinimalFolder folder) {
+        return bg_queue.get_all().contains(folder) || current_folder == folder;
+    }
+    
     // This is used to ensure that certain special folders get prioritized over others, so folders
     // important to the user (i.e. Inbox) go first while less-used folders (Spam) are fetched last
     private static int bg_queue_comparator(MinimalFolder a, MinimalFolder b) {
diff --git a/src/engine/imap-engine/imap-engine-generic-account.vala 
b/src/engine/imap-engine/imap-engine-generic-account.vala
index a64798e..6cfb356 100644
--- a/src/engine/imap-engine/imap-engine-generic-account.vala
+++ b/src/engine/imap-engine/imap-engine-generic-account.vala
@@ -56,6 +56,7 @@ private abstract class Geary.ImapEngine.GenericAccount : Geary.Account {
         if (available != null) {
             foreach (Geary.Folder folder in available) {
                 folder.email_appended.connect(notify_email_appended);
+                folder.email_locally_appended.connect(notify_email_locally_appended);
                 folder.email_inserted.connect(notify_email_inserted);
                 folder.email_removed.connect(notify_email_removed);
                 folder.email_locally_complete.connect(notify_email_locally_complete);
@@ -65,6 +66,7 @@ private abstract class Geary.ImapEngine.GenericAccount : Geary.Account {
         if (unavailable != null) {
             foreach (Geary.Folder folder in unavailable) {
                 folder.email_appended.disconnect(notify_email_appended);
+                folder.email_locally_appended.disconnect(notify_email_locally_appended);
                 folder.email_inserted.disconnect(notify_email_inserted);
                 folder.email_removed.disconnect(notify_email_removed);
                 folder.email_locally_complete.disconnect(notify_email_locally_complete);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]