TF-1202: Configure ENV for FCM

This commit is contained in:
ManhNTX
2022-11-18 08:42:40 +07:00
committed by Dat H. Pham
parent f94cfe7ee8
commit 972402bc59
11 changed files with 153 additions and 37 deletions
+36
View File
@@ -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>
+18 -1
View File
@@ -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 {
@@ -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>(),
));
}
-11
View File
@@ -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();
-2
View File
@@ -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();
}
}