#include <libnotify/notification.h>
#include <libnotify/notify.h>
+#include <telepathy-glib/account-manager.h>
+
#include <libempathy/empathy-utils.h>
+#include <libempathy-gtk/empathy-ui-utils.h>
+#include <libempathy-gtk/empathy-conf.h>
+
#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
#include <libempathy/empathy-debug.h>
{
/* owned (gchar *) => TRUE */
GHashTable *capabilities;
-
- gboolean dispose_has_run;
+ TpAccountManager *account_manager;
} EmpathyNotifyManagerPriv;
G_DEFINE_TYPE (EmpathyNotifyManager, empathy_notify_manager, G_TYPE_OBJECT);
GObjectConstructParam *construct_params)
{
GObject *retval;
- EmpathyNotifyManagerPriv *priv;
- GList *list, *l;
if (notify_manager != NULL)
return g_object_ref (notify_manager);
notify_manager = EMPATHY_NOTIFY_MANAGER (retval);
g_object_add_weak_pointer (retval, (gpointer) ¬ify_manager);
- priv = GET_PRIV (notify_manager);
-
- /* fetch capabilities */
- list = notify_get_server_caps ();
- for (l = list; l != NULL; l = g_list_next (l))
- {
- gchar *capa = l->data;
-
- DEBUG ("add capability: %s", capa);
- /* owernship of the string is transfered to the hash table */
- g_hash_table_insert (priv->capabilities, capa, GUINT_TO_POINTER (TRUE));
- }
- g_list_free (list);
-
return retval;
}
{
EmpathyNotifyManagerPriv *priv = GET_PRIV (object);
- if (priv->dispose_has_run)
- return;
-
- priv->dispose_has_run = TRUE;
+ if (priv->account_manager != NULL)
+ {
+ g_object_unref (priv->account_manager);
+ priv->account_manager = NULL;
+ }
G_OBJECT_CLASS (empathy_notify_manager_parent_class)->dispose (object);
}
g_type_class_add_private (object_class, sizeof (EmpathyNotifyManagerPriv));
}
+static void
+account_manager_prepared_cb (GObject *source_object,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ TpAccountManager *account_manager = TP_ACCOUNT_MANAGER (source_object);
+ GError *error = NULL;
+
+ if (!tp_account_manager_prepare_finish (account_manager, result, &error))
+ {
+ DEBUG ("Failed to prepare account manager: %s", error->message);
+ g_error_free (error);
+ return;
+ }
+}
+
static void
empathy_notify_manager_init (EmpathyNotifyManager *self)
{
EmpathyNotifyManagerPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
EMPATHY_TYPE_NOTIFY_MANAGER, EmpathyNotifyManagerPriv);
+ GList *list, *l;
self->priv = priv;
priv->capabilities = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
NULL);
+
+ /* fetch capabilities */
+ list = notify_get_server_caps ();
+ for (l = list; l != NULL; l = g_list_next (l))
+ {
+ gchar *cap = l->data;
+
+ DEBUG ("add capability: %s", cap);
+ /* owernship of the string is transfered to the hash table */
+ g_hash_table_insert (priv->capabilities, cap, GUINT_TO_POINTER (TRUE));
+ }
+ g_list_free (list);
+
+ priv->account_manager = tp_account_manager_dup ();
+
+ tp_account_manager_prepare_async (priv->account_manager, NULL,
+ account_manager_prepared_cb, self);
}
EmpathyNotifyManager *
empathy_notify_manager_dup_singleton (void)
{
- return EMPATHY_NOTIFY_MANAGER (g_object_new (EMPATHY_TYPE_NOTIFY_MANAGER,
- NULL));
+ return g_object_new (EMPATHY_TYPE_NOTIFY_MANAGER, NULL);
}
gboolean
empathy_notify_manager_has_capability (EmpathyNotifyManager *self,
- const gchar *capa)
+ const gchar *cap)
{
EmpathyNotifyManagerPriv *priv = GET_PRIV (self);
- return g_hash_table_lookup (priv->capabilities, capa) != NULL;
+ return g_hash_table_lookup (priv->capabilities, cap) != NULL;
+}
+
+GdkPixbuf *
+empathy_notify_manager_get_pixbuf_for_notification (EmpathyNotifyManager *self,
+ EmpathyContact *contact,
+ const char *icon_name)
+{
+ GdkPixbuf *pixbuf = NULL;
+
+ if (contact != NULL)
+ pixbuf = empathy_pixbuf_avatar_from_contact_scaled (contact, 48, 48);
+
+ if (pixbuf == NULL)
+ pixbuf = empathy_pixbuf_from_icon_name_sized (icon_name, 48);
+
+ return pixbuf;
+}
+
+gboolean
+empathy_notify_manager_notification_is_enabled (EmpathyNotifyManager *self)
+{
+ EmpathyNotifyManagerPriv *priv = GET_PRIV (self);
+ EmpathyConf *conf;
+ gboolean res;
+ TpConnectionPresenceType presence;
+
+ conf = empathy_conf_get ();
+ res = FALSE;
+
+ empathy_conf_get_bool (conf, EMPATHY_PREFS_NOTIFICATIONS_ENABLED, &res);
+
+ if (!res)
+ return FALSE;
+
+ if (!tp_account_manager_is_prepared (priv->account_manager,
+ TP_ACCOUNT_MANAGER_FEATURE_CORE))
+ {
+ DEBUG ("account manager is not ready yet; display the notification");
+ return TRUE;
+ }
+
+ presence = tp_account_manager_get_most_available_presence (
+ priv->account_manager,
+ NULL, NULL);
+
+ if (presence != TP_CONNECTION_PRESENCE_TYPE_AVAILABLE &&
+ presence != TP_CONNECTION_PRESENCE_TYPE_UNSET)
+ {
+ empathy_conf_get_bool (conf, EMPATHY_PREFS_NOTIFICATIONS_DISABLED_AWAY,
+ &res);
+
+ if (res)
+ return FALSE;
+ }
+
+ return TRUE;
}