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>