diff --git a/ring-android/app/src/main/AndroidManifest.xml b/ring-android/app/src/main/AndroidManifest.xml index 5a14206b5bfa6777b6c851cf06b8e3ddf20805de..a24b41f9492d46680652d3e5acfd3296745af57d 100644 --- a/ring-android/app/src/main/AndroidManifest.xml +++ b/ring-android/app/src/main/AndroidManifest.xml @@ -280,6 +280,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. <activity 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" 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 499408151e243ec8bafb16ec5ad8ee7b9fa71004..96c7b0ee3a2b216148570369627121e262a951ca 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.TVProfileEditingFragment; 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 @@ public interface RingInjectionComponent { void inject(TVProfileEditingFragment activity); + void inject(TVShareFragment activity); + void inject(TVContactRequestFragment fragment); void inject(TVContactFragment fragment); @@ -201,4 +205,6 @@ public interface RingInjectionComponent { 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 299ff1017152c8b791bdc4fa97b2058c732b7a04..0905676131cf6bad81fa9857bebc9122ca427902 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 @@ public class ShareFragment extends BaseSupportFragment<SharePresenter> implement @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 0000000000000000000000000000000000000000..98bb8cde74da5ee26c523f22b92d24389c053e63 --- /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 0000000000000000000000000000000000000000..4f2d9dda8eaa7c80752bb629d9e4dfda72138287 --- /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 772002e8c484b882ae04bc66ac98045bda18409b..094e0b24b6ecf7c752c47ddf4cf4e2fe871b2e7a 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 @@ import androidx.annotation.DrawableRes; 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 @@ public class Card { 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 @@ public class Card { 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 c594f1af52988deab3c8bbbbd58b39e844aaeffb..14e21dd043795ee4e90dceb18913249a973642f7 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 @@ public class CardPresenterSelector extends PresenterSelector { 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 6735d9914a1c83c811ebc141a8cbbea715433c34..fbbfad388189d871e5162271e8f96fdccdf81ef7 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 @@ public class IconCard extends Card { 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 861030c15bf5deb328c75608d72dd3489f5b1280..caf60bb30297305b4c120b02f95290e1e60847ae 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 @@ package cx.ring.tv.cards.iconcards; 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 @@ public final class IconCardHelper { return getAccountManagementCard(pContext); case ACCOUNT_SETTINGS: return getAccountSettingsCard(pContext); + case ACCOUNT_SHARE_ACCOUNT: + return getAccountShareCard(pContext, null); default: return null; } @@ -66,6 +69,10 @@ public final class IconCardHelper { 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 2f1a96d0b40fadd2432dffcc0fc82c81a315b1cc..7d8394f3bd563dd3d4f1038871a265df292e9e24 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 androidx.core.content.ContextCompat; 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 @@ public class IconCardPresenter extends AbstractCardPresenter<ImageCardView> { @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 class IconCardPresenter extends AbstractCardPresenter<ImageCardView> { 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 16d6964da182f3a1f43cb5dbbca42892c0a69649..6ff265f25661a8cd4d6a17bdab9e0b675accde42 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.OnItemViewClickedListener; 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.about.AboutActivity; 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.contactrequest.TVContactRequestActivity; 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 @@ public class MainFragment extends BaseBrowseFragment<MainPresenter> implements M 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); @@ -244,6 +250,14 @@ public class MainFragment extends BaseBrowseFragment<MainPresenter> implements M getActivity().startActivity(intent, null); } + @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) { @@ -286,6 +300,12 @@ public class MainFragment extends BaseBrowseFragment<MainPresenter> implements M startActivity(intent); } + @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); @@ -337,6 +357,12 @@ public class MainFragment extends BaseBrowseFragment<MainPresenter> implements M 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 9ecb54f632ac970ca9986d6d3a86450b313fea56..c9f8cc433cd509049604f57053c2c0c44f75829a 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 @@ public class MainPresenter extends RootPresenter<MainView> { 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 @@ public class MainPresenter extends RootPresenter<MainView> { 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 9d511baa6d0b1db4fcb661a8a0c37399f37a9eff..c8cfd6b959a556057d3f30eb4e6a75b5e50fafc7 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 @@ public interface MainView { 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 a0701949ce285fb58694e6a3b428a4b7ed2e7a83..7f13f122c7b67b816634f3eb79a103aca17876fa 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 7aa205ebc749770fe2983e417d7d55f26c3cb672..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..bb24714d17ddfe909b57567ae9eef144b9810d2f --- /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 0000000000000000000000000000000000000000..ea6ab3873bec54b46d00d70be26240d2f15bbadf --- /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 04493fbd1b6244e00ce2fd031bf38f4e6b93ad2d..826ba48b60fc4a2fb3fd91bdb3ce9b72807f23d6 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 0000000000000000000000000000000000000000..a4700b05c3bb5197ce190e43c7f088fa4add50a4 --- /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 0000000000000000000000000000000000000000..51bf74c127795a60d7253c67790df4ce20e0d137 --- /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 db4a3805edc1bddfe031ad17457a66f6243636b7..bfc640ad81ee313256ad398210e42e54994e8457 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 @@ along with this program; if not, write to the Free Software <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 da5d20e526d2abfbd2a1bb6395aff83131c5de7f..714f7918c901b7ad5e7ee815264274c1af98da22 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> diff --git a/ring-android/libringclient/src/main/java/cx/ring/share/ShareViewModel.java b/ring-android/libringclient/src/main/java/cx/ring/share/ShareViewModel.java index 0956ab10e318f6a11348fcd8fd2ea3ba4044b27d..594eae4996857188437c44b4d523e63bf448f92d 100644 --- a/ring-android/libringclient/src/main/java/cx/ring/share/ShareViewModel.java +++ b/ring-android/libringclient/src/main/java/cx/ring/share/ShareViewModel.java @@ -25,15 +25,13 @@ import cx.ring.utils.QRCodeUtils; public class ShareViewModel { private final String shareUri; - private final QRCodeUtils.QRCodeData data; public ShareViewModel(Account account) { shareUri = account.getDisplayUri(); - data = QRCodeUtils.encodeStringAsQRCodeData(account.getUri()); } - public QRCodeUtils.QRCodeData getAccountQRCodeData() { - return data; + public QRCodeUtils.QRCodeData getAccountQRCodeData(final int foregroundColor, final int backgroundColor) { + return QRCodeUtils.encodeStringAsQRCodeData(shareUri, foregroundColor, backgroundColor); } public String getAccountShareUri() { diff --git a/ring-android/libringclient/src/main/java/cx/ring/utils/QRCodeUtils.java b/ring-android/libringclient/src/main/java/cx/ring/utils/QRCodeUtils.java index e1b9bde3e97e40a6ea849e806509537960bdf06d..824be5471d1f3cfc907e833f551c2af7a4fa03b7 100644 --- a/ring-android/libringclient/src/main/java/cx/ring/utils/QRCodeUtils.java +++ b/ring-android/libringclient/src/main/java/cx/ring/utils/QRCodeUtils.java @@ -39,7 +39,7 @@ public class QRCodeUtils { * @param input uri to be displayed * @return the resulting data */ - public static QRCodeData encodeStringAsQRCodeData(String input) { + public static QRCodeData encodeStringAsQRCodeData(String input, final int foregroundColor, final int backgroundColor) { if (input == null || input.isEmpty()) { return null; @@ -62,13 +62,10 @@ public class QRCodeUtils { int qrImageHeight = qrImageMatrix.getHeight(); int[] pixels = new int[qrImageWidth * qrImageHeight]; - final int BLACK = 0xFF000000; - final int WHITE = 0xFFFFFFFF; - for (int row = 0; row < qrImageHeight; row++) { int offset = row * qrImageWidth; for (int column = 0; column < qrImageWidth; column++) { - pixels[offset + column] = qrImageMatrix.get(column, row) ? BLACK : WHITE; + pixels[offset + column] = qrImageMatrix.get(column, row) ? foregroundColor : backgroundColor; } }