feat: manual offline detection

This commit is contained in:
Kingkor Roy Tirtho 2023-10-14 12:31:10 +06:00
parent d0df1d29f5
commit 854ab8910d
4 changed files with 126 additions and 54 deletions

View File

@ -1,12 +1,11 @@
import 'dart:async';
import 'package:collection/collection.dart';
import 'package:fl_query/fl_query.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:internet_connection_checker/internet_connection_checker.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/shared/dialogs/replace_downloaded_dialog.dart';
@ -52,9 +51,8 @@ class RootApp extends HookConsumerWidget {
});
final subscription =
InternetConnectionChecker().onStatusChange.listen((status) {
switch (status) {
case InternetConnectionStatus.connected:
QueryClient.connectivity.onConnectivityChanged.listen((status) {
if (status) {
scaffoldMessenger.showSnackBar(
SnackBar(
content: Row(
@ -72,7 +70,7 @@ class RootApp extends HookConsumerWidget {
width: 350,
),
);
case InternetConnectionStatus.disconnected:
} else {
scaffoldMessenger.showSnackBar(
SnackBar(
content: Row(

View File

@ -1,12 +1,95 @@
import 'dart:async';
import 'dart:io';
import 'package:fl_query/fl_query.dart';
import 'package:internet_connection_checker/internet_connection_checker.dart';
import 'package:flutter/widgets.dart';
class FlQueryInternetConnectionCheckerAdapter extends ConnectivityAdapter {
@override
Future<bool> get isConnected => InternetConnectionChecker().hasConnection;
class FlQueryInternetConnectionCheckerAdapter extends ConnectivityAdapter
with WidgetsBindingObserver {
final _connectionStreamController = StreamController<bool>.broadcast();
@override
Stream<bool> get onConnectivityChanged => InternetConnectionChecker()
.onStatusChange
.map((status) => status == InternetConnectionStatus.connected);
FlQueryInternetConnectionCheckerAdapter() : super() {
Timer.periodic(const Duration(minutes: 3), (timer) async {
if (WidgetsBinding.instance.lifecycleState == AppLifecycleState.paused) {
return;
}
await isConnected;
});
}
@override
didChangeAppLifecycleState(AppLifecycleState state) async {
if (state == AppLifecycleState.resumed) {
await isConnected;
}
}
final vpnNames = [
'tun',
'tap',
'ppp',
'pptp',
'l2tp',
'ipsec',
'vpn',
'wireguard',
'openvpn',
'softether',
'proton',
'strongswan',
'cisco',
'forticlient',
'fortinet',
'hideme',
'hidemy',
'hideman',
'hidester',
'lightway',
];
Future<bool> isVpnActive() async {
final interfaces = await NetworkInterface.list(
includeLoopback: false,
type: InternetAddressType.any,
);
if (interfaces.isEmpty) {
return false;
}
return interfaces.any(
(interface) =>
vpnNames.any((name) => interface.name.toLowerCase().contains(name)),
);
}
Future<bool> doesConnectTo(String address) async {
try {
final result = await InternetAddress.lookup(address);
if (result.isNotEmpty && result[0].rawAddress.isNotEmpty) {
return true;
}
return false;
} on SocketException catch (_) {
return false;
}
}
Future<bool> _isConnected() async {
return await doesConnectTo('google.com') ||
await doesConnectTo('www.baidu.com') || // for China
await isVpnActive(); // when VPN is active that means we are connected
}
@override
Future<bool> get isConnected async {
final connected = await _isConnected();
if (connected != isConnectedSync /*previous value*/) {
_connectionStreamController.add(connected);
}
return connected;
}
@override
Stream<bool> get onConnectivityChanged => _connectionStreamController.stream;
}

View File

@ -1125,14 +1125,6 @@ packages:
description: flutter
source: sdk
version: "0.0.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:

View File

@ -63,7 +63,6 @@ dependencies:
html: ^0.15.1
http: ^1.1.0
image_picker: ^1.0.4
internet_connection_checker: ^1.0.0+1
intl: ^0.18.0
introduction_screen: ^3.0.2
json_annotation: ^4.8.1