AndroidTV: Add export account

Adds the ability to export and generate a pin for active account. 

Change-Id: I77a9de63ae48de7988d78a836c0b31e1b1a17c91
diff --git a/ring-android/app/src/main/java/cx/ring/dependencyinjection/RingInjectionComponent.java b/ring-android/app/src/main/java/cx/ring/dependencyinjection/RingInjectionComponent.java
index 49f7e82..687c4fa 100755
--- a/ring-android/app/src/main/java/cx/ring/dependencyinjection/RingInjectionComponent.java
+++ b/ring-android/app/src/main/java/cx/ring/dependencyinjection/RingInjectionComponent.java
@@ -62,6 +62,7 @@
 import cx.ring.services.SharedPreferencesServiceImpl;
 import cx.ring.settings.SettingsFragment;
 import cx.ring.share.ShareFragment;
+import cx.ring.tv.account.TVAccountExport;
 import cx.ring.tv.account.TVAccountWizard;
 import cx.ring.tv.account.TVHomeAccountCreationFragment;
 import cx.ring.tv.account.TVProfileCreationFragment;
@@ -180,6 +181,8 @@
 
     void inject(TVRingLinkAccountFragment fragment);
 
+    void inject(TVAccountExport fragment);
+
     void inject(TVLaunchActivity activity);
 
 }
diff --git a/ring-android/app/src/main/java/cx/ring/tv/about/AboutDetailsFragment.java b/ring-android/app/src/main/java/cx/ring/tv/about/AboutDetailsFragment.java
index ff7cf09..9db9355 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/about/AboutDetailsFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/about/AboutDetailsFragment.java
@@ -17,8 +17,8 @@
 
 import cx.ring.R;
 import cx.ring.tv.cards.Card;
-import cx.ring.tv.cards.about.AboutCard;
-import cx.ring.tv.cards.about.AboutCardHelper;
+import cx.ring.tv.cards.iconcards.IconCard;
+import cx.ring.tv.cards.iconcards.IconCardHelper;
 import cx.ring.utils.Log;
 
 public class AboutDetailsFragment extends DetailsFragment {
@@ -42,7 +42,7 @@
             cardType = Card.Type.values()[ordinal];
         }
 
-        AboutCard card = AboutCardHelper.getAboutCardByType(getActivity(), cardType);
+        IconCard card = IconCardHelper.getAboutCardByType(getActivity(), cardType);
 
         ClassPresenterSelector selector = new ClassPresenterSelector();
 
diff --git a/ring-android/app/src/main/java/cx/ring/tv/about/AboutDetailsPresenter.java b/ring-android/app/src/main/java/cx/ring/tv/about/AboutDetailsPresenter.java
index b1ac86e..629165c 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/about/AboutDetailsPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/about/AboutDetailsPresenter.java
@@ -10,7 +10,7 @@
 import butterknife.BindView;
 import butterknife.ButterKnife;
 import cx.ring.R;
-import cx.ring.tv.cards.about.AboutCard;
+import cx.ring.tv.cards.iconcards.IconCard;
 
 public class AboutDetailsPresenter
         extends Presenter {
@@ -33,7 +33,7 @@
 
     @Override
     public void onBindViewHolder(ViewHolder viewHolder, Object itemData) {
-        AboutCard card = (AboutCard) itemData;
+        IconCard card = (IconCard) itemData;
 
         mPrimaryText.setText(card.getTitle());
         mExtraText.setText(card.getDescription());
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVAccountExport.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVAccountExport.java
new file mode 100644
index 0000000..f4c2be3
--- /dev/null
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVAccountExport.java
@@ -0,0 +1,191 @@
+/*
+ *  Copyright (C) 2017 Savoir-faire Linux Inc.
+ *
+ *  Author: Loïc Siret <loic.siret@savoirfairelinux.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package cx.ring.tv.account;
+
+import android.app.AlertDialog;
+import android.app.ProgressDialog;
+import android.content.DialogInterface;
+import android.graphics.Typeface;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v17.leanback.widget.GuidanceStylist;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.text.Layout;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.style.AlignmentSpan;
+import android.text.style.RelativeSizeSpan;
+import android.text.style.StyleSpan;
+import android.view.View;
+
+import java.util.List;
+import java.util.Map;
+
+import cx.ring.R;
+import cx.ring.account.RingAccountSummaryPresenter;
+import cx.ring.account.RingAccountSummaryView;
+import cx.ring.application.RingApplication;
+import cx.ring.model.Account;
+
+public class TVAccountExport
+        extends RingGuidedStepFragment<RingAccountSummaryPresenter>
+        implements RingAccountSummaryView {
+
+    private static final long PASSWORD = 1L;
+    private ProgressDialog mWaitDialog;
+    private String mIdAccount;
+
+    public static TVAccountExport createInstance(String idAccount){
+        TVAccountExport fragment = new TVAccountExport();
+        fragment.mIdAccount = idAccount;
+        return fragment;
+    }
+
+    @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        ((RingApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this);
+
+        super.onViewCreated(view, savedInstanceState);
+        presenter.setAccountId(mIdAccount);
+    }
+
+    @Override
+    @NonNull
+    public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
+        String title = getString(R.string.account_export_title);
+        String breadcrumb = "";
+        String description = getString(R.string.account_link_export_info_light);
+        Drawable icon = getActivity().getResources().getDrawable(R.drawable.ic_contact_picture);
+        return new GuidanceStylist.Guidance(title, description, breadcrumb, icon);
+    }
+
+    @Override
+    public void onCreateActions(@NonNull List<GuidedAction> actions, Bundle savedInstanceState) {
+        addPasswordAction(actions, PASSWORD, getString(R.string.account_enter_password), "", "");
+    }
+
+    @Override
+    public long onGuidedActionEditedAndProceed(GuidedAction action) {
+        presenter.startAccountExport(action.getDescription().toString());
+        return GuidedAction.ACTION_ID_NEXT;
+    }
+
+    @Override
+    public int onProvideTheme() {
+        return R.style.Theme_Ring_Leanback_GuidedStep_First;
+    }
+
+    @Override
+    public void showExportingProgressDialog() {
+        mWaitDialog = ProgressDialog.show(getActivity(),
+                getString(R.string.export_account_wait_title),
+                getString(R.string.export_account_wait_message));
+    }
+
+    @Override
+    public void showRevokingProgressDialog() {
+
+    }
+
+    @Override
+    public void accountChanged(Account account) {
+
+    }
+
+    @Override
+    public void showNetworkError() {
+        RingApplication.uiHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                mWaitDialog.dismiss();
+                AlertDialog.Builder errorDialog = new AlertDialog.Builder(getActivity());
+                errorDialog.setTitle(R.string.account_export_end_network_title)
+                        .setMessage(R.string.account_export_end_network_message);
+                errorDialog.setPositiveButton(android.R.string.ok, null);
+                errorDialog.show();
+            }
+        });
+    }
+
+    @Override
+    public void showPasswordError() {
+        RingApplication.uiHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                mWaitDialog.dismiss();
+                AlertDialog.Builder errorDialog = new AlertDialog.Builder(getActivity());
+                errorDialog.setTitle(R.string.account_export_end_error_title)
+                        .setMessage(R.string.account_export_end_decryption_message);
+                errorDialog.setPositiveButton(android.R.string.ok, null);
+                errorDialog.show();
+            }
+        });
+    }
+
+    @Override
+    public void showGenericError() {
+        RingApplication.uiHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                mWaitDialog.dismiss();
+                AlertDialog.Builder errorDialog = new AlertDialog.Builder(getActivity());
+                errorDialog.setTitle(R.string.account_export_end_error_title)
+                        .setMessage(R.string.account_export_end_error_message);
+                errorDialog.setPositiveButton(android.R.string.ok, null);
+                errorDialog.show();
+            }
+        });
+    }
+
+    @Override
+    public void showPIN(final String pin) {
+        RingApplication.uiHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                mWaitDialog.dismiss();
+                String pined = getString(R.string.account_end_export_infos).replace("%%", pin);
+                final SpannableString styledResultText = new SpannableString(pined);
+                int pos = pined.lastIndexOf(pin);
+                styledResultText.setSpan(new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER), pos, (pos + pin.length()), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+                styledResultText.setSpan(new StyleSpan(Typeface.BOLD), pos, (pos + pin.length()), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+                styledResultText.setSpan(new RelativeSizeSpan(2.8f), pos, (pos + pin.length()), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+                AlertDialog.Builder successDialog = new AlertDialog.Builder(getActivity());
+                successDialog.setMessage(styledResultText);
+                successDialog.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        getFragmentManager().popBackStack();
+                    }
+                });
+                successDialog.show();
+            }
+        });
+    }
+
+    @Override
+    public void updateDeviceList(Map<String, String> devices, String currentDeviceId) {
+
+    }
+
+    @Override
+    public void deviceRevocationEnded(String device, int status) {
+
+    }
+}
diff --git a/ring-android/app/src/main/java/cx/ring/tv/cards/Card.java b/ring-android/app/src/main/java/cx/ring/tv/cards/Card.java
index 369e196..8651df7 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/cards/Card.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/cards/Card.java
@@ -118,11 +118,12 @@
     }
 
     public enum Type {
-        VERSION,
+        ABOUT_VERSION,
         DEFAULT,
         SEARCH_RESULT,
-        CONTRIBUTOR,
-        LICENCES,
+        ABOUT_CONTRIBUTOR,
+        ACCOUNT_ADD_DEVICE,
+        ABOUT_LICENCES,
         CONTACT,
         CONTACT_WITH_USERNAME,
     }
diff --git a/ring-android/app/src/main/java/cx/ring/tv/cards/CardPresenterSelector.java b/ring-android/app/src/main/java/cx/ring/tv/cards/CardPresenterSelector.java
index 4ffafb6..b085958 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/cards/CardPresenterSelector.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/cards/CardPresenterSelector.java
@@ -19,10 +19,11 @@
 import android.support.v17.leanback.widget.Presenter;
 import android.support.v17.leanback.widget.PresenterSelector;
 
+import java.security.InvalidParameterException;
 import java.util.HashMap;
 
 import cx.ring.R;
-import cx.ring.tv.cards.about.AboutCardPresenter;
+import cx.ring.tv.cards.iconcards.IconCardPresenter;
 import cx.ring.tv.cards.contacts.ContactCardPresenter;
 
 /**
@@ -46,10 +47,11 @@
         Presenter presenter = presenters.get(card.getType());
         if (presenter == null) {
             switch (card.getType()) {
-                case VERSION:
-                case CONTRIBUTOR:
-                case LICENCES:
-                    presenter = new AboutCardPresenter(mContext);
+                case ABOUT_VERSION:
+                case ABOUT_CONTRIBUTOR:
+                case ABOUT_LICENCES:
+                case ACCOUNT_ADD_DEVICE:
+                    presenter = new IconCardPresenter(mContext);
                     break;
                 case SEARCH_RESULT:
                     presenter = new ContactCardPresenter(mContext,R.style.SearchCardTheme);
@@ -61,8 +63,7 @@
                     presenter = new ContactCardPresenter(mContext,R.style.ContactCompleteCardTheme);
                     break;
                 default:
-                    presenter = new ContactCardPresenter(mContext, R.style.DefaultCardTheme);
-                    break;
+                    throw new InvalidParameterException("Uncatched card type");
             }
         }
         presenters.put(card.getType(), presenter);
diff --git a/ring-android/app/src/main/java/cx/ring/tv/cards/about/AboutCard.java b/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCard.java
similarity index 85%
rename from ring-android/app/src/main/java/cx/ring/tv/cards/about/AboutCard.java
rename to ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCard.java
index dc39cbb..1aaa3ce 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/cards/about/AboutCard.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCard.java
@@ -17,15 +17,15 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-package cx.ring.tv.cards.about;
+package cx.ring.tv.cards.iconcards;
 
 import android.support.annotation.DrawableRes;
 
 import cx.ring.tv.cards.Card;
 
-public class AboutCard extends Card {
+public class IconCard extends Card {
 
-    public AboutCard(Type pType, String name, CharSequence description, @DrawableRes int imageId) {
+    public IconCard(Type pType, String name, CharSequence description, @DrawableRes int imageId) {
         setType(pType);
         setTitle(name);
         setDescription(description);
diff --git a/ring-android/app/src/main/java/cx/ring/tv/cards/about/AboutCardHelper.java b/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardHelper.java
similarity index 65%
rename from ring-android/app/src/main/java/cx/ring/tv/cards/about/AboutCardHelper.java
rename to ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardHelper.java
index fd8c23b..1494023 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/cards/about/AboutCardHelper.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardHelper.java
@@ -17,7 +17,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-package cx.ring.tv.cards.about;
+package cx.ring.tv.cards.iconcards;
 
 import android.content.Context;
 import android.content.res.Resources;
@@ -30,35 +30,41 @@
 import cx.ring.tv.cards.Card;
 
 
-public final class AboutCardHelper {
+public final class IconCardHelper {
 
-    private AboutCardHelper() {
+    private IconCardHelper() {
         /* Helper so no constructor */
     }
 
-    public static AboutCard getAboutCardByType(Context pContext, Card.Type type) {
+    public static IconCard getAboutCardByType(Context pContext, Card.Type type) {
         switch (type) {
-            case CONTRIBUTOR:
+            case ABOUT_CONTRIBUTOR:
                 return getContributorCard(pContext);
-            case LICENCES:
+            case ABOUT_LICENCES:
                 return getLicencesCard(pContext);
-            case VERSION:
+            case ABOUT_VERSION:
                 return getVersionCard(pContext);
+            case ACCOUNT_ADD_DEVICE:
+                return getAccountAddDevice(pContext);
             default:
                 return null;
         }
     }
 
-    public static AboutCard getVersionCard(Context pContext) {
-        return new AboutCard(Card.Type.VERSION, pContext.getString(R.string.version_section) + " 1.0" + " " + BuildConfig.VERSION_NAME, "", R.drawable.ic_ring_logo_white);
+    public static IconCard getVersionCard(Context pContext) {
+        return new IconCard(Card.Type.ABOUT_VERSION, pContext.getString(R.string.version_section) + " 1.0" + " " + BuildConfig.VERSION_NAME, "", R.drawable.ic_ring_logo_white);
     }
 
-    public static AboutCard getLicencesCard(Context pContext) {
-        return new AboutCard(Card.Type.LICENCES, pContext.getString(R.string.section_license), formatLicence(pContext), R.drawable.ic_description);
+    public static IconCard getLicencesCard(Context pContext) {
+        return new IconCard(Card.Type.ABOUT_LICENCES, pContext.getString(R.string.section_license), formatLicence(pContext), R.drawable.ic_description);
     }
 
-    public static AboutCard getContributorCard(Context pContext) {
-        return new AboutCard(Card.Type.CONTRIBUTOR, pContext.getString(R.string.credits), formatContributors(pContext), R.drawable.ic_face);
+    public static IconCard getContributorCard(Context pContext) {
+        return new IconCard(Card.Type.ABOUT_CONTRIBUTOR, pContext.getString(R.string.credits), formatContributors(pContext), R.drawable.ic_face);
+    }
+
+    public static IconCard getAccountAddDevice(Context pContext) {
+        return new IconCard(Card.Type.ACCOUNT_ADD_DEVICE, pContext.getString(R.string.account_link_button), "",R.drawable.ic_add_white);
     }
 
     private static CharSequence formatLicence(Context pContext) {
diff --git a/ring-android/app/src/main/java/cx/ring/tv/cards/about/AboutCardPresenter.java b/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardPresenter.java
similarity index 93%
rename from ring-android/app/src/main/java/cx/ring/tv/cards/about/AboutCardPresenter.java
rename to ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardPresenter.java
index dc5ce51..d4bf362 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/cards/about/AboutCardPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardPresenter.java
@@ -17,7 +17,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-package cx.ring.tv.cards.about;
+package cx.ring.tv.cards.iconcards;
 
 import android.animation.ObjectAnimator;
 import android.content.Context;
@@ -32,11 +32,11 @@
 import cx.ring.tv.cards.AbstractCardPresenter;
 import cx.ring.tv.cards.Card;
 
-public class AboutCardPresenter extends AbstractCardPresenter<ImageCardView> {
+public class IconCardPresenter extends AbstractCardPresenter<ImageCardView> {
 
     private static final int ANIMATION_DURATION = 200;
 
-    public AboutCardPresenter(Context context) {
+    public IconCardPresenter(Context context) {
         super(new ContextThemeWrapper(context, R.style.IconCardTheme));
     }
 
diff --git a/ring-android/app/src/main/java/cx/ring/tv/main/HomeActivity.java b/ring-android/app/src/main/java/cx/ring/tv/main/HomeActivity.java
index 277567b..7468285 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/main/HomeActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/main/HomeActivity.java
@@ -25,6 +25,7 @@
 import android.os.Bundle;
 import android.provider.MediaStore;
 import android.support.annotation.NonNull;
+import android.support.v17.leanback.app.GuidedStepFragment;
 
 import javax.inject.Inject;
 
@@ -91,6 +92,10 @@
 
     @Override
     public void onBackPressed() {
-        finish();
+        if (GuidedStepFragment.getCurrentGuidedStepFragment(getFragmentManager()) != null) {
+            getFragmentManager().popBackStack();
+        } else {
+            finish();
+        }
     }
 }
\ No newline at end of file
diff --git a/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java b/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java
index b6f448a..41e1efd 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java
@@ -17,6 +17,7 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.v17.leanback.app.BackgroundManager;
+import android.support.v17.leanback.app.GuidedStepFragment;
 import android.support.v17.leanback.widget.ArrayObjectAdapter;
 import android.support.v17.leanback.widget.HeaderItem;
 import android.support.v17.leanback.widget.OnItemViewClickedListener;
@@ -24,6 +25,7 @@
 import android.support.v17.leanback.widget.PresenterSelector;
 import android.support.v17.leanback.widget.Row;
 import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v4.app.Fragment;
 import android.util.DisplayMetrics;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -36,15 +38,16 @@
 import cx.ring.application.RingApplication;
 import cx.ring.model.CallContact;
 import cx.ring.tv.about.AboutActivity;
+import cx.ring.tv.account.TVAccountExport;
 import cx.ring.tv.call.TVCallActivity;
 import cx.ring.tv.cards.Card;
 import cx.ring.tv.cards.CardListRow;
 import cx.ring.tv.cards.CardPresenterSelector;
 import cx.ring.tv.cards.CardRow;
 import cx.ring.tv.cards.ShadowRowPresenterSelector;
-import cx.ring.tv.cards.about.AboutCard;
-import cx.ring.tv.cards.about.AboutCardHelper;
 import cx.ring.tv.cards.contacts.ContactCard;
+import cx.ring.tv.cards.iconcards.IconCard;
+import cx.ring.tv.cards.iconcards.IconCardHelper;
 import cx.ring.tv.search.SearchActivity;
 
 public class MainFragment extends BaseBrowseFragment<MainPresenter> implements MainView {
@@ -96,7 +99,7 @@
 
         /* Contact Presenter */
         List<Card> cards = new ArrayList<>();
-        CardRow contacttRow = new CardRow(
+        CardRow contactRow = new CardRow(
                 CardRow.TYPE_DEFAULT,
                 true,
                 getString(R.string.tv_contact_row_header),
@@ -104,10 +107,11 @@
         HeaderItem cardPresenterHeader = new HeaderItem(HEADER_CONTACTS, getString(R.string.tv_contact_row_header));
         cardRowAdapter = new ArrayObjectAdapter(new CardPresenterSelector(getActivity()));
 
-        CardListRow contactListRow = new CardListRow(cardPresenterHeader, cardRowAdapter, contacttRow);
+        CardListRow contactListRow = new CardListRow(cardPresenterHeader, cardRowAdapter, contactRow);
 
         /* CardPresenter */
         mRowsAdapter.add(contactListRow);
+        mRowsAdapter.add(createMyAccountRow());
         mRowsAdapter.add(createAboutCardRow());
 
         setAdapter(mRowsAdapter);
@@ -125,17 +129,11 @@
         setOnItemViewClickedListener(new ItemViewClickedListener());
     }
 
-
-    private Row createAboutCardRow() {
-        List<Card> cards = new ArrayList<>();
-        cards.add(AboutCardHelper.getVersionCard(getActivity()));
-        cards.add(AboutCardHelper.getLicencesCard(getActivity()));
-        cards.add(AboutCardHelper.getContributorCard(getActivity()));
-
-        CardRow aboutRow = new CardRow(
+    private Row createRow(String titleSection, List<Card> cards, boolean shadow) {
+        CardRow row = new CardRow(
                 CardRow.TYPE_DEFAULT,
-                false,
-                getString(R.string.menu_item_about),
+                shadow,
+                titleSection,
                 cards);
 
         PresenterSelector presenterSelector = new CardPresenterSelector(getActivity());
@@ -144,9 +142,25 @@
             listRowAdapter.add(card);
         }
 
-        return new CardListRow(new HeaderItem(HEADER_MISC, getString(R.string.menu_item_about)), listRowAdapter, aboutRow);
+        return new CardListRow(new HeaderItem(HEADER_MISC, titleSection), listRowAdapter, row);
+
     }
 
+    private Row createMyAccountRow() {
+        List<Card> cards = new ArrayList<>();
+        cards.add(IconCardHelper.getAccountAddDevice(getActivity()));
+
+        return createRow(getString(R.string.ring_account), cards, false);
+    }
+
+    private Row createAboutCardRow() {
+        List<Card> cards = new ArrayList<>();
+        cards.add(IconCardHelper.getVersionCard(getActivity()));
+        cards.add(IconCardHelper.getLicencesCard(getActivity()));
+        cards.add(IconCardHelper.getContributorCard(getActivity()));
+
+        return createRow(getString(R.string.menu_item_about), cards, false);
+    }
 
     @Override
     public void showLoading(final boolean show) {
@@ -199,6 +213,12 @@
         });
     }
 
+    @Override
+    public void showExportDialog(String pAccountID) {
+        GuidedStepFragment wizard = TVAccountExport.createInstance(pAccountID);
+        GuidedStepFragment.add(getFragmentManager(), wizard,R.id.main_browse_fragment);
+    }
+
     private final class ItemViewClickedListener implements OnItemViewClickedListener {
         @Override
         public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
@@ -206,16 +226,19 @@
 
             if (item instanceof ContactCard) {
                 presenter.contactClicked(((ContactCard) item).getCallContact());
-            } else if (item instanceof AboutCard) {
-                AboutCard card = (AboutCard) item;
+            } else if (item instanceof IconCard) {
+                IconCard card = (IconCard) item;
                 switch (card.getType()) {
-                    case CONTRIBUTOR:
-                    case LICENCES:
+                    case ABOUT_CONTRIBUTOR:
+                    case ABOUT_LICENCES:
                         Intent intent = new Intent(getActivity(),
                                 AboutActivity.class);
                         intent.putExtra("abouttype", card.getType().ordinal());
                         startActivity(intent);
                         break;
+                    case ACCOUNT_ADD_DEVICE:
+                        presenter.onExportClicked();
+                         break;
                     default:
                         break;
                 }
diff --git a/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java b/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java
index 5cc1144..3879b7d 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java
@@ -133,4 +133,8 @@
         }
         getView().displayAccountInfos(displayableAddress);
     }
+
+    public void onExportClicked() {
+        getView().showExportDialog(mAccountService.getCurrentAccount().getAccountID());
+    }
 }
\ No newline at end of file
diff --git a/ring-android/app/src/main/java/cx/ring/tv/main/MainView.java b/ring-android/app/src/main/java/cx/ring/tv/main/MainView.java
index 9b49062..2125c4a 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/main/MainView.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/main/MainView.java
@@ -32,4 +32,6 @@
     void callContact(String accountID, String ringID);
 
     void displayAccountInfos(String address);
+
+    void showExportDialog(String pAccountID);
 }
diff --git a/ring-android/app/src/main/res/values/strings_account.xml b/ring-android/app/src/main/res/values/strings_account.xml
index a632d57..ea98331 100644
--- a/ring-android/app/src/main/res/values/strings_account.xml
+++ b/ring-android/app/src/main/res/values/strings_account.xml
@@ -188,6 +188,8 @@
     <string name="account_start_export_button">Generate Pin</string>
     <string name="account_end_export_button">close</string>
     <string name="account_end_export_infos">Your Pin is:\n\n%%\n\nTo complete the process, you need to open Ring on the new device. Create a new account with \"Link this device to an account\". Your pin is valid for 10 minutes.</string>
+    <string name="account_link_export_info_light">To use this account on other devices, you must first expose it on Ring. This will generate a PIN code that you must enter on the new device to set up the account. The PIN is valid for 10 minutes.</string>
+    <string name="account_export_title">Add devices</string>
 
     <!-- Name registration -->
     <string name="error_username_empty">Enter a username</string>