From d0b59b0b0a5b7aab2840cacaaa17ea29203aa8d6 Mon Sep 17 00:00:00 2001 From: "J. A. Messias" Date: Mon, 9 Sep 2024 14:43:46 -0300 Subject: [PATCH 1/8] WIP --- android/app/src/main/AndroidManifest.xml | 13 ++++++++++--- .../notifications/firebase_messaging_service.dart | 13 +++++++++++++ lib/firebase_options.dart | 9 +++++---- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index c59078fa..eaa9867b 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + + + + - - - @@ -60,6 +61,12 @@ + + + + + + diff --git a/lib/backend/notifications/firebase_messaging_service.dart b/lib/backend/notifications/firebase_messaging_service.dart index 727c9762..ca4e021f 100644 --- a/lib/backend/notifications/firebase_messaging_service.dart +++ b/lib/backend/notifications/firebase_messaging_service.dart @@ -1,5 +1,6 @@ import 'dart:developer'; +import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:hub/app_state.dart'; import 'package:hub/backend/api_requests/api_calls.dart'; @@ -40,6 +41,18 @@ class FirebaseMessagingService { FirebaseMessaging.onMessage.listen((RemoteMessage message) { handleMessage(message); }); + + FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { + log('A Message was opened: $message'); + }); + + FirebaseMessaging.instance + .getInitialMessage() + .then((RemoteMessage? message) { + if (message != null) { + log('A Message was opened: $message'); + } + }); } Future updateDeviceToken() async { diff --git a/lib/firebase_options.dart b/lib/firebase_options.dart index 4e9e28fd..ac64bcb6 100644 --- a/lib/firebase_options.dart +++ b/lib/firebase_options.dart @@ -73,9 +73,10 @@ class DefaultFirebaseOptions { projectId: 'accessmoblie-da839', databaseURL: 'https://accessmoblie-da839.firebaseio.com', storageBucket: 'accessmoblie-da839.appspot.com', - androidClientId: '187064172787-7et0qu5p2qtmisvqgndn3kfi1b7u9ifl.apps.googleusercontent.com', - iosClientId: '187064172787-c5gs7fvp78om9r7dofkjn2qmpumkuvig.apps.googleusercontent.com', + androidClientId: + '187064172787-7et0qu5p2qtmisvqgndn3kfi1b7u9ifl.apps.googleusercontent.com', + iosClientId: + '187064172787-c5gs7fvp78om9r7dofkjn2qmpumkuvig.apps.googleusercontent.com', iosBundleId: 'br.com.freaccess.hub', ); - -} \ No newline at end of file +} From 2ac27d7db793744c775ab682a17b088e58ad937b Mon Sep 17 00:00:00 2001 From: "J. A. Messias" Date: Tue, 10 Sep 2024 10:31:59 -0300 Subject: [PATCH 2/8] WIP --- android/app/src/main/AndroidManifest.xml | 16 ++++- lib/main.dart | 71 ++++++++++++++++++++++- lib/pages/home_page/home_page_widget.dart | 6 +- 3 files changed, 86 insertions(+), 7 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index eaa9867b..2aae49b8 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -47,8 +47,12 @@ android:name="io.flutter.embedding.android.SplashScreenDrawable" android:resource="@drawable/launch_background" /> - - + + + + + + @@ -94,4 +98,10 @@ + + + + + + \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index eb886a2a..5ce3975f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,17 +3,21 @@ import 'dart:developer'; import 'package:app_tracking_transparency/app_tracking_transparency.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_web_plugins/url_strategy.dart'; +import 'package:hub/backend/api_requests/api_calls.dart'; +import 'package:hub/backend/api_requests/api_manager.dart'; import 'package:hub/backend/notifications/firebase_messaging_service.dart'; import 'package:hub/backend/notifications/notification_service.dart'; import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/flutter_flow/internationalization.dart'; import 'package:hub/flutter_flow/nav/nav.dart'; +import 'package:hub/shared/utils/log_util.dart'; import 'package:provider/provider.dart'; import 'package:responsive_framework/responsive_framework.dart'; @@ -28,8 +32,7 @@ Future initializeApp() async { await appState.initializePersistedState(); await Firebase.initializeApp(); - await FirebaseMessagingService().initNotifications(); - await NotificationService.initialize(); + // await NotificationService.initialize(); setUrlStrategy(const PathUrlStrategy()); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); @@ -48,6 +51,18 @@ Future initializeApp() async { usePathUrlStrategy(); } +Future handleMessage(RemoteMessage message) async { + NotificationService.show( + title: message.notification!.title!, + body: message.notification!.body!, + payload: Map.from(message.data)); +} + +Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { + await Firebase.initializeApp(); + log('Background message: ${message.toMap()}'); +} + void main() async { await initializeApp(); runApp(const App()); @@ -67,6 +82,32 @@ class _AppState extends State { late AppStateNotifier _appStateNotifier; late GoRouter _router; bool displaySplashImage = true; + final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance; + + Future updateDeviceToken() async { + try { + final String? deviceToken = await _firebaseMessaging.getToken(); + + if (deviceToken != null) { + AppState().token = deviceToken; + + final ApiCallResponse? response = await PhpGroup.updToken.call( + token: AppState().token, + devid: AppState().devUUID, + useruuid: AppState().userUUID); + + if (PhpGroup.updToken.error((response?.jsonBody ?? '')) == false) { + log('Token Atualizado com Sucesso!'); + } else { + log('Falha ao Atualizar Token: ${response?.jsonBody}'); + } + } else { + log('Falha ao Pegar Token do Firebase'); + } + } catch (e, s) { + LogUtil.requestAPIFailed("updToken.php", "", "Atualizar Token", e, s); + } + } @override void initState() { @@ -79,7 +120,33 @@ class _AppState extends State { _router = createRouter(_appStateNotifier); Future.delayed(const Duration(milliseconds: 1000), () => setState(() => _appStateNotifier.stopShowingSplashImage())); + + _firebaseMessaging.requestPermission(); + // _firebaseMessaging.pluginConstants; + + FirebaseMessaging.onMessage.listen((RemoteMessage message) { + log('Received message: ${message.toMap()}'); + }); + FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { + log('Message opened: ${message.notification?.body}'); + }); + FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); + FirebaseMessaging.instance.getInitialMessage().then((message) { + if (message != null) { + log('Initial message: ${message.notification?.body}'); + } + }); + + _firebaseMessaging.onTokenRefresh.listen((token) => updateDeviceToken); + + getToken(); } + + Future getToken() async { + String? token = await _firebaseMessaging.getToken(); + log('Token: $token'); + } + // // Future showCustomTrackingDialog(BuildContext context) async { // await showDialog( diff --git a/lib/pages/home_page/home_page_widget.dart b/lib/pages/home_page/home_page_widget.dart index f9ec154b..92e29166 100644 --- a/lib/pages/home_page/home_page_widget.dart +++ b/lib/pages/home_page/home_page_widget.dart @@ -1,10 +1,13 @@ import 'dart:async'; +import 'dart:developer'; +import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:hub/backend/api_requests/api_calls.dart'; import 'package:hub/backend/notifications/firebase_messaging_service.dart'; +import 'package:hub/backend/notifications/notification_service.dart'; import 'package:hub/backend/schema/enums/enums.dart'; import 'package:hub/components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart'; import 'package:hub/components/organism_components/local_profile_component/local_profile_component_widget.dart'; @@ -14,6 +17,7 @@ import 'package:hub/flutter_flow/flutter_flow_theme.dart'; import 'package:hub/flutter_flow/flutter_flow_util.dart'; import 'package:hub/pages/home_page/home_page_model.dart'; import 'package:hub/shared/utils/dialog_util.dart'; +import 'package:hub/shared/utils/log_util.dart'; import 'package:hub/shared/widgets/drawer_widget/drawer_widget.dart'; class HomePageWidget extends StatefulWidget { @@ -118,8 +122,6 @@ class _HomePageWidgetState extends State { _model.updateOnChange = true; () async { - await FirebaseMessagingService().updateDeviceToken(); - if (AppState().cliUUID.isEmpty) { await processLocals(); } From e557601a9019f87f4d11b3f5c4ad01313374c52c Mon Sep 17 00:00:00 2001 From: "J. A. Messias" Date: Tue, 10 Sep 2024 15:31:32 -0300 Subject: [PATCH 3/8] WIP --- android/app/src/main/AndroidManifest.xml | 11 +- .../firebase_messaging_service.dart | 34 ++-- lib/main.dart | 43 +---- lib/pages/home_page/home_page_widget.dart | 149 +++++++++--------- 4 files changed, 98 insertions(+), 139 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 2aae49b8..7b010795 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -48,11 +48,8 @@ android:resource="@drawable/launch_background" /> - - - - - @@ -68,14 +65,14 @@ - --> + + diff --git a/lib/backend/notifications/notification_service.dart b/lib/backend/notifications/notification_service.dart index 5b10eb25..c5501118 100644 --- a/lib/backend/notifications/notification_service.dart +++ b/lib/backend/notifications/notification_service.dart @@ -36,104 +36,44 @@ Future onMessageReceived( FlutterFlowIconButton( icon: const Icon(Icons.done), onPressed: () async { - showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text( - FFLocalizations.of(context).getVariableText( - ptText: 'Aprovar Visita', - enText: 'Approve Visit', - ), - ), - content: Text( - FFLocalizations.of(context).getVariableText( - ptText: - 'Você tem certeza que deseja aprovar essa visita?', - enText: - 'Are you sure you want to approve this visit?', - ), - ), - backgroundColor: FlutterFlowTheme.of(context) - .primaryBackground, - actions: [ - FFButtonWidget( - text: FFLocalizations.of(context) - .getVariableText( - enText: 'No', - ptText: 'Não', - ), - onPressed: () { - context.pop(); - }, - options: FFButtonOptions( - width: 100, - height: 40, - color: FlutterFlowTheme.of(context) - .primaryBackground, - textStyle: TextStyle( - color: FlutterFlowTheme.of(context) - .primaryText, - ), - borderSide: BorderSide( - color: FlutterFlowTheme.of(context) - .primaryBackground, - width: 1, - ), - borderRadius: - BorderRadius.circular(10)), - ), - FFButtonWidget( - text: FFLocalizations.of(context) - .getVariableText( - enText: 'Yes', - ptText: 'Sim', - ), - onPressed: () async { - log("payload: $payload"); - await answersRequest - .call( - context, - payload['referencia'].toString(), - 'L', - 'Mensagem', - payload['idVisitante'].toString(), - ) - .then((value) { - if (value) { - context.pop(); - context.pop(); - } else { - context.pop(); - context.pop(); - DialogUtil.errorDefault(context); - } - }).catchError((e) { - context.pop(); - context.pop(); - DialogUtil.errorDefault(context); - }); - }, - options: FFButtonOptions( - width: 100, - height: 40, - color: FlutterFlowTheme.of(context) - .primaryBackground, - textStyle: TextStyle( - color: FlutterFlowTheme.of(context) - .primaryText, - ), - borderSide: BorderSide( - color: FlutterFlowTheme.of(context) - .primaryBackground, - width: 1, - ), - borderRadius: BorderRadius.circular(10), - ), - ), - ], - ); + showAlertDialog( + context, + FFLocalizations.of(context).getVariableText( + ptText: 'Aprovar Visita', + enText: 'Approve Visit', + ), + FFLocalizations.of(context).getVariableText( + ptText: + 'Você tem certeza que deseja aprovar essa visita?', + enText: + 'Are you sure you want to approve this visit?', + ), + () async { + log("payload: $payload"); + await answersRequest + .call( + context, + payload['referencia'].toString(), + 'L', + 'Mensagem', + payload['idVisitante'].toString(), + ) + .then((value) { + if (value) { + context.pop(); + context.pop(); + } else { + context.pop(); + context.pop(); + DialogUtil.errorDefault(context); + } + }).catchError((e) { + context.pop(); + context.pop(); + DialogUtil.errorDefault(context); }); + }, + ); }, ), FlutterFlowIconButton( diff --git a/lib/main.dart b/lib/main.dart index 3e21b787..faafd27a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -93,7 +93,9 @@ class _AppState extends State { FirebaseMessaging.onMessage.listen(foregroundHandleMessage); FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { - onMessageReceived(message.data, '', message.data['click_action']); + log(message.toMap().toString()); + onMessageReceived(message.data, message.notification!.body, + message.data['click_action']); }); FirebaseMessaging.onBackgroundMessage(_backgroundHandleMessage); From ef11c081826d5a2c1018b1f0eb688a8767b06048 Mon Sep 17 00:00:00 2001 From: "J. A. Messias" Date: Thu, 12 Sep 2024 13:43:47 -0300 Subject: [PATCH 6/8] WIP --- lib/backend/notifications/notification_service.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/backend/notifications/notification_service.dart b/lib/backend/notifications/notification_service.dart index c5501118..d4efae7c 100644 --- a/lib/backend/notifications/notification_service.dart +++ b/lib/backend/notifications/notification_service.dart @@ -50,15 +50,13 @@ Future onMessageReceived( ), () async { log("payload: $payload"); - await answersRequest - .call( + await answersRequest( context, payload['referencia'].toString(), 'L', 'Mensagem', payload['idVisitante'].toString(), - ) - .then((value) { + ).then((value) { if (value) { context.pop(); context.pop(); From d07b78047070309cd1b6926d18ce08cc8d7e43d6 Mon Sep 17 00:00:00 2001 From: "J. A. Messias" Date: Thu, 12 Sep 2024 13:53:16 -0300 Subject: [PATCH 7/8] WIP --- lib/main.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/main.dart b/lib/main.dart index faafd27a..500e1741 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -56,7 +56,6 @@ Future foregroundHandleMessage(RemoteMessage message) async { Future _backgroundHandleMessage(RemoteMessage message) async { log('Handling a background message: ${message.messageId}'); - // Add your message handling logic here } void main() async { From 3d823fd20c6b132085de4ad55fc91308656b6c56 Mon Sep 17 00:00:00 2001 From: "J. A. Messias" Date: Thu, 12 Sep 2024 17:08:34 -0300 Subject: [PATCH 8/8] fix logs --- lib/backend/notifications/notification_service.dart | 3 --- lib/main.dart | 5 +---- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/lib/backend/notifications/notification_service.dart b/lib/backend/notifications/notification_service.dart index d4efae7c..0f8c7a6c 100644 --- a/lib/backend/notifications/notification_service.dart +++ b/lib/backend/notifications/notification_service.dart @@ -18,8 +18,6 @@ Future onMessageReceived( Map payload, String? extra, String? handleClick) async { final localId = jsonDecode(payload['local']!)['CLI_ID']; - log('payload: $payload'); - log('extra: $extra'); switch (handleClick) { case 'visit_request': showDialog( @@ -49,7 +47,6 @@ Future onMessageReceived( 'Are you sure you want to approve this visit?', ), () async { - log("payload: $payload"); await answersRequest( context, payload['referencia'].toString(), diff --git a/lib/main.dart b/lib/main.dart index 500e1741..5e2cc196 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -54,9 +54,7 @@ Future foregroundHandleMessage(RemoteMessage message) async { payload: Map.from(message.data)); } -Future _backgroundHandleMessage(RemoteMessage message) async { - log('Handling a background message: ${message.messageId}'); -} +Future _backgroundHandleMessage(RemoteMessage message) async {} void main() async { await initializeApp(); @@ -92,7 +90,6 @@ class _AppState extends State { FirebaseMessaging.onMessage.listen(foregroundHandleMessage); FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { - log(message.toMap().toString()); onMessageReceived(message.data, message.notification!.body, message.data['click_action']); });