From 35733b0d9b2d3d66734e8ce01a7f5f60f95a8755 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Thu, 14 Sep 2023 17:56:01 +0200 Subject: [PATCH 1/5] Allow donating a message to elementary --- src/MainWindow.vala | 19 +++++-- src/MessageList/MessageListItem.vala | 82 ++++++++++++++++++++++++++++ src/Utils.vala | 23 ++++++++ 3 files changed, 119 insertions(+), 5 deletions(-) diff --git a/src/MainWindow.vala b/src/MainWindow.vala index e391d3825..51fa6adab 100644 --- a/src/MainWindow.vala +++ b/src/MainWindow.vala @@ -24,7 +24,7 @@ public class Mail.MainWindow : Hdy.ApplicationWindow { private FoldersListView folders_list_view; private Granite.Widgets.Toast move_toast; - private Granite.Widgets.Toast error_toast; + private Granite.Widgets.Toast info_toast; private ConversationList conversation_list; private MessageList message_list; @@ -128,9 +128,9 @@ public class Mail.MainWindow : Hdy.ApplicationWindow { MoveOperation.undo_last_move (); }); - error_toast = new Granite.Widgets.Toast (""); - error_toast.show_all (); - view_overlay.add_overlay (error_toast); + info_toast = new Granite.Widgets.Toast (""); + info_toast.show_all (); + view_overlay.add_overlay (info_toast); var message_overlay = new Granite.Widgets.OverlayBar (view_overlay); message_overlay.no_show_all = true; @@ -344,7 +344,7 @@ public class Mail.MainWindow : Hdy.ApplicationWindow { return (SimpleAction) lookup_action (name); } - public static void send_error_message (string title, string description, string? icon_name = null) { + public static void send_error_message (string title, string description, string? icon_name = null, string? error_details = null) { var dialog = new Granite.MessageDialog ( title, description, @@ -359,10 +359,19 @@ public class Mail.MainWindow : Hdy.ApplicationWindow { dialog.badge_icon = new ThemedIcon ("dialog-error"); } + if (error_details != null) { + dialog.show_error_details (error_details); + } + dialog.present (); dialog.response.connect (dialog.destroy); } + public void send_info_toast (string title) { + info_toast.title = title; + info_toast.send_notification (); + } + public override bool configure_event (Gdk.EventConfigure event) { if (configure_id != 0) { GLib.Source.remove (configure_id); diff --git a/src/MessageList/MessageListItem.vala b/src/MessageList/MessageListItem.vala index 188fe1284..f1517acaa 100644 --- a/src/MessageList/MessageListItem.vala +++ b/src/MessageList/MessageListItem.vala @@ -316,11 +316,24 @@ public class Mail.MessageListItem : Gtk.ListBoxRow { loaded = true; }); + var donate_label = new Gtk.Label (_("The message isn't displayed correctly?") + " "); + var donate_link = new Gtk.LinkButton.with_label ("", _("Donate it to elementary for debugging purposes.")); + + var donate_box = new Gtk.Box (HORIZONTAL, 0) { + margin_start = 12, + margin_end = 12, + margin_bottom = 12, + margin_top = 12 + }; + donate_box.add (donate_label); + donate_box.add (donate_link); + var secondary_box = new Gtk.Box (VERTICAL, 0); secondary_box.add (separator); secondary_box.add (calendar_info_bar); secondary_box.add (blocked_images_infobar); secondary_box.add (web_view); + secondary_box.add (donate_box); secondary_revealer = new Gtk.Revealer () { transition_type = SLIDE_UP @@ -360,6 +373,8 @@ public class Mail.MessageListItem : Gtk.ListBoxRow { }); } + donate_link.activate_link.connect (ask_donate_message); + /* Override default handler to stop event propagation. Otherwise clicking the menu will expand or collapse the MessageListItem. */ actions_menu_button.button_release_event.connect ((event) => { @@ -456,6 +471,73 @@ public class Mail.MessageListItem : Gtk.ListBoxRow { } } + private bool ask_donate_message () { + var dialog = new Granite.MessageDialog ( + _("Donate message to elementary?"), + _("elementary staff will be able to read the contents of the message as well as your e-mail address."), + new ThemedIcon ("dialog-information") + ); + var button = dialog.add_button (_("Donate"), Gtk.ResponseType.ACCEPT); + button.get_style_context ().add_class (Gtk.STYLE_CLASS_SUGGESTED_ACTION); + + dialog.response.connect ((res) => { + if (res == Gtk.ResponseType.ACCEPT) { + donate_message.begin (); + } + + dialog.destroy (); + }); + + dialog.present (); + + return true; // Only to stop other handlers from being invoked for the LinkButton + } + + private async void donate_message () { + var folder = message_info.summary.folder; + Camel.MimeMessage? donation_message = null; + try { + donation_message = yield folder.get_message (message_info.uid, GLib.Priority.DEFAULT, null); + } catch (Error e) { + MainWindow.send_error_message ( + _("Failed to donate message"), + _("Could not get mime message."), + null, + e.message + ); + return; + } + + var from_address = Utils.get_sender_from_message (donation_message); + if (from_address == null) { + MainWindow.send_error_message ( + _("Failed to donate message"), + _("No sender address found.") + ); + return; + } + + var from = new Camel.InternetAddress (); + from.unformat (from_address); + donation_message.set_from (from); + + var to = new Camel.InternetAddress (); + to.unformat ("leolost@gmx.net"); + donation_message.set_recipients (Camel.RECIPIENT_TYPE_TO, to); + + try { + yield Backend.Session.get_default ().send_email (donation_message, from, to); + ((MainWindow) get_toplevel ()).send_info_toast (_("Message donated.")); + } catch (Error e) { + MainWindow.send_error_message ( + _("Failed to donate message"), + _("Could not send message."), + null, + e.message + ); + } + } + private void on_mouse_target_changed (WebKit.WebView web_view, WebKit.HitTestResult hit_test, uint mods) { var message_list = (MessageList) get_ancestor (typeof (MessageList)); if (hit_test.context_is_link ()) { diff --git a/src/Utils.vala b/src/Utils.vala index 5e4d03efe..c180e422a 100644 --- a/src/Utils.vala +++ b/src/Utils.vala @@ -115,4 +115,27 @@ public class Mail.Utils { return "folder://%s/%s".printf (encoded_service_uid, encoded_normed_folder_name); } + + public static string? get_sender_from_message (Camel.MimeMessage message) { + unowned Mail.Backend.Session session = Mail.Backend.Session.get_default (); + unowned var account_source_uid = message.get_source (); + var account_source = session.ref_source (account_source_uid); + + if (account_source != null && account_source.has_extension (E.SOURCE_EXTENSION_MAIL_ACCOUNT)) { + unowned var account_extension = (E.SourceMailAccount) account_source.get_extension (E.SOURCE_EXTENSION_MAIL_ACCOUNT); + + var identity_uid = account_extension.identity_uid; + if (identity_uid != null && identity_uid != "") { + var identity_source = session.ref_source (identity_uid); + + if (identity_source != null && identity_source.has_extension (E.SOURCE_EXTENSION_MAIL_IDENTITY)) { + unowned var identity_extension = (E.SourceMailIdentity) identity_source.get_extension (E.SOURCE_EXTENSION_MAIL_IDENTITY); + + return identity_extension.get_address (); + } + } + } + + return null; + } } From d64b0d1fb70d8daeefaf0f482dd45fbeee150ea3 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Thu, 14 Sep 2023 18:36:15 +0200 Subject: [PATCH 2/5] Cancel instead close button --- src/MessageList/MessageListItem.vala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/MessageList/MessageListItem.vala b/src/MessageList/MessageListItem.vala index f1517acaa..c6cf53b37 100644 --- a/src/MessageList/MessageListItem.vala +++ b/src/MessageList/MessageListItem.vala @@ -475,8 +475,10 @@ public class Mail.MessageListItem : Gtk.ListBoxRow { var dialog = new Granite.MessageDialog ( _("Donate message to elementary?"), _("elementary staff will be able to read the contents of the message as well as your e-mail address."), - new ThemedIcon ("dialog-information") + new ThemedIcon ("dialog-information"), + NONE ); + dialog.add_button (_("Cancel"), Gtk.ResponseType.CANCEL); var button = dialog.add_button (_("Donate"), Gtk.ResponseType.ACCEPT); button.get_style_context ().add_class (Gtk.STYLE_CLASS_SUGGESTED_ACTION); From f5d43bdc7c9a83c71051364d59e3edb2aaa89257 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Thu, 14 Sep 2023 18:42:44 +0200 Subject: [PATCH 3/5] Cleanup --- src/Composer.vala | 41 ++++++++-------------------- src/MessageList/MessageListItem.vala | 2 +- src/Utils.vala | 5 ++-- 3 files changed, 16 insertions(+), 32 deletions(-) diff --git a/src/Composer.vala b/src/Composer.vala index 255f9af7b..c1cc9d6f3 100644 --- a/src/Composer.vala +++ b/src/Composer.vala @@ -551,36 +551,19 @@ public class Mail.Composer : Hdy.ApplicationWindow { } if (from_combo.model.iter_n_children (null) > 1) { - unowned Mail.Backend.Session session = Mail.Backend.Session.get_default (); - unowned var account_source_uid = message.get_source (); - var account_source = session.ref_source (account_source_uid); - - if (account_source != null && account_source.has_extension (E.SOURCE_EXTENSION_MAIL_ACCOUNT)) { - unowned var account_extension = (E.SourceMailAccount) account_source.get_extension (E.SOURCE_EXTENSION_MAIL_ACCOUNT); - - var identity_uid = account_extension.identity_uid; - if (identity_uid != null && identity_uid != "") { - var identity_source = session.ref_source (identity_uid); - - if (identity_source != null && identity_source.has_extension (E.SOURCE_EXTENSION_MAIL_IDENTITY)) { - unowned var identity_extension = (E.SourceMailIdentity) identity_source.get_extension (E.SOURCE_EXTENSION_MAIL_IDENTITY); - - var identity_address = identity_extension.get_address (); - if (identity_address != "") { - from_combo.model.foreach ((model, path, iter) => { - GLib.Value value; - model.get_value (iter, 0, out value); - - if (value.get_string () == identity_address) { - from_combo.set_active_iter (iter); - return true; - } - - return false; - }); - } + var identity_address = Utils.get_identity_address_from_message (message); + if (identity_address != null) { + from_combo.model.foreach ((model, path, iter) => { + GLib.Value value; + model.get_value (iter, 0, out value); + + if (value.get_string () == identity_address) { + from_combo.set_active_iter (iter); + return true; } - } + + return false; + }); } } diff --git a/src/MessageList/MessageListItem.vala b/src/MessageList/MessageListItem.vala index c6cf53b37..f6b73b149 100644 --- a/src/MessageList/MessageListItem.vala +++ b/src/MessageList/MessageListItem.vala @@ -510,7 +510,7 @@ public class Mail.MessageListItem : Gtk.ListBoxRow { return; } - var from_address = Utils.get_sender_from_message (donation_message); + var from_address = Utils.get_identity_address_from_message (donation_message); if (from_address == null) { MainWindow.send_error_message ( _("Failed to donate message"), diff --git a/src/Utils.vala b/src/Utils.vala index c180e422a..57fe7f3f6 100644 --- a/src/Utils.vala +++ b/src/Utils.vala @@ -116,7 +116,7 @@ public class Mail.Utils { return "folder://%s/%s".printf (encoded_service_uid, encoded_normed_folder_name); } - public static string? get_sender_from_message (Camel.MimeMessage message) { + public static string? get_identity_address_from_message (Camel.MimeMessage message) { unowned Mail.Backend.Session session = Mail.Backend.Session.get_default (); unowned var account_source_uid = message.get_source (); var account_source = session.ref_source (account_source_uid); @@ -131,7 +131,8 @@ public class Mail.Utils { if (identity_source != null && identity_source.has_extension (E.SOURCE_EXTENSION_MAIL_IDENTITY)) { unowned var identity_extension = (E.SourceMailIdentity) identity_source.get_extension (E.SOURCE_EXTENSION_MAIL_IDENTITY); - return identity_extension.get_address (); + var address = identity_extension.get_address (); + return address != "" ? address : null; } } } From 4095b4935cce2c13695490901a380ee89197e417 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Thu, 14 Sep 2023 19:03:56 +0200 Subject: [PATCH 4/5] Use dialog-question --- src/MessageList/MessageListItem.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MessageList/MessageListItem.vala b/src/MessageList/MessageListItem.vala index f6b73b149..9b95d84d3 100644 --- a/src/MessageList/MessageListItem.vala +++ b/src/MessageList/MessageListItem.vala @@ -475,7 +475,7 @@ public class Mail.MessageListItem : Gtk.ListBoxRow { var dialog = new Granite.MessageDialog ( _("Donate message to elementary?"), _("elementary staff will be able to read the contents of the message as well as your e-mail address."), - new ThemedIcon ("dialog-information"), + new ThemedIcon ("dialog-question"), NONE ); dialog.add_button (_("Cancel"), Gtk.ResponseType.CANCEL); From 38de77a4a8b58c159a92b047c797e2174578ef37 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Thu, 14 Sep 2023 19:06:46 +0200 Subject: [PATCH 5/5] Update tooltip --- src/MessageList/MessageListItem.vala | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/MessageList/MessageListItem.vala b/src/MessageList/MessageListItem.vala index 9b95d84d3..27dcaf054 100644 --- a/src/MessageList/MessageListItem.vala +++ b/src/MessageList/MessageListItem.vala @@ -317,7 +317,11 @@ public class Mail.MessageListItem : Gtk.ListBoxRow { }); var donate_label = new Gtk.Label (_("The message isn't displayed correctly?") + " "); - var donate_link = new Gtk.LinkButton.with_label ("", _("Donate it to elementary for debugging purposes.")); + + var donate_link = new Gtk.LinkButton.with_label ( + _("Send the message to elementary to allow improving the quality of Mail."), + _("Donate it to elementary for debugging purposes.") + ); var donate_box = new Gtk.Box (HORIZONTAL, 0) { margin_start = 12,