*can_video_call = can_video;
}
+static const gchar * const *
+individual_get_client_types (FolksIndividual *individual)
+{
+ GList *personas, *l;
+ const gchar * const *types = NULL;
+ FolksPresenceType presence_type = FOLKS_PRESENCE_TYPE_UNSET;
+
+ personas = folks_individual_get_personas (individual);
+ for (l = personas; l != NULL; l = l->next)
+ {
+ FolksPresence *presence = FOLKS_PRESENCE (l->data);
+
+ if (folks_presence_typecmp (folks_presence_get_presence_type (presence),
+ presence_type) > 0)
+ {
+ TpContact *tp_contact;
+
+ presence_type = folks_presence_get_presence_type (presence);
+
+ tp_contact = tpf_persona_get_contact (TPF_PERSONA (l->data));
+ types = tp_contact_get_client_types (tp_contact);
+ }
+ }
+
+ return types;
+}
+
static void
add_individual_to_store (GtkTreeStore *self,
GtkTreeIter *iter,
FolksIndividual *individual)
{
gboolean can_audio_call, can_video_call;
+ const gchar * const *types;
individual_can_audio_video_call (individual, &can_audio_call,
&can_video_call);
+ types = individual_get_client_types (individual);
+
gtk_tree_store_insert_with_values (self, iter, parent, 0,
EMPATHY_INDIVIDUAL_STORE_COL_NAME,
folks_aliasable_get_alias (FOLKS_ALIASABLE (individual)),
EMPATHY_INDIVIDUAL_STORE_COL_IS_SEPARATOR, FALSE,
EMPATHY_INDIVIDUAL_STORE_COL_CAN_AUDIO_CALL, can_audio_call,
EMPATHY_INDIVIDUAL_STORE_COL_CAN_VIDEO_CALL, can_video_call,
+ EMPATHY_INDIVIDUAL_STORE_COL_CLIENT_TYPES, types,
-1);
}
for (l = iters; l && set_model; l = l->next)
{
gboolean can_audio_call, can_video_call;
+ const gchar * const *types;
individual_can_audio_video_call (individual, &can_audio_call,
&can_video_call);
+ types = individual_get_client_types (individual);
+
gtk_tree_store_set (GTK_TREE_STORE (self), l->data,
EMPATHY_INDIVIDUAL_STORE_COL_ICON_STATUS, pixbuf_status,
EMPATHY_INDIVIDUAL_STORE_COL_PIXBUF_AVATAR_VISIBLE, show_avatar,
EMPATHY_INDIVIDUAL_STORE_COL_IS_SEPARATOR, FALSE,
EMPATHY_INDIVIDUAL_STORE_COL_CAN_AUDIO_CALL, can_audio_call,
EMPATHY_INDIVIDUAL_STORE_COL_CAN_VIDEO_CALL, can_video_call,
+ EMPATHY_INDIVIDUAL_STORE_COL_CLIENT_TYPES, types,
-1);
}
g_object_set_data (G_OBJECT (contact), "individual", individual);
g_signal_connect (contact, "notify::capabilities",
(GCallback) individual_store_contact_updated_cb, self);
+ g_signal_connect (contact, "notify::client-types",
+ (GCallback) individual_store_contact_updated_cb, self);
g_object_unref (contact);
}
G_TYPE_BOOLEAN, /* Can make audio calls */
G_TYPE_BOOLEAN, /* Can make video calls */
G_TYPE_BOOLEAN, /* Is a fake group */
+ G_TYPE_STRV, /* Client types */
};
priv = GET_PRIV (self);
EMPATHY_INDIVIDUAL_STORE_COL_CAN_AUDIO_CALL,
EMPATHY_INDIVIDUAL_STORE_COL_CAN_VIDEO_CALL,
EMPATHY_INDIVIDUAL_STORE_COL_IS_FAKE_GROUP,
+ EMPATHY_INDIVIDUAL_STORE_COL_CLIENT_TYPES,
EMPATHY_INDIVIDUAL_STORE_COL_COUNT,
} EmpathyIndividualStoreCol;
individual_view_cell_set_background (view, cell, is_group, is_active);
}
+static void
+individual_view_phone_cell_data_func (GtkTreeViewColumn *tree_column,
+ GtkCellRenderer *cell,
+ GtkTreeModel *model,
+ GtkTreeIter *iter,
+ EmpathyIndividualView *view)
+{
+ gboolean is_group;
+ gboolean is_active;
+ gchar **types;
+
+ gtk_tree_model_get (model, iter,
+ EMPATHY_INDIVIDUAL_STORE_COL_IS_GROUP, &is_group,
+ EMPATHY_INDIVIDUAL_STORE_COL_IS_ACTIVE, &is_active,
+ EMPATHY_INDIVIDUAL_STORE_COL_CLIENT_TYPES, &types,
+ -1);
+
+ g_object_set (cell,
+ "visible",
+ !is_group
+ && types != NULL
+ && g_strv_length (types) > 0
+ && !tp_strdiff (types[0], "phone"),
+ NULL);
+
+ g_strfreev (types);
+
+ individual_view_cell_set_background (view, cell, is_group, is_active);
+}
+
static void
individual_view_text_cell_data_func (GtkTreeViewColumn *tree_column,
GtkCellRenderer *cell,
gtk_tree_view_column_add_attribute (col, cell,
"compact", EMPATHY_INDIVIDUAL_STORE_COL_COMPACT);
+ /* Phone Icon */
+ cell = gtk_cell_renderer_pixbuf_new ();
+ gtk_tree_view_column_pack_start (col, cell, FALSE);
+ gtk_tree_view_column_set_cell_data_func (col, cell,
+ (GtkTreeCellDataFunc) individual_view_phone_cell_data_func,
+ view, NULL);
+
+ g_object_set (cell, "visible", FALSE, "icon-name", "phone", NULL);
+
/* Audio Call Icon */
cell = empathy_cell_renderer_activatable_new ();
gtk_tree_view_column_pack_start (col, cell, FALSE);
*/
GHashTable *location;
GHashTable *groups;
+ gchar **client_types;
} EmpathyContactPriv;
static void contact_finalize (GObject *object);
static void empathy_contact_set_location (EmpathyContact *contact,
GHashTable *location);
+static void contact_set_client_types (EmpathyContact *contact,
+ const gchar * const *types);
+
static void set_capabilities_from_tp_caps (EmpathyContact *self,
TpCapabilities *caps);
PROP_HANDLE,
PROP_CAPABILITIES,
PROP_IS_USER,
- PROP_LOCATION
+ PROP_LOCATION,
+ PROP_CLIENT_TYPES
};
enum {
{
contact_set_avatar_from_tp_contact (EMPATHY_CONTACT (contact));
}
+ else if (!tp_strdiff (param->name, "client-types"))
+ {
+ contact_set_client_types (EMPATHY_CONTACT (contact),
+ tp_contact_get_client_types (tp_contact));
+ }
}
static void
GHashTable *location;
TpHandle self_handle;
TpHandle handle;
+ const gchar * const *client_types;
if (priv->tp_contact == NULL)
return;
if (location != NULL)
empathy_contact_set_location (contact, location);
+ client_types = tp_contact_get_client_types (priv->tp_contact);
+ if (client_types != NULL)
+ contact_set_client_types (contact, client_types);
+
set_capabilities_from_tp_caps (contact,
tp_contact_get_capabilities (priv->tp_contact));
G_TYPE_HASH_TABLE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class,
+ PROP_CLIENT_TYPES,
+ g_param_spec_boxed ("client-types",
+ "Contact client types",
+ "Client types of the contact",
+ G_TYPE_STRV,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
signals[PRESENCE_CHANGED] =
g_signal_new ("presence-changed",
G_TYPE_FROM_CLASS (class),
contact->priv = priv;
priv->location = NULL;
+ priv->client_types = NULL;
priv->groups = NULL;
}
g_hash_table_destroy (priv->groups);
g_free (priv->alias);
g_free (priv->id);
+ g_strfreev (priv->client_types);
G_OBJECT_CLASS (empathy_contact_parent_class)->finalize (object);
}
g_object_notify (G_OBJECT (contact), "location");
}
+const gchar * const *
+empathy_contact_get_client_types (EmpathyContact *contact)
+{
+ EmpathyContactPriv *priv;
+
+ g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
+
+ priv = GET_PRIV (contact);
+
+ return (const gchar * const *) priv->client_types;
+}
+
+static void
+contact_set_client_types (EmpathyContact *contact,
+ const gchar * const *client_types)
+{
+ EmpathyContactPriv *priv = GET_PRIV (contact);
+
+ if (priv->client_types != NULL)
+ g_strfreev (priv->client_types);
+
+ priv->client_types = g_strdupv ((gchar **) client_types);
+ g_object_notify (G_OBJECT (contact), "client-types");
+}
+
/**
* empathy_contact_equal:
* @contact1: an #EmpathyContact
const gchar *filename, GError **error);
GHashTable * empathy_contact_get_location (EmpathyContact *contact);
+const gchar * const * empathy_contact_get_client_types (EmpathyContact *contact);
gboolean empathy_contact_equal (gconstpointer contact1,
gconstpointer contact2);
TP_CONTACT_FEATURE_PRESENCE,
TP_CONTACT_FEATURE_LOCATION,
TP_CONTACT_FEATURE_CAPABILITIES,
+ TP_CONTACT_FEATURE_CLIENT_TYPES,
};
typedef union {