aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libempathy-gtk/empathy-sound-manager.c36
1 files changed, 29 insertions, 7 deletions
diff --git a/libempathy-gtk/empathy-sound-manager.c b/libempathy-gtk/empathy-sound-manager.c
index 4f69c62db..3453e8f2c 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;