[empathy] EmpathySoundManager: Fix playing sound when account goes online.



commit 2873368e36050e4969c3f91775b92fda27b9fcb5
Author: Xavier Claessens <xavier claessens collabora co uk>
Date:   Thu Jul 18 12:49:16 2013 +0200

    EmpathySoundManager: Fix playing sound when account goes online.
    
    We need to use the requested presence instead of the current presence
    to check if we should play sound, because in the case of an account
    that just got connected, its current presence may still be OFFLINE.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=704454

 libempathy-gtk/empathy-sound-manager.c |   36 +++++++++++++++++++++++++------
 1 files changed, 29 insertions(+), 7 deletions(-)
---
diff --git a/libempathy-gtk/empathy-sound-manager.c b/libempathy-gtk/empathy-sound-manager.c
index 4f69c62..3453e8f 100644
--- a/libempathy-gtk/empathy-sound-manager.c
+++ b/libempathy-gtk/empathy-sound-manager.c
@@ -165,15 +165,37 @@ empathy_sound_manager_dup_singleton (void)
 static gboolean
 empathy_check_available_state (void)
 {
-  TpConnectionPresenceType presence;
-  EmpathyPresenceManager *presence_mgr;
+  TpConnectionPresenceType most_available_requested_presence;
+  TpAccountManager *am;
+  GList *accounts;
+
+  /* We cannot use tp_account_manager_get_most_available_presence() or
+   * empathy_presence_manager_get_state() because it is the requested presence
+   * that matters, not the current presence.
+   * See https://bugzilla.gnome.org/show_bug.cgi?id=704454 */
+  most_available_requested_presence = TP_CONNECTION_PRESENCE_TYPE_UNSET;
+  am = tp_account_manager_dup ();
+  accounts = tp_account_manager_dup_valid_accounts (am);
+  while (accounts != NULL)
+    {
+      TpAccount *account = accounts->data;
+      TpConnectionPresenceType requested_presence;
+
+      requested_presence = tp_account_get_requested_presence (account,
+          NULL, NULL);
+
+      if (tp_connection_presence_type_cmp_availability (requested_presence,
+              most_available_requested_presence) > 0)
+        most_available_requested_presence = requested_presence;
+
+      g_object_unref (account);
+      accounts = g_list_delete_link (accounts, accounts);
+    }
 
-  presence_mgr = empathy_presence_manager_dup_singleton ();
-  presence = empathy_presence_manager_get_state (presence_mgr);
-  g_object_unref (presence_mgr);
+  g_object_unref (am);
 
-  if (presence != TP_CONNECTION_PRESENCE_TYPE_AVAILABLE &&
-    presence != TP_CONNECTION_PRESENCE_TYPE_UNSET)
+  if (most_available_requested_presence != TP_CONNECTION_PRESENCE_TYPE_AVAILABLE &&
+    most_available_requested_presence != TP_CONNECTION_PRESENCE_TYPE_UNSET)
     return FALSE;
 
   return TRUE;


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