ente/lib/services/push_service.dart

94 lines
3.2 KiB
Dart
Raw Normal View History

import 'package:dio/dio.dart';
2021-10-12 09:12:28 +00:00
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:logging/logging.dart';
2021-11-10 19:14:25 +00:00
import 'package:photos/core/configuration.dart';
2021-11-11 18:58:44 +00:00
import 'package:photos/core/constants.dart';
2021-11-10 19:14:25 +00:00
import 'package:photos/core/event_bus.dart';
import 'package:photos/core/network.dart';
2021-11-10 19:14:25 +00:00
import 'package:photos/events/signed_in_event.dart';
2021-10-12 09:36:22 +00:00
import 'package:photos/services/sync_service.dart';
2021-11-10 19:14:25 +00:00
import 'package:shared_preferences/shared_preferences.dart';
2021-10-12 09:12:28 +00:00
class PushService {
2021-11-11 18:58:44 +00:00
static const kFCMPushToken = "fcm_push_token";
static const kLastFCMTokenUpdationTime = "fcm_push_token_updation_time";
static const kFCMTokenUpdationIntervalInDays = 30;
2021-10-12 09:12:28 +00:00
static final PushService instance = PushService._privateConstructor();
static final _logger = Logger("PushService");
final _dio = Network.instance.getDio();
2021-11-10 19:14:25 +00:00
SharedPreferences _prefs;
2021-10-12 09:12:28 +00:00
PushService._privateConstructor();
Future<void> init() async {
2021-11-11 18:58:44 +00:00
_prefs = await SharedPreferences.getInstance();
2021-10-12 09:12:28 +00:00
await Firebase.initializeApp();
FirebaseMessaging messaging = FirebaseMessaging.instance;
await messaging.requestPermission(
alert: true,
announcement: false,
badge: true,
carPlay: false,
criticalAlert: false,
provisional: false,
sound: true,
);
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
_logger.info('Got a message whilst in the foreground!');
2021-10-12 09:36:22 +00:00
_handlePushMessage(message);
2021-10-12 09:12:28 +00:00
});
2021-11-10 19:14:25 +00:00
if (Configuration.instance.hasConfiguredAccount()) {
await _configurePushToken();
} else {
Bus.instance.on<SignedInEvent>().listen((_) {
_configurePushToken();
});
}
}
Future<void> _configurePushToken() async {
final fcmToken = await FirebaseMessaging.instance.getToken();
2021-11-11 18:58:44 +00:00
final hasServerTokenExpired = DateTime.now().microsecondsSinceEpoch -
(_prefs.getInt(kLastFCMTokenUpdationTime) ?? 0) <
(kMicroSecondsInDay * kFCMTokenUpdationIntervalInDays);
if (_prefs.getString(kFCMPushToken) != fcmToken || hasServerTokenExpired) {
2021-11-10 19:14:25 +00:00
final apnsToken = await FirebaseMessaging.instance.getAPNSToken();
2021-11-11 18:58:44 +00:00
try {
await _setPushTokenOnServer(fcmToken, apnsToken);
await _prefs.setString(kFCMPushToken, fcmToken);
await _prefs.setInt(
kLastFCMTokenUpdationTime, DateTime.now().microsecondsSinceEpoch);
_logger.info("Push token updated on server");
} catch (e) {
_logger.severe("Could not set push token", e, StackTrace.current);
}
2021-11-10 19:14:25 +00:00
}
}
Future<void> _setPushTokenOnServer(String fcmToken, String apnsToken) async {
2021-11-11 18:58:44 +00:00
await _dio.post(
Configuration.instance.getHttpEndpoint() + "/push/token",
data: {
"fcmToken": fcmToken,
"apnsToken": apnsToken,
},
options: Options(
headers: {"X-Auth-Token": Configuration.instance.getToken()},
),
);
2021-10-12 09:12:28 +00:00
}
2021-10-13 05:24:49 +00:00
void _handlePushMessage(RemoteMessage message) {
_logger.info('Message data: ${message.data}');
if (message.notification != null) {
_logger.info(
'Message also contained a notification: ${message.notification}');
}
2021-10-12 09:36:22 +00:00
SyncService.instance.sync();
}
2021-10-12 09:12:28 +00:00
}