Skip to content

Commit cc63344

Browse files
author
Jack Gibbons
committed
feat(connectivity_plus): add ConnectivityResult.satellite
satellite/constrained links
1 parent 350430a commit cc63344

11 files changed

Lines changed: 77 additions & 0 deletions

File tree

packages/connectivity_plus/connectivity_plus/android/src/main/java/dev/fluttercommunity/plus/connectivity/Connectivity.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class Connectivity {
2121
static final String CONNECTIVITY_ETHERNET = "ethernet";
2222
static final String CONNECTIVITY_BLUETOOTH = "bluetooth";
2323
static final String CONNECTIVITY_VPN = "vpn";
24+
static final String CONNECTIVITY_SATELLITE = "satellite";
2425
static final String CONNECTIVITY_OTHER = "other";
2526
private final ConnectivityManager connectivityManager;
2627

@@ -70,6 +71,10 @@ List<String> getCapabilitiesList(NetworkCapabilities capabilities) {
7071
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH)) {
7172
types.add(CONNECTIVITY_BLUETOOTH);
7273
}
74+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE
75+
&& capabilities.hasTransport(NetworkCapabilities.TRANSPORT_SATELLITE)) {
76+
types.add(CONNECTIVITY_SATELLITE);
77+
}
7378
if (types.isEmpty()
7479
&& capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
7580
types.add(CONNECTIVITY_OTHER);

packages/connectivity_plus/connectivity_plus/ios/connectivity_plus/Sources/connectivity_plus/ConnectivityPlusPlugin.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ public class ConnectivityPlusPlugin: NSObject, FlutterPlugin, FlutterStreamHandl
5454
return "mobile"
5555
case .wiredEthernet:
5656
return "ethernet"
57+
case .constrained:
58+
return "satellite"
5759
case .other:
5860
return "other"
5961
case .none:

packages/connectivity_plus/connectivity_plus/ios/connectivity_plus/Sources/connectivity_plus/ConnectivityProvider.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ public enum ConnectivityType {
55
case wiredEthernet
66
case wifi
77
case cellular
8+
case constrained
89
case other
910
}
1011

packages/connectivity_plus/connectivity_plus/ios/connectivity_plus/Sources/connectivity_plus/PathMonitorConnectivityProvider.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ public class PathMonitorConnectivityProvider: NSObject, ConnectivityProvider {
2626
if path.usesInterfaceType(.other) {
2727
types.append(.other)
2828
}
29+
if path.isConstrained {
30+
types.append(.constrained)
31+
}
2932
}
3033

3134
return types.isEmpty ? [.none] : types

packages/connectivity_plus/connectivity_plus/macos/connectivity_plus/Sources/connectivity_plus/ConnectivityPlusPlugin.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ public class ConnectivityPlusPlugin: NSObject, FlutterPlugin, FlutterStreamHandl
5555
return "mobile"
5656
case .wiredEthernet:
5757
return "ethernet"
58+
case .constrained:
59+
return "satellite"
5860
case .other:
5961
return "other"
6062
case .none:

packages/connectivity_plus/connectivity_plus/macos/connectivity_plus/Sources/connectivity_plus/ConnectivityProvider.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ public enum ConnectivityType {
55
case wiredEthernet
66
case wifi
77
case cellular
8+
case constrained
89
case other
910
}
1011

packages/connectivity_plus/connectivity_plus/macos/connectivity_plus/Sources/connectivity_plus/PathMonitorConnectivityProvider.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ public class PathMonitorConnectivityProvider: NSObject, ConnectivityProvider {
2626
if path.usesInterfaceType(.other) {
2727
types.append(.other)
2828
}
29+
if path.isConstrained {
30+
types.append(.constrained)
31+
}
2932
}
3033

3134
return types.isEmpty ? [.none] : types

packages/connectivity_plus/connectivity_plus/test/connectivity_test.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ const List<ConnectivityResult> kCheckConnectivityResult = [
1212
ConnectivityResult.wifi
1313
];
1414

15+
const List<ConnectivityResult> kCheckConnectivitySatelliteResult = [
16+
ConnectivityResult.mobile,
17+
ConnectivityResult.satellite,
18+
];
19+
1520
void main() {
1621
group('Connectivity', () {
1722
late Connectivity connectivity;
@@ -26,6 +31,17 @@ void main() {
2631
final result = await connectivity.checkConnectivity();
2732
expect(result, kCheckConnectivityResult);
2833
});
34+
35+
test('checkConnectivity passes through satellite', () async {
36+
final satellitePlatform = MockSatelliteConnectivityPlatform();
37+
ConnectivityPlatform.instance = satellitePlatform;
38+
connectivity = Connectivity();
39+
final result = await connectivity.checkConnectivity();
40+
expect(
41+
result,
42+
containsAll(kCheckConnectivitySatelliteResult),
43+
);
44+
});
2945
});
3046
}
3147

@@ -37,3 +53,12 @@ class MockConnectivityPlatform extends Mock
3753
return kCheckConnectivityResult;
3854
}
3955
}
56+
57+
class MockSatelliteConnectivityPlatform extends Mock
58+
with MockPlatformInterfaceMixin
59+
implements ConnectivityPlatform {
60+
@override
61+
Future<List<ConnectivityResult>> checkConnectivity() async {
62+
return kCheckConnectivitySatelliteResult;
63+
}
64+
}

packages/connectivity_plus/connectivity_plus_platform_interface/lib/src/enums.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,18 @@ enum ConnectivityResult {
2222
/// It returns [other] on any device (also simulator).
2323
vpn,
2424

25+
/// Satellite: Device is connected via a highly constrained satellite link.
26+
///
27+
/// On iOS and macOS, reported when [NWPath.isConstrained] is true. This
28+
/// covers both satellite connections and Low Data Mode enabled by the user.
29+
/// Appears alongside [mobile] (e.g. `[mobile, satellite]`).
30+
///
31+
/// On Android 14+ (API 34), reported when [TRANSPORT_SATELLITE] capability
32+
/// is present. Appears as a standalone result.
33+
///
34+
/// Not reported on other platforms.
35+
satellite,
36+
2537
/// Other: Device is connected to an unknown network
2638
other
2739
}

packages/connectivity_plus/connectivity_plus_platform_interface/lib/src/utils.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ List<ConnectivityResult> parseConnectivityResults(List<String> states) {
1414
return ConnectivityResult.mobile;
1515
case 'vpn':
1616
return ConnectivityResult.vpn;
17+
case 'satellite':
18+
return ConnectivityResult.satellite;
1719
case 'other':
1820
return ConnectivityResult.other;
1921
default:

0 commit comments

Comments
 (0)