QR code fullscreen (#390)

* Add fullscreen qr page flow * Add qr fullscreen text localization * Add package to control screen brightness when navigating to qr fullscreen and revert when leaving screen * ios fix trial 1 - Change brightness control package * Use package imports instead of relevant path Add Map types

Omar Hatem committed Jun 23, 2022 at 11:25 UTC 9568c5f9326b3453cb97fb0b5a6caf9abd382617
22 files changed +242 -100
android/app/src/main/AndroidManifestBase.xml
+1
@@ -5,6 +5,7 @@
5 <uses-permission android:name="android.permission.USE_FINGERPRINT"/>
6 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
7 <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
8 + <uses-permission android:name="android.permission.WAKE_LOCK" />
9
10 <application
11 android:name=".Application"
lib/di.dart
+5 -2
@@ -3,7 +3,6 @@ import 'package:cake_wallet/entities/parse_address_from_domain.dart';
3 import 'package:cake_wallet/entities/wake_lock.dart';
4 import 'package:cake_wallet/monero/monero.dart';
5 import 'package:cake_wallet/haven/haven.dart';
6 -import 'package:cake_wallet/haven/haven.dart';
6 import 'package:cake_wallet/bitcoin/bitcoin.dart';
7 import 'package:cake_wallet/src/screens/dashboard/widgets/balance_page.dart';
8 import 'package:cw_core/unspent_coins_info.dart';
@@ -125,6 +124,7 @@ import 'package:cake_wallet/entities/template.dart';
124 import 'package:cake_wallet/exchange/exchange_template.dart';
125 import 'package:cake_wallet/.secrets.g.dart' as secrets;
126 import 'package:cake_wallet/src/screens/dashboard/widgets/address_page.dart';
127 +import 'package:cake_wallet/src/screens/receive/fullscreen_qr_page.dart';
128
129 final getIt = GetIt.instance;
130
@@ -640,6 +640,9 @@ Future setup(
640 getIt.registerFactory(() => YatService());
641
642 getIt.registerFactory(() => AddressResolver(yatService: getIt.get<YatService>()));
643 -
643 +
644 + getIt.registerFactoryParam<FullscreenQRPage, String, bool>(
645 + (String qrData, bool isLight) => FullscreenQRPage(qrData: qrData, isLight: isLight,));
646 +
647 _isSetupFinished = true;
648 }
lib/router.dart
+13 -9
@@ -1,6 +1,5 @@
1 import 'package:cake_wallet/entities/contact_record.dart';
2 import 'package:cake_wallet/buy/order.dart';
3 -import 'package:cake_wallet/entities/transaction_description.dart';
3 import 'package:cake_wallet/src/screens/backup/backup_page.dart';
4 import 'package:cake_wallet/src/screens/backup/edit_backup_password_page.dart';
5 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';
12 import 'package:cake_wallet/src/screens/support/support_page.dart';
13 import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_details_page.dart';
14 import 'package:cake_wallet/src/screens/unspent_coins/unspent_coins_list_page.dart';
16 -import 'package:cake_wallet/store/settings_store.dart';
17 -import 'package:cake_wallet/view_model/buy/buy_view_model.dart';
15 import 'package:cake_wallet/view_model/monero_account_list/account_list_item.dart';
19 -import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_item.dart';
16 import 'package:flutter/cupertino.dart';
17 import 'package:flutter/material.dart';
18 import 'package:cake_wallet/routes.dart';
@@ -26,7 +22,6 @@ import 'package:cake_wallet/utils/language_list.dart';
22 import 'package:cake_wallet/view_model/wallet_new_vm.dart';
23 import 'package:cake_wallet/view_model/wallet_restoration_from_seed_vm.dart';
24 import 'package:cake_wallet/view_model/wallet_restoration_from_keys_vm.dart';
29 -import 'package:cake_wallet/entities/contact.dart';
25 import 'package:cake_wallet/exchange/trade.dart';
26 import 'package:cw_core/transaction_info.dart';
27 import 'package:cw_core/wallet_type.dart';
@@ -66,16 +61,15 @@ import 'package:cake_wallet/src/screens/exchange/exchange_template_page.dart';
61 import 'package:cake_wallet/src/screens/exchange_trade/exchange_confirm_page.dart';
62 import 'package:cake_wallet/src/screens/exchange_trade/exchange_trade_page.dart';
63 import 'package:flutter/services.dart';
69 -import 'package:hive/hive.dart';
70 -import 'package:cake_wallet/wallet_type_utils.dart';
64 import 'package:cake_wallet/wallet_types.g.dart';
65 import 'package:cake_wallet/src/screens/dashboard/widgets/address_page.dart';
66 +import 'package:cake_wallet/src/screens/receive/fullscreen_qr_page.dart';
67
68 RouteSettings currentRouteSettings;
69
70 Route<dynamic> createRoute(RouteSettings settings) {
71 currentRouteSettings = settings;
78 -
72 +
73 switch (settings.name) {
74 case Routes.welcome:
75 return MaterialPageRoute<void>(builder: (_) => createWelcomePage());
@@ -84,7 +78,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
78 return CupertinoPageRoute<void>(
79 builder: (_) => getIt.get<SetupPinCodePage>(
80 param1: (PinCodeState<PinCodeWidget> context, dynamic _) {
87 - if (availableWalletTypes.length == 1) {
81 + if (availableWalletTypes.length == 1) {
82 Navigator.of(context.context).pushNamed(Routes.newWallet, arguments: availableWalletTypes.first);
83 } else {
84 Navigator.of(context.context).pushNamed(Routes.newWalletType);
@@ -402,6 +396,16 @@ Route<dynamic> createRoute(RouteSettings settings) {
396 getIt.get<UnspentCoinsDetailsPage>(
397 param1: args));
398
399 + case Routes.fullscreenQR:
400 + final args = settings.arguments as Map<String, dynamic>;
401 +
402 + return MaterialPageRoute<void>(
403 + builder: (_) =>
404 + getIt.get<FullscreenQRPage>(
405 + param1: args['qrData'] as String,
406 + param2: args['isLight'] as bool,
407 + ));
408 +
409 default:
410 return MaterialPageRoute<void>(
411 builder: (_) => Scaffold(
lib/routes.dart
+1
@@ -60,4 +60,5 @@ class Routes {
60 static const moneroRestoreWalletFromWelcome = '/monero_restore_wallet';
61 static const moneroNewWalletFromWelcome = '/monero_new_wallet';
62 static const addressPage = '/address_page';
63 + static const fullscreenQR = '/fullscreen_qr';
64 }
\ No newline at end of file
lib/src/screens/receive/fullscreen_qr_page.dart new
+85
@@ -0,0 +1,85 @@
1 +import 'package:cake_wallet/src/screens/receive/widgets/qr_image.dart';
2 +import 'package:cake_wallet/themes/theme_base.dart';
3 +import 'package:flutter/material.dart';
4 +import 'package:flutter/cupertino.dart';
5 +import 'package:cake_wallet/src/screens/base_page.dart';
6 +
7 +class FullscreenQRPage extends BasePage {
8 + FullscreenQRPage({@required this.qrData, @required this.isLight});
9 +
10 + final bool isLight;
11 + final String qrData;
12 +
13 + @override
14 + Color get backgroundLightColor => currentTheme.type == ThemeType.bright ? Colors.transparent : Colors.white;
15 +
16 + @override
17 + Color get backgroundDarkColor => Colors.transparent;
18 +
19 + @override
20 + bool get resizeToAvoidBottomInset => false;
21 +
22 + @override
23 + Widget leading(BuildContext context) {
24 + final _backButton = Icon(
25 + Icons.arrow_back_ios,
26 + color: Theme.of(context).accentTextTheme.display3.backgroundColor,
27 + size: 16,
28 + );
29 +
30 + return SizedBox(
31 + height: 37,
32 + width: 37,
33 + child: ButtonTheme(
34 + minWidth: double.minPositive,
35 + child: FlatButton(
36 + highlightColor: Colors.transparent,
37 + splashColor: Colors.transparent,
38 + padding: EdgeInsets.all(0),
39 + onPressed: () => onClose(context),
40 + child: _backButton,
41 + ),
42 + ),
43 + );
44 + }
45 +
46 + @override
47 + Widget Function(BuildContext, Widget) get rootWrapper => (BuildContext context, Widget scaffold) => Container(
48 + decoration: BoxDecoration(
49 + gradient: LinearGradient(
50 + colors: [
51 + Theme.of(context).accentColor,
52 + Theme.of(context).scaffoldBackgroundColor,
53 + Theme.of(context).primaryColor,
54 + ],
55 + begin: Alignment.topRight,
56 + end: Alignment.bottomLeft,
57 + ),
58 + ),
59 + child: scaffold);
60 +
61 + @override
62 + Widget body(BuildContext context) {
63 + return Padding(
64 + padding: EdgeInsets.symmetric(horizontal: MediaQuery.of(context).size.width * 0.05),
65 + child: Hero(
66 + tag: Key(qrData),
67 + child: Center(
68 + child: AspectRatio(
69 + aspectRatio: 1.0,
70 + child: Container(
71 + padding: EdgeInsets.all(5),
72 + decoration: BoxDecoration(
73 + border: Border.all(width: 3, color: Theme.of(context).accentTextTheme.display3.backgroundColor)),
74 + child: QrImage(
75 + data: qrData,
76 + backgroundColor: isLight ? Colors.transparent : Colors.black,
77 + foregroundColor: Theme.of(context).accentTextTheme.display3.backgroundColor,
78 + ),
79 + ),
80 + ),
81 + ),
82 + ),
83 + );
84 + }
85 +}
lib/src/screens/receive/widgets/qr_widget.dart
+121 -86
@@ -1,4 +1,6 @@
1 +import 'package:cake_wallet/routes.dart';
2 import 'package:cake_wallet/utils/show_bar.dart';
3 +import 'package:device_display_brightness/device_display_brightness.dart';
4 import 'package:flutter/material.dart';
5 import 'package:flutter/cupertino.dart';
6 import 'package:flutter/services.dart';
@@ -38,101 +40,134 @@ class QRWidget extends StatelessWidget {
40 mainAxisAlignment: MainAxisAlignment.spaceEvenly,
41 crossAxisAlignment: CrossAxisAlignment.center,
42 children: <Widget>[
41 - Row(children: <Widget>[
42 - Spacer(flex: 3),
43 - Observer(
44 - builder: (_) => Flexible(
45 - flex: 5,
46 - child: Center(
47 - child: AspectRatio(
48 - aspectRatio: 1.0,
49 - child: Container(
50 - padding: EdgeInsets.all(5),
51 - decoration: BoxDecoration(
43 + Column(
44 + children: [
45 + Padding(
46 + padding: const EdgeInsets.only(bottom: 12),
47 + child: Text(
48 + S.of(context).qr_fullscreen,
49 + style: TextStyle(
50 + fontSize: 14,
51 + fontWeight: FontWeight.w500,
52 + color: Theme.of(context).accentTextTheme.display3.backgroundColor),
53 + ),
54 + ),
55 + Row(
56 + children: <Widget>[
57 + Spacer(flex: 3),
58 + Observer(
59 + builder: (_) => Flexible(
60 + flex: 5,
61 + child: GestureDetector(
62 + onTap: () async {
63 + // Get the current brightness:
64 + final double brightness = await DeviceDisplayBrightness.getBrightness();
65 +
66 + // ignore: unawaited_futures
67 + DeviceDisplayBrightness.setBrightness(1.0);
68 + await Navigator.pushNamed(
69 + context,
70 + Routes.fullscreenQR,
71 + arguments: {
72 + 'qrData': addressListViewModel.uri.toString(),
73 + 'isLight': isLight,
74 + },
75 + );
76 + // ignore: unawaited_futures
77 + DeviceDisplayBrightness.setBrightness(brightness);
78 + },
79 + child: Hero(
80 + tag: Key(addressListViewModel.uri.toString()),
81 + child: Center(
82 + child: AspectRatio(
83 + aspectRatio: 1.0,
84 + child: Container(
85 + padding: EdgeInsets.all(5),
86 + decoration: BoxDecoration(
87 border: Border.all(
53 - width: 3,
54 - color: Theme.of(context).accentTextTheme.
55 - display3.backgroundColor
56 - )
57 - ),
58 - child: QrImage(
59 - data: addressListViewModel.uri.toString(),
60 - backgroundColor: isLight ? Colors.transparent : Colors.black,
61 - foregroundColor: Theme.of(context).accentTextTheme.
62 - display3.backgroundColor,
88 + width: 3,
89 + color: Theme.of(context).accentTextTheme.display3.backgroundColor,
90 + ),
91 + ),
92 + child: QrImage(
93 + data: addressListViewModel.uri.toString(),
94 + backgroundColor: isLight ? Colors.transparent : Colors.black,
95 + foregroundColor: Theme.of(context).accentTextTheme.display3.backgroundColor,
96 + ),
97 ),
64 - ))))),
65 - Spacer(flex: 3)
66 - ]),
98 + ),
99 + ),
100 + ),
101 + ),
102 + ),
103 + ),
104 + Spacer(flex: 3)
105 + ],
106 + ),
107 + ],
108 + ),
109 if (isAmountFieldShow)
68 - Padding(
69 - padding: EdgeInsets.only(top: 10),
110 + Padding(
111 + padding: EdgeInsets.only(top: 10),
112 + child: Row(
113 + children: <Widget>[
114 + Expanded(
115 + child: Form(
116 + key: _formKey,
117 + child: BaseTextFormField(
118 + focusNode: amountTextFieldFocusNode,
119 + controller: amountController,
120 + keyboardType: TextInputType.numberWithOptions(decimal: true),
121 + inputFormatters: [BlacklistingTextInputFormatter(RegExp('[\\-|\\ ]'))],
122 + textAlign: TextAlign.center,
123 + hintText: S.of(context).receive_amount,
124 + textColor: Theme.of(context).accentTextTheme.display3.backgroundColor,
125 + borderColor: Theme.of(context).textTheme.headline.decorationColor,
126 + validator: AmountValidator(type: addressListViewModel.type, isAutovalidate: true),
127 + autovalidate: true,
128 + placeholderTextStyle: TextStyle(
129 + color: Theme.of(context).hoverColor,
130 + fontSize: 18,
131 + fontWeight: FontWeight.w500,
132 + ),
133 + ),
134 + ),
135 + ),
136 + ],
137 + ),
138 + ),
139 + Padding(
140 + padding: EdgeInsets.only(top: 8, bottom: 8),
141 + child: Builder(
142 + builder: (context) => Observer(
143 + builder: (context) => GestureDetector(
144 + onTap: () {
145 + Clipboard.setData(ClipboardData(text: addressListViewModel.address.address));
146 + showBar<void>(context, S.of(context).copied_to_clipboard);
147 + },
148 child: Row(
149 + mainAxisSize: MainAxisSize.max,
150 + crossAxisAlignment: CrossAxisAlignment.start,
151 children: <Widget>[
152 Expanded(
73 - child: Form(
74 - key: _formKey,
75 - child: BaseTextFormField(
76 - focusNode: amountTextFieldFocusNode,
77 - controller: amountController,
78 - keyboardType: TextInputType.numberWithOptions(
79 - decimal: true),
80 - inputFormatters: [
81 - BlacklistingTextInputFormatter(
82 - RegExp('[\\-|\\ ]'))
83 - ],
84 - textAlign: TextAlign.center,
85 - hintText: S.of(context).receive_amount,
86 - textColor: Theme.of(context).accentTextTheme.
87 - display3.backgroundColor,
88 - borderColor: Theme.of(context)
89 - .textTheme
90 - .headline
91 - .decorationColor,
92 - validator: AmountValidator(
93 - type: addressListViewModel.type,
94 - isAutovalidate: true),
95 - autovalidate: true,
96 - placeholderTextStyle: TextStyle(
97 - color: Theme.of(context).hoverColor,
98 - fontSize: 18,
99 - fontWeight: FontWeight.w500))))
153 + child: Text(
154 + addressListViewModel.address.address,
155 + textAlign: TextAlign.center,
156 + style: TextStyle(
157 + fontSize: 15,
158 + fontWeight: FontWeight.w500,
159 + color: Theme.of(context).accentTextTheme.display3.backgroundColor),
160 + ),
161 + ),
162 + Padding(
163 + padding: EdgeInsets.only(left: 12),
164 + child: copyImage,
165 + )
166 ],
167 ),
168 ),
103 - Padding(
104 - padding: EdgeInsets.only(top: 8, bottom: 8),
105 - child: Builder(
106 - builder: (context) => Observer(
107 - builder: (context) => GestureDetector(
108 - onTap: () {
109 - Clipboard.setData(ClipboardData(
110 - text: addressListViewModel.address.address));
111 - showBar<void>(
112 - context, S.of(context).copied_to_clipboard);
113 - },
114 - child: Row(
115 - mainAxisSize: MainAxisSize.max,
116 - crossAxisAlignment: CrossAxisAlignment.start,
117 - children: <Widget>[
118 - Expanded(
119 - child: Text(
120 - addressListViewModel.address.address,
121 - textAlign: TextAlign.center,
122 - style: TextStyle(
123 - fontSize: 15,
124 - fontWeight: FontWeight.w500,
125 - color: Theme.of(context).accentTextTheme.
126 - display3.backgroundColor),
127 - ),
128 - ),
129 - Padding(
130 - padding: EdgeInsets.only(left: 12),
131 - child: copyImage,
132 - )
133 - ],
134 - ),
135 - ))),
169 + ),
170 + ),
171 )
172 ],
173 );
pubspec_base.yaml
+1
@@ -54,6 +54,7 @@ dependencies:
54 file_picker: ^3.0.0-nullsafety.2
55 unorm_dart: ^0.2.0
56 permission_handler: ^5.0.1+1
57 + device_display_brightness: ^0.0.6
58
59 dev_dependencies:
60 flutter_test:
res/values/strings_de.arb
+1
@@ -151,6 +151,7 @@
151 "subaddresses" : "Unteradressen",
152 "addresses" : "Adressen",
153 "scan_qr_code" : "Scannen Sie den QR-Code, um die Adresse zu erhalten",
154 + "qr_fullscreen" : "Tippen Sie hier, um den QR-Code im Vollbildmodus zu öffnen",
155 "rename" : "Umbenennen",
156 "choose_account" : "Konto auswählen",
157 "create_new_account" : "Neues Konto erstellen",
res/values/strings_en.arb
+1
@@ -151,6 +151,7 @@
151 "subaddresses" : "Subaddresses",
152 "addresses" : "Addresses",
153 "scan_qr_code" : "Scan the QR code to get the address",
154 + "qr_fullscreen" : "Tap to open full screen QR code",
155 "rename" : "Rename",
156 "choose_account" : "Choose account",
157 "create_new_account" : "Create new account",
res/values/strings_es.arb
+1
@@ -151,6 +151,7 @@
151 "subaddresses" : "Subdirecciones",
152 "addresses" : "Direcciones",
153 "scan_qr_code" : "Escanee el código QR para obtener la dirección",
154 + "qr_fullscreen" : "Toque para abrir el código QR en pantalla completa",
155 "rename" : "Rebautizar",
156 "choose_account" : "Elegir cuenta",
157 "create_new_account" : "Crear una nueva cuenta",
res/values/strings_fr.arb
+1
@@ -149,6 +149,7 @@
149 "subaddresses" : "Sous-adresses",
150 "addresses" : "Adresses",
151 "scan_qr_code" : "Scannez le QR code pour obtenir l'adresse",
152 + "qr_fullscreen" : "Appuyez pour ouvrir le code QR en plein écran",
153 "rename" : "Renommer",
154 "choose_account" : "Choisir le compte",
155 "create_new_account" : "Créer un nouveau compte",
res/values/strings_hi.arb
+1
@@ -151,6 +151,7 @@
151 "subaddresses" : "उप पते",
152 "addresses" : "पतों",
153 "scan_qr_code" : "पता प्राप्त करने के लिए QR कोड स्कैन करें",
154 + "qr_fullscreen" : "फ़ुल स्क्रीन क्यूआर कोड खोलने के लिए टैप करें",
155 "rename" : "नाम बदलें",
156 "choose_account" : "खाता चुनें",
157 "create_new_account" : "नया खाता बनाएँ",
res/values/strings_hr.arb
+1
@@ -151,6 +151,7 @@
151 "subaddresses" : "Podadrese",
152 "addresses" : "Adrese",
153 "scan_qr_code" : "Skeniraj QR kod za dobivanje adrese",
154 + "qr_fullscreen" : "Dodirnite za otvaranje QR koda preko cijelog zaslona",
155 "rename" : "Preimenuj",
156 "choose_account" : "Odaberi račun",
157 "create_new_account" : "Izradi novi račun",
res/values/strings_it.arb
+1
@@ -151,6 +151,7 @@
151 "subaddresses" : "Sottoindirizzi",
152 "addresses" : "Indirizzi",
153 "scan_qr_code" : "Scansiona il codice QR per ottenere l'indirizzo",
154 + "qr_fullscreen" : "Tocca per aprire il codice QR a schermo intero",
155 "rename" : "Rinomina",
156 "choose_account" : "Scegli account",
157 "create_new_account" : "Crea nuovo account",
res/values/strings_ja.arb
+1
@@ -151,6 +151,7 @@
151 "subaddresses" : "サブアドレス",
152 "addresses" : "住所",
153 "scan_qr_code" : "QRコードをスキャンして住所を取得します",
154 + "qr_fullscreen" : "タップして全画面QRコードを開く",
155 "rename" : "リネーム",
156 "choose_account" : "アカウントを選択",
157 "create_new_account" : "新しいアカウントを作成する",
res/values/strings_ko.arb
+1
@@ -151,6 +151,7 @@
151 "subaddresses" : "하위 주소",
152 "addresses" : "구애",
153 "scan_qr_code" : "QR 코드를 스캔하여 주소를 얻습니다.",
154 + "qr_fullscreen" : "전체 화면 QR 코드를 열려면 탭하세요.",
155 "rename" : "이름 바꾸기",
156 "choose_account" : "계정을 선택하십시오",
157 "create_new_account" : "새 계정을 만들",
res/values/strings_nl.arb
+1
@@ -152,6 +152,7 @@
152 "rename" : "Hernoemen",
153 "addresses" : "Adressen",
154 "scan_qr_code" : "Scan de QR-code om het adres te krijgen",
155 + "qr_fullscreen" : "Tik om de QR-code op volledig scherm te openen",
156 "choose_account" : "Kies account",
157 "create_new_account" : "Creëer een nieuw account",
158 "accounts_subaddresses" : "Accounts en subadressen",
res/values/strings_pl.arb
+1 -3
@@ -9,9 +9,6 @@
9 "monero_com": "Monero.com by Cake Wallet",
10 "monero_com_wallet_text": "Awesome wallet for Monero",
11
12 - "haven_app": "Haven by Cake Wallet",
13 - "haven_app_wallet_text": "Awesome wallet for Haven",
14 -
12 "haven_app": "Haven by Cake Wallet",
13 "haven_app_wallet_text": "Awesome wallet for Haven",
14
@@ -154,6 +151,7 @@
151 "subaddresses" : "Podadresy",
152 "addresses" : "Adresy",
153 "scan_qr_code" : "Zeskanuj kod QR, aby uzyskać adres",
154 + "qr_fullscreen" : "Dotknij, aby otworzyć pełnoekranowy kod QR",
155 "rename" : "Przemianować",
156 "choose_account" : "Wybierz konto",
157 "create_new_account" : "Stwórz nowe konto",
res/values/strings_pt.arb
+1
@@ -151,6 +151,7 @@
151 "subaddresses" : "Sub-endereços",
152 "addresses" : "Endereços",
153 "scan_qr_code" : "Digitalize o código QR para obter o endereço",
154 + "qr_fullscreen" : "Toque para abrir o código QR em tela cheia",
155 "rename" : "Renomear",
156 "choose_account" : "Escolha uma conta",
157 "create_new_account" : "Criar nova conta",
res/values/strings_ru.arb
+1
@@ -151,6 +151,7 @@
151 "subaddresses" : "Субадреса",
152 "addresses" : "Адреса",
153 "scan_qr_code" : "Отсканируйте QR-код для получения адреса",
154 + "qr_fullscreen" : "Нажмите, чтобы открыть полноэкранный QR-код",
155 "rename" : "Переименовать",
156 "choose_account" : "Выберите аккаунт",
157 "create_new_account" : "Создать новый аккаунт",
res/values/strings_uk.arb
+1
@@ -151,6 +151,7 @@
151 "subaddresses" : "Субадреси",
152 "addresses" : "Адреси",
153 "scan_qr_code" : "Скануйте QR-код для одержання адреси",
154 + "qr_fullscreen" : "Торкніться, щоб відкрити QR-код на весь екран",
155 "rename" : "Перейменувати",
156 "choose_account" : "Оберіть акаунт",
157 "create_new_account" : "Створити новий акаунт",
res/values/strings_zh.arb
+1
@@ -151,6 +151,7 @@
151 "subaddresses" : "子地址",
152 "addresses" : "地址",
153 "scan_qr_code" : "扫描二维码获取地址",
154 + "qr_fullscreen" : "点击打开全屏二维码",
155 "rename" : "重命名",
156 "choose_account" : "选择账户",
157 "create_new_account" : "建立新账户",