Generic fixes (#1274)
* Display fees currency as wallet currency not the selected one * remove unused code catch balance network issues * pop send screen when send completes successfully * revert change [skip ci] * Enable restoring haven wallets * verify context is mounted before showing snackbar [skip ci] * Update privacy [skip ci] * Add user consent popup to inapp webview permission request
Omar Hatem committed
Jan 27, 2024 at 00:51 UTC
89fdc0f4d111f4fe2295647fa45cbe11041d3596
36 files changed
+134
-86
PRIVACY.md
+4
-4
@@ -1,6 +1,6 @@
1
Privacy Policy
2
3
-Last modified: August 9, 2023
3
+Last modified: January 24, 2024
4
5
Introduction
6
============
@@ -112,12 +112,12 @@ Data Security
112
113
In any situation, Cake Labs takes no responsibility for interception of personal data by any outside individual, group, corporation, or institution. You should understand this and take any and all appropriate actions to secure your own data.
114
115
-Links to Other Websites
116
------------------------
115
+Other Websites and Third-Party Services
116
+---------------------------------------
117
118
The App may contain links to other websites that are not operated by us. If you click on a Third-Party Service link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy of every site you visit. We have no control over and assume no responsibility for the content, privacy policies or practices of any third-party sites or services.
119
120
- The App includes several optional Third-Party Services, which may not be available to all users. If you use Third-Party Services, you must agree to their respective Privacy Policies.
120
+ The App includes several optional Third-Party Services, which may not be available to all users. If you use Third-Party Services, you must agree to their respective Privacy Policies. When using certain optional features in the app such as buying and selling, you may be asked to provide information to a Third-Party Service. You will need to read and accept the privacy policy for that third party. This Third-Party Service may ask for your name, your photo ID, your social security number or other similar number, mailing address, cryptocurrency address, or other information. They may ask you to take a selfie image. Information shared with a Third-Party Service is subject to their respective Privacy Policies.
121
122
Changes to Our Privacy Policy
123
-----------------------------
cw_ethereum/lib/ethereum_client.dart
+7
-3
@@ -190,11 +190,15 @@ I/flutter ( 4474): Gas Used: 53000
190
Future<ERC20Balance> fetchERC20Balances(
191
EthereumAddress userAddress, String contractAddress) async {
192
final erc20 = ERC20(address: EthereumAddress.fromHex(contractAddress), client: _client!);
193
- final balance = await erc20.balanceOf(userAddress);
193
+ try {
194
+ final balance = await erc20.balanceOf(userAddress);
195
195
- int exponent = (await erc20.decimals()).toInt();
196
+ int exponent = (await erc20.decimals()).toInt();
197
197
- return ERC20Balance(balance, exponent: exponent);
198
+ return ERC20Balance(balance, exponent: exponent);
199
+ } catch (_) {
200
+ return ERC20Balance(BigInt.zero);
201
+ }
202
}
203
204
Future<Erc20Token?> getErc20Token(String contractAddress) async {
lib/di.dart
+1
-3
@@ -612,7 +612,6 @@ Future<void> setup({
612
_walletInfoSource,
613
getIt.get<AppStore>(),
614
getIt.get<WalletLoadingService>(),
615
- getIt.get<AuthService>(),
615
),
616
);
617
} else {
@@ -623,7 +622,6 @@ Future<void> setup({
622
_walletInfoSource,
623
getIt.get<AppStore>(),
624
getIt.get<WalletLoadingService>(),
626
- getIt.get<AuthService>(),
625
),
626
);
627
}
@@ -725,7 +723,7 @@ Future<void> setup({
723
});
724
725
getIt.registerFactory(() {
728
- return SecuritySettingsViewModel(getIt.get<SettingsStore>(), getIt.get<AuthService>());
726
+ return SecuritySettingsViewModel(getIt.get<SettingsStore>());
727
});
728
729
getIt.registerFactory(() => WalletSeedViewModel(getIt.get<AppStore>().wallet!));
lib/src/screens/buy/webview_page.dart
+27
-2
@@ -1,4 +1,7 @@
1
+import 'package:cake_wallet/generated/i18n.dart';
2
import 'package:cake_wallet/src/screens/base_page.dart';
3
+import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
4
+import 'package:cake_wallet/utils/show_pop_up.dart';
5
import 'package:flutter/material.dart';
6
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
7
import 'package:permission_handler/permission_handler.dart';
@@ -14,13 +17,14 @@ class WebViewPage extends BasePage {
17
18
@override
19
Widget body(BuildContext context) {
17
- return WebViewPageBody(_url);
20
+ return WebViewPageBody(_title, _url);
21
}
22
}
23
24
class WebViewPageBody extends StatefulWidget {
22
- WebViewPageBody(this.uri);
25
+ WebViewPageBody(this.title, this.uri);
26
27
+ final String title;
28
final Uri uri;
29
30
@override
@@ -40,6 +44,27 @@ class WebViewPageBodyState extends State<WebViewPageBody> {
44
onPermissionRequest: (controller, request) async {
45
bool permissionGranted = await Permission.camera.status == PermissionStatus.granted;
46
if (!permissionGranted) {
47
+ final bool userConsent = await showPopUp<bool>(
48
+ context: context,
49
+ builder: (BuildContext context) {
50
+ return AlertWithTwoActions(
51
+ alertTitle: S.of(context).privacy,
52
+ alertContent: S.of(context).camera_consent(widget.title),
53
+ rightButtonText: S.of(context).agree,
54
+ leftButtonText: S.of(context).cancel,
55
+ actionRightButton: () => Navigator.of(context).pop(true),
56
+ actionLeftButton: () => Navigator.of(context).pop(false));
57
+ }) ??
58
+ false;
59
+
60
+ /// if user did NOT give the consent then return permission denied
61
+ if (!userConsent) {
62
+ return PermissionResponse(
63
+ resources: request.resources,
64
+ action: PermissionResponseAction.DENY,
65
+ );
66
+ }
67
+
68
permissionGranted = await Permission.camera.request().isGranted;
69
}
70
lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart
+6
-2
@@ -166,12 +166,16 @@ class _DesktopWalletSelectionDropDownState extends State<DesktopWalletSelectionD
166
}
167
168
try {
169
- changeProcessText(S.of(context).wallet_list_loading_wallet(wallet.name));
169
+ if (context.mounted) {
170
+ changeProcessText(S.of(context).wallet_list_loading_wallet(wallet.name));
171
+ }
172
await widget.walletListViewModel.loadWallet(wallet);
173
hideProgressText();
174
setState(() {});
175
} catch (e) {
174
- changeProcessText(S.of(context).wallet_list_failed_to_load(wallet.name, e.toString()));
176
+ if (context.mounted) {
177
+ changeProcessText(S.of(context).wallet_list_failed_to_load(wallet.name, e.toString()));
178
+ }
179
}
180
},
181
conditionToDetermineIfToUse2FA:
lib/src/screens/new_wallet/new_wallet_type_page.dart
+7
-4
@@ -28,15 +28,18 @@ class NewWalletTypePage extends BasePage {
28
29
@override
30
Widget body(BuildContext context) => WalletTypeForm(
31
- onTypeSelected: onTypeSelected,
32
- walletImage: currentTheme.type == ThemeType.dark ? walletTypeImage : walletTypeLightImage);
31
+ onTypeSelected: onTypeSelected,
32
+ walletImage: currentTheme.type == ThemeType.dark ? walletTypeImage : walletTypeLightImage,
33
+ isCreate: isCreate,
34
+ );
35
}
36
37
class WalletTypeForm extends StatefulWidget {
36
- WalletTypeForm({required this.onTypeSelected, required this.walletImage});
38
+ WalletTypeForm({required this.onTypeSelected, required this.walletImage, required this.isCreate});
39
40
final void Function(BuildContext, WalletType) onTypeSelected;
41
final Image walletImage;
42
+ final bool isCreate;
43
44
@override
45
WalletTypeFormState createState() => WalletTypeFormState();
@@ -131,7 +134,7 @@ class WalletTypeFormState extends State<WalletTypeForm> {
134
throw Exception('Wallet Type is not selected yet.');
135
}
136
134
- if (selected == WalletType.haven) {
137
+ if (selected == WalletType.haven && widget.isCreate) {
138
return await showPopUp<void>(
139
context: context,
140
builder: (BuildContext context) {
lib/src/screens/send/widgets/send_card.dart
+1
-1
@@ -478,7 +478,7 @@ class SendCardState extends State<SendCard> with AutomaticKeepAliveClientMixin<S
478
Text(
479
output.estimatedFee.toString() +
480
' ' +
481
- sendViewModel.selectedCryptoCurrency.toString(),
481
+ sendViewModel.currency.toString(),
482
style: TextStyle(
483
fontSize: 12,
484
fontWeight: FontWeight.w600,
lib/store/settings_store.dart
+27
-25
@@ -2,7 +2,6 @@ import 'dart:io';
2
3
import 'package:cake_wallet/bitcoin/bitcoin.dart';
4
import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart';
5
-import 'package:cake_wallet/buy/buy_provider.dart';
5
import 'package:cake_wallet/entities/auto_generate_subaddress_status.dart';
6
import 'package:cake_wallet/entities/provider_types.dart';
7
import 'package:cake_wallet/entities/cake_2fa_preset_options.dart';
@@ -40,6 +39,7 @@ import 'package:cake_wallet/monero/monero.dart';
39
import 'package:cake_wallet/entities/action_list_display_mode.dart';
40
import 'package:cake_wallet/entities/fiat_api_mode.dart';
41
import 'package:cw_core/set_app_secure_native.dart';
42
+
43
part 'settings_store.g.dart';
44
45
class SettingsStore = SettingsStoreBase with _$SettingsStore;
@@ -1080,34 +1080,37 @@ abstract class SettingsStoreBase with Store {
1080
priority[WalletType.monero] = monero?.deserializeMoneroTransactionPriority(
1081
raw: sharedPreferences.getInt(PreferencesKey.moneroTransactionPriority)!) ??
1082
priority[WalletType.monero]!;
1083
- priority[WalletType.bitcoin] = bitcoin?.deserializeBitcoinTransactionPriority(
1084
- sharedPreferences.getInt(PreferencesKey.moneroTransactionPriority)!) ??
1085
- priority[WalletType.bitcoin]!;
1083
1087
- if (sharedPreferences.getInt(PreferencesKey.havenTransactionPriority) != null) {
1088
- priority[WalletType.haven] = monero?.deserializeMoneroTransactionPriority(
1089
- raw: sharedPreferences.getInt(PreferencesKey.havenTransactionPriority)!) ??
1090
- priority[WalletType.haven]!;
1084
+ if (bitcoin != null &&
1085
+ sharedPreferences.getInt(PreferencesKey.bitcoinTransactionPriority) != null) {
1086
+ priority[WalletType.bitcoin] = bitcoin!.deserializeBitcoinTransactionPriority(
1087
+ sharedPreferences.getInt(PreferencesKey.bitcoinTransactionPriority)!);
1088
}
1092
- if (sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority) != null) {
1093
- priority[WalletType.litecoin] = bitcoin?.deserializeLitecoinTransactionPriority(
1094
- sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority)!) ??
1095
- priority[WalletType.litecoin]!;
1089
+
1090
+ if (monero != null &&
1091
+ sharedPreferences.getInt(PreferencesKey.havenTransactionPriority) != null) {
1092
+ priority[WalletType.haven] = monero!.deserializeMoneroTransactionPriority(
1093
+ raw: sharedPreferences.getInt(PreferencesKey.havenTransactionPriority)!);
1094
}
1097
- if (sharedPreferences.getInt(PreferencesKey.ethereumTransactionPriority) != null) {
1098
- priority[WalletType.ethereum] = ethereum?.deserializeEthereumTransactionPriority(
1099
- sharedPreferences.getInt(PreferencesKey.ethereumTransactionPriority)!) ??
1100
- priority[WalletType.ethereum]!;
1095
+ if (bitcoin != null &&
1096
+ sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority) != null) {
1097
+ priority[WalletType.litecoin] = bitcoin!.deserializeLitecoinTransactionPriority(
1098
+ sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority)!);
1099
}
1102
- if (sharedPreferences.getInt(PreferencesKey.polygonTransactionPriority) != null) {
1103
- priority[WalletType.polygon] = polygon?.deserializePolygonTransactionPriority(
1104
- sharedPreferences.getInt(PreferencesKey.polygonTransactionPriority)!) ??
1105
- priority[WalletType.polygon]!;
1100
+ if (ethereum != null &&
1101
+ sharedPreferences.getInt(PreferencesKey.ethereumTransactionPriority) != null) {
1102
+ priority[WalletType.ethereum] = ethereum!.deserializeEthereumTransactionPriority(
1103
+ sharedPreferences.getInt(PreferencesKey.ethereumTransactionPriority)!);
1104
}
1107
- if (sharedPreferences.getInt(PreferencesKey.bitcoinCashTransactionPriority) != null) {
1108
- priority[WalletType.bitcoinCash] = bitcoinCash?.deserializeBitcoinCashTransactionPriority(
1109
- sharedPreferences.getInt(PreferencesKey.bitcoinCashTransactionPriority)!) ??
1110
- priority[WalletType.bitcoinCash]!;
1105
+ if (polygon != null &&
1106
+ sharedPreferences.getInt(PreferencesKey.polygonTransactionPriority) != null) {
1107
+ priority[WalletType.polygon] = polygon!.deserializePolygonTransactionPriority(
1108
+ sharedPreferences.getInt(PreferencesKey.polygonTransactionPriority)!);
1109
+ }
1110
+ if (bitcoinCash != null &&
1111
+ sharedPreferences.getInt(PreferencesKey.bitcoinCashTransactionPriority) != null) {
1112
+ priority[WalletType.bitcoinCash] = bitcoinCash!.deserializeBitcoinCashTransactionPriority(
1113
+ sharedPreferences.getInt(PreferencesKey.bitcoinCashTransactionPriority)!);
1114
}
1115
1116
final generateSubaddresses =
@@ -1187,7 +1190,6 @@ abstract class SettingsStoreBase with Store {
1190
final ethereumNodeId = sharedPreferences.getInt(PreferencesKey.currentEthereumNodeIdKey);
1191
final polygonNodeId = sharedPreferences.getInt(PreferencesKey.currentPolygonNodeIdKey);
1192
final nanoNodeId = sharedPreferences.getInt(PreferencesKey.currentNanoNodeIdKey);
1190
- final nanoPowNodeId = sharedPreferences.getInt(PreferencesKey.currentNanoNodeIdKey);
1193
final moneroNode = nodeSource.get(nodeId);
1194
final bitcoinElectrumServer = nodeSource.get(bitcoinElectrumServerId);
1195
final litecoinElectrumServer = nodeSource.get(litecoinElectrumServerId);
lib/view_model/settings/security_settings_view_model.dart
+2
-9
@@ -1,4 +1,3 @@
1
-import 'package:cake_wallet/core/auth_service.dart';
1
import 'package:cake_wallet/entities/biometric_auth.dart';
2
import 'package:cake_wallet/entities/pin_code_required_duration.dart';
3
import 'package:cake_wallet/store/settings_store.dart';
@@ -9,14 +8,10 @@ part 'security_settings_view_model.g.dart';
8
class SecuritySettingsViewModel = SecuritySettingsViewModelBase with _$SecuritySettingsViewModel;
9
10
abstract class SecuritySettingsViewModelBase with Store {
12
- SecuritySettingsViewModelBase(
13
- this._settingsStore,
14
- this._authService,
15
- ) : _biometricAuth = BiometricAuth();
11
+ SecuritySettingsViewModelBase(this._settingsStore) : _biometricAuth = BiometricAuth();
12
13
final BiometricAuth _biometricAuth;
14
final SettingsStore _settingsStore;
19
- final AuthService _authService;
15
16
@computed
17
bool get allowBiometricalAuthentication => _settingsStore.allowBiometricalAuthentication;
@@ -41,8 +36,6 @@ abstract class SecuritySettingsViewModelBase with Store {
36
_settingsStore.allowBiometricalAuthentication = value;
37
38
@action
44
- setPinCodeRequiredDuration(PinCodeRequiredDuration duration) =>
39
+ void setPinCodeRequiredDuration(PinCodeRequiredDuration duration) =>
40
_settingsStore.pinTimeOutDuration = duration;
46
-
47
- Future<bool> checkPinCodeRiquired() => _authService.requireAuth();
41
}
lib/view_model/wallet_list/wallet_list_view_model.dart
-7
@@ -1,4 +1,3 @@
1
-import 'package:cake_wallet/core/auth_service.dart';
1
import 'package:cake_wallet/core/wallet_loading_service.dart';
2
import 'package:cake_wallet/entities/wallet_list_order_types.dart';
3
import 'package:hive/hive.dart';
@@ -18,7 +17,6 @@ abstract class WalletListViewModelBase with Store {
17
this._walletInfoSource,
18
this._appStore,
19
this._walletLoadingService,
21
- this._authService,
20
) : wallets = ObservableList<WalletListItem>() {
21
setOrderType(_appStore.settingsStore.walletListOrder);
22
reaction((_) => _appStore.wallet, (_) => updateList());
@@ -39,7 +37,6 @@ abstract class WalletListViewModelBase with Store {
37
final AppStore _appStore;
38
final Box<WalletInfo> _walletInfoSource;
39
final WalletLoadingService _walletLoadingService;
42
- final AuthService _authService;
40
41
WalletType get currentWalletType => _appStore.wallet!.type;
42
@@ -160,8 +157,4 @@ abstract class WalletListViewModelBase with Store {
157
break;
158
}
159
}
163
-
164
- Future<bool> checkIfAuthRequired() async {
165
- return _authService.requireAuth();
166
- }
160
}
res/values/strings_ar.arb
+2
-1
@@ -763,5 +763,6 @@
763
"receivable_balance": "التوازن القادم",
764
"confirmed_tx": "مؤكد",
765
"transaction_details_source_address": "عنوان المصدر",
766
- "pause_wallet_creation": ".ﺎﻴًﻟﺎﺣ ﺎﺘًﻗﺆﻣ ﺔﻔﻗﻮﺘﻣ Haven Wallet ءﺎﺸﻧﺇ ﻰﻠﻋ ﺓﺭﺪﻘﻟﺍ"
766
+ "pause_wallet_creation": ".ﺎﻴًﻟﺎﺣ ﺎﺘًﻗﺆﻣ ﺔﻔﻗﻮﺘﻣ Haven Wallet ءﺎﺸﻧﺇ ﻰﻠﻋ ﺓﺭﺪﻘﻟﺍ",
767
+ "camera_consent": ".ﻞﻴﺻﺎﻔﺘﻟﺍ ﻰﻠﻋ ﻝﻮﺼﺤﻠﻟ ﻢﻬﺑ ﺔﺻﺎﺨﻟﺍ ﺔﻴﺻﻮﺼﺨﻟﺍ ﺔﺳﺎﻴﺳ ﻦﻣ ﻖﻘﺤﺘﻟﺍ ﻰﺟﺮﻳ .${provider} ﻝﻮﻠ"
768
}
res/values/strings_bg.arb
+2
-1
@@ -759,5 +759,6 @@
759
"receivable_balance": "Баланс за вземания",
760
"confirmed_tx": "Потвърдено",
761
"transaction_details_source_address": "Адрес на източника",
762
- "pause_wallet_creation": "Възможността за създаване на Haven Wallet в момента е на пауза."
762
+ "pause_wallet_creation": "Възможността за създаване на Haven Wallet в момента е на пауза.",
763
+ "camera_consent": "Вашият фотоапарат ще бъде използван за заснемане на изображение с цел идентификация от ${provider}. Моля, проверете тяхната политика за поверителност за подробности."
764
}
res/values/strings_cs.arb
+2
-1
@@ -759,5 +759,6 @@
759
"receivable_balance": "Zůstatek pohledávek",
760
"confirmed_tx": "Potvrzeno",
761
"transaction_details_source_address": "Zdrojová adresa",
762
- "pause_wallet_creation": "Možnost vytvářet Haven Wallet je momentálně pozastavena."
762
+ "pause_wallet_creation": "Možnost vytvářet Haven Wallet je momentálně pozastavena.",
763
+ "camera_consent": "Váš fotoaparát použije k pořízení snímku pro účely identifikace ${provider}. Podrobnosti najdete v jejich Zásadách ochrany osobních údajů."
764
}
res/values/strings_de.arb
+2
-1
@@ -767,5 +767,6 @@
767
"receivable_balance": "Forderungsbilanz",
768
"confirmed_tx": "Bestätigt",
769
"transaction_details_source_address": "Quelladresse",
770
- "pause_wallet_creation": "Die Möglichkeit, Haven Wallet zu erstellen, ist derzeit pausiert."
770
+ "pause_wallet_creation": "Die Möglichkeit, Haven Wallet zu erstellen, ist derzeit pausiert.",
771
+ "camera_consent": "Mit Ihrer Kamera wird bis zum ${provider} ein Bild zur Identifizierung aufgenommen. Weitere Informationen finden Sie in deren Datenschutzbestimmungen."
772
}
res/values/strings_en.arb
+2
-1
@@ -768,5 +768,6 @@
768
"receivable_balance": "Receivable Balance",
769
"confirmed_tx": "Confirmed",
770
"transaction_details_source_address": "Source address",
771
- "pause_wallet_creation": "Ability to create Haven Wallet is currently paused."
771
+ "pause_wallet_creation": "Ability to create Haven Wallet is currently paused.",
772
+ "camera_consent": "Your camera will be used to capture an image for identification purposes by ${provider}. Please check their Privacy Policy for details."
773
}
res/values/strings_es.arb
+2
-1
@@ -767,5 +767,6 @@
767
"receivable_balance": "Saldo de cuentas por cobrar",
768
"confirmed_tx": "Confirmado",
769
"transaction_details_source_address": "Dirección de la fuente",
770
- "pause_wallet_creation": "La capacidad para crear Haven Wallet está actualmente pausada."
770
+ "pause_wallet_creation": "La capacidad para crear Haven Wallet está actualmente pausada.",
771
+ "camera_consent": "Su cámara será utilizada para capturar una imagen con fines de identificación por ${provider}. Consulte su Política de privacidad para obtener más detalles."
772
}
res/values/strings_fr.arb
+2
-1
@@ -767,5 +767,6 @@
767
"receivable_balance": "Solde de créances",
768
"confirmed_tx": "Confirmé",
769
"transaction_details_source_address": "Adresse source",
770
- "pause_wallet_creation": "La possibilité de créer Haven Wallet est actuellement suspendue."
770
+ "pause_wallet_creation": "La possibilité de créer Haven Wallet est actuellement suspendue.",
771
+ "camera_consent": "Votre appareil photo sera utilisé pour capturer une image à des fins d'identification par ${provider}. Veuillez consulter leur politique de confidentialité pour plus de détails."
772
}
res/values/strings_ha.arb
+2
-1
@@ -749,5 +749,6 @@
749
"receivable_balance": "Daidaituwa da daidaituwa",
750
"confirmed_tx": "Tabbatar",
751
"transaction_details_source_address": "Adireshin Incord",
752
- "pause_wallet_creation": "A halin yanzu an dakatar da ikon ƙirƙirar Haven Wallet."
752
+ "pause_wallet_creation": "A halin yanzu an dakatar da ikon ƙirƙirar Haven Wallet.",
753
+ "camera_consent": "Za a yi amfani da kyamarar ku don ɗaukar hoto don dalilai na tantancewa ta ${provider}. Da fatan za a duba Manufar Sirri don cikakkun bayanai."
754
}
res/values/strings_hi.arb
+2
-1
@@ -767,5 +767,6 @@
767
"receivable_balance": "प्राप्य शेष",
768
"confirmed_tx": "की पुष्टि",
769
"transaction_details_source_address": "स्रोत पता",
770
- "pause_wallet_creation": "हेवन वॉलेट बनाने की क्षमता फिलहाल रुकी हुई है।"
770
+ "pause_wallet_creation": "हेवन वॉलेट बनाने की क्षमता फिलहाल रुकी हुई है।",
771
+ "camera_consent": "आपके कैमरे का उपयोग ${provider} द्वारा पहचान उद्देश्यों के लिए एक छवि कैप्चर करने के लिए किया जाएगा। विवरण के लिए कृपया उनकी गोपनीयता नीति जांचें।"
772
}
res/values/strings_hr.arb
+2
-1
@@ -765,5 +765,6 @@
765
"receivable_balance": "Stanje potraživanja",
766
"confirmed_tx": "Potvrđen",
767
"transaction_details_source_address": "Adresa izvora",
768
- "pause_wallet_creation": "Mogućnost stvaranja novčanika Haven trenutno je pauzirana."
768
+ "pause_wallet_creation": "Mogućnost stvaranja novčanika Haven trenutno je pauzirana.",
769
+ "camera_consent": "Vaš će fotoaparat koristiti za snimanje slike u svrhu identifikacije od strane ${provider}. Pojedinosti potražite u njihovoj politici privatnosti."
770
}
res/values/strings_id.arb
+2
-1
@@ -755,5 +755,6 @@
755
"receivable_balance": "Saldo piutang",
756
"confirmed_tx": "Dikonfirmasi",
757
"transaction_details_source_address": "Alamat sumber",
758
- "pause_wallet_creation": "Kemampuan untuk membuat Haven Wallet saat ini dijeda."
758
+ "pause_wallet_creation": "Kemampuan untuk membuat Haven Wallet saat ini dijeda.",
759
+ "camera_consent": "Kamera Anda akan digunakan untuk mengambil gambar untuk tujuan identifikasi oleh ${provider}. Silakan periksa Kebijakan Privasi mereka untuk detailnya."
760
}
res/values/strings_it.arb
+2
-1
@@ -767,5 +767,6 @@
767
"receivable_balance": "Bilanciamento creditizio",
768
"confirmed_tx": "Confermato",
769
"transaction_details_source_address": "Indirizzo di partenza",
770
- "pause_wallet_creation": "La possibilità di creare Haven Wallet è attualmente sospesa."
770
+ "pause_wallet_creation": "La possibilità di creare Haven Wallet è attualmente sospesa.",
771
+ "camera_consent": "La tua fotocamera verrà utilizzata per acquisire un'immagine a scopo identificativo da ${provider}. Si prega di controllare la loro Informativa sulla privacy per i dettagli."
772
}
res/values/strings_ja.arb
+2
-1
@@ -767,5 +767,6 @@
767
"receivable_balance": "売掛金残高",
768
"confirmed_tx": "確認済み",
769
"transaction_details_source_address": "ソースアドレス",
770
- "pause_wallet_creation": "Haven Wallet を作成する機能は現在一時停止されています。"
770
+ "pause_wallet_creation": "Haven Wallet を作成する機能は現在一時停止されています。",
771
+ "camera_consent": "あなたのカメラは、${provider}_ までに識別目的で画像を撮影するために使用されます。詳細については、プライバシー ポリシーをご確認ください。"
772
}
res/values/strings_ko.arb
+2
-1
@@ -765,5 +765,6 @@
765
"receivable_balance": "채권 잔액",
766
"confirmed_tx": "확인",
767
"transaction_details_source_address": "소스 주소",
768
- "pause_wallet_creation": "Haven Wallet 생성 기능이 현재 일시 중지되었습니다."
768
+ "pause_wallet_creation": "Haven Wallet 생성 기능이 현재 일시 중지되었습니다.",
769
+ "camera_consent": "귀하의 카메라는 ${provider}의 식별 목적으로 이미지를 캡처하는 데 사용됩니다. 자세한 내용은 해당 개인정보 보호정책을 확인하세요."
770
}
res/values/strings_my.arb
+2
-1
@@ -765,5 +765,6 @@
765
"receivable_balance": "လက်ကျန်ငွေ",
766
"confirmed_tx": "အတည်ပြုသည်",
767
"transaction_details_source_address": "အရင်းအမြစ်လိပ်စာ",
768
- "pause_wallet_creation": "Haven Wallet ဖန်တီးနိုင်မှုကို လောလောဆယ် ခေတ္တရပ်ထားသည်။"
768
+ "pause_wallet_creation": "Haven Wallet ဖန်တီးနိုင်မှုကို လောလောဆယ် ခေတ္တရပ်ထားသည်။",
769
+ "camera_consent": "မှတ်ပုံတင်ခြင်းရည်ရွယ်ချက်များအတွက် ${provider} တွင် သင့်ကင်မရာကို အသုံးပြုပါမည်။ အသေးစိတ်အတွက် ၎င်းတို့၏ ကိုယ်ရေးကိုယ်တာမူဝါဒကို စစ်ဆေးပါ။"
770
}
res/values/strings_nl.arb
+2
-1
@@ -767,5 +767,6 @@
767
"receivable_balance": "Het saldo",
768
"confirmed_tx": "Bevestigd",
769
"transaction_details_source_address": "Bron adres",
770
- "pause_wallet_creation": "De mogelijkheid om Haven Wallet te maken is momenteel onderbroken."
770
+ "pause_wallet_creation": "De mogelijkheid om Haven Wallet te maken is momenteel onderbroken.",
771
+ "camera_consent": "Uw camera wordt gebruikt om vóór ${provider} een beeld vast te leggen voor identificatiedoeleinden. Raadpleeg hun privacybeleid voor meer informatie."
772
}
res/values/strings_pl.arb
+2
-1
@@ -767,5 +767,6 @@
767
"receivable_balance": "Saldo należności",
768
"confirmed_tx": "Potwierdzony",
769
"transaction_details_source_address": "Adres źródłowy",
770
- "pause_wallet_creation": "Możliwość utworzenia Portfela Haven jest obecnie wstrzymana."
770
+ "pause_wallet_creation": "Możliwość utworzenia Portfela Haven jest obecnie wstrzymana.",
771
+ "camera_consent": "Twój aparat zostanie użyty do przechwycenia obrazu w celach identyfikacyjnych przez ${provider}. Aby uzyskać szczegółowe informacje, sprawdź ich Politykę prywatności."
772
}
res/values/strings_pt.arb
+2
-1
@@ -766,5 +766,6 @@
766
"receivable_balance": "Saldo a receber",
767
"confirmed_tx": "Confirmado",
768
"transaction_details_source_address": "Endereço de Origem",
769
- "pause_wallet_creation": "A capacidade de criar a Haven Wallet está atualmente pausada."
769
+ "pause_wallet_creation": "A capacidade de criar a Haven Wallet está atualmente pausada.",
770
+ "camera_consent": "Sua câmera será usada para capturar uma imagem para fins de identificação por ${provider}. Por favor, verifique a Política de Privacidade para obter detalhes."
771
}
res/values/strings_ru.arb
+2
-1
@@ -767,5 +767,6 @@
767
"receivable_balance": "Баланс дебиторской задолженности",
768
"confirmed_tx": "Подтвержденный",
769
"transaction_details_source_address": "Адрес источника",
770
- "pause_wallet_creation": "Возможность создания Haven Wallet в настоящее время приостановлена."
770
+ "pause_wallet_creation": "Возможность создания Haven Wallet в настоящее время приостановлена.",
771
+ "camera_consent": "Ваша камера будет использоваться для захвата изображения в целях идентификации ${provider}. Пожалуйста, ознакомьтесь с их Политикой конфиденциальности для получения подробной информации."
772
}
res/values/strings_th.arb
+2
-1
@@ -765,5 +765,6 @@
765
"receivable_balance": "ยอดลูกหนี้",
766
"confirmed_tx": "ซึ่งยืนยันแล้ว",
767
"transaction_details_source_address": "ที่อยู่แหล่งกำเนิด",
768
- "pause_wallet_creation": "ขณะนี้ความสามารถในการสร้าง Haven Wallet ถูกหยุดชั่วคราว"
768
+ "pause_wallet_creation": "ขณะนี้ความสามารถในการสร้าง Haven Wallet ถูกหยุดชั่วคราว",
769
+ "camera_consent": "กล้องของคุณจะถูกนำมาใช้เพื่อจับภาพเพื่อวัตถุประสงค์ในการระบุตัวตนภายใน ${provider} โปรดตรวจสอบนโยบายความเป็นส่วนตัวเพื่อดูรายละเอียด"
770
}
res/values/strings_tl.arb
+2
-1
@@ -761,5 +761,6 @@
761
"receivable_balance": "Natatanggap na balanse",
762
"confirmed_tx": "Nakumpirma",
763
"transaction_details_source_address": "SOURCE ADDRESS",
764
- "pause_wallet_creation": "Kasalukuyang naka-pause ang kakayahang gumawa ng Haven Wallet."
764
+ "pause_wallet_creation": "Kasalukuyang naka-pause ang kakayahang gumawa ng Haven Wallet.",
765
+ "camera_consent": "Gagamitin ang iyong camera upang kumuha ng larawan para sa mga layunin ng pagkakakilanlan sa pamamagitan ng ${provider}. Pakisuri ang kanilang Patakaran sa Privacy para sa mga detalye."
766
}
res/values/strings_tr.arb
+2
-1
@@ -765,5 +765,6 @@
765
"receivable_balance": "Alacak bakiyesi",
766
"confirmed_tx": "Onaylanmış",
767
"transaction_details_source_address": "Kaynak adresi",
768
- "pause_wallet_creation": "Haven Cüzdanı oluşturma yeteneği şu anda duraklatıldı."
768
+ "pause_wallet_creation": "Haven Cüzdanı oluşturma yeteneği şu anda duraklatıldı.",
769
+ "camera_consent": "Kameranız ${provider} tarihine kadar tanımlama amacıyla bir görüntü yakalamak için kullanılacaktır. Ayrıntılar için lütfen Gizlilik Politikalarını kontrol edin."
770
}
res/values/strings_uk.arb
+2
-1
@@ -767,5 +767,6 @@
767
"receivable_balance": "Баланс дебіторської заборгованості",
768
"confirmed_tx": "Підтверджений",
769
"transaction_details_source_address": "Адреса джерела",
770
- "pause_wallet_creation": "Можливість створення гаманця Haven зараз призупинено."
770
+ "pause_wallet_creation": "Можливість створення гаманця Haven зараз призупинено.",
771
+ "camera_consent": "Ваша камера використовуватиметься для зйомки зображення з метою ідентифікації ${provider}. Будь ласка, ознайомтеся з їхньою політикою конфіденційності, щоб дізнатися більше."
772
}
res/values/strings_ur.arb
+2
-1
@@ -759,5 +759,6 @@
759
"receivable_balance": "قابل وصول توازن",
760
"confirmed_tx": "تصدیق",
761
"transaction_details_source_address": "ماخذ ایڈریس",
762
- "pause_wallet_creation": "Haven Wallet ۔ﮯﮨ ﻑﻮﻗﻮﻣ ﻝﺎﺤﻟﺍ ﯽﻓ ﺖﯿﻠﮨﺍ ﯽﮐ ﮯﻧﺎﻨﺑ"
762
+ "pause_wallet_creation": "Haven Wallet ۔ﮯﮨ ﻑﻮﻗﻮﻣ ﻝﺎﺤﻟﺍ ﯽﻓ ﺖﯿﻠﮨﺍ ﯽﮐ ﮯﻧﺎﻨﺑ",
763
+ "camera_consent": "۔ﮟﯿﮭﮑﯾﺩ ﯽﺴﯿﻟﺎﭘ ﯽﺴﯾﻮﯿﺋﺍﺮﭘ ﯽﮐ ﻥﺍ ﻡﺮﮐ ﮦﺍﺮﺑ ﮯﯿﻟ ﮯﮐ ﺕﻼ${provider}ﯿﺼﻔﺗ ۔ﺎﮔ ﮯﺋﺎﺟ ﺎﯿﮐ ﻝﺎﻤﻌﺘﺳﺍ ﮯﯿﻟ"
764
}
res/values/strings_yo.arb
+2
-1
@@ -761,5 +761,6 @@
761
"receivable_balance": "Iwontunws.funfun ti o gba",
762
"confirmed_tx": "Jẹrisi",
763
"transaction_details_source_address": "Adirẹsi orisun",
764
- "pause_wallet_creation": "Agbara lati ṣẹda Haven Wallet ti wa ni idaduro lọwọlọwọ."
764
+ "pause_wallet_creation": "Agbara lati ṣẹda Haven Wallet ti wa ni idaduro lọwọlọwọ.",
765
+ "camera_consent": "Kamẹra rẹ yoo ṣee lo lati ya aworan kan fun awọn idi idanimọ nipasẹ ${provider}. Jọwọ ṣayẹwo Ilana Aṣiri wọn fun awọn alaye."
766
}
res/values/strings_zh.arb
+2
-1
@@ -766,5 +766,6 @@
766
"receivable_balance": "应收余额",
767
"confirmed_tx": "确认的",
768
"transaction_details_source_address": "源地址",
769
- "pause_wallet_creation": "创建 Haven 钱包的功能当前已暂停。"
769
+ "pause_wallet_creation": "创建 Haven 钱包的功能当前已暂停。",
770
+ "camera_consent": "${provider} 将使用您的相机拍摄图像以供识别之用。请查看他们的隐私政策了解详情。"
771
}