diff --git a/lib/features/composer/presentation/composer_bindings.dart b/lib/features/composer/presentation/composer_bindings.dart index b4958d9b7..daba116bc 100644 --- a/lib/features/composer/presentation/composer_bindings.dart +++ b/lib/features/composer/presentation/composer_bindings.dart @@ -59,6 +59,7 @@ import 'package:tmail_ui_user/features/upload/presentation/controller/upload_con import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; +import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart'; import 'package:uuid/uuid.dart'; import 'package:worker_manager/worker_manager.dart'; @@ -98,6 +99,7 @@ class ComposerBindings extends BaseBindings { Get.find())); Get.lazyPut(() => StateDataSourceImpl( Get.find(), + Get.find(), Get.find() )); Get.lazyPut(() => EmailHiveCacheDataSourceImpl( diff --git a/lib/features/destination_picker/presentation/destination_picker_bindings.dart b/lib/features/destination_picker/presentation/destination_picker_bindings.dart index 0912d977e..ef7517852 100644 --- a/lib/features/destination_picker/presentation/destination_picker_bindings.dart +++ b/lib/features/destination_picker/presentation/destination_picker_bindings.dart @@ -28,6 +28,7 @@ import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart'; import 'package:tmail_ui_user/features/thread/data/network/thread_isolate_worker.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; +import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart'; class DestinationPickerBindings extends BaseBindings { @@ -72,6 +73,7 @@ class DestinationPickerBindings extends BaseBindings { Get.find())); Get.lazyPut(() => StateDataSourceImpl( Get.find(), + Get.find(), Get.find() )); Get.lazyPut(() => EmailDataSourceImpl( diff --git a/lib/features/email/presentation/bindings/email_bindings.dart b/lib/features/email/presentation/bindings/email_bindings.dart index 180bfbf09..0563a5a03 100644 --- a/lib/features/email/presentation/bindings/email_bindings.dart +++ b/lib/features/email/presentation/bindings/email_bindings.dart @@ -47,6 +47,7 @@ import 'package:tmail_ui_user/features/offline_mode/manager/sending_email_cache_ import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; +import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart'; class EmailBindings extends BaseBindings { @@ -92,6 +93,7 @@ class EmailBindings extends BaseBindings { Get.find())); Get.lazyPut(() => StateDataSourceImpl( Get.find(), + Get.find(), Get.find() )); Get.lazyPut(() => EmailHiveCacheDataSourceImpl( diff --git a/lib/features/mailbox/data/datasource_impl/state_datasource_impl.dart b/lib/features/mailbox/data/datasource_impl/state_datasource_impl.dart index 227f39060..3539ad7c5 100644 --- a/lib/features/mailbox/data/datasource_impl/state_datasource_impl.dart +++ b/lib/features/mailbox/data/datasource_impl/state_datasource_impl.dart @@ -1,4 +1,5 @@ +import 'package:core/core.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/state.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; @@ -7,13 +8,19 @@ import 'package:tmail_ui_user/features/mailbox/data/local/state_cache_manager.da 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/main/exceptions/exception_thrower.dart'; +import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart'; class StateDataSourceImpl extends StateDataSource { final StateCacheManager _stateCacheManager; + final IOSSharingManager _iosSharingManager; final ExceptionThrower _exceptionThrower; - StateDataSourceImpl(this._stateCacheManager, this._exceptionThrower); + StateDataSourceImpl( + this._stateCacheManager, + this._iosSharingManager, + this._exceptionThrower + ); @override Future getState(AccountId accountId, UserName userName, StateType stateType) { @@ -25,7 +32,14 @@ class StateDataSourceImpl extends StateDataSource { @override Future saveState(AccountId accountId, UserName userName, StateCache stateCache) { return Future.sync(() async { - return await _stateCacheManager.saveState(accountId, userName, stateCache); + await _stateCacheManager.saveState(accountId, userName, stateCache); + if (PlatformInfo.isIOS && stateCache.type == StateType.email) { + final emailDeliveryStateKeychain = await _iosSharingManager.getEmailDeliveryStateFromKeychain(accountId); + if (emailDeliveryStateKeychain == null || emailDeliveryStateKeychain.isEmpty) { + await _iosSharingManager.updateEmailDeliveryStateInKeyChain(accountId, stateCache.state); + } + } + return Future.value(null); }).catchError(_exceptionThrower.throwException); } } \ No newline at end of file diff --git a/lib/features/mailbox/presentation/mailbox_bindings.dart b/lib/features/mailbox/presentation/mailbox_bindings.dart index 293097fd8..245801892 100644 --- a/lib/features/mailbox/presentation/mailbox_bindings.dart +++ b/lib/features/mailbox/presentation/mailbox_bindings.dart @@ -33,6 +33,7 @@ import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart'; import 'package:tmail_ui_user/features/thread/data/network/thread_isolate_worker.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; +import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart'; class MailboxBindings extends BaseBindings { @@ -82,6 +83,7 @@ class MailboxBindings extends BaseBindings { Get.find())); Get.lazyPut(() => StateDataSourceImpl( Get.find(), + Get.find(), Get.find() )); Get.lazyPut(() => EmailDataSourceImpl( diff --git a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart index 939570cb3..4eac17cec 100644 --- a/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/bindings/mailbox_dashboard_bindings.dart @@ -110,6 +110,7 @@ import 'package:tmail_ui_user/features/thread/domain/usecases/search_more_email_ import 'package:tmail_ui_user/features/thread/presentation/thread_bindings.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; +import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart'; class MailboxDashBoardBindings extends BaseBindings { @@ -202,6 +203,7 @@ class MailboxDashBoardBindings extends BaseBindings { Get.lazyPut(() => LocalThreadDataSourceImpl(Get.find(), Get.find())); Get.lazyPut(() => StateDataSourceImpl( Get.find(), + Get.find(), Get.find() )); Get.lazyPut(() => MailboxDataSourceImpl( diff --git a/lib/features/manage_account/presentation/mailbox_visibility/bindings/mailbox_visibility_interactor_bindings.dart b/lib/features/manage_account/presentation/mailbox_visibility/bindings/mailbox_visibility_interactor_bindings.dart index 15691a257..62cc56e82 100644 --- a/lib/features/manage_account/presentation/mailbox_visibility/bindings/mailbox_visibility_interactor_bindings.dart +++ b/lib/features/manage_account/presentation/mailbox_visibility/bindings/mailbox_visibility_interactor_bindings.dart @@ -18,6 +18,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_mailbox import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_multiple_mailbox_interactor.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; +import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart'; class MailboxVisibilityInteractorBindings extends InteractorsBindings { @@ -38,6 +39,7 @@ class MailboxVisibilityInteractorBindings extends InteractorsBindings { Get.find())); Get.lazyPut(() => StateDataSourceImpl( Get.find(), + Get.find(), Get.find() )); } diff --git a/lib/features/offline_mode/bindings/sending_email_interactor_bindings.dart b/lib/features/offline_mode/bindings/sending_email_interactor_bindings.dart index 36f9c973c..4048f3993 100644 --- a/lib/features/offline_mode/bindings/sending_email_interactor_bindings.dart +++ b/lib/features/offline_mode/bindings/sending_email_interactor_bindings.dart @@ -31,6 +31,7 @@ import 'package:tmail_ui_user/features/offline_mode/manager/sending_email_cache_ import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; +import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart'; class SendEmailInteractorBindings extends InteractorsBindings { @@ -59,6 +60,7 @@ class SendEmailInteractorBindings extends InteractorsBindings { Get.find())); Get.lazyPut(() => StateDataSourceImpl( Get.find(), + Get.find(), Get.find())); Get.lazyPut(() => EmailHiveCacheDataSourceImpl( Get.find(), diff --git a/lib/features/push_notification/data/extensions/keychain_sharing_session_extension.dart b/lib/features/push_notification/data/extensions/keychain_sharing_session_extension.dart new file mode 100644 index 000000000..cb5d67d9d --- /dev/null +++ b/lib/features/push_notification/data/extensions/keychain_sharing_session_extension.dart @@ -0,0 +1,19 @@ + +import 'package:tmail_ui_user/features/push_notification/data/keychain/keychain_sharing_session.dart'; + +extension KeychainSharingSessionExtension on KeychainSharingSession { + + KeychainSharingSession updating({String? emailDeliveryState}) { + return KeychainSharingSession( + accountId: accountId, + userName: userName, + authenticationType: authenticationType, + apiUrl: apiUrl, + emailState: emailDeliveryState ?? emailDeliveryState, + tokenOIDC: tokenOIDC, + basicAuth: basicAuth, + tokenEndpoint: tokenEndpoint, + oidcScopes: oidcScopes, + ); + } +} \ No newline at end of file diff --git a/lib/features/push_notification/presentation/bindings/fcm_interactor_bindings.dart b/lib/features/push_notification/presentation/bindings/fcm_interactor_bindings.dart index d5eb8a9d0..f8a668ecb 100644 --- a/lib/features/push_notification/presentation/bindings/fcm_interactor_bindings.dart +++ b/lib/features/push_notification/presentation/bindings/fcm_interactor_bindings.dart @@ -59,6 +59,7 @@ import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart'; import 'package:tmail_ui_user/features/thread/data/network/thread_isolate_worker.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; +import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart'; class FcmInteractorBindings extends InteractorsBindings { @@ -102,6 +103,7 @@ class FcmInteractorBindings extends InteractorsBindings { Get.find())); Get.lazyPut(() => StateDataSourceImpl( Get.find(), + Get.find(), Get.find() )); Get.lazyPut(() => EmailHiveCacheDataSourceImpl( diff --git a/lib/features/push_notification/presentation/listener/email_change_listener.dart b/lib/features/push_notification/presentation/listener/email_change_listener.dart index 0674eff04..a3d8f21ac 100644 --- a/lib/features/push_notification/presentation/listener/email_change_listener.dart +++ b/lib/features/push_notification/presentation/listener/email_change_listener.dart @@ -47,6 +47,7 @@ import 'package:tmail_ui_user/features/push_notification/presentation/listener/c import 'package:tmail_ui_user/features/push_notification/presentation/notification/local_notification_manager.dart'; import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; +import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart'; class EmailChangeListener extends ChangeListener { @@ -62,6 +63,7 @@ class EmailChangeListener extends ChangeListener { GetListDetailedEmailByIdInteractor? _getListDetailedEmailByIdInteractor; DynamicUrlInterceptors? _dynamicUrlInterceptors; StoreListNewEmailInteractor? _storeListNewEmailInteractor; + IOSSharingManager? _iosSharingManager; jmap.State? _newStateEmailDelivery; AccountId? _accountId; @@ -83,6 +85,7 @@ class EmailChangeListener extends ChangeListener { _getListDetailedEmailByIdInteractor = getBinding(); _dynamicUrlInterceptors = getBinding(); _storeListNewEmailInteractor = getBinding(); + _iosSharingManager = getBinding(); } catch (e) { logError('EmailChangeListener::_internal(): IS NOT REGISTERED: ${e.toString()}'); } @@ -133,8 +136,11 @@ class EmailChangeListener extends ChangeListener { _userName = userName; log('EmailChangeListener::_pushNotificationAction():newState: $newState'); - if (PlatformInfo.isWeb || PlatformInfo.isIOS) { + if (PlatformInfo.isWeb) { _storeEmailDeliveryStateAction(accountId, userName, _newStateEmailDelivery!); + } else if (PlatformInfo.isIOS) { + _storeEmailDeliveryStateAction(accountId, userName, _newStateEmailDelivery!); + _updateKeychainSharingSession(accountId, _newStateEmailDelivery!.value); } else if (PlatformInfo.isAndroid) { _getStoredEmailDeliveryState(accountId, userName); } @@ -322,4 +328,15 @@ class EmailChangeListener extends ChangeListener { )); } } + + void _updateKeychainSharingSession(AccountId accountId, String emailDeliveryState) async { + if (_iosSharingManager == null) { + return; + } + + final emailDeliveryStateKeychain = await _iosSharingManager!.getEmailDeliveryStateFromKeychain(accountId); + if (emailDeliveryStateKeychain == null || emailDeliveryStateKeychain.isEmpty) { + await _iosSharingManager!.updateEmailDeliveryStateInKeyChain(accountId, emailDeliveryState); + } + } } \ No newline at end of file diff --git a/lib/features/rules_filter_creator/presentation/rules_filter_creator_bindings.dart b/lib/features/rules_filter_creator/presentation/rules_filter_creator_bindings.dart index 965cb484c..55886d97d 100644 --- a/lib/features/rules_filter_creator/presentation/rules_filter_creator_bindings.dart +++ b/lib/features/rules_filter_creator/presentation/rules_filter_creator_bindings.dart @@ -18,6 +18,7 @@ import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_na import 'package:tmail_ui_user/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; +import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart'; class RulesFilterCreatorBindings extends BaseBindings { @@ -57,6 +58,7 @@ class RulesFilterCreatorBindings extends BaseBindings { Get.find())); Get.lazyPut(() => StateDataSourceImpl( Get.find(), + Get.find(), Get.find() )); } diff --git a/lib/features/search/mailbox/presentation/search_mailbox_bindings.dart b/lib/features/search/mailbox/presentation/search_mailbox_bindings.dart index 25b197e7c..0971f7275 100644 --- a/lib/features/search/mailbox/presentation/search_mailbox_bindings.dart +++ b/lib/features/search/mailbox/presentation/search_mailbox_bindings.dart @@ -27,6 +27,7 @@ import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_na import 'package:tmail_ui_user/features/search/mailbox/presentation/search_mailbox_controller.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; +import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart'; class SearchMailboxBindings extends BaseBindings { @@ -66,6 +67,7 @@ class SearchMailboxBindings extends BaseBindings { )); Get.lazyPut(() => StateDataSourceImpl( Get.find(), + Get.find(), Get.find() )); } diff --git a/lib/features/thread/presentation/thread_bindings.dart b/lib/features/thread/presentation/thread_bindings.dart index 3b85f95e8..a979a6f19 100644 --- a/lib/features/thread/presentation/thread_bindings.dart +++ b/lib/features/thread/presentation/thread_bindings.dart @@ -22,6 +22,7 @@ import 'package:tmail_ui_user/features/thread/domain/usecases/search_more_email_ import 'package:tmail_ui_user/features/thread/presentation/thread_controller.dart'; import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; +import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart'; class ThreadBindings extends BaseBindings { @@ -52,6 +53,7 @@ class ThreadBindings extends BaseBindings { Get.lazyPut(() => LocalThreadDataSourceImpl(Get.find(), Get.find())); Get.lazyPut(() => StateDataSourceImpl( Get.find(), + Get.find(), Get.find() )); } diff --git a/lib/main/utils/ios_sharing_manager.dart b/lib/main/utils/ios_sharing_manager.dart index 1db216950..b456ae5a5 100644 --- a/lib/main/utils/ios_sharing_manager.dart +++ b/lib/main/utils/ios_sharing_manager.dart @@ -11,6 +11,7 @@ import 'package:tmail_ui_user/features/login/data/local/authentication_info_cach import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart'; import 'package:tmail_ui_user/features/mailbox/data/local/state_cache_manager.dart'; import 'package:tmail_ui_user/features/mailbox/data/model/state_type.dart'; +import 'package:tmail_ui_user/features/push_notification/data/extensions/keychain_sharing_session_extension.dart'; import 'package:tmail_ui_user/features/push_notification/data/keychain/keychain_sharing_manager.dart'; import 'package:tmail_ui_user/features/push_notification/data/keychain/keychain_sharing_session.dart'; @@ -33,7 +34,7 @@ class IOSSharingManager { personalAccount.apiUrl != null; } - Future _getEmailDeliveryStateFromKeychain(AccountId accountId) async { + Future getEmailDeliveryStateFromKeychain(AccountId accountId) async { try { if (await _keychainSharingManager.isSessionExist(accountId)) { final keychainSharingStored = await _keychainSharingManager.getSharingSession(accountId); @@ -122,7 +123,7 @@ class IOSSharingManager { required UserName userName }) async { try { - String? emailDeliveryState = await _getEmailDeliveryStateFromKeychain(accountId); + String? emailDeliveryState = await getEmailDeliveryStateFromKeychain(accountId); if (emailDeliveryState == null || emailDeliveryState.isEmpty) { final emailState = await _stateCacheManager.getState( accountId, @@ -137,4 +138,14 @@ class IOSSharingManager { return null; } } + + Future updateEmailDeliveryStateInKeyChain(AccountId accountId, String newEmailDeliveryState) async { + final keychainSharingSession = await getKeychainSharingSession(accountId); + log('IOSSharingManager::updateEmailDeliveryStateInKeyChain:keychainSharingSession: $keychainSharingSession'); + if (keychainSharingSession == null) { + return; + } + final newKeychain = keychainSharingSession.updating(emailDeliveryState: newEmailDeliveryState); + await _keychainSharingManager.save(newKeychain); + } } \ No newline at end of file