diff --git a/packages/flutterfire_messenger/.gitignore b/packages/flutterfire_messenger/.gitignore new file mode 100644 index 0000000..96486fd --- /dev/null +++ b/packages/flutterfire_messenger/.gitignore @@ -0,0 +1,30 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.packages +build/ diff --git a/packages/flutterfire_messenger/.metadata b/packages/flutterfire_messenger/.metadata new file mode 100644 index 0000000..7344f88 --- /dev/null +++ b/packages/flutterfire_messenger/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "db7ef5bf9f59442b0e200a90587e8fa5e0c6336a" + channel: "stable" + +project_type: package diff --git a/packages/flutterfire_messenger/CHANGELOG.md b/packages/flutterfire_messenger/CHANGELOG.md new file mode 100644 index 0000000..61e46ea --- /dev/null +++ b/packages/flutterfire_messenger/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.1.0 + +* initial release. diff --git a/packages/flutterfire_messenger/README.md b/packages/flutterfire_messenger/README.md new file mode 100644 index 0000000..02fe8ec --- /dev/null +++ b/packages/flutterfire_messenger/README.md @@ -0,0 +1,39 @@ + + +TODO: Put a short description of the package here that helps potential users +know whether this package might be useful for them. + +## Features + +TODO: List what your package can do. Maybe include images, gifs, or videos. + +## Getting started + +TODO: List prerequisites and provide or point to information on how to +start using the package. + +## Usage + +TODO: Include short and useful examples for package users. Add longer examples +to `/example` folder. + +```dart +const like = 'sample'; +``` + +## Additional information + +TODO: Tell users more about the package: where to find more information, how to +contribute to the package, how to file issues, what response they can expect +from the package authors, and more. diff --git a/packages/flutterfire_messenger/analysis_options.yaml b/packages/flutterfire_messenger/analysis_options.yaml new file mode 100644 index 0000000..4446f0e --- /dev/null +++ b/packages/flutterfire_messenger/analysis_options.yaml @@ -0,0 +1 @@ +include: package:altive_lints/altive_lints.yaml diff --git a/packages/flutterfire_messenger/lib/messenger.dart b/packages/flutterfire_messenger/lib/messenger.dart new file mode 100644 index 0000000..469904f --- /dev/null +++ b/packages/flutterfire_messenger/lib/messenger.dart @@ -0,0 +1,5 @@ +/// flutterfire_messenger with FlutterFire Messaging, Local Notifications, +/// In-App Messaging, and Firebase Installation ID. +library flutterfire_messenger; + +export 'src/messenger.dart'; diff --git a/packages/flutterfire_messenger/lib/src/messenger.dart b/packages/flutterfire_messenger/lib/src/messenger.dart new file mode 100644 index 0000000..ee96d95 --- /dev/null +++ b/packages/flutterfire_messenger/lib/src/messenger.dart @@ -0,0 +1,34 @@ +import 'package:firebase_messaging/firebase_messaging.dart'; + +/// A class that wraps package for sending notifications and messages. +/// Its role is to "send necessary notifications and messages to the user". +/// +/// It exposes methods for sending and receiving notifications, displaying +/// in-app messages, and managing settings related to these functions. +class Messenger { + Messenger({ + FirebaseMessaging? messaging, + }) : _messaging = messaging ?? FirebaseMessaging.instance; + + final FirebaseMessaging _messaging; + + /// Requests notification permissions. + /// + /// On iOS, sets the foreground notification presentation options using + /// [alert], [badge], and [sound], determining how notification appear + /// when the app is in the foreground. + Future requestPermission({ + bool alert = false, + bool badge = false, + bool sound = false, + }) async { + // Foreground notification presentation options for iOS. + await _messaging.setForegroundNotificationPresentationOptions( + alert: alert, + badge: badge, + sound: sound, + ); + final settings = await _messaging.requestPermission(); + return settings; + } +} diff --git a/packages/flutterfire_messenger/pubspec.yaml b/packages/flutterfire_messenger/pubspec.yaml new file mode 100644 index 0000000..069cb7c --- /dev/null +++ b/packages/flutterfire_messenger/pubspec.yaml @@ -0,0 +1,17 @@ +name: flutterfire_messenger +description: flutterfire_messenger with FlutterFire Messaging, Local Notifications and In-App Messaging, and Firebase Instance ID. +version: 0.1.0 + +environment: + sdk: ^3.0.0 + +dependencies: + firebase_messaging: ^14.7.6 + flutter: + sdk: flutter + +dev_dependencies: + altive_lints: ^1.8.1 + flutter_test: + sdk: flutter + mocktail: ^1.0.1 diff --git a/packages/flutterfire_messenger/test/src/messenger_test.dart b/packages/flutterfire_messenger/test/src/messenger_test.dart new file mode 100644 index 0000000..61fe9e2 --- /dev/null +++ b/packages/flutterfire_messenger/test/src/messenger_test.dart @@ -0,0 +1,45 @@ +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutterfire_messenger/messenger.dart'; +import 'package:mocktail/mocktail.dart'; + +class MockFirebaseMessaging extends Mock implements FirebaseMessaging {} + +class MockNotificationSettings extends Mock implements NotificationSettings {} + +void main() { + group('Messenger', () { + test( + 'requestPermission should call ' + 'setForegroundNotificationPresentationOptions and ' + 'requestPermission on messaging', () async { + final messaging = MockFirebaseMessaging(); + final messenger = Messenger(messaging: messaging); + final settings = MockNotificationSettings(); + + when( + () => messaging.setForegroundNotificationPresentationOptions( + alert: any(named: 'alert'), + badge: any(named: 'badge'), + sound: any(named: 'sound'), + ), + ).thenAnswer((_) async {}); + when(messaging.requestPermission).thenAnswer((_) async => settings); + + final got = await messenger.requestPermission(); + + expect(got, settings); + + verify( + () => messaging.setForegroundNotificationPresentationOptions( + alert: any(named: 'alert'), + badge: any(named: 'badge'), + sound: any(named: 'sound'), + ), + ).called(1); + verify(messaging.requestPermission).called(1); + + verifyNoMoreInteractions(messaging); + }); + }); +}