]> git.0d.be Git - empathy.git/blobdiff - src/empathy-accounts-dialog.c
Updated Spanish translation
[empathy.git] / src / empathy-accounts-dialog.c
index 74cc85939bde9a0c21aef6cb955e785094a8759d..21b3fd609e7d0f16185cea06b172151e61658f12 100644 (file)
  *          Danielle Madeley <danielle.madeley@collabora.co.uk>
  */
 
-#include <config.h>
-
-#include <string.h>
-#include <stdlib.h>
+#include "config.h"
+#include "empathy-accounts-dialog.h"
 
-#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>
-#include <telepathy-glib/util.h>
-
-#include <libempathy/empathy-utils.h>
-#include <libempathy/empathy-connection-managers.h>
-#include <libempathy/empathy-pkg-kit.h>
-
-#include <libempathy-gtk/empathy-ui-utils.h>
-#include <libempathy-gtk/empathy-protocol-chooser.h>
-#include <libempathy-gtk/empathy-account-widget.h>
-#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-user-info.h>
-#include <libempathy-gtk/empathy-images.h>
-#include <libempathy-gtk/empathy-local-xmpp-assistant-widget.h>
-#include <libempathy-gtk/empathy-new-account-dialog.h>
+#include <tp-account-widgets/tpaw-account-widget.h>
+#include <tp-account-widgets/tpaw-builder.h>
+#include <tp-account-widgets/tpaw-user-info.h>
+#include <tp-account-widgets/tpaw-pixbuf-utils.h>
+#include <tp-account-widgets/tpaw-utils.h>
 
 #include "empathy-accounts-common.h"
-#include "empathy-accounts-dialog.h"
 #include "empathy-import-dialog.h"
 #include "empathy-import-utils.h"
+#include "empathy-local-xmpp-assistant-widget.h"
+#include "empathy-new-account-dialog.h"
+#include "empathy-pkg-kit.h"
+#include "empathy-ui-utils.h"
+#include "empathy-utils.h"
 
 #define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT
-#include <libempathy/empathy-debug.h>
+#include "empathy-debug.h"
 
 /* Flashing delay for icons (milliseconds). */
 #define FLASH_TIMEOUT 500
@@ -67,7 +52,7 @@
 /* The primary text of the dialog shown to the user when he is about to lose
  * unsaved changes */
 #define PENDING_CHANGES_QUESTION_PRIMARY_TEXT \
-  _("There are unsaved modifications to your %s account.")
+  _("There are unsaved modifications to your %.50s account.")
 /* The primary text of the dialog shown to the user when he is about to lose
  * an unsaved new account */
 #define UNSAVED_NEW_ACCOUNT_QUESTION_PRIMARY_TEXT \
@@ -111,28 +96,28 @@ typedef struct {
   GtkWidget *spinner;
   gboolean loading;
 
-  /* We have to keep a weak reference on the actual EmpathyAccountWidget, not
+  /* We have to keep a weak reference on the actual TpawAccountWidget, not
    * just its GtkWidget. It is the only reliable source we can query to know if
    * there are any unsaved changes to the currently selected account. We can't
    * look at the account settings because it does not contain everything that
-   * can be changed using the EmpathyAccountWidget. For instance, it does not
+   * can be changed using the TpawAccountWidget. For instance, it does not
    * contain the state of the "Enabled" checkbox.
    *
    * Even if we create it ourself, we just get a weak ref and not a strong one
-   * as EmpathyAccountWidget unrefs itself when the GtkWidget is destroyed.
+   * as TpawAccountWidget unrefs itself when the GtkWidget is destroyed.
    * That's kinda ugly; cf bgo #640417.
    *
    * */
-  EmpathyAccountWidget *setting_widget;
+  TpawAccountWidget *setting_widget;
 
   gboolean  connecting_show;
   guint connecting_id;
 
   gulong  settings_ready_id;
-  EmpathyAccountSettings *settings_ready;
+  TpawAccountSettings *settings_ready;
 
   TpAccountManager *account_manager;
-  EmpathyConnectionManagers *cms;
+  TpawConnectionManagers *cms;
   GNetworkMonitor *connectivity;
 
   GtkWindow *parent_window;
@@ -145,6 +130,8 @@ typedef struct {
    * EmpathyAccountsDialog object. */
   gboolean force_change_row;
   GtkTreeRowReference *destination_row;
+
+  GHashTable *icons_cache;
 } EmpathyAccountsDialogPriv;
 
 enum {
@@ -159,13 +146,13 @@ enum {
   PROP_PARENT = 1
 };
 
-static EmpathyAccountSettings * accounts_dialog_model_get_selected_settings (
+static TpawAccountSettings * accounts_dialog_model_get_selected_settings (
     EmpathyAccountsDialog *dialog);
 
 static void accounts_dialog_model_select_first (EmpathyAccountsDialog *dialog);
 
 static void accounts_dialog_update_settings (EmpathyAccountsDialog *dialog,
-    EmpathyAccountSettings *settings);
+    TpawAccountSettings *settings);
 
 static void accounts_dialog_model_set_selected (EmpathyAccountsDialog *dialog,
     TpAccount *account);
@@ -191,19 +178,6 @@ static void accounts_dialog_model_selection_changed (
 static gboolean accounts_dialog_has_pending_change (
     EmpathyAccountsDialog *dialog, TpAccount **account);
 
-static void
-accounts_dialog_update_name_label (EmpathyAccountsDialog *dialog,
-    const gchar *display_name)
-{
-  gchar *text;
-  EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
-
-  text = g_markup_printf_escaped ("<b>%s</b>", display_name);
-  gtk_label_set_markup (GTK_LABEL (priv->label_name), text);
-
-  g_free (text);
-}
-
 static void
 accounts_dialog_status_infobar_set_message (EmpathyAccountsDialog *dialog,
     const gchar *message)
@@ -241,7 +215,7 @@ accounts_dialog_enable_account_cb (GObject *object,
     {
       am = tp_account_manager_dup ();
 
-      empathy_connect_new_account (account, am);
+      tpaw_connect_new_account (account, am);
       g_object_unref (am);
     }
 }
@@ -259,7 +233,7 @@ accounts_dialog_enable_switch_active_cb (GtkSwitch *sw,
     GParamSpec *spec,
     EmpathyAccountsDialog *dialog)
 {
-  EmpathyAccountSettings *settings;
+  TpawAccountSettings *settings;
   TpAccount *account;
   gboolean enable;
 
@@ -267,7 +241,7 @@ accounts_dialog_enable_switch_active_cb (GtkSwitch *sw,
   if (settings == NULL)
     return;
 
-  account = empathy_account_settings_get_account (settings);
+  account = tpaw_account_settings_get_account (settings);
   if (account == NULL)
     return;
 
@@ -305,6 +279,8 @@ account_is_selected (EmpathyAccountsDialog *dialog,
     return FALSE;
 
   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
+  if (selection == NULL)
+    return FALSE;
 
   if (!gtk_tree_selection_get_selected (selection, &model, &iter))
     return FALSE;
@@ -353,6 +329,8 @@ accounts_dialog_update_status_infobar (EmpathyAccountsDialog *dialog,
 
   if (account != NULL)
     {
+      gchar *text;
+
       status = tp_account_get_connection_status (account, &reason);
       presence = tp_account_get_current_presence (account, NULL, &status_message);
       account_enabled = tp_account_is_enabled (account);
@@ -372,6 +350,11 @@ accounts_dialog_update_status_infobar (EmpathyAccountsDialog *dialog,
         presence = TP_CONNECTION_PRESENCE_TYPE_OFFLINE;
 
       display_switch = account_can_be_enabled (account);
+
+      text = g_markup_printf_escaped ("<b>%.50s</b>",
+          tp_account_get_display_name (account));
+      gtk_label_set_markup (GTK_LABEL (priv->label_name), text);
+      g_free (text);
     }
   else
     {
@@ -526,7 +509,7 @@ empathy_account_dialog_cancel (EmpathyAccountsDialog *dialog)
   GtkTreeModel *model;
   GtkTreeSelection *selection;
   GtkTreeIter iter;
-  EmpathyAccountSettings *settings;
+  TpawAccountSettings *settings;
   TpAccount *account;
   EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
 
@@ -540,7 +523,7 @@ empathy_account_dialog_cancel (EmpathyAccountsDialog *dialog)
       COL_ACCOUNT_SETTINGS, &settings,
       COL_ACCOUNT, &account, -1);
 
-  empathy_account_widget_discard_pending_changes (priv->setting_widget);
+  tpaw_account_widget_discard_pending_changes (priv->setting_widget);
 
   if (account == NULL)
     {
@@ -566,7 +549,7 @@ empathy_account_dialog_cancel (EmpathyAccountsDialog *dialog)
 
 static void
 empathy_account_dialog_widget_cancelled_cb (
-    EmpathyAccountWidget *widget_object,
+    TpawAccountWidget *widget_object,
     EmpathyAccountsDialog *dialog)
 {
   empathy_account_dialog_cancel (dialog);
@@ -598,7 +581,7 @@ static void
 account_dialog_create_edit_params_dialog (EmpathyAccountsDialog *dialog)
 {
   EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
-  EmpathyAccountSettings *settings;
+  TpawAccountSettings *settings;
   GtkWidget *subdialog, *content_area, *align;
 
   settings = accounts_dialog_model_get_selected_settings (dialog);
@@ -610,14 +593,16 @@ account_dialog_create_edit_params_dialog (EmpathyAccountsDialog *dialog)
       GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
       NULL, NULL);
 
-  priv->setting_widget = (EmpathyAccountWidget *)
-    empathy_account_widget_new_for_protocol (settings, FALSE);
+  gtk_window_set_resizable (GTK_WINDOW (subdialog), FALSE);
+
+  priv->setting_widget = (TpawAccountWidget *)
+    tpaw_account_widget_new_for_protocol (settings, NULL, FALSE);
 
   g_object_add_weak_pointer (G_OBJECT (priv->setting_widget),
       (gpointer *) &priv->setting_widget);
 
   if (accounts_dialog_has_valid_accounts (dialog))
-    empathy_account_widget_set_other_accounts_exist (
+    tpaw_account_widget_set_other_accounts_exist (
         priv->setting_widget, TRUE);
 
   g_signal_connect (priv->setting_widget, "cancelled",
@@ -639,42 +624,6 @@ account_dialog_create_edit_params_dialog (EmpathyAccountsDialog *dialog)
   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
-start_from_desktop_file (const char *desktop)
-{
-  GDesktopAppInfo *desktop_info;
-
-  desktop_info = g_desktop_app_info_new (desktop);
-  if (desktop_info == NULL)
-    {
-      g_critical ("Could not locate '%s'", desktop);
-      return;
-    }
-
-  start_external_app (G_APP_INFO (desktop_info));
-  g_object_unref (desktop_info);
-}
-
 static void
 use_external_storage_provider (EmpathyAccountsDialog *self,
     TpAccount *account)
@@ -684,47 +633,20 @@ use_external_storage_provider (EmpathyAccountsDialog *self,
   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);
+      empathy_launch_external_app ("gnome-control-center.desktop",
+          "bisho.desktop", NULL);
       return;
     }
   else if (!tp_strdiff (provider, EMPATHY_GOA_PROVIDER))
     {
-      start_from_desktop_file ("gnome-online-accounts-panel.desktop");
+      empathy_launch_external_app ("gnome-online-accounts-panel.desktop",
+          NULL, NULL);
       return;
     }
   else if (!tp_strdiff (provider, EMPATHY_UOA_PROVIDER))
     {
-      start_from_desktop_file ("gnome-credentials-panel.desktop");
+      empathy_launch_external_app ("unity-credentials-panel.desktop",
+          NULL, NULL);
       return;
     }
   else
@@ -738,7 +660,7 @@ static void
 account_dialow_show_edit_params_dialog (EmpathyAccountsDialog *dialog,
     GtkButton *button)
 {
-  EmpathyAccountSettings *settings;
+  TpawAccountSettings *settings;
   TpAccount *account;
   TpStorageRestrictionFlags storage_restrictions;
 
@@ -746,7 +668,7 @@ account_dialow_show_edit_params_dialog (EmpathyAccountsDialog *dialog,
   if (settings == NULL)
     return;
 
-  account = empathy_account_settings_get_account (settings);
+  account = tpaw_account_settings_get_account (settings);
   g_return_if_fail (account != NULL);
 
   storage_restrictions = tp_account_get_storage_restrictions (account);
@@ -766,7 +688,7 @@ account_dialow_show_edit_params_dialog (EmpathyAccountsDialog *dialog,
 
 static void
 account_dialog_create_dialog_content (EmpathyAccountsDialog *dialog,
-    EmpathyAccountSettings *settings)
+    TpawAccountSettings *settings)
 {
   EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
   const gchar *icon_name;
@@ -774,7 +696,7 @@ account_dialog_create_dialog_content (EmpathyAccountsDialog *dialog,
   GtkWidget *bbox, *button;
   GtkWidget *alig;
 
-  account = empathy_account_settings_get_account (settings);
+  account = tpaw_account_settings_get_account (settings);
 
   priv->dialog_content = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
   gtk_container_add (GTK_CONTAINER (priv->alignment_settings),
@@ -782,7 +704,7 @@ account_dialog_create_dialog_content (EmpathyAccountsDialog *dialog,
   gtk_widget_show (priv->dialog_content);
 
   alig = gtk_alignment_new (0.5, 0, 1, 1);
-  priv->user_info = empathy_user_info_new (account);
+  priv->user_info = tpaw_user_info_new (account);
   gtk_container_add (GTK_CONTAINER (alig), priv->user_info);
   gtk_box_pack_start (GTK_BOX (priv->dialog_content), alig, TRUE, TRUE, 0);
   gtk_widget_show (alig);
@@ -793,13 +715,13 @@ account_dialog_create_dialog_content (EmpathyAccountsDialog *dialog,
   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..."));
+  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);
+  icon_name = tpaw_account_settings_get_icon_name (settings);
 
   if (!gtk_icon_theme_has_icon (gtk_icon_theme_get_default (),
           icon_name))
@@ -811,22 +733,19 @@ account_dialog_create_dialog_content (EmpathyAccountsDialog *dialog,
   gtk_image_set_from_icon_name (GTK_IMAGE (priv->image_type),
       icon_name, GTK_ICON_SIZE_DIALOG);
   gtk_widget_set_tooltip_text (priv->image_type,
-      empathy_protocol_name_to_display_name
-      (empathy_account_settings_get_protocol (settings)));
+      tpaw_protocol_name_to_display_name
+      (tpaw_account_settings_get_protocol (settings)));
   gtk_widget_show (priv->image_type);
 
-  accounts_dialog_update_name_label (dialog,
-      empathy_account_settings_get_display_name (settings));
-
   accounts_dialog_update_status_infobar (dialog, account);
 }
 
 static void
-account_dialog_settings_ready_cb (EmpathyAccountSettings *settings,
+account_dialog_settings_ready_cb (TpawAccountSettings *settings,
     GParamSpec *spec,
     EmpathyAccountsDialog *dialog)
 {
-  if (empathy_account_settings_is_ready (settings))
+  if (tpaw_account_settings_is_ready (settings))
     account_dialog_create_dialog_content (dialog, settings);
 }
 
@@ -869,7 +788,7 @@ accounts_dialog_has_pending_change (EmpathyAccountsDialog *dialog,
     gtk_tree_model_get (model, &iter, COL_ACCOUNT, account, -1);
 
   return priv->setting_widget != NULL
-      && empathy_account_widget_contains_pending_changes (
+      && tpaw_account_widget_contains_pending_changes (
           priv->setting_widget);
 }
 
@@ -943,7 +862,7 @@ accounts_dialog_button_add_clicked_cb (GtkWidget *button,
 
   if (response == GTK_RESPONSE_APPLY)
     {
-      EmpathyAccountSettings *settings;
+      TpawAccountSettings *settings;
       TpAccount *account;
 
       settings = empathy_new_account_dialog_get_settings (
@@ -952,7 +871,7 @@ accounts_dialog_button_add_clicked_cb (GtkWidget *button,
       /* 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);
+      account = tpaw_account_settings_get_account (settings);
       accounts_dialog_model_set_selected (self, account);
     }
 
@@ -961,7 +880,7 @@ accounts_dialog_button_add_clicked_cb (GtkWidget *button,
 
 static void
 accounts_dialog_update_settings (EmpathyAccountsDialog *dialog,
-    EmpathyAccountSettings *settings)
+    TpawAccountSettings *settings)
 {
   EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
 
@@ -993,9 +912,10 @@ accounts_dialog_update_settings (EmpathyAccountsDialog *dialog,
           return;
         }
 
-      /* No account and no profile, warn the user */
+      /* No account selected */
       gtk_widget_hide (priv->vbox_details);
-      gtk_widget_set_sensitive (priv->button_add, FALSE);
+      gtk_widget_set_sensitive (priv->button_add, TRUE);
+      gtk_widget_set_sensitive (priv->button_remove, FALSE);
 
       gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook_account),
           NOTEBOOK_PAGE_NO_PROTOCOL);
@@ -1008,7 +928,7 @@ accounts_dialog_update_settings (EmpathyAccountsDialog *dialog,
 
   if (priv->user_info != NULL)
     {
-      empathy_user_info_apply_async ((EmpathyUserInfo *) priv->user_info,
+      tpaw_user_info_apply_async ((TpawUserInfo *) priv->user_info,
           NULL, NULL);
       priv->user_info = NULL;
     }
@@ -1018,7 +938,7 @@ accounts_dialog_update_settings (EmpathyAccountsDialog *dialog,
       priv->dialog_content = NULL;
     }
 
-  if (empathy_account_settings_is_ready (settings))
+  if (tpaw_account_settings_is_ready (settings))
     {
       account_dialog_create_dialog_content (dialog, settings);
     }
@@ -1096,6 +1016,28 @@ get_status_icon_for_account (EmpathyAccountsDialog *self,
   return empathy_icon_name_for_presence (presence);
 }
 
+static GdkPixbuf *
+ensure_icon (EmpathyAccountsDialog *self,
+    const gchar *icon_name)
+{
+  EmpathyAccountsDialogPriv *priv = GET_PRIV (self);
+  GdkPixbuf *pixbuf;
+
+  pixbuf = g_hash_table_lookup (priv->icons_cache, icon_name);
+  if (pixbuf == NULL)
+    {
+      pixbuf = tpaw_pixbuf_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON);
+
+      if (pixbuf == NULL)
+        return NULL;
+
+      g_hash_table_insert (priv->icons_cache, g_strdup (icon_name),
+          pixbuf);
+    }
+
+  return g_object_ref (pixbuf);
+}
+
 static void
 accounts_dialog_model_status_pixbuf_data_func (GtkTreeViewColumn *tree_column,
     GtkCellRenderer *cell,
@@ -1104,15 +1046,23 @@ accounts_dialog_model_status_pixbuf_data_func (GtkTreeViewColumn *tree_column,
     EmpathyAccountsDialog *dialog)
 {
   TpAccount *account;
+  const gchar *icon_name;
+  GdkPixbuf *pixbuf;
 
   gtk_tree_model_get (model, iter, COL_ACCOUNT, &account, -1);
 
+  icon_name = get_status_icon_for_account (dialog, account);
+  pixbuf = ensure_icon (dialog, icon_name);
+
   g_object_set (cell,
-      "icon-name", get_status_icon_for_account (dialog, account),
+      "pixbuf", pixbuf,
       NULL);
 
   if (account != NULL)
     g_object_unref (account);
+
+  if (pixbuf != NULL)
+    g_object_unref (pixbuf);
 }
 
 static void
@@ -1122,7 +1072,7 @@ accounts_dialog_model_protocol_pixbuf_data_func (GtkTreeViewColumn *tree_column,
     GtkTreeIter *iter,
     EmpathyAccountsDialog *dialog)
 {
-  EmpathyAccountSettings  *settings;
+  TpawAccountSettings  *settings;
   gchar              *icon_name;
   GdkPixbuf          *pixbuf;
   TpConnectionStatus  status;
@@ -1132,8 +1082,8 @@ accounts_dialog_model_protocol_pixbuf_data_func (GtkTreeViewColumn *tree_column,
       COL_ACCOUNT_SETTINGS, &settings,
       -1);
 
-  icon_name = empathy_account_settings_get_icon_name (settings);
-  pixbuf = empathy_pixbuf_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON);
+  icon_name = tpaw_account_settings_get_icon_name (settings);
+  pixbuf = ensure_icon (dialog, icon_name);
 
   g_object_set (cell,
       "visible", TRUE,
@@ -1194,7 +1144,7 @@ accounts_dialog_name_edited_cb (GtkCellRendererText *renderer,
     gchar *new_text,
     EmpathyAccountsDialog *dialog)
 {
-  EmpathyAccountSettings    *settings;
+  TpawAccountSettings    *settings;
   GtkTreeModel *model;
   GtkTreePath  *treepath;
   GtkTreeIter   iter;
@@ -1221,7 +1171,7 @@ accounts_dialog_name_edited_cb (GtkCellRendererText *renderer,
       -1);
   gtk_tree_path_free (treepath);
 
-  empathy_account_settings_set_display_name_async (settings, new_text,
+  tpaw_account_settings_set_display_name_async (settings, new_text,
       NULL, NULL);
   g_object_set (settings, "display-name-overridden", TRUE, NULL);
   g_object_unref (settings);
@@ -1295,7 +1245,7 @@ accounts_dialog_remove_account_iter (EmpathyAccountsDialog *dialog,
     }
 
   question_dialog_primary_text = g_strdup_printf (
-      _("Do you want to remove %s from your computer?"),
+      _("Do you want to remove %.50s from your computer?"),
       tp_account_get_display_name (account));
 
   accounts_dialog_show_question_dialog (dialog, question_dialog_primary_text,
@@ -1379,14 +1329,14 @@ accounts_dialog_model_add_columns (EmpathyAccountsDialog *dialog)
   g_object_set (priv->name_renderer, "ypad", 4, NULL);
 }
 
-static EmpathyAccountSettings *
+static TpawAccountSettings *
 accounts_dialog_model_get_selected_settings (EmpathyAccountsDialog *dialog)
 {
   GtkTreeView      *view;
   GtkTreeModel     *model;
   GtkTreeSelection *selection;
   GtkTreeIter       iter;
-  EmpathyAccountSettings   *settings;
+  TpawAccountSettings   *settings;
   EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
 
   view = GTK_TREE_VIEW (priv->treeview);
@@ -1406,7 +1356,7 @@ accounts_dialog_model_selection_changed (GtkTreeSelection *selection,
     EmpathyAccountsDialog *dialog)
 {
   EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
-  EmpathyAccountSettings *settings;
+  TpawAccountSettings *settings;
   GtkTreeModel *model;
   GtkTreeIter   iter;
   gboolean      is_selection;
@@ -1450,7 +1400,7 @@ accounts_dialog_selection_change_response_cb (GtkDialog *message_dialog,
         GtkTreeSelection *selection;
 
         priv->force_change_row = TRUE;
-        empathy_account_widget_discard_pending_changes (
+        tpaw_account_widget_discard_pending_changes (
             priv->setting_widget);
 
         path = gtk_tree_row_reference_get_path (priv->destination_row);
@@ -1536,7 +1486,7 @@ accounts_dialog_model_setup (EmpathyAccountsDialog *dialog)
       G_TYPE_STRING,         /* name */
       G_TYPE_UINT,           /* status */
       TP_TYPE_ACCOUNT,   /* account */
-      EMPATHY_TYPE_ACCOUNT_SETTINGS); /* settings */
+      TPAW_TYPE_ACCOUNT_SETTINGS); /* settings */
 
   gtk_tree_view_set_model (GTK_TREE_VIEW (priv->treeview),
       GTK_TREE_MODEL (store));
@@ -1742,7 +1692,7 @@ finally:
 static void
 reload_account_widget (EmpathyAccountsDialog *self)
 {
-  EmpathyAccountSettings *settings;
+  TpawAccountSettings *settings;
 
   settings = accounts_dialog_model_get_selected_settings (self);
   accounts_dialog_update_settings (self, settings);
@@ -1830,35 +1780,21 @@ accounts_dialog_presence_changed_cb (TpAccount *account,
 static void
 accounts_dialog_account_display_name_changed_cb (TpAccount *account,
   GParamSpec *pspec,
-  gpointer user_data)
+  EmpathyAccountsDialog *dialog)
 {
-  const gchar *display_name;
-  GtkTreeIter iter;
-  GtkTreeModel *model;
-  EmpathyAccountSettings *settings;
-  TpAccount *selected_account;
-  EmpathyAccountsDialog *dialog = EMPATHY_ACCOUNTS_DIALOG (user_data);
   EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
+  GtkTreeModel *model;
+  GtkTreeIter iter;
 
-  display_name = tp_account_get_display_name (account);
   model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->treeview));
-  settings = accounts_dialog_model_get_selected_settings (dialog);
-  if (settings == NULL)
-    return;
-
-  selected_account = empathy_account_settings_get_account (settings);
-
   if (accounts_dialog_get_account_iter (dialog, account, &iter))
     {
       gtk_list_store_set (GTK_LIST_STORE (model), &iter,
-          COL_NAME, display_name,
+          COL_NAME, tp_account_get_display_name (account),
           -1);
     }
 
-  if (selected_account == account)
-    accounts_dialog_update_name_label (dialog, display_name);
-
-  g_object_unref (settings);
+  accounts_dialog_update_status_infobar (dialog, account);
 }
 
 static void
@@ -1899,7 +1835,7 @@ static void
 accounts_dialog_add_account (EmpathyAccountsDialog *dialog,
     TpAccount *account)
 {
-  EmpathyAccountSettings *settings;
+  TpawAccountSettings *settings;
   GtkTreeModel       *model;
   GtkTreeIter         iter;
   TpConnectionStatus  status;
@@ -1912,7 +1848,7 @@ accounts_dialog_add_account (EmpathyAccountsDialog *dialog,
   status = tp_account_get_connection_status (account, NULL);
   name = tp_account_get_display_name (account);
 
-  settings = empathy_account_settings_new_for_account (account);
+  settings = tpaw_account_settings_new_for_account (account);
 
   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
 
@@ -1991,7 +1927,7 @@ accounts_dialog_accounts_model_row_inserted_cb (GtkTreeModel *model,
   if (priv->setting_widget != NULL &&
       accounts_dialog_has_valid_accounts (dialog))
     {
-      empathy_account_widget_set_other_accounts_exist (
+      tpaw_account_widget_set_other_accounts_exist (
           priv->setting_widget, TRUE);
     }
 }
@@ -2006,7 +1942,7 @@ accounts_dialog_accounts_model_row_deleted_cb (GtkTreeModel *model,
   if (priv->setting_widget != NULL &&
       !accounts_dialog_has_valid_accounts (dialog))
     {
-      empathy_account_widget_set_other_accounts_exist (
+      tpaw_account_widget_set_other_accounts_exist (
           priv->setting_widget, FALSE);
     }
 }
@@ -2219,11 +2155,11 @@ accounts_dialog_cms_prepare_cb (GObject *source,
     GAsyncResult *result,
     gpointer user_data)
 {
-  EmpathyConnectionManagers *cms = EMPATHY_CONNECTION_MANAGERS (source);
+  TpawConnectionManagers *cms = TPAW_CONNECTION_MANAGERS (source);
   EmpathyAccountsDialog *dialog = user_data;
   EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
 
-  if (!empathy_connection_managers_prepare_finish (cms, result, NULL))
+  if (!tpaw_connection_managers_prepare_finish (cms, result, NULL))
     goto out;
 
   /* No need to update the settings if we are already preparing one */
@@ -2261,16 +2197,16 @@ accounts_dialog_accounts_setup (EmpathyAccountsDialog *dialog)
       dialog);
 
   /* Add existing accounts */
-  accounts = tp_account_manager_get_valid_accounts (priv->account_manager);
+  accounts = tp_account_manager_dup_valid_accounts (priv->account_manager);
   for (l = accounts; l; l = l->next)
     {
       accounts_dialog_add_account (dialog, l->data);
     }
-  g_list_free (accounts);
+  g_list_free_full (accounts, g_object_unref);
 
-  priv->cms = empathy_connection_managers_dup_singleton ();
+  priv->cms = tpaw_connection_managers_dup_singleton ();
 
-  empathy_connection_managers_prepare_async (priv->cms,
+  tpaw_connection_managers_prepare_async (priv->cms,
       accounts_dialog_cms_prepare_cb, dialog);
 
   accounts_dialog_model_select_first (dialog);
@@ -2351,7 +2287,7 @@ accounts_dialog_build_ui (EmpathyAccountsDialog *dialog)
 
   filename = empathy_file_lookup ("empathy-accounts-dialog.ui", "src");
 
-  gui = empathy_builder_get_file (filename,
+  gui = tpaw_builder_get_file (filename,
       "accounts_dialog_hbox", &top_hbox,
       "vbox_details", &priv->vbox_details,
       "alignment_settings", &priv->alignment_settings,
@@ -2367,7 +2303,7 @@ accounts_dialog_build_ui (EmpathyAccountsDialog *dialog)
       NULL);
   g_free (filename);
 
-  empathy_builder_connect (gui, dialog,
+  tpaw_builder_connect (gui, dialog,
       "button_add", "clicked", accounts_dialog_button_add_clicked_cb,
       "button_remove", "clicked", accounts_dialog_button_remove_clicked_cb,
       "button_import", "clicked", accounts_dialog_button_import_clicked_cb,
@@ -2428,6 +2364,7 @@ accounts_dialog_build_ui (EmpathyAccountsDialog *dialog)
 
   /* first row */
   priv->label_name = gtk_label_new (NULL);
+  gtk_label_set_ellipsize (GTK_LABEL (priv->label_name), PANGO_ELLIPSIZE_END);
   gtk_grid_attach (GTK_GRID (grid), priv->label_name, 1, 0, 1, 1);
 
   /* second row */
@@ -2497,7 +2434,7 @@ do_dispose (GObject *obj)
 
   if (priv->user_info != NULL)
     {
-      empathy_user_info_apply_async ((EmpathyUserInfo *) priv->user_info,
+      tpaw_user_info_apply_async ((TpawUserInfo *) priv->user_info,
           NULL, NULL);
       priv->user_info = NULL;
     }
@@ -2532,6 +2469,8 @@ do_dispose (GObject *obj)
       priv->initial_selection = NULL;
     }
 
+  tp_clear_pointer (&priv->icons_cache, g_hash_table_unref);
+
   G_OBJECT_CLASS (empathy_accounts_dialog_parent_class)->dispose (obj);
 }
 
@@ -2626,6 +2565,9 @@ empathy_accounts_dialog_init (EmpathyAccountsDialog *dialog)
       EMPATHY_TYPE_ACCOUNTS_DIALOG,
       EmpathyAccountsDialogPriv);
   dialog->priv = priv;
+
+  priv->icons_cache = g_hash_table_new_full (g_str_hash, g_str_equal,
+      g_free, g_object_unref);
 }
 
 /* public methods */
@@ -2644,7 +2586,7 @@ empathy_accounts_dialog_show (GtkWindow *parent,
 
   if (selected_account)
     {
-      if (priv->cms != NULL && empathy_connection_managers_is_ready (priv->cms))
+      if (priv->cms != NULL && tpaw_connection_managers_is_ready (priv->cms))
         accounts_dialog_set_selected_account (dialog, selected_account);
       else
         /* save the selection to set it later when the cms
@@ -2658,6 +2600,92 @@ empathy_accounts_dialog_show (GtkWindow *parent,
   return GTK_WIDGET (dialog);
 }
 
+#ifdef HAVE_UOA
+typedef struct
+{
+  TpAccount *account;
+  gboolean if_needed;
+} LaunchUOACtx;
+
+static LaunchUOACtx *
+launch_uoa_ctx_new (TpAccount *account,
+    gboolean if_needed)
+{
+  LaunchUOACtx *ctx;
+
+  ctx = g_slice_new0 (LaunchUOACtx);
+  if (account != NULL)
+    ctx->account = g_object_ref (account);
+  ctx->if_needed = if_needed;
+
+  return ctx;
+}
+
+static void
+launch_uoa_ctx_free (LaunchUOACtx *ctx)
+{
+  g_clear_object (&ctx->account);
+  g_slice_free (LaunchUOACtx, ctx);
+}
+
+static void
+am_prepare_cb (GObject *source,
+    GAsyncResult *result,
+    gpointer user_data)
+{
+  TpAccountManager *manager = TP_ACCOUNT_MANAGER (source);
+  GError *error = NULL;
+  LaunchUOACtx *ctx = user_data;
+  gchar *args = NULL;
+
+  if (!tp_proxy_prepare_finish (manager, result, &error))
+    {
+      DEBUG ("Failed to prepare account manager: %s", error->message);
+      g_error_free (error);
+      goto out;
+    }
+
+  if (ctx->if_needed && empathy_accounts_has_non_salut_accounts (manager))
+    goto out;
+
+  if (ctx->account != NULL)
+    {
+      const GValue *value;
+
+      value = tp_account_get_storage_identifier (ctx->account);
+
+      if (G_VALUE_HOLDS_UINT (value))
+        args = g_strdup_printf ("account-details=%u", g_value_get_uint (value));
+    }
+
+  empathy_launch_external_app ("unity-credentials-panel.desktop", args, NULL);
+
+  g_free (args);
+out:
+  launch_uoa_ctx_free (ctx);
+}
+
+static void
+launch_uoa_panel (TpAccount *selected_account,
+    gboolean if_needed,
+    gboolean hidden)
+{
+  TpAccountManager *manager;
+
+  if (hidden)
+    /* Nothing to do */
+    return;
+
+  manager = tp_account_manager_dup ();
+
+  tp_proxy_prepare_async (manager, NULL, am_prepare_cb,
+      launch_uoa_ctx_new (selected_account, if_needed));
+
+  g_object_unref (manager);
+}
+
+#else /* HAVE_UOA */
+
 static void
 launch_empathy_accounts (TpAccount *selected_account,
     gboolean if_needed,
@@ -2688,6 +2716,7 @@ launch_empathy_accounts (TpAccount *selected_account,
 
   g_string_free (args, TRUE);
 }
+#endif /* HAVE_UOA */
 
 void
 empathy_accounts_dialog_show_application (GdkScreen *screen,
@@ -2695,7 +2724,11 @@ empathy_accounts_dialog_show_application (GdkScreen *screen,
     gboolean if_needed,
     gboolean hidden)
 {
+#ifdef HAVE_UOA
+  launch_uoa_panel (selected_account, if_needed, hidden);
+#else
   launch_empathy_accounts (selected_account, if_needed, hidden);
+#endif
 }
 
 gboolean