diff --git a/lib/di.dart b/lib/di.dart index f7c115ae0..798cc7552 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -41,6 +41,7 @@ import 'package:cake_wallet/src/screens/buy/payment_method_options_page.dart'; import 'package:cake_wallet/src/screens/receive/address_list_page.dart'; import 'package:cake_wallet/src/screens/seed/seed_verification/seed_verification_page.dart'; import 'package:cake_wallet/src/screens/send/transaction_success_info_page.dart'; +import 'package:cake_wallet/src/screens/settings/background_sync_page.dart'; import 'package:cake_wallet/src/screens/wallet_list/wallet_list_page.dart'; import 'package:cake_wallet/src/screens/settings/mweb_logs_page.dart'; import 'package:cake_wallet/src/screens/settings/mweb_node_page.dart'; @@ -946,6 +947,8 @@ Future setup({ getIt.registerFactory(() => ConnectionSyncPage(getIt.get())); + getIt.registerFactory(() => BackgroundSyncPage(getIt.get())); + getIt.registerFactory(() => SecurityBackupPage(getIt.get(), getIt.get(), getIt.get().wallet!.isHardwareWallet)); diff --git a/lib/entities/background_tasks.dart b/lib/entities/background_tasks.dart index b0ddfd925..1ccedf007 100644 --- a/lib/entities/background_tasks.dart +++ b/lib/entities/background_tasks.dart @@ -38,7 +38,7 @@ const DELAY_SECONDS_BEFORE_SYNC_START = 15; const spNodeNotificationMessage = "Currently configured Bitcoin node does not support Silent Payments. skipping wallet"; const SYNC_THRESHOLD = 0.98; -int REFRESH_QUEUE_HOURS = 1; +Duration REFRESH_QUEUE_DURATION = Duration(hours: 1); void setMainNotification( FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin, { @@ -239,22 +239,29 @@ Future onStart(ServiceInstance service) async { printV("STARTING SYNC TIMER"); _syncTimer?.cancel(); _syncTimer = Timer.periodic(const Duration(milliseconds: 2000), (timer) async { + int syncedTicks = 0; for (int i = 0; i < syncingWallets.length; i++) { final wallet = syncingWallets[i]; final syncStatus = wallet.syncStatus; final progress = wallet.syncStatus.progress(); final progressPercent = (progress * 100).toStringAsPrecision(5) + "%"; + bool shouldSync = i == 0; - if (progress > 0.999) { - printV("WALLET $i SYNCED"); - wallet.stopSync(); - // pop the first wallet from the list - standbyWallets.add(syncingWallets.removeAt(i)); - flutterLocalNotificationsPlugin.cancelAll(); - continue; + + + if (progress > 0.999 && shouldSync) { + syncedTicks++; + if (syncedTicks > 10) { + syncedTicks = 0; + printV("WALLET $i SYNCED"); + wallet.stopSync(); + // pop the first wallet from the list + standbyWallets.add(syncingWallets.removeAt(i)); + flutterLocalNotificationsPlugin.cancelAll(); + continue; + } } - bool shouldSync = i == 0; String title = "${walletTypeToCryptoCurrency(wallet.type).title} - ${wallet.name}"; late String content; @@ -330,7 +337,7 @@ Future onStart(ServiceInstance service) async { _queueTimer?.cancel(); // add a timer that checks all wallets and adds them to the queue if they are less than SYNC_THRESHOLD synced: - _queueTimer = Timer.periodic(Duration(hours: REFRESH_QUEUE_HOURS), (timer) async { + _queueTimer = Timer.periodic(REFRESH_QUEUE_DURATION, (timer) async { for (int i = 0; i < standbyWallets.length; i++) { final wallet = standbyWallets[i]; final syncStatus = wallet.syncStatus; @@ -339,17 +346,17 @@ Future onStart(ServiceInstance service) async { final node = settingsStore.getCurrentNode(wallet.type); await wallet.connectToNode(node: node); await wallet.startSync(); - await Future.delayed( - const Duration(seconds: 10)); // wait a few seconds before checking progress } + // wait a few seconds before checking progress: + await Future.delayed(const Duration(seconds: 20)); + if (syncStatus.progress() < SYNC_THRESHOLD) { syncingWallets.add(standbyWallets.removeAt(i)); } } }); - - + // setup a watch dog to restart the sync process if it gets stuck: List lastFewProgresses = []; _stuckSyncTimer?.cancel(); @@ -492,6 +499,9 @@ class BackgroundTasks { final SyncMode syncMode = settingsStore.currentSyncMode; final bool useNotifications = settingsStore.showSyncNotification; + final bool syncEnabled = settingsStore.backgroundSyncEnabled; + final bool syncOnBattery = settingsStore.backgroundSyncOnBattery; + final bool syncOnData = settingsStore.backgroundSyncOnData; if (useNotifications) { flutterLocalNotificationsPlugin @@ -501,15 +511,11 @@ class BackgroundTasks { bgService.invoke("stopService"); - if (syncMode.type == SyncType.disabled || !FeatureFlag.isBackgroundSyncEnabled) { + if (!syncEnabled || !FeatureFlag.isBackgroundSyncEnabled) { return; } - if (syncMode.type == SyncType.aggressive) { - REFRESH_QUEUE_HOURS = 3; - } else { - REFRESH_QUEUE_HOURS = 24; - } + REFRESH_QUEUE_DURATION = syncMode.frequency; await initializeService(bgService, useNotifications); } catch (error, stackTrace) { diff --git a/lib/entities/preferences_key.dart b/lib/entities/preferences_key.dart index 71d285221..427c57cd0 100644 --- a/lib/entities/preferences_key.dart +++ b/lib/entities/preferences_key.dart @@ -61,6 +61,9 @@ class PreferencesKey { static const syncModeKey = 'sync_mode'; static const syncAllKey = 'sync_all'; static const showSyncNotificationKey = 'show_sync_notification'; + static const backgroundSyncEnabled = 'background_sync_enabled'; + static const backgroundSyncOnBattery = 'background_sync_on_battery'; + static const backgroundSyncOnData = 'background_sync_on_data'; static const lastPopupDate = 'last_popup_date'; static const lastAppReviewDate = 'last_app_review_date'; static const sortBalanceBy = 'sort_balance_by'; diff --git a/lib/router.dart b/lib/router.dart index 315c17178..fc6092795 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -71,6 +71,7 @@ import 'package:cake_wallet/src/screens/seed/wallet_seed_page.dart'; import 'package:cake_wallet/src/screens/send/send_page.dart'; import 'package:cake_wallet/src/screens/send/send_template_page.dart'; import 'package:cake_wallet/src/screens/send/transaction_success_info_page.dart'; +import 'package:cake_wallet/src/screens/settings/background_sync_page.dart'; import 'package:cake_wallet/src/screens/settings/connection_sync_page.dart'; import 'package:cake_wallet/src/screens/settings/desktop_settings/desktop_settings_page.dart'; import 'package:cake_wallet/src/screens/settings/display_settings_page.dart'; @@ -806,6 +807,10 @@ Route createRoute(RouteSettings settings) { builder: (_) => getIt.get(), ); + case Routes.backgroundSync: + return CupertinoPageRoute( + fullscreenDialog: true, builder: (_) => getIt.get()); + default: return MaterialPageRoute( builder: (_) => Scaffold( diff --git a/lib/routes.dart b/lib/routes.dart index 517efca29..588c1af4a 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -110,6 +110,7 @@ class Routes { static const nftDetailsPage = '/nft_details_page'; static const importNFTPage = '/import_nft_page'; static const torPage = '/tor_page'; + static const backgroundSync = '/background_sync'; static const signPage = '/sign_page'; static const connectDevices = '/device/connect'; diff --git a/lib/src/screens/settings/background_sync_page.dart b/lib/src/screens/settings/background_sync_page.dart new file mode 100644 index 000000000..f05dc5769 --- /dev/null +++ b/lib/src/screens/settings/background_sync_page.dart @@ -0,0 +1,91 @@ +import 'dart:io'; + +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/reactions/wallet_connect.dart'; +import 'package:cake_wallet/routes.dart'; +import 'package:cake_wallet/src/screens/base_page.dart'; +import 'package:cake_wallet/src/screens/settings/widgets/settings_cell_with_arrow.dart'; +import 'package:cake_wallet/src/screens/settings/widgets/settings_picker_cell.dart'; +import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart'; +import 'package:cake_wallet/src/screens/settings/widgets/wallet_connect_button.dart'; +import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; +import 'package:cake_wallet/utils/device_info.dart'; +import 'package:cake_wallet/utils/feature_flag.dart'; +import 'package:cake_wallet/utils/show_pop_up.dart'; +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; +import 'package:cake_wallet/view_model/settings/sync_mode.dart'; +import 'package:cw_core/battery_optimization_native.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_mobx/flutter_mobx.dart'; + +class BackgroundSyncPage extends BasePage { + BackgroundSyncPage(this.dashboardViewModel); + + @override + String get title => S.current.background_sync; + + final DashboardViewModel dashboardViewModel; + + @override + Widget body(BuildContext context) { + return Container( + padding: EdgeInsets.only(top: 10), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Observer(builder: (context) { + return SettingsSwitcherCell( + title: S.current.background_sync, + value: dashboardViewModel.backgroundSyncEnabled, + onValueChange: (_, bool value) => + dashboardViewModel.setBackgroundSyncEnabled(value), + ); + }), + Observer(builder: (context) { + return SettingsPickerCell( + title: S.current.background_sync_mode, + items: SyncMode.all, + displayItem: (SyncMode syncMode) => syncMode.name, + selectedItem: dashboardViewModel.syncMode, + onItemSelected: (syncMode) async { + dashboardViewModel.setSyncMode(syncMode); + + if (Platform.isIOS) return; + }); + }), + Observer(builder: (context) { + return SettingsSwitcherCell( + title: S.current.show_sync_notifications, + value: dashboardViewModel.showSyncNotification, + onValueChange: (BuildContext _, bool isEnabled) async { + dashboardViewModel.setShowSyncNotification(isEnabled); + }, + ); + }), + // Observer(builder: (context) { + // return SettingsSwitcherCell( + // title: S.current.sync_all_wallets, + // value: dashboardViewModel.syncAll, + // onValueChange: (_, bool value) => dashboardViewModel.setSyncAll(value), + // ); + // }), + Observer(builder: (context) { + return SettingsSwitcherCell( + title: S.current.background_sync_on_battery, + value: dashboardViewModel.backgroundSyncOnBattery, + onValueChange: (_, bool value) => + dashboardViewModel.setBackgroundSyncOnBattery(value), + ); + }), + Observer(builder: (context) { + return SettingsSwitcherCell( + title: S.current.background_sync_on_data, + value: dashboardViewModel.backgroundSyncOnData, + onValueChange: (_, bool value) => dashboardViewModel.setBackgroundSyncOnData(value), + ); + }), + ], + ), + ); + } +} diff --git a/lib/src/screens/settings/connection_sync_page.dart b/lib/src/screens/settings/connection_sync_page.dart index f3df7e3d3..a42e5c6f2 100644 --- a/lib/src/screens/settings/connection_sync_page.dart +++ b/lib/src/screens/settings/connection_sync_page.dart @@ -44,36 +44,6 @@ class ConnectionSyncPage extends BasePage { : S.current.rescan, handler: (context) => Navigator.of(context).pushNamed(Routes.rescan), ), - if (Platform.isAndroid && FeatureFlag.isBackgroundSyncEnabled) ...[ - Observer(builder: (context) { - return SettingsPickerCell( - title: S.current.background_sync_mode, - items: SyncMode.all, - displayItem: (SyncMode syncMode) => syncMode.name, - selectedItem: dashboardViewModel.syncMode, - onItemSelected: (syncMode) async { - dashboardViewModel.setSyncMode(syncMode); - - if (Platform.isIOS) return; - }); - }), - Observer(builder: (context) { - return SettingsSwitcherCell( - title: S.current.show_sync_notifications, - value: dashboardViewModel.showSyncNotification, - onValueChange: (BuildContext _, bool isEnabled) async { - dashboardViewModel.setShowSyncNotification(isEnabled); - }, - ); - }), - Observer(builder: (context) { - return SettingsSwitcherCell( - title: S.current.sync_all_wallets, - value: dashboardViewModel.syncAll, - onValueChange: (_, bool value) => dashboardViewModel.setSyncAll(value), - ); - }), - ], ], SettingsCellWithArrow( title: S.current.manage_nodes, @@ -100,6 +70,12 @@ class ConnectionSyncPage extends BasePage { onTap: () => Navigator.of(context).pushNamed(Routes.walletConnectConnectionsListing), ), ], + if (dashboardViewModel.hasRescan && Platform.isAndroid && FeatureFlag.isBackgroundSyncEnabled) ...[ + SettingsCellWithArrow( + title: S.current.background_sync, + handler: (context) => Navigator.of(context).pushNamed(Routes.backgroundSync), + ), + ], if (FeatureFlag.isInAppTorEnabled) SettingsCellWithArrow( title: S.current.tor_connection, diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index 088c13bb4..c50f5bfba 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -81,6 +81,9 @@ abstract class SettingsStoreBase with Store { required SyncMode initialSyncMode, required bool initialSyncAll, required bool initialShowSyncNotification, + required bool initialBackgroundSyncEnabled, + required bool initialBackgroundSyncOnBattery, + required bool initialBackgroundSyncOnData, // required String initialCurrentLocale, required this.appVersion, required this.deviceName, @@ -181,6 +184,9 @@ abstract class SettingsStoreBase with Store { currentSyncMode = initialSyncMode, currentSyncAll = initialSyncAll, showSyncNotification = initialShowSyncNotification, + backgroundSyncEnabled = initialBackgroundSyncEnabled, + backgroundSyncOnBattery = initialBackgroundSyncOnBattery, + backgroundSyncOnData = initialBackgroundSyncOnData, priority = ObservableMap() { //this.nodes = ObservableMap.of(nodes); @@ -383,7 +389,6 @@ abstract class SettingsStoreBase with Store { reaction((_) => currentSyncMode, (SyncMode syncMode) { sharedPreferences.setInt(PreferencesKey.syncModeKey, syncMode.type.index); - _backgroundTasks.registerBackgroundService(); }); @@ -397,6 +402,21 @@ abstract class SettingsStoreBase with Store { _backgroundTasks.registerBackgroundService(); }); + reaction((_) => backgroundSyncEnabled, (bool value) { + sharedPreferences.setBool(PreferencesKey.backgroundSyncEnabled, value); + _backgroundTasks.registerBackgroundService(); + }); + + reaction((_) => backgroundSyncOnBattery, (bool value) { + sharedPreferences.setBool(PreferencesKey.backgroundSyncOnBattery, value); + _backgroundTasks.registerBackgroundService(); + }); + + reaction((_) => backgroundSyncOnData, (bool value) { + sharedPreferences.setBool(PreferencesKey.backgroundSyncOnData, value); + _backgroundTasks.registerBackgroundService(); + }); + reaction( (_) => exchangeStatus, (ExchangeApiMode mode) => @@ -787,6 +807,15 @@ abstract class SettingsStoreBase with Store { @observable bool showSyncNotification; + @observable + bool backgroundSyncEnabled; + + @observable + bool backgroundSyncOnBattery; + + @observable + bool backgroundSyncOnData; + String appVersion; String deviceName; @@ -1109,6 +1138,9 @@ abstract class SettingsStoreBase with Store { }); final savedSyncAll = sharedPreferences.getBool(PreferencesKey.syncAllKey) ?? true; final savedShowSyncNotification = sharedPreferences.getBool(PreferencesKey.showSyncNotificationKey) ?? false; + final savedBackgroundSyncEnabled = sharedPreferences.getBool(PreferencesKey.backgroundSyncEnabled) ?? false; + final savedBackgroundSyncOnBattery = sharedPreferences.getBool(PreferencesKey.backgroundSyncOnBattery) ?? true; + final savedBackgroundSyncOnData = sharedPreferences.getBool(PreferencesKey.backgroundSyncOnData) ?? false; // migrated to secure: final timeOutDuration = await SecureKey.getInt( @@ -1288,6 +1320,9 @@ abstract class SettingsStoreBase with Store { initialSyncMode: savedSyncMode, initialSyncAll: savedSyncAll, initialShowSyncNotification: savedShowSyncNotification, + initialBackgroundSyncEnabled: savedBackgroundSyncEnabled, + initialBackgroundSyncOnBattery: savedBackgroundSyncOnBattery, + initialBackgroundSyncOnData: savedBackgroundSyncOnData, shouldShowYatPopup: shouldShowYatPopup, shouldShowRepWarning: shouldShowRepWarning, ); diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index a128bccfa..c05f37406 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -752,12 +752,30 @@ abstract class DashboardViewModelBase with Store { @computed bool get syncAll => settingsStore.currentSyncAll; + @action + void setBackgroundSyncEnabled(bool value) => settingsStore.backgroundSyncEnabled = value; + + @computed + bool get backgroundSyncEnabled => settingsStore.backgroundSyncEnabled; + @action void setShowSyncNotification(bool value) => settingsStore.showSyncNotification = value; @computed bool get showSyncNotification => settingsStore.showSyncNotification; + @action + void setBackgroundSyncOnBattery(bool value) => settingsStore.backgroundSyncOnBattery = value; + + @computed + bool get backgroundSyncOnBattery => settingsStore.backgroundSyncOnBattery; + + @action + void setBackgroundSyncOnData(bool value) => settingsStore.backgroundSyncOnData = value; + + @computed + bool get backgroundSyncOnData => settingsStore.backgroundSyncOnData; + @action void setSyncAll(bool value) => settingsStore.currentSyncAll = value; diff --git a/lib/view_model/settings/sync_mode.dart b/lib/view_model/settings/sync_mode.dart index cee8d33eb..3195efceb 100644 --- a/lib/view_model/settings/sync_mode.dart +++ b/lib/view_model/settings/sync_mode.dart @@ -1,4 +1,4 @@ -enum SyncType { disabled, unobtrusive, aggressive } +enum SyncType { minutes, oneHour, threeHours, sixHours, twelveHours } class SyncMode { SyncMode(this.name, this.type, this.frequency); @@ -8,8 +8,10 @@ class SyncMode { final Duration frequency; static final all = [ - SyncMode("Disabled", SyncType.disabled, Duration.zero), - SyncMode("Unobtrusive", SyncType.unobtrusive, Duration(hours: 12)), - SyncMode("Aggressive", SyncType.aggressive, Duration(minutes: 15)), + SyncMode("15 Minutes", SyncType.minutes, Duration(minutes: 15)), + SyncMode("1 Hour", SyncType.oneHour, Duration(hours: 1)), + SyncMode("3 Hours", SyncType.threeHours, Duration(hours: 3)), + SyncMode("6 Hours", SyncType.sixHours, Duration(hours: 6)), + SyncMode("12 Hours", SyncType.twelveHours, Duration(hours: 12)), ]; } diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 51a116d6e..399813640 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -69,7 +69,10 @@ "avg_savings": "متوسط مدخرات", "awaitDAppProcessing": ".ﺔﺠﻟﺎﻌﻤﻟﺍ ﻦﻣ dApp ﻲﻬﺘﻨﻳ ﻰﺘﺣ ﺭﺎﻈﺘﻧﻻﺍ ﻰﺟﺮﻳ", "awaiting_payment_confirmation": "في انتظار تأكيد الدفع", + "background_sync": "مزامنة الخلفية", "background_sync_mode": "وضع مزامنة الخلفية", + "background_sync_on_battery": "مزامنة أثناء البطارية", + "background_sync_on_data": "مزامنة باستخدام البيانات", "backup": "نسخ الاحتياطي", "backup_file": "ملف النسخ الاحتياطي", "backup_password": "كلمة مرور النسخ الاحتياطي", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index 92688b349..7e4c5d586 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -69,7 +69,10 @@ "avg_savings": "Средни спестявания", "awaitDAppProcessing": "Моля, изчакайте dApp да завърши обработката.", "awaiting_payment_confirmation": "Чака се потвърждение на плащането", + "background_sync": "Фон Синхх", "background_sync_mode": "Режим на синхронизиране на фона", + "background_sync_on_battery": "Синхронизиране, докато сте на батерия", + "background_sync_on_data": "Синхронизиране с помощта на данни", "backup": "Резервно копие", "backup_file": "Резервно копие", "backup_password": "Парола за възстановяване", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index b5f1cbd11..ef9a3f855 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -69,7 +69,10 @@ "avg_savings": "Prům. ušetřeno", "awaitDAppProcessing": "Počkejte, až dApp dokončí zpracování.", "awaiting_payment_confirmation": "Čeká se na potvrzení platby", + "background_sync": "Synchronizace pozadí", "background_sync_mode": "Režim synchronizace pozadí", + "background_sync_on_battery": "Synchronizace na baterii", + "background_sync_on_data": "Synchronizace pomocí dat", "backup": "Záloha", "backup_file": "Soubor se zálohou", "backup_password": "Heslo pro zálohy", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 59768be17..a2128f87f 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -69,7 +69,10 @@ "avg_savings": "Durchschn. Einsparungen", "awaitDAppProcessing": "Bitte warten Sie, bis die dApp die Verarbeitung abgeschlossen hat.", "awaiting_payment_confirmation": "Warten auf Zahlungsbestätigung", + "background_sync": "Hintergrundsynchronisation", "background_sync_mode": "Hintergrundsynchronisierungsmodus", + "background_sync_on_battery": "Synchronisation während der Batterie", + "background_sync_on_data": "Synchronisieren Sie mit Daten", "backup": "Sicherung", "backup_file": "Sicherungsdatei", "backup_password": "Passwort sichern", @@ -989,4 +992,4 @@ "you_will_get": "Konvertieren zu", "you_will_send": "Konvertieren von", "yy": "YY" -} +} \ No newline at end of file diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index e9ab3d5d9..25e5b1181 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -69,7 +69,10 @@ "avg_savings": "Avg. Savings", "awaitDAppProcessing": "Kindly wait for the dApp to finish processing.", "awaiting_payment_confirmation": "Awaiting Payment Confirmation", + "background_sync": "Background sync", "background_sync_mode": "Background sync mode", + "background_sync_on_battery": "Sync while on battery", + "background_sync_on_data": "Sync using data", "backup": "Backup", "backup_file": "Backup file", "backup_password": "Backup password", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 1dd65af2f..d5990d660 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -69,7 +69,10 @@ "avg_savings": "Ahorro promedio", "awaitDAppProcessing": "Espere a que la dApp termine de procesarse.", "awaiting_payment_confirmation": "Esperando confirmación de pago", + "background_sync": "Sincronización de fondo", "background_sync_mode": "Modo de sincronización en segundo plano", + "background_sync_on_battery": "Sincronizar mientras está en la batería", + "background_sync_on_data": "Sincronizar usando datos", "backup": "Apoyo", "backup_file": "Archivo de respaldo", "backup_password": "Contraseña de respaldo", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index e11024fdc..abd5cef75 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -69,7 +69,10 @@ "avg_savings": "Économies moy.", "awaitDAppProcessing": "Veuillez attendre que l'application décentralisée (dApp) termine le traitement.", "awaiting_payment_confirmation": "En attente de confirmation de paiement", + "background_sync": "Synchronisation de fond", "background_sync_mode": "Mode de synchronisation en arrière-plan", + "background_sync_on_battery": "Synchroniser pendant la batterie", + "background_sync_on_data": "Synchroniser à l'aide de données", "backup": "Sauvegarde", "backup_file": "Fichier de sauvegarde", "backup_password": "Mot de passe de sauvegarde", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index fbe8257f4..1ff03e3b2 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -69,7 +69,10 @@ "avg_savings": "Matsakaici Adana", "awaitDAppProcessing": "Da fatan za a jira dApp ya gama aiki.", "awaiting_payment_confirmation": "Ana jiran Tabbacin Biyan Kuɗi", + "background_sync": "Tunawa da Setc", "background_sync_mode": "Yanayin Sync", + "background_sync_on_battery": "Sync yayin da akan baturi", + "background_sync_on_data": "Sync ta amfani da bayanai", "backup": "Ajiyayyen", "backup_file": "Ajiyayyen fayil", "backup_password": "Ajiyayyen kalmar sirri", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index ce13b2e2a..a0c6da34e 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -69,7 +69,10 @@ "avg_savings": "औसत बचत", "awaitDAppProcessing": "कृपया डीएपी की प्रोसेसिंग पूरी होने तक प्रतीक्षा करें।", "awaiting_payment_confirmation": "भुगतान की पुष्टि की प्रतीक्षा में", + "background_sync": "पृष्ठभूमि सिंक", "background_sync_mode": "बैकग्राउंड सिंक मोड", + "background_sync_on_battery": "बैटरी पर सिंक करें", + "background_sync_on_data": "डेटा का उपयोग करके सिंक करें", "backup": "बैकअप", "backup_file": "बैकअपफ़ाइल", "backup_password": "बैकअप पासवर्ड", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index ca3c2700b..673168ede 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -69,7 +69,10 @@ "avg_savings": "Prosj. ušteda", "awaitDAppProcessing": "Molimo pričekajte da dApp završi obradu.", "awaiting_payment_confirmation": "Čeka se potvrda plaćanja", + "background_sync": "Sinkronizacija pozadine", "background_sync_mode": "Sinkronizacija u pozadini", + "background_sync_on_battery": "Sinkronizirano dok ste na bateriji", + "background_sync_on_data": "Sinkronizacija pomoću podataka", "backup": "Sigurnosna kopija", "backup_file": "Sigurnosna kopija datoteke", "backup_password": "Lozinka za sigurnosnu kopiju", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index be7022c91..a6b8d6de7 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -69,7 +69,10 @@ "avg_savings": "Միջին խնայողություն", "awaitDAppProcessing": "Խնդրեմ սպասեք, մինչև դիմումը կավարտի մշակումը։", "awaiting_payment_confirmation": "Վճարման հաստատման սպասում", + "background_sync": "Ֆոնային համաժամեցում", "background_sync_mode": "Հետին պլանի համաժամացման ռեժիմ", + "background_sync_on_battery": "Համաժամեցումը մարտկոցի ժամանակ", + "background_sync_on_data": "Համաժամեցրեք տվյալների օգտագործումը", "backup": "Կրկնօրինակ", "backup_file": "Կրկնօրինակի ֆայլ", "backup_password": "Կրկնօրինակի գաղտնաբառ", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index bd612cbf8..e9644ce6f 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -69,7 +69,10 @@ "avg_savings": "Rata-rata Pembayaran", "awaitDAppProcessing": "Mohon tunggu hingga dApp menyelesaikan pemrosesan.", "awaiting_payment_confirmation": "Menunggu Konfirmasi Pembayaran", + "background_sync": "Sinkronisasi Latar Belakang", "background_sync_mode": "Mode Sinkronisasi Latar Belakang", + "background_sync_on_battery": "Sinkronisasi saat menggunakan baterai", + "background_sync_on_data": "Sinkronisasi Menggunakan Data", "backup": "Cadangan", "backup_file": "File cadangan", "backup_password": "Kata sandi cadangan", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index 6a994c1c1..58be3c43a 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -69,7 +69,10 @@ "avg_savings": "Risparmio medio", "awaitDAppProcessing": "Attendi gentilmente che la dApp termini l'elaborazione.", "awaiting_payment_confirmation": "In attesa di conferma del pagamento", + "background_sync": "Sincronizzazione in background", "background_sync_mode": "Modalità di sincronizzazione in background", + "background_sync_on_battery": "Sincronizzazione durante la batteria", + "background_sync_on_data": "Sincronizzazione utilizzando i dati", "backup": "Backup", "backup_file": "Backup file", "backup_password": "Backup password", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 1130cd949..d353788b1 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -69,7 +69,10 @@ "avg_savings": "平均節約額", "awaitDAppProcessing": "dAppの処理が完了するまでお待ちください。", "awaiting_payment_confirmation": "支払い確認を待っています", + "background_sync": "背景同期", "background_sync_mode": "バックグラウンド同期モード", + "background_sync_on_battery": "バッテリー中に同期します", + "background_sync_on_data": "データを使用して同期します", "backup": "バックアップ", "backup_file": "バックアップファイル", "backup_password": "バックアップパスワード", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index e19b50ab6..71276aa0e 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -69,7 +69,10 @@ "avg_savings": "평균 절감액", "awaitDAppProcessing": "dApp이 처리를 마칠 때까지 기다려주세요.", "awaiting_payment_confirmation": "결제 확인 대기 중", + "background_sync": "배경 동기화", "background_sync_mode": "백그라운드 동기화 모드", + "background_sync_on_battery": "배터리에서 동기화하십시오", + "background_sync_on_data": "데이터 사용 동기화", "backup": "지원", "backup_file": "백업 파일", "backup_password": "백업 비밀번호", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index fa7ac2c17..bf84e81ac 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -69,7 +69,10 @@ "avg_savings": "ပျမ်းမျှ စုဆောင်းငွေ", "awaitDAppProcessing": "ကျေးဇူးပြု၍ dApp ကို စီမံလုပ်ဆောင်ခြင်း အပြီးသတ်ရန် စောင့်ပါ။", "awaiting_payment_confirmation": "ငွေပေးချေမှု အတည်ပြုချက်ကို စောင့်မျှော်နေပါသည်။", + "background_sync": "နောက်ခံထပ်တူပြုခြင်း", "background_sync_mode": "နောက်ခံထပ်တူပြုခြင်း mode ကို", + "background_sync_on_battery": "ဘက်ထရီရှိနေစဉ်စည်းညှိ", + "background_sync_on_data": "ဒေတာကိုအသုံးပြုပြီးစည်းညှိပါ", "backup": "မိတ္တူ", "backup_file": "အရန်ဖိုင်", "backup_password": "စကားဝှက်ကို အရန်သိမ်းဆည်းပါ။", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index e71be3c23..1f751ea9f 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -69,7 +69,10 @@ "avg_savings": "Gem. besparingen", "awaitDAppProcessing": "Wacht tot de dApp klaar is met verwerken.", "awaiting_payment_confirmation": "In afwachting van betalingsbevestiging", + "background_sync": "Achtergrond Synchroniseerd", "background_sync_mode": "Achtergrondsynchronisatiemodus", + "background_sync_on_battery": "Synchroniseerd terwijl je op de batterij bent", + "background_sync_on_data": "Synchroniseren met gegevens", "backup": "Back-up", "backup_file": "Backup bestand", "backup_password": "Reservewachtwoord", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index bc7f70ca2..9ad683b0a 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -69,7 +69,10 @@ "avg_savings": "Śr. oszczędności", "awaitDAppProcessing": "Poczekaj, aż dApp zakończy przetwarzanie.", "awaiting_payment_confirmation": "Oczekiwanie na potwierdzenie płatności", + "background_sync": "Synchronizacja tła", "background_sync_mode": "Tryb synchronizacji w tle", + "background_sync_on_battery": "Synchronizowanie baterii", + "background_sync_on_data": "Synchronizacja przy użyciu danych", "backup": "Kopia zapasowa", "backup_file": "Plik kopii zapasowej", "backup_password": "Hasło kpoii zapasowej", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index e101343e0..ae3ff7e41 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -69,7 +69,10 @@ "avg_savings": "Poupança média", "awaitDAppProcessing": "Aguarde até que o dApp termine o processamento.", "awaiting_payment_confirmation": "Aguardando confirmação de pagamento", + "background_sync": "Sincronização de fundo", "background_sync_mode": "Modo de sincronização em segundo plano", + "background_sync_on_battery": "Sincronizar enquanto estiver na bateria", + "background_sync_on_data": "Sincronização usando dados", "backup": "Cópia de segurança", "backup_file": "Arquivo de backup", "backup_password": "Senha de backup", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 799d88e85..d361baf7e 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -69,7 +69,10 @@ "avg_savings": "Средняя экономия", "awaitDAppProcessing": "Пожалуйста, подождите, пока dApp завершит обработку.", "awaiting_payment_confirmation": "Ожидается подтверждения платежа", + "background_sync": "Фоновая синхронизация", "background_sync_mode": "Режим фоновой синхронизации", + "background_sync_on_battery": "Синхронизированная батарея", + "background_sync_on_data": "Синхронизируя с использованием данных", "backup": "Резервная копия", "backup_file": "Файл резервной копии", "backup_password": "Пароль резервной копии", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index 54eaa5a01..c02acbe5c 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -69,7 +69,10 @@ "avg_savings": "ประหยัดเฉลี่ย", "awaitDAppProcessing": "โปรดรอให้ dApp ประมวลผลเสร็จสิ้น", "awaiting_payment_confirmation": "รอการยืนยันการชำระเงิน", + "background_sync": "การซิงค์พื้นหลัง", "background_sync_mode": "โหมดซิงค์พื้นหลัง", + "background_sync_on_battery": "ซิงค์ขณะใช้แบตเตอรี่", + "background_sync_on_data": "ซิงค์โดยใช้ข้อมูล", "backup": "สำรองข้อมูล", "backup_file": "ไฟล์สำรองข้อมูล", "backup_password": "รหัสผ่านสำรองข้อมูล", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index 68d5439bb..dab3f1877 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -69,7 +69,10 @@ "avg_savings": "Avg. Matitipid", "awaitDAppProcessing": "Pakihintay na matapos ang pagproseso ng dApp.", "awaiting_payment_confirmation": "Nanghihintay ng Kumpirmasyon sa Pagbabayad", + "background_sync": "Pag -sync ng background", "background_sync_mode": "Background sync mode", + "background_sync_on_battery": "I -sync habang nasa baterya", + "background_sync_on_data": "Pag -sync gamit ang data", "backup": "Backup", "backup_file": "Backup na file", "backup_password": "Backup na password", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index 6314f3fb9..1214cb66d 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -69,7 +69,10 @@ "avg_savings": "Ortalama Tasarruf", "awaitDAppProcessing": "Lütfen dApp'in işlemeyi bitirmesini bekleyin.", "awaiting_payment_confirmation": "Ödemenin onaylanması bekleniyor", + "background_sync": "Arka plan senkronizasyonu", "background_sync_mode": "Arka Plan Senkronizasyon Modu", + "background_sync_on_battery": "Bataryada iken senkronize", + "background_sync_on_data": "Verileri kullanarak senkronize", "backup": "Yedek", "backup_file": "Yedek dosyası", "backup_password": "Yedek parolası", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index ee2765764..58f3b82d7 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -69,7 +69,10 @@ "avg_savings": "Середня економія", "awaitDAppProcessing": "Зачекайте, доки dApp завершить обробку.", "awaiting_payment_confirmation": "Очікується підтвердження платежу", + "background_sync": "Фонове синхронізація", "background_sync_mode": "Фоновий режим синхронізації", + "background_sync_on_battery": "Синхронізувати під час акумулятора", + "background_sync_on_data": "Синхронізувати за допомогою даних", "backup": "Резервна копія", "backup_file": "Файл резервної копії", "backup_password": "Пароль резервної копії", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index 1a342a8a5..e2f11cb70 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -69,7 +69,10 @@ "avg_savings": "اوسط بچت", "awaitDAppProcessing": "۔ﮟﯾﺮﮐ ﺭﺎﻈﺘﻧﺍ ﺎﮐ ﮯﻧﻮﮨ ﻞﻤﮑﻣ ﮓﻨﺴﯿﺳﻭﺮﭘ ﮯﮐ dApp ﻡﺮﮐ ﮦﺍﺮﺑ", "awaiting_payment_confirmation": "ادائیگی کی تصدیق کے منتظر", + "background_sync": "پس منظر کی ہم آہنگی", "background_sync_mode": "پس منظر کی مطابقت پذیری کا موڈ", + "background_sync_on_battery": "بیٹری کے دوران ہم آہنگی", + "background_sync_on_data": "ڈیٹا کا استعمال کرتے ہوئے مطابقت پذیری", "backup": "بیک اپ", "backup_file": "بیک اپ فائل", "backup_password": "بیک اپ پاس ورڈ", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index 885c4a13d..07bc84c7f 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -69,7 +69,10 @@ "avg_savings": "Tiết kiệm trung bình", "awaitDAppProcessing": "Vui lòng đợi ứng dụng phi tập trung hoàn thành xử lý.", "awaiting_payment_confirmation": "Đang chờ xác nhận thanh toán", + "background_sync": "Đồng bộ nền", "background_sync_mode": "Chế độ đồng bộ nền", + "background_sync_on_battery": "Đồng bộ hóa khi dùng pin", + "background_sync_on_data": "Đồng bộ hóa bằng dữ liệu", "backup": "Sao lưu", "backup_file": "Tập tin sao lưu", "backup_password": "Mật khẩu sao lưu", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index f026cada7..26b65a142 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -69,7 +69,10 @@ "avg_savings": "Ìpamọ́ l’óòrèkóòrè", "awaitDAppProcessing": "Fi inurere duro fun dApp lati pari sisẹ.", "awaiting_payment_confirmation": "À ń dúró de ìjẹ́rìísí àránṣẹ́", + "background_sync": "Imuṣiṣẹ Labẹ", "background_sync_mode": "Ipo amuṣiṣẹpọ abẹlẹ", + "background_sync_on_battery": "Sync lakoko ti o wa lori batiri", + "background_sync_on_data": "Muṣiṣẹpọ nipa lilo data", "backup": "Ṣẹ̀dà", "backup_file": "Ṣẹ̀dà akọsílẹ̀", "backup_password": "Ṣẹ̀dà ọ̀rọ̀ aṣínà", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index a2221ae48..4c863cb5a 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -69,7 +69,10 @@ "avg_savings": "平均储蓄", "awaitDAppProcessing": "请等待 dApp 处理完成。", "awaiting_payment_confirmation": "等待付款确认", + "background_sync": "背景同步", "background_sync_mode": "后台同步模式", + "background_sync_on_battery": "电池时同步", + "background_sync_on_data": "使用数据同步", "backup": "备份", "backup_file": "备份文件", "backup_password": "备份密码",