CW-572-Disable-battery-optimization (#1285)

* feat: Disable battery optimization on android * fix: Add permission to androidmanifestbase file * Increase the frequency of app running in background on aggressive mode * Revert the sync mode frequency [skip ci] * Fix translation * increase frequency to 1 hour --------- Co-authored-by: OmarHatem <omarh.ismail1@gmail.com>

Adegoke David committed Feb 9, 2024 at 00:11 UTC d6e10bdbd57561f51ba33be9741bdee1ba1319ca
33 files changed +200 -8
android/app/src/main/AndroidManifestBase.xml
+1
@@ -8,6 +8,7 @@
8 <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
9 <uses-permission android:name="android.permission.WAKE_LOCK" />
10 <uses-permission android:name="android.permission.CAMERA" />
11 + <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
12
13 <application
14 android:name=".Application"
android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java
+30
@@ -15,6 +15,10 @@ import android.os.Bundle;
15 import android.os.Handler;
16 import android.os.Looper;
17 import android.view.WindowManager;
18 +import android.content.Intent;
19 +import android.net.Uri;
20 +import android.os.PowerManager;
21 +import android.provider.Settings;
22
23 import com.unstoppabledomains.resolution.DomainResolution;
24 import com.unstoppabledomains.resolution.Resolution;
@@ -65,6 +69,14 @@ public class MainActivity extends FlutterFragmentActivity {
69 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
70 }
71 break;
72 + case "disableBatteryOptimization":
73 + disableBatteryOptimization();
74 + handler.post(() -> result.success(null));
75 + break;
76 + case "isBatteryOptimizationDisabled":
77 + boolean isDisabled = isBatteryOptimizationDisabled();
78 + handler.post(() -> result.success(isDisabled));
79 + break;
80 default:
81 handler.post(() -> result.notImplemented());
82 }
@@ -89,4 +101,22 @@ public class MainActivity extends FlutterFragmentActivity {
101 }
102 });
103 }
104 +
105 + private void disableBatteryOptimization() {
106 + String packageName = getPackageName();
107 + PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
108 + if (!pm.isIgnoringBatteryOptimizations(packageName)) {
109 + Intent intent = new Intent();
110 + intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
111 + intent.setData(Uri.parse("package:" + packageName));
112 + startActivity(intent);
113 + }
114 + }
115 +
116 + private boolean isBatteryOptimizationDisabled() {
117 + String packageName = getPackageName();
118 + PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
119 + return pm.isIgnoringBatteryOptimizations(packageName);
120 + }
121 +
122 }
\ No newline at end of file
android/app/src/main/java/com/cakewallet/haven/MainActivity.java
+30
@@ -14,6 +14,10 @@ import android.os.Build;
14 import android.os.Handler;
15 import android.os.Looper;
16 import android.view.WindowManager;
17 +import android.content.Intent;
18 +import android.net.Uri;
19 +import android.os.PowerManager;
20 +import android.provider.Settings;
21
22 import com.unstoppabledomains.resolution.DomainResolution;
23 import com.unstoppabledomains.resolution.Resolution;
@@ -55,6 +59,14 @@ public class MainActivity extends FlutterFragmentActivity {
59 handler.post(() -> result.success(""));
60 }
61 break;
62 + case "disableBatteryOptimization":
63 + disableBatteryOptimization();
64 + handler.post(() -> result.success(null));
65 + break;
66 + case "isBatteryOptimizationDisabled":
67 + boolean isDisabled = isBatteryOptimizationDisabled();
68 + handler.post(() -> result.success(isDisabled));
69 + break;
70 default:
71 handler.post(() -> result.notImplemented());
72 }
@@ -79,4 +91,22 @@ public class MainActivity extends FlutterFragmentActivity {
91 }
92 });
93 }
94 +
95 + private void disableBatteryOptimization() {
96 + String packageName = getPackageName();
97 + PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
98 + if (!pm.isIgnoringBatteryOptimizations(packageName)) {
99 + Intent intent = new Intent();
100 + intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
101 + intent.setData(Uri.parse("package:" + packageName));
102 + startActivity(intent);
103 + }
104 + }
105 +
106 + private boolean isBatteryOptimizationDisabled() {
107 + String packageName = getPackageName();
108 + PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
109 + return pm.isIgnoringBatteryOptimizations(packageName);
110 + }
111 +
112 }
\ No newline at end of file
android/app/src/main/java/com/monero/app/MainActivity.java
+30
@@ -14,6 +14,10 @@ import android.os.Build;
14 import android.os.Handler;
15 import android.os.Looper;
16 import android.view.WindowManager;
17 +import android.content.Intent;
18 +import android.net.Uri;
19 +import android.os.PowerManager;
20 +import android.provider.Settings;
21
22 import com.unstoppabledomains.resolution.DomainResolution;
23 import com.unstoppabledomains.resolution.Resolution;
@@ -64,6 +68,14 @@ public class MainActivity extends FlutterFragmentActivity {
68 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
69 }
70 break;
71 + case "disableBatteryOptimization":
72 + disableBatteryOptimization();
73 + handler.post(() -> result.success(null));
74 + break;
75 + case "isBatteryOptimizationDisabled":
76 + boolean isDisabled = isBatteryOptimizationDisabled();
77 + handler.post(() -> result.success(isDisabled));
78 + break;
79 default:
80 handler.post(() -> result.notImplemented());
81 }
@@ -88,4 +100,22 @@ public class MainActivity extends FlutterFragmentActivity {
100 }
101 });
102 }
103 +
104 + private void disableBatteryOptimization() {
105 + String packageName = getPackageName();
106 + PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
107 + if (!pm.isIgnoringBatteryOptimizations(packageName)) {
108 + Intent intent = new Intent();
109 + intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
110 + intent.setData(Uri.parse("package:" + packageName));
111 + startActivity(intent);
112 + }
113 + }
114 +
115 + private boolean isBatteryOptimizationDisabled() {
116 + String packageName = getPackageName();
117 + PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
118 + return pm.isIgnoringBatteryOptimizations(packageName);
119 + }
120 +
121 }
\ No newline at end of file
cw_core/lib/battery_optimization_native.dart new
+22
@@ -0,0 +1,22 @@
1 +import 'package:flutter/services.dart';
2 +
3 +const MethodChannel _channel = MethodChannel('com.cake_wallet/native_utils');
4 +
5 +Future<void> requestDisableBatteryOptimization() async {
6 + try {
7 + await _channel.invokeMethod('disableBatteryOptimization');
8 + } on PlatformException catch (e) {
9 + print("Failed to disable battery optimization: '${e.message}'.");
10 + }
11 +}
12 +
13 +Future<bool> isBatteryOptimizationDisabled() async {
14 + try {
15 + final bool isDisabled = await _channel.invokeMethod('isBatteryOptimizationDisabled') as bool;
16 + print('It\'s actually disabled? $isDisabled');
17 + return isDisabled;
18 + } on PlatformException catch (e) {
19 + print("Failed to check battery optimization status: '${e.message}'.");
20 + return false;
21 + }
22 +}
lib/src/screens/settings/connection_sync_page.dart
+34 -7
@@ -1,3 +1,5 @@
1 +import 'dart:io';
2 +
3 import 'package:cake_wallet/reactions/wallet_connect.dart';
4 import 'package:cake_wallet/src/screens/settings/widgets/settings_cell_with_arrow.dart';
5 import 'package:cake_wallet/src/screens/settings/widgets/settings_picker_cell.dart';
@@ -8,6 +10,7 @@ import 'package:cake_wallet/utils/feature_flag.dart';
10 import 'package:cake_wallet/utils/show_pop_up.dart';
11 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
12 import 'package:cake_wallet/view_model/settings/sync_mode.dart';
13 +import 'package:cw_core/battery_optimization_native.dart';
14 import 'package:flutter/material.dart';
15 import 'package:cake_wallet/routes.dart';
16 import 'package:cake_wallet/generated/i18n.dart';
@@ -45,12 +48,37 @@ class ConnectionSyncPage extends BasePage {
48 if (DeviceInfo.instance.isMobile) ...[
49 Observer(builder: (context) {
50 return SettingsPickerCell<SyncMode>(
48 - title: S.current.background_sync_mode,
49 - items: SyncMode.all,
50 - displayItem: (SyncMode syncMode) => syncMode.name,
51 - selectedItem: dashboardViewModel.syncMode,
52 - onItemSelected: dashboardViewModel.setSyncMode,
53 - );
51 + title: S.current.background_sync_mode,
52 + items: SyncMode.all,
53 + displayItem: (SyncMode syncMode) => syncMode.name,
54 + selectedItem: dashboardViewModel.syncMode,
55 + onItemSelected: (syncMode) async {
56 + dashboardViewModel.setSyncMode(syncMode);
57 +
58 + if (syncMode.type != SyncType.disabled) {
59 + final isDisabled = await isBatteryOptimizationDisabled();
60 +
61 + if (isDisabled || Platform.isIOS) return;
62 +
63 + await showPopUp<void>(
64 + context: context,
65 + builder: (BuildContext dialogContext) {
66 + return AlertWithTwoActions(
67 + alertTitle: S.current.disableBatteryOptimization,
68 + alertContent: S.current.disableBatteryOptimizationDescription,
69 + leftButtonText: S.of(context).cancel,
70 + rightButtonText: S.of(context).ok,
71 + actionLeftButton: () => Navigator.of(dialogContext).pop(),
72 + actionRightButton: () async {
73 + await requestDisableBatteryOptimization();
74 +
75 + Navigator.of(dialogContext).pop();
76 + },
77 + );
78 + },
79 + );
80 + }
81 + });
82 }),
83 const StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)),
84 Observer(builder: (context) {
@@ -99,7 +127,6 @@ class ConnectionSyncPage extends BasePage {
127 );
128 }
129
102 -
130 Future<void> _presentReconnectAlert(BuildContext context) async {
131 await showPopUp<void>(
132 context: context,
lib/view_model/settings/sync_mode.dart
+1 -1
@@ -10,6 +10,6 @@ class SyncMode {
10 static final all = [
11 SyncMode("Disabled", SyncType.disabled, Duration.zero),
12 SyncMode("Unobtrusive", SyncType.unobtrusive, Duration(days: 1)),
13 - SyncMode("Aggressive", SyncType.aggressive, Duration(hours: 6)),
13 + SyncMode("Aggressive", SyncType.aggressive, Duration(hours: 1)),
14 ];
15 }
res/values/strings_ar.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "تعطيل التبادل",
190 "disable_fiat": "تعطيل fiat",
191 "disable_sell": "قم بتعطيل إجراء البيع",
192 + "disableBatteryOptimization": "تعطيل تحسين البطارية",
193 + "disableBatteryOptimizationDescription": "هل تريد تعطيل تحسين البطارية من أجل جعل الخلفية مزامنة تعمل بحرية وسلاسة؟",
194 "disabled": "معطلة",
195 "discount": "وفر ${value}٪",
196 "display_settings": "اعدادات العرض",
res/values/strings_bg.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "Деактивиране на борса",
190 "disable_fiat": "Деактивиране на fiat",
191 "disable_sell": "Деактивирайте действието за продажба",
192 + "disableBatteryOptimization": "Деактивирайте оптимизацията на батерията",
193 + "disableBatteryOptimizationDescription": "Искате ли да деактивирате оптимизацията на батерията, за да направите синхронизирането на фона да работи по -свободно и гладко?",
194 "disabled": "Деактивирано",
195 "discount": "Спестете ${value}%",
196 "display_settings": "Настройки на екрана",
res/values/strings_cs.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "Zakázat směnárny",
190 "disable_fiat": "Zakázat fiat",
191 "disable_sell": "Zakázat akci prodeje",
192 + "disableBatteryOptimization": "Zakázat optimalizaci baterie",
193 + "disableBatteryOptimizationDescription": "Chcete deaktivovat optimalizaci baterie, aby se synchronizovala pozadí volně a hladce?",
194 "disabled": "Zakázáno",
195 "discount": "Ušetříte ${value}%",
196 "display_settings": "Nastavení zobrazení",
res/values/strings_de.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "Exchange deaktivieren",
190 "disable_fiat": "Fiat deaktivieren",
191 "disable_sell": "Verkaufsaktion deaktivieren",
192 + "disableBatteryOptimization": "Batterieoptimierung deaktivieren",
193 + "disableBatteryOptimizationDescription": "Möchten Sie die Batterieoptimierung deaktivieren, um die Hintergrundsynchronisierung freier und reibungsloser zu gestalten?",
194 "disabled": "Deaktiviert",
195 "discount": "${value} % sparen",
196 "display_settings": "Anzeigeeinstellungen",
res/values/strings_en.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "Disable exchange",
190 "disable_fiat": "Disable fiat",
191 "disable_sell": "Disable sell action",
192 + "disableBatteryOptimization": "Disable Battery Optimization",
193 + "disableBatteryOptimizationDescription": "Do you want to disable battery optimization in order to make background sync run more freely and smoothly?",
194 "disabled": "Disabled",
195 "discount": "Save ${value}%",
196 "display_settings": "Display settings",
res/values/strings_es.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "Deshabilitar intercambio",
190 "disable_fiat": "Deshabilitar fiat",
191 "disable_sell": "Desactivar acción de venta",
192 + "disableBatteryOptimization": "Deshabilitar la optimización de la batería",
193 + "disableBatteryOptimizationDescription": "¿Desea deshabilitar la optimización de la batería para que la sincronización de fondo se ejecute más libremente y sin problemas?",
194 "disabled": "Desactivado",
195 "discount": "Ahorra ${value}%",
196 "display_settings": "Configuración de pantalla",
res/values/strings_fr.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "Désactiver l'échange",
190 "disable_fiat": "Désactiver les montants en fiat",
191 "disable_sell": "Désactiver l'action de vente",
192 + "disableBatteryOptimization": "Désactiver l'optimisation de la batterie",
193 + "disableBatteryOptimizationDescription": "Voulez-vous désactiver l'optimisation de la batterie afin de faire fonctionner la synchronisation d'arrière-plan plus librement et en douceur?",
194 "disabled": "Désactivé",
195 "discount": "Économisez ${value}%",
196 "display_settings": "Paramètres d'affichage",
res/values/strings_ha.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "Kashe musanya",
190 "disable_fiat": "Dakatar da fiat",
191 "disable_sell": "Kashe karbuwa",
192 + "disableBatteryOptimization": "Kashe ingantawa baturi",
193 + "disableBatteryOptimizationDescription": "Shin kana son kashe ingantawa baturi don yin setnc bankwali gudu da yar kyauta da kyau?",
194 "disabled": "tsaya",
195 "discount": "Ajiye ${value}%",
196 "display_settings": "Nuni saituna",
res/values/strings_hi.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "एक्सचेंज अक्षम करें",
190 "disable_fiat": "िएट को अक्षम करें",
191 "disable_sell": "बेचने की कार्रवाई अक्षम करें",
192 + "disableBatteryOptimization": "बैटरी अनुकूलन अक्षम करें",
193 + "disableBatteryOptimizationDescription": "क्या आप बैकग्राउंड सिंक को अधिक स्वतंत्र और सुचारू रूप से चलाने के लिए बैटरी ऑप्टिमाइज़ेशन को अक्षम करना चाहते हैं?",
194 "disabled": "अक्षम",
195 "discount": "${value}% बचाएं",
196 "display_settings": "प्रदर्शन सेटिंग्स",
res/values/strings_hr.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "Onemogući exchange",
190 "disable_fiat": "Isključi, fiat",
191 "disable_sell": "Onemogući akciju prodaje",
192 + "disableBatteryOptimization": "Onemogući optimizaciju baterije",
193 + "disableBatteryOptimizationDescription": "Želite li onemogućiti optimizaciju baterije kako bi se pozadinska sinkronizacija radila slobodnije i glatko?",
194 "disabled": "Onemogućeno",
195 "discount": "Uštedite ${value}%",
196 "display_settings": "Postavke zaslona",
res/values/strings_id.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "Nonaktifkan pertukaran",
190 "disable_fiat": "Nonaktifkan fiat",
191 "disable_sell": "Nonaktifkan aksi jual",
192 + "disableBatteryOptimization": "Nonaktifkan optimasi baterai",
193 + "disableBatteryOptimizationDescription": "Apakah Anda ingin menonaktifkan optimasi baterai untuk membuat sinkronisasi latar belakang berjalan lebih bebas dan lancar?",
194 "disabled": "Dinonaktifkan",
195 "discount": "Hemat ${value}%",
196 "display_settings": "Pengaturan tampilan",
res/values/strings_it.arb
+2
@@ -190,6 +190,8 @@
190 "disable_exchange": "Disabilita scambio",
191 "disable_fiat": "Disabilita fiat",
192 "disable_sell": "Disabilita l'azione di vendita",
193 + "disableBatteryOptimization": "Disabilita l'ottimizzazione della batteria",
194 + "disableBatteryOptimizationDescription": "Vuoi disabilitare l'ottimizzazione della batteria per far funzionare la sincronizzazione in background più libera e senza intoppi?",
195 "disabled": "Disabilitato",
196 "discount": "Risparmia ${value}%",
197 "display_settings": "Impostazioni di visualizzazione",
res/values/strings_ja.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "交換を無効にする",
190 "disable_fiat": "フィアットを無効にする",
191 "disable_sell": "販売アクションを無効にする",
192 + "disableBatteryOptimization": "バッテリーの最適化を無効にします",
193 + "disableBatteryOptimizationDescription": "バックグラウンドシンクをより自由かつスムーズに実行するために、バッテリーの最適化を無効にしたいですか?",
194 "disabled": "無効",
195 "discount": "${value}%を節約",
196 "display_settings": "表示設定",
res/values/strings_ko.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "교환 비활성화",
190 "disable_fiat": "법정화폐 비활성화",
191 "disable_sell": "판매 조치 비활성화",
192 + "disableBatteryOptimization": "배터리 최적화를 비활성화합니다",
193 + "disableBatteryOptimizationDescription": "백그라운드 동기화를보다 자유롭고 매끄럽게 실행하기 위해 배터리 최적화를 비활성화하고 싶습니까?",
194 "disabled": "장애가 있는",
195 "discount": "${value}% 절약",
196 "display_settings": "디스플레이 설정",
res/values/strings_my.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "လဲလှယ်မှုကို ပိတ်ပါ။",
190 "disable_fiat": "Fiat ကိုပိတ်ပါ။",
191 "disable_sell": "ရောင်းချခြင်းလုပ်ဆောင်ချက်ကို ပိတ်ပါ။",
192 + "disableBatteryOptimization": "ဘက်ထရီ optimization ကိုပိတ်ပါ",
193 + "disableBatteryOptimizationDescription": "နောက်ခံထပ်တူပြုခြင်းနှင့်ချောချောမွေ့မွေ့ပြုလုပ်နိုင်ရန်ဘက်ထရီ optimization ကိုသင်ပိတ်ထားလိုပါသလား။",
194 "disabled": "မသန်စွမ်း",
195 "discount": "${value}% ချွေတာ",
196 "display_settings": "ပြသရန် ဆက်တင်များ",
res/values/strings_nl.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "Uitwisseling uitschakelen",
190 "disable_fiat": "Schakel Fiat uit",
191 "disable_sell": "Verkoopactie uitschakelen",
192 + "disableBatteryOptimization": "Schakel de batterijoptimalisatie uit",
193 + "disableBatteryOptimizationDescription": "Wilt u de optimalisatie van de batterij uitschakelen om achtergrondsynchronisatie te laten werken, vrijer en soepeler?",
194 "disabled": "Gehandicapt",
195 "discount": "Bespaar ${value}%",
196 "display_settings": "Weergave-instellingen",
res/values/strings_pl.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "Wyłącz wymianę",
190 "disable_fiat": "Wyłącz waluty FIAT",
191 "disable_sell": "Wyłącz akcję sprzedaży",
192 + "disableBatteryOptimization": "Wyłącz optymalizację baterii",
193 + "disableBatteryOptimizationDescription": "Czy chcesz wyłączyć optymalizację baterii, aby synchronizacja tła działała swobodniej i płynnie?",
194 "disabled": "Wyłączone",
195 "discount": "Zaoszczędź ${value}%",
196 "display_settings": "Ustawienia wyświetlania",
res/values/strings_pt.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "Desativar troca",
190 "disable_fiat": "Desativar fiat",
191 "disable_sell": "Desativar ação de venda",
192 + "disableBatteryOptimization": "Desative a otimização da bateria",
193 + "disableBatteryOptimizationDescription": "Deseja desativar a otimização da bateria para fazer a sincronização de fundo funcionar de forma mais livre e suave?",
194 "disabled": "Desabilitado",
195 "discount": "Economize ${value}%",
196 "display_settings": "Configurações de exibição",
res/values/strings_ru.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "Отключить обмен",
190 "disable_fiat": "Отключить фиат",
191 "disable_sell": "Отключить действие продажи",
192 + "disableBatteryOptimization": "Отключить оптимизацию батареи",
193 + "disableBatteryOptimizationDescription": "Вы хотите отключить оптимизацию батареи, чтобы сделать фона синхронизации более свободно и плавно?",
194 "disabled": "Отключено",
195 "discount": "Сэкономьте ${value}%",
196 "display_settings": "Настройки отображения",
res/values/strings_th.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "ปิดใช้งานการแลกเปลี่ยน",
190 "disable_fiat": "ปิดใช้งานสกุลเงินตรา",
191 "disable_sell": "ปิดการใช้งานการขาย",
192 + "disableBatteryOptimization": "ปิดใช้งานการเพิ่มประสิทธิภาพแบตเตอรี่",
193 + "disableBatteryOptimizationDescription": "คุณต้องการปิดใช้งานการเพิ่มประสิทธิภาพแบตเตอรี่เพื่อให้การซิงค์พื้นหลังทำงานได้อย่างอิสระและราบรื่นมากขึ้นหรือไม่?",
194 "disabled": "ปิดใช้งาน",
195 "discount": "ประหยัด ${value}%",
196 "display_settings": "การตั้งค่าการแสดงผล",
res/values/strings_tl.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "Huwag paganahin ang palitan",
190 "disable_fiat": "Huwag paganahin ang Fiat",
191 "disable_sell": "Huwag paganahin ang pagkilos ng pagbebenta",
192 + "disableBatteryOptimization": "Huwag paganahin ang pag -optimize ng baterya",
193 + "disableBatteryOptimizationDescription": "Nais mo bang huwag paganahin ang pag -optimize ng baterya upang gawing mas malaya at maayos ang pag -sync ng background?",
194 "disabled": "Hindi pinagana",
195 "discount": "Makatipid ng ${value}%",
196 "display_settings": "Mga setting ng pagpapakita",
res/values/strings_tr.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "Borsayı devre dışı bırak",
190 "disable_fiat": "İtibari paraları devre dışı bırak",
191 "disable_sell": "Satış işlemini devre dışı bırak",
192 + "disableBatteryOptimization": "Pil optimizasyonunu devre dışı bırakın",
193 + "disableBatteryOptimizationDescription": "Arka plan senkronizasyonunu daha özgür ve sorunsuz bir şekilde çalıştırmak için pil optimizasyonunu devre dışı bırakmak istiyor musunuz?",
194 "disabled": "Devre dışı",
195 "discount": "%${value} tasarruf et",
196 "display_settings": "Görüntü ayarları",
res/values/strings_uk.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "Вимкнути exchange",
190 "disable_fiat": "Вимкнути фиат",
191 "disable_sell": "Вимкнути дію продажу",
192 + "disableBatteryOptimization": "Вимкнути оптимізацію акумулятора",
193 + "disableBatteryOptimizationDescription": "Ви хочете відключити оптимізацію акумулятора, щоб зробити фонову синхронізацію більш вільно та плавно?",
194 "disabled": "Вимкнено",
195 "discount": "Зекономте ${value}%",
196 "display_settings": "Налаштування дисплея",
res/values/strings_ur.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "تبادلے کو غیر فعال کریں۔",
190 "disable_fiat": "فیاٹ کو غیر فعال کریں۔",
191 "disable_sell": "فروخت کی کارروائی کو غیر فعال کریں۔",
192 + "disableBatteryOptimization": "بیٹری کی اصلاح کو غیر فعال کریں",
193 + "disableBatteryOptimizationDescription": "کیا آپ پس منظر کی مطابقت پذیری کو زیادہ آزادانہ اور آسانی سے چلانے کے لئے بیٹری کی اصلاح کو غیر فعال کرنا چاہتے ہیں؟",
194 "disabled": "معذور",
195 "discount": "${value}% بچائیں",
196 "display_settings": "ڈسپلے کی ترتیبات",
res/values/strings_yo.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "Pa ilé pàṣípààrọ̀",
190 "disable_fiat": "Pa owó tí ìjọba pàṣẹ wa lò",
191 "disable_sell": "Ko iṣọrọ iṣọrọ",
192 + "disableBatteryOptimization": "Mu Ifasi batiri",
193 + "disableBatteryOptimizationDescription": "Ṣe o fẹ lati mu iṣapelo batiri si lati le ṣiṣe ayẹwo ẹhin ati laisiyonu?",
194 "disabled": "Wọ́n tí a ti pa",
195 "discount": "Pamọ́ ${value}%",
196 "display_settings": "Fihàn àwọn ààtò",
res/values/strings_zh.arb
+2
@@ -189,6 +189,8 @@
189 "disable_exchange": "禁用交换",
190 "disable_fiat": "禁用法令",
191 "disable_sell": "禁用卖出操作",
192 + "disableBatteryOptimization": "禁用电池优化",
193 + "disableBatteryOptimizationDescription": "您是否要禁用电池优化以使背景同步更加自由,平稳地运行?",
194 "disabled": "禁用",
195 "discount": "节省 ${value}%",
196 "display_settings": "显示设置",