فهرست منبع

Configure push token on user sign in

vishnukvmd 3 سال پیش
والد
کامیت
290a8bea36
4فایلهای تغییر یافته به همراه35 افزوده شده و 8 حذف شده
  1. 2 0
      lib/core/configuration.dart
  2. 3 0
      lib/events/signed_in_event.dart
  3. 4 4
      lib/main.dart
  4. 26 4
      lib/services/push_service.dart

+ 2 - 0
lib/core/configuration.dart

@@ -14,6 +14,7 @@ import 'package:photos/db/memories_db.dart';
 import 'package:photos/db/public_keys_db.dart';
 import 'package:photos/db/public_keys_db.dart';
 import 'package:photos/db/trash_db.dart';
 import 'package:photos/db/trash_db.dart';
 import 'package:photos/db/upload_locks_db.dart';
 import 'package:photos/db/upload_locks_db.dart';
+import 'package:photos/events/signed_in_event.dart';
 import 'package:photos/events/user_logged_out_event.dart';
 import 'package:photos/events/user_logged_out_event.dart';
 import 'package:photos/models/key_attributes.dart';
 import 'package:photos/models/key_attributes.dart';
 import 'package:photos/models/key_gen_result.dart';
 import 'package:photos/models/key_gen_result.dart';
@@ -302,6 +303,7 @@ class Configuration {
   Future<void> setToken(String token) async {
   Future<void> setToken(String token) async {
     _cachedToken = token;
     _cachedToken = token;
     await _preferences.setString(tokenKey, token);
     await _preferences.setString(tokenKey, token);
+    Bus.instance.fire(SignedInEvent());
   }
   }
 
 
   Future<void> setEncryptedToken(String encryptedToken) async {
   Future<void> setEncryptedToken(String encryptedToken) async {

+ 3 - 0
lib/events/signed_in_event.dart

@@ -0,0 +1,3 @@
+import 'package:photos/events/event.dart';
+
+class SignedInEvent extends Event {}

+ 4 - 4
lib/main.dart

@@ -159,8 +159,9 @@ Future<void> _init(bool isBackground) async {
   await SyncService.instance.init();
   await SyncService.instance.init();
   await MemoriesService.instance.init();
   await MemoriesService.instance.init();
   await LocalSettings.instance.init();
   await LocalSettings.instance.init();
-  await PushService.instance.init();
-  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
+  PushService.instance.init().then((_) {
+    FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
+  });
   FeatureFlagService.instance.init();
   FeatureFlagService.instance.init();
   _logger.info("Initialization done");
   _logger.info("Initialization done");
   _initializationStatus.complete();
   _initializationStatus.complete();
@@ -319,8 +320,7 @@ Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
       await _sync(isAppInBackground: true);
       await _sync(isAppInBackground: true);
     }, prefix: "[bg]");
     }, prefix: "[bg]");
   } else {
   } else {
-    _logger
-        .info("Background push received when app is alive");
+    _logger.info("Background push received when app is alive");
     await _sync(isAppInBackground: true);
     await _sync(isAppInBackground: true);
   }
   }
 }
 }

+ 26 - 4
lib/services/push_service.dart

@@ -1,12 +1,19 @@
 import 'package:firebase_messaging/firebase_messaging.dart';
 import 'package:firebase_messaging/firebase_messaging.dart';
 import 'package:firebase_core/firebase_core.dart';
 import 'package:firebase_core/firebase_core.dart';
 import 'package:logging/logging.dart';
 import 'package:logging/logging.dart';
+import 'package:photos/core/configuration.dart';
+import 'package:photos/core/event_bus.dart';
+import 'package:photos/events/signed_in_event.dart';
 import 'package:photos/services/sync_service.dart';
 import 'package:photos/services/sync_service.dart';
+import 'package:shared_preferences/shared_preferences.dart';
 
 
 class PushService {
 class PushService {
   static final PushService instance = PushService._privateConstructor();
   static final PushService instance = PushService._privateConstructor();
   static final _logger = Logger("PushService");
   static final _logger = Logger("PushService");
 
 
+  SharedPreferences _prefs;
+  static const kFCMPushTokenKey = "fcm_push_token";
+
   PushService._privateConstructor();
   PushService._privateConstructor();
 
 
   Future<void> init() async {
   Future<void> init() async {
@@ -25,10 +32,25 @@ class PushService {
       _logger.info('Got a message whilst in the foreground!');
       _logger.info('Got a message whilst in the foreground!');
       _handlePushMessage(message);
       _handlePushMessage(message);
     });
     });
-    _logger.info("token " + await FirebaseMessaging.instance.getToken());
-    _logger
-        .info("APNS token " + await FirebaseMessaging.instance.getAPNSToken());
-    _logger.info('init complete');
+    if (Configuration.instance.hasConfiguredAccount()) {
+      await _configurePushToken();
+    } else {
+      Bus.instance.on<SignedInEvent>().listen((_) {
+        _configurePushToken();
+      });
+    }
+  }
+
+  Future<void> _configurePushToken() async {
+    final fcmToken = await FirebaseMessaging.instance.getToken();
+    if (_prefs.getString(kFCMPushTokenKey) != fcmToken) {
+      final apnsToken = await FirebaseMessaging.instance.getAPNSToken();
+      _setPushTokenOnServer(fcmToken, apnsToken);
+    }
+  }
+
+  Future<void> _setPushTokenOnServer(String fcmToken, String apnsToken) {
+    // TODO
   }
   }
 
 
   void _handlePushMessage(RemoteMessage message) {
   void _handlePushMessage(RemoteMessage message) {