TF-3278 Handle open app via deep link at MailboxDashboard screen

This commit is contained in:
dab246
2024-11-22 23:30:37 +07:00
committed by Dat H. Pham
parent 8022559bc2
commit 223fdbf1fb
59 changed files with 1058 additions and 429 deletions
@@ -6,6 +6,7 @@ import 'package:core/utils/app_logger.dart';
import 'package:core/utils/platform_info.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_downloader/flutter_downloader.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:model/account/personal_account.dart';
import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart';
@@ -21,9 +22,12 @@ import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_lo
import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_search_cache_interactor.dart';
import 'package:tmail_ui_user/features/home/domain/state/auto_sign_in_via_deep_link_state.dart';
import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart';
import 'package:tmail_ui_user/features/login/domain/exceptions/logout_exception.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_credential_state.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_stored_token_oidc_state.dart';
import 'package:tmail_ui_user/main/deep_links/deep_link_data.dart';
import 'package:tmail_ui_user/features/login/presentation/model/login_navigate_arguments.dart';
import 'package:tmail_ui_user/features/login/presentation/model/login_navigate_type.dart';
import 'package:tmail_ui_user/main/deep_links/open_app_deep_link_data.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
@@ -65,7 +69,7 @@ class HomeController extends ReloadableController {
@override
void onReady() {
_cleanupCache();
_handleNavigateToScreen();
super.onReady();
}
@@ -76,6 +80,11 @@ class HomeController extends ReloadableController {
arguments: session);
}
@override
void onCancelReconnectWhenSessionExpired() {
clearDataAndGoToLoginPage();
}
void _initFlutterDownloader() {
FlutterDownloader
.initialize(debug: kDebugMode)
@@ -84,6 +93,15 @@ class HomeController extends ReloadableController {
static void downloadCallback(String id, DownloadTaskStatus status, int progress) {}
void _handleNavigateToScreen() {
final arguments = Get.arguments;
if (arguments is LoginNavigateArguments) {
_handleLoginNavigateArguments(arguments);
} else {
_cleanupCache();
}
}
Future<void> _cleanupCache() async {
await HiveCacheConfig.instance.onUpgradeDatabase(cachingManager);
@@ -95,6 +113,17 @@ class HomeController extends ReloadableController {
], eagerError: true).then((_) => getAuthenticatedAccountAction());
}
void _handleLoginNavigateArguments(LoginNavigateArguments arguments) {
switch (arguments.navigateType) {
case LoginNavigateType.autoSignIn:
_handleAutoSignInViaDeepLinkSuccess(arguments.autoSignInViaDeepLinkSuccess!);
break;
default:
_cleanupCache();
break;
}
}
void _registerReceivingFileSharing() {
_emailReceiveManager.registerReceivingFileSharingStreamWhileAppClosed();
}
@@ -124,7 +153,7 @@ class HomeController extends ReloadableController {
void _handleLogOutAndSignInNewAccount({
required Success authenticationViewStateSuccess,
required PersonalAccount personalAccount,
required DeepLinkData deepLinkData,
required OpenAppDeepLinkData openAppDeepLinkData,
}) {
if (authenticationViewStateSuccess is GetCredentialViewState) {
setDataToInterceptors(
@@ -143,14 +172,14 @@ class HomeController extends ReloadableController {
_getSessionActionToLogOut(
authenticationViewStateSuccess: authenticationViewStateSuccess,
personalAccount: personalAccount,
deepLinkData: deepLinkData,
openAppDeepLinkData: openAppDeepLinkData,
);
}
Future<void> _getSessionActionToLogOut({
required Success authenticationViewStateSuccess,
required PersonalAccount personalAccount,
required DeepLinkData deepLinkData,
required OpenAppDeepLinkData openAppDeepLinkData,
}) async {
try {
final sessionViewState = await getSessionInteractor.execute().last;
@@ -161,7 +190,7 @@ class HomeController extends ReloadableController {
sessionViewStateSuccess: success,
authenticationViewStateSuccess: authenticationViewStateSuccess,
personalAccount: personalAccount,
deepLinkData: deepLinkData,
openAppDeepLinkData: openAppDeepLinkData,
),
);
} catch (e) {
@@ -174,18 +203,27 @@ class HomeController extends ReloadableController {
required Success sessionViewStateSuccess,
required Success authenticationViewStateSuccess,
required PersonalAccount personalAccount,
required DeepLinkData deepLinkData,
required OpenAppDeepLinkData openAppDeepLinkData,
}) {
if (sessionViewStateSuccess is GetSessionSuccess) {
logoutToSignInNewAccount(
session: sessionViewStateSuccess.session,
accountId: personalAccount.accountId!,
onFailureCallback: () =>
_continueUsingTheApp(authenticationViewStateSuccess),
onFailureCallback: ({exception}) {
if (exception is UserCancelledLogoutOIDCFlowException) {
_deepLinksManager?.autoSignInViaDeepLink(
openAppDeepLinkData: openAppDeepLinkData,
onFailureCallback: () => _continueUsingTheApp(authenticationViewStateSuccess),
onAutoSignInSuccessCallback: _handleAutoSignInViaDeepLinkSuccess,
);
} else {
_continueUsingTheApp(authenticationViewStateSuccess);
}
},
onSuccessCallback: () => _deepLinksManager?.autoSignInViaDeepLink(
deepLinkData: deepLinkData,
openAppDeepLinkData: openAppDeepLinkData,
onFailureCallback: () => _continueUsingTheApp(authenticationViewStateSuccess),
onSuccessCallback: _handleAutoSignInViaDeepLinkSuccess,
onAutoSignInSuccessCallback: _handleAutoSignInViaDeepLinkSuccess,
),
);
} else {
@@ -234,8 +272,19 @@ class HomeController extends ReloadableController {
@override
void handleFailureViewState(Failure failure) {
if (_validateToHandleDeepLinksNotSignedIn(failure)) {
_deepLinksManager!.handleDeepLinksWhenAppTerminatedNotSignedIn(
onSuccessCallback: _handleAutoSignInViaDeepLinkSuccess,
_deepLinksManager!.handleDeepLinksWhenAppTerminated(
onSuccessCallback: (deepLinkData) {
if (deepLinkData is OpenAppDeepLinkData) {
_deepLinksManager!.handleOpenAppDeepLinks(
openAppDeepLinkData: deepLinkData,
isSignedIn: false,
onFailureCallback: goToLogin,
onAutoSignInSuccessCallback: _handleAutoSignInViaDeepLinkSuccess
);
} else {
goToLogin();
}
},
onFailureCallback: goToLogin,
);
} else {
@@ -248,14 +297,25 @@ class HomeController extends ReloadableController {
if (_validateToHandleDeepLinksSignedIn(success)) {
final personalAccount = _getPersonalAccountFromViewStateSuccess(success);
_deepLinksManager!.handleDeepLinksWhenAppTerminatedSignedIn(
username: personalAccount?.userName?.value,
_deepLinksManager!.handleDeepLinksWhenAppTerminated(
onSuccessCallback: (deepLinkData) {
if (deepLinkData is OpenAppDeepLinkData) {
_deepLinksManager!.handleOpenAppDeepLinks(
openAppDeepLinkData: deepLinkData,
isSignedIn: true,
username: personalAccount?.userName,
onConfirmLogoutCallback: (openAppDeepLinkData) => _handleLogOutAndSignInNewAccount(
authenticationViewStateSuccess: success,
personalAccount: personalAccount!,
openAppDeepLinkData: openAppDeepLinkData,
),
onFailureCallback: () => _continueUsingTheApp(success),
);
} else {
_continueUsingTheApp(success);
}
},
onFailureCallback: () => _continueUsingTheApp(success),
onConfirmCallback: (deepLinkData) => _handleLogOutAndSignInNewAccount(
authenticationViewStateSuccess: success,
personalAccount: personalAccount!,
deepLinkData: deepLinkData,
),
);
} else {
super.handleSuccessViewState(success);