diff --git a/Sources/dafl_project_flutter/lib/controller/controller.dart b/Sources/dafl_project_flutter/lib/controller/controller.dart index dbac70f..2ec8566 100644 --- a/Sources/dafl_project_flutter/lib/controller/controller.dart +++ b/Sources/dafl_project_flutter/lib/controller/controller.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:dafl_project_flutter/firebase_services/notification_service.dart'; import 'package:dafl_project_flutter/model/message.dart'; import 'package:dafl_project_flutter/firebase_services/message_database_services.dart'; import 'package:flutter/cupertino.dart'; @@ -16,6 +17,7 @@ class Controller { static Loader loader = DatabaseLoader(); static final Searcher _searcher = DatabaseSearcher(); final MessageDatabaseServices _messageAccess = MessageDatabaseServices(); + final NotificationService _notificationService = NotificationService(); late BuildContext navigatorKey; @@ -23,14 +25,15 @@ class Controller { Controller() { currentUser = User('', ''); //TODO : remove this line + NotificationService.initialize(); } - void sendMessage(Message message, String idSender, String idReceiver){ + void sendMessage(Message message, String idSender, String idReceiver) { _messageAccess.sendMessage(message, idSender, idReceiver); } - Stream> getMessage(String chatId){ - return _messageAccess.getMessage(chatId); + Stream> getMessage(String idSender, String idReceiver) { + return _messageAccess.getMessage(idSender, idReceiver); } void save(User userToSave) { diff --git a/Sources/dafl_project_flutter/lib/firebase_services/message_database_services.dart b/Sources/dafl_project_flutter/lib/firebase_services/message_database_services.dart index f82040d..626b554 100644 --- a/Sources/dafl_project_flutter/lib/firebase_services/message_database_services.dart +++ b/Sources/dafl_project_flutter/lib/firebase_services/message_database_services.dart @@ -1,30 +1,28 @@ import 'package:dafl_project_flutter/model/message.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; - -class MessageDatabaseServices{ - +class MessageDatabaseServices { // Make an unique chat ID between 2 client. Look like 'User1-User2' - static String getChatId(String idSender, String idReceiver){ - - // Test to always have the same id - if (idSender.hashCode <= idReceiver.hashCode) - return '$idSender-${idReceiver}'; - else - return '${idReceiver}-$idSender'; - + String _getChatId(String idSender, String idReceiver) { + // Test to always have the same id + if (idSender.hashCode <= idReceiver.hashCode) + return '$idSender-${idReceiver}'; + else + return '${idReceiver}-$idSender'; } - // Send a message from an user to an other void sendMessage(Message message, String idSender, String idReceiver) { - String chatId = getChatId(idSender, idReceiver); + String chatId = _getChatId(idSender, idReceiver); var documentReference = FirebaseFirestore.instance .collection('messages') .doc(chatId) .collection(chatId) - .doc(DateTime.now().millisecondsSinceEpoch.toString()); + .doc(DateTime + .now() + .millisecondsSinceEpoch + .toString()); FirebaseFirestore.instance.runTransaction((transaction) async { transaction.set(documentReference, message.toHashMap()); @@ -34,8 +32,7 @@ class MessageDatabaseServices{ // Get a message from a snapshot Firestore Message _getMessage(DocumentSnapshot> snapshot) { var data = snapshot.data(); - if (data == null) - throw Exception("no data in database"); + if (data == null) throw Exception("no data in database"); return Message.fromMap(data); } @@ -48,11 +45,14 @@ class MessageDatabaseServices{ } // Get the massages from Firestore - Stream> getMessage(String chatId) { + Stream> getMessage(String idSender, String idReceiver) { + String chatId = _getChatId(idSender, idReceiver); + return FirebaseFirestore.instance .collection('messages') .doc(chatId) .collection(chatId) - .snapshots().map(_getAllMessages); + .snapshots() + .map(_getAllMessages); } } \ No newline at end of file diff --git a/Sources/dafl_project_flutter/lib/firebase_services/notification_service.dart b/Sources/dafl_project_flutter/lib/firebase_services/notification_service.dart new file mode 100644 index 0000000..4675f4b --- /dev/null +++ b/Sources/dafl_project_flutter/lib/firebase_services/notification_service.dart @@ -0,0 +1,21 @@ +import 'package:firebase_messaging/firebase_messaging.dart'; + +class NotificationService { + static void initialize() { + FirebaseMessaging.instance.requestPermission(); + + FirebaseMessaging.onMessage.listen((event) { + print('A new onMessage event was published!'); + }); + + FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { + print('A new onMessageOpenedApp event was published!'); + }); + } + + static Future getToken() async { + return FirebaseMessaging.instance.getToken( + vapidKey: + "BOxfduRivQnT8TS1h9WRGEk4gV2IOzJpTCcoKxVTMgVWjxi6TUcQBng2mqM7fUfNy51esFrRGE68coa0XZaKdHc"); + } +} diff --git a/Sources/dafl_project_flutter/lib/main.dart b/Sources/dafl_project_flutter/lib/main.dart index 6f6c3fd..b0cb66b 100644 --- a/Sources/dafl_project_flutter/lib/main.dart +++ b/Sources/dafl_project_flutter/lib/main.dart @@ -1,19 +1,34 @@ import 'dart:async'; import 'dart:ui'; import 'dart:math'; +import 'package:dafl_project_flutter/firebase_options.dart'; import './views/pages/home/p_home.dart'; import './views/pages/main/p_main.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:rive/rive.dart' as riv; -import '../controller/controller.dart'; +import 'controller/controller.dart'; import 'model/spot.dart'; import 'api/api.dart'; import 'dart:developer' as dev; import 'package:flutter_styled_toast/flutter_styled_toast.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; + +Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { + print('Background message ${message.messageId}'); +} + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + + await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform, + ); + + FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); -void main() { runApp(const MyApp()); } diff --git a/Sources/dafl_project_flutter/lib/model/message.dart b/Sources/dafl_project_flutter/lib/model/message.dart index 79726cd..c1db1ea 100644 --- a/Sources/dafl_project_flutter/lib/model/message.dart +++ b/Sources/dafl_project_flutter/lib/model/message.dart @@ -5,12 +5,12 @@ class Message { String idReceiver; String content; - Message({required this.idSender, + Message({ + required this.idSender, required this.idReceiver, - required this.content + required this.content, }); - Map toHashMap() { return { 'idSender': idSender, @@ -19,12 +19,16 @@ class Message { }; } - - factory Message.fromMap(Map data){ + factory Message.fromMap(Map data) { return Message( idSender: data['idSender'], idReceiver: data['idReceiver'], content: data['content'], ); } + + @override + String toString() { + return "idSender : $idSender " + "Content : $content \n"; + } } diff --git a/Sources/dafl_project_flutter/lib/model/user.dart b/Sources/dafl_project_flutter/lib/model/user.dart index e91ffba..89ebcf3 100644 --- a/Sources/dafl_project_flutter/lib/model/user.dart +++ b/Sources/dafl_project_flutter/lib/model/user.dart @@ -11,7 +11,6 @@ class User { int test = 0; //attributes from DAFL - late int idDafl; late String usernameDafl; late String passwDafl; List discovery = []; @@ -22,6 +21,7 @@ class User { late Music _currentMusic; bool sortChoise = true; + //constructors User(this.usernameDafl, this.passwDafl) { actualiseCurrentMusic(); diff --git a/Sources/dafl_project_flutter/lib/views/pages/main/p_conversation.dart b/Sources/dafl_project_flutter/lib/views/pages/main/p_conversation.dart index 009145f..67ccf8e 100644 --- a/Sources/dafl_project_flutter/lib/views/pages/main/p_conversation.dart +++ b/Sources/dafl_project_flutter/lib/views/pages/main/p_conversation.dart @@ -18,12 +18,9 @@ class _ConversationPageState extends State { final messageTextField = TextEditingController(); - void sendMessage(String content, String idSender, String idReceiver) { - Message messageToSend = Message( - idSender: idSender, - idReceiver: idReceiver, - content: content); + Message messageToSend = + Message(idSender: idSender, idReceiver: idReceiver, content: content); MyApp.controller.sendMessage(messageToSend, idSender, idReceiver); @@ -33,7 +30,7 @@ class _ConversationPageState extends State { } Widget messageWidget(Message message) { - if (message.idSender != MyApp.controller.currentUser.usernameDafl){ + if (message.idSender != MyApp.controller.currentUser.usernameDafl) { return Align( alignment: Alignment.centerLeft, child: Container( @@ -172,18 +169,34 @@ class _ConversationPageState extends State { ), ), body: SingleChildScrollView( - child: Container( - color: const Color(0xFF141414), - height: height * 0.92, - width: double.infinity, - child: ListView.builder( - controller: listScrollController, - physics: const BouncingScrollPhysics(), - itemCount: messages.length, - itemBuilder: (context, index) { - return messages[index]; - })), - ), + child: Container( + color: const Color(0xFF141414), + height: height * 0.92, + width: double.infinity, + child: Flexible( + child: StreamBuilder>( + stream: MyApp.controller.getMessage( + MyApp.controller.currentUser.usernameDafl, + receiver.usernameDafl), + builder: (BuildContext context, + AsyncSnapshot> snapshot) { + if (snapshot.hasData) { + List listMessage = + snapshot.data ?? List.from([]); + return ListView.builder( + padding: EdgeInsets.all(10.0), + itemBuilder: (context, index) => + messageWidget(listMessage[index]), + itemCount: listMessage.length, + reverse: true, + controller: listScrollController, + ); + } else { + return Center(child: Container()); + } + }, + ), + ))), bottomSheet: BottomAppBar( color: const Color(0xFF141414), child: Row( @@ -225,7 +238,10 @@ class _ConversationPageState extends State { onTap: isNull ? null : () { - sendMessage(messageTextField.text, MyApp.controller.currentUser.usernameDafl, receiver.usernameDafl); + sendMessage( + messageTextField.text, + MyApp.controller.currentUser.usernameDafl, + receiver.usernameDafl); if (listScrollController.hasClients) { final position = listScrollController.position.maxScrollExtent;