android tv: add share qr code page

Adds a page to share QR code. Includes QR icon on homepage.

Change-Id: I22717771893c53d98ea3db535d498c5ad48d49f6
diff --git a/ring-android/app/src/main/AndroidManifest.xml b/ring-android/app/src/main/AndroidManifest.xml
index 5a14206..a24b41f 100644
--- a/ring-android/app/src/main/AndroidManifest.xml
+++ b/ring-android/app/src/main/AndroidManifest.xml
@@ -281,6 +281,9 @@
             android:name=".tv.account.TVProfileEditingActivity"
             android:theme="@style/Theme.Leanback" />
         <activity
+            android:name=".tv.account.TVShareActivity"
+            android:theme="@style/Theme.Ring.Leanback" />
+        <activity
             android:name=".tv.call.TVCallActivity"
             android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize"
             android:resizeableActivity="true"
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 4994081..96c7b0e 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
@@ -72,8 +72,10 @@
 import cx.ring.tv.account.TVRingAccountCreationFragment;
 import cx.ring.tv.account.TVRingLinkAccountFragment;
 import cx.ring.tv.account.TVSettingsFragment;
+import cx.ring.tv.account.TVShareFragment;
 import cx.ring.tv.call.TVCallActivity;
 import cx.ring.tv.call.TVCallFragment;
+import cx.ring.tv.cards.iconcards.IconCardPresenter;
 import cx.ring.tv.contact.TVContactFragment;
 import cx.ring.tv.contactrequest.TVContactRequestFragment;
 import cx.ring.tv.main.MainFragment;
@@ -186,6 +188,8 @@
 
     void inject(TVProfileEditingFragment activity);
 
+    void inject(TVShareFragment activity);
+
     void inject(TVContactRequestFragment fragment);
 
     void inject(TVContactFragment fragment);
@@ -201,4 +205,6 @@
     void inject(RingJobService fragment);
 
     void inject(ContactDetailsActivity fragment);
+
+    void inject(IconCardPresenter presenter);
 }
diff --git a/ring-android/app/src/main/java/cx/ring/share/ShareFragment.java b/ring-android/app/src/main/java/cx/ring/share/ShareFragment.java
index 299ff10..0905676 100644
--- a/ring-android/app/src/main/java/cx/ring/share/ShareFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/share/ShareFragment.java
@@ -123,7 +123,7 @@
 
     @Override
     public void showViewModel(final ShareViewModel viewModel) {
-        final QRCodeUtils.QRCodeData qrCodeData = viewModel.getAccountQRCodeData();
+        final QRCodeUtils.QRCodeData qrCodeData = viewModel.getAccountQRCodeData(0xFF000000, 0xFFFFFFFF);
 
         if (mQrImage == null || mShareInstruction == null) {
             return;
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVShareActivity.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVShareActivity.java
new file mode 100644
index 0000000..98bb8cd
--- /dev/null
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVShareActivity.java
@@ -0,0 +1,35 @@
+/*
+ *  Copyright (C) 2004-2019 Savoir-faire Linux Inc.
+ *
+ *  Author: Rayan Osseiran <rayan.osseiran@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.os.Bundle;
+import androidx.fragment.app.FragmentActivity;
+import cx.ring.R;
+
+
+public class TVShareActivity extends FragmentActivity {
+
+    public static final String SHARED_ELEMENT_NAME = "photo";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.tv_activity_share);
+    }
+}
\ No newline at end of file
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVShareFragment.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVShareFragment.java
new file mode 100644
index 0000000..4f2d9dd
--- /dev/null
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVShareFragment.java
@@ -0,0 +1,85 @@
+/*
+ *  Copyright (C) 2004-2019 Savoir-faire Linux Inc.
+ *
+ *  Authors: Adrien Béraud <adrien.beraud@savoirfairelinux.com>
+ *           Rayan Osseiran <rayan.osseiran@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.graphics.Bitmap;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+
+import butterknife.BindString;
+import butterknife.BindView;
+import cx.ring.R;
+import cx.ring.dependencyinjection.RingInjectionComponent;
+import cx.ring.mvp.BaseFragment;
+import cx.ring.mvp.GenericView;
+import cx.ring.share.SharePresenter;
+import cx.ring.share.ShareViewModel;
+import cx.ring.utils.QRCodeUtils;
+
+public class TVShareFragment extends BaseFragment<SharePresenter> implements GenericView<ShareViewModel> {
+
+
+    @BindView(R.id.share_instruction)
+    protected TextView mShareInstruction;
+
+    @BindView(R.id.qr_image)
+    protected ImageView mQrImage;
+
+    @BindString(R.string.share_message)
+    protected String mShareMessage;
+
+    @Override
+    public int getLayout() {
+        return R.layout.tv_frag_share;
+    }
+
+    @Override
+    public void injectFragment(RingInjectionComponent component) {
+        component.inject(this);
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+    }
+
+    @Override
+    public void showViewModel(final ShareViewModel viewModel) {
+        final QRCodeUtils.QRCodeData qrCodeData = viewModel.getAccountQRCodeData(0x00000000, 0xFFFFFFFF);
+
+        if (mQrImage == null || mShareInstruction == null) {
+            return;
+        }
+
+        if (qrCodeData == null) {
+            mQrImage.setVisibility(View.INVISIBLE);
+        } else {
+            Bitmap bitmap = Bitmap.createBitmap(qrCodeData.getWidth(), qrCodeData.getHeight(), Bitmap.Config.ARGB_8888);
+            bitmap.setPixels(qrCodeData.getData(), 0, qrCodeData.getWidth(), 0, 0, qrCodeData.getWidth(), qrCodeData.getHeight());
+            mQrImage.setImageBitmap(bitmap);
+            mShareInstruction.setText(mShareMessage);
+            mQrImage.setVisibility(View.VISIBLE);
+        }
+    }
+}
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 772002e..094e0b2 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
@@ -17,6 +17,7 @@
 package cx.ring.tv.cards;
 
 import android.graphics.Color;
+import android.graphics.drawable.BitmapDrawable;
 import androidx.annotation.DrawableRes;
 
 /**
@@ -26,6 +27,7 @@
 public class Card {
 
     int mLocalImageResource = -1;
+    BitmapDrawable mBitmapDrawable = null;
     private String mTitle = "";
     private CharSequence mDescription = "";
     /*not used at the moment but will be use in futur*/
@@ -95,6 +97,14 @@
         mLocalImageResource = localImageResource;
     }
 
+    public void setBitmapDrawableResource(BitmapDrawable bitmapDrawable) {
+        mBitmapDrawable = bitmapDrawable;
+    }
+
+    public BitmapDrawable getBitmapDrawableResource() {
+        return mBitmapDrawable;
+    }
+
     /*not used at the moment but will be use in futur*/
     public String getFooterResource() {
         return mFooterResource;
@@ -128,6 +138,7 @@
         ABOUT_CONTRIBUTOR,
         ACCOUNT_ADD_DEVICE,
         ACCOUNT_EDIT_PROFILE,
+        ACCOUNT_SHARE_ACCOUNT,
         ABOUT_LICENCES,
         CONTACT,
         CONTACT_ONLINE,
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 c594f1a..14e21dd 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
@@ -51,6 +51,7 @@
                 case ABOUT_LICENCES:
                 case ACCOUNT_ADD_DEVICE:
                 case ACCOUNT_EDIT_PROFILE:
+                case ACCOUNT_SHARE_ACCOUNT:
                 case ACCOUNT_SETTINGS:
                     presenter = new IconCardPresenter(mContext);
                     break;
diff --git a/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCard.java b/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCard.java
index 6735d99..fbbfad3 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCard.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCard.java
@@ -19,6 +19,8 @@
  */
 package cx.ring.tv.cards.iconcards;
 
+import android.graphics.drawable.BitmapDrawable;
+
 import androidx.annotation.DrawableRes;
 
 import cx.ring.tv.cards.Card;
@@ -32,4 +34,10 @@
         setLocalImageResource(imageId);
     }
 
+    public IconCard(Type pType, String name, CharSequence description, BitmapDrawable bitmapDrawable) {
+        setType(pType);
+        setTitle(name);
+        setDescription(description);
+        setBitmapDrawableResource(bitmapDrawable);
+    }
 }
diff --git a/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardHelper.java b/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardHelper.java
index 861030c..caf60bb 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardHelper.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardHelper.java
@@ -21,6 +21,7 @@
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.graphics.drawable.BitmapDrawable;
 import android.text.Html;
 import android.text.SpannableString;
 import android.text.style.UnderlineSpan;
@@ -49,6 +50,8 @@
                 return getAccountManagementCard(pContext);
             case ACCOUNT_SETTINGS:
                 return getAccountSettingsCard(pContext);
+            case ACCOUNT_SHARE_ACCOUNT:
+                return getAccountShareCard(pContext, null);
             default:
                 return null;
         }
@@ -66,6 +69,10 @@
         return new IconCard(Card.Type.ACCOUNT_SETTINGS, pContext.getString(R.string.menu_item_settings), "", R.drawable.ic_settings_white);
     }
 
+    public static IconCard getAccountShareCard(Context pContext, BitmapDrawable bitmapDrawable) {
+        return new IconCard(Card.Type.ACCOUNT_SHARE_ACCOUNT, pContext.getString(R.string.menu_item_share), "", bitmapDrawable);
+    }
+
     public static IconCard getVersionCard(Context pContext) {
         return new IconCard(Card.Type.ABOUT_VERSION, pContext.getString(R.string.version_section) + " " + BuildConfig.VERSION_NAME, "", R.drawable.ic_ring_logo_white_vd);
     }
diff --git a/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardPresenter.java b/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardPresenter.java
index 2f1a96d..7d8394f 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardPresenter.java
@@ -27,7 +27,9 @@
 import android.view.ContextThemeWrapper;
 import android.widget.ImageView;
 
+
 import cx.ring.R;
+import cx.ring.application.RingApplication;
 import cx.ring.tv.cards.AbstractCardPresenter;
 import cx.ring.tv.cards.Card;
 
@@ -41,6 +43,7 @@
 
     @Override
     protected ImageCardView onCreateView() {
+        RingApplication.getInstance().getRingInjectionComponent().inject(this);
         ImageCardView imageCardView = new ImageCardView(getContext());
         final ImageView image = imageCardView.getMainImageView();
         image.setBackgroundResource(R.drawable.icon_focused);
@@ -53,8 +56,11 @@
     public void onBindViewHolder(Card card, ImageCardView cardView) {
         cardView.setTitleText(card.getTitle());
         cardView.setContentText(card.getDescription());
-        cardView.setMainImage(
-                ContextCompat.getDrawable(cardView.getContext(), card.getLocalImageResource()));
+
+        if(card.getBitmapDrawableResource() != null)
+            cardView.setMainImage(card.getBitmapDrawableResource());
+        else
+            cardView.setMainImage(ContextCompat.getDrawable(cardView.getContext(), card.getLocalImageResource()));
     }
 
     private void animateIconBackground(Drawable drawable, boolean hasFocus) {
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 16d6964..6ff265f 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
@@ -20,7 +20,16 @@
 package cx.ring.tv.main;
 
 import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
 import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import androidx.core.app.ActivityOptionsCompat;
 import androidx.leanback.app.BackgroundManager;
 import androidx.leanback.app.GuidedStepSupportFragment;
 import androidx.leanback.widget.ArrayObjectAdapter;
@@ -30,12 +39,6 @@
 import androidx.leanback.widget.Presenter;
 import androidx.leanback.widget.Row;
 import androidx.leanback.widget.RowPresenter;
-import androidx.core.app.ActivityOptionsCompat;
-
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -50,6 +53,7 @@
 import cx.ring.tv.account.TVAccountExport;
 import cx.ring.tv.account.TVProfileEditingActivity;
 import cx.ring.tv.account.TVSettingsActivity;
+import cx.ring.tv.account.TVShareActivity;
 import cx.ring.tv.call.TVCallActivity;
 import cx.ring.tv.cards.Card;
 import cx.ring.tv.cards.CardListRow;
@@ -64,6 +68,7 @@
 import cx.ring.tv.model.TVListViewModel;
 import cx.ring.tv.search.SearchActivity;
 import cx.ring.tv.views.CustomTitleView;
+import cx.ring.utils.QRCodeUtils;
 import cx.ring.views.AvatarDrawable;
 
 public class MainFragment extends BaseBrowseFragment<MainPresenter> implements MainView {
@@ -163,6 +168,7 @@
         List<Card> cards = new ArrayList<>();
         cards.add(IconCardHelper.getAccountAddDeviceCard(getActivity()));
         cards.add(IconCardHelper.getAccountManagementCard(getActivity()));
+        cards.add(IconCardHelper.getAccountShareCard(getActivity(), prepareAccountQr()));
         cards.add(IconCardHelper.getAccountSettingsCard(getActivity()));
 
         return createRow(getString(R.string.ring_account), cards, false);
@@ -245,6 +251,14 @@
     }
 
     @Override
+    public BitmapDrawable prepareAccountQr() {
+        QRCodeUtils.QRCodeData qrCodeData = QRCodeUtils.encodeStringAsQRCodeData(presenter.getAccountUri(), 0X00000000, 0xFFFFFFFF);
+        Bitmap bitmap = Bitmap.createBitmap(qrCodeData.getWidth(), qrCodeData.getHeight(), Bitmap.Config.ARGB_8888);
+        bitmap.setPixels(qrCodeData.getData(), 0, qrCodeData.getWidth(), 0, 0, qrCodeData.getWidth(), qrCodeData.getHeight());
+        return new BitmapDrawable(requireActivity().getResources(), bitmap);
+    }
+
+    @Override
     public void displayAccountInfos(final RingNavigationViewModel viewModel) {
         if (getActivity() == null) {
             Log.e(TAG, "displayAccountInfos: Not able to get activity");
@@ -287,6 +301,12 @@
     }
 
     @Override
+    public void showAccountShare() {
+        Intent intent = new Intent(getActivity(), TVShareActivity.class);
+        startActivity(intent);
+    }
+
+    @Override
     public void showLicence(int aboutType) {
         Intent intent = new Intent(getActivity(), AboutActivity.class);
         intent.putExtra("abouttype", aboutType);
@@ -337,6 +357,12 @@
                     case ACCOUNT_EDIT_PROFILE:
                         presenter.onEditProfileClicked();
                         break;
+                    case ACCOUNT_SHARE_ACCOUNT:
+                        ImageView view = ((ImageCardView) itemViewHolder.view).getMainImageView();
+                        Intent intent = new Intent(getActivity(), TVShareActivity.class);
+                        Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(requireActivity(), view, TVShareActivity.SHARED_ELEMENT_NAME).toBundle();
+                        requireActivity().startActivity(intent, bundle);
+                        break;
                     case ACCOUNT_SETTINGS:
                         presenter.onSettingsClicked();
                         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 9ecb54f..c9f8cc4 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
@@ -184,6 +184,10 @@
         getView().callContact(account.getAccountID(), ringID);
     }
 
+    public String getAccountUri() {
+        return mAccountService.getCurrentAccount().getDisplayUri();
+    }
+
     public void reloadAccountInfos() {
         if (mAccountService == null) {
             Log.e(TAG, "reloadAccountInfos: No account service available");
@@ -210,6 +214,10 @@
         getView().showProfileEditing();
     }
 
+    public void onShareAccountClicked() {
+        getView().showAccountShare();
+    }
+
     public void onSettingsClicked() {
         getView().showSettings();
     }
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 9d511ba..c8cfd6b 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
@@ -19,6 +19,8 @@
  */
 package cx.ring.tv.main;
 
+import android.graphics.drawable.BitmapDrawable;
+
 import java.util.List;
 
 import cx.ring.navigation.RingNavigationViewModel;
@@ -40,10 +42,14 @@
 
     void displayAccountInfos(RingNavigationViewModel viewModel);
 
+    BitmapDrawable prepareAccountQr();
+
     void showExportDialog(String pAccountID);
 
     void showProfileEditing();
 
+    void showAccountShare();
+
     void showLicence(int aboutType);
 
     void showSettings();
diff --git a/ring-android/app/src/main/res/layout-land/frag_share.xml b/ring-android/app/src/main/res/layout-land/frag_share.xml
index a070194..7f13f12 100644
--- a/ring-android/app/src/main/res/layout-land/frag_share.xml
+++ b/ring-android/app/src/main/res/layout-land/frag_share.xml
@@ -23,8 +23,8 @@
 
     <ImageView
         android:id="@+id/qr_image"
-        android:layout_width="300dp"
-        android:layout_height="300dp"
+        android:layout_width="@dimen/qr_code_size"
+        android:layout_height="@dimen/qr_code_size"
         android:layout_marginTop="8dp"
         android:layout_marginEnd="48dp"
         android:layout_marginBottom="8dp"
diff --git a/ring-android/app/src/main/res/layout-w720dp-land/tv_activity_home.xml b/ring-android/app/src/main/res/layout-w720dp-land/tv_activity_home.xml
deleted file mode 100644
index 7aa205e..0000000
--- a/ring-android/app/src/main/res/layout-w720dp-land/tv_activity_home.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<fragment xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/main_browse_fragment"
-    android:name="cx.ring.tv.main.MainFragment"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context="cx.ring.tv.main.HomeActivity"
-    tools:deviceIds="tv"
-    tools:ignore="MergeRootFrame" />
diff --git a/ring-android/app/src/main/res/layout-w720dp-land/tv_activity_share.xml b/ring-android/app/src/main/res/layout-w720dp-land/tv_activity_share.xml
new file mode 100644
index 0000000..bb24714
--- /dev/null
+++ b/ring-android/app/src/main/res/layout-w720dp-land/tv_activity_share.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+Copyright (C) 2004-2019 Savoir-faire Linux Inc.
+
+Author: Rayan Osseiran <rayan.osseiran@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, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+-->
+
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/share_frag"
+    android:name="cx.ring.tv.account.TVShareFragment"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="cx.ring.tv.account.TVShareActivity"
+    tools:deviceIds="tv"
+    tools:ignore="MergeRootFrame" />
diff --git a/ring-android/app/src/main/res/layout-w720dp-land/tv_frag_share.xml b/ring-android/app/src/main/res/layout-w720dp-land/tv_frag_share.xml
new file mode 100644
index 0000000..ea6ab38
--- /dev/null
+++ b/ring-android/app/src/main/res/layout-w720dp-land/tv_frag_share.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?><!--Copyright (C) 2004-2019 Savoir-faire Linux Inc.
+
+Author: Rayan Osseiran <rayan.osseiran@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, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+-->
+
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/share_instruction"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/padding_small"
+        android:layout_marginEnd="@dimen/padding_small"
+        android:gravity="center"
+        android:text="@string/share_message"
+        android:textColor="@color/text_color_primary_dark"
+        android:textSize="24sp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@+id/qr_image"
+        app:layout_constraintHorizontal_bias="0.5"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+
+    <ImageView
+        android:id="@+id/qr_image"
+        android:layout_width="@dimen/qr_code_size"
+        android:layout_height="@dimen/qr_code_size"
+        android:layout_marginEnd="48dp"
+        android:background="@null"
+        android:gravity="center"
+        android:padding="@dimen/padding_small"
+        android:scaleType="fitCenter"
+        android:transitionName="photo"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>
+
+
+
diff --git a/ring-android/app/src/main/res/layout/frag_share.xml b/ring-android/app/src/main/res/layout/frag_share.xml
index 04493fb..826ba48 100644
--- a/ring-android/app/src/main/res/layout/frag_share.xml
+++ b/ring-android/app/src/main/res/layout/frag_share.xml
@@ -8,8 +8,8 @@
 
     <ImageView
         android:id="@+id/qr_image"
-        android:layout_width="300dp"
-        android:layout_height="300dp"
+        android:layout_width="@dimen/qr_code_size"
+        android:layout_height="@dimen/qr_code_size"
         android:layout_marginTop="32dp"
         android:gravity="center"
         android:padding="@dimen/padding_small"
diff --git a/ring-android/app/src/main/res/layout/tv_activity_share.xml b/ring-android/app/src/main/res/layout/tv_activity_share.xml
new file mode 100644
index 0000000..a4700b0
--- /dev/null
+++ b/ring-android/app/src/main/res/layout/tv_activity_share.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+Copyright (C) 2004-2016 Savoir-faire Linux Inc.
+
+Author: Rayan Osseiran <rayan.osseiran@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, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+-->
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/share_frag"
+    android:name="cx.ring.tv.account.TVShareFragment"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="cx.ring.tv.account.TVShareActivity"
+    tools:deviceIds="tv"
+    tools:ignore="MergeRootFrame" />
\ No newline at end of file
diff --git a/ring-android/app/src/main/res/layout/tv_frag_share.xml b/ring-android/app/src/main/res/layout/tv_frag_share.xml
new file mode 100644
index 0000000..51bf74c
--- /dev/null
+++ b/ring-android/app/src/main/res/layout/tv_frag_share.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+
+    <ImageView
+        android:id="@+id/qr_image"
+        android:layout_width="300dp"
+        android:layout_height="300dp"
+        android:layout_marginStart="55dp"
+        android:layout_marginEnd="55dp"
+        android:layout_marginBottom="181dp"
+        android:gravity="center"
+        android:padding="@dimen/padding_small"
+        android:scaleType="fitCenter"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/share_instruction"
+        tools:layout_conversion_wrapHeight="1050"
+        tools:layout_conversion_wrapWidth="1050" />
+
+    <TextView
+        android:id="@+id/share_instruction"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="76dp"
+        android:layout_marginTop="128dp"
+        android:layout_marginEnd="76dp"
+        android:layout_marginBottom="64dp"
+        android:gravity="center"
+        android:text="@string/share_message"
+        android:textColor="@color/text_color_primary_dark"
+        android:textSize="16sp"
+        app:layout_constraintBottom_toTopOf="@+id/qr_image"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:layout_conversion_wrapHeight="215"
+        tools:layout_conversion_wrapWidth="1440" />
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/ring-android/app/src/main/res/values/dimens.xml b/ring-android/app/src/main/res/values/dimens.xml
index db4a380..bfc640a 100644
--- a/ring-android/app/src/main/res/values/dimens.xml
+++ b/ring-android/app/src/main/res/values/dimens.xml
@@ -53,5 +53,7 @@
     <dimen name="fab_margin">16dp</dimen>
     <dimen name="text_margin">16dp</dimen>
 
+    <dimen name="qr_code_size">300dp</dimen>
+
     <dimen name="tv_avatar_size">320dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/ring-android/app/src/main/res/values/styles.xml b/ring-android/app/src/main/res/values/styles.xml
index da5d20e..714f791 100644
--- a/ring-android/app/src/main/res/values/styles.xml
+++ b/ring-android/app/src/main/res/values/styles.xml
@@ -120,6 +120,7 @@
     </style>
 
     <style name="Theme.Ring.Leanback" parent="Theme.Leanback">
+        <item name="android:windowContentTransitions">true</item>
         <item name="searchOrbViewStyle">@style/CustomSearchOrbView</item>
     </style>