// import 'dart:ffi'; // import 'dart:io'; // import 'package:flutter/cupertino.dart'; // import 'package:flutter/foundation.dart'; // import 'package:flutter/material.dart'; // import 'package:flutter_timezone/flutter_timezone.dart'; // import 'package:flutter_local_notifications/flutter_local_notifications.dart'; // import 'package:timezone/timezone.dart' as tz; // import 'package:timezone/data/latest_all.dart' as tz; // import 'package:together_mobile/notification_api.dart'; // int id = 0; // /// A notification action which triggers a url launch event // const String urlLaunchActionId = 'id_1'; // /// A notification action which triggers a App navigation event // const String navigationActionId = 'id_3'; // Future main() async { // // needed if you intend to initialize in `main` function // WidgetsFlutterBinding.ensureInitialized(); // final NotificationAppLaunchDetails? notificationAppLaunchDetails = !kIsWeb && // Platform.isLinux // ? null // : await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails(); // // initialize android setting // const AndroidInitializationSettings initializationSettingsAndroid = // AndroidInitializationSettings('app_icon'); // // IOS notification category // final List darwinNotificationCategories = [ // DarwinNotificationCategory( // darwinNotificationCategoryText, // actions: [ // DarwinNotificationAction.text( // 'text_1', // 'Action 1', // buttonTitle: 'Send', // placeholder: 'Placeholder', // ), // ], // ), // DarwinNotificationCategory( // darwinNotificationCategoryPlain, // actions: [ // DarwinNotificationAction.plain('id_1', 'Action 1'), // DarwinNotificationAction.plain( // 'id_2', // 'Action 2 (destructive)', // options: { // DarwinNotificationActionOption.destructive, // }, // ), // DarwinNotificationAction.plain( // navigationActionId, // 'Action 3 (foreground)', // options: { // DarwinNotificationActionOption.foreground, // }, // ), // DarwinNotificationAction.plain( // 'id_4', // 'Action 4 (auth required)', // options: { // DarwinNotificationActionOption.authenticationRequired, // }, // ), // ], // options: { // DarwinNotificationCategoryOption.hiddenPreviewShowTitle, // }, // ), // ]; // // Initialize IOS setting // final DarwinInitializationSettings initializationSettingsDarwin = // DarwinInitializationSettings( // requestAlertPermission: false, // requestBadgePermission: false, // requestSoundPermission: false, // onDidReceiveLocalNotification: (id, title, body, payload) async { // didReceiveLocalNotificationStream.add( // ReceivedNotification( // id: id, // title: title, // body: body, // payload: payload, // ), // ); // }, // notificationCategories: darwinNotificationCategories, // ); // final LinuxInitializationSettings initializationSettingsLinux = // LinuxInitializationSettings( // defaultActionName: 'Open notification', // defaultIcon: AssetsLinuxIcon('icons/app_icon.png'), // ); // // Initialize notification setting, // final InitializationSettings initializationSettings = InitializationSettings( // android: initializationSettingsAndroid, // iOS: initializationSettingsDarwin, // macOS: initializationSettingsDarwin, // linux: initializationSettingsLinux, // ); // await flutterLocalNotificationsPlugin.initialize( // initializationSettings, // onDidReceiveNotificationResponse: // (NotificationResponse notificationResponse) { // switch (notificationResponse.notificationResponseType) { // case NotificationResponseType.selectedNotification: // selectNotificationStream.add(notificationResponse.payload); // break; // case NotificationResponseType.selectedNotificationAction: // if (notificationResponse.actionId == navigationActionId) { // selectNotificationStream.add(notificationResponse.payload); // } // break; // } // }, // onDidReceiveBackgroundNotificationResponse: notificationTapBackground, // ); // String initialRoute = HomePage.routeName; // runApp( // MaterialApp( // initialRoute: initialRoute, // routes: { // HomePage.routeName: (_) => HomePage(notificationAppLaunchDetails), // SecondPage.routeName: (_) => SecondPage(selectedNotificationPayload), // }, // ), // ); // } // Future _configureLocalTimeZone() async { // if (kIsWeb || Platform.isLinux) { // return; // } // tz.initializeTimeZones(); // final String timeZoneName = await FlutterTimezone.getLocalTimezone(); // tz.setLocalLocation(tz.getLocation(timeZoneName)); // } // class PaddedElevatedButton extends StatelessWidget { // const PaddedElevatedButton({ // required this.buttonText, // required this.onPressed, // Key? key, // }) : super(key: key); // final String buttonText; // final VoidCallback onPressed; // @override // Widget build(BuildContext context) => Padding( // padding: const EdgeInsets.fromLTRB(0, 0, 0, 8), // child: ElevatedButton( // onPressed: onPressed, // child: Text(buttonText), // ), // ); // } // class HomePage extends StatefulWidget { // const HomePage(this.notificationAppLaunchDetails, {Key? key}) // : super(key: key); // static String routeName = '/'; // final NotificationAppLaunchDetails? notificationAppLaunchDetails; // bool get didNotificationLaunchApp => // notificationAppLaunchDetails?.didNotificationLaunchApp ?? false; // @override // State createState() => _HomePageState(); // } // class _HomePageState extends State { // bool _notificationsEnabled = false; // @override // void initState() { // super.initState(); // _isAndroidPermissionGranted(); // _requestPermissions(); // _configureDidReceiveLocalNotificationSubject(); // _configureSelectNotificationSubject(); // } // Future _isAndroidPermissionGranted() async { // if (Platform.isAndroid) { // final bool granted = await flutterLocalNotificationsPlugin // .resolvePlatformSpecificImplementation< // AndroidFlutterLocalNotificationsPlugin>() // ?.areNotificationsEnabled() ?? // false; // setState(() { // _notificationsEnabled = granted; // }); // } // } // Future _requestPermissions() async { // if (Platform.isIOS || Platform.isMacOS) { // await flutterLocalNotificationsPlugin // .resolvePlatformSpecificImplementation< // IOSFlutterLocalNotificationsPlugin>() // ?.requestPermissions( // alert: true, // badge: true, // sound: true, // ); // await flutterLocalNotificationsPlugin // .resolvePlatformSpecificImplementation< // MacOSFlutterLocalNotificationsPlugin>() // ?.requestPermissions( // alert: true, // badge: true, // sound: true, // ); // } else if (Platform.isAndroid) { // final AndroidFlutterLocalNotificationsPlugin? androidImplementation = // flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation< // AndroidFlutterLocalNotificationsPlugin>(); // final bool? granted = await androidImplementation?.requestPermission(); // setState(() { // _notificationsEnabled = granted ?? false; // }); // } // } // // configure the action when a notification is tapped // void _configureDidReceiveLocalNotificationSubject() { // didReceiveLocalNotificationStream.stream // .listen((ReceivedNotification receivedNotification) async { // await showDialog( // context: context, // builder: (BuildContext context) => CupertinoAlertDialog( // title: receivedNotification.title != null // ? Text(receivedNotification.title!) // : null, // content: receivedNotification.body != null // ? Text(receivedNotification.body!) // : null, // actions: [ // CupertinoDialogAction( // isDefaultAction: true, // onPressed: () async { // Navigator.of(context, rootNavigator: true).pop(); // await Navigator.of(context).push( // MaterialPageRoute( // builder: (BuildContext context) => // SecondPage(receivedNotification.payload), // ), // ); // }, // child: const Text('Ok'), // ) // ], // ), // ); // }); // } // void _configureSelectNotificationSubject() { // selectNotificationStream.stream.listen((String? payload) async { // await Navigator.of(context).push(MaterialPageRoute( // builder: (BuildContext context) => SecondPage(payload), // )); // }); // } // @override // Widget build(BuildContext context) { // return Scaffold( // appBar: AppBar( // title: const Text('Notifications Example'), // ), // body: SingleChildScrollView( // child: Padding( // padding: EdgeInsets.all(8), // child: Center( // child: Column( // children: [ // const Padding( // padding: EdgeInsets.zero, // child: Text( // 'Tap on a Notification when it appears to trigger navigation'), // ), // _InfoValueString( // title: 'Did notification launch app?', // value: widget.didNotificationLaunchApp, // ), // if (widget.didNotificationLaunchApp) ...[ // const Text('Launch notification details'), // _InfoValueString( // title: 'Notification id', // value: widget // .notificationAppLaunchDetails!.notificationResponse?.id, // ), // _InfoValueString( // title: 'Action id', // value: widget.notificationAppLaunchDetails! // .notificationResponse?.actionId, // ), // _InfoValueString( // title: 'Input', // value: widget.notificationAppLaunchDetails! // .notificationResponse?.input, // ), // _InfoValueString( // title: 'Payload:', // value: widget.notificationAppLaunchDetails! // .notificationResponse?.payload, // ), // PaddedElevatedButton( // buttonText: 'Show plain notification with payload', // onPressed: () async { // await _showNotification(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Show plain notification that has no title with ' // 'payload', // onPressed: () async { // await _showNotificationWithNoTitle(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show plain notification that has no body with ' // 'payload', // onPressed: () async { // await _showNotificationWithNoBody(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show notification with custom sound', // onPressed: () async { // await _showNotificationCustomSound(); // }, // ), // if (kIsWeb || !Platform.isLinux) ...[ // PaddedElevatedButton( // buttonText: // 'Schedule notification to appear in 5 seconds ' // 'based on local time zone', // onPressed: () async { // await _zonedScheduleNotification(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Schedule notification to appear in 5 seconds ' // 'based on local time zone using alarm clock', // onPressed: () async { // await _zonedScheduleAlarmClockNotification(); // }, // ), // PaddedElevatedButton( // buttonText: 'Repeat notification every minute', // onPressed: () async { // await _repeatNotification(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Schedule daily 10:00:00 am notification in your ' // 'local time zone', // onPressed: () async { // await _scheduleDailyTenAMNotification(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Schedule daily 10:00:00 am notification in your ' // "local time zone using last year's date", // onPressed: () async { // await _scheduleDailyTenAMLastYearNotification(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Schedule weekly 10:00:00 am notification in your ' // 'local time zone', // onPressed: () async { // await _scheduleWeeklyTenAMNotification(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Schedule weekly Monday 10:00:00 am notification ' // 'in your local time zone', // onPressed: () async { // await _scheduleWeeklyMondayTenAMNotification(); // }, // ), // PaddedElevatedButton( // buttonText: 'Check pending notifications', // onPressed: () async { // await _checkPendingNotificationRequests(); // }, // ), // PaddedElevatedButton( // buttonText: 'Get active notifications', // onPressed: () async { // await _getActiveNotifications(); // }, // ), // ], // PaddedElevatedButton( // buttonText: // 'Schedule monthly Monday 10:00:00 am notification in ' // 'your local time zone', // onPressed: () async { // await _scheduleMonthlyMondayTenAMNotification(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Schedule yearly Monday 10:00:00 am notification in ' // 'your local time zone', // onPressed: () async { // await _scheduleYearlyMondayTenAMNotification(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show notification with no sound', // onPressed: () async { // await _showNotificationWithNoSound(); // }, // ), // PaddedElevatedButton( // buttonText: 'Cancel latest notification', // onPressed: () async { // await _cancelNotification(); // }, // ), // PaddedElevatedButton( // buttonText: 'Cancel all notifications', // onPressed: () async { // await _cancelAllNotifications(); // }, // ), // const Divider(), // const Text( // 'Notifications with actions', // style: TextStyle(fontWeight: FontWeight.bold), // ), // PaddedElevatedButton( // buttonText: 'Show notification with plain actions', // onPressed: () async { // await _showNotificationWithActions(); // }, // ), // if (!Platform.isLinux) // PaddedElevatedButton( // buttonText: 'Show notification with text action', // onPressed: () async { // await _showNotificationWithTextAction(); // }, // ), // if (!Platform.isLinux) // PaddedElevatedButton( // buttonText: 'Show notification with text choice', // onPressed: () async { // await _showNotificationWithTextChoice(); // }, // ), // const Divider(), // if (Platform.isAndroid) ...[ // const Text( // 'Android-specific examples', // style: TextStyle(fontWeight: FontWeight.bold), // ), // Text('notifications enabled: $_notificationsEnabled'), // PaddedElevatedButton( // buttonText: // 'Check if notifications are enabled for this app', // onPressed: _areNotifcationsEnabledOnAndroid, // ), // PaddedElevatedButton( // buttonText: 'Request permission (API 33+)', // onPressed: () => _requestPermissions(), // ), // PaddedElevatedButton( // buttonText: // 'Show plain notification with payload and update ' // 'channel description', // onPressed: () async { // await _showNotificationUpdateChannelDescription(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show plain notification as public on every ' // 'lockscreen', // onPressed: () async { // await _showPublicNotification(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Show notification with custom vibration pattern, ' // 'red LED and red icon', // onPressed: () async { // await _showNotificationCustomVibrationIconLed(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show notification using Android Uri sound', // onPressed: () async { // await _showSoundUriNotification(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Show notification that times out after 3 seconds', // onPressed: () async { // await _showTimeoutNotification(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show insistent notification', // onPressed: () async { // await _showInsistentNotification(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Show big picture notification using local images', // onPressed: () async { // await _showBigPictureNotification(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Show big picture notification using base64 String ' // 'for images', // onPressed: () async { // await _showBigPictureNotificationBase64(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Show big picture notification using URLs for ' // 'Images', // onPressed: () async { // await _showBigPictureNotificationURL(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Show big picture notification, hide large icon ' // 'on expand', // onPressed: () async { // await _showBigPictureNotificationHiddenLargeIcon(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show media notification', // onPressed: () async { // await _showNotificationMediaStyle(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show big text notification', // onPressed: () async { // await _showBigTextNotification(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show inbox notification', // onPressed: () async { // await _showInboxNotification(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show messaging notification', // onPressed: () async { // await _showMessagingNotification(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show grouped notifications', // onPressed: () async { // await _showGroupedNotifications(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show notification with tag', // onPressed: () async { // await _showNotificationWithTag(); // }, // ), // PaddedElevatedButton( // buttonText: 'Cancel notification with tag', // onPressed: () async { // await _cancelNotificationWithTag(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show ongoing notification', // onPressed: () async { // await _showOngoingNotification(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Show notification with no badge, alert only once', // onPressed: () async { // await _showNotificationWithNoBadge(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Show progress notification - updates every second', // onPressed: () async { // await _showProgressNotification(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show indeterminate progress notification', // onPressed: () async { // await _showIndeterminateProgressNotification(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show notification without timestamp', // onPressed: () async { // await _showNotificationWithoutTimestamp(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show notification with custom timestamp', // onPressed: () async { // await _showNotificationWithCustomTimestamp(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show notification with custom sub-text', // onPressed: () async { // await _showNotificationWithCustomSubText(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show notification with chronometer', // onPressed: () async { // await _showNotificationWithChronometer(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show full-screen notification', // onPressed: () async { // await _showFullScreenNotification(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Show notification with number if the launcher ' // 'supports', // onPressed: () async { // await _showNotificationWithNumber(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show notification with sound controlled by ' // 'alarm volume', // onPressed: () async { // await _showNotificationWithAudioAttributeAlarm(); // }, // ), // PaddedElevatedButton( // buttonText: 'Create grouped notification channels', // onPressed: () async { // await _createNotificationChannelGroup(); // }, // ), // PaddedElevatedButton( // buttonText: 'Delete notification channel group', // onPressed: () async { // await _deleteNotificationChannelGroup(); // }, // ), // PaddedElevatedButton( // buttonText: 'Create notification channel', // onPressed: () async { // await _createNotificationChannel(); // }, // ), // PaddedElevatedButton( // buttonText: 'Delete notification channel', // onPressed: () async { // await _deleteNotificationChannel(); // }, // ), // PaddedElevatedButton( // buttonText: 'Get notification channels', // onPressed: () async { // await _getNotificationChannels(); // }, // ), // PaddedElevatedButton( // buttonText: 'Start foreground service', // onPressed: () async { // await _startForegroundService(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Start foreground service with blue background ' // 'notification', // onPressed: () async { // await _startForegroundServiceWithBlueBackgroundNotification(); // }, // ), // PaddedElevatedButton( // buttonText: 'Stop foreground service', // onPressed: () async { // await _stopForegroundService(); // }, // ), // ], // if (!kIsWeb && // (Platform.isIOS || Platform.isMacOS)) ...[ // const Text( // 'iOS and macOS-specific examples', // style: TextStyle(fontWeight: FontWeight.bold), // ), // PaddedElevatedButton( // buttonText: 'Request permission', // onPressed: _requestPermissions, // ), // PaddedElevatedButton( // buttonText: 'Show notification with subtitle', // onPressed: () async { // await _showNotificationWithSubtitle(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show notification with icon badge', // onPressed: () async { // await _showNotificationWithIconBadge(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Show notification with attachment (with thumbnail)', // onPressed: () async { // await _showNotificationWithAttachment( // hideThumbnail: false); // }, // ), // PaddedElevatedButton( // buttonText: // 'Show notification with attachment (no thumbnail)', // onPressed: () async { // await _showNotificationWithAttachment( // hideThumbnail: true); // }, // ), // PaddedElevatedButton( // buttonText: // 'Show notification with attachment (clipped thumbnail)', // onPressed: () async { // await _showNotificationWithClippedThumbnailAttachment(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show notifications with thread identifier', // onPressed: () async { // await _showNotificationsWithThreadIdentifier(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Show notification with time sensitive interruption ' // 'level', // onPressed: () async { // await _showNotificationWithTimeSensitiveInterruptionLevel(); // }, // ), // PaddedElevatedButton( // buttonText: 'Show notification with banner but not in ' // 'notification centre', // onPressed: () async { // await _showNotificationWithBannerNotInNotificationCentre(); // }, // ), // PaddedElevatedButton( // buttonText: // 'Show notification in notification centre only', // onPressed: () async { // await _showNotificationInNotificationCentreOnly(); // }, // ), // ], // ], // ], // ), // ), // ), // ), // ); // } // // show single plain notification // Future _showNotification() async { // const AndroidNotificationDetails androidNotificationDetails = // AndroidNotificationDetails( // 'your channel id', // 'your channel name', // channelDescription: 'your channel description', // importance: Importance.max, // priority: Priority.high, // ticker: 'ticker', // ); // const NotificationDetails notificationDetails = // NotificationDetails(android: androidNotificationDetails); // await flutterLocalNotificationsPlugin.show( // id++, 'plain title', 'plain body', notificationDetails, // payload: 'item x'); // } // // show notification with plain actions // Future _showNotificationWithActions() async { // const AndroidNotificationDetails androidNotificationDetails = // AndroidNotificationDetails( // 'your channel id', // 'your channel name', // channelDescription: 'your channel description', // importance: Importance.max, // priority: Priority.high, // ticker: 'ticker', // actions: [ // AndroidNotificationAction( // urlLaunchActionId, // 'Action 1', // icon: DrawableResourceAndroidBitmap('food'), // contextual: true, // ), // AndroidNotificationAction( // 'id_2', // 'Action 2', // titleColor: Color.fromARGB(255, 255, 0, 0), // icon: DrawableResourceAndroidBitmap('secondary_icon'), // ), // AndroidNotificationAction( // navigationActionId, // 'Action 3', // icon: DrawableResourceAndroidBitmap('secondary_icon'), // showsUserInterface: true, // // By default, Android plugin will dismiss the notification when the // // user tapped on a action (this mimics the behavior on iOS). // cancelNotification: false, // ), // ], // ); // const DarwinNotificationDetails iosNotificationDetails = // DarwinNotificationDetails( // categoryIdentifier: darwinNotificationCategoryPlain, // ); // const DarwinNotificationDetails macOSNotificationDetails = // DarwinNotificationDetails( // categoryIdentifier: darwinNotificationCategoryPlain, // ); // const LinuxNotificationDetails linuxNotificationDetails = // LinuxNotificationDetails( // actions: [ // LinuxNotificationAction( // key: urlLaunchActionId, // label: 'Action 1', // ), // LinuxNotificationAction( // key: navigationActionId, // label: 'Action 2', // ), // ], // ); // const NotificationDetails notificationDetails = NotificationDetails( // android: androidNotificationDetails, // iOS: iosNotificationDetails, // macOS: macOSNotificationDetails, // linux: linuxNotificationDetails, // ); // await flutterLocalNotificationsPlugin.show( // id++, // 'plain title', // 'plain body', // notificationDetails, // payload: 'item z', // ); // } // // show notification with text input action // Future _showNotificationWithTextAction() async { // const AndroidNotificationDetails androidNotificationDetails = // AndroidNotificationDetails( // 'your channel id', // 'your channel name', // channelDescription: 'your channel description', // importance: Importance.max, // priority: Priority.high, // ticker: 'ticker', // actions: [ // AndroidNotificationAction( // 'text_id_1', // 'Enter Text', // icon: DrawableResourceAndroidBitmap('food'), // inputs: [ // AndroidNotificationActionInput(label: 'Enter a Message'), // ], // ), // ], // ); // const NotificationDetails notificationDetails = // NotificationDetails(android: androidNotificationDetails); // await flutterLocalNotificationsPlugin.show( // id++, // 'Text Input Notification', // 'Expand to see Input action', // notificationDetails, // payload: 'item x', // ); // } // @override // void dispose() { // didReceiveLocalNotificationStream.close(); // selectNotificationStream.close(); // super.dispose(); // } // } // class _InfoValueString extends StatelessWidget { // const _InfoValueString({ // required this.title, // required this.value, // Key? key, // }) : super(key: key); // final String title; // final Object? value; // @override // Widget build(BuildContext context) => Padding( // padding: const EdgeInsets.fromLTRB(0, 0, 0, 8), // child: Text.rich( // TextSpan( // children: [ // TextSpan( // text: '$title ', // style: const TextStyle( // fontWeight: FontWeight.bold, // ), // ), // TextSpan( // text: '$value', // ) // ], // ), // ), // ); // }