Skip to content

Commit 9955e48

Browse files
CopilotmonkeyWie
andcommitted
Fix network detection logic to properly handle WiFi ↔ Mobile transitions
Co-authored-by: monkeyWie <[email protected]>
1 parent 27dc7ae commit 9955e48

File tree

1 file changed

+28
-13
lines changed

1 file changed

+28
-13
lines changed

ui/flutter/lib/util/network_monitor.dart

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import '../api/api.dart';
88
import '../database/database.dart';
99
import '../util/log_util.dart';
1010

11+
enum NetworkType { wifi, mobile, other, none }
12+
1113
class NetworkMonitor extends GetxService {
1214
static NetworkMonitor get to => Get.find();
1315

@@ -17,7 +19,7 @@ class NetworkMonitor extends GetxService {
1719
final _isWiFiConnected = false.obs;
1820
bool get isWiFiConnected => _isWiFiConnected.value;
1921

20-
bool _wasWiFiConnected = false;
22+
NetworkType _previousNetworkType = NetworkType.none;
2123
bool _isInitialized = false;
2224

2325
@override
@@ -33,8 +35,8 @@ class NetworkMonitor extends GetxService {
3335

3436
// Check initial connectivity state
3537
final initialResult = await _connectivity.checkConnectivity();
36-
_updateWiFiStatus(initialResult);
37-
_wasWiFiConnected = _isWiFiConnected.value;
38+
_updateNetworkStatus(initialResult);
39+
_previousNetworkType = _getNetworkType(initialResult);
3840
_isInitialized = true;
3941

4042
// Listen to connectivity changes
@@ -54,7 +56,20 @@ class NetworkMonitor extends GetxService {
5456
super.onClose();
5557
}
5658

57-
void _updateWiFiStatus(List<ConnectivityResult> result) {
59+
NetworkType _getNetworkType(List<ConnectivityResult> result) {
60+
if (result.contains(ConnectivityResult.wifi)) {
61+
return NetworkType.wifi;
62+
} else if (result.contains(ConnectivityResult.mobile)) {
63+
return NetworkType.mobile;
64+
} else if (result.contains(ConnectivityResult.none)) {
65+
return NetworkType.none;
66+
} else {
67+
// Ethernet, Bluetooth, VPN, or other connection types
68+
return NetworkType.other;
69+
}
70+
}
71+
72+
void _updateNetworkStatus(List<ConnectivityResult> result) {
5873
final hasWiFi = result.contains(ConnectivityResult.wifi);
5974
_isWiFiConnected.value = hasWiFi;
6075
}
@@ -68,23 +83,23 @@ class NetworkMonitor extends GetxService {
6883
return;
6984
}
7085

71-
_updateWiFiStatus(result);
72-
final currentlyWiFi = _isWiFiConnected.value;
86+
_updateNetworkStatus(result);
87+
final currentNetworkType = _getNetworkType(result);
7388

74-
logInfo('Network changed: wasWiFi=$_wasWiFiConnected, currentlyWiFi=$currentlyWiFi');
89+
logInfo('Network changed: previous=$_previousNetworkType, current=$currentNetworkType');
7590

76-
// WiFi to Mobile Data: pause all tasks
77-
if (_wasWiFiConnected && !currentlyWiFi) {
91+
// Only handle WiFi Mobile transitions, ignore other connection types
92+
if (_previousNetworkType == NetworkType.wifi && currentNetworkType == NetworkType.mobile) {
7893
_pauseAllDownloads();
7994
logInfo('Switched from WiFi to mobile data - pausing all downloads');
80-
}
81-
// Mobile Data to WiFi: resume all tasks
82-
else if (!_wasWiFiConnected && currentlyWiFi) {
95+
} else if (_previousNetworkType == NetworkType.mobile && currentNetworkType == NetworkType.wifi) {
8396
_resumeAllDownloads();
8497
logInfo('Switched from mobile data to WiFi - resuming all downloads');
98+
} else {
99+
logInfo('Network change ignored: not a WiFi ↔ Mobile transition');
85100
}
86101

87-
_wasWiFiConnected = currentlyWiFi;
102+
_previousNetworkType = currentNetworkType;
88103
}
89104

90105
Future<void> _pauseAllDownloads() async {

0 commit comments

Comments
 (0)