add messaging

This commit is contained in:
Sai Naw Wun
2020-09-06 02:36:57 +06:30
parent 9a76a36883
commit 9423df2cd1
13 changed files with 224 additions and 58 deletions

View File

@@ -1,6 +1,9 @@
import 'dart:io';
import 'package:fcs/fcs/common/localization/app_translations_delegate.dart'; import 'package:fcs/fcs/common/localization/app_translations_delegate.dart';
import 'package:fcs/fcs/common/localization/transalation.dart'; import 'package:fcs/fcs/common/localization/transalation.dart';
import 'package:fcs/fcs/common/pages/model/language_model.dart'; import 'package:fcs/fcs/common/pages/model/language_model.dart';
import 'package:fcs/fcs/common/services/services.dart';
import 'package:fcs/model/buyer_model.dart'; import 'package:fcs/model/buyer_model.dart';
import 'package:fcs/model/delivery_model.dart'; import 'package:fcs/model/delivery_model.dart';
import 'package:fcs/model/discount_model.dart'; import 'package:fcs/model/discount_model.dart';
@@ -17,6 +20,7 @@ import 'package:fcs/model_fcs/package_model.dart';
import 'package:fcs/pages/email_page.dart'; import 'package:fcs/pages/email_page.dart';
import 'package:fcs/pages/login_page.dart'; import 'package:fcs/pages/login_page.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:fcs/fcs/common/pages/model/main_model.dart' as fcs; import 'package:fcs/fcs/common/pages/model/main_model.dart' as fcs;
@@ -82,6 +86,8 @@ class _AppState extends State<App> {
final DiscountModel discountModel = new DiscountModel(); final DiscountModel discountModel = new DiscountModel();
AppTranslationsDelegate _newLocaleDelegate; AppTranslationsDelegate _newLocaleDelegate;
static FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
@override @override
void initState() { void initState() {
@@ -121,6 +127,64 @@ class _AppState extends State<App> {
..addModel(customerModel) ..addModel(customerModel)
..addModel(discountModel); ..addModel(discountModel);
this.mainModel.init(); this.mainModel.init();
_initLocalNotifications();
Services.instance.messagingService.init((message) {
print("Message from FCM:$message");
_showNotification(message);
});
}
_initLocalNotifications() {
var initializationSettingsAndroid =
new AndroidInitializationSettings('@mipmap/ic_launcher');
var initializationSettingsIOS = new IOSInitializationSettings();
var initializationSettings = new InitializationSettings(
initializationSettingsAndroid, initializationSettingsIOS);
_flutterLocalNotificationsPlugin.initialize(initializationSettings);
}
static Future _showNotification(Map<String, dynamic> message) async {
var pushTitle;
var pushText;
var action;
if (Platform.isAndroid) {
var nodeData = message['notification'];
pushTitle = nodeData['title'];
pushText = nodeData['body'];
action = nodeData['action'];
} else {
pushTitle = message['title'];
pushText = message['body'];
action = message['action'];
}
print("AppPushs params pushTitle : $pushTitle");
print("AppPushs params pushText : $pushText");
print("AppPushs params pushAction : $action");
// @formatter:off
var platformChannelSpecificsAndroid = new AndroidNotificationDetails(
'your channel id', 'your channel name', 'your channel description',
playSound: true,
enableVibration: true,
importance: Importance.Max,
priority: Priority.High);
// @formatter:on
var platformChannelSpecificsIos =
new IOSNotificationDetails(presentSound: true);
var platformChannelSpecifics = new NotificationDetails(
platformChannelSpecificsAndroid, platformChannelSpecificsIos);
new Future.delayed(Duration.zero, () {
_flutterLocalNotificationsPlugin.show(
0,
pushTitle,
pushText,
platformChannelSpecifics,
payload: 'No_Sound',
);
});
} }
void onLocaleChange(Locale locale) { void onLocaleChange(Locale locale) {
@@ -146,55 +210,50 @@ class _AppState extends State<App> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MultiProvider( return MultiProvider(
providers: [ providers: [
ChangeNotifierProvider.value(value: mainModel), ChangeNotifierProvider.value(value: mainModel),
ChangeNotifierProvider.value(value: userModel), ChangeNotifierProvider.value(value: userModel),
ChangeNotifierProvider.value(value: productModel), ChangeNotifierProvider.value(value: productModel),
ChangeNotifierProvider.value(value: employeeModel), ChangeNotifierProvider.value(value: employeeModel),
ChangeNotifierProvider.value(value: poSubmissionModel), ChangeNotifierProvider.value(value: poSubmissionModel),
ChangeNotifierProvider.value(value: doModel), ChangeNotifierProvider.value(value: doModel),
ChangeNotifierProvider.value(value: storageModel), ChangeNotifierProvider.value(value: storageModel),
ChangeNotifierProvider.value(value: pdModel), ChangeNotifierProvider.value(value: pdModel),
ChangeNotifierProvider.value(value: lanuguageModel), ChangeNotifierProvider.value(value: lanuguageModel),
ChangeNotifierProvider.value(value: regModel), ChangeNotifierProvider.value(value: regModel),
ChangeNotifierProvider.value(value: buyerModel), ChangeNotifierProvider.value(value: buyerModel),
ChangeNotifierProvider.value(value: notificationModel), ChangeNotifierProvider.value(value: notificationModel),
ChangeNotifierProvider.value(value: chartModel), ChangeNotifierProvider.value(value: chartModel),
ChangeNotifierProvider.value(value: deliveryModel), ChangeNotifierProvider.value(value: deliveryModel),
ChangeNotifierProvider.value(value: logModel), ChangeNotifierProvider.value(value: logModel),
ChangeNotifierProvider.value(value: phoneDeviceModel), ChangeNotifierProvider.value(value: phoneDeviceModel),
ChangeNotifierProvider.value(value: reportModel), ChangeNotifierProvider.value(value: reportModel),
ChangeNotifierProvider.value(value: announcementModel), ChangeNotifierProvider.value(value: announcementModel),
ChangeNotifierProvider.value(value: reportUserModel), ChangeNotifierProvider.value(value: reportUserModel),
ChangeNotifierProvider.value(value: pickUpModel), ChangeNotifierProvider.value(value: pickUpModel),
ChangeNotifierProvider.value(value: shipmentRateModel), ChangeNotifierProvider.value(value: shipmentRateModel),
ChangeNotifierProvider.value(value: shipmentModel), ChangeNotifierProvider.value(value: shipmentModel),
ChangeNotifierProvider.value(value: packageModel), ChangeNotifierProvider.value(value: packageModel),
ChangeNotifierProvider.value(value: boxModel), ChangeNotifierProvider.value(value: boxModel),
ChangeNotifierProvider.value(value: messageModel), ChangeNotifierProvider.value(value: messageModel),
ChangeNotifierProvider.value(value: invoiceModel), ChangeNotifierProvider.value(value: invoiceModel),
ChangeNotifierProvider.value(value: customerModel), ChangeNotifierProvider.value(value: customerModel),
ChangeNotifierProvider.value(value: discountModel), ChangeNotifierProvider.value(value: discountModel),
ChangeNotifierProvider.value(value: testModel), ChangeNotifierProvider.value(value: testModel),
ChangeNotifierProvider.value(value: mainModel2), ChangeNotifierProvider.value(value: mainModel2),
], ],
child: Consumer<LanguageModel>( child: MaterialApp(
builder: (BuildContext context, LanguageModel value, Widget child) { debugShowCheckedModeBanner: false,
return MaterialApp( title: 'FCS',
debugShowCheckedModeBanner: false, routes: route(context),
title: 'Ok Energy', theme: ThemeData(accentColor: Colors.black),
routes: route(context), localizationsDelegates: [
theme: ThemeData(accentColor: Colors.black), _newLocaleDelegate,
localizationsDelegates: [ //provides localised strings
_newLocaleDelegate, GlobalMaterialLocalizations.delegate,
//provides localised strings //provides RTL support
GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate,
//provides RTL support ],
GlobalWidgetsLocalizations.delegate, supportedLocales: Translation().supportedLocales()));
],
supportedLocales: Translation().supportedLocales());
},
),
);
} }
} }

View File

@@ -0,0 +1,66 @@
import 'package:fcs/fcs/common/services/messaging_service.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:logging/logging.dart';
final msgLog = Logger('backgroundMessageHandler');
Future<dynamic> backgroundMessageHandler(Map<String, dynamic> message) async {
if (message.containsKey('data')) {
// Handle data message
final dynamic data = message['data'];
msgLog.info("background onMessage: $message");
}
if (message.containsKey('notification')) {
// Handle notification message
final dynamic notification = message['notification'];
}
}
class MessagingFCM {
final log = Logger('MessagingFCM');
FirebaseMessaging _firebaseMessaging;
MessagingFCM(OnNotify onMessage, {OnNotify onLaunch, OnNotify onResume}) {
_firebaseMessaging = FirebaseMessaging();
_firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message) async {
log.info("onMessage: $message");
if (onMessage != null) _onNotify(message, onMessage);
},
onBackgroundMessage: backgroundMessageHandler,
onLaunch: (Map<String, dynamic> message) async {
log.info("onLaunch: $message");
if (onLaunch != null) _onNotify(message, onLaunch);
},
onResume: (Map<String, dynamic> message) async {
log.info("onResume: $message");
if (onResume != null) _onNotify(message, onResume);
},
);
_firebaseMessaging.requestNotificationPermissions(
const IosNotificationSettings(
sound: true, badge: true, alert: true, provisional: true));
_firebaseMessaging.onIosSettingsRegistered
.listen((IosNotificationSettings settings) {
log.info("Settings registered: $settings");
});
_firebaseMessaging.getToken().then((String token) {
log.info("Messaging Token:$token");
});
}
Future<void> subscribeToTopic(String topic) {
return _firebaseMessaging.subscribeToTopic(topic);
}
_onNotify(Map<String, dynamic> message, OnNotify onNotify) {
var data = message['data'] ?? message;
onNotify(Map<String, dynamic>.from(message));
}
Future<void> unsubscribeToTopic(String topic) {
return _firebaseMessaging.unsubscribeFromTopic(topic);
}
}

View File

@@ -5,6 +5,7 @@ import 'package:fcs/fcs/common/domain/entities/auth_status.dart';
import 'package:fcs/fcs/common/domain/entities/user.dart'; import 'package:fcs/fcs/common/domain/entities/user.dart';
import 'package:fcs/fcs/common/pages/model/main_model.dart'; import 'package:fcs/fcs/common/pages/model/main_model.dart';
import 'package:fcs/fcs/common/pages/util.dart'; import 'package:fcs/fcs/common/pages/util.dart';
import 'package:fcs/fcs/common/pages/widgets/local_text.dart';
import 'package:fcs/widget/bottom_up_page_route.dart'; import 'package:fcs/widget/bottom_up_page_route.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:pin_input_text_field/pin_input_text_field.dart'; import 'package:pin_input_text_field/pin_input_text_field.dart';
@@ -12,7 +13,6 @@ import 'package:provider/provider.dart';
import 'signup_page.dart'; import 'signup_page.dart';
import '../../helpers/theme.dart'; import '../../helpers/theme.dart';
import '../../../../widget/local_text.dart';
import '../../../../widget/progress.dart'; import '../../../../widget/progress.dart';
const resend_count_sec = 5; const resend_count_sec = 5;

View File

@@ -2,6 +2,7 @@ import 'package:country_code_picker/country_code_picker.dart';
import 'package:fcs/fcs/common/domain/entities/auth_result.dart'; import 'package:fcs/fcs/common/domain/entities/auth_result.dart';
import 'package:fcs/fcs/common/domain/entities/auth_status.dart'; import 'package:fcs/fcs/common/domain/entities/auth_status.dart';
import 'package:fcs/fcs/common/pages/model/main_model.dart'; import 'package:fcs/fcs/common/pages/model/main_model.dart';
import 'package:fcs/fcs/common/pages/widgets/local_text.dart';
import 'package:fcs/widget/bottom_up_page_route.dart'; import 'package:fcs/widget/bottom_up_page_route.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@@ -9,7 +10,6 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../helpers/theme.dart'; import '../../helpers/theme.dart';
import '../../../../widget/local_text.dart';
import '../../../../widget/progress.dart'; import '../../../../widget/progress.dart';
import 'code_page.dart'; import 'code_page.dart';
import '../util.dart'; import '../util.dart';

View File

@@ -1,6 +1,6 @@
import 'package:fcs/fcs/common/pages/model/language_model.dart';
import 'package:fcs/fcs/common/pages/model/main_model.dart'; import 'package:fcs/fcs/common/pages/model/main_model.dart';
import 'package:fcs/fcs/common/pages/widgets/bottom_widgets.dart'; import 'package:fcs/fcs/common/pages/widgets/bottom_widgets.dart';
import 'package:fcs/model/language_model.dart';
import 'package:fcs/widget/banner.dart'; import 'package:fcs/widget/banner.dart';
import 'package:fcs/widget/bottom_up_page_route.dart'; import 'package:fcs/widget/bottom_up_page_route.dart';
import 'package:fcs/widget/localization/transalation.dart'; import 'package:fcs/widget/localization/transalation.dart';
@@ -194,7 +194,7 @@ class _WelcomePageState extends State<WelcomePage> {
} }
_langChange(index) { _langChange(index) {
var languageModel = Provider.of<LanguageModel>(context); var languageModel = Provider.of<LanguageModel>(context, listen: false);
languageModel.saveLanguage(Translation().supportedLanguages[index]); languageModel.saveLanguage(Translation().supportedLanguages[index]);
setState(() { setState(() {
isSelected.asMap().forEach((i, e) { isSelected.asMap().forEach((i, e) {

View File

@@ -23,8 +23,8 @@ class ActionButton extends StatelessWidget {
onTap: btnCallback != null ? btnCallback : () => {}, onTap: btnCallback != null ? btnCallback : () => {},
child: Container( child: Container(
width: 120, width: 120,
height: 150, height: 130,
padding: EdgeInsets.only(top:15.0), padding: EdgeInsets.only(top: 10.0, left: 5, right: 5),
decoration: new BoxDecoration( decoration: new BoxDecoration(
color: Colors.transparent, color: Colors.transparent,
borderRadius: new BorderRadius.only( borderRadius: new BorderRadius.only(

View File

@@ -0,0 +1,25 @@
import 'package:fcs/fcs/common/data/providers/messaging_fcm.dart';
import 'messaging_service.dart';
class MessagingServiceImp implements MessagingService {
MessagingServiceImp();
static MessagingFCM messagingFCM;
@override
void init(onMessage, {OnNotify onLaunch, OnNotify onResume}) {
messagingFCM =
MessagingFCM(onMessage, onLaunch: onLaunch, onResume: onResume);
}
@override
Future<void> subscribe(String topic) {
return messagingFCM.unsubscribeToTopic(topic);
}
@override
Future<void> unsubscribe(String topic) {
return messagingFCM.unsubscribeToTopic(topic);
}
}

View File

@@ -0,0 +1,7 @@
typedef OnNotify(Map<String, dynamic> message);
abstract class MessagingService {
void init(OnNotify onMessage, {OnNotify onLaunch, OnNotify onResume});
Future<void> subscribe(String topic);
Future<void> unsubscribe(String topic);
}

View File

@@ -1,5 +1,7 @@
import 'package:fcs/fcs/common/data/providers/auth_fb.dart'; import 'package:fcs/fcs/common/data/providers/auth_fb.dart';
import 'package:fcs/fcs/common/services/auth_imp.dart'; import 'package:fcs/fcs/common/services/auth_imp.dart';
import 'package:fcs/fcs/common/services/messaging_imp.dart';
import 'package:fcs/fcs/common/services/messaging_service.dart';
import 'auth_service.dart'; import 'auth_service.dart';
@@ -7,13 +9,16 @@ class Services {
static final Services instance = Services._(); static final Services instance = Services._();
AuthService _authService; AuthService _authService;
MessagingService _messagingService;
Services._() { Services._() {
_authService = AuthServiceImp( _authService = AuthServiceImp(
authFb: AuthFb.instance, authFb: AuthFb.instance,
connectivity: null, connectivity: null,
userFBDataProvider: null, userFBDataProvider: null,
userLocalDataProvider: null); userLocalDataProvider: null);
_messagingService = MessagingServiceImp();
} }
AuthService get authService => _authService; AuthService get authService => _authService;
MessagingService get messagingService => _messagingService;
} }

View File

@@ -5,6 +5,7 @@ import 'package:logging/logging.dart';
import 'app.dart'; import 'app.dart';
void main() { void main() {
WidgetsFlutterBinding.ensureInitialized();
Config( Config(
flavor: Flavor.DEV, flavor: Flavor.DEV,
color: Colors.blue, color: Colors.blue,

View File

@@ -1,14 +1,15 @@
import 'package:fcs/config.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:fcs/config.dart';
import 'app.dart'; import 'app.dart';
void main() { void main() {
WidgetsFlutterBinding.ensureInitialized();
Config( Config(
flavor: Flavor.DEV, flavor: Flavor.DEV,
color: Colors.blue, color: Colors.blue,
apiURL: "http://192.168.1.155:7777", apiURL: "http://192.168.100.11:7777",
level: Level.ALL); level: Level.ALL);
runApp(App()); runApp(App());
} }

View File

@@ -6,6 +6,7 @@ import 'package:shared_preferences/shared_preferences.dart';
import 'app.dart'; import 'app.dart';
void main() { void main() {
WidgetsFlutterBinding.ensureInitialized();
Config( Config(
flavor: Flavor.PRODUCTION, flavor: Flavor.PRODUCTION,
color: Colors.blue, color: Colors.blue,

View File

@@ -73,6 +73,7 @@ dependencies:
timeline_list: ^0.0.5 timeline_list: ^0.0.5
barcode_scan: ^3.0.1 barcode_scan: ^3.0.1
flutter_pdfview: ^1.0.3 flutter_pdfview: ^1.0.3
flutter_local_notifications: ^1.4.4+4