2021-05-20 23:23:29 +00:00
|
|
|
import 'dart:io';
|
|
|
|
|
|
|
|
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
2023-06-25 13:02:02 +00:00
|
|
|
import "package:photos/services/remote_sync_service.dart";
|
2023-06-24 06:02:26 +00:00
|
|
|
import "package:shared_preferences/shared_preferences.dart";
|
2021-05-20 23:23:29 +00:00
|
|
|
|
|
|
|
class NotificationService {
|
|
|
|
static final NotificationService instance =
|
|
|
|
NotificationService._privateConstructor();
|
2023-06-24 06:02:26 +00:00
|
|
|
static const String keyGrantedNotificationPermission =
|
|
|
|
"notification_permission_granted";
|
2023-06-25 12:34:00 +00:00
|
|
|
static const String keyShouldShowNotificationsForSharedPhotos =
|
|
|
|
"notifications_enabled_shared_photos";
|
2021-05-20 23:23:29 +00:00
|
|
|
|
|
|
|
NotificationService._privateConstructor();
|
2023-06-24 06:02:26 +00:00
|
|
|
|
|
|
|
late SharedPreferences _preferences;
|
2023-06-26 06:24:34 +00:00
|
|
|
final FlutterLocalNotificationsPlugin _notificationsPlugin =
|
2021-05-20 23:23:29 +00:00
|
|
|
FlutterLocalNotificationsPlugin();
|
|
|
|
|
2023-06-26 07:51:31 +00:00
|
|
|
Future<void> init(SharedPreferences preferences) async {
|
|
|
|
_preferences = preferences;
|
2023-06-24 06:02:26 +00:00
|
|
|
const androidSettings = AndroidInitializationSettings('notification_icon');
|
|
|
|
const iosSettings = DarwinInitializationSettings();
|
2022-07-04 06:02:17 +00:00
|
|
|
const InitializationSettings initializationSettings =
|
2021-05-20 23:23:29 +00:00
|
|
|
InitializationSettings(
|
2023-06-24 06:02:26 +00:00
|
|
|
android: androidSettings,
|
|
|
|
iOS: iosSettings,
|
2021-05-20 23:23:29 +00:00
|
|
|
);
|
2023-06-26 06:24:34 +00:00
|
|
|
await _notificationsPlugin.initialize(initializationSettings);
|
2023-06-25 13:02:02 +00:00
|
|
|
if (!hasGrantedPermissions() &&
|
|
|
|
RemoteSyncService.instance.isFirstRemoteSyncDone()) {
|
2023-06-25 12:29:35 +00:00
|
|
|
await requestPermissions();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> requestPermissions() async {
|
2023-06-26 06:24:22 +00:00
|
|
|
bool? result;
|
2023-06-25 12:29:35 +00:00
|
|
|
if (Platform.isIOS) {
|
2023-06-26 06:24:34 +00:00
|
|
|
result = await _notificationsPlugin
|
2023-06-24 06:02:26 +00:00
|
|
|
.resolvePlatformSpecificImplementation<
|
|
|
|
IOSFlutterLocalNotificationsPlugin>()
|
|
|
|
?.requestPermissions(
|
|
|
|
sound: true,
|
|
|
|
alert: true,
|
|
|
|
);
|
2023-06-25 13:02:02 +00:00
|
|
|
} else {
|
2023-06-26 06:24:34 +00:00
|
|
|
result = await _notificationsPlugin
|
2023-06-26 06:24:22 +00:00
|
|
|
.resolvePlatformSpecificImplementation<
|
|
|
|
AndroidFlutterLocalNotificationsPlugin>()
|
|
|
|
?.requestPermission();
|
|
|
|
}
|
|
|
|
if (result != null) {
|
|
|
|
_preferences.setBool(keyGrantedNotificationPermission, result);
|
2023-06-24 06:02:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-06-25 12:29:35 +00:00
|
|
|
bool hasGrantedPermissions() {
|
2023-06-24 06:02:26 +00:00
|
|
|
final result = _preferences.getBool(keyGrantedNotificationPermission);
|
|
|
|
return result ?? false;
|
2021-05-20 23:23:29 +00:00
|
|
|
}
|
|
|
|
|
2023-06-25 12:34:00 +00:00
|
|
|
bool shouldShowNotificationsForSharedPhotos() {
|
|
|
|
final result =
|
|
|
|
_preferences.getBool(keyShouldShowNotificationsForSharedPhotos);
|
2023-06-25 12:29:35 +00:00
|
|
|
return result ?? true;
|
|
|
|
}
|
|
|
|
|
2023-06-25 12:34:00 +00:00
|
|
|
Future<void> setShouldShowNotificationsForSharedPhotos(bool value) {
|
|
|
|
return _preferences.setBool(
|
|
|
|
keyShouldShowNotificationsForSharedPhotos,
|
|
|
|
value,
|
|
|
|
);
|
2023-06-25 12:29:35 +00:00
|
|
|
}
|
|
|
|
|
2023-06-25 13:54:39 +00:00
|
|
|
Future<void> showNotification(
|
|
|
|
String title,
|
|
|
|
String message, {
|
2023-06-26 07:43:33 +00:00
|
|
|
String channelID = "io.ente.photos",
|
|
|
|
String channelName = "ente",
|
2023-06-25 13:54:39 +00:00
|
|
|
}) async {
|
|
|
|
final androidSpecs = AndroidNotificationDetails(
|
2023-06-26 07:43:33 +00:00
|
|
|
channelID,
|
|
|
|
channelName,
|
2022-05-18 10:08:13 +00:00
|
|
|
channelDescription: 'ente alerts',
|
2021-05-20 23:23:29 +00:00
|
|
|
importance: Importance.max,
|
|
|
|
priority: Priority.high,
|
|
|
|
showWhen: false,
|
|
|
|
);
|
2023-06-26 07:43:33 +00:00
|
|
|
final iosSpecs = DarwinNotificationDetails(threadIdentifier: channelID);
|
2023-06-25 13:54:39 +00:00
|
|
|
final platformChannelSpecs =
|
|
|
|
NotificationDetails(android: androidSpecs, iOS: iosSpecs);
|
2023-06-26 06:24:34 +00:00
|
|
|
await _notificationsPlugin.show(
|
2023-06-26 07:43:33 +00:00
|
|
|
channelName.hashCode,
|
2022-06-11 08:23:52 +00:00
|
|
|
title,
|
|
|
|
message,
|
2023-06-25 13:54:39 +00:00
|
|
|
platformChannelSpecs,
|
2022-06-11 08:23:52 +00:00
|
|
|
);
|
2021-05-20 23:23:29 +00:00
|
|
|
}
|
|
|
|
}
|