[empathy] Show a notification when a contact goes offline or online



commit a51deb704aa36bc8b6d02be102f90b666397ff16
Author: Frédéric Péters <fpeters 0d be>
Date:   Mon Jun 15 16:53:48 2009 +0200

    Show a notification when a contact goes offline or online

 data/empathy.schemas.in       |   30 +++++++++++++++++
 libempathy-gtk/empathy-conf.h |    2 +
 src/empathy-event-manager.c   |   70 +++++++++++++++++++++++++++++++++++++++++
 src/empathy-preferences.c     |   16 +++++++++
 src/empathy-preferences.ui    |   26 +++++++++++++++
 5 files changed, 144 insertions(+), 0 deletions(-)
---
diff --git a/data/empathy.schemas.in b/data/empathy.schemas.in
index 8820da1..fb068e5 100644
--- a/data/empathy.schemas.in
+++ b/data/empathy.schemas.in
@@ -261,6 +261,36 @@
     </schema>
 
     <schema>
+      <key>/schemas/apps/empathy/notifications/notifications_contact_signin</key>
+      <applyto>/apps/empathy/notifications/notifications_contact_signin</applyto>
+      <owner>empathy</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+         <short>Popup notifications when a contact sign in</short>
+         <long>
+         Whether or not to show a popup notification when a contact goes
+         online.
+         </long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/apps/empathy/notifications/notifications_contact_signout</key>
+      <applyto>/apps/empathy/notifications/notifications_contact_signout</applyto>
+      <owner>empathy</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+         <short>Popup notifications when a contact sign out</short>
+         <long>
+         Whether or not to show a popup notification when a contact goes
+         offline.
+         </long>
+      </locale>
+    </schema>
+
+    <schema>
        <key>/schemas/apps/empathy/ui/separate_chat_windows</key>
        <applyto>/apps/empathy/ui/separate_chat_windows</applyto>
        <owner>empathy</owner>
diff --git a/libempathy-gtk/empathy-conf.h b/libempathy-gtk/empathy-conf.h
index e40c228..937a4bf 100644
--- a/libempathy-gtk/empathy-conf.h
+++ b/libempathy-gtk/empathy-conf.h
@@ -48,6 +48,8 @@ struct _EmpathyConfClass {
 #define EMPATHY_PREFS_NOTIFICATIONS_ENABLED        EMPATHY_PREFS_PATH "/notifications/notifications_enabled"
 #define EMPATHY_PREFS_NOTIFICATIONS_DISABLED_AWAY  EMPATHY_PREFS_PATH "/notifications/notifications_disabled_away"
 #define EMPATHY_PREFS_NOTIFICATIONS_FOCUS          EMPATHY_PREFS_PATH "/notifications/notifications_focus"
+#define EMPATHY_PREFS_NOTIFICATIONS_CONTACT_SIGNIN EMPATHY_PREFS_PATH "/notifications/notifications_contact_signin"
+#define EMPATHY_PREFS_NOTIFICATIONS_CONTACT_SIGNOUT EMPATHY_PREFS_PATH "/notifications/notifications_contact_signout"
 #define EMPATHY_PREFS_SOUNDS_ENABLED               EMPATHY_PREFS_PATH "/sounds/sounds_enabled"
 #define EMPATHY_PREFS_SOUNDS_DISABLED_AWAY         EMPATHY_PREFS_PATH "/sounds/sounds_disabled_away"
 #define EMPATHY_PREFS_SOUNDS_INCOMING_MESSAGE      EMPATHY_PREFS_PATH "/sounds/sounds_incoming_message"
diff --git a/src/empathy-event-manager.c b/src/empathy-event-manager.c
index 1ee619e..1a4ce0d 100644
--- a/src/empathy-event-manager.c
+++ b/src/empathy-event-manager.c
@@ -26,6 +26,7 @@
 
 #include <telepathy-glib/util.h>
 
+#include <libempathy/empathy-account-manager.h>
 #include <libempathy/empathy-dispatcher.h>
 #include <libempathy/empathy-tp-contact-factory.h>
 #include <libempathy/empathy-contact-manager.h>
@@ -37,6 +38,7 @@
 
 #include <extensions/extensions.h>
 
+#include <libempathy-gtk/empathy-conf.h>
 #include <libempathy-gtk/empathy-images.h>
 #include <libempathy-gtk/empathy-contact-dialogs.h>
 #include <libempathy-gtk/empathy-ui-utils.h>
@@ -956,6 +958,66 @@ event_manager_pendings_changed_cb (EmpathyContactList  *list,
   g_free (header);
 }
 
+static void
+event_manager_presence_changed_cb (EmpathyContactMonitor *monitor,
+                                   EmpathyContact *contact,
+                                   TpConnectionPresenceType current,
+                                   TpConnectionPresenceType previous,
+                                   EmpathyEventManager *manager)
+{
+  McAccount *account;
+  gboolean just_connected;
+  EmpathyAccountManager *account_manager;
+  gchar *header = NULL;
+  gboolean preference = FALSE;
+
+  account = empathy_contact_get_account (contact);
+  account_manager = empathy_account_manager_dup_singleton ();
+  just_connected = empathy_account_manager_is_account_just_connected (
+                  account_manager, account);
+
+  g_object_unref (account_manager);
+  if (just_connected) {
+    return;
+  }
+
+  if (tp_connection_presence_type_cmp_availability (previous,
+     TP_CONNECTION_PRESENCE_TYPE_OFFLINE) > 0)
+    {
+      /* contact was online */
+      empathy_conf_get_bool (empathy_conf_get (),
+                      EMPATHY_PREFS_NOTIFICATIONS_CONTACT_SIGNOUT, &preference);
+      if (preference && tp_connection_presence_type_cmp_availability (current,
+          TP_CONNECTION_PRESENCE_TYPE_OFFLINE) <= 0)
+        {
+          /* someone is logging off */
+          header = g_strdup_printf (_("%s signed out."),
+            empathy_contact_get_name (contact));
+
+          event_manager_add (manager, contact, GTK_STOCK_DIALOG_INFO, header,
+                             NULL, NULL, NULL, NULL);
+        }
+    }
+  else
+    {
+      /* contact was offline */
+      empathy_conf_get_bool (empathy_conf_get (),
+                      EMPATHY_PREFS_NOTIFICATIONS_CONTACT_SIGNIN, &preference);
+      if (preference && tp_connection_presence_type_cmp_availability (current,
+          TP_CONNECTION_PRESENCE_TYPE_OFFLINE) > 0)
+        {
+          /* someone is logging in */
+          header = g_strdup_printf (_("%s signed in."),
+            empathy_contact_get_name (contact));
+
+          event_manager_add (manager, contact, GTK_STOCK_DIALOG_INFO, header,
+                             NULL, NULL, NULL, NULL);
+        }
+    }
+  g_free (header);
+}
+
+
 static GObject *
 event_manager_constructor (GType type,
 			   guint n_props,
@@ -1034,6 +1096,12 @@ empathy_event_manager_init (EmpathyEventManager *manager)
 {
   EmpathyEventManagerPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (manager,
     EMPATHY_TYPE_EVENT_MANAGER, EmpathyEventManagerPriv);
+  EmpathyContactMonitor   *monitor;
+  EmpathyContactList      *list_iface;
+
+  list_iface = EMPATHY_CONTACT_LIST (empathy_contact_manager_dup_singleton ());
+  monitor = empathy_contact_list_get_monitor (list_iface);
+  g_object_unref (list_iface);
 
   manager->priv = priv;
 
@@ -1043,6 +1111,8 @@ empathy_event_manager_init (EmpathyEventManager *manager)
     G_CALLBACK (event_manager_approve_channel_cb), manager);
   g_signal_connect (priv->contact_manager, "pendings-changed",
     G_CALLBACK (event_manager_pendings_changed_cb), manager);
+  g_signal_connect (monitor, "contact-presence-changed",
+    G_CALLBACK (event_manager_presence_changed_cb), manager);
 }
 
 EmpathyEventManager *
diff --git a/src/empathy-preferences.c b/src/empathy-preferences.c
index cb087cb..d91dc98 100644
--- a/src/empathy-preferences.c
+++ b/src/empathy-preferences.c
@@ -69,6 +69,8 @@ typedef struct {
 	GtkWidget *checkbutton_notifications_enabled;
 	GtkWidget *checkbutton_notifications_disabled_away;
 	GtkWidget *checkbutton_notifications_focus;
+	GtkWidget *checkbutton_notifications_contact_signin;
+	GtkWidget *checkbutton_notifications_contact_signout;
 
 	GtkWidget *treeview_spell_checker;
 
@@ -200,6 +202,12 @@ preferences_setup_widgets (EmpathyPreferences *preferences)
 	preferences_hookup_toggle_button (preferences,
 					  EMPATHY_PREFS_NOTIFICATIONS_FOCUS,
 					  preferences->checkbutton_notifications_focus);
+	preferences_hookup_toggle_button (preferences,
+					  EMPATHY_PREFS_NOTIFICATIONS_CONTACT_SIGNIN,
+					  preferences->checkbutton_notifications_contact_signin);
+	preferences_hookup_toggle_button (preferences,
+					  EMPATHY_PREFS_NOTIFICATIONS_CONTACT_SIGNOUT,
+					  preferences->checkbutton_notifications_contact_signout);
 
 	preferences_hookup_sensitivity (preferences,
 					EMPATHY_PREFS_NOTIFICATIONS_ENABLED,
@@ -207,6 +215,12 @@ preferences_setup_widgets (EmpathyPreferences *preferences)
 	preferences_hookup_sensitivity (preferences,
 					EMPATHY_PREFS_NOTIFICATIONS_ENABLED,
 					preferences->checkbutton_notifications_focus);
+	preferences_hookup_sensitivity (preferences,
+					EMPATHY_PREFS_NOTIFICATIONS_ENABLED,
+					preferences->checkbutton_notifications_contact_signin);
+	preferences_hookup_sensitivity (preferences,
+					EMPATHY_PREFS_NOTIFICATIONS_ENABLED,
+					preferences->checkbutton_notifications_contact_signout);
 
 	preferences_hookup_toggle_button (preferences,
 					  EMPATHY_PREFS_SOUNDS_ENABLED,
@@ -1207,6 +1221,8 @@ empathy_preferences_show (GtkWindow *parent)
 		"checkbutton_notifications_enabled", &preferences->checkbutton_notifications_enabled,
 		"checkbutton_notifications_disabled_away", &preferences->checkbutton_notifications_disabled_away,
 		"checkbutton_notifications_focus", &preferences->checkbutton_notifications_focus,
+		"checkbutton_notifications_contact_signin", &preferences->checkbutton_notifications_contact_signin,
+		"checkbutton_notifications_contact_signout", &preferences->checkbutton_notifications_contact_signout,
 		"checkbutton_sounds_enabled", &preferences->checkbutton_sounds_enabled,
 		"checkbutton_sounds_disabled_away", &preferences->checkbutton_sounds_disabled_away,
 		"treeview_sounds", &preferences->treeview_sounds,
diff --git a/src/empathy-preferences.ui b/src/empathy-preferences.ui
index ed0cb54..3b577ed 100644
--- a/src/empathy-preferences.ui
+++ b/src/empathy-preferences.ui
@@ -310,6 +310,32 @@
                             <property name="position">1</property>
                           </packing>
                         </child>
+                        <child>
+                          <object class="GtkCheckButton" id="checkbutton_notifications_contact_signin">
+                            <property name="label" translatable="yes">Enable notifications when a contact signs in</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="use_underline">True</property>
+                            <property name="draw_indicator">True</property>
+                          </object>
+                          <packing>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkCheckButton" id="checkbutton_notifications_contact_signout">
+                            <property name="label" translatable="yes">Enable notifications when a contact signs out</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="use_underline">True</property>
+                            <property name="draw_indicator">True</property>
+                          </object>
+                          <packing>
+                            <property name="position">3</property>
+                          </packing>
+                        </child>
                       </object>
                     </child>
                   </object>



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