71 lines
2.9 KiB
Dart
71 lines
2.9 KiB
Dart
|
import 'dart:io';
|
||
|
|
||
|
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
||
|
import 'package:simplecloudnotifier/settings/app_settings.dart';
|
||
|
import 'package:simplecloudnotifier/state/application_log.dart';
|
||
|
import 'package:simplecloudnotifier/state/globals.dart';
|
||
|
|
||
|
class Notifier {
|
||
|
static void showLocalNotification(String channelID, String channelName, String channelDescr, String title, String body, DateTime? timestamp) async {
|
||
|
final nid = Globals().sharedPrefs.getInt('notifier.nextid') ?? 1000;
|
||
|
Globals().sharedPrefs.setInt('notifier.nextid', nid + 7);
|
||
|
|
||
|
final existingSummaryNID = Globals().sharedPrefs.getInt('notifier.summary.$channelID');
|
||
|
|
||
|
final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
|
||
|
|
||
|
if (Platform.isAndroid && AppSettings().groupNotifications) {
|
||
|
final activeNotifications = (await flutterLocalNotificationsPlugin.getActiveNotifications()).where((p) => p.groupKey == channelID).toList();
|
||
|
final summaryNotification = activeNotifications.where((p) => p.id == existingSummaryNID).toList();
|
||
|
|
||
|
ApplicationLog.debug('found ${activeNotifications.length} active notifications in this group (${summaryNotification.length} summary notifications for channel ${channelID} with nid [${existingSummaryNID}])');
|
||
|
|
||
|
if (activeNotifications.isNotEmpty && !activeNotifications.any((p) => p.id == existingSummaryNID)) {
|
||
|
// ======== SHOW SUMMARY/GROUPING NOTIFICATION ========
|
||
|
final newSummaryNID = nid + 1;
|
||
|
ApplicationLog.debug('Create new summary notifications for channel ${channelID} with nid [${newSummaryNID}])');
|
||
|
Globals().sharedPrefs.setInt('notifier.summary.$channelID', newSummaryNID);
|
||
|
await flutterLocalNotificationsPlugin.show(
|
||
|
newSummaryNID,
|
||
|
channelName,
|
||
|
"(multiple notifications)",
|
||
|
NotificationDetails(
|
||
|
android: AndroidNotificationDetails(
|
||
|
channelID,
|
||
|
channelName,
|
||
|
importance: Importance.max,
|
||
|
priority: Priority.high,
|
||
|
groupKey: channelID,
|
||
|
setAsGroupSummary: true,
|
||
|
subText: (channelName == 'main') ? null : channelName,
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
final newMessageNID = nid + 2;
|
||
|
|
||
|
ApplicationLog.debug('Create new local notifications for message in channel ${channelID} with nid [${newMessageNID}])');
|
||
|
|
||
|
// ======== SHOW NOTIFICATION ========
|
||
|
await flutterLocalNotificationsPlugin.show(
|
||
|
newMessageNID,
|
||
|
title,
|
||
|
body,
|
||
|
NotificationDetails(
|
||
|
android: AndroidNotificationDetails(
|
||
|
channelID,
|
||
|
channelName,
|
||
|
channelDescription: channelDescr,
|
||
|
importance: Importance.max,
|
||
|
priority: Priority.high,
|
||
|
when: timestamp?.millisecondsSinceEpoch,
|
||
|
groupKey: channelID,
|
||
|
subText: (channelName == 'main') ? null : channelName,
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
}
|