* Travis Reitter <travis.reitter@collabora.co.uk>
*/
-#include <config.h>
-
-#include <string.h>
-#include <stdlib.h>
+#include "config.h"
+#include "empathy-individual-information-dialog.h"
-#include <gtk/gtk.h>
#include <glib/gi18n-lib.h>
-#include <telepathy-glib/util.h>
-#include <folks/folks.h>
-#include <folks/folks-telepathy.h>
-
-#include <libempathy/empathy-individual-manager.h>
-#include <libempathy/empathy-utils.h>
-
-#include "empathy-individual-information-dialog.h"
+#include "empathy-individual-manager.h"
#include "empathy-individual-widget.h"
+#include "empathy-pkg-kit.h"
#include "empathy-ui-utils.h"
+#include "empathy-utils.h"
+
+#define DEBUG_FLAG EMPATHY_DEBUG_CONTACT
+#include "empathy-debug.h"
#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyIndividualInformationDialog)
typedef struct {
set_label_visibility (EmpathyIndividualInformationDialog *dialog)
{
EmpathyIndividualInformationDialogPriv *priv = GET_PRIV (dialog);
- GList *personas, *l;
guint num_personas = 0;
/* Count how many Telepathy personas we have, to see whether we can
* unlink */
if (priv->individual != NULL)
{
+ GeeSet *personas;
+ GeeIterator *iter;
+
personas = folks_individual_get_personas (priv->individual);
- for (l = personas; l != NULL; l = l->next)
+ iter = gee_iterable_iterator (GEE_ITERABLE (personas));
+ while (gee_iterator_next (iter))
{
- if (TPF_IS_PERSONA (l->data))
+ FolksPersona *persona = gee_iterator_get (iter);
+ if (empathy_folks_persona_is_interesting (persona))
num_personas++;
+
+ g_clear_object (&persona);
}
+ g_clear_object (&iter);
}
/* Only make the label visible if we have enough personas */
/* Update the UI */
gtk_window_set_title (GTK_WINDOW (dialog),
- folks_individual_get_alias (individual));
+ folks_alias_details_get_alias (FOLKS_ALIAS_DETAILS (individual)));
empathy_individual_widget_set_individual (
EMPATHY_INDIVIDUAL_WIDGET (priv->individual_widget), individual);
set_label_visibility (dialog);
g_signal_connect (dialog, "response",
G_CALLBACK (individual_dialogs_response_cb), &information_dialogs);
}
+
+static void
+show_gnome_contacts_error_dialog (void)
+{
+ GtkWidget *dialog;
+
+ dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+ _("gnome-contacts not installed"));
+
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ _("Please install gnome-contacts to access contacts details."));
+
+ g_signal_connect_swapped (dialog, "response",
+ G_CALLBACK (gtk_widget_destroy), dialog);
+
+ gtk_widget_show (dialog);
+}
+
+static void
+start_gnome_contacts (FolksIndividual *individual,
+ gboolean try_installing);
+
+static void
+install_gnome_contacts_cb (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ FolksIndividual *individual = user_data;
+ GError *error = NULL;
+
+ if (!empathy_pkg_kit_install_packages_finish (result, &error))
+ {
+ DEBUG ("Failed to install gnome-contacts: %s", error->message);
+ g_error_free (error);
+
+ show_gnome_contacts_error_dialog ();
+ goto out;
+ }
+
+ DEBUG ("gnome-contacts installed");
+
+ start_gnome_contacts (individual, FALSE);
+
+out:
+ g_object_unref (individual);
+}
+
+static void
+start_gnome_contacts (FolksIndividual *individual,
+ gboolean try_installing)
+{
+ gchar *args;
+ GError *error = NULL;
+
+ g_return_if_fail (FOLKS_IS_INDIVIDUAL (individual));
+
+ args = g_strdup_printf ("-i %s", folks_individual_get_id (individual));
+
+ /* First try the old desktop name */
+ if (empathy_launch_external_app ("gnome-contacts.desktop", args, NULL))
+ goto out;
+
+ if (!empathy_launch_external_app ("org.gnome.Contacts.desktop", args, &error))
+ {
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
+ {
+ if (try_installing)
+ {
+ const gchar *packages[] = { "gnome-contacts", NULL };
+
+ DEBUG ("gnome-contacts not installed; try to install it");
+
+ empathy_pkg_kit_install_packages_async (0, packages, NULL,
+ NULL, install_gnome_contacts_cb, g_object_ref (individual));
+ }
+ else
+ {
+ show_gnome_contacts_error_dialog ();
+ }
+ }
+ }
+
+out:
+ g_free (args);
+}
+
+/* Use gnome-contacts to display @individual or fallback to
+ * EmpathyIndividualInformationDialog if user is not not in Folks.
+ */
+void
+empathy_display_individual_info (FolksIndividual *individual)
+{
+ EmpathyIndividualManager *mgr;
+
+ mgr = empathy_individual_manager_dup_singleton ();
+
+ /* Only use gnome-contacts if that's a 'real' individual we got from
+ * Folks (and so the individual manager knows about it). If not that's a
+ * MUC contact and we use the simple dialog. */
+ if (empathy_individual_manager_lookup_member (mgr,
+ folks_individual_get_id (individual)) != NULL)
+ {
+ start_gnome_contacts (individual, TRUE);
+ }
+ else
+ {
+ empathy_individual_information_dialog_show (individual, NULL);
+ }
+
+ g_object_unref (mgr);
+}