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 !",