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: