TF-2871 Handle click notification to open detailed email on iOS

This commit is contained in:
dab246
2024-07-11 09:46:23 +07:00
committed by Dat H. Pham
parent 9ffd20f1a7
commit 501d4d38d9
32 changed files with 416 additions and 354 deletions
@@ -94,7 +94,6 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/comp
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/download/download_task_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/draggable_app_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/preview_email_arguments.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/refresh_action_view_event.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
@@ -153,6 +152,7 @@ import 'package:tmail_ui_user/main/routes/navigation_router.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/routes/route_utils.dart';
import 'package:tmail_ui_user/main/utils/email_receive_manager.dart';
import 'package:tmail_ui_user/main/utils/ios_notification_manager.dart';
import 'package:uuid/uuid.dart';
class MailboxDashBoardController extends ReloadableController {
@@ -197,6 +197,7 @@ class MailboxDashBoardController extends ReloadableController {
GetMailboxStateToRefreshInteractor? _getMailboxStateToRefreshInteractor;
DeleteMailboxStateToRefreshInteractor? _deleteMailboxStateToRefreshInteractor;
GetAutoCompleteInteractor? _getAutoCompleteInteractor;
IOSNotificationManager? _iosNotificationManager;
final scaffoldKey = GlobalKey<ScaffoldState>();
final selectedMailbox = Rxn<PresentationMailbox>();
@@ -234,6 +235,8 @@ class MailboxDashBoardController extends ReloadableController {
late StreamSubscription _emailContentStreamSubscription;
late StreamSubscription _fileReceiveManagerStreamSubscription;
StreamSubscription? _currentEmailIdInNotificationIOSStreamSubscription;
final StreamController<Either<Failure, Success>> _progressStateController =
StreamController<Either<Failure, Success>>.broadcast();
Stream<Either<Failure, Success>> get progressState => _progressStateController.stream;
@@ -272,7 +275,7 @@ class MailboxDashBoardController extends ReloadableController {
);
@override
void onInit() async {
void onInit() {
_registerStreamListener();
BackButtonInterceptor.add(_onBackButtonInterceptor, name: AppRoutes.dashboard);
WidgetsBinding.instance.addPostFrameCallback((_) async {
@@ -286,6 +289,9 @@ class MailboxDashBoardController extends ReloadableController {
_registerPendingEmailAddress();
_registerPendingEmailContents();
_registerPendingFileInfo();
if (PlatformInfo.isIOS) {
_registerPendingCurrentEmailIdInNotification();
}
_handleArguments();
super.onReady();
}
@@ -349,7 +355,7 @@ class MailboxDashBoardController extends ReloadableController {
} else if (success is GetAppDashboardConfigurationSuccess) {
appGridDashboardController.handleShowAppDashboard(success.linagoraApplications);
} else if(success is GetEmailByIdSuccess) {
_moveToEmailDetailedView(success);
openEmailDetailedView(success.email);
} else if (success is StoreSendingEmailSuccess) {
_handleStoreSendingEmailSuccess(success);
} else if (success is GetAllSendingEmailSuccess) {
@@ -392,7 +398,7 @@ class MailboxDashBoardController extends ReloadableController {
} else if (failure is MarkAsMailboxReadFailure) {
_markAsReadMailboxFailure(failure);
} else if (failure is GetEmailByIdFailure) {
_handleGetEmailDetailedFailed(failure);
_handleGetEmailByIdFailure(failure);
} else if (failure is RestoreDeletedMessageFailure) {
_handleRestoreDeletedMessageFailed();
} else if (failure is GetRestoredDeletedMessageFailure) {
@@ -439,6 +445,18 @@ class MailboxDashBoardController extends ReloadableController {
});
}
void _registerPendingCurrentEmailIdInNotification() {
_iosNotificationManager = getBinding<IOSNotificationManager>();
_currentEmailIdInNotificationIOSStreamSubscription = _iosNotificationManager
?.pendingCurrentEmailIdInNotification.stream
.listen((emailId) {
if (emailId != null) {
_iosNotificationManager?.clearPendingCurrentEmailId();
_handleNotificationMessageFromEmailId(emailId);
}
});
}
void _registerStreamListener() {
progressState.listen((state) {
viewStateMarkAsReadMailbox.value = state;
@@ -455,7 +473,7 @@ class MailboxDashBoardController extends ReloadableController {
_notificationManager.localNotificationStream.listen(_handleClickLocalNotificationOnForeground);
}
void _handleClickLocalNotificationOnTerminated() async {
Future<void> _handleClickNotificationOnAndroidInTerminated() async {
_notificationManager.activatedNotificationClickedOnTerminate = true;
final notificationResponse = await _notificationManager.getCurrentNotificationResponse();
log('MailboxDashBoardController::_handleClickLocalNotificationOnTerminated():payload: ${notificationResponse?.payload}');
@@ -464,13 +482,11 @@ class MailboxDashBoardController extends ReloadableController {
void _handleArguments() {
final arguments = Get.arguments;
log('MailboxDashBoardController::_getSessionCurrent(): arguments = $arguments');
log('MailboxDashBoardController::_handleArguments():Arguments = ${arguments.runtimeType}');
if (arguments is Session) {
_handleSessionFromArguments(arguments);
} else if (arguments is MailtoArguments) {
_handleMailtoURL(arguments);
} else if (arguments is PreviewEmailArguments) {
_handleOpenEmailAction(arguments);
} else {
dispatchRoute(DashboardRoutes.thread);
reload();
@@ -501,11 +517,7 @@ class MailboxDashBoardController extends ReloadableController {
void _handleSessionFromArguments(Session session) {
log('MailboxDashBoardController::_handleSession:');
updateAuthenticationAccount(
session,
session.personalAccount.accountId,
session.username
);
updateAccountCache(session);
_setUpComponentsFromSession(session);
@@ -513,15 +525,15 @@ class MailboxDashBoardController extends ReloadableController {
_handleComposerCache();
}
if (PlatformInfo.isMobile && !_notificationManager.isNotificationClickedOnTerminate) {
_handleClickLocalNotificationOnTerminated();
if (PlatformInfo.isAndroid && !_notificationManager.isNotificationClickedOnTerminate) {
_handleClickNotificationOnAndroidInTerminated();
} else {
dispatchRoute(DashboardRoutes.thread);
}
}
void _setUpComponentsFromSession(Session session) {
final currentAccountId = session.personalAccount.accountId;
final currentAccountId = session.accountId;
sessionCurrent = session;
accountId.value = currentAccountId;
@@ -546,13 +558,6 @@ class MailboxDashBoardController extends ReloadableController {
_handleSessionFromArguments(arguments.session);
}
void _handleOpenEmailAction(PreviewEmailArguments arguments) {
log('MailboxDashBoardController::_handleOpenEmailAction:arguments: $arguments');
dispatchRoute(DashboardRoutes.waiting);
_handleSessionFromArguments(arguments.session);
_handleNotificationMessageFromEmailId(arguments.emailId);
}
void _getVacationResponse() {
if (accountId.value != null && _getAllVacationInteractor != null) {
consumeState(_getAllVacationInteractor!.execute(accountId.value!));
@@ -1794,14 +1799,7 @@ class MailboxDashBoardController extends ReloadableController {
));
}
void _moveToEmailDetailedView(GetEmailByIdSuccess success) {
log('MailboxDashBoardController::_moveToEmailDetailedView(): ${success.email}');
setSelectedEmail(success.email);
dispatchRoute(DashboardRoutes.emailDetailed);
}
void _handleGetEmailDetailedFailed(GetEmailByIdFailure failure) {
logError('MailboxDashBoardController::_handleGetEmailDetailedFailed(): $failure');
void _handleGetEmailByIdFailure(GetEmailByIdFailure failure) {
dispatchRoute(DashboardRoutes.thread);
}
@@ -2552,6 +2550,10 @@ class MailboxDashBoardController extends ReloadableController {
@override
void onClose() {
_emailReceiveManager.closeEmailReceiveManagerStream();
if (PlatformInfo.isIOS) {
_iosNotificationManager?.dispose();
_currentEmailIdInNotificationIOSStreamSubscription?.cancel();
}
_emailAddressStreamSubscription.cancel();
_emailContentStreamSubscription.cancel();
_fileReceiveManagerStreamSubscription.cancel();