TF-2202 Use InternetConnectionChecker to check internet connection on mobile device

(cherry picked from commit 451ebbda2218e11428fdc7d9c6ae80fa254ea2f5)
This commit is contained in:
dab246
2023-10-03 16:30:18 +07:00
committed by Dat H. Pham
parent db12672599
commit f7cbdf101c
5 changed files with 73 additions and 16 deletions
@@ -1,76 +1,119 @@
import 'dart:async'; import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart'; 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:flutter/material.dart';
import 'package:get/get.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/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class NetworkConnectionController extends GetxController { class NetworkConnectionController extends GetxController {
final connectivityResult = Rxn<ConnectivityResult>(); final _connectivityResult = Rxn<ConnectivityResult>();
final _internetConnectionStatus = Rxn<InternetConnectionStatus>();
final Connectivity _connectivity; final Connectivity _connectivity;
final InternetConnectionChecker _internetConnectionChecker;
final ImagePaths _imagePaths; final ImagePaths _imagePaths;
final AppToast _appToast; final AppToast _appToast;
bool _isEnableShowToastDisconnection = true; bool _isEnableShowToastDisconnection = true;
late StreamSubscription<ConnectivityResult> subscription; StreamSubscription<ConnectivityResult>? _subscription;
StreamSubscription<InternetConnectionStatus>? _internetSubscription;
NetworkConnectionController( NetworkConnectionController(
this._connectivity, this._connectivity,
this._internetConnectionChecker,
this._imagePaths, this._imagePaths,
this._appToast this._appToast,
); );
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
log('NetworkConnectionController::onInit():');
_listenNetworkConnectionChanged(); _listenNetworkConnectionChanged();
} }
@override @override
void onReady() { void onReady() {
super.onReady(); super.onReady();
log('NetworkConnectionController::onReady():');
_getCurrentNetworkConnectionState(); _getCurrentNetworkConnectionState();
} }
@override @override
void onClose() { void onClose() {
subscription.cancel(); _subscription?.cancel();
if (PlatformInfo.isMobile) {
_internetSubscription?.cancel();
}
super.onClose(); super.onClose();
} }
void _getCurrentNetworkConnectionState() async { void _getCurrentNetworkConnectionState() async {
final currentConnectionResult = await _connectivity.checkConnectivity(); final listConnectionResult = await Future.wait([
log('NetworkConnectionController::onReady():_getCurrentNetworkConnectionState: $currentConnectionResult'); _connectivity.checkConnectivity(),
_setNetworkConnectivityState(currentConnectionResult); 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(); _handleNetworkConnectionState();
} }
void _listenNetworkConnectionChanged() { void _listenNetworkConnectionChanged() {
subscription = _connectivity.onConnectivityChanged.listen( _subscription = _connectivity.onConnectivityChanged.listen(
(result) { (result) {
log('NetworkConnectionController::_listenNetworkConnectionChanged():onConnectivityChanged: $result'); log('NetworkConnectionController::_listenNetworkConnectionChanged()::onConnectivityChanged: $result');
_setNetworkConnectivityState(result); _setNetworkConnectivityState(result);
_handleNetworkConnectionState(); _handleNetworkConnectionState();
}, },
onError: (error, stackTrace) { onError: (error, stackTrace) {
logError('NetworkConnectionController::_listenNetworkConnectionChanged():error: $error'); logError('NetworkConnectionController::_listenNetworkConnectionChanged()::onConnectivityChanged:error: $error | stackTrace: $stackTrace');
logError('NetworkConnectionController::_listenNetworkConnectionChanged():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) { void _setNetworkConnectivityState(ConnectivityResult newConnectivityResult) {
connectivityResult.value = newConnectivityResult; _connectivityResult.value = newConnectivityResult;
}
void _setInternetConnectivityStatus(InternetConnectionStatus newStatus) {
_internetConnectionStatus.value = newStatus;
} }
bool isNetworkConnectionAvailable() { 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() { void _handleNetworkConnectionState() {
@@ -8,6 +8,7 @@ import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter_appauth/flutter_appauth.dart'; import 'package:flutter_appauth/flutter_appauth.dart';
import 'package:get/get.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: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/local/html_analyzer.dart';
import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; import 'package:tmail_ui_user/features/email/data/network/email_api.dart';
@@ -102,6 +103,7 @@ class NetworkBindings extends Bindings {
void _bindingConnection() { void _bindingConnection() {
Get.put(Connectivity()); Get.put(Connectivity());
Get.put(InternetConnectionChecker());
} }
void _bindingException() { void _bindingException() {
@@ -2,6 +2,7 @@ import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/app_toast.dart'; import 'package:core/presentation/utils/app_toast.dart';
import 'package:get/get.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';
class NetWorkConnectionBindings extends Bindings { class NetWorkConnectionBindings extends Bindings {
@@ -10,6 +11,7 @@ class NetWorkConnectionBindings extends Bindings {
void dependencies() { void dependencies() {
Get.put(NetworkConnectionController( Get.put(NetworkConnectionController(
Get.find<Connectivity>(), Get.find<Connectivity>(),
Get.find<InternetConnectionChecker>(),
Get.find<ImagePaths>(), Get.find<ImagePaths>(),
Get.find<AppToast>(), Get.find<AppToast>(),
)); ));
+8
View File
@@ -974,6 +974,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.1.0" 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: intl:
dependency: "direct main" dependency: "direct main"
description: description:
+2
View File
@@ -213,6 +213,8 @@ dependencies:
dotted_border: 2.1.0 dotted_border: 2.1.0
internet_connection_checker: 1.0.0+1
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter