TF-1202: Configure ENV for FCM
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CLIENT_ID</key>
|
||||
<string>example</string>
|
||||
<key>REVERSED_CLIENT_ID</key>
|
||||
<string>example</string>
|
||||
<key>API_KEY</key>
|
||||
<string>example</string>
|
||||
<key>GCM_SENDER_ID</key>
|
||||
<string>example</string>
|
||||
<key>PLIST_VERSION</key>
|
||||
<string>1</string>
|
||||
<key>BUNDLE_ID</key>
|
||||
<string>com.linagora.ios.teammail</string>
|
||||
<key>PROJECT_ID</key>
|
||||
<string>example</string>
|
||||
<key>STORAGE_BUCKET</key>
|
||||
<string>example</string>
|
||||
<key>IS_ADS_ENABLED</key>
|
||||
<false></false>
|
||||
<key>IS_ANALYTICS_ENABLED</key>
|
||||
<false></false>
|
||||
<key>IS_APPINVITE_ENABLED</key>
|
||||
<true></true>
|
||||
<key>IS_GCM_ENABLED</key>
|
||||
<true></true>
|
||||
<key>IS_SIGNIN_ENABLED</key>
|
||||
<true></true>
|
||||
<key>GOOGLE_APP_ID</key>
|
||||
<string>example</string>
|
||||
<key>DATABASE_URL</key>
|
||||
<string>example</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,6 +1,8 @@
|
||||
import 'package:contact/contact/model/capability_contact.dart';
|
||||
import 'package:core/core.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:firebase_core/firebase_core.dart';
|
||||
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:forward/forward/capability_forward.dart';
|
||||
@@ -17,6 +19,10 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/c
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/tmail_autocomplete_bindings.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/bindings/email_rules_interactor_bindings.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/forward/bindings/forwarding_interactors_bindings.dart';
|
||||
import 'package:tmail_ui_user/features/push_notification/domain/model/capability_push_notification.dart';
|
||||
import 'package:tmail_ui_user/features/push_notification/presentation/firebase_bindings.dart';
|
||||
import 'package:tmail_ui_user/features/push_notification/presentation/firebase_options.dart';
|
||||
import 'package:tmail_ui_user/features/push_notification/presentation/notification_service.dart';
|
||||
import 'package:tmail_ui_user/main/error/capability_validator.dart';
|
||||
import 'package:tmail_ui_user/main/exceptions/remote_exception.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
@@ -119,7 +125,7 @@ abstract class BaseController extends GetxController
|
||||
requireCapability(session!, accountId!, [CapabilityIdentifier.jmapMdn]);
|
||||
MdnInteractorBindings().dependencies();
|
||||
} catch(e) {
|
||||
logError('BaseController::injectMdnBindings(): exception: $e');
|
||||
logError('BaseController::injectVacationBindings(): exception: $e');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -140,4 +146,15 @@ abstract class BaseController extends GetxController
|
||||
logError('BaseController::injectRuleFilterBindings(): exception: $e');
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> injectFirebaseBindings(Session? session, AccountId? accountId) async {
|
||||
try {
|
||||
requireCapability(session!, accountId!, [capabilityPushNotification]);
|
||||
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
|
||||
FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler);
|
||||
FireBaseBindings().dependencies();
|
||||
} catch(e) {
|
||||
logError('BaseController::injectFirebaseBindings(): exception: $e');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,6 +18,7 @@ import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_rights_cache.d
|
||||
import 'package:tmail_ui_user/features/mailbox/data/model/state_cache.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/data/model/state_type.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/data/model/recent_search_cache.dart';
|
||||
import 'package:tmail_ui_user/features/push_notification/data/model/firebase_cache.dart';
|
||||
import 'package:tmail_ui_user/features/thread/data/model/email_address_hive_cache.dart';
|
||||
import 'package:tmail_ui_user/features/thread/data/model/email_cache.dart';
|
||||
|
||||
@@ -78,6 +79,7 @@ class HiveCacheConfig {
|
||||
Hive.registerAdapter(AuthenticationInfoCacheAdapter());
|
||||
Hive.registerAdapter(RecentLoginUrlCacheAdapter());
|
||||
Hive.registerAdapter(RecentLoginUsernameCacheAdapter());
|
||||
Hive.registerAdapter(FirebaseCacheAdapter());
|
||||
}
|
||||
|
||||
Future closeHive() async {
|
||||
|
||||
+21
@@ -14,6 +14,7 @@ import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/vacation/vacation_response.dart';
|
||||
import 'package:model/firebase/firebase_dto.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
import 'package:pointer_interceptor/pointer_interceptor.dart';
|
||||
@@ -64,6 +65,8 @@ import 'package:tmail_ui_user/features/manage_account/presentation/extensions/va
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/manage_account_arguments.dart';
|
||||
import 'package:tmail_ui_user/features/network_status_handle/presentation/network_connnection_controller.dart';
|
||||
import 'package:tmail_ui_user/features/push_notification/domain/usecases/save_firebase_cache_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/push_notification/presentation/notification_service.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart';
|
||||
@@ -108,6 +111,7 @@ class MailboxDashBoardController extends ReloadableController {
|
||||
|
||||
GetAllVacationInteractor? _getAllVacationInteractor;
|
||||
UpdateVacationInteractor? _updateVacationInteractor;
|
||||
SaveFirebaseCacheInteractor? _saveFirebaseCacheInteractor;
|
||||
|
||||
final scaffoldKey = GlobalKey<ScaffoldState>();
|
||||
final selectedMailbox = Rxn<PresentationMailbox>();
|
||||
@@ -333,6 +337,7 @@ class MailboxDashBoardController extends ReloadableController {
|
||||
injectAutoCompleteBindings(sessionCurrent, accountId.value);
|
||||
injectRuleFilterBindings(sessionCurrent, accountId.value);
|
||||
injectVacationBindings(sessionCurrent, accountId.value);
|
||||
injectFirebaseBindings(sessionCurrent, accountId.value);
|
||||
_getVacationResponse();
|
||||
} else {
|
||||
reload();
|
||||
@@ -350,6 +355,22 @@ class MailboxDashBoardController extends ReloadableController {
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> injectFirebaseBindings(Session? session, AccountId? accountId) async {
|
||||
try {
|
||||
await super.injectFirebaseBindings(session, accountId);
|
||||
_saveFirebaseCacheInteractor = Get.find<SaveFirebaseCacheInteractor>();
|
||||
NotificationService.initializeNotificationService(
|
||||
onDidReceiveNotificationResponse);
|
||||
NotificationService.onTokenRefresh.listen((token) {
|
||||
_saveFirebaseCacheInteractor?.execute(FirebaseDto(token));
|
||||
});
|
||||
} catch (e) {
|
||||
logError('MailboxDashBoardController::injectVacationBindings(): $e');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Future<void> _getAppVersion() async {
|
||||
final info = await PackageInfo.fromPlatform();
|
||||
log('MailboxDashBoardController::_getAppVersion(): ${info.version}');
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
|
||||
|
||||
final capabilityPushNotification = CapabilityIdentifier(Uri.parse('com:linagora:params:jmap:firebase:push'));
|
||||
@@ -0,0 +1,69 @@
|
||||
// File generated by FlutterFire CLI.
|
||||
// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members
|
||||
import 'package:firebase_core/firebase_core.dart' show FirebaseOptions;
|
||||
import 'package:flutter/foundation.dart'
|
||||
show defaultTargetPlatform, kIsWeb, TargetPlatform;
|
||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
|
||||
class DefaultFirebaseOptions {
|
||||
static FirebaseOptions get currentPlatform {
|
||||
if (kIsWeb) {
|
||||
return web;
|
||||
}
|
||||
switch (defaultTargetPlatform) {
|
||||
case TargetPlatform.android:
|
||||
return android;
|
||||
case TargetPlatform.iOS:
|
||||
return ios;
|
||||
case TargetPlatform.macOS:
|
||||
throw UnsupportedError(
|
||||
'DefaultFirebaseOptions have not been configured for macos - '
|
||||
'you can reconfigure this by running the FlutterFire CLI again.',
|
||||
);
|
||||
case TargetPlatform.windows:
|
||||
throw UnsupportedError(
|
||||
'DefaultFirebaseOptions have not been configured for windows - '
|
||||
'you can reconfigure this by running the FlutterFire CLI again.',
|
||||
);
|
||||
case TargetPlatform.linux:
|
||||
throw UnsupportedError(
|
||||
'DefaultFirebaseOptions have not been configured for linux - '
|
||||
'you can reconfigure this by running the FlutterFire CLI again.',
|
||||
);
|
||||
default:
|
||||
throw UnsupportedError(
|
||||
'DefaultFirebaseOptions are not supported for this platform.',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
static FirebaseOptions web = FirebaseOptions(
|
||||
apiKey: dotenv.get('FIREBASE_WEB_API_KEY', fallback: ''),
|
||||
appId: dotenv.get('FIREBASE_WEB_APP_ID', fallback: ''),
|
||||
messagingSenderId: dotenv.get('FIREBASE_WEB_MESSAGING_SENDER_ID', fallback: ''),
|
||||
projectId: dotenv.get('FIREBASE_WEB_PROJECT_ID', fallback: ''),
|
||||
authDomain: dotenv.get('FIREBASE_WEB_AUTH_DOMAIN', fallback: ''),
|
||||
databaseURL: dotenv.get('FIREBASE_WEB_DATABASE_URL', fallback: ''),
|
||||
storageBucket: dotenv.get('FIREBASE_WEB_STORAGE_BUCKET', fallback: ''),
|
||||
);
|
||||
|
||||
static FirebaseOptions android = FirebaseOptions(
|
||||
apiKey: dotenv.get('FIREBASE_ANDROID_API_KEY', fallback: ''),
|
||||
appId: dotenv.get('FIREBASE_ANDROID_APP_ID', fallback: ''),
|
||||
messagingSenderId: dotenv.get('FIREBASE_ANDROID_MESSAGING_SENDER_ID', fallback: ''),
|
||||
projectId: dotenv.get('FIREBASE_ANDROID_PROJECT_ID', fallback: ''),
|
||||
databaseURL: dotenv.get('FIREBASE_ANDROID_DATABASE_URL', fallback: ''),
|
||||
storageBucket: dotenv.get('FIREBASE_ANDROID_STORAGE_BUCKET', fallback: ''),
|
||||
);
|
||||
|
||||
static FirebaseOptions ios = FirebaseOptions(
|
||||
apiKey: dotenv.get('FIREBASE_IOS_API_KEY', fallback: ''),
|
||||
appId: dotenv.get('FIREBASE_IOS_APP_ID', fallback: ''),
|
||||
messagingSenderId: dotenv.get('FIREBASE_IOS_MESSAGING_SENDER_ID', fallback: ''),
|
||||
projectId: dotenv.get('FIREBASE_IOS_PROJECT_ID', fallback: ''),
|
||||
databaseURL: dotenv.get('FIREBASE_IOS_DATABASE_URL', fallback: ''),
|
||||
storageBucket: dotenv.get('FIREBASE_IOS_STORAGE_BUCKET', fallback: ''),
|
||||
iosClientId: dotenv.get('FIREBASE_IOS_CLIENT_ID', fallback: ''),
|
||||
iosBundleId: dotenv.get('FIREBASE_IOS_BUNDLE_ID', fallback: ''),
|
||||
);
|
||||
}
|
||||
@@ -4,12 +4,12 @@ import 'dart:io';
|
||||
import 'package:firebase_core/firebase_core.dart';
|
||||
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:model/firebase/firebase_dto.dart';
|
||||
import 'package:rxdart/rxdart.dart';
|
||||
import 'package:tmail_ui_user/features/push_notification/domain/usecases/save_firebase_cache_interactor.dart';
|
||||
import 'package:tmail_ui_user/firebase_options.dart';
|
||||
import 'package:tmail_ui_user/features/push_notification/presentation/firebase_options.dart';
|
||||
import 'notification_strings.dart';
|
||||
|
||||
final StreamController<NotificationResponse?> selectNotificationStream =
|
||||
@@ -17,6 +17,7 @@ StreamController<NotificationResponse?>.broadcast();
|
||||
|
||||
@pragma('vm:entry-point')
|
||||
Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async {
|
||||
await dotenv.load(fileName: 'env.file');
|
||||
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
|
||||
await NotificationService.displayPushNotification(message);
|
||||
}
|
||||
@@ -44,13 +45,6 @@ class NotificationService {
|
||||
static get _flutterLocalNotificationsPlugin =>
|
||||
FlutterLocalNotificationsPlugin();
|
||||
|
||||
static final BehaviorSubject<NotificationResponse?>
|
||||
_notificationActionStream =
|
||||
BehaviorSubject<NotificationResponse?>.seeded(null);
|
||||
|
||||
static Stream<NotificationResponse?> get notificationActionStream =>
|
||||
_notificationActionStream.stream;
|
||||
|
||||
static Stream<String> get onTokenRefresh => _firebaseMessaging.onTokenRefresh;
|
||||
static bool _isFlutterLocalNotificationsInitialized = false;
|
||||
|
||||
@@ -130,7 +124,6 @@ class NotificationService {
|
||||
selectNotificationStream.stream
|
||||
.listen((event) => event)
|
||||
.onData((data) async {
|
||||
_notificationActionStream.add(data);
|
||||
switch (data?.notificationResponseType) {
|
||||
case NotificationResponseType.selectedNotification:
|
||||
break;
|
||||
|
||||
@@ -3,7 +3,6 @@ import 'package:core/presentation/state/failure.dart';
|
||||
import 'package:core/presentation/utils/app_toast.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||
import 'package:model/firebase/firebase_dto.dart';
|
||||
import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart';
|
||||
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
|
||||
import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart';
|
||||
@@ -12,8 +11,6 @@ import 'package:tmail_ui_user/features/login/domain/usecases/delete_authority_oi
|
||||
import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_account_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/push_notification/domain/usecases/save_firebase_cache_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/push_notification/presentation/notification_service.dart';
|
||||
import 'package:tmail_ui_user/features/session/domain/state/get_session_state.dart';
|
||||
import 'package:tmail_ui_user/features/session/domain/usecases/get_session_interactor.dart';
|
||||
import 'package:tmail_ui_user/main/exceptions/remote_exception.dart';
|
||||
@@ -29,7 +26,6 @@ class SessionController extends ReloadableController {
|
||||
final CachingManager _cachingManager;
|
||||
final DeleteAuthorityOidcInteractor _deleteAuthorityOidcInteractor;
|
||||
final AuthorizationInterceptors _authorizationInterceptors;
|
||||
final SaveFirebaseCacheInteractor _saveFirebaseCacheInteractor;
|
||||
final AppToast _appToast;
|
||||
final DynamicUrlInterceptors _dynamicUrlInterceptors;
|
||||
|
||||
@@ -44,19 +40,13 @@ class SessionController extends ReloadableController {
|
||||
this._authorizationInterceptors,
|
||||
this._appToast,
|
||||
this._dynamicUrlInterceptors,
|
||||
this._saveFirebaseCacheInteractor,
|
||||
) : super(logoutOidcInteractor,
|
||||
deleteAuthorityOidcInteractor,
|
||||
getAuthenticatedAccountInteractor);
|
||||
|
||||
@override
|
||||
Future<void> onReady() async {
|
||||
void onReady() {
|
||||
super.onReady();
|
||||
NotificationService.initializeNotificationService(
|
||||
onDidReceiveNotificationResponse);
|
||||
NotificationService.onTokenRefresh.listen((token) {
|
||||
_saveFirebaseCacheInteractor.execute(FirebaseDto(token));
|
||||
});
|
||||
final arguments = Get.arguments;
|
||||
if (arguments != null && arguments is String) {
|
||||
_getSession();
|
||||
|
||||
@@ -24,7 +24,6 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_a
|
||||
import 'package:tmail_ui_user/features/login/domain/usecases/get_credential_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_token_oidc_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/push_notification/domain/usecases/save_firebase_cache_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/session/domain/usecases/get_session_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/session/presentation/session_controller.dart';
|
||||
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
|
||||
@@ -45,7 +44,6 @@ class SessionPageBindings extends BaseBindings {
|
||||
Get.find<AuthorizationInterceptors>(),
|
||||
Get.find<AppToast>(),
|
||||
Get.find<DynamicUrlInterceptors>(),
|
||||
Get.find<SaveFirebaseCacheInteractor>(),
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,14 +1,10 @@
|
||||
import 'package:core/core.dart';
|
||||
import 'package:firebase_core/firebase_core.dart';
|
||||
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:tmail_ui_user/features/caching/config/hive_cache_config.dart';
|
||||
import 'package:tmail_ui_user/features/push_notification/presentation/notification_service.dart';
|
||||
import 'package:tmail_ui_user/firebase_options.dart';
|
||||
import 'package:tmail_ui_user/main/bindings/main_bindings.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations_delegate.dart';
|
||||
@@ -26,13 +22,6 @@ void main() async {
|
||||
statusBarColor: Colors.black,
|
||||
statusBarIconBrightness: Brightness.light,
|
||||
));
|
||||
|
||||
try {
|
||||
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
|
||||
FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler);
|
||||
} on FirebaseException catch (e) {
|
||||
debugPrint(e.toString());
|
||||
}
|
||||
await MainBindings().dependencies();
|
||||
await HiveCacheConfig().setUp();
|
||||
await HiveCacheConfig.initializeEncryptionKey();
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:tmail_ui_user/features/push_notification/presentation/firebase_bindings.dart';
|
||||
import 'package:tmail_ui_user/main/bindings/core/core_bindings.dart';
|
||||
import 'package:tmail_ui_user/main/bindings/credential/credential_bindings.dart';
|
||||
import 'package:tmail_ui_user/main/bindings/local/local_bindings.dart';
|
||||
@@ -18,6 +17,5 @@ class MainBindings extends Bindings {
|
||||
CredentialBindings().dependencies();
|
||||
NetWorkConnectionBindings().dependencies();
|
||||
SessionBindings().dependencies();
|
||||
FireBaseBindings().dependencies();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user