diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index e6ef49d68..bb7ec1782 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -90,6 +90,17 @@
+
+
+
+
+
+
+
+
+
();
_iosNotificationManager?.listenClickNotification();
}
+
+ void _registerDeepLinks() {
+ _deepLinksManager = getBinding();
+ }
+
+ Future _handleDeepLinks() async {
+ final deepLinkData = await _deepLinksManager?.getDeepLinkData();
+ log('HomeController::_handleDeepLinks:DeepLinkData = $deepLinkData');
+ if (deepLinkData == null) {
+ goToLogin();
+ return;
+ }
+
+ if (deepLinkData.path == AppConfig.openAppHostDeepLink) {
+ _handleOpenApp(deepLinkData);
+ return;
+ }
+
+ goToLogin();
+ }
+
+ void _handleOpenApp(DeepLinkData deepLinkData) {
+ if (deepLinkData.isValidToken()) {
+ setDataToInterceptors(
+ baseUrl: AppConfig.saasJmapServerUrl,
+ tokenOIDC: deepLinkData.getTokenOIDC(),
+ oidcConfiguration: OIDCConfiguration(
+ authority: AppConfig.saasRegistrationUrl,
+ clientId: OIDCConstant.clientId,
+ scopes: AppConfig.oidcScopes,
+ )
+ );
+ getSessionAction();
+ } else {
+ goToLogin();
+ }
+ }
+
+ @override
+ void handleFailureViewState(Failure failure) {
+ if (PlatformInfo.isMobile && isNotSignedIn(failure)) {
+ _handleDeepLinks();
+ } else {
+ super.handleFailureViewState(failure);
+ }
+ }
}
\ No newline at end of file
diff --git a/lib/main/bindings/core/core_bindings.dart b/lib/main/bindings/core/core_bindings.dart
index c932c96ba..a3efcc36d 100644
--- a/lib/main/bindings/core/core_bindings.dart
+++ b/lib/main/bindings/core/core_bindings.dart
@@ -18,6 +18,7 @@ import 'package:tmail_ui_user/features/caching/utils/local_storage_manager.dart'
import 'package:tmail_ui_user/features/caching/utils/session_storage_manager.dart';
import 'package:tmail_ui_user/features/sending_queue/presentation/utils/sending_queue_isolate_manager.dart';
import 'package:tmail_ui_user/main/utils/app_config.dart';
+import 'package:tmail_ui_user/main/deep_links/deep_links_manager.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:tmail_ui_user/main/utils/toast_manager.dart';
@@ -75,6 +76,9 @@ class CoreBindings extends Bindings {
if (PlatformInfo.isIOS) {
Get.put(IOSNotificationManager());
}
+ if (PlatformInfo.isMobile) {
+ Get.put(DeepLinksManager());
+ }
Get.put(PreviewEmlFileUtils());
}
diff --git a/lib/main/deep_links/deep_link_data.dart b/lib/main/deep_links/deep_link_data.dart
new file mode 100644
index 000000000..f7ff0ee5d
--- /dev/null
+++ b/lib/main/deep_links/deep_link_data.dart
@@ -0,0 +1,45 @@
+import 'package:equatable/equatable.dart';
+import 'package:model/model.dart';
+
+class DeepLinkData with EquatableMixin {
+ final String path;
+ final String? accessToken;
+ final String? refreshToken;
+ final String? idToken;
+ final int? expiresIn;
+ final String? username;
+
+ DeepLinkData({
+ required this.path,
+ this.accessToken,
+ this.refreshToken,
+ this.idToken,
+ this.expiresIn,
+ this.username,
+ });
+
+ bool isValidToken() => accessToken?.isNotEmpty == true && username?.isNotEmpty == true;
+
+ TokenOIDC getTokenOIDC() {
+ final expiredTime = expiresIn == null
+ ? null
+ : DateTime.now().add(Duration(seconds: expiresIn!));
+
+ return TokenOIDC(
+ accessToken!,
+ TokenId(idToken ?? ''),
+ refreshToken ?? '',
+ expiredTime: expiredTime,
+ );
+ }
+
+ @override
+ List