diff --git a/lib/features/base/base_controller.dart b/lib/features/base/base_controller.dart index fabf996a9..16b9dddd6 100644 --- a/lib/features/base/base_controller.dart +++ b/lib/features/base/base_controller.dart @@ -379,9 +379,13 @@ abstract class BaseController extends GetxController } } - void injectWebSocket(Session? session, AccountId? accountId) { + void injectWebSocket({ + Session? session, + AccountId? accountId, + bool isLabelAvailable = false, + }) { try { - log('$runtimeType::injectWebSocket:'); + log('$runtimeType::injectWebSocket: isLabelAvailable is $isLabelAvailable'); requireCapability( session!, accountId!, @@ -397,7 +401,11 @@ abstract class BaseController extends GetxController throw WebSocketPushNotSupportedException(); } WebSocketInteractorBindings().dependencies(); - WebSocketController.instance.initialize(accountId: accountId, session: session); + WebSocketController.instance.initialize( + accountId: accountId, + session: session, + isLabelAvailable: isLabelAvailable, + ); } catch(e) { logWarning('$runtimeType::injectWebSocket(): exception: $e'); } diff --git a/lib/features/labels/data/network/label_api.dart b/lib/features/labels/data/network/label_api.dart index 7bb304431..75a57cc65 100644 --- a/lib/features/labels/data/network/label_api.dart +++ b/lib/features/labels/data/network/label_api.dart @@ -5,7 +5,6 @@ import 'package:jmap_dart_client/jmap/core/id.dart'; import 'package:jmap_dart_client/jmap/core/patch_object.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/state.dart'; -import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; import 'package:jmap_dart_client/jmap/jmap_request.dart'; import 'package:labels/labels.dart'; import 'package:tmail_ui_user/features/base/mixin/batch_get_label_processing_mixin.dart'; @@ -19,8 +18,6 @@ import 'package:uuid/uuid.dart'; class LabelApi with HandleSetErrorMixin, SessionMixin, BatchGetLabelProcessingMixin { - static const int _defaultMaxChanges = 128; - final HttpClient _httpClient; final Uuid _uuid; @@ -178,11 +175,7 @@ class LabelApi processingInvocation, ); - final changesLabelMethod = ChangesLabelMethod( - accountId, - sinceState, - maxChanges: UnsignedInt(_defaultMaxChanges), - ); + final changesLabelMethod = ChangesLabelMethod(accountId, sinceState); final changesLabelInvocation = jmapRequestBuilder.invocation(changesLabelMethod); diff --git a/lib/features/labels/presentation/extensions/handle_label_websocket_extension.dart b/lib/features/labels/presentation/extensions/handle_label_websocket_extension.dart index a04fc242d..71addc667 100644 --- a/lib/features/labels/presentation/extensions/handle_label_websocket_extension.dart +++ b/lib/features/labels/presentation/extensions/handle_label_websocket_extension.dart @@ -15,6 +15,7 @@ extension HandleLabelWebsocketExtension on LabelController { currentLabelState == null || currentLabelState == newState || isLabelSettingEnabled.isFalse) { + logWarning('HandleLabelWebsocketExtension::refreshLabelChanges: accountId or session or currentLabelState or newState or isLabelSettingEnabled is null'); return; } diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 00c45dd2d..a0a1dce04 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -337,9 +337,7 @@ class MailboxDashBoardController extends ReloadableController int minInputLengthAutocomplete = AppConfig.defaultMinInputLengthAutocomplete; EmailSortOrderType currentSortOrder = SearchEmailFilter.defaultSortOrder; PaywallController? paywallController; - Worker? advancedSearchVisibleWorker; - Worker? searchInputFocusWorker; - Worker? _downloadUIActionWorker; + final workerObxVariables = []; final StreamController> progressStateController = StreamController>.broadcast(); @@ -394,6 +392,7 @@ class MailboxDashBoardController extends ReloadableController _registerDeepLinks(); } _registerStreamListener(); + registerLabelReactiveObxListener(); BackButtonInterceptor.add(onBackButtonInterceptor, name: AppRoutes.dashboard); WidgetsBinding.instance.addPostFrameCallback((_) async { await ApplicationManager().initUserAgent(); @@ -804,7 +803,7 @@ class MailboxDashBoardController extends ReloadableController } void _registerDownloadUIActionListener() { - _downloadUIActionWorker = ever( + workerObxVariables.add(ever( downloadController.downloadUIAction, (action) { if (action is OpenComposerFromMailtoLinkAction) { @@ -812,7 +811,7 @@ class MailboxDashBoardController extends ReloadableController downloadController.clearDownloadUIAction(); } }, - ); + )); } Future _handleClickNotificationOnAndroidInTerminated() async { @@ -895,7 +894,6 @@ class MailboxDashBoardController extends ReloadableController injectAutoCompleteBindings(session, currentAccountId); injectRuleFilterBindings(session, currentAccountId); injectVacationBindings(session, currentAccountId); - injectWebSocket(session, currentAccountId); injectPreferencesBindings(); injectAIScribeBindings(session, currentAccountId); if (PlatformInfo.isMobile) { @@ -921,6 +919,8 @@ class MailboxDashBoardController extends ReloadableController if (isLabelCapabilitySupported) { labelController.checkLabelSettingState(session, currentAccountId); + } else { + injectWebSocket(session: session, accountId: currentAccountId); } } @@ -3420,11 +3420,17 @@ class MailboxDashBoardController extends ReloadableController bool get isEmailListDisplayed => dashboardRoute.value == DashboardRoutes.thread; + void _disposeWorkerObxVariables() { + for (var worker in workerObxVariables) { + worker.dispose(); + } + workerObxVariables.clear(); + } + @override void onClose() { if (PlatformInfo.isWeb) { listSearchFilterScrollController?.dispose(); - disposeReactiveObxVariableListener(); } if (PlatformInfo.isIOS) { _iosNotificationManager?.dispose(); @@ -3453,8 +3459,7 @@ class MailboxDashBoardController extends ReloadableController twakeAppManager.setHasComposer(false); paywallController?.onClose(); paywallController = null; - _downloadUIActionWorker?.dispose(); - _downloadUIActionWorker = null; + _disposeWorkerObxVariables(); super.onClose(); } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/extensions/handle_reactive_obx_variable_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/handle_reactive_obx_variable_extension.dart index e9275b872..8650ba2b7 100644 --- a/lib/features/mailbox_dashboard/presentation/extensions/handle_reactive_obx_variable_extension.dart +++ b/lib/features/mailbox_dashboard/presentation/extensions/handle_reactive_obx_variable_extension.dart @@ -8,15 +8,15 @@ import 'package:tmail_ui_user/features/thread_detail/presentation/action/thread_ extension HandleReactiveObxVariableExtension on MailboxDashBoardController { void registerReactiveObxVariableListener() { - advancedSearchVisibleWorker = ever( + workerObxVariables.add(ever( searchController.isAdvancedSearchViewOpen, _onAdvancedSearchVisibleChanged - ); + )); - searchInputFocusWorker = ever( + workerObxVariables.add(ever( searchController.isSearchInputFocused, onSearchInputFocusChanged - ); + )); } void _onAdvancedSearchVisibleChanged(bool visible) { @@ -52,11 +52,4 @@ extension HandleReactiveObxVariableExtension on MailboxDashBoardController { dispatchAction(dashboardAction); } - - void disposeReactiveObxVariableListener() { - advancedSearchVisibleWorker?.dispose(); - advancedSearchVisibleWorker = null; - searchInputFocusWorker?.dispose(); - searchInputFocusWorker = null; - } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/extensions/labels/handle_logic_label_extension.dart b/lib/features/mailbox_dashboard/presentation/extensions/labels/handle_logic_label_extension.dart index 74575046e..27e520c80 100644 --- a/lib/features/mailbox_dashboard/presentation/extensions/labels/handle_logic_label_extension.dart +++ b/lib/features/mailbox_dashboard/presentation/extensions/labels/handle_logic_label_extension.dart @@ -1,3 +1,4 @@ +import 'package:core/utils/app_logger.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; @@ -15,4 +16,22 @@ extension HandleLogicLabelExtension on MailboxDashBoardController { return labelController.isLabelSettingEnabled.isTrue && isLabelCapabilitySupported; } + + void registerLabelReactiveObxListener() { + workerObxVariables.add( + ever( + labelController.isLabelSettingEnabled, + _onLabelSettingEnabledChanged, + ), + ); + } + + void _onLabelSettingEnabledChanged(bool isEnabled) { + log('$runtimeType::_onLabelSettingEnabledChanged: isEnabled is $isEnabled'); + injectWebSocket( + session: sessionCurrent, + accountId: accountId.value, + isLabelAvailable: isEnabled, + ); + } } diff --git a/lib/features/push_notification/presentation/controller/web_socket_controller.dart b/lib/features/push_notification/presentation/controller/web_socket_controller.dart index ac9383b58..d51b8f5ff 100644 --- a/lib/features/push_notification/presentation/controller/web_socket_controller.dart +++ b/lib/features/push_notification/presentation/controller/web_socket_controller.dart @@ -41,8 +41,19 @@ class WebSocketController extends PushBaseController { NetworkConnectionController? _networkConnectionController; StreamSubscription? _connectivitySubscription; + static final List _mailTypePushSupported = [ + TypeName.emailType, + TypeName.mailboxType, + ]; + static final List _labelTypePushSupported = [ + TypeName.emailType, + TypeName.mailboxType, + TypeName.labelType, + ]; + int _retryRemained = 3; bool _isConnecting = false; + bool _isLabelAvailable = false; WebSocketChannel? _webSocketChannel; Timer? _webSocketPingTimer; StreamSubscription? _webSocketSubscription; @@ -72,10 +83,14 @@ class WebSocketController extends PushBaseController { } @override - void initialize({AccountId? accountId, Session? session}) { - log('WebSocketController::initialize:AccountId = ${accountId?.asString}'); + void initialize({ + AccountId? accountId, + Session? session, + bool isLabelAvailable = false, + }) { + log('WebSocketController::initialize:AccountId = ${accountId?.asString}, isLabelAvailable = $isLabelAvailable'); super.initialize(accountId: accountId, session: session); - + _isLabelAvailable = isLabelAvailable; _connectWebSocket(); _listenToAppLifeCycle(); if (PlatformInfo.isWeb) { @@ -184,9 +199,12 @@ class WebSocketController extends PushBaseController { } void _enableWebSocketPush() { - log('WebSocketController::_enableWebSocketPush:'); + final dataTypes = _isLabelAvailable + ? _labelTypePushSupported + : _mailTypePushSupported; + log('WebSocketController::_enableWebSocketPush: DataType is $dataTypes'); _webSocketChannel?.sink.add(jsonEncode(WebSocketPushEnableRequest.toJson( - dataTypes: [TypeName.emailType, TypeName.mailboxType, TypeName.labelType] + dataTypes: dataTypes, ))); } diff --git a/lib/features/push_notification/presentation/listener/label_change_listener.dart b/lib/features/push_notification/presentation/listener/label_change_listener.dart index 00ff02822..9b854c064 100644 --- a/lib/features/push_notification/presentation/listener/label_change_listener.dart +++ b/lib/features/push_notification/presentation/listener/label_change_listener.dart @@ -11,10 +11,14 @@ class LabelChangeListener extends ChangeListener { LabelController? _labelController; LabelChangeListener._internal() { - _labelController = getBinding(); - if (_labelController == null) { - logWarning( - 'LabelChangeListener::_internal(): LabelController IS NOT REGISTERED'); + try { + _labelController = getBinding(); + if (_labelController == null) { + logWarning( + 'LabelChangeListener::_internal(): LabelController IS NOT REGISTERED'); + } + } catch (e) { + logWarning('LabelChangeListener::_internal(): $e'); } } diff --git a/test/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller_test.dart b/test/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller_test.dart index d81aee2f3..96015cff0 100644 --- a/test/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller_test.dart +++ b/test/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller_test.dart @@ -404,6 +404,7 @@ void main() { when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([])); when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle)); + when(labelController.isLabelSettingEnabled).thenAnswer((_) => RxBool(false)); Get.put(mailboxDashboardController); mailboxDashboardController.onReady(); @@ -451,6 +452,7 @@ void main() { when(context.owner).thenReturn(BuildOwner(focusManager: FocusManager())); when(context.mounted).thenReturn(true); when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle)); + when(labelController.isLabelSettingEnabled).thenAnswer((_) => RxBool(false)); // expect query in search controller update as expected mailboxDashboardController.searchEmailByQueryString(queryString); @@ -635,6 +637,7 @@ void main() { when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([])); when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle)); + when(labelController.isLabelSettingEnabled).thenAnswer((_) => RxBool(false)); Get.put(mailboxDashboardController); mailboxDashboardController.onReady(); diff --git a/test/features/mailbox_dashboard/presentation/view/mailbox_dashboard_view_widget_test.dart b/test/features/mailbox_dashboard/presentation/view/mailbox_dashboard_view_widget_test.dart index 2524d91e8..2be593b2f 100644 --- a/test/features/mailbox_dashboard/presentation/view/mailbox_dashboard_view_widget_test.dart +++ b/test/features/mailbox_dashboard/presentation/view/mailbox_dashboard_view_widget_test.dart @@ -365,6 +365,7 @@ void main() { when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([])); when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle)); + when(labelController.isLabelSettingEnabled).thenAnswer((_) => RxBool(false)); searchController = SearchController( quickSearchEmailInteractor, diff --git a/test/features/search/verify_before_time_in_search_email_filter_test.dart b/test/features/search/verify_before_time_in_search_email_filter_test.dart index e6cce030c..cb343b608 100644 --- a/test/features/search/verify_before_time_in_search_email_filter_test.dart +++ b/test/features/search/verify_before_time_in_search_email_filter_test.dart @@ -394,6 +394,7 @@ void main() { when(emailReceiveManager.pendingSharedFileInfo).thenAnswer((_) => BehaviorSubject.seeded([])); when(downloadController.downloadUIAction).thenAnswer((_) => Rxn(DownloadUIAction.idle)); + when(labelController.isLabelSettingEnabled).thenAnswer((_) => RxBool(false)); Get.put(mailboxDashboardController);