diff --git a/android/app/src/main/AndroidManifestBase.xml b/android/app/src/main/AndroidManifestBase.xml index 5d0c41846..f43b0369b 100644 --- a/android/app/src/main/AndroidManifestBase.xml +++ b/android/app/src/main/AndroidManifestBase.xml @@ -5,6 +5,7 @@ + YatService()); getIt.registerFactory(() => AddressResolver(yatService: getIt.get())); - + + getIt.registerFactoryParam( + (String qrData, bool isLight) => FullscreenQRPage(qrData: qrData, isLight: isLight,)); + _isSetupFinished = true; } diff --git a/lib/router.dart b/lib/router.dart index acfb18684..01443a138 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -1,6 +1,5 @@ import 'package:cake_wallet/entities/contact_record.dart'; import 'package:cake_wallet/buy/order.dart'; -import 'package:cake_wallet/entities/transaction_description.dart'; import 'package:cake_wallet/src/screens/backup/backup_page.dart'; import 'package:cake_wallet/src/screens/backup/edit_backup_password_page.dart'; import 'package:cake_wallet/src/screens/buy/buy_webview_page.dart'; @@ -13,10 +12,7 @@ import 'package:cake_wallet/src/screens/seed/pre_seed_page.dart'; import 'package:cake_wallet/src/screens/support/support_page.dart'; import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_details_page.dart'; import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_list_page.dart'; -import 'package:cake_wallet/store/settings_store.dart'; -import 'package:cake_wallet/view_model/buy/buy_view_model.dart'; import 'package:cake_wallet/view_model/monero_account_list/account_list_item.dart'; -import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_item.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/routes.dart'; @@ -26,7 +22,6 @@ import 'package:cake_wallet/utils/language_list.dart'; import 'package:cake_wallet/view_model/wallet_new_vm.dart'; import 'package:cake_wallet/view_model/wallet_restoration_from_seed_vm.dart'; import 'package:cake_wallet/view_model/wallet_restoration_from_keys_vm.dart'; -import 'package:cake_wallet/entities/contact.dart'; import 'package:cake_wallet/exchange/trade.dart'; import 'package:cw_core/transaction_info.dart'; import 'package:cw_core/wallet_type.dart'; @@ -66,16 +61,15 @@ import 'package:cake_wallet/src/screens/exchange/exchange_template_page.dart'; import 'package:cake_wallet/src/screens/exchange_trade/exchange_confirm_page.dart'; import 'package:cake_wallet/src/screens/exchange_trade/exchange_trade_page.dart'; import 'package:flutter/services.dart'; -import 'package:hive/hive.dart'; -import 'package:cake_wallet/wallet_type_utils.dart'; import 'package:cake_wallet/wallet_types.g.dart'; import 'package:cake_wallet/src/screens/dashboard/widgets/address_page.dart'; +import 'package:cake_wallet/src/screens/receive/fullscreen_qr_page.dart'; RouteSettings currentRouteSettings; Route createRoute(RouteSettings settings) { currentRouteSettings = settings; - + switch (settings.name) { case Routes.welcome: return MaterialPageRoute(builder: (_) => createWelcomePage()); @@ -84,7 +78,7 @@ Route createRoute(RouteSettings settings) { return CupertinoPageRoute( builder: (_) => getIt.get( param1: (PinCodeState context, dynamic _) { - if (availableWalletTypes.length == 1) { + if (availableWalletTypes.length == 1) { Navigator.of(context.context).pushNamed(Routes.newWallet, arguments: availableWalletTypes.first); } else { Navigator.of(context.context).pushNamed(Routes.newWalletType); @@ -402,6 +396,16 @@ Route createRoute(RouteSettings settings) { getIt.get( param1: args)); + case Routes.fullscreenQR: + final args = settings.arguments as Map; + + return MaterialPageRoute( + builder: (_) => + getIt.get( + param1: args['qrData'] as String, + param2: args['isLight'] as bool, + )); + default: return MaterialPageRoute( builder: (_) => Scaffold( diff --git a/lib/routes.dart b/lib/routes.dart index 23e236023..eea2b7488 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -60,4 +60,5 @@ class Routes { static const moneroRestoreWalletFromWelcome = '/monero_restore_wallet'; static const moneroNewWalletFromWelcome = '/monero_new_wallet'; static const addressPage = '/address_page'; + static const fullscreenQR = '/fullscreen_qr'; } \ No newline at end of file diff --git a/lib/src/screens/receive/fullscreen_qr_page.dart b/lib/src/screens/receive/fullscreen_qr_page.dart new file mode 100644 index 000000000..7ef87c749 --- /dev/null +++ b/lib/src/screens/receive/fullscreen_qr_page.dart @@ -0,0 +1,85 @@ +import 'package:cake_wallet/src/screens/receive/widgets/qr_image.dart'; +import 'package:cake_wallet/themes/theme_base.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:cake_wallet/src/screens/base_page.dart'; + +class FullscreenQRPage extends BasePage { + FullscreenQRPage({@required this.qrData, @required this.isLight}); + + final bool isLight; + final String qrData; + + @override + Color get backgroundLightColor => currentTheme.type == ThemeType.bright ? Colors.transparent : Colors.white; + + @override + Color get backgroundDarkColor => Colors.transparent; + + @override + bool get resizeToAvoidBottomInset => false; + + @override + Widget leading(BuildContext context) { + final _backButton = Icon( + Icons.arrow_back_ios, + color: Theme.of(context).accentTextTheme.display3.backgroundColor, + size: 16, + ); + + return SizedBox( + height: 37, + width: 37, + child: ButtonTheme( + minWidth: double.minPositive, + child: FlatButton( + highlightColor: Colors.transparent, + splashColor: Colors.transparent, + padding: EdgeInsets.all(0), + onPressed: () => onClose(context), + child: _backButton, + ), + ), + ); + } + + @override + Widget Function(BuildContext, Widget) get rootWrapper => (BuildContext context, Widget scaffold) => Container( + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Theme.of(context).accentColor, + Theme.of(context).scaffoldBackgroundColor, + Theme.of(context).primaryColor, + ], + begin: Alignment.topRight, + end: Alignment.bottomLeft, + ), + ), + child: scaffold); + + @override + Widget body(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: MediaQuery.of(context).size.width * 0.05), + child: Hero( + tag: Key(qrData), + child: Center( + child: AspectRatio( + aspectRatio: 1.0, + child: Container( + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + border: Border.all(width: 3, color: Theme.of(context).accentTextTheme.display3.backgroundColor)), + child: QrImage( + data: qrData, + backgroundColor: isLight ? Colors.transparent : Colors.black, + foregroundColor: Theme.of(context).accentTextTheme.display3.backgroundColor, + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/src/screens/receive/widgets/qr_widget.dart b/lib/src/screens/receive/widgets/qr_widget.dart index 1bfbd6230..96691aa45 100644 --- a/lib/src/screens/receive/widgets/qr_widget.dart +++ b/lib/src/screens/receive/widgets/qr_widget.dart @@ -1,4 +1,6 @@ +import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/utils/show_bar.dart'; +import 'package:device_display_brightness/device_display_brightness.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; @@ -38,101 +40,134 @@ class QRWidget extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Row(children: [ - Spacer(flex: 3), - Observer( - builder: (_) => Flexible( - flex: 5, - child: Center( - child: AspectRatio( - aspectRatio: 1.0, - child: Container( - padding: EdgeInsets.all(5), - decoration: BoxDecoration( - border: Border.all( - width: 3, - color: Theme.of(context).accentTextTheme. - display3.backgroundColor - ) - ), - child: QrImage( - data: addressListViewModel.uri.toString(), - backgroundColor: isLight ? Colors.transparent : Colors.black, - foregroundColor: Theme.of(context).accentTextTheme. - display3.backgroundColor, - ), - ))))), - Spacer(flex: 3) - ]), - if (isAmountFieldShow) + Column( + children: [ Padding( - padding: EdgeInsets.only(top: 10), - child: Row( - children: [ - Expanded( - child: Form( - key: _formKey, - child: BaseTextFormField( - focusNode: amountTextFieldFocusNode, - controller: amountController, - keyboardType: TextInputType.numberWithOptions( - decimal: true), - inputFormatters: [ - BlacklistingTextInputFormatter( - RegExp('[\\-|\\ ]')) - ], - textAlign: TextAlign.center, - hintText: S.of(context).receive_amount, - textColor: Theme.of(context).accentTextTheme. - display3.backgroundColor, - borderColor: Theme.of(context) - .textTheme - .headline - .decorationColor, - validator: AmountValidator( - type: addressListViewModel.type, - isAutovalidate: true), - autovalidate: true, - placeholderTextStyle: TextStyle( - color: Theme.of(context).hoverColor, - fontSize: 18, - fontWeight: FontWeight.w500)))) - ], - ), + padding: const EdgeInsets.only(bottom: 12), + child: Text( + S.of(context).qr_fullscreen, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + color: Theme.of(context).accentTextTheme.display3.backgroundColor), ), + ), + Row( + children: [ + Spacer(flex: 3), + Observer( + builder: (_) => Flexible( + flex: 5, + child: GestureDetector( + onTap: () async { + // Get the current brightness: + final double brightness = await DeviceDisplayBrightness.getBrightness(); + + // ignore: unawaited_futures + DeviceDisplayBrightness.setBrightness(1.0); + await Navigator.pushNamed( + context, + Routes.fullscreenQR, + arguments: { + 'qrData': addressListViewModel.uri.toString(), + 'isLight': isLight, + }, + ); + // ignore: unawaited_futures + DeviceDisplayBrightness.setBrightness(brightness); + }, + child: Hero( + tag: Key(addressListViewModel.uri.toString()), + child: Center( + child: AspectRatio( + aspectRatio: 1.0, + child: Container( + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + border: Border.all( + width: 3, + color: Theme.of(context).accentTextTheme.display3.backgroundColor, + ), + ), + child: QrImage( + data: addressListViewModel.uri.toString(), + backgroundColor: isLight ? Colors.transparent : Colors.black, + foregroundColor: Theme.of(context).accentTextTheme.display3.backgroundColor, + ), + ), + ), + ), + ), + ), + ), + ), + Spacer(flex: 3) + ], + ), + ], + ), + if (isAmountFieldShow) + Padding( + padding: EdgeInsets.only(top: 10), + child: Row( + children: [ + Expanded( + child: Form( + key: _formKey, + child: BaseTextFormField( + focusNode: amountTextFieldFocusNode, + controller: amountController, + keyboardType: TextInputType.numberWithOptions(decimal: true), + inputFormatters: [BlacklistingTextInputFormatter(RegExp('[\\-|\\ ]'))], + textAlign: TextAlign.center, + hintText: S.of(context).receive_amount, + textColor: Theme.of(context).accentTextTheme.display3.backgroundColor, + borderColor: Theme.of(context).textTheme.headline.decorationColor, + validator: AmountValidator(type: addressListViewModel.type, isAutovalidate: true), + autovalidate: true, + placeholderTextStyle: TextStyle( + color: Theme.of(context).hoverColor, + fontSize: 18, + fontWeight: FontWeight.w500, + ), + ), + ), + ), + ], + ), + ), Padding( padding: EdgeInsets.only(top: 8, bottom: 8), child: Builder( - builder: (context) => Observer( - builder: (context) => GestureDetector( - onTap: () { - Clipboard.setData(ClipboardData( - text: addressListViewModel.address.address)); - showBar( - context, S.of(context).copied_to_clipboard); - }, - child: Row( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Text( - addressListViewModel.address.address, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 15, - fontWeight: FontWeight.w500, - color: Theme.of(context).accentTextTheme. - display3.backgroundColor), - ), - ), - Padding( - padding: EdgeInsets.only(left: 12), - child: copyImage, - ) - ], - ), - ))), + builder: (context) => Observer( + builder: (context) => GestureDetector( + onTap: () { + Clipboard.setData(ClipboardData(text: addressListViewModel.address.address)); + showBar(context, S.of(context).copied_to_clipboard); + }, + child: Row( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Text( + addressListViewModel.address.address, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 15, + fontWeight: FontWeight.w500, + color: Theme.of(context).accentTextTheme.display3.backgroundColor), + ), + ), + Padding( + padding: EdgeInsets.only(left: 12), + child: copyImage, + ) + ], + ), + ), + ), + ), ) ], ); diff --git a/pubspec_base.yaml b/pubspec_base.yaml index 62f129246..8d1c098ae 100644 --- a/pubspec_base.yaml +++ b/pubspec_base.yaml @@ -54,6 +54,7 @@ dependencies: file_picker: ^3.0.0-nullsafety.2 unorm_dart: ^0.2.0 permission_handler: ^5.0.1+1 + device_display_brightness: ^0.0.6 dev_dependencies: flutter_test: diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 9d1cd281c..fa34eeced 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -151,6 +151,7 @@ "subaddresses" : "Unteradressen", "addresses" : "Adressen", "scan_qr_code" : "Scannen Sie den QR-Code, um die Adresse zu erhalten", + "qr_fullscreen" : "Tippen Sie hier, um den QR-Code im Vollbildmodus zu öffnen", "rename" : "Umbenennen", "choose_account" : "Konto auswählen", "create_new_account" : "Neues Konto erstellen", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index daa3d9d66..25c449929 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -151,6 +151,7 @@ "subaddresses" : "Subaddresses", "addresses" : "Addresses", "scan_qr_code" : "Scan the QR code to get the address", + "qr_fullscreen" : "Tap to open full screen QR code", "rename" : "Rename", "choose_account" : "Choose account", "create_new_account" : "Create new account", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index d9cfd2c4a..e520ff727 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -151,6 +151,7 @@ "subaddresses" : "Subdirecciones", "addresses" : "Direcciones", "scan_qr_code" : "Escanee el código QR para obtener la dirección", + "qr_fullscreen" : "Toque para abrir el código QR en pantalla completa", "rename" : "Rebautizar", "choose_account" : "Elegir cuenta", "create_new_account" : "Crear una nueva cuenta", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 6e728d7a1..af41bb225 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -149,6 +149,7 @@ "subaddresses" : "Sous-adresses", "addresses" : "Adresses", "scan_qr_code" : "Scannez le QR code pour obtenir l'adresse", + "qr_fullscreen" : "Appuyez pour ouvrir le code QR en plein écran", "rename" : "Renommer", "choose_account" : "Choisir le compte", "create_new_account" : "Créer un nouveau compte", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 34b90b9aa..9c61e180f 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -151,6 +151,7 @@ "subaddresses" : "उप पते", "addresses" : "पतों", "scan_qr_code" : "पता प्राप्त करने के लिए QR कोड स्कैन करें", + "qr_fullscreen" : "फ़ुल स्क्रीन क्यूआर कोड खोलने के लिए टैप करें", "rename" : "नाम बदलें", "choose_account" : "खाता चुनें", "create_new_account" : "नया खाता बनाएँ", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index 39fc60b1f..16142ccd3 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -151,6 +151,7 @@ "subaddresses" : "Podadrese", "addresses" : "Adrese", "scan_qr_code" : "Skeniraj QR kod za dobivanje adrese", + "qr_fullscreen" : "Dodirnite za otvaranje QR koda preko cijelog zaslona", "rename" : "Preimenuj", "choose_account" : "Odaberi račun", "create_new_account" : "Izradi novi račun", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 3b208aa33..10c22001a 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -151,6 +151,7 @@ "subaddresses" : "Sottoindirizzi", "addresses" : "Indirizzi", "scan_qr_code" : "Scansiona il codice QR per ottenere l'indirizzo", + "qr_fullscreen" : "Tocca per aprire il codice QR a schermo intero", "rename" : "Rinomina", "choose_account" : "Scegli account", "create_new_account" : "Crea nuovo account", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 5639e68b7..3e2c3e886 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -151,6 +151,7 @@ "subaddresses" : "サブアドレス", "addresses" : "住所", "scan_qr_code" : "QRコードをスキャンして住所を取得します", + "qr_fullscreen" : "タップして全画面QRコードを開く", "rename" : "リネーム", "choose_account" : "アカウントを選択", "create_new_account" : "新しいアカウントを作成する", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 50da9147e..ad3e3ac5b 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -151,6 +151,7 @@ "subaddresses" : "하위 주소", "addresses" : "구애", "scan_qr_code" : "QR 코드를 스캔하여 주소를 얻습니다.", + "qr_fullscreen" : "전체 화면 QR 코드를 열려면 탭하세요.", "rename" : "이름 바꾸기", "choose_account" : "계정을 선택하십시오", "create_new_account" : "새 계정을 만들", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 6f2343b53..834da2c02 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -152,6 +152,7 @@ "rename" : "Hernoemen", "addresses" : "Adressen", "scan_qr_code" : "Scan de QR-code om het adres te krijgen", + "qr_fullscreen" : "Tik om de QR-code op volledig scherm te openen", "choose_account" : "Kies account", "create_new_account" : "Creëer een nieuw account", "accounts_subaddresses" : "Accounts en subadressen", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 93199a569..6bcccb1e1 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -9,9 +9,6 @@ "monero_com": "Monero.com by Cake Wallet", "monero_com_wallet_text": "Awesome wallet for Monero", - "haven_app": "Haven by Cake Wallet", - "haven_app_wallet_text": "Awesome wallet for Haven", - "haven_app": "Haven by Cake Wallet", "haven_app_wallet_text": "Awesome wallet for Haven", @@ -154,6 +151,7 @@ "subaddresses" : "Podadresy", "addresses" : "Adresy", "scan_qr_code" : "Zeskanuj kod QR, aby uzyskać adres", + "qr_fullscreen" : "Dotknij, aby otworzyć pełnoekranowy kod QR", "rename" : "Przemianować", "choose_account" : "Wybierz konto", "create_new_account" : "Stwórz nowe konto", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 66dd01df4..8737de6c0 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -151,6 +151,7 @@ "subaddresses" : "Sub-endereços", "addresses" : "Endereços", "scan_qr_code" : "Digitalize o código QR para obter o endereço", + "qr_fullscreen" : "Toque para abrir o código QR em tela cheia", "rename" : "Renomear", "choose_account" : "Escolha uma conta", "create_new_account" : "Criar nova conta", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 3cc6b7518..7df0463fb 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -151,6 +151,7 @@ "subaddresses" : "Субадреса", "addresses" : "Адреса", "scan_qr_code" : "Отсканируйте QR-код для получения адреса", + "qr_fullscreen" : "Нажмите, чтобы открыть полноэкранный QR-код", "rename" : "Переименовать", "choose_account" : "Выберите аккаунт", "create_new_account" : "Создать новый аккаунт", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index cba4fca95..2ef8cbb6b 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -151,6 +151,7 @@ "subaddresses" : "Субадреси", "addresses" : "Адреси", "scan_qr_code" : "Скануйте QR-код для одержання адреси", + "qr_fullscreen" : "Торкніться, щоб відкрити QR-код на весь екран", "rename" : "Перейменувати", "choose_account" : "Оберіть акаунт", "create_new_account" : "Створити новий акаунт", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 79885392b..f8632ee98 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -151,6 +151,7 @@ "subaddresses" : "子地址", "addresses" : "地址", "scan_qr_code" : "扫描二维码获取地址", + "qr_fullscreen" : "点击打开全屏二维码", "rename" : "重命名", "choose_account" : "选择账户", "create_new_account" : "建立新账户",