[geary/wip/713150-conversations] Sync w/ All Mail and/or Archive when new mail is detected
- From: Jim Nelson <jnelson src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geary/wip/713150-conversations] Sync w/ All Mail and/or Archive when new mail is detected
- Date: Fri, 6 Mar 2015 23:59:41 +0000 (UTC)
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]