Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- mediasaop#webrtc#미디어서버#
- 커피#그라인더#통돌이 오픈 #로스팅#드립커피#생두#원두
- 플러터#sms#mms#문자보내기
- 마이봇#pdf챗봇#상담챗봇#faq챗봇#chatgpt#랭체인#llm
- 시트메타#관리시스템#테이블연동#품목관리
- firebase#message#메세지#플러터#안드로이드
- figma#flutter#dhwise#피그마#플러터#피그마 to 플러터 #figma to flutter
- PDF검색#PDF검색챗봇#NEXTJS#스터디#스타트업#랭체이#langchain#prisma#sqlite#
- fcm#메세지전송#안드로이드메세지#플러터메세지전송
- 마이봇#챗봇
- 임대사업자#리걸테크#legaltech#마이봇#챗봇#법률챗봇#임대사업자챗봇#chatgpt#
- 플러터#
- flutterfire configure#파이어베이스#플러터
- 쇼핑몰관리시스템#매입관리#시트메타#매입채널#엑셀업로드
- 광동온더그린#프랜즈#가상CC#스크린골프#
- flutter#채팅창@메모창#url링크#날짜추가
- postgres#vector
- flutter#ios#앱개발#마이봇#
- 마이봇#아이폰#아이폰심사#IT고시#
- flutter#sqlite#chatGPT#
- 마이봇#chatgpt#ai#인공지능
- #창작#SNS#스포츠#반려동물#연애#과제#레시피#활동#건강#운세#글쓰기#비즈니스 #AI비서#챗GPT#CHATGPT
- 마이봇#문서챗봇#PDF#TEXT#유투브#챗봇만들기#랭체인# langchain#벡터데이터#자료검색#챗GPT#GPT4#챗지피티
- 마이봇#핸드폰대체#
- 로우코드#lowcode#erp#관리시스템#시트메이트#시트메타#엑셀업로드#엑셀다운로드#그리드#데이터관리#생산관리시스템#로그관리#히스토리#입력체크
- 로우코드#ERP#관리시스템#상품관리#선택박스#자동화프로그램
- ax5#tree#grid#단계별 펼치기# depth #시트메타
- PDF#챗봇검색#서비스#GPT4#PGT3.5#GPT#랭체인#챗봇#CHATBOT#LLM#문서검색
- 마이봇#API 설정
- 펫버틀러#서버연동#프로필등록#로그인서버연동#이미지#동영상#업로드용 화면#앱개발#플러터#반려생활#로딩바#loading bar#
Archives
- Today
- Total
혼자서 앱 만드는 개발자 함께하는 AI 세상
fmc 기본 알람 대신 awesome_notifications 알람 메세지 변경하기 본문
반응형
- 우선 Get 메시지 처리 컨트럴러 적용
- onMessage 함수와 main에 onBackgroundMessage 함수에 awesome_notifications 적용
import 'dart:developer';
import 'package:awesome_notifications/awesome_notifications.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
/**
* FCM notification 파일 2023-12-17
*
*/
class FCMNotificationController extends GetxController {
static FCMNotificationController get to => Get.find();
// 최신버전의 초기화 방법
final FirebaseMessaging _messaging = FirebaseMessaging.instance;
Rx<RemoteMessage> remoteMessage = const RemoteMessage().obs;
// remoteMessage 가 obx 에서 검출이 잘되지 않아서 dateTime 을 추가함
Rx<DateTime> dateTime = DateTime.now().obs;
RxInt listenIndex = 0.obs;
RxString message = "".obs;
RxString token = "".obs;
Rx<MessageModel> messageModel = MessageModel().obs;
get setgetlisten => listenIndex.value;
set setgetlisten(value) => listenIndex.value = value;
@override
void onInit() {
_initNotification();
// 토큰을 알면 특정 디바이스에게 문자를 전달가능
_getToken();
super.onInit();
}
void _getToken() {
_messaging.getToken().then((value) {
debugPrint('token~: [$value]');
token(value!);
});
}
void _initNotification() {
// 앱이 동작중일때 호출됨
// 안드로이드인 경우 backgroundMessageHandler 실행
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
// _addNotification(message);
debugPrint("NotificationController >> message received");
//debugPrint('Title >> ${message.notification!.title.toString()}');
//debugPrint('Body >> ${message.notification!.body.toString()}');
/*
* AwesomeNotifications 로 알람을 띄우기 위해 변경
*/
AwesomeNotifications().createNotification(
content: NotificationContent(
id: -1, // -1 is replaced by a random number
channelKey: 'basic_channel',
title: 'Huston! The eagle has landed!',
body:
"A small step for a man, but a giant leap to Flutter's community!",
bigPicture: 'https://storage.googleapis.com/cms-storage-bucket/d406c736e7c4c57f5f61.png',
largeIcon: 'https://storage.googleapis.com/cms-storage-bucket/0dbfcc7a59cd1cf16282.png',
//'asset://assets/images/balloons-in-sky.jpg',
notificationLayout: NotificationLayout.BigPicture,
payload: {'notificationId': '1234567890'}),
actionButtons: [
NotificationActionButton(
key: 'REDIRECT',
label: 'Redirect',
),
NotificationActionButton(
key: 'REPLY',
label: 'Reply Message',
requireInputText: true,
actionType: ActionType.SilentAction),
NotificationActionButton(
key: 'DISMISS',
label: 'Dismiss',
actionType: ActionType.DismissAction,
isDangerousOption: true)
]);
// AwesomeNotifications().createNotificationFromJsonData(message.data);
});
// 앱이 background 동작중일때 호출됨, 종료중일때도 호출됨?
FirebaseMessaging.onMessageOpenedApp.listen((message) {
AwesomeNotifications().createNotification(
content: NotificationContent(
id: -1, // -1 is replaced by a random number
channelKey: 'basic_channel',
title: 'Huston! The eagle has landed!',
body:
"A small step for a man, but a giant leap to Flutter's community!",
bigPicture: 'https://storage.googleapis.com/cms-storage-bucket/d406c736e7c4c57f5f61.png',
largeIcon: 'https://storage.googleapis.com/cms-storage-bucket/0dbfcc7a59cd1cf16282.png',
//'asset://assets/images/balloons-in-sky.jpg',
notificationLayout: NotificationLayout.BigPicture,
payload: {'notificationId': '1234567890'}),
actionButtons: [
NotificationActionButton(
key: 'REDIRECT',
label: 'Redirect',
),
NotificationActionButton(
key: 'REPLY',
label: 'Reply Message',
requireInputText: true,
actionType: ActionType.SilentAction),
NotificationActionButton(
key: 'DISMISS',
label: 'Dismiss',
actionType: ActionType.DismissAction,
isDangerousOption: true)
]);
// _addNotification(message);
// AwesomeNotifications().createNotificationFromJsonData(message.data);
debugPrint('------------------------Message clicked!');
});
FirebaseMessaging.onBackgroundMessage((message) {
log("_messaging onBackgroundMessage: $message");
return firebaseMessagingBackgroundHandler(message);
});
}
Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async {
print("Handling a background message");
}
Future onBackgroundHandler(RemoteMessage message) async {
// AwesomeNotifications().createNotificationFromJsonData(message.data);
print("onBackgroundMessage: ${message.data}");
return Future.value();
}
// 메시지를 변수에 저장
void _addNotification(RemoteMessage event) {
dateTime(event.sentTime);
remoteMessage(event);
// debugPrint(event.toMap().toString());
debugPrint(dateTime.toString());
var messagedata = MessageModel();
messagedata = MessageModel.fromJson({
"id": event.messageId,
"message": event.notification!.title.toString(),
"body": event.notification!.body.toString()
});
listenIndex(0);
messageModel(messagedata);
print(messageModel.value.body);
print("=====================");
}
}
class MessageModel {
String id = "";
String message = "";
String body = "";
MessageModel();
MessageModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
message = json['message'];
body = json['body'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['message'] = message;
data['body'] = body;
return data;
}
void fromJson(Map<String, String> map) {}
}
- .notifications_controller 파일 변경
- 알람 action 버튼 이벤트처리 부분 채널별로 이벤트 처리 할 수 있다.
- Get.toNamed(AppRoutes.alarmScreen); 여기서 처럼 필요한 화면으로 분기 처리
static Future<void> onActionReceivedMethodImpl(
ReceivedAction receivedAction) async {
// 버튼 클릭시 들어옴
var message =
'Action ${receivedAction.actionType?.name} received on ${receivedAction.actionLifeCycle?.name}';
print(message);
// Always ensure that all plugins was initialized
WidgetsFlutterBinding.ensureInitialized();
bool isSilentAction =
receivedAction.actionType == ActionType.SilentAction ||
receivedAction.actionType == ActionType.SilentBackgroundAction;
// SilentBackgroundAction runs on background thread and cannot show
// UI/visual elements
if (receivedAction.actionType != ActionType.SilentBackgroundAction) {
Fluttertoast.showToast(
msg: '${isSilentAction ? 'Silent action' : 'Action'}'
' received on ${receivedAction.actionLifeCycle?.name}',
toastLength: Toast.LENGTH_SHORT,
backgroundColor: isSilentAction ? Colors.blueAccent : App.mainColor,
gravity: ToastGravity.BOTTOM);
}
switch (receivedAction.channelKey) {
case 'call_channel':
if (receivedAction.actionLifeCycle !=
NotificationLifeCycle.Terminated) {
await receiveCallNotificationAction(receivedAction);
}
break;
case 'alarm_channel':
await receiveAlarmNotificationAction(receivedAction);
break;
case 'media_player':
await receiveMediaNotificationAction(receivedAction);
break;
case 'chats':
await receiveChatNotificationAction(receivedAction);
break;
default:
if (isSilentAction) {
debugPrint(receivedAction.toString());
debugPrint("start");
await Future.delayed(const Duration(seconds: 4));
final re = await http.get(url);
debugPrint(re.body);
debugPrint("long task done");
break;
}
if (!AwesomeStringUtils.isNullOrEmpty(receivedAction.buttonKeyInput)) {
receiveButtonInputText(receivedAction);
} else {
receiveStandardNotificationAction(receivedAction);
Get.toNamed(AppRoutes.alarmScreen);
}
break;
}
}
- 해당 function 위치
- controller 전체 소스
import 'dart:isolate';
import 'dart:ui';
import 'package:seesaw/core/app_export.dart';
import '/routes/routes.dart';
import '/utils/common_functions.dart'
if (dart.library.html) 'package:awesome_notifications_example/utils/common_web_functions.dart';
import '/utils/media_player_central.dart';
import './notifications_util.dart';
import 'package:awesome_notifications/awesome_notifications.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart' as http;
import 'package:shared_preferences/shared_preferences.dart';
//ignore_for_file: avoid_print
class NotificationsController {
static ReceivedAction? initialCallAction;
// ***************************************************************
// INITIALIZATIONS
// ***************************************************************
static Future<void> initializeLocalNotifications() async {
await initializeIsolateReceivePort();
await AwesomeNotifications().initialize(
'resource://drawable/res_app_icon',
[
NotificationChannel(
channelGroupKey: 'basic_test',
channelKey: 'basic',
channelName: 'Basic notifications',
channelDescription: 'Notification channel for basic tests',
channelShowBadge: true,
importance: NotificationImportance.High,
enableVibration: true,
),
NotificationChannel(
channelGroupKey: 'basic_tests',
channelKey: 'basic_channel',
channelName: 'Basic notifications',
channelDescription: 'Notification channel for basic tests',
defaultColor: const Color(0xFF9D50DD),
ledColor: Colors.white,
importance: NotificationImportance.High),
NotificationChannel(
channelGroupKey: 'basic_tests',
channelKey: 'badge_channel',
channelName: 'Badge indicator notifications',
channelDescription:
'Notification channel to activate badge indicator',
channelShowBadge: true,
defaultColor: const Color(0xFF9D50DD),
ledColor: Colors.yellow),
NotificationChannel(
channelGroupKey: 'category_tests',
channelKey: 'call_channel',
channelName: 'Calls Channel',
channelDescription: 'Channel with call ringtone',
defaultColor: const Color(0xFF9D50DD),
importance: NotificationImportance.Max,
ledColor: Colors.white,
channelShowBadge: true,
locked: true,
defaultRingtoneType: DefaultRingtoneType.Ringtone),
NotificationChannel(
channelGroupKey: 'category_tests',
channelKey: 'alarm_channel',
channelName: 'Alarms Channel',
channelDescription: 'Channel with alarm ringtone',
defaultColor: const Color(0xFF9D50DD),
importance: NotificationImportance.Max,
ledColor: Colors.white,
channelShowBadge: true,
locked: true,
defaultRingtoneType: DefaultRingtoneType.Alarm),
NotificationChannel(
channelGroupKey: 'channel_tests',
channelKey: 'updated_channel',
channelName: 'Channel to update',
channelDescription: 'Notifications with not updated channel',
defaultColor: const Color(0xFF9D50DD),
ledColor: Colors.white),
NotificationChannel(
channelGroupKey: 'chat_tests',
channelKey: 'chats',
channelName: 'Chat groups',
channelDescription:
'This is a simple example channel of a chat group',
channelShowBadge: true,
importance: NotificationImportance.Max,
ledColor: Colors.white,
defaultColor: const Color(0xFF9D50DD),
),
NotificationChannel(
channelGroupKey: 'vibration_tests',
channelKey: 'low_intensity',
channelName: 'Low intensity notifications',
channelDescription:
'Notification channel for notifications with low intensity',
defaultColor: Colors.green,
ledColor: Colors.green,
vibrationPattern: lowVibrationPattern),
NotificationChannel(
channelGroupKey: 'vibration_tests',
channelKey: 'medium_intensity',
channelName: 'Medium intensity notifications',
channelDescription:
'Notification channel for notifications with medium intensity',
defaultColor: Colors.yellow,
ledColor: Colors.yellow,
vibrationPattern: mediumVibrationPattern),
NotificationChannel(
channelGroupKey: 'vibration_tests',
channelKey: 'high_intensity',
channelName: 'High intensity notifications',
channelDescription:
'Notification channel for notifications with high intensity',
defaultColor: Colors.red,
ledColor: Colors.red,
vibrationPattern: highVibrationPattern),
NotificationChannel(
channelGroupKey: 'privacy_tests',
channelKey: "private_channel",
channelName: "Privates notification channel",
channelDescription: "Privates notification from lock screen",
playSound: true,
defaultColor: Colors.red,
ledColor: Colors.red,
vibrationPattern: lowVibrationPattern,
defaultPrivacy: NotificationPrivacy.Private),
NotificationChannel(
channelGroupKey: 'sound_tests',
icon: 'resource://drawable/res_power_ranger_thunder',
channelKey: "custom_sound",
channelName: "Custom sound notifications",
channelDescription: "Notifications with custom sound",
playSound: true,
soundSource: 'resource://raw/res_morph_power_rangers',
defaultColor: Colors.red,
ledColor: Colors.red,
vibrationPattern: lowVibrationPattern),
NotificationChannel(
channelGroupKey: 'sound_tests',
channelKey: "silenced",
channelName: "Silenced notifications",
channelDescription: "The most quiet notifications",
playSound: false,
enableVibration: false,
enableLights: false),
NotificationChannel(
channelGroupKey: 'media_player_tests',
icon: 'resource://drawable/res_media_icon',
channelKey: 'media_player',
channelName: 'Media player controller',
channelDescription: 'Media player controller',
defaultPrivacy: NotificationPrivacy.Public,
enableVibration: false,
enableLights: false,
playSound: false,
locked: true),
NotificationChannel(
channelGroupKey: 'image_tests',
channelKey: 'big_picture',
channelName: 'Big pictures',
channelDescription: 'Notifications with big and beautiful images',
defaultColor: const Color(0xFF9D50DD),
ledColor: const Color(0xFF9D50DD),
vibrationPattern: lowVibrationPattern,
importance: NotificationImportance.High),
NotificationChannel(
channelGroupKey: 'layout_tests',
channelKey: 'big_text',
channelName: 'Big text notifications',
channelDescription: 'Notifications with a expandable body text',
defaultColor: Colors.blueGrey,
ledColor: Colors.blueGrey,
vibrationPattern: lowVibrationPattern),
NotificationChannel(
channelGroupKey: 'layout_tests',
channelKey: 'inbox',
channelName: 'Inbox notifications',
channelDescription: 'Notifications with inbox layout',
defaultColor: const Color(0xFF9D50DD),
ledColor: const Color(0xFF9D50DD),
vibrationPattern: mediumVibrationPattern),
NotificationChannel(
channelGroupKey: 'schedule_tests',
channelKey: 'scheduled',
channelName: 'Scheduled notifications',
channelDescription: 'Notifications with schedule functionality',
defaultColor: const Color(0xFF9D50DD),
ledColor: const Color(0xFF9D50DD),
vibrationPattern: lowVibrationPattern,
importance: NotificationImportance.High,
defaultRingtoneType: DefaultRingtoneType.Alarm,
criticalAlerts: true,
),
NotificationChannel(
channelGroupKey: 'layout_tests',
icon: 'resource://drawable/res_download_icon',
channelKey: 'progress_bar',
channelName: 'Progress bar notifications',
channelDescription: 'Notifications with a progress bar layout',
defaultColor: Colors.deepPurple,
ledColor: Colors.deepPurple,
vibrationPattern: lowVibrationPattern,
onlyAlertOnce: true),
NotificationChannel(
channelGroupKey: 'grouping_tests',
channelKey: 'grouped',
channelName: 'Grouped notifications',
channelDescription: 'Notifications with group functionality',
groupKey: 'grouped',
groupSort: GroupSort.Desc,
groupAlertBehavior: GroupAlertBehavior.Children,
defaultColor: Colors.lightGreen,
ledColor: Colors.lightGreen,
vibrationPattern: lowVibrationPattern,
importance: NotificationImportance.High)
],
channelGroups: [
NotificationChannelGroup(
channelGroupKey: 'basic_tests', channelGroupName: 'Basic tests'),
NotificationChannelGroup(
channelGroupKey: 'category_tests',
channelGroupName: 'Category tests'),
NotificationChannelGroup(
channelGroupKey: 'image_tests', channelGroupName: 'Images tests'),
NotificationChannelGroup(
channelGroupKey: 'schedule_tests',
channelGroupName: 'Schedule tests'),
NotificationChannelGroup(
channelGroupKey: 'chat_tests', channelGroupName: 'Chat tests'),
NotificationChannelGroup(
channelGroupKey: 'channel_tests',
channelGroupName: 'Channel tests'),
NotificationChannelGroup(
channelGroupKey: 'sound_tests', channelGroupName: 'Sound tests'),
NotificationChannelGroup(
channelGroupKey: 'vibration_tests',
channelGroupName: 'Vibration tests'),
NotificationChannelGroup(
channelGroupKey: 'privacy_tests',
channelGroupName: 'Privacy tests'),
NotificationChannelGroup(
channelGroupKey: 'layout_tests',
channelGroupName: 'Layout tests'),
NotificationChannelGroup(
channelGroupKey: 'grouping_tests',
channelGroupName: 'Grouping tests'),
NotificationChannelGroup(
channelGroupKey: 'media_player_tests',
channelGroupName: 'Media Player tests')
],
debug: true);
}
static Future<void> initializeNotificationsEventListeners() async {
// Only after at least the action method is set, the notification events are delivered
AwesomeNotifications().setListeners(
onActionReceivedMethod: NotificationsController.onActionReceivedMethod,
onNotificationCreatedMethod:
NotificationsController.onNotificationCreatedMethod,
onNotificationDisplayedMethod:
NotificationsController.onNotificationDisplayedMethod,
onDismissActionReceivedMethod:
NotificationsController.onDismissActionReceivedMethod);
}
// ***************************************************************
// ON ACTION EVENT REDIRECTION TO MAIN ISOLATE
// ***************************************************************
static ReceivePort? receivePort;
static Future<void> initializeIsolateReceivePort() async {
receivePort = ReceivePort('Notification action port in main isolate');
receivePort!.listen((silentData) => onActionReceivedMethodImpl(silentData));
// This initialization only happens on main isolate
IsolateNameServer.registerPortWithName(
receivePort!.sendPort, 'notification_action_port');
}
// ***************************************************************
// NOTIFICATIONS EVENT LISTENERS
// ***************************************************************
/// Use this method to detect when a new notification or a schedule is created
@pragma("vm:entry-point")
static Future<void> onNotificationCreatedMethod(
ReceivedNotification receivedNotification) async {
var message =
'Notification created on ${receivedNotification.createdLifeCycle?.name}';
print(message);
Fluttertoast.showToast(
msg: message,
toastLength: Toast.LENGTH_SHORT,
backgroundColor: Colors.green,
gravity: ToastGravity.BOTTOM);
}
/// Use this method to detect every time that a new notification is displayed
@pragma("vm:entry-point")
static Future<void> onNotificationDisplayedMethod(
ReceivedNotification receivedNotification) async {
var message1 =
'Notification displayed on ${receivedNotification.displayedLifeCycle?.name}';
var message2 =
'Notification displayed at ${receivedNotification.displayedDate}';
print(message1);
print(message2);
Fluttertoast.showToast(
msg: message1,
toastLength: Toast.LENGTH_SHORT,
backgroundColor: Colors.blue,
gravity: ToastGravity.BOTTOM);
}
/// Use this method to detect if the user dismissed a notification
@pragma("vm:entry-point")
static Future<void> onDismissActionReceivedMethod(
ReceivedAction receivedAction) async {
var message =
'Notification dismissed on ${receivedAction.dismissedLifeCycle?.name}';
Fluttertoast.showToast(
msg: message,
toastLength: Toast.LENGTH_SHORT,
backgroundColor: Colors.orange,
gravity: ToastGravity.BOTTOM);
}
/// Use this method to detect when the user taps on a notification or action button
@pragma("vm:entry-point")
static Future<void> onActionReceivedMethod(
ReceivedAction receivedAction) async {
if (receivePort == null) {
print(
'onActionReceivedMethod was called inside a parallel dart isolate.');
SendPort? sendPort =
IsolateNameServer.lookupPortByName('notification_action_port');
if (sendPort != null) {
print('Redirecting the execution to main isolate process...');
sendPort.send(receivedAction);
return;
}
}
await onActionReceivedMethodImpl(receivedAction);
}
static Future<void> onActionReceivedMethodImpl(
ReceivedAction receivedAction) async {
// 버튼 클릭시 들어옴
var message =
'Action ${receivedAction.actionType?.name} received on ${receivedAction.actionLifeCycle?.name}';
print(message);
// Always ensure that all plugins was initialized
WidgetsFlutterBinding.ensureInitialized();
bool isSilentAction =
receivedAction.actionType == ActionType.SilentAction ||
receivedAction.actionType == ActionType.SilentBackgroundAction;
// SilentBackgroundAction runs on background thread and cannot show
// UI/visual elements
if (receivedAction.actionType != ActionType.SilentBackgroundAction) {
Fluttertoast.showToast(
msg: '${isSilentAction ? 'Silent action' : 'Action'}'
' received on ${receivedAction.actionLifeCycle?.name}',
toastLength: Toast.LENGTH_SHORT,
backgroundColor: isSilentAction ? Colors.blueAccent : App.mainColor,
gravity: ToastGravity.BOTTOM);
}
switch (receivedAction.channelKey) {
case 'call_channel':
if (receivedAction.actionLifeCycle !=
NotificationLifeCycle.Terminated) {
await receiveCallNotificationAction(receivedAction);
}
break;
case 'alarm_channel':
await receiveAlarmNotificationAction(receivedAction);
break;
case 'media_player':
await receiveMediaNotificationAction(receivedAction);
break;
case 'chats':
await receiveChatNotificationAction(receivedAction);
break;
default:
if (isSilentAction) {
debugPrint(receivedAction.toString());
debugPrint("start");
await Future.delayed(const Duration(seconds: 4));
final url = Uri.parse("http://google.com");
final re = await http.get(url);
debugPrint(re.body);
debugPrint("long task done");
break;
}
if (!AwesomeStringUtils.isNullOrEmpty(receivedAction.buttonKeyInput)) {
receiveButtonInputText(receivedAction);
} else {
receiveStandardNotificationAction(receivedAction);
Get.toNamed(AppRoutes.alarmScreen);
}
break;
}
}
// ***************************************************************
// NOTIFICATIONS HANDLING METHODS
// ***************************************************************
static Future<void> receiveButtonInputText(
ReceivedAction receivedAction) async {
debugPrint('Input Button Message: "${receivedAction.buttonKeyInput}"');
Fluttertoast.showToast(
msg: 'Msg: ${receivedAction.buttonKeyInput}',
backgroundColor: App.mainColor,
textColor: Colors.white);
}
static Future<void> receiveStandardNotificationAction(
ReceivedAction receivedAction) async {
loadSingletonPage(App.navigatorKey.currentState,
targetPage: PAGE_NOTIFICATION_DETAILS, receivedAction: receivedAction);
}
static Future<void> receiveMediaNotificationAction(
ReceivedAction receivedAction) async {
switch (receivedAction.buttonKeyPressed) {
case 'MEDIA_CLOSE':
MediaPlayerCentral.stop();
break;
case 'MEDIA_PLAY':
case 'MEDIA_PAUSE':
MediaPlayerCentral.playPause();
break;
case 'MEDIA_PREV':
MediaPlayerCentral.previousMedia();
break;
case 'MEDIA_NEXT':
MediaPlayerCentral.nextMedia();
break;
default:
// loadSingletonPage(App.navigatorKey.currentState,
// targetPage: PAGE_MEDIA_DETAILS, receivedAction: receivedAction);
break;
}
}
static Future<void> receiveChatNotificationAction(
ReceivedAction receivedAction) async {
if (receivedAction.buttonKeyPressed == 'REPLY') {
await NotificationUtils.createMessagingNotification(
channelKey: 'chats',
groupKey: 'jhonny_group',
chatName: 'Jhonny\'s Group',
username: 'you',
largeIcon: 'asset://assets/images/rock-disc.jpg',
message: receivedAction.buttonKeyInput,
);
} else {
loadSingletonPage(App.navigatorKey.currentState,
targetPage: PAGE_NOTIFICATION_DETAILS,
receivedAction: receivedAction);
}
}
static Future<void> receiveAlarmNotificationAction(
ReceivedAction receivedAction) async {
if (receivedAction.buttonKeyPressed == 'SNOOZE') {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('stringValue', "abc");
await NotificationUtils.showAlarmNotification(id: receivedAction.id!);
}
}
static Future<void> receiveCallNotificationAction(
ReceivedAction receivedAction) async {
switch (receivedAction.buttonKeyPressed) {
case 'REJECT':
// Is not necessary to do anything, because the reject button is
// already auto dismissible
break;
case 'ACCEPT':
// loadSingletonPage(App.navigatorKey.currentState,
// targetPage: PAGE_PHONE_CALL, receivedAction: receivedAction);
break;
default:
// loadSingletonPage(App.navigatorKey.currentState,
// targetPage: PAGE_PHONE_CALL, receivedAction: receivedAction);
break;
}
}
static Future<void> interceptInitialCallActionRequest() async {
ReceivedAction? receivedAction =
await AwesomeNotifications().getInitialNotificationAction();
if (receivedAction?.channelKey == 'call_channel') {
initialCallAction = receivedAction;
}
}
}
class App extends StatefulWidget {
const App({super.key});
static String name = 'Awesome Notifications - Example App';
static Color mainColor = const Color(0xFF9D50DD);
// The navigator key is necessary to navigate using static methods
static final GlobalKey<NavigatorState> navigatorKey =
GlobalKey<NavigatorState>();
@override
_AppState createState() => _AppState();
}
class _AppState extends State<App> {
@override
void initState() {
super.initState();
// Only after at least the action method is set, the notification events are delivered
NotificationsController.initializeNotificationsEventListeners();
}
@override
Widget build(BuildContext context) {
String initialRoute;
if (NotificationsController.initialCallAction == null) {
initialRoute = PAGE_HOME;
} else {
// initialRoute = PAGE_PHONE_CALL;
}
//debugPrint('initialRoute: $initialRoute');
return MaterialApp(
title: App.name,
color: App.mainColor,
navigatorKey: App.navigatorKey,
//initialRoute: initialRoute,
routes: materialRoutes,
builder: (context, child) => MediaQuery(
data: MediaQuery.of(context).copyWith(alwaysUse24HourFormat: true),
child: child ?? const SizedBox.shrink(),
),
//theme: ThemesController.currentTheme,
);
}
}
728x90
반응형
'플러터 앱개발' 카테고리의 다른 글
Comments