aboutsummaryrefslogtreecommitdiff
path: root/main/src/plugins/omemo/ui/device_notification_populator.vala
diff options
context:
space:
mode:
authorMarvin W <git@larma.de>2026-10-04 14:42:16 +0200
committerMarvin W <git@larma.de>2026-10-23 16:59:59 +0200
commitdba577f39c489b9db29960f2bf5cc78ac4f29d7b (patch)
treea8354c9fc328c1442d5e8c5c2adec4b428c92f44 /main/src/plugins/omemo/ui/device_notification_populator.vala
parent2413442905e31f34cb0f77c9167003b3725760fe (diff)
Move OMEMO, OpenPGP and RTP plugins into main/libdino
Diffstat (limited to 'main/src/plugins/omemo/ui/device_notification_populator.vala')
-rw-r--r--main/src/plugins/omemo/ui/device_notification_populator.vala90
1 files changed, 90 insertions, 0 deletions
diff --git a/main/src/plugins/omemo/ui/device_notification_populator.vala b/main/src/plugins/omemo/ui/device_notification_populator.vala
new file mode 100644
index 00000000..7829d89c
--- /dev/null
+++ b/main/src/plugins/omemo/ui/device_notification_populator.vala
@@ -0,0 +1,90 @@
+using Dino.Entities;
+using Xmpp;
+using Gtk;
+
+namespace Dino.Plugins.Omemo {
+
+public class DeviceNotificationPopulator : NotificationPopulator, Object {
+
+ public string id { get { return "device_notification"; } }
+
+ private StreamInteractor? stream_interactor;
+ private Plugin plugin;
+ private Conversation? current_conversation;
+ private NotificationCollection? notification_collection;
+ private ConversationNotification notification;
+
+ public DeviceNotificationPopulator(Plugin plugin, StreamInteractor stream_interactor) {
+ this.stream_interactor = stream_interactor;
+ this.plugin = plugin;
+
+ stream_interactor.account_added.connect(on_account_added);
+ }
+
+ public void init(Conversation conversation, NotificationCollection notification_collection, Plugins.WidgetType type) {
+ current_conversation = conversation;
+ this.notification_collection = notification_collection;
+ if (plugin.has_new_devices(conversation.account, conversation.counterpart) && conversation.type_ == Conversation.Type.CHAT) {
+ display_notification();
+ }
+ }
+
+ public void close(Conversation conversation) {
+ notification = null;
+ }
+
+ private void display_notification() {
+ if (notification == null) {
+ notification = new ConversationNotification(plugin, current_conversation);
+ notification.should_hide.connect(should_hide);
+ notification_collection.add_meta_notification(notification);
+ }
+ }
+
+ public void should_hide() {
+ if (!plugin.has_new_devices(current_conversation.account, current_conversation.counterpart) && notification != null){
+ notification_collection.remove_meta_notification(notification);
+ notification = null;
+ }
+ }
+
+ private void on_account_added(Account account) {
+ stream_interactor.module_manager.get_module(account, StreamModule.IDENTITY).bundle_fetched.connect_after((jid, device_id, bundle) => {
+ if (current_conversation != null && jid.equals(current_conversation.counterpart) && plugin.has_new_devices(current_conversation.account, current_conversation.counterpart)) {
+ display_notification();
+ }
+ });
+ }
+}
+
+private class ConversationNotification : MetaConversationNotification {
+ private Widget widget;
+ private Plugin plugin;
+ private Jid jid;
+ private Account account;
+ public signal void should_hide();
+
+ public ConversationNotification(Plugin plugin, Conversation conversation) {
+ this.plugin = plugin;
+ this.jid = jid;
+ this.account = account;
+
+ Box box = new Box(Orientation.HORIZONTAL, 5);
+ Button manage_button = new Button.with_label(_("Manage"));
+ manage_button.clicked.connect(() => {
+ manage_button.activate();
+
+ var variant = new Variant.tuple(new Variant[] {new Variant.int32(conversation.id), new Variant.string("encryption")});
+ GLib.Application.get_default().activate_action("open-conversation-details", variant);
+ });
+ box.append(new Label(_("This contact has new devices")) { margin_end=10 });
+ box.append(manage_button);
+ widget = box;
+ }
+
+ public override Object? get_widget(WidgetType type) {
+ return widget;
+ }
+}
+
+}