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" : "建立新账户",