diff --git a/.gitignore b/.gitignore
index 0580d006c..b5c6f1e12 100644
--- a/.gitignore
+++ b/.gitignore
@@ -97,4 +97,7 @@ android/app/.cxx/**
ios/Flutter/.last_build_id
/lib/generated/**
#**#
-/**/#**#
\ No newline at end of file
+/**/#**#
+
+**/google-services.json
+**/GoogleService-Info.plist
\ No newline at end of file
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 0c6a46dc4..ee68ec0db 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -24,6 +24,10 @@ if (flutterVersionName == null) {
apply plugin: 'com.android.application'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
+if (file("./google-services.json").exists()) {
+ apply plugin: 'com.google.gms.google-services'
+}
+
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
@@ -83,4 +87,6 @@ dependencies {
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
+ implementation 'com.google.firebase:firebase-core:19.0.0'
+ implementation 'com.google.firebase:firebase-messaging:19.0.0'
}
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index abf27576f..c53d1ea7b 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -7,6 +7,7 @@
-
diff --git a/android/app/src/main/java/com/cakewallet/cake_wallet/Application.java b/android/app/src/main/java/com/cakewallet/cake_wallet/Application.java
new file mode 100644
index 000000000..c3b51c14c
--- /dev/null
+++ b/android/app/src/main/java/com/cakewallet/cake_wallet/Application.java
@@ -0,0 +1,21 @@
+package com.cakewallet.cake_wallet;
+
+import io.flutter.app.FlutterApplication;
+import io.flutter.plugin.common.PluginRegistry;
+import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
+import io.flutter.plugins.GeneratedPluginRegistrant;
+import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService;
+import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;
+
+public class Application extends FlutterApplication implements PluginRegistrantCallback {
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ FlutterFirebaseMessagingService.setPluginRegistrant(this);
+ }
+
+ @Override
+ public void registerWith(PluginRegistry registry) {
+ FirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
+ }
+}
\ No newline at end of file
diff --git a/android/build.gradle b/android/build.gradle
index 0baed694d..0d11c6b94 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -6,6 +6,7 @@ buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:3.5.4'
+ classpath 'com.google.gms:google-services:4.3.8'
}
}
diff --git a/ios/Podfile b/ios/Podfile
index e26de900c..3cfff7b1d 100644
--- a/ios/Podfile
+++ b/ios/Podfile
@@ -36,6 +36,7 @@ target 'Runner' do
# Cake Wallet (Legacy)
pod 'CryptoSwift'
+ pod 'Firebase/Messaging', '6.33.0'
end
post_install do |installer|
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index 879041cac..50f9b20d2 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -62,18 +62,84 @@ PODS:
- file_picker (0.0.1):
- DKImagePickerController/PhotoGallery
- Flutter
+ - Firebase/CoreOnly (6.33.0):
+ - FirebaseCore (= 6.10.3)
+ - Firebase/Messaging (6.33.0):
+ - Firebase/CoreOnly
+ - FirebaseMessaging (~> 4.7.0)
+ - firebase_core (0.5.3):
+ - Firebase/CoreOnly (~> 6.33.0)
+ - Flutter
+ - firebase_messaging (7.0.3):
+ - Firebase/CoreOnly (~> 6.33.0)
+ - Firebase/Messaging (~> 6.33.0)
+ - firebase_core
+ - Flutter
+ - FirebaseCore (6.10.3):
+ - FirebaseCoreDiagnostics (~> 1.6)
+ - GoogleUtilities/Environment (~> 6.7)
+ - GoogleUtilities/Logger (~> 6.7)
+ - FirebaseCoreDiagnostics (1.7.0):
+ - GoogleDataTransport (~> 7.4)
+ - GoogleUtilities/Environment (~> 6.7)
+ - GoogleUtilities/Logger (~> 6.7)
+ - nanopb (~> 1.30906.0)
+ - FirebaseInstallations (1.7.0):
+ - FirebaseCore (~> 6.10)
+ - GoogleUtilities/Environment (~> 6.7)
+ - GoogleUtilities/UserDefaults (~> 6.7)
+ - PromisesObjC (~> 1.2)
+ - FirebaseInstanceID (4.8.0):
+ - FirebaseCore (~> 6.10)
+ - FirebaseInstallations (~> 1.6)
+ - GoogleUtilities/Environment (~> 6.7)
+ - GoogleUtilities/UserDefaults (~> 6.7)
+ - FirebaseMessaging (4.7.1):
+ - FirebaseCore (~> 6.10)
+ - FirebaseInstanceID (~> 4.7)
+ - GoogleUtilities/AppDelegateSwizzler (~> 6.7)
+ - GoogleUtilities/Environment (~> 6.7)
+ - GoogleUtilities/Reachability (~> 6.7)
+ - GoogleUtilities/UserDefaults (~> 6.7)
+ - Protobuf (>= 3.9.2, ~> 3.9)
- Flutter (1.0.0)
- flutter_secure_storage (3.3.1):
- Flutter
+ - GoogleDataTransport (7.5.1):
+ - nanopb (~> 1.30906.0)
+ - GoogleUtilities/AppDelegateSwizzler (6.7.2):
+ - GoogleUtilities/Environment
+ - GoogleUtilities/Logger
+ - GoogleUtilities/Network
+ - GoogleUtilities/Environment (6.7.2):
+ - PromisesObjC (~> 1.2)
+ - GoogleUtilities/Logger (6.7.2):
+ - GoogleUtilities/Environment
+ - GoogleUtilities/Network (6.7.2):
+ - GoogleUtilities/Logger
+ - "GoogleUtilities/NSData+zlib"
+ - GoogleUtilities/Reachability
+ - "GoogleUtilities/NSData+zlib (6.7.2)"
+ - GoogleUtilities/Reachability (6.7.2):
+ - GoogleUtilities/Logger
+ - GoogleUtilities/UserDefaults (6.7.2):
+ - GoogleUtilities/Logger
- local_auth (0.0.1):
- Flutter
- MTBBarcodeScanner (5.0.11)
+ - nanopb (1.30906.0):
+ - nanopb/decode (= 1.30906.0)
+ - nanopb/encode (= 1.30906.0)
+ - nanopb/decode (1.30906.0)
+ - nanopb/encode (1.30906.0)
- package_info (0.0.1):
- Flutter
- path_provider (0.0.1):
- Flutter
- "permission_handler (5.1.0+2)":
- Flutter
+ - PromisesObjC (1.2.12)
+ - Protobuf (3.17.0)
- Reachability (3.2)
- SDWebImage (5.9.1):
- SDWebImage/Core (= 5.9.1)
@@ -97,6 +163,9 @@ DEPENDENCIES:
- devicelocale (from `.symlinks/plugins/devicelocale/ios`)
- esys_flutter_share (from `.symlinks/plugins/esys_flutter_share/ios`)
- file_picker (from `.symlinks/plugins/file_picker/ios`)
+ - Firebase/Messaging (= 6.33.0)
+ - firebase_core (from `.symlinks/plugins/firebase_core/ios`)
+ - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
- Flutter (from `Flutter`)
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
- local_auth (from `.symlinks/plugins/local_auth/ios`)
@@ -113,7 +182,18 @@ SPEC REPOS:
- CryptoSwift
- DKImagePickerController
- DKPhotoGallery
+ - Firebase
+ - FirebaseCore
+ - FirebaseCoreDiagnostics
+ - FirebaseInstallations
+ - FirebaseInstanceID
+ - FirebaseMessaging
+ - GoogleDataTransport
+ - GoogleUtilities
- MTBBarcodeScanner
+ - nanopb
+ - PromisesObjC
+ - Protobuf
- Reachability
- SDWebImage
- SwiftProtobuf
@@ -132,6 +212,10 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/esys_flutter_share/ios"
file_picker:
:path: ".symlinks/plugins/file_picker/ios"
+ firebase_core:
+ :path: ".symlinks/plugins/firebase_core/ios"
+ firebase_messaging:
+ :path: ".symlinks/plugins/firebase_messaging/ios"
Flutter:
:path: Flutter
flutter_secure_storage:
@@ -163,13 +247,26 @@ SPEC CHECKSUMS:
DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179
esys_flutter_share: 403498dab005b36ce1f8d7aff377e81f0621b0b4
file_picker: 3e6c3790de664ccf9b882732d9db5eaf6b8d4eb1
+ Firebase: 8db6f2d1b2c5e2984efba4949a145875a8f65fe5
+ firebase_core: 5d6a02f3d85acd5f8321c2d6d62877626a670659
+ firebase_messaging: 0aea2cd5885b65e19ede58ee3507f485c992cc75
+ FirebaseCore: d889d9e12535b7f36ac8bfbf1713a0836a3012cd
+ FirebaseCoreDiagnostics: 770ac5958e1372ce67959ae4b4f31d8e127c3ac1
+ FirebaseInstallations: 466c7b4d1f58fe16707693091da253726a731ed2
+ FirebaseInstanceID: bd3ffc24367f901a43c063b36c640b345a4a5dd1
+ FirebaseMessaging: 5eca4ef173de76253352511aafef774caa1cba2a
Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c
flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec
+ GoogleDataTransport: f56af7caa4ed338dc8e138a5d7c5973e66440833
+ GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3
local_auth: 25938960984c3a7f6e3253e3f8d962fdd16852bd
MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb
+ nanopb: 59317e09cf1f1a0af72f12af412d54edf52603fc
package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62
path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c
permission_handler: ccb20a9fad0ee9b1314a52b70b76b473c5f8dab0
+ PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97
+ Protobuf: 7327d4444215b5f18e560a97f879ff5503c4581c
Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96
SDWebImage: a990c053fff71e388a10f3357edb0be17929c9c5
share: 0b2c3e82132f5888bccca3351c504d0003b3b410
@@ -179,6 +276,6 @@ SPEC CHECKSUMS:
url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef
webview_flutter: 9f491a9b5a66f2573946a389b2677987b0ff8c0b
-PODFILE CHECKSUM: 5b5f101b119a1b6eb857c967d462832a9062dec4
+PODFILE CHECKSUM: f316539722a6f9dbb0d0f1065a27fa7ea38c6f88
COCOAPODS: 1.9.3
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 27704e6a2..3bc5b5fb6 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -7,6 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
+ 0C37B8B926678E9100C6E5A9 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0C37B8B826678E9100C6E5A9 /* GoogleService-Info.plist */; };
0C44A71A2518EF8000B570ED /* decrypt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C44A7192518EF8000B570ED /* decrypt.swift */; };
0C9D68C9264854B60011B691 /* secRandom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C9D68C8264854B60011B691 /* secRandom.swift */; };
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
@@ -19,6 +20,7 @@
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
+ 0C37B8B826678E9100C6E5A9 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; };
0C400E0F25B21ABB0025E469 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; };
0C44A7192518EF8000B570ED /* decrypt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = decrypt.swift; sourceTree = ""; };
0C9986A3251A932F00D566FD /* CryptoSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CryptoSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -96,6 +98,7 @@
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
+ 0C37B8B826678E9100C6E5A9 /* GoogleService-Info.plist */,
0C44A7182518EF4A00B570ED /* CakeWallet */,
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
@@ -191,6 +194,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 0C37B8B926678E9100C6E5A9 /* GoogleService-Info.plist in Resources */,
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
@@ -365,6 +369,7 @@
CURRENT_PROJECT_VERSION = 41;
DEVELOPMENT_TEAM = 32J6BB6VUS;
ENABLE_BITCODE = NO;
+ EXCLUDED_SOURCE_FILE_NAMES = "\"$(SRCROOT)/Runner/GoogleService-Info.plist\"";
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
@@ -508,6 +513,7 @@
CURRENT_PROJECT_VERSION = 41;
DEVELOPMENT_TEAM = 32J6BB6VUS;
ENABLE_BITCODE = NO;
+ EXCLUDED_SOURCE_FILE_NAMES = "\"$(SRCROOT)/Runner/GoogleService-Info.plist\"";
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
@@ -543,6 +549,7 @@
CURRENT_PROJECT_VERSION = 41;
DEVELOPMENT_TEAM = 32J6BB6VUS;
ENABLE_BITCODE = NO;
+ EXCLUDED_SOURCE_FILE_NAMES = "\"$(SRCROOT)/Runner/GoogleService-Info.plist\"";
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift
index e7c300079..2a3505ef9 100644
--- a/ios/Runner/AppDelegate.swift
+++ b/ios/Runner/AppDelegate.swift
@@ -7,6 +7,10 @@ import Flutter
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
+ if #available(iOS 10.0, *) {
+ UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
+ }
+
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let legacyMigrationChannel = FlutterMethodChannel(
name: "com.cakewallet.cakewallet/legacy_wallet_migration",
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 970c892cd..267805951 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -37,6 +37,11 @@
Enable Face ID for fast and secure access to wallets and private keys
NSPhotoLibraryUsageDescription
We need access to documents folder for get acces to open/save backup file
+ UIBackgroundModes
+
+ fetch
+ remote-notification
+
UILaunchStoryboardName
LaunchScreen
UIMainStoryboardFile
diff --git a/ios/Runner/Runner.entitlements b/ios/Runner/Runner.entitlements
index 0c67376eb..903def2af 100644
--- a/ios/Runner/Runner.entitlements
+++ b/ios/Runner/Runner.entitlements
@@ -1,5 +1,8 @@
-
+
+ aps-environment
+ development
+
diff --git a/lib/di.dart b/lib/di.dart
index cae3a068f..a84a00c88 100644
--- a/lib/di.dart
+++ b/lib/di.dart
@@ -113,6 +113,7 @@ import 'package:cake_wallet/store/templates/exchange_template_store.dart';
import 'package:cake_wallet/entities/template.dart';
import 'package:cake_wallet/exchange/exchange_template.dart';
import 'package:cake_wallet/.secrets.g.dart' as secrets;
+import 'package:cake_wallet/entities/push_notifications_service.dart';
final getIt = GetIt.instance;
@@ -232,6 +233,9 @@ Future setup(
settingsStore: getIt.get(),
fiatConvertationStore: getIt.get()));
+
+ getIt.registerFactory(() => PushNotificationsService());
+
getIt.registerFactory(() => DashboardViewModel(
balanceViewModel: getIt.get(),
appStore: getIt.get(),
@@ -241,7 +245,8 @@ Future setup(
settingsStore: settingsStore,
ordersSource: _ordersSource,
ordersStore: getIt.get(),
- wyreViewModel: getIt.get()));
+ wyreViewModel: getIt.get(),
+ pushNotificationsService: getIt.get()));
getIt.registerFactory(() => AuthService(
secureStorage: getIt.get(),
diff --git a/lib/entities/push_notifications_service.dart b/lib/entities/push_notifications_service.dart
new file mode 100644
index 000000000..5fe69153c
--- /dev/null
+++ b/lib/entities/push_notifications_service.dart
@@ -0,0 +1,45 @@
+import 'dart:io';
+import 'package:cake_wallet/main.dart';
+import 'package:cake_wallet/utils/show_bar.dart';
+import 'package:firebase_messaging/firebase_messaging.dart';
+
+class PushNotificationsService {
+ PushNotificationsService._();
+
+ factory PushNotificationsService() => _instance;
+
+ static final PushNotificationsService _instance = PushNotificationsService._();
+ static Future _onBackgroundMessage(Map message) async {}
+ final _firebaseMessaging = FirebaseMessaging();
+ bool _initialized = false;
+
+ Future init() async {
+ if (_initialized) {
+ return;
+ }
+
+ _firebaseMessaging.requestNotificationPermissions();
+ _firebaseMessaging.configure(
+ onMessage: (message) async {
+ Map alert = {};
+ String msg = '';
+ String title = '';
+
+ if (Platform.isIOS) {
+ alert = message['aps']['alert'] as Map ?? {};
+ msg = alert['body'] as String ?? '';
+ title = alert['title'] as String ?? '';
+ }
+
+ if (Platform.isAndroid) {
+ msg = message['notification']['body'] as String ?? '';
+ title = message['notification']['title'] as String ?? '';
+ }
+
+ await showBar(navigatorKey.currentContext, msg, titleText: title, duration: null);
+ },
+ onBackgroundMessage: _onBackgroundMessage);
+
+ _initialized = true;
+ }
+}
\ No newline at end of file
diff --git a/lib/src/screens/dashboard/widgets/balance_page.dart b/lib/src/screens/dashboard/widgets/balance_page.dart
index 1cd17d4c0..2498e2d5c 100644
--- a/lib/src/screens/dashboard/widgets/balance_page.dart
+++ b/lib/src/screens/dashboard/widgets/balance_page.dart
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
+import 'package:flutter/scheduler.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:auto_size_text/auto_size_text.dart';
diff --git a/lib/utils/show_bar.dart b/lib/utils/show_bar.dart
index 8d2355e4f..64231b438 100644
--- a/lib/utils/show_bar.dart
+++ b/lib/utils/show_bar.dart
@@ -2,8 +2,11 @@ import 'package:flushbar/flushbar.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
-Future showBar(BuildContext context, String text,
- {bool isDark = false, Duration duration = const Duration(seconds: 1), bool isDismissible = true}) {
+Future showBar(BuildContext context, String messageText,
+ {bool isDark = false,
+ Duration duration = const Duration(seconds: 1),
+ bool isDismissible = true,
+ String titleText}) {
final bar = Flushbar(
boxShadows: [
BoxShadow(
@@ -14,9 +17,14 @@ Future showBar(BuildContext context, String text,
backgroundColor: isDark ? Colors.black : Colors.white,
borderRadius: 35,
margin: EdgeInsets.all(50),
- messageText: Text(text,
+ titleText: titleText != null
+ ? Text(titleText,
+ textAlign: TextAlign.center,
+ style: TextStyle(color: isDark ? Colors.white : Colors.black, fontWeight: FontWeight.bold, fontSize: 24.0))
+ : null,
+ messageText: Text(messageText,
textAlign: TextAlign.center,
- style: TextStyle(color: isDark ? Colors.white : Colors.black)),
+ style: TextStyle(color: isDark ? Colors.white : Colors.black, fontSize: 16)),
duration: duration,
isDismissible: isDismissible,
flushbarPosition: FlushbarPosition.TOP,
diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart
index 97ed234e6..90fbe4940 100644
--- a/lib/view_model/dashboard/dashboard_view_model.dart
+++ b/lib/view_model/dashboard/dashboard_view_model.dart
@@ -1,6 +1,7 @@
import 'package:cake_wallet/core/transaction_history.dart';
import 'package:cake_wallet/entities/balance.dart';
import 'package:cake_wallet/entities/order.dart';
+import 'package:cake_wallet/entities/push_notifications_service.dart';
import 'package:cake_wallet/monero/account.dart';
import 'package:cake_wallet/monero/monero_balance.dart';
import 'package:cake_wallet/monero/monero_transaction_info.dart';
@@ -44,7 +45,9 @@ abstract class DashboardViewModelBase with Store {
this.settingsStore,
this.ordersSource,
this.ordersStore,
- this.wyreViewModel}) {
+ this.wyreViewModel,
+ PushNotificationsService pushNotificationsService}) {
+ _pushNotificationsService = pushNotificationsService;
filterItems = {
S.current.transactions: [
FilterItem(
@@ -133,6 +136,8 @@ abstract class DashboardViewModelBase with Store {
return true;
});
+
+ Future.delayed(Duration(seconds: 2), () => _pushNotificationsService.init());
}
@observable
@@ -227,18 +232,20 @@ abstract class DashboardViewModelBase with Store {
bool get isBuyEnabled => settingsStore.isBitcoinBuyEnabled;
+ PushNotificationsService _pushNotificationsService;
+
ReactionDisposer _onMoneroAccountChangeReaction;
ReactionDisposer _onMoneroBalanceChangeReaction;
+ @observable
+ bool isOutdatedElectrumWallet;
+
Future reconnect() async {
final node = appStore.settingsStore.getCurrentNode(wallet.type);
await wallet.connectToNode(node: node);
}
- @observable
- bool isOutdatedElectrumWallet;
-
@action
void _onWalletChange(
WalletBase,
diff --git a/pubspec.lock b/pubspec.lock
index 3ff596074..28474d35c 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -70,7 +70,7 @@ packages:
path: "."
ref: cake
resolved-ref: "02fef082f20af13de00b4e64efb93a2c1e5e1cf2"
- url: "git@github.com:cake-tech/bech32.git"
+ url: "https://github.com/cake-tech/bech32.git"
source: git
version: "0.2.0"
bip32:
@@ -92,8 +92,8 @@ packages:
description:
path: "."
ref: cake
- resolved-ref: b3ab2926c665f0e68b74a4a5f31059f7fcd817b7
- url: "git@github.com:cake-tech/bitcoin_flutter.git"
+ resolved-ref: cbabfd87b6ce3cae6051a3e86ddb56e7a934e188
+ url: "https://github.com/cake-tech/bitcoin_flutter.git"
source: git
version: "2.0.2"
boolean_selector:
@@ -362,6 +362,34 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.0-nullsafety.2"
+ firebase_core:
+ dependency: transitive
+ description:
+ name: firebase_core
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.5.3"
+ firebase_core_platform_interface:
+ dependency: transitive
+ description:
+ name: firebase_core_platform_interface
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "2.1.0"
+ firebase_core_web:
+ dependency: transitive
+ description:
+ name: firebase_core_web
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.2.1+1"
+ firebase_messaging:
+ dependency: "direct main"
+ description:
+ name: firebase_messaging
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "7.0.3"
fixnum:
dependency: transitive
description:
diff --git a/pubspec.yaml b/pubspec.yaml
index 1fad1c4d9..352bb24bd 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -78,6 +78,7 @@ dependencies:
file_picker: ^3.0.0-nullsafety.2
unorm_dart: ^0.2.0
permission_handler: ^5.0.1+1
+ firebase_messaging: ^7.0.3
dev_dependencies:
flutter_test: