diff --git a/lib/features/network_connection/presentation/network_connection_controller.dart b/lib/features/network_connection/presentation/network_connection_controller.dart index 35bd219e7..06bdb6d93 100644 --- a/lib/features/network_connection/presentation/network_connection_controller.dart +++ b/lib/features/network_connection/presentation/network_connection_controller.dart @@ -1,76 +1,119 @@ import 'dart:async'; import 'package:connectivity_plus/connectivity_plus.dart'; -import 'package:core/core.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 { - final connectivityResult = Rxn(); + final _connectivityResult = Rxn(); + final _internetConnectionStatus = Rxn(); final Connectivity _connectivity; + final InternetConnectionChecker _internetConnectionChecker; final ImagePaths _imagePaths; final AppToast _appToast; bool _isEnableShowToastDisconnection = true; - late StreamSubscription subscription; + StreamSubscription? _subscription; + StreamSubscription? _internetSubscription; NetworkConnectionController( this._connectivity, + this._internetConnectionChecker, this._imagePaths, - this._appToast + this._appToast, ); @override void onInit() { super.onInit(); - log('NetworkConnectionController::onInit():'); _listenNetworkConnectionChanged(); } @override void onReady() { super.onReady(); - log('NetworkConnectionController::onReady():'); _getCurrentNetworkConnectionState(); } @override void onClose() { - subscription.cancel(); + _subscription?.cancel(); + if (PlatformInfo.isMobile) { + _internetSubscription?.cancel(); + } super.onClose(); } void _getCurrentNetworkConnectionState() async { - final currentConnectionResult = await _connectivity.checkConnectivity(); - log('NetworkConnectionController::onReady():_getCurrentNetworkConnectionState: $currentConnectionResult'); - _setNetworkConnectivityState(currentConnectionResult); + final listConnectionResult = await Future.wait([ + _connectivity.checkConnectivity(), + if (PlatformInfo.isMobile) + _internetConnectionChecker.connectionStatus, + ]); + log('NetworkConnectionController::_getCurrentNetworkConnectionState():listConnectionResult: $listConnectionResult'); + + if (listConnectionResult[0] is ConnectivityResult) { + _setNetworkConnectivityState(listConnectionResult[0] as ConnectivityResult); + } + + if (PlatformInfo.isMobile && listConnectionResult[1] is InternetConnectionStatus) { + _setInternetConnectivityStatus(listConnectionResult[1] as InternetConnectionStatus); + } + _handleNetworkConnectionState(); } void _listenNetworkConnectionChanged() { - subscription = _connectivity.onConnectivityChanged.listen( + _subscription = _connectivity.onConnectivityChanged.listen( (result) { - log('NetworkConnectionController::_listenNetworkConnectionChanged():onConnectivityChanged: $result'); + log('NetworkConnectionController::_listenNetworkConnectionChanged()::onConnectivityChanged: $result'); _setNetworkConnectivityState(result); _handleNetworkConnectionState(); }, onError: (error, stackTrace) { - logError('NetworkConnectionController::_listenNetworkConnectionChanged():error: $error'); - logError('NetworkConnectionController::_listenNetworkConnectionChanged():stackTrace: $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'); + } + ); + } } void _setNetworkConnectivityState(ConnectivityResult newConnectivityResult) { - connectivityResult.value = newConnectivityResult; + _connectivityResult.value = newConnectivityResult; + } + + void _setInternetConnectivityStatus(InternetConnectionStatus newStatus) { + _internetConnectionStatus.value = newStatus; } bool isNetworkConnectionAvailable() { - return connectivityResult.value != ConnectivityResult.none; + if (PlatformInfo.isWeb) { + return _connectivityResult.value != ConnectivityResult.none; + } else { + return _connectivityResult.value != ConnectivityResult.none && + _internetConnectionStatus.value == InternetConnectionStatus.connected; + } } void _handleNetworkConnectionState() { diff --git a/lib/main/bindings/network/network_bindings.dart b/lib/main/bindings/network/network_bindings.dart index fbe688ed9..9153c843e 100644 --- a/lib/main/bindings/network/network_bindings.dart +++ b/lib/main/bindings/network/network_bindings.dart @@ -8,6 +8,7 @@ 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'; @@ -102,6 +103,7 @@ 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 71f88f2d1..c39950e20 100644 --- a/lib/main/bindings/network_connection/network_connection_bindings.dart +++ b/lib/main/bindings/network_connection/network_connection_bindings.dart @@ -2,6 +2,7 @@ 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'; class NetWorkConnectionBindings extends Bindings { @@ -10,6 +11,7 @@ class NetWorkConnectionBindings extends Bindings { void dependencies() { Get.put(NetworkConnectionController( Get.find(), + Get.find(), Get.find(), Get.find(), )); diff --git a/pubspec.lock b/pubspec.lock index d40ffde9a..aad64c87e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -974,6 +974,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + internet_connection_checker: + dependency: "direct main" + description: + name: internet_connection_checker + sha256: "1c683e63e89c9ac66a40748b1b20889fd9804980da732bf2b58d6d5456c8e876" + url: "https://pub.dev" + source: hosted + version: "1.0.0+1" intl: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 8d1670ecc..f95ead156 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -213,6 +213,8 @@ dependencies: dotted_border: 2.1.0 + internet_connection_checker: 1.0.0+1 + dev_dependencies: flutter_test: sdk: flutter