From f26815efb80a735b12bbf52b4d1e515cb8cb5c13 Mon Sep 17 00:00:00 2001 From: Serhii Date: Thu, 20 Apr 2023 12:59:59 +0300 Subject: [PATCH] CW-351-Add-option-in-Privacy-settings-to-enable-disable-screenshots (#885) * add prevent screenshots option * fix prevent screen recording * update localization * Update strings_ja.arb --- .../cakewallet/cake_wallet/MainActivity.java | 15 ++++++----- cw_core/lib/set_app_secure_native.dart | 6 +++++ cw_monero/example/pubspec.lock | 14 +++++------ lib/core/backup_service.dart | 6 +++++ lib/entities/preferences_key.dart | 1 + lib/src/screens/settings/privacy_page.dart | 8 ++++++ lib/store/settings_store.dart | 25 ++++++++++++++++++- .../settings/privacy_settings_view_model.dart | 6 +++++ res/values/strings_ar.arb | 3 ++- res/values/strings_bg.arb | 3 ++- res/values/strings_cs.arb | 3 ++- res/values/strings_de.arb | 3 ++- res/values/strings_en.arb | 3 ++- res/values/strings_es.arb | 3 ++- res/values/strings_fr.arb | 3 ++- res/values/strings_hi.arb | 3 ++- res/values/strings_hr.arb | 3 ++- res/values/strings_id.arb | 3 ++- res/values/strings_it.arb | 3 ++- res/values/strings_ja.arb | 3 ++- res/values/strings_ko.arb | 3 ++- res/values/strings_my.arb | 3 ++- res/values/strings_nl.arb | 3 ++- res/values/strings_pl.arb | 3 ++- res/values/strings_pt.arb | 3 ++- res/values/strings_ru.arb | 3 ++- res/values/strings_th.arb | 3 ++- res/values/strings_tr.arb | 3 ++- res/values/strings_uk.arb | 3 ++- res/values/strings_ur.arb | 3 ++- res/values/strings_zh.arb | 3 ++- 31 files changed, 113 insertions(+), 37 deletions(-) create mode 100644 cw_core/lib/set_app_secure_native.dart diff --git a/android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java b/android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java index 1c1e42df8..edaaefeb2 100644 --- a/android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java +++ b/android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java @@ -24,6 +24,7 @@ import java.security.SecureRandom; public class MainActivity extends FlutterFragmentActivity { final String UTILS_CHANNEL = "com.cake_wallet/native_utils"; final int UNSTOPPABLE_DOMAIN_MIN_VERSION_SDK = 24; + boolean isAppSecure = false; @Override public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { @@ -56,6 +57,14 @@ public class MainActivity extends FlutterFragmentActivity { handler.post(() -> result.success("")); } break; + case "setIsAppSecure": + isAppSecure = call.argument("isAppSecure"); + if (isAppSecure) { + getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + } else { + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE); + } + break; default: handler.post(() -> result.notImplemented()); } @@ -80,10 +89,4 @@ public class MainActivity extends FlutterFragmentActivity { } }); } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); - } } \ No newline at end of file diff --git a/cw_core/lib/set_app_secure_native.dart b/cw_core/lib/set_app_secure_native.dart new file mode 100644 index 000000000..2f2e9a9c9 --- /dev/null +++ b/cw_core/lib/set_app_secure_native.dart @@ -0,0 +1,6 @@ +import 'package:flutter/services.dart'; + +const utils = const MethodChannel('com.cake_wallet/native_utils'); + +void setIsAppSecureNative(bool isAppSecure) => + utils.invokeMethod('setIsAppSecure', {'isAppSecure': isAppSecure}); diff --git a/cw_monero/example/pubspec.lock b/cw_monero/example/pubspec.lock index 772ff47bd..19d9cef8f 100644 --- a/cw_monero/example/pubspec.lock +++ b/cw_monero/example/pubspec.lock @@ -115,10 +115,10 @@ packages: dependency: transitive description: name: ffi - sha256: "13a6ccf6a459a125b3fcdb6ec73bd5ff90822e071207c663bfd1f70062d51d18" + sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "2.0.1" file: dependency: transitive description: @@ -277,10 +277,10 @@ packages: dependency: transitive description: name: path_provider_windows - sha256: a34ecd7fb548f8e57321fd8e50d865d266941b54e6c3b7758cf8f37c24116905 + sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130 url: "https://pub.dev" source: hosted - version: "2.0.7" + version: "2.1.5" platform: dependency: transitive description: @@ -386,10 +386,10 @@ packages: dependency: transitive description: name: win32 - sha256: c0e3a4f7be7dae51d8f152230b86627e3397c1ba8c3fa58e63d44a9f3edc9cef + sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4 url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "3.1.4" xdg_directories: dependency: transitive description: @@ -399,5 +399,5 @@ packages: source: hosted version: "0.2.0+3" sdks: - dart: ">=2.18.1 <3.0.0" + dart: ">=2.18.1 <4.0.0" flutter: ">=3.0.0" diff --git a/lib/core/backup_service.dart b/lib/core/backup_service.dart index 3cb434efe..20fd753d8 100644 --- a/lib/core/backup_service.dart +++ b/lib/core/backup_service.dart @@ -209,6 +209,7 @@ class BackupService { final currentBalanceDisplayMode = data[PreferencesKey.currentBalanceDisplayModeKey] as int?; final currentFiatCurrency = data[PreferencesKey.currentFiatCurrencyKey] as String?; final shouldSaveRecipientAddress = data[PreferencesKey.shouldSaveRecipientAddressKey] as bool?; + final isAppSecure = data[PreferencesKey.isAppSecureKey] as bool?; final currentTransactionPriorityKeyLegacy = data[PreferencesKey.currentTransactionPriorityKeyLegacy] as int?; final allowBiometricalAuthentication = data[PreferencesKey.allowBiometricalAuthenticationKey] as bool?; final currentBitcoinElectrumSererId = data[PreferencesKey.currentBitcoinElectrumSererIdKey] as int?; @@ -245,6 +246,11 @@ class BackupService { PreferencesKey.shouldSaveRecipientAddressKey, shouldSaveRecipientAddress); + if (isAppSecure != null) + await _sharedPreferences.setBool( + PreferencesKey.isAppSecureKey, + isAppSecure); + if (currentTransactionPriorityKeyLegacy != null) await _sharedPreferences.setInt( PreferencesKey.currentTransactionPriorityKeyLegacy, diff --git a/lib/entities/preferences_key.dart b/lib/entities/preferences_key.dart index be93300a7..f5741a98b 100644 --- a/lib/entities/preferences_key.dart +++ b/lib/entities/preferences_key.dart @@ -9,6 +9,7 @@ class PreferencesKey { static const currentTransactionPriorityKeyLegacy = 'current_fee_priority'; static const currentBalanceDisplayModeKey = 'current_balance_display_mode'; static const shouldSaveRecipientAddressKey = 'save_recipient_address'; + static const isAppSecureKey = 'is_app_secure'; static const currentFiatApiModeKey = 'current_fiat_api_mode'; static const allowBiometricalAuthenticationKey = 'allow_biometrical_authentication'; diff --git a/lib/src/screens/settings/privacy_page.dart b/lib/src/screens/settings/privacy_page.dart index b11b41199..81e2715f2 100644 --- a/lib/src/screens/settings/privacy_page.dart +++ b/lib/src/screens/settings/privacy_page.dart @@ -8,6 +8,7 @@ import 'package:cake_wallet/view_model/settings/choices_list_item.dart'; import 'package:cake_wallet/view_model/settings/privacy_settings_view_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; +import 'dart:io' show Platform; class PrivacyPage extends BasePage { PrivacyPage(this._privacySettingsViewModel); @@ -48,6 +49,13 @@ class PrivacyPage extends BasePage { onValueChange: (BuildContext _, bool value) { _privacySettingsViewModel.setShouldSaveRecipientAddress(value); }), + if (Platform.isAndroid) + SettingsSwitcherCell( + title: S.current.prevent_screenshots, + value: _privacySettingsViewModel.isAppSecure, + onValueChange: (BuildContext _, bool value) { + _privacySettingsViewModel.setIsAppSecure(value); + }), ], ); }), diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index 2080c0a7c..400f7ac88 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -19,6 +19,8 @@ import 'package:cw_core/node.dart'; import 'package:cake_wallet/monero/monero.dart'; import 'package:cake_wallet/entities/action_list_display_mode.dart'; import 'package:cake_wallet/entities/fiat_api_mode.dart'; +import 'package:cw_core/set_app_secure_native.dart'; +import 'dart:io' show Platform; part 'settings_store.g.dart'; @@ -31,6 +33,7 @@ abstract class SettingsStoreBase with Store { required FiatCurrency initialFiatCurrency, required BalanceDisplayMode initialBalanceDisplayMode, required bool initialSaveRecipientAddress, + required bool initialAppSecure, required FiatApiMode initialFiatMode, required bool initialAllowBiometricalAuthentication, required ExchangeApiMode initialExchangeStatus, @@ -53,6 +56,7 @@ abstract class SettingsStoreBase with Store { fiatCurrency = initialFiatCurrency, balanceDisplayMode = initialBalanceDisplayMode, shouldSaveRecipientAddress = initialSaveRecipientAddress, + isAppSecure = initialAppSecure, fiatApiMode = initialFiatMode, allowBiometricalAuthentication = initialAllowBiometricalAuthentication, shouldShowMarketPlaceInDashboard = initialShouldShowMarketPlaceInDashboard, @@ -119,6 +123,17 @@ abstract class SettingsStoreBase with Store { PreferencesKey.shouldSaveRecipientAddressKey, shouldSaveRecipientAddress)); + reaction((_) => isAppSecure, (bool isAppSecure) { + sharedPreferences.setBool(PreferencesKey.isAppSecureKey, isAppSecure); + if (Platform.isAndroid) { + setIsAppSecureNative(isAppSecure); + } + }); + + if (Platform.isAndroid) { + setIsAppSecureNative(isAppSecure); + } + reaction( (_) => fiatApiMode, (FiatApiMode mode) => sharedPreferences.setInt( @@ -199,6 +214,9 @@ abstract class SettingsStoreBase with Store { @observable bool shouldSaveRecipientAddress; + @observable + bool isAppSecure; + @observable bool allowBiometricalAuthentication; @@ -289,6 +307,8 @@ abstract class SettingsStoreBase with Store { // FIX-ME: Check for which default value we should have here final shouldSaveRecipientAddress = sharedPreferences.getBool(PreferencesKey.shouldSaveRecipientAddressKey) ?? false; + final isAppSecure = + sharedPreferences.getBool(PreferencesKey.isAppSecureKey) ?? false; final currentFiatApiMode = FiatApiMode.deserialize( raw: sharedPreferences .getInt(PreferencesKey.currentFiatApiModeKey) ?? FiatApiMode.enabled.raw); @@ -316,7 +336,7 @@ abstract class SettingsStoreBase with Store { final pinCodeTimeOutDuration = timeOutDuration != null ? PinCodeRequiredDuration.deserialize(raw: timeOutDuration) : defaultPinCodeTimeOutDuration; - + // If no value if (pinLength == null || pinLength == 0) { pinLength = defaultPinLength; @@ -367,6 +387,7 @@ abstract class SettingsStoreBase with Store { initialFiatCurrency: currentFiatCurrency, initialBalanceDisplayMode: currentBalanceDisplayMode, initialSaveRecipientAddress: shouldSaveRecipientAddress, + initialAppSecure: isAppSecure, initialFiatMode: currentFiatApiMode, initialAllowBiometricalAuthentication: allowBiometricalAuthentication, initialExchangeStatus: exchangeStatus, @@ -412,6 +433,8 @@ abstract class SettingsStoreBase with Store { .getInt(PreferencesKey.currentBalanceDisplayModeKey)!); shouldSaveRecipientAddress = sharedPreferences.getBool(PreferencesKey.shouldSaveRecipientAddressKey) ?? shouldSaveRecipientAddress; + isAppSecure = + sharedPreferences.getBool(PreferencesKey.isAppSecureKey) ?? isAppSecure; allowBiometricalAuthentication = sharedPreferences .getBool(PreferencesKey.allowBiometricalAuthenticationKey) ?? allowBiometricalAuthentication; diff --git a/lib/view_model/settings/privacy_settings_view_model.dart b/lib/view_model/settings/privacy_settings_view_model.dart index 110afb07a..91ddd2f34 100644 --- a/lib/view_model/settings/privacy_settings_view_model.dart +++ b/lib/view_model/settings/privacy_settings_view_model.dart @@ -21,6 +21,9 @@ abstract class PrivacySettingsViewModelBase with Store { @computed FiatApiMode get fiatApiMode => _settingsStore.fiatApiMode; + @computed + bool get isAppSecure => _settingsStore.isAppSecure; + @action void setShouldSaveRecipientAddress(bool value) => _settingsStore.shouldSaveRecipientAddress = value; @@ -30,4 +33,7 @@ abstract class PrivacySettingsViewModelBase with Store { @action void setFiatMode(FiatApiMode fiatApiMode) => _settingsStore.fiatApiMode = fiatApiMode; + @action + void setIsAppSecure(bool value) => _settingsStore.isAppSecure = value; + } diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 8dbf1b900..1a16e2443 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -699,5 +699,6 @@ "sell_monero_com_alert_content": "بيع Monero غير مدعوم حتى الآن", "error_text_input_below_minimum_limit":" المبلغ أقل من الحد الأدنى", "error_text_input_above_maximum_limit":"المبلغ أكبر من الحد الأقصى", - "show_market_place": "إظهار السوق" + "show_market_place": "إظهار السوق", + "prevent_screenshots": "منع لقطات الشاشة وتسجيل الشاشة" } diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index 2a95efeee..706e37799 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -700,5 +700,6 @@ "sell_monero_com_alert_content": "Продажбата на Monero все още не се поддържа", "error_text_input_below_minimum_limit" : "Сумата е по-малко от минималната", "error_text_input_above_maximum_limit" : "Сумата надвишава максималната", - "show_market_place":"Покажи пазар" + "show_market_place":"Покажи пазар", + "prevent_screenshots": "Предотвратете екранни снимки и запис на екрана" } diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index ddd22eb61..66006fd8b 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -700,5 +700,6 @@ "sell_monero_com_alert_content": "Prodej Monero zatím není podporován", "error_text_input_below_minimum_limit" : "Částka je menší než minimální hodnota", "error_text_input_above_maximum_limit" : "Částka je větší než maximální hodnota", - "show_market_place": "Zobrazit trh" + "show_market_place": "Zobrazit trh", + "prevent_screenshots": "Zabránit vytváření snímků obrazovky a nahrávání obrazovky" } diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index d29a641e2..f79fb8b4a 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -701,5 +701,6 @@ "sell_monero_com_alert_content": "Der Verkauf von Monero wird noch nicht unterstützt", "error_text_input_below_minimum_limit" : "Menge ist unter dem Minimum", "error_text_input_above_maximum_limit" : "Menge ist über dem Maximum", - "show_market_place": "Marktplatz anzeigen" + "show_market_place": "Marktplatz anzeigen", + "prevent_screenshots": "Verhindern Sie Screenshots und Bildschirmaufzeichnungen" } diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index f4d693e8f..2fe1875c5 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -701,5 +701,6 @@ "sell_monero_com_alert_content": "Selling Monero is not supported yet", "error_text_input_below_minimum_limit" : "Amount is less than the minimum", "error_text_input_above_maximum_limit" : "Amount is more than the maximum", - "show_market_place" :"Show Marketplace" + "show_market_place" :"Show Marketplace", + "prevent_screenshots": "Prevent screenshots and screen recording" } diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index cee502fd3..11153e3ff 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -701,5 +701,6 @@ "sell_monero_com_alert_content": "Aún no se admite la venta de Monero", "error_text_input_below_minimum_limit" : "La cantidad es menos que mínima", "error_text_input_above_maximum_limit" : "La cantidad es más que el máximo", - "show_market_place": "Mostrar mercado" + "show_market_place": "Mostrar mercado", + "prevent_screenshots": "Evitar capturas de pantalla y grabación de pantalla" } diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index c4a44895a..47abb1f2f 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -701,5 +701,6 @@ "sell_monero_com_alert_content": "La vente de Monero n'est pas encore prise en charge", "error_text_input_below_minimum_limit" : "Le montant est inférieur au minimum", "error_text_input_above_maximum_limit" : "Le montant est supérieur au maximum", - "show_market_place" :"Afficher la place de marché" + "show_market_place" :"Afficher la place de marché", + "prevent_screenshots": "Empêcher les captures d'écran et l'enregistrement d'écran" } diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 2669af5dc..d4512c370 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -701,5 +701,6 @@ "sell_monero_com_alert_content": "मोनेरो बेचना अभी तक समर्थित नहीं है", "error_text_input_below_minimum_limit" : "राशि न्यूनतम से कम है", "error_text_input_above_maximum_limit" : "राशि अधिकतम से अधिक है", - "show_market_place":"बाज़ार दिखाएँ" + "show_market_place":"बाज़ार दिखाएँ", + "prevent_screenshots": "स्क्रीनशॉट और स्क्रीन रिकॉर्डिंग रोकें" } diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index 865494c8d..9d5e85fc9 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -701,5 +701,6 @@ "sell_monero_com_alert_content": "Prodaja Monera još nije podržana", "error_text_input_below_minimum_limit" : "Iznos je manji od minimalnog", "error_text_input_above_maximum_limit" : "Iznos je veći od maskimalnog", - "show_market_place" : "Prikaži tržište" + "show_market_place" : "Prikaži tržište", + "prevent_screenshots": "Spriječite snimke zaslona i snimanje zaslona" } diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index 12e1f2cfa..4ade62ce8 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -682,5 +682,6 @@ "sell_monero_com_alert_content": "Menjual Monero belum didukung", "error_text_input_below_minimum_limit" : "Jumlah kurang dari minimal", "error_text_input_above_maximum_limit" : "Jumlah lebih dari maksimal", - "show_market_place": "Tampilkan Pasar" + "show_market_place": "Tampilkan Pasar", + "prevent_screenshots": "Cegah tangkapan layar dan perekaman layar" } diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index dce7df8e3..8cef4e216 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -701,5 +701,6 @@ "sell_monero_com_alert_content": "La vendita di Monero non è ancora supportata", "error_text_input_below_minimum_limit" : "L'ammontare è inferiore al minimo", "error_text_input_above_maximum_limit" : "L'ammontare è superiore al massimo", - "show_market_place":"Mostra mercato" + "show_market_place":"Mostra mercato", + "prevent_screenshots": "Impedisci screenshot e registrazione dello schermo" } diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 674457116..ac2eb8642 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -701,5 +701,6 @@ "sell_monero_com_alert_content": "モネロの販売はまだサポートされていません", "error_text_input_below_minimum_limit" : "金額は最小額より少ない", "error_text_input_above_maximum_limit" : "金額は最大値を超えています", - "show_market_place":"マーケットプレイスを表示" + "show_market_place":"マーケットプレイスを表示", + "prevent_screenshots": "スクリーンショットと画面録画を防止する" } diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 4b35b313b..cf829bb46 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -701,5 +701,6 @@ "sell_monero_com_alert_content": "지원되지 않습니다.", "error_text_input_below_minimum_limit" : "금액이 최소보다 적습니다.", "error_text_input_above_maximum_limit" : "금액이 최대 값보다 많습니다.", - "show_market_place":"마켓플레이스 표시" + "show_market_place":"마켓플레이스 표시", + "prevent_screenshots": "스크린샷 및 화면 녹화 방지" } diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index f08634f48..ac2b056ee 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -701,5 +701,6 @@ "sell_monero_com_alert_content": "Monero ရောင်းချခြင်းကို မပံ့ပိုးရသေးပါ။", "error_text_input_below_minimum_limit" : "ပမာဏသည် အနိမ့်ဆုံးထက်နည်းသည်။", "error_text_input_above_maximum_limit" : "ပမာဏသည် အများဆုံးထက် ပိုများသည်။", - "show_market_place":"စျေးကွက်ကိုပြသပါ။" + "show_market_place":"စျေးကွက်ကိုပြသပါ။", + "prevent_screenshots": "ဖန်သားပြင်ဓာတ်ပုံများနှင့် မျက်နှာပြင်ရိုက်ကူးခြင်းကို တားဆီးပါ။" } diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 6e416b004..371df6f62 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -701,5 +701,6 @@ "sell_monero_com_alert_content": "Het verkopen van Monero wordt nog niet ondersteund", "error_text_input_below_minimum_limit" : "Bedrag is minder dan minimaal", "error_text_input_above_maximum_limit" : "Bedrag is meer dan maximaal", - "show_market_place":"Toon Marktplaats" + "show_market_place":"Toon Marktplaats", + "prevent_screenshots": "Voorkom screenshots en schermopname" } diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 357edc2e3..b5e0a0bfd 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -701,5 +701,6 @@ "sell_monero_com_alert_content": "Sprzedaż Monero nie jest jeszcze obsługiwana", "error_text_input_below_minimum_limit" : "Kwota jest mniejsza niż minimalna", "error_text_input_above_maximum_limit" : "Kwota jest większa niż maksymalna", - "show_market_place" : "Pokaż rynek" + "show_market_place" : "Pokaż rynek", + "prevent_screenshots": "Zapobiegaj zrzutom ekranu i nagrywaniu ekranu" } diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index d02147050..633d2e833 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -700,5 +700,6 @@ "sell_monero_com_alert_content": "A venda de Monero ainda não é suportada", "error_text_input_below_minimum_limit" : "O valor é menor que o mínimo", "error_text_input_above_maximum_limit" : "O valor é superior ao máximo", - "show_market_place":"Mostrar mercado" + "show_market_place":"Mostrar mercado", + "prevent_screenshots": "Evite capturas de tela e gravação de tela" } diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index ad14f4cb0..c9230219c 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -701,5 +701,6 @@ "sell_monero_com_alert_content": "Продажа Monero пока не поддерживается", "error_text_input_below_minimum_limit" : "Сумма меньше минимальной", "error_text_input_above_maximum_limit" : "Сумма больше максимальной", - "show_market_place":"Показать торговую площадку" + "show_market_place":"Показать торговую площадку", + "prevent_screenshots": "Предотвратить скриншоты и запись экрана" } diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index b8f229a09..1233ecba4 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -699,5 +699,6 @@ "sell_monero_com_alert_content": "ยังไม่รองรับการขาย Monero", "error_text_input_below_minimum_limit" : "จำนวนเงินน้อยกว่าขั้นต่ำ", "error_text_input_above_maximum_limit" : "จำนวนเงินสูงกว่าค่าสูงสุด", - "show_market_place":"แสดงตลาดกลาง" + "show_market_place":"แสดงตลาดกลาง", + "prevent_screenshots": "ป้องกันภาพหน้าจอและการบันทึกหน้าจอ" } diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index 2ef0b9302..01ba57fbe 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -701,5 +701,6 @@ "sell_monero_com_alert_content": "Monero satışı henüz desteklenmiyor", "error_text_input_below_minimum_limit" : "Miktar minimumdan daha azdır", "error_text_input_above_maximum_limit" : "Miktar maksimumdan daha fazla", - "show_market_place":"Pazar Yerini Göster" + "show_market_place":"Pazar Yerini Göster", + "prevent_screenshots": "Ekran görüntülerini ve ekran kaydını önleyin" } diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index 72cccf43b..9d8010eca 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -700,5 +700,6 @@ "sell_monero_com_alert_content": "Продаж Monero ще не підтримується", "error_text_input_below_minimum_limit" : "Сума менша мінімальної", "error_text_input_above_maximum_limit" : "Сума більше максимальної", - "show_market_place":"Шоу Ринок" + "show_market_place":"Відображати маркетплейс", + "prevent_screenshots": "Запобігати знімкам екрана та запису екрана" } diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 000ce76b4..15ca6833b 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -701,5 +701,6 @@ "sell_monero_com_alert_content": "Monero فروخت کرنا ابھی تک تعاون یافتہ نہیں ہے۔", "error_text_input_below_minimum_limit" : "رقم کم از کم سے کم ہے۔", "error_text_input_above_maximum_limit" : "رقم زیادہ سے زیادہ سے زیادہ ہے۔", - "show_market_place":"بازار دکھائیں۔" + "show_market_place":"بازار دکھائیں۔", + "prevent_screenshots": "اسکرین شاٹس اور اسکرین ریکارڈنگ کو روکیں۔" } diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index e95e854d9..d906ebf5b 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -700,5 +700,6 @@ "sell_monero_com_alert_content": "尚不支持出售门罗币", "error_text_input_below_minimum_limit" : "金额小于最小值", "error_text_input_above_maximum_limit" : "金额大于最大值", - "show_market_place" :"显示市场" + "show_market_place" :"显示市场", + "prevent_screenshots": "防止截屏和录屏" }