]> git.0d.be Git - empathy.git/blobdiff - src/empathy-accounts-dialog.c
accounts-dialog: don't automatically open the add account
[empathy.git] / src / empathy-accounts-dialog.c
index ccda20079984cf280bd8c37f2205d062cbd91764..978ad1630f59e90c3660a3729bc9e6d5023bf273 100644 (file)
@@ -21,6 +21,7 @@
  *          Xavier Claessens <xclaesse@gmail.com>
  *          Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
  *          Jonathan Tellier <jonathan.tellier@gmail.com>
+ *          Danielle Madeley <danielle.madeley@collabora.co.uk>
  */
 
 #include <config.h>
@@ -31,6 +32,7 @@
 #include <gtk/gtk.h>
 #include <glib/gi18n-lib.h>
 #include <dbus/dbus-glib.h>
+#include <gio/gdesktopappinfo.h>
 
 #include <telepathy-glib/account-manager.h>
 #include <telepathy-glib/defs.h>
@@ -39,6 +41,7 @@
 #include <libempathy/empathy-utils.h>
 #include <libempathy/empathy-connection-managers.h>
 #include <libempathy/empathy-connectivity.h>
+#include <libempathy/empathy-tp-contact-factory.h>
 
 #include <libempathy-gtk/empathy-ui-utils.h>
 #include <libempathy-gtk/empathy-protocol-chooser.h>
@@ -46,7 +49,9 @@
 #include <libempathy-gtk/empathy-account-widget-irc.h>
 #include <libempathy-gtk/empathy-account-widget-sip.h>
 #include <libempathy-gtk/empathy-cell-renderer-activatable.h>
+#include <libempathy-gtk/empathy-contact-widget.h>
 #include <libempathy-gtk/empathy-images.h>
+#include <libempathy-gtk/empathy-new-account-dialog.h>
 
 #include "empathy-accounts-dialog.h"
 #include "empathy-import-dialog.h"
@@ -94,13 +99,12 @@ typedef struct {
   GtkWidget *button_remove;
   GtkWidget *button_import;
 
-  GtkWidget *combobox_protocol;
   GtkWidget *hbox_protocol;
 
   GtkWidget *image_type;
   GtkWidget *label_name;
   GtkWidget *label_type;
-  GtkWidget *settings_widget;
+  GtkWidget *dialog_content;
 
   GtkWidget *notebook_account;
   GtkWidget *spinner;
@@ -157,21 +161,13 @@ enum {
 static EmpathyAccountSettings * accounts_dialog_model_get_selected_settings (
     EmpathyAccountsDialog *dialog);
 
-static gboolean accounts_dialog_get_settings_iter (
-    EmpathyAccountsDialog *dialog,
-    EmpathyAccountSettings *settings,
-    GtkTreeIter *iter);
-
 static void accounts_dialog_model_select_first (EmpathyAccountsDialog *dialog);
 
 static void accounts_dialog_update_settings (EmpathyAccountsDialog *dialog,
     EmpathyAccountSettings *settings);
 
-static void accounts_dialog_add (EmpathyAccountsDialog *dialog,
-    EmpathyAccountSettings *settings);
-
 static void accounts_dialog_model_set_selected (EmpathyAccountsDialog *dialog,
-    EmpathyAccountSettings *settings);
+    TpAccount *account);
 
 static void accounts_dialog_connection_changed_cb (TpAccount *account,
     guint old_status,
@@ -191,6 +187,9 @@ static void accounts_dialog_model_selection_changed (
     GtkTreeSelection *selection,
     EmpathyAccountsDialog *dialog);
 
+static gboolean accounts_dialog_has_pending_change (
+    EmpathyAccountsDialog *dialog, TpAccount **account);
+
 static void
 accounts_dialog_update_name_label (EmpathyAccountsDialog *dialog,
     const gchar *display_name)
@@ -213,6 +212,9 @@ accounts_dialog_status_infobar_set_message (EmpathyAccountsDialog *dialog,
 
   message_markup = g_markup_printf_escaped ("<i>%s</i>", message);
   gtk_label_set_markup (GTK_LABEL (priv->label_status), message_markup);
+
+  gtk_widget_set_tooltip_text (priv->label_status, message);
+
   g_free (message_markup);
 }
 
@@ -497,28 +499,6 @@ empathy_account_dialog_widget_cancelled_cb (
   empathy_account_dialog_cancel (dialog);
 }
 
-static void
-empathy_account_dialog_account_created_cb (EmpathyAccountWidget *widget_object,
-    TpAccount *account,
-    EmpathyAccountsDialog *dialog)
-{
-  EmpathyAccountSettings *settings =
-      accounts_dialog_model_get_selected_settings (dialog);
-  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
-
-  accounts_dialog_update_settings (dialog, settings);
-  accounts_dialog_update_status_infobar (dialog,
-      empathy_account_settings_get_account (settings));
-
-  gtk_widget_set_sensitive (priv->treeview, TRUE);
-  gtk_widget_set_sensitive (priv->button_add, TRUE);
-  gtk_widget_set_sensitive (priv->button_remove, TRUE);
-  gtk_widget_set_sensitive (priv->button_import, TRUE);
-
-  if (settings)
-    g_object_unref (settings);
-}
-
 static gboolean
 accounts_dialog_has_valid_accounts (EmpathyAccountsDialog *dialog)
 {
@@ -542,19 +522,21 @@ accounts_dialog_has_valid_accounts (EmpathyAccountsDialog *dialog)
 }
 
 static void
-account_dialog_create_settings_widget (EmpathyAccountsDialog *dialog,
-    EmpathyAccountSettings *settings)
+account_dialog_create_edit_params_dialog (EmpathyAccountsDialog *dialog)
 {
   EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
-  const gchar               *icon_name;
-  TpAccount                 *account;
+  EmpathyAccountSettings *settings;
+  GtkWidget *subdialog, *content, *content_area, *align;
 
-  if (priv->setting_widget_object != NULL)
-    g_object_remove_weak_pointer (G_OBJECT (priv->setting_widget_object),
-        (gpointer *) &priv->setting_widget_object);
+  settings = accounts_dialog_model_get_selected_settings (dialog);
+
+  subdialog = gtk_dialog_new_with_buttons (_("Edit Connection Parameters"),
+      GTK_WINDOW (dialog),
+      GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+      NULL, NULL);
 
   priv->setting_widget_object =
-      empathy_account_widget_new_for_protocol (settings, FALSE);
+    empathy_account_widget_new_for_protocol (settings, FALSE);
 
   g_object_add_weak_pointer (G_OBJECT (priv->setting_widget_object),
       (gpointer *) &priv->setting_widget_object);
@@ -563,17 +545,250 @@ account_dialog_create_settings_widget (EmpathyAccountsDialog *dialog,
     empathy_account_widget_set_other_accounts_exist (
         priv->setting_widget_object, TRUE);
 
-  priv->settings_widget =
-      empathy_account_widget_get_widget (priv->setting_widget_object);
+  content = empathy_account_widget_get_widget (priv->setting_widget_object);
 
-  g_signal_connect (priv->setting_widget_object, "account-created",
-        G_CALLBACK (empathy_account_dialog_account_created_cb), dialog);
   g_signal_connect (priv->setting_widget_object, "cancelled",
           G_CALLBACK (empathy_account_dialog_widget_cancelled_cb), dialog);
 
+  g_signal_connect_swapped (priv->setting_widget_object, "close",
+      G_CALLBACK (gtk_widget_destroy), subdialog);
+
+  content_area = gtk_dialog_get_content_area (GTK_DIALOG (subdialog));
+
+  align = gtk_alignment_new (0.5, 0.5, 1, 1);
+  gtk_alignment_set_padding (GTK_ALIGNMENT (align), 6, 0, 6, 6);
+
+  gtk_container_add (GTK_CONTAINER (align), content);
+  gtk_box_pack_start (GTK_BOX (content_area), align, TRUE, TRUE, 0);
+
+  gtk_widget_show (content);
+  gtk_widget_show (align);
+  gtk_widget_show (subdialog);
+}
+
+static void
+start_external_app (GAppInfo *app_info)
+{
+  GError *error = NULL;
+  GdkAppLaunchContext *context = NULL;
+  GdkDisplay *display;
+
+  display = gdk_display_get_default ();
+  context = gdk_display_get_app_launch_context (display);
+
+  if (!g_app_info_launch (app_info, NULL, (GAppLaunchContext *) context,
+        &error))
+    {
+      g_critical ("Failed to bisho: %s", error->message);
+      g_clear_error (&error);
+    }
+
+  tp_clear_object (&context);
+}
+
+static void
+use_external_storage_provider (EmpathyAccountsDialog *self,
+    TpAccount *account)
+{
+  const gchar *provider;
+
+  provider = tp_account_get_storage_provider (account);
+  if (!tp_strdiff (provider, "com.meego.libsocialweb"))
+    {
+      GDesktopAppInfo *desktop_info;
+      gchar *cmd;
+      GAppInfo *app_info;
+      GError *error = NULL;
+
+      desktop_info = g_desktop_app_info_new ("gnome-control-center.desktop");
+      if (desktop_info == NULL)
+        {
+          g_critical ("Could not locate 'gnome-control-center.desktop'");
+          return;
+        }
+
+      /* glib doesn't have API to start a desktop file with args... (#637875) */
+      cmd = g_strdup_printf ("%s bisho.desktop", g_app_info_get_commandline (
+            (GAppInfo *) desktop_info));
+
+      app_info = g_app_info_create_from_commandline (cmd, NULL, 0, &error);
+
+      if (app_info == NULL)
+        {
+          DEBUG ("Failed to create app info: %s", error->message);
+          g_error_free (error);
+        }
+      else
+        {
+          start_external_app (app_info);
+          g_object_unref (app_info);
+        }
+
+      g_object_unref (desktop_info);
+      g_free (cmd);
+      return;
+    }
+  else if (!tp_strdiff (provider, "org.gnome.OnlineAccounts"))
+    {
+      GDesktopAppInfo *desktop_info;
+
+      desktop_info = g_desktop_app_info_new (
+          "gnome-online-accounts-panel.desktop");
+      if (desktop_info == NULL)
+        {
+          g_critical ("Could not locate 'gnome-online-accounts-panel.desktop'");
+        }
+      else
+        {
+          start_external_app (G_APP_INFO (desktop_info));
+          g_object_unref (desktop_info);
+        }
+
+      return;
+    }
+  else
+    {
+      DEBUG ("Don't know how to handle %s", provider);
+      return;
+    }
+}
+
+static void
+account_dialow_show_edit_params_dialog (EmpathyAccountsDialog *dialog,
+    GtkButton *button)
+{
+  EmpathyAccountSettings *settings;
+  TpAccount *account;
+  TpStorageRestrictionFlags storage_restrictions;
+
+  settings = accounts_dialog_model_get_selected_settings (dialog);
+
+  account = empathy_account_settings_get_account (settings);
+  g_return_if_fail (account != NULL);
+
+  storage_restrictions = tp_account_get_storage_restrictions (account);
+
+  /* Empathy can only edit accounts without the Cannot_Set_Parameters flag */
+  if (storage_restrictions & TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_PARAMETERS)
+    {
+      DEBUG ("Account is provided by an external storage provider");
+
+      use_external_storage_provider (dialog, account);
+    }
+  else
+    {
+      account_dialog_create_edit_params_dialog (dialog);
+    }
+}
+
+static void
+account_dialog_show_contact_details_failed (EmpathyAccountsDialog *dialog,
+    gboolean error)
+{
+  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
+  GtkWidget *infobar, *label;
+
+  infobar = gtk_info_bar_new ();
+
+  if (error)
+    {
+      gtk_info_bar_set_message_type (GTK_INFO_BAR (infobar), GTK_MESSAGE_ERROR);
+      label = gtk_label_new (_("Failed to retrieve your personal information "
+                               "from the server."));
+    }
+  else
+    {
+      gtk_info_bar_set_message_type (GTK_INFO_BAR (infobar), GTK_MESSAGE_INFO);
+      label = gtk_label_new (_("Go online to edit your personal information."));
+    }
+
+  gtk_container_add (
+      GTK_CONTAINER (gtk_info_bar_get_content_area (GTK_INFO_BAR (infobar))),
+      label);
+  gtk_box_pack_start (GTK_BOX (priv->dialog_content), infobar, FALSE, FALSE, 0);
+  gtk_widget_show_all (infobar);
+}
+
+static void
+account_dialog_got_self_contact (TpConnection *conn,
+    EmpathyContact *contact,
+    const GError *in_error,
+    gpointer user_data,
+    GObject *dialog)
+{
+  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
+  GtkWidget *editor, *alig;
+
+  if (in_error != NULL)
+    {
+      DEBUG ("Failed to get self-contact: %s", in_error->message);
+      account_dialog_show_contact_details_failed (
+          EMPATHY_ACCOUNTS_DIALOG (dialog), TRUE);
+      return;
+    }
+
+  alig = gtk_alignment_new (0.5, 0, 1, 1);
+
+  /* create the contact info editor for this account */
+  editor = empathy_contact_widget_new (contact,
+      EMPATHY_CONTACT_WIDGET_EDIT_ALIAS |
+      EMPATHY_CONTACT_WIDGET_EDIT_AVATAR |
+      EMPATHY_CONTACT_WIDGET_NO_STATUS |
+      EMPATHY_CONTACT_WIDGET_EDIT_DETAILS);
+
+  gtk_box_pack_start (GTK_BOX (priv->dialog_content), alig, TRUE, TRUE, 0);
+  gtk_container_add (GTK_CONTAINER (alig), editor);
+  gtk_widget_show (alig);
+  gtk_widget_show (editor);
+}
+
+static void
+account_dialog_create_dialog_content (EmpathyAccountsDialog *dialog,
+    EmpathyAccountSettings *settings)
+{
+  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
+  const gchar *icon_name;
+  TpAccount *account;
+  TpConnection *conn = NULL;
+  GtkWidget *bbox, *button;
+
+  account = empathy_account_settings_get_account (settings);
+
+  // if (priv->setting_widget_object != NULL)
+  //   g_object_remove_weak_pointer (G_OBJECT (priv->setting_widget_object),
+  //       (gpointer *) &priv->setting_widget_object);
+
+  priv->dialog_content = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
   gtk_container_add (GTK_CONTAINER (priv->alignment_settings),
-      priv->settings_widget);
-  gtk_widget_show (priv->settings_widget);
+      priv->dialog_content);
+  gtk_widget_show (priv->dialog_content);
+
+  /* request the self contact */
+  if (account != NULL)
+    conn = tp_account_get_connection (account);
+
+  if (conn != NULL)
+    {
+      empathy_tp_contact_factory_get_from_handle (conn,
+          tp_connection_get_self_handle (conn),
+          account_dialog_got_self_contact,
+          NULL, NULL, G_OBJECT (dialog));
+    }
+  else
+    {
+      account_dialog_show_contact_details_failed (dialog, FALSE);
+    }
+
+  bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END);
+  gtk_box_pack_end (GTK_BOX (priv->dialog_content), bbox, FALSE, TRUE, 0);
+  gtk_widget_show (bbox);
+
+  button = gtk_button_new_with_mnemonic (_("_Edit Connection Parameters..."));
+  gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, TRUE, 0);
+  gtk_widget_show (button);
+  g_signal_connect_swapped (button, "clicked",
+      G_CALLBACK (account_dialow_show_edit_params_dialog), dialog);
 
   icon_name = empathy_account_settings_get_icon_name (settings);
 
@@ -594,7 +809,6 @@ account_dialog_create_settings_widget (EmpathyAccountsDialog *dialog,
   accounts_dialog_update_name_label (dialog,
       empathy_account_settings_get_display_name (settings));
 
-  account = empathy_account_settings_get_account (settings);
   accounts_dialog_update_status_infobar (dialog, account);
 }
 
@@ -604,7 +818,7 @@ account_dialog_settings_ready_cb (EmpathyAccountSettings *settings,
     EmpathyAccountsDialog *dialog)
 {
   if (empathy_account_settings_is_ready (settings))
-    account_dialog_create_settings_widget (dialog, settings);
+    account_dialog_create_dialog_content (dialog, settings);
 }
 
 static void
@@ -650,97 +864,6 @@ accounts_dialog_has_pending_change (EmpathyAccountsDialog *dialog,
           priv->setting_widget_object);
 }
 
-static void
-accounts_dialog_setup_ui_to_add_account (EmpathyAccountsDialog *dialog)
-{
-  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
-  EmpathyAccountSettings *settings;
-
-  settings = empathy_protocol_chooser_create_account_settings (
-      EMPATHY_PROTOCOL_CHOOSER (priv->combobox_protocol));
-  if (settings == NULL)
-    return;
-
-  accounts_dialog_add (dialog, settings);
-  accounts_dialog_model_set_selected (dialog, settings);
-
-  gtk_widget_show_all (priv->hbox_protocol);
-
-  g_object_unref (settings);
-}
-
-static void
-accounts_dialog_protocol_changed_cb (GtkWidget *widget,
-    EmpathyAccountsDialog *dialog)
-{
-  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
-  GtkTreeSelection *selection;
-  GtkTreeModel *model;
-  GtkTreeIter iter;
-  gboolean creating;
-  EmpathyAccountSettings *settings;
-  gchar *account = NULL, *password = NULL;
-
-  /* The "changed" signal is fired during the initiation of the
-   * EmpathyProtocolChooser while populating the widget. Such signals should
-   * be ignored so we check if we are actually creating a new account. */
-  if (priv->setting_widget_object == NULL)
-    return;
-
-  g_object_get (priv->setting_widget_object,
-      "creating-account", &creating, NULL);
-  if (!creating)
-    return;
-
-  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
-
-  if (!gtk_tree_selection_get_selected (selection, &model, &iter))
-    return;
-
-  /* Save "account" and "password" parameters */
-  g_object_get (priv->setting_widget_object, "settings", &settings, NULL);
-
-  if (settings != NULL)
-    {
-      account = g_strdup (empathy_account_settings_get_string (settings,
-            "account"));
-      password = g_strdup (empathy_account_settings_get_string (settings,
-            "password"));
-      g_object_unref (settings);
-    }
-
-  /* We are creating a new widget to replace the current one, don't ask
-   * confirmation to the user. */
-  priv->force_change_row = TRUE;
-
-  /* We'll update the selection after we create the new account widgets;
-   * updating it right now causes problems for the # of accounts = zero case */
-  g_signal_handlers_block_by_func (selection,
-      accounts_dialog_model_selection_changed, dialog);
-
-  gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
-
-  g_signal_handlers_unblock_by_func (selection,
-      accounts_dialog_model_selection_changed, dialog);
-
-  accounts_dialog_setup_ui_to_add_account (dialog);
-
-  /* Restore "account" and "password" parameters in the new widget */
-  if (account != NULL)
-    {
-      empathy_account_widget_set_account_param (priv->setting_widget_object,
-          account);
-      g_free (account);
-    }
-
-  if (password != NULL)
-    {
-      empathy_account_widget_set_password_param (priv->setting_widget_object,
-          password);
-      g_free (password);
-    }
-}
-
 static void
 accounts_dialog_show_question_dialog (EmpathyAccountsDialog *dialog,
     const gchar *primary_text,
@@ -781,24 +904,6 @@ accounts_dialog_show_question_dialog (EmpathyAccountsDialog *dialog,
   gtk_widget_show (message_dialog);
 }
 
-static void
-accounts_dialog_add_pending_changes_response_cb (GtkDialog *message_dialog,
-  gint response_id,
-  gpointer *user_data)
-{
-  EmpathyAccountsDialog *dialog = EMPATHY_ACCOUNTS_DIALOG (user_data);
-  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
-
-  gtk_widget_destroy (GTK_WIDGET (message_dialog));
-
-  if (response_id == GTK_RESPONSE_YES)
-    {
-      empathy_account_widget_discard_pending_changes (
-          priv->setting_widget_object);
-      accounts_dialog_setup_ui_to_add_account (dialog);
-    }
-}
-
 static gchar *
 get_dialog_primary_text (TpAccount *account)
 {
@@ -817,37 +922,32 @@ get_dialog_primary_text (TpAccount *account)
 
 static void
 accounts_dialog_button_add_clicked_cb (GtkWidget *button,
-    EmpathyAccountsDialog *dialog)
+    EmpathyAccountsDialog *self)
 {
-  TpAccount *account = NULL;
-  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
+  GtkWidget *dialog;
+  gint response;
 
-  if (accounts_dialog_has_pending_change (dialog, &account))
-    {
-      gchar *question_dialog_primary_text = get_dialog_primary_text (account);
+  dialog = empathy_new_account_dialog_new (GTK_WINDOW (self));
+  gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
 
-      accounts_dialog_show_question_dialog (dialog,
-          question_dialog_primary_text,
-          _("You are about to create a new account, which will discard\n"
-              "your changes. Are you sure you want to proceed?"),
-          G_CALLBACK (accounts_dialog_add_pending_changes_response_cb),
-          dialog,
-          GTK_STOCK_CANCEL, GTK_RESPONSE_NO,
-          GTK_STOCK_DISCARD, GTK_RESPONSE_YES, NULL);
+  response = gtk_dialog_run (GTK_DIALOG (dialog));
 
-      g_free (question_dialog_primary_text);
-    }
-  else
+  if (response == GTK_RESPONSE_OK)
     {
-      accounts_dialog_setup_ui_to_add_account (dialog);
-      gtk_widget_set_sensitive (priv->treeview, FALSE);
-      gtk_widget_set_sensitive (priv->button_add, FALSE);
-      gtk_widget_set_sensitive (priv->button_remove, FALSE);
-      gtk_widget_set_sensitive (priv->button_import, FALSE);
+      EmpathyAccountSettings *settings;
+      TpAccount *account;
+
+      settings = empathy_new_account_dialog_get_settings (
+          EMPATHY_NEW_ACCOUNT_DIALOG (dialog));
+
+      /* The newly created account has already been added by
+       * accounts_dialog_account_validity_changed_cb so we just
+       * have to select it. */
+      account = empathy_account_settings_get_account (settings);
+      accounts_dialog_model_set_selected (self, account);
     }
 
-  if (account != NULL)
-    g_object_unref (account);
+  gtk_widget_destroy (dialog);
 }
 
 static void
@@ -883,15 +983,6 @@ accounts_dialog_update_settings (EmpathyAccountsDialog *dialog,
 
           return;
         }
-      if (empathy_connection_managers_get_cms_num (priv->cms) > 0)
-        {
-          /* We have no account configured but we have some
-           * profiles installed. The user obviously wants to add
-           * an account. Click on the Add button for him. */
-          accounts_dialog_button_add_clicked_cb (priv->button_add,
-              dialog);
-          return;
-        }
 
       /* No account and no profile, warn the user */
       gtk_widget_hide (priv->vbox_details);
@@ -906,15 +997,15 @@ accounts_dialog_update_settings (EmpathyAccountsDialog *dialog,
   gtk_widget_show (priv->vbox_details);
   gtk_widget_hide (priv->hbox_protocol);
 
-  if (priv->settings_widget)
+  if (priv->dialog_content)
     {
-      gtk_widget_destroy (priv->settings_widget);
-      priv->settings_widget = NULL;
+      gtk_widget_destroy (priv->dialog_content);
+      priv->dialog_content = NULL;
     }
 
   if (empathy_account_settings_is_ready (settings))
     {
-      account_dialog_create_settings_widget (dialog, settings);
+      account_dialog_create_dialog_content (dialog, settings);
     }
   else
     {
@@ -1483,41 +1574,6 @@ accounts_dialog_model_setup (EmpathyAccountsDialog *dialog)
   g_object_unref (store);
 }
 
-static gboolean
-accounts_dialog_get_settings_iter (EmpathyAccountsDialog *dialog,
-    EmpathyAccountSettings *settings,
-    GtkTreeIter *iter)
-{
-  GtkTreeView      *view;
-  GtkTreeModel     *model;
-  gboolean          ok;
-  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
-
-  /* Update the status in the model */
-  view = GTK_TREE_VIEW (priv->treeview);
-  model = gtk_tree_view_get_model (view);
-
-  for (ok = gtk_tree_model_get_iter_first (model, iter);
-       ok;
-       ok = gtk_tree_model_iter_next (model, iter))
-    {
-      EmpathyAccountSettings *this_settings;
-      gboolean   equal;
-
-      gtk_tree_model_get (model, iter,
-          COL_ACCOUNT_SETTINGS, &this_settings,
-          -1);
-
-      equal = (this_settings == settings);
-      g_object_unref (this_settings);
-
-      if (equal)
-        return TRUE;
-    }
-
-  return FALSE;
-}
-
 static gboolean
 accounts_dialog_get_account_iter (EmpathyAccountsDialog *dialog,
     TpAccount *account,
@@ -1536,15 +1592,15 @@ accounts_dialog_get_account_iter (EmpathyAccountsDialog *dialog,
        ok;
        ok = gtk_tree_model_iter_next (model, iter))
     {
-      EmpathyAccountSettings *settings;
+      TpAccount *this_account;
       gboolean   equal;
 
       gtk_tree_model_get (model, iter,
-          COL_ACCOUNT_SETTINGS, &settings,
+          COL_ACCOUNT, &this_account,
           -1);
 
-      equal = empathy_account_settings_has_account (settings, account);
-      g_object_unref (settings);
+      equal = (this_account == account);
+      g_object_unref (this_account);
 
       if (equal)
         return TRUE;
@@ -1577,11 +1633,11 @@ select_and_scroll_to_iter (EmpathyAccountsDialog *dialog,
 
 static void
 accounts_dialog_model_set_selected (EmpathyAccountsDialog *dialog,
-    EmpathyAccountSettings *settings)
+    TpAccount *account)
 {
   GtkTreeIter       iter;
 
-  if (accounts_dialog_get_settings_iter (dialog, settings, &iter))
+  if (accounts_dialog_get_account_iter (dialog, account, &iter))
     select_and_scroll_to_iter (dialog, &iter);
 }
 
@@ -1679,27 +1735,6 @@ finally:
   return FALSE;
 }
 
-static void
-accounts_dialog_add (EmpathyAccountsDialog *dialog,
-    EmpathyAccountSettings *settings)
-{
-  GtkTreeModel       *model;
-  GtkTreeIter         iter;
-  const gchar        *name;
-  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
-
-  model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->treeview));
-  name = empathy_account_settings_get_display_name (settings);
-
-  gtk_list_store_append (GTK_LIST_STORE (model), &iter);
-
-  gtk_list_store_set (GTK_LIST_STORE (model), &iter,
-      COL_NAME, name,
-      COL_STATUS, TP_CONNECTION_STATUS_DISCONNECTED,
-      COL_ACCOUNT_SETTINGS, settings,
-      -1);
-}
-
 static void
 accounts_dialog_connection_changed_cb (TpAccount *account,
     guint old_status,
@@ -1878,32 +1913,13 @@ accounts_dialog_add_account (EmpathyAccountsDialog *dialog,
   g_object_unref (settings);
 }
 
-static void
-account_prepare_cb (GObject *source_object,
-    GAsyncResult *result,
-    gpointer user_data)
-{
-  EmpathyAccountsDialog *dialog = EMPATHY_ACCOUNTS_DIALOG (user_data);
-  TpAccount *account = TP_ACCOUNT (source_object);
-  GError *error = NULL;
-
-  if (!tp_proxy_prepare_finish (account, result, &error))
-    {
-      DEBUG ("Failed to prepare account: %s", error->message);
-      g_error_free (error);
-      return;
-    }
-
-  accounts_dialog_add_account (dialog, account);
-}
-
 static void
 accounts_dialog_account_validity_changed_cb (TpAccountManager *manager,
     TpAccount *account,
     gboolean valid,
     EmpathyAccountsDialog *dialog)
 {
-  tp_proxy_prepare_async (account, NULL, account_prepare_cb, dialog);
+  accounts_dialog_add_account (dialog, account);
 }
 
 static void
@@ -1982,15 +1998,24 @@ accounts_dialog_account_enabled_cb (TpAccountManager *manager,
   enable_or_disable_account (dialog, account, TRUE);
 }
 
-static void
-accounts_dialog_button_import_clicked_cb (GtkWidget *button,
-    EmpathyAccountsDialog *dialog)
+static GtkWidget *
+display_import_dialog (EmpathyAccountsDialog *dialog)
 {
+  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
   GtkWidget *import_dialog;
 
   import_dialog = empathy_import_dialog_new (GTK_WINDOW (dialog),
-      FALSE);
+      FALSE, priv->cms);
   gtk_widget_show (import_dialog);
+
+  return import_dialog;
+}
+
+static void
+accounts_dialog_button_import_clicked_cb (GtkWidget *button,
+    EmpathyAccountsDialog *dialog)
+{
+  display_import_dialog (dialog);
 }
 
 static void
@@ -2177,8 +2202,8 @@ accounts_dialog_build_ui (EmpathyAccountsDialog *dialog)
   GtkBuilder                   *gui;
   gchar                        *filename;
   EmpathyAccountsDialogPriv    *priv = GET_PRIV (dialog);
-  GtkWidget                    *content_area;
-  GtkWidget *action_area, *vbox, *hbox, *align;
+  GtkWidget *content_area, *action_area;
+  GtkWidget *grid, *hbox;
   GtkWidget *alig;
   GtkWidget *sw, *toolbar;
   GtkStyleContext *context;
@@ -2248,13 +2273,6 @@ accounts_dialog_build_ui (EmpathyAccountsDialog *dialog)
   gtk_widget_set_sensitive (priv->button_import, FALSE);
   gtk_widget_set_sensitive (priv->treeview, FALSE);
 
-  priv->combobox_protocol = empathy_protocol_chooser_new ();
-  gtk_box_pack_start (GTK_BOX (priv->hbox_protocol), priv->combobox_protocol,
-      TRUE, TRUE, 0);
-  g_signal_connect (priv->combobox_protocol, "changed",
-      G_CALLBACK (accounts_dialog_protocol_changed_cb),
-      dialog);
-
   if (priv->parent_window)
     gtk_window_set_transient_for (GTK_WINDOW (dialog),
         priv->parent_window);
@@ -2264,36 +2282,26 @@ accounts_dialog_build_ui (EmpathyAccountsDialog *dialog)
       priv->infobar);
   gtk_widget_show (priv->infobar);
 
-  content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (priv->infobar));
+  grid = gtk_grid_new ();
+  gtk_container_add (
+      GTK_CONTAINER (gtk_info_bar_get_content_area (
+          GTK_INFO_BAR (priv->infobar))),
+      grid);
 
   priv->image_type = gtk_image_new_from_stock (GTK_STOCK_CUT,
       GTK_ICON_SIZE_DIALOG);
   gtk_misc_set_alignment (GTK_MISC (priv->image_type), 0.0, 0.5);
-  gtk_box_pack_start (GTK_BOX (content_area), priv->image_type, FALSE, FALSE, 0);
-  gtk_widget_show (priv->image_type);
-
-  vbox = gtk_vbox_new (FALSE, 6);
-  gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
-  gtk_widget_show (vbox);
+  gtk_grid_attach (GTK_GRID (grid), priv->image_type, 0, 0, 1, 2);
 
   /* first row */
-  align = gtk_alignment_new (0.5, 0.0, 0.0, 0.0);
-  gtk_widget_show (align);
-
   priv->label_name = gtk_label_new (NULL);
-  gtk_container_add (GTK_CONTAINER (align), priv->label_name);
-  gtk_widget_show (priv->label_name);
-
-  gtk_box_pack_start (GTK_BOX (vbox), align, TRUE, TRUE, 0);
+  gtk_grid_attach (GTK_GRID (grid), priv->label_name, 1, 0, 1, 1);
 
   /* second row */
-  align = gtk_alignment_new (0.5, 0.0, 0.0, 0.0);
-  gtk_widget_show (align);
-  hbox = gtk_hbox_new (FALSE, 6);
-  gtk_widget_show (hbox);
-  gtk_container_add (GTK_CONTAINER (align), hbox);
-
-  gtk_box_pack_start (GTK_BOX (vbox), align, TRUE, TRUE, 0);
+  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
+  gtk_widget_set_hexpand (hbox, TRUE);
+  gtk_widget_set_halign (hbox, GTK_ALIGN_CENTER);
+  gtk_grid_attach (GTK_GRID (grid), hbox, 1, 1, 1, 1);
 
   /* set up spinner */
   priv->throbber = gtk_spinner_new ();
@@ -2303,22 +2311,20 @@ accounts_dialog_build_ui (EmpathyAccountsDialog *dialog)
             TP_CONNECTION_PRESENCE_TYPE_OFFLINE), GTK_ICON_SIZE_SMALL_TOOLBAR);
 
   priv->label_status = gtk_label_new (NULL);
-  gtk_label_set_line_wrap (GTK_LABEL (priv->label_status), TRUE);
-  gtk_widget_show (priv->label_status);
+  gtk_label_set_ellipsize (GTK_LABEL (priv->label_status), PANGO_ELLIPSIZE_END);
 
   gtk_box_pack_start (GTK_BOX (hbox), priv->throbber, FALSE, FALSE, 0);
-  gtk_box_pack_start (GTK_BOX (hbox), priv->image_status, FALSE, FALSE, 3);
-  gtk_box_pack_start (GTK_BOX (hbox), priv->label_status, TRUE, TRUE, 0);
+  gtk_box_pack_start (GTK_BOX (hbox), priv->image_status, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (hbox), priv->label_status, FALSE, FALSE, 0);
 
   /* enabled switch */
-  align = gtk_alignment_new (0.5, 0.5, 1., 0.);
-  gtk_box_pack_start (GTK_BOX (content_area), align, FALSE, TRUE, 0);
-
   priv->enabled_switch = gtk_switch_new ();
-  gtk_container_add (GTK_CONTAINER (align), priv->enabled_switch);
+  gtk_widget_set_valign (priv->enabled_switch, GTK_ALIGN_CENTER);
   g_signal_connect (priv->enabled_switch, "notify::active",
       G_CALLBACK (accounts_dialog_enable_switch_active_cb), dialog);
-  gtk_widget_show_all (align);
+  gtk_grid_attach (GTK_GRID (grid), priv->enabled_switch, 2, 0, 1, 2);
+
+  gtk_widget_show_all (grid);
 
   /* Tweak the dialog */
   gtk_window_set_title (GTK_WINDOW (dialog), _("Messaging and VoIP Accounts"));