Generic fixes (#1173)
* - Catch get balance network issues - Disable remove button when adding node * Update packages and android gradle version minor enhancements * Backup issue fix * update workflow java version * Remove useless permission check for saving file * minor enhancements * only delete secure storage key before overriding it on MacOS * Minor UI changes * Remove debug prints [skip ci] * Revert FR localization changes
Omar Hatem committed
Nov 18, 2023 at 00:15 UTC
e0925092641449c151f8213ca808d617f8eef29c
26 files changed
+166
-114
.github/workflows/cache_dependencies.yml
+1
-1
@@ -14,7 +14,7 @@ jobs:
14
- uses: actions/checkout@v2
15
- uses: actions/setup-java@v1
16
with:
17
- java-version: '8.x'
17
+ java-version: '11.x'
18
19
- name: Flutter action
20
uses: subosito/flutter-action@v1
.github/workflows/pr_test_build.yml
+1
-1
@@ -22,7 +22,7 @@ jobs:
22
- uses: actions/checkout@v2
23
- uses: actions/setup-java@v1
24
with:
25
- java-version: "8.x"
25
+ java-version: "11.x"
26
27
- name: Flutter action
28
uses: subosito/flutter-action@v1
android/app/build.gradle
-1
@@ -75,7 +75,6 @@ android {
75
76
shrinkResources false
77
minifyEnabled false
78
- useProguard false
78
79
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
80
}
android/app/src/main/AndroidManifestBase.xml
+1
@@ -3,6 +3,7 @@
3
4
<uses-permission android:name="android.permission.INTERNET"/>
5
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
6
+ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
7
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
8
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
9
<uses-permission android:name="android.permission.WAKE_LOCK" />
android/build.gradle
+2
-2
@@ -1,12 +1,12 @@
1
buildscript {
2
- ext.kotlin_version = '1.6.21'
2
+ ext.kotlin_version = '1.7.10'
3
repositories {
4
google()
5
jcenter()
6
}
7
8
dependencies {
9
- classpath 'com.android.tools.build:gradle:4.1.3'
9
+ classpath 'com.android.tools.build:gradle:7.3.0'
10
classpath 'com.google.gms:google-services:4.3.8'
11
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
12
}
cw_ethereum/lib/ethereum_client.dart
+7
-2
@@ -38,8 +38,13 @@ class EthereumClient {
38
// });
39
}
40
41
- Future<EtherAmount> getBalance(EthereumAddress address) async =>
42
- await _client!.getBalance(address);
41
+ Future<EtherAmount> getBalance(EthereumAddress address) async {
42
+ try {
43
+ return await _client!.getBalance(address);
44
+ } catch (_) {
45
+ return EtherAmount.zero();
46
+ }
47
+ }
48
49
Future<int> getGasUnitPrice() async {
50
try {
cw_haven/android/build.gradle
+2
-2
@@ -2,14 +2,14 @@ group 'com.cakewallet.cw_haven'
2
version '1.0-SNAPSHOT'
3
4
buildscript {
5
- ext.kotlin_version = '1.3.50'
5
+ ext.kotlin_version = '1.7.10'
6
repositories {
7
google()
8
jcenter()
9
}
10
11
dependencies {
12
- classpath 'com.android.tools.build:gradle:4.1.0'
12
+ classpath 'com.android.tools.build:gradle:7.3.0'
13
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
14
}
15
}
cw_monero/android/build.gradle
+2
-2
@@ -2,14 +2,14 @@ group 'com.cakewallet.monero'
2
version '1.0-SNAPSHOT'
3
4
buildscript {
5
- ext.kotlin_version = '1.3.50'
5
+ ext.kotlin_version = '1.7.10'
6
repositories {
7
google()
8
jcenter()
9
}
10
11
dependencies {
12
- classpath 'com.android.tools.build:gradle:3.5.4'
12
+ classpath 'com.android.tools.build:gradle:7.3.0'
13
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
14
}
15
}
cw_shared_external/android/build.gradle
+2
-2
@@ -2,14 +2,14 @@ group 'com.cakewallet.cw_shared_external'
2
version '1.0-SNAPSHOT'
3
4
buildscript {
5
- ext.kotlin_version = '1.3.50'
5
+ ext.kotlin_version = '1.7.10'
6
repositories {
7
google()
8
jcenter()
9
}
10
11
dependencies {
12
- classpath 'com.android.tools.build:gradle:4.1.0'
12
+ classpath 'com.android.tools.build:gradle:7.3.0'
13
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
14
}
15
}
lib/core/auth_service.dart
+5
-1
@@ -1,3 +1,5 @@
1
+import 'dart:io';
2
+
3
import 'package:cake_wallet/core/totp_request_details.dart';
4
import 'package:cake_wallet/routes.dart';
5
import 'package:cake_wallet/src/screens/auth/auth_page.dart';
@@ -40,7 +42,9 @@ class AuthService with Store {
42
final encodedPassword = encodedPinCode(pin: password);
43
// secure storage has a weird bug on macOS, where overwriting a key doesn't work, unless
44
// we delete what's there first:
43
- await secureStorage.delete(key: key);
45
+ if (Platform.isMacOS) {
46
+ await secureStorage.delete(key: key);
47
+ }
48
await secureStorage.write(key: key, value: encodedPassword);
49
}
50
lib/core/backup_service.dart
+1
-1
@@ -295,7 +295,7 @@ class BackupService {
295
await _sharedPreferences.setInt(
296
PreferencesKey.currentTransactionPriorityKeyLegacy, currentTransactionPriorityKeyLegacy);
297
298
- if (Platform.isMacOS || Platform.isLinux) {
298
+ if (DeviceInfo.instance.isDesktop) {
299
await _sharedPreferences.setBool(PreferencesKey.allowBiometricalAuthenticationKey, false);
300
} else if (allowBiometricalAuthentication != null) {
301
await _sharedPreferences.setBool(
lib/ionia/ionia_service.dart
+2
-3
@@ -6,7 +6,6 @@ import 'package:cake_wallet/.secrets.g.dart' as secrets;
6
import 'package:cake_wallet/ionia/ionia_api.dart';
7
import 'package:cake_wallet/ionia/ionia_gift_card.dart';
8
import 'package:cake_wallet/ionia/ionia_category.dart';
9
-import 'package:platform_device_id/platform_device_id.dart';
9
10
class IoniaService {
11
IoniaService(this.secureStorage, this.ioniaApi);
@@ -112,9 +111,9 @@ class IoniaService {
111
required String currency}) async {
112
final username = (await secureStorage.read(key: ioniaUsernameStorageKey))!;
113
final password = (await secureStorage.read(key: ioniaPasswordStorageKey))!;
115
- final deviceId = await PlatformDeviceId.getDeviceId;
114
+ final deviceId = '';
115
return ioniaApi.purchaseGiftCard(
117
- requestedUUID: deviceId!,
116
+ requestedUUID: deviceId,
117
merchId: merchId,
118
amount: amount,
119
currency: currency,
lib/reactions/on_wallet_sync_status_change.dart
+3
-3
@@ -7,7 +7,7 @@ import 'package:cw_core/wallet_base.dart';
7
import 'package:cw_core/balance.dart';
8
import 'package:cw_core/transaction_info.dart';
9
import 'package:cw_core/sync_status.dart';
10
-import 'package:wakelock/wakelock.dart';
10
+import 'package:wakelock_plus/wakelock_plus.dart';
11
12
ReactionDisposer? _onWalletSyncStatusChangeReaction;
13
@@ -27,10 +27,10 @@ void startWalletSyncStatusChangeReaction(
27
}
28
}
29
if (status is SyncingSyncStatus) {
30
- await Wakelock.enable();
30
+ await WakelockPlus.enable();
31
}
32
if (status is SyncedSyncStatus || status is FailedSyncStatus) {
33
- await Wakelock.disable();
33
+ await WakelockPlus.disable();
34
}
35
} catch(e) {
36
print(e.toString());
lib/src/screens/backup/backup_page.dart
+1
-9
@@ -17,7 +17,6 @@ import 'package:file_picker/file_picker.dart';
17
import 'package:flutter/material.dart';
18
import 'package:flutter/services.dart';
19
import 'package:flutter_mobx/flutter_mobx.dart';
20
-import 'package:permission_handler/permission_handler.dart';
20
21
class BackupPage extends BasePage {
22
BackupPage(this.backupViewModelBase);
@@ -129,15 +128,8 @@ class BackupPage extends BasePage {
128
alertTitle: S.of(context).export_backup,
129
alertContent: S.of(context).select_destination,
130
rightButtonText: S.of(context).save_to_downloads,
132
- leftButtonText:S.of(context).share,
131
+ leftButtonText: S.of(context).share,
132
actionRightButton: () async {
134
- final permission = await Permission.storage.request();
135
-
136
- if (permission.isDenied) {
137
- Navigator.of(dialogContext).pop();
138
- return;
139
- }
140
-
133
await backupViewModelBase.saveToDownload(backup.name, backup.content);
134
Navigator.of(dialogContext).pop();
135
},
lib/src/screens/buy/buy_options_page.dart
+8
-8
@@ -37,21 +37,21 @@ class BuyOptionsPage extends BasePage {
37
Padding(
38
padding: EdgeInsets.only(top: 24),
39
child: OptionTile(
40
- image: iconRobinhood,
41
- title: "Robinhood Connect",
42
- description: S.of(context).robinhood_option_description,
40
+ image: iconOnramper,
41
+ title: "Onramper",
42
+ description: S.of(context).onramper_option_description,
43
onPressed: () async =>
44
- await getIt.get<RobinhoodBuyProvider>().launchProvider(context),
44
+ await getIt.get<OnRamperBuyProvider>().launchProvider(context),
45
),
46
),
47
Padding(
48
padding: EdgeInsets.only(top: 24),
49
child: OptionTile(
50
- image: iconOnramper,
51
- title: "Onramper",
52
- description: S.of(context).onramper_option_description,
50
+ image: iconRobinhood,
51
+ title: "Robinhood Connect",
52
+ description: S.of(context).robinhood_option_description,
53
onPressed: () async =>
54
- await getIt.get<OnRamperBuyProvider>().launchProvider(context),
54
+ await getIt.get<RobinhoodBuyProvider>().launchProvider(context),
55
),
56
),
57
Spacer(),
lib/src/screens/monero_accounts/monero_account_list_page.dart
+2
-2
@@ -15,7 +15,7 @@ class MoneroAccountListPage extends StatelessWidget {
15
16
@override
17
Widget build(BuildContext context) {
18
- double itemHeight = 80;
18
+ double itemHeight = 65;
19
double buttonHeight = 62;
20
21
return Observer(builder: (_) {
@@ -31,7 +31,7 @@ class MoneroAccountListPage extends StatelessWidget {
31
child: ListView.separated(
32
padding: EdgeInsets.zero,
33
controller: controller,
34
- separatorBuilder: (context, index) => const VerticalSectionDivider(),
34
+ separatorBuilder: (context, index) => const HorizontalSectionDivider(),
35
itemCount: accounts.length,
36
itemBuilder: (context, index) {
37
final account = accounts[index];
lib/src/screens/monero_accounts/widgets/account_tile.dart
+1
-2
@@ -1,5 +1,4 @@
1
import 'package:cake_wallet/themes/extensions/account_list_theme.dart';
2
-import 'package:cake_wallet/themes/extensions/receive_page_theme.dart';
2
import 'package:flutter/material.dart';
3
import 'package:flutter_slidable/flutter_slidable.dart';
4
import 'package:cake_wallet/generated/i18n.dart';
@@ -33,7 +32,7 @@ class AccountTile extends StatelessWidget {
32
final Widget cell = GestureDetector(
33
onTap: onTap,
34
child: Container(
36
- height: 77,
35
+ height: 60,
36
width: double.infinity,
37
padding: EdgeInsets.only(left: 24, right: 24),
38
color: color,
lib/src/screens/nodes/node_create_or_edit_page.dart
+16
-20
@@ -78,7 +78,7 @@ class NodeCreateOrEditPage extends BasePage {
78
'assets/images/qr_code_icon.png',
79
),
80
);
81
-
81
+
82
final NodeCreateOrEditViewModel nodeCreateOrEditViewModel;
83
final Node? editingNode;
84
final bool? isSelected;
@@ -133,27 +133,20 @@ class NodeCreateOrEditPage extends BasePage {
133
mainAxisAlignment: MainAxisAlignment.center,
134
children: <Widget>[
135
Flexible(
136
- child: Container(
137
- padding: EdgeInsets.only(right: 8.0),
138
- child: LoadingPrimaryButton(
136
+ child: Container(
137
+ padding: EdgeInsets.only(right: 8.0),
138
+ child: LoadingPrimaryButton(
139
onPressed: () async {
140
final confirmed = await showPopUp<bool>(
141
context: context,
142
builder: (BuildContext context) {
143
return AlertWithTwoActions(
144
- alertTitle:
145
- S.of(context).remove_node,
146
- alertContent: S
147
- .of(context)
148
- .remove_node_message,
149
- rightButtonText:
150
- S.of(context).remove,
151
- leftButtonText:
152
- S.of(context).cancel,
153
- actionRightButton: () =>
154
- Navigator.pop(context, true),
155
- actionLeftButton: () =>
156
- Navigator.pop(context, false));
144
+ alertTitle: S.of(context).remove_node,
145
+ alertContent: S.of(context).remove_node_message,
146
+ rightButtonText: S.of(context).remove,
147
+ leftButtonText: S.of(context).cancel,
148
+ actionRightButton: () => Navigator.pop(context, true),
149
+ actionLeftButton: () => Navigator.pop(context, false));
150
}) ??
151
false;
152
@@ -163,11 +156,14 @@ class NodeCreateOrEditPage extends BasePage {
156
}
157
},
158
text: S.of(context).delete,
166
- isDisabled: !nodeCreateOrEditViewModel.isReady ||
159
+ isDisabled: editingNode == null ||
160
+ !nodeCreateOrEditViewModel.isReady ||
161
(isSelected ?? false),
162
color: Palette.red,
169
- textColor: Colors.white),
170
- )),
163
+ textColor: Colors.white,
164
+ ),
165
+ ),
166
+ ),
167
Flexible(
168
child: Container(
169
padding: EdgeInsets.only(left: 8.0),
lib/src/screens/restore/restore_from_backup_page.dart
+84
-30
@@ -4,7 +4,6 @@ import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
4
import 'package:cake_wallet/utils/responsive_layout_util.dart';
5
import 'package:cake_wallet/utils/show_pop_up.dart';
6
import 'package:flutter/material.dart';
7
-import 'package:flutter/src/widgets/framework.dart';
7
import 'package:cake_wallet/src/widgets/primary_button.dart';
8
import 'package:cake_wallet/view_model/restore_from_backup_view_model.dart';
9
import 'package:cake_wallet/src/screens/base_page.dart';
@@ -31,10 +30,11 @@ class RestoreFromBackupPage extends BasePage {
30
context: context,
31
builder: (BuildContext context) {
32
return AlertWithOneAction(
34
- alertTitle: S.of(context).error,
35
- alertContent: state.error,
36
- buttonText: S.of(context).ok,
37
- buttonAction: () => Navigator.of(context).pop());
33
+ alertTitle: S.of(context).error,
34
+ alertContent: state.error,
35
+ buttonText: S.of(context).ok,
36
+ buttonAction: () => Navigator.of(context).pop(),
37
+ );
38
});
39
});
40
}
@@ -44,42 +44,97 @@ class RestoreFromBackupPage extends BasePage {
44
child: ConstrainedBox(
45
constraints: BoxConstraints(maxWidth: ResponsiveLayoutUtilBase.kDesktopMaxWidthConstraint),
46
child: Padding(
47
- padding: EdgeInsets.only(bottom: 24, left: 24, right: 24),
48
- child: Column(children: [
47
+ padding: EdgeInsets.only(bottom: 24, left: 24, right: 24),
48
+ child: Column(
49
+ children: [
50
Expanded(
51
child: Container(
52
child: Center(
52
- child: TextFormField(
53
+ child: Column(
54
+ mainAxisSize: MainAxisSize.min,
55
+ children: [
56
+ TextFormField(
57
obscureText: true,
58
enableSuggestions: false,
59
autocorrect: false,
56
- decoration: InputDecoration(
57
- hintText: S.of(context).enter_backup_password),
60
+ decoration:
61
+ InputDecoration(hintText: S.of(context).enter_backup_password),
62
keyboardType: TextInputType.visiblePassword,
63
controller: textEditingController,
60
- style: TextStyle(fontSize: 26, color: Colors.black))),
64
+ style: TextStyle(fontSize: 26, color: Colors.black),
65
+ ),
66
+ Observer(
67
+ builder: (_) {
68
+ if (restoreFromBackupViewModel.filePath.isNotEmpty) {
69
+ return Column(
70
+ children: [
71
+ const SizedBox(height: 100),
72
+ Row(
73
+ children: [
74
+ Text(
75
+ "File Name: ",
76
+ style: TextStyle(
77
+ fontSize: 18.0,
78
+ fontWeight: FontWeight.bold,
79
+ fontFamily: 'Lato',
80
+ color: titleColor(context),
81
+ ),
82
+ ),
83
+ Expanded(
84
+ child: Text(
85
+ restoreFromBackupViewModel.filePath.split("/").last,
86
+ style: TextStyle(
87
+ fontSize: 18.0,
88
+ fontWeight: FontWeight.bold,
89
+ fontFamily: 'Lato',
90
+ color: titleColor(context),
91
+ ),
92
+ ),
93
+ ),
94
+ ],
95
+ ),
96
+ ],
97
+ );
98
+ }
99
+
100
+ return const SizedBox();
101
+ },
102
+ ),
103
+ ],
104
+ ),
105
+ ),
106
),
107
),
108
Container(
64
- child: Row(children: [
65
- Expanded(
66
- child: PrimaryButton(
109
+ child: Row(
110
+ children: [
111
+ Expanded(
112
+ child: PrimaryButton(
113
onPressed: () => presentFilePicker(),
114
text: S.of(context).select_backup_file,
115
color: Colors.grey,
70
- textColor: Colors.white)),
71
- SizedBox(width: 20),
72
- Expanded(child: Observer(builder: (_) {
73
- return LoadingPrimaryButton(
74
- isLoading:
75
- restoreFromBackupViewModel.state is IsExecutingState,
76
- onPressed: () => onImportHandler(context),
77
- text: S.of(context).import,
78
- color: Theme.of(context).primaryColor,
79
- textColor: Colors.white);
80
- }))
81
- ])),
82
- ])),
116
+ textColor: Colors.white,
117
+ ),
118
+ ),
119
+ SizedBox(width: 20),
120
+ Expanded(
121
+ child: Observer(
122
+ builder: (_) {
123
+ return LoadingPrimaryButton(
124
+ isLoading: restoreFromBackupViewModel.state is IsExecutingState,
125
+ onPressed: () => onImportHandler(context),
126
+ text: S.of(context).import,
127
+ color: Theme.of(context).primaryColor,
128
+ textColor: Colors.white);
129
+ },
130
+ ),
131
+ ),
132
+ ],
133
+ ),
134
+ ),
135
+ ],
136
+ ),
137
+ ),
138
),
139
);
140
}
@@ -87,7 +142,7 @@ class RestoreFromBackupPage extends BasePage {
142
Future<void> presentFilePicker() async {
143
final result = await FilePicker.platform.pickFiles();
144
90
- if (result?.files?.isEmpty ?? true) {
145
+ if (result?.files.isEmpty ?? true) {
146
return;
147
}
148
@@ -95,8 +150,7 @@ class RestoreFromBackupPage extends BasePage {
150
}
151
152
Future<void> onImportHandler(BuildContext context) async {
98
- if (textEditingController.text.isEmpty ||
99
- (restoreFromBackupViewModel.filePath.isEmpty ?? true)) {
153
+ if (textEditingController.text.isEmpty || (restoreFromBackupViewModel.filePath.isEmpty)) {
154
await showPopUp<void>(
155
context: context,
156
builder: (_) {
lib/src/screens/restore/restore_options_page.dart
+4
-5
@@ -21,7 +21,6 @@ class RestoreOptionsPage extends BasePage {
21
@override
22
String get title => S.current.restore_restore_wallet;
23
24
-
24
final bool isNewInstall;
25
final imageSeedKeys = Image.asset('assets/images/restore_wallet_image.png');
26
final imageBackup = Image.asset('assets/images/backup.png');
@@ -38,8 +37,7 @@ class RestoreOptionsPage extends BasePage {
37
child: Column(
38
children: <Widget>[
39
OptionTile(
41
- onPressed: () => Navigator.pushNamed(
42
- context, Routes.restoreWalletFromSeedKeys,
40
+ onPressed: () => Navigator.pushNamed(context, Routes.restoreWalletFromSeedKeys,
41
arguments: isNewInstall),
42
image: imageSeedKeys,
43
title: S.of(context).restore_title_from_seed_keys,
@@ -58,7 +56,7 @@ class RestoreOptionsPage extends BasePage {
56
child: OptionTile(
57
onPressed: () async {
58
bool isCameraPermissionGranted =
61
- await PermissionHandler.checkPermission(Permission.camera, context);
59
+ await PermissionHandler.checkPermission(Permission.camera, context);
60
if (!isCameraPermissionGranted) return;
61
bool isPinSet = false;
62
if (isNewInstall) {
@@ -73,7 +71,8 @@ class RestoreOptionsPage extends BasePage {
71
final restoreWallet =
72
await WalletRestoreFromQRCode.scanQRCodeForRestoring(context);
73
76
- final restoreFromQRViewModel = getIt.get<WalletRestorationFromQRVM>(param1: restoreWallet.type);
74
+ final restoreFromQRViewModel =
75
+ getIt.get<WalletRestorationFromQRVM>(param1: restoreWallet.type);
76
77
await restoreFromQRViewModel.create(restoreWallet: restoreWallet);
78
if (restoreFromQRViewModel.state is FailureState) {
lib/src/widgets/base_alert_dialog.dart
+1
-2
@@ -3,7 +3,6 @@ import 'dart:ui';
3
import 'package:cake_wallet/src/widgets/section_divider.dart';
4
import 'package:cake_wallet/themes/extensions/alert_theme.dart';
5
import 'package:flutter/material.dart';
6
-import 'package:cake_wallet/palette.dart';
6
7
class BaseAlertDialog extends StatelessWidget {
8
String get titleText => '';
@@ -49,7 +48,7 @@ class BaseAlertDialog extends StatelessWidget {
48
49
Widget actionButtons(BuildContext context) {
50
return Container(
52
- height: 52,
51
+ height: 60,
52
child: Row(
53
mainAxisSize: MainAxisSize.max,
54
crossAxisAlignment: CrossAxisAlignment.stretch,
lib/src/widgets/option_tile.dart
+1
-1
@@ -52,7 +52,7 @@ class OptionTile extends StatelessWidget {
52
child: Text(
53
description,
54
style: TextStyle(
55
- fontSize: 16,
55
+ fontSize: 14,
56
fontWeight: FontWeight.normal,
57
color: Theme.of(context).extension<OptionTileTheme>()!.descriptionColor,
58
),
lib/utils/permission_handler.dart
+3
-1
@@ -17,7 +17,9 @@ class PermissionHandler {
17
var status = await permission.status;
18
19
if (status.isDenied) {
20
- status = await permission.request();
20
+ try {
21
+ status = await permission.request();
22
+ } catch (_) {}
23
}
24
25
if (status.isPermanentlyDenied || status.isDenied) {
macos/Flutter/GeneratedPluginRegistrant.swift
+4
-6
@@ -12,13 +12,12 @@ import devicelocale
12
import flutter_secure_storage_macos
13
import in_app_review
14
import package_info
15
+import package_info_plus
16
import path_provider_foundation
16
-import platform_device_id
17
-import platform_device_id_macos
17
import share_plus_macos
18
import shared_preferences_foundation
19
import url_launcher_macos
21
-import wakelock_macos
20
+import wakelock_plus
21
22
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
23
ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin"))
@@ -28,11 +27,10 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
27
FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin"))
28
InAppReviewPlugin.register(with: registry.registrar(forPlugin: "InAppReviewPlugin"))
29
FLTPackageInfoPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlugin"))
30
+ FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
31
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
32
- PlatformDeviceIdMacosPlugin.register(with: registry.registrar(forPlugin: "PlatformDeviceIdMacosPlugin"))
33
- PlatformDeviceIdMacosPlugin.register(with: registry.registrar(forPlugin: "PlatformDeviceIdMacosPlugin"))
32
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
33
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
34
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
37
- WakelockMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockMacosPlugin"))
35
+ WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin"))
36
}
pubspec_base.yaml
+10
-5
@@ -60,16 +60,21 @@ dependencies:
60
another_flushbar: ^1.12.29
61
archive: ^3.3.0
62
cryptography: ^2.0.5
63
- file_picker: ^5.2.5
63
+ file_picker:
64
+ git:
65
+ url: https://github.com/cake-tech/flutter_file_picker.git
66
+ ref: master
67
unorm_dart: ^0.2.0
68
# check unorm_dart for usage and for replace
69
permission_handler: ^10.0.0
67
- device_display_brightness: ^0.0.6
70
+ device_display_brightness:
71
+ git:
72
+ url: https://github.com/cake-tech/device_display_brightness.git
73
+ ref: master
74
workmanager: ^0.5.1
69
- platform_device_id: ^1.0.1
70
- wakelock: ^0.6.2
75
+ wakelock_plus: ^1.1.3
76
flutter_mailer: ^2.0.2
72
- device_info_plus: 8.1.0
77
+ device_info_plus: ^9.1.0
78
base32: 2.1.3
79
in_app_review: ^2.0.6
80
cake_backup:
res/values/strings_fr.arb
+2
-2
@@ -722,8 +722,8 @@
722
"awaitDAppProcessing": "Veuillez attendre que l'application décentralisée (dApp) termine le traitement.",
723
"copyWalletConnectLink": "Copiez le lien WalletConnect depuis l'application décentralisée (dApp) et collez-le ici",
724
"enterWalletConnectURI": "Saisissez l'URI de WalletConnect.",
725
- "seed_key": "Clé de graines",
726
- "enter_seed_phrase": "Entrez votre phrase de semence",
725
+ "seed_key": "Clé secrète (seed key)",
726
+ "enter_seed_phrase": "Entrez votre phrase secrète (seed)",
727
"change_rep_successful": "Représentant changé avec succès",
728
"add_contact": "Ajouter le contact",
729
"exchange_provider_unsupported": "${providerName} n'est plus pris en charge !",