From c3c8eacb9f3c27d279006a5a54d57883829b4457 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 4 Oct 2023 16:11:11 +0700 Subject: [PATCH] TF-2189 Avoid compile runtime InternetConnectionChecker on web (cherry picked from commit 7052f3eb5afb067952939f1642d5655d8740752f) --- .../presentation/composer_controller.dart | 3 +- .../mailbox_dashboard_controller.dart | 3 +- .../network_connection_controller.dart | 89 ++++------------- .../web_network_connection_controller.dart | 97 +++++++++++++++++++ .../sending_queue_controller.dart | 3 +- .../presentation/thread_controller.dart | 3 +- .../bindings/network/network_bindings.dart | 2 - .../network_connection_bindings.dart | 13 +-- .../exceptions/remote_exception_thrower.dart | 3 +- 9 files changed, 131 insertions(+), 85 deletions(-) create mode 100644 lib/features/network_connection/presentation/web_network_connection_controller.dart diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index fbc008989..31116764b 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -72,7 +72,8 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/identity_extension.dart'; -import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart'; +import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart' + if (dart.library.html) 'package:tmail_ui_user/features/network_connection/presentation/web_network_connection_controller.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/extensions/sending_email_extension.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart'; import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_action_type.dart'; 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 53d76b10c..283566771 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -86,7 +86,8 @@ import 'package:tmail_ui_user/features/manage_account/presentation/extensions/da import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/manage_account_arguments.dart'; -import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart'; +import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart' + if (dart.library.html) 'package:tmail_ui_user/features/network_connection/presentation/web_network_connection_controller.dart'; import 'package:tmail_ui_user/features/offline_mode/config/work_manager_constants.dart'; import 'package:tmail_ui_user/features/offline_mode/controller/work_manager_controller.dart'; import 'package:tmail_ui_user/features/offline_mode/work_manager/one_time_work_request.dart'; diff --git a/lib/features/network_connection/presentation/network_connection_controller.dart b/lib/features/network_connection/presentation/network_connection_controller.dart index 06bdb6d93..897ae1b3a 100644 --- a/lib/features/network_connection/presentation/network_connection_controller.dart +++ b/lib/features/network_connection/presentation/network_connection_controller.dart @@ -1,38 +1,29 @@ import 'dart:async'; import 'package:connectivity_plus/connectivity_plus.dart'; -import 'package:core/presentation/extensions/color_extension.dart'; -import 'package:core/presentation/resources/image_paths.dart'; -import 'package:core/presentation/utils/app_toast.dart'; -import 'package:core/presentation/views/toast/tmail_toast.dart'; import 'package:core/utils/app_logger.dart'; import 'package:core/utils/platform_info.dart'; -import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:internet_connection_checker/internet_connection_checker.dart'; -import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; -import 'package:tmail_ui_user/main/routes/route_navigation.dart'; class NetworkConnectionController extends GetxController { + static const Duration _timeoutInternetConnection = Duration(milliseconds: 5000); + static const Duration _timeIntervalInternetConnection = Duration(milliseconds: 5000); + final _connectivityResult = Rxn(); final _internetConnectionStatus = Rxn(); final Connectivity _connectivity; - final InternetConnectionChecker _internetConnectionChecker; - final ImagePaths _imagePaths; - final AppToast _appToast; - bool _isEnableShowToastDisconnection = true; + final _internetConnectionChecker = InternetConnectionChecker.createInstance( + checkTimeout: _timeoutInternetConnection, + checkInterval: _timeIntervalInternetConnection + ); StreamSubscription? _subscription; StreamSubscription? _internetSubscription; - NetworkConnectionController( - this._connectivity, - this._internetConnectionChecker, - this._imagePaths, - this._appToast, - ); + NetworkConnectionController(this._connectivity); @override void onInit() { @@ -58,8 +49,7 @@ class NetworkConnectionController extends GetxController { void _getCurrentNetworkConnectionState() async { final listConnectionResult = await Future.wait([ _connectivity.checkConnectivity(), - if (PlatformInfo.isMobile) - _internetConnectionChecker.connectionStatus, + _internetConnectionChecker.connectionStatus, ]); log('NetworkConnectionController::_getCurrentNetworkConnectionState():listConnectionResult: $listConnectionResult'); @@ -67,11 +57,9 @@ class NetworkConnectionController extends GetxController { _setNetworkConnectivityState(listConnectionResult[0] as ConnectivityResult); } - if (PlatformInfo.isMobile && listConnectionResult[1] is InternetConnectionStatus) { + if (listConnectionResult[1] is InternetConnectionStatus) { _setInternetConnectivityStatus(listConnectionResult[1] as InternetConnectionStatus); } - - _handleNetworkConnectionState(); } void _listenNetworkConnectionChanged() { @@ -79,24 +67,21 @@ class NetworkConnectionController extends GetxController { (result) { log('NetworkConnectionController::_listenNetworkConnectionChanged()::onConnectivityChanged: $result'); _setNetworkConnectivityState(result); - _handleNetworkConnectionState(); }, onError: (error, stackTrace) { logError('NetworkConnectionController::_listenNetworkConnectionChanged()::onConnectivityChanged:error: $error | stackTrace: $stackTrace'); } ); - if (PlatformInfo.isMobile) { - _internetSubscription = _internetConnectionChecker.onStatusChange.listen( - (status) { - log('NetworkConnectionController::_listenNetworkConnectionChanged()::onStatusChange: $status'); - _setInternetConnectivityStatus(status); - }, - onError: (error, stackTrace) { - logError('NetworkConnectionController::_listenNetworkConnectionChanged()::onStatusChange:error: $error | stackTrace: $stackTrace'); - } - ); - } + _internetSubscription = _internetConnectionChecker.onStatusChange.listen( + (status) { + log('NetworkConnectionController::_listenNetworkConnectionChanged()::onStatusChange: $status'); + _setInternetConnectivityStatus(status); + }, + onError: (error, stackTrace) { + logError('NetworkConnectionController::_listenNetworkConnectionChanged()::onStatusChange:error: $error | stackTrace: $stackTrace'); + } + ); } void _setNetworkConnectivityState(ConnectivityResult newConnectivityResult) { @@ -108,39 +93,7 @@ class NetworkConnectionController extends GetxController { } bool isNetworkConnectionAvailable() { - if (PlatformInfo.isWeb) { - return _connectivityResult.value != ConnectivityResult.none; - } else { - return _connectivityResult.value != ConnectivityResult.none && - _internetConnectionStatus.value == InternetConnectionStatus.connected; - } - } - - void _handleNetworkConnectionState() { - if (PlatformInfo.isWeb) { - if (_isEnableShowToastDisconnection && !isNetworkConnectionAvailable()) { - _showToastLostConnection(); - } else { - ToastView.dismiss(); - } - } - } - - void _showToastLostConnection() { - if (currentContext != null && currentOverlayContext != null) { - _appToast.showToastMessage( - currentOverlayContext!, - AppLocalizations.of(currentContext!).no_internet_connection, - actionName: AppLocalizations.of(currentContext!).skip, - onActionClick: () { - _isEnableShowToastDisconnection = false; - ToastView.dismiss(); - }, - leadingSVGIcon: _imagePaths.icNotConnection, - backgroundColor: AppColor.textFieldErrorBorderColor, - textColor: Colors.white, - infinityToast: true, - ); - } + return _connectivityResult.value != ConnectivityResult.none && + _internetConnectionStatus.value == InternetConnectionStatus.connected; } } \ No newline at end of file diff --git a/lib/features/network_connection/presentation/web_network_connection_controller.dart b/lib/features/network_connection/presentation/web_network_connection_controller.dart new file mode 100644 index 000000000..4afdb5be7 --- /dev/null +++ b/lib/features/network_connection/presentation/web_network_connection_controller.dart @@ -0,0 +1,97 @@ +import 'dart:async'; + +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:core/presentation/utils/app_toast.dart'; +import 'package:core/presentation/views/toast/tmail_toast.dart'; +import 'package:core/utils/app_logger.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; + +class NetworkConnectionController extends GetxController { + final _imagePaths = Get.find(); + final _appToast = Get.find(); + + final _connectivityResult = Rxn(); + + final Connectivity _connectivity; + + bool _isEnableShowToastDisconnection = true; + + StreamSubscription? _subscription; + + NetworkConnectionController(this._connectivity); + + @override + void onInit() { + super.onInit(); + _listenNetworkConnectionChanged(); + } + + @override + void onReady() { + super.onReady(); + _getCurrentNetworkConnectionState(); + } + + @override + void onClose() { + _subscription?.cancel(); + super.onClose(); + } + + void _getCurrentNetworkConnectionState() async { + final connectionResult = await _connectivity.checkConnectivity(); + log('NetworkConnectionController::_getCurrentNetworkConnectionState():connectionResult: $connectionResult'); + _setNetworkConnectivityState(connectionResult); + _handleNetworkConnectionState(); + } + + void _listenNetworkConnectionChanged() { + _subscription = _connectivity.onConnectivityChanged.listen( + (result) { + log('NetworkConnectionController::_listenNetworkConnectionChanged()::onConnectivityChanged: $result'); + _setNetworkConnectivityState(result); + _handleNetworkConnectionState(); + }, + onError: (error, stackTrace) { + logError('NetworkConnectionController::_listenNetworkConnectionChanged()::onConnectivityChanged:error: $error | stackTrace: $stackTrace'); + } + ); + } + + void _setNetworkConnectivityState(ConnectivityResult newConnectivityResult) { + _connectivityResult.value = newConnectivityResult; + } + + bool isNetworkConnectionAvailable() => _connectivityResult.value != ConnectivityResult.none; + + void _handleNetworkConnectionState() { + if (_isEnableShowToastDisconnection && !isNetworkConnectionAvailable()) { + _showToastLostConnection(); + } else { + ToastView.dismiss(); + } + } + + void _showToastLostConnection() { + if (currentContext != null && currentOverlayContext != null) { + _appToast.showToastMessage( + currentOverlayContext!, + AppLocalizations.of(currentContext!).no_internet_connection, + actionName: AppLocalizations.of(currentContext!).skip, + onActionClick: () { + _isEnableShowToastDisconnection = false; + ToastView.dismiss(); + }, + leadingSVGIcon: _imagePaths.icNotConnection, + backgroundColor: AppColor.textFieldErrorBorderColor, + textColor: Colors.white, + infinityToast: true, + ); + } + } +} \ No newline at end of file diff --git a/lib/features/sending_queue/presentation/sending_queue_controller.dart b/lib/features/sending_queue/presentation/sending_queue_controller.dart index c1c9112b4..42842e1c9 100644 --- a/lib/features/sending_queue/presentation/sending_queue_controller.dart +++ b/lib/features/sending_queue/presentation/sending_queue_controller.dart @@ -17,7 +17,8 @@ import 'package:tmail_ui_user/features/caching/utils/cache_utils.dart'; import 'package:tmail_ui_user/features/email/domain/state/delete_sending_email_state.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; -import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart'; +import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart' + if (dart.library.html) 'package:tmail_ui_user/features/network_connection/presentation/web_network_connection_controller.dart'; import 'package:tmail_ui_user/features/offline_mode/controller/work_manager_controller.dart'; import 'package:tmail_ui_user/features/offline_mode/model/sending_state.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/extensions/list_sending_email_extension.dart'; diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 7473cbba7..b0ad26ce9 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -41,7 +41,8 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/sear import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_email_rule_filter_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_rule_filter_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_email_rule_filter_interactor.dart'; -import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart'; +import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart' + if (dart.library.html) 'package:tmail_ui_user/features/network_connection/presentation/web_network_connection_controller.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rules_filter_creator_arguments.dart'; import 'package:tmail_ui_user/features/search/email/presentation/search_email_bindings.dart'; import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart'; diff --git a/lib/main/bindings/network/network_bindings.dart b/lib/main/bindings/network/network_bindings.dart index 9153c843e..fbe688ed9 100644 --- a/lib/main/bindings/network/network_bindings.dart +++ b/lib/main/bindings/network/network_bindings.dart @@ -8,7 +8,6 @@ import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_appauth/flutter_appauth.dart'; import 'package:get/get.dart'; -import 'package:internet_connection_checker/internet_connection_checker.dart'; import 'package:jmap_dart_client/http/http_client.dart'; import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart'; import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; @@ -103,7 +102,6 @@ class NetworkBindings extends Bindings { void _bindingConnection() { Get.put(Connectivity()); - Get.put(InternetConnectionChecker()); } void _bindingException() { diff --git a/lib/main/bindings/network_connection/network_connection_bindings.dart b/lib/main/bindings/network_connection/network_connection_bindings.dart index c39950e20..b1067f2ca 100644 --- a/lib/main/bindings/network_connection/network_connection_bindings.dart +++ b/lib/main/bindings/network_connection/network_connection_bindings.dart @@ -1,19 +1,12 @@ import 'package:connectivity_plus/connectivity_plus.dart'; -import 'package:core/presentation/resources/image_paths.dart'; -import 'package:core/presentation/utils/app_toast.dart'; import 'package:get/get.dart'; -import 'package:internet_connection_checker/internet_connection_checker.dart'; -import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart'; +import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart' + if (dart.library.html) 'package:tmail_ui_user/features/network_connection/presentation/web_network_connection_controller.dart'; class NetWorkConnectionBindings extends Bindings { @override void dependencies() { - Get.put(NetworkConnectionController( - Get.find(), - Get.find(), - Get.find(), - Get.find(), - )); + Get.put(NetworkConnectionController(Get.find())); } } \ No newline at end of file diff --git a/lib/main/exceptions/remote_exception_thrower.dart b/lib/main/exceptions/remote_exception_thrower.dart index db8bb01ae..6f1e6dd8a 100644 --- a/lib/main/exceptions/remote_exception_thrower.dart +++ b/lib/main/exceptions/remote_exception_thrower.dart @@ -6,7 +6,8 @@ import 'package:get/get_connect/http/src/status/http_status.dart'; import 'package:jmap_dart_client/jmap/core/error/method/error_method_response.dart'; import 'package:jmap_dart_client/jmap/core/error/method/exception/error_method_response_exception.dart'; import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; -import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart'; +import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_controller.dart' + if (dart.library.html) 'package:tmail_ui_user/features/network_connection/presentation/web_network_connection_controller.dart'; import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';