]> git.0d.be Git - empathy.git/commitdiff
EmpathySoundManager: Fix playing sound when account goes online.
authorXavier Claessens <xavier.claessens@collabora.co.uk>
Thu, 18 Jul 2013 10:49:16 +0000 (12:49 +0200)
committerXavier Claessens <xavier.claessens@collabora.co.uk>
Thu, 18 Jul 2013 11:02:17 +0000 (13:02 +0200)
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

index 4f69c62dbb0817094ebf67473e41be79700712da..3453e8f2cd176218185b27a33f4e9f15ca2365ac 100644 (file)
@@ -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;