dev
dart 136 lines 5.86 KB
Raw
1 import 'dart:async';
2
3 import 'package:cake_wallet/generated/i18n.dart';
4 import 'package:cake_wallet/src/screens/base_page.dart';
5 import 'package:cake_wallet/src/screens/settings/widgets/settings_picker_cell.dart';
6 import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart';
7 import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
8 import 'package:cake_wallet/utils/show_pop_up.dart';
9 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
10 import 'package:cake_wallet/view_model/settings/sync_mode.dart';
11 import 'package:flutter/material.dart';
12 import 'package:flutter_mobx/flutter_mobx.dart';
13
14 class BackgroundSyncPage extends BasePage {
15 BackgroundSyncPage(this.dashboardViewModel);
16
17 @override
18 String get title => S.current.background_sync;
19
20 final DashboardViewModel dashboardViewModel;
21
22 @override
23 Widget body(BuildContext context) {
24 return Container(
25 padding: EdgeInsets.only(top: 10),
26 child: Column(
27 mainAxisSize: MainAxisSize.min,
28 children: [
29 Observer(builder: (context) {
30 return SettingsSwitcherCell(
31 title: S.current.background_sync,
32 value: dashboardViewModel.backgroundSyncEnabled,
33 onValueChange: (_, bool value) async {
34 if (value) {
35 if (dashboardViewModel.batteryOptimizationEnabled) {
36 await showPopUp(
37 context: context,
38 builder: (context) => AlertWithOneAction(
39 alertTitle: S.current.background_sync,
40 alertContent: S.current.unrestricted_background_service_notice,
41 buttonText: S.current.ok,
42 buttonAction: () => Navigator.of(context).pop(),
43 ));
44 await dashboardViewModel.disableBatteryOptimization();
45 for (var i = 0; i < 4 * 60; i++) {
46 await Future.delayed(Duration(milliseconds: 250));
47 if (!dashboardViewModel.batteryOptimizationEnabled) {
48 await dashboardViewModel.enableBackgroundSync();
49 return;
50 }
51 }
52 } else {
53 dashboardViewModel.enableBackgroundSync();
54 }
55 } else {
56 dashboardViewModel.disableBackgroundSync();
57 }
58 },
59 );
60 }),
61 Observer(builder: (context) {
62 return SettingsPickerCell<SyncMode>(
63 title: S.current.background_sync_mode,
64 items: SyncMode.all,
65 displayItem: (SyncMode syncMode) => syncMode.name,
66 selectedItem: dashboardViewModel.settingsStore.currentSyncMode,
67 onItemSelected: (dashboardViewModel.batteryOptimizationEnabled &&
68 dashboardViewModel.hasBatteryOptimization)
69 ? null
70 : (syncMode) async {
71 dashboardViewModel.setSyncMode(syncMode);
72 });
73 }),
74 if (dashboardViewModel.hasBgsyncNetworkConstraints)
75 Observer(builder: (context) {
76 return SettingsSwitcherCell(
77 title: S.current.background_sync_on_unmetered_network,
78 value: dashboardViewModel.backgroundSyncNetworkUnmetered,
79 onValueChange: (_, bool value) =>
80 dashboardViewModel.setBackgroundSyncNetworkUnmetered(value),
81 );
82 }),
83 if (dashboardViewModel.hasBgsyncBatteryNotLowConstraints)
84 Observer(builder: (context) {
85 return SettingsSwitcherCell(
86 title: S.current.background_sync_on_battery_low,
87 value: !dashboardViewModel.backgroundSyncBatteryNotLow,
88 onValueChange: (_, bool value) =>
89 dashboardViewModel.setBackgroundSyncBatteryNotLow(!value),
90 );
91 }),
92 if (dashboardViewModel.hasBgsyncChargingConstraints)
93 Observer(builder: (context) {
94 return SettingsSwitcherCell(
95 title: S.current.background_sync_on_charging,
96 value: dashboardViewModel.backgroundSyncCharging,
97 onValueChange: (_, bool value) =>
98 dashboardViewModel.setBackgroundSyncCharging(value),
99 );
100 }),
101 if (dashboardViewModel.hasBgsyncDeviceIdleConstraints)
102 Observer(builder: (context) {
103 return SettingsSwitcherCell(
104 title: S.current.background_sync_on_device_idle,
105 value: dashboardViewModel.backgroundSyncDeviceIdle,
106 onValueChange: (_, bool value) =>
107 dashboardViewModel.setBackgroundSyncDeviceIdle(value),
108 );
109 }),
110 Observer(builder: (context) {
111 return SettingsSwitcherCell(
112 title: S.current.new_transactions_notifications,
113 value: dashboardViewModel.backgroundSyncNotificationsEnabled,
114 onValueChange: (_, bool value) async {
115 try {
116 await dashboardViewModel.setBackgroundSyncNotificationsEnabled(value);
117 } catch (e) {
118 showPopUp(
119 context: context,
120 builder: (context) => AlertWithOneAction(
121 alertTitle: S.current.error,
122 alertContent: S.current.notification_permission_denied,
123 buttonText: S.current.ok,
124 buttonAction: () {
125 Navigator.of(context).pop();
126 },
127 ));
128 }
129 },
130 );
131 }),
132 ],
133 ),
134 );
135 }
136 }