2022-12-22 21:29:37 +00:00
|
|
|
import 'dart:async';
|
|
|
|
|
|
|
|
import 'package:connectivity_plus/connectivity_plus.dart';
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
import 'package:internet_connection_checker/internet_connection_checker.dart';
|
|
|
|
|
|
|
|
import '/locator.dart';
|
2022-12-25 21:17:59 +00:00
|
|
|
import 'logging_service.dart';
|
2022-12-22 21:29:37 +00:00
|
|
|
|
2022-12-25 21:17:59 +00:00
|
|
|
/// Used to observe the current connection type and status.
|
2022-12-22 21:29:37 +00:00
|
|
|
class ConnectionsService {
|
|
|
|
ConnectionsService({
|
|
|
|
required Connectivity connectivity,
|
|
|
|
required InternetConnectionChecker internetConnectionChecker,
|
|
|
|
required LoggingService loggingService,
|
|
|
|
}) : _internetConnectionChecker = internetConnectionChecker,
|
|
|
|
_connectivity = connectivity,
|
|
|
|
_loggingService = loggingService {
|
|
|
|
_init();
|
|
|
|
}
|
|
|
|
|
|
|
|
final InternetConnectionChecker _internetConnectionChecker;
|
|
|
|
final Connectivity _connectivity;
|
|
|
|
final LoggingService _loggingService;
|
|
|
|
|
|
|
|
late final ValueNotifier<InternetConnectionStatus> _internetConnectionStatusNotifier;
|
|
|
|
ValueListenable<InternetConnectionStatus> get internetConnectionStatusListenable =>
|
|
|
|
_internetConnectionStatusNotifier;
|
|
|
|
late final ValueNotifier<ConnectivityResult> _connectivityResultNotifier;
|
|
|
|
ValueListenable<ConnectivityResult> get connectivityResultListenable =>
|
|
|
|
_connectivityResultNotifier;
|
|
|
|
|
|
|
|
Future<void> _init() async {
|
|
|
|
// Initialize notifiers
|
|
|
|
_internetConnectionStatusNotifier =
|
|
|
|
ValueNotifier(await _internetConnectionChecker.connectionStatus);
|
|
|
|
_connectivityResultNotifier = ValueNotifier(await _connectivity.checkConnectivity());
|
|
|
|
_loggingService
|
|
|
|
.info('Initial internet status: ${internetConnectionStatusListenable.value.nameWithIcon}');
|
|
|
|
_loggingService
|
|
|
|
.info('Initial connectivity result: ${connectivityResultListenable.value.nameWithIcon}');
|
|
|
|
|
|
|
|
// Attach converters by listening to stream
|
|
|
|
_internetConnectionChecker.onStatusChange
|
|
|
|
.listen((final InternetConnectionStatus internetConnectionStatus) {
|
|
|
|
_loggingService.info(
|
|
|
|
'Internet status changed to: ${internetConnectionStatus.nameWithIcon}. Notifying...');
|
|
|
|
_internetConnectionStatusNotifier.value = internetConnectionStatus;
|
|
|
|
});
|
|
|
|
_connectivity.onConnectivityChanged.listen((final connectivityResult) {
|
|
|
|
_loggingService
|
|
|
|
.info('Connectivity result changed to: ${connectivityResult.nameWithIcon}. Notifying...');
|
|
|
|
_connectivityResultNotifier.value = connectivityResult;
|
|
|
|
});
|
|
|
|
|
|
|
|
Locator.instance().signalReady(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> dispose() async {
|
|
|
|
_internetConnectionStatusNotifier.dispose();
|
|
|
|
_connectivityResultNotifier.dispose();
|
|
|
|
}
|
|
|
|
|
|
|
|
static ConnectionsService get locate => Locator.locate();
|
|
|
|
}
|
|
|
|
|
2023-01-01 12:04:22 +00:00
|
|
|
extension _ConnectionStatusEmojiExtension on InternetConnectionStatus {
|
2022-12-22 21:29:37 +00:00
|
|
|
String get nameWithIcon {
|
|
|
|
switch (this) {
|
|
|
|
case InternetConnectionStatus.connected:
|
|
|
|
return '$name (🌐✅)';
|
|
|
|
case InternetConnectionStatus.disconnected:
|
|
|
|
return '$name (🔌)';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-01 12:04:22 +00:00
|
|
|
extension _ConnectivityEmojiExtension on ConnectivityResult {
|
2022-12-22 21:29:37 +00:00
|
|
|
String get nameWithIcon {
|
|
|
|
switch (this) {
|
|
|
|
case ConnectivityResult.bluetooth:
|
|
|
|
return '$name (ᛒ🟦)';
|
|
|
|
case ConnectivityResult.wifi:
|
|
|
|
return '$name (◲)';
|
|
|
|
case ConnectivityResult.ethernet:
|
|
|
|
return '$name (🌐)';
|
|
|
|
case ConnectivityResult.mobile:
|
|
|
|
return '$name (📶)';
|
|
|
|
case ConnectivityResult.none:
|
|
|
|
return '$name (🔌)';
|
|
|
|
case ConnectivityResult.vpn:
|
|
|
|
return '$name (🔒)';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|