Skip to content

Commit 2b58cff

Browse files
Gibbo97Jack Gibbonsvbuberen
authored
feat(connectivity_plus): add ConnectivityResult.satellite on Android and iOS (#3771)
Co-authored-by: Jack Gibbons <jack@resolutionapp.co.nz> Co-authored-by: Volodymyr Buberenko <vbuberen@users.noreply.github.com>
1 parent ae6330b commit 2b58cff

File tree

12 files changed

+78
-0
lines changed

12 files changed

+78
-0
lines changed

packages/connectivity_plus/connectivity_plus/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ if (connectivityResult.contains(ConnectivityResult.mobile)) {
5656
// It returns [other] on any device (also simulator)
5757
} else if (connectivityResult.contains(ConnectivityResult.bluetooth)) {
5858
// Bluetooth connection available.
59+
} else if (connectivityResult.contains(ConnectivityResult.satellite)) {
60+
// Carrier-provided satellite network available
5961
} else if (connectivityResult.contains(ConnectivityResult.other)) {
6062
// Connected to a network which is not in the above mentioned networks.
6163
} else if (connectivityResult.contains(ConnectivityResult.none)) {
@@ -109,6 +111,7 @@ The following table shows which `ConnectivityResult` values are supported per pl
109111
| ethernet | :white_check_mark: | :white_check_mark: | | :white_check_mark: | :white_check_mark: | :white_check_mark: |
110112
| mobile | :white_check_mark: | :white_check_mark: | | :white_check_mark: | | |
111113
| vpn | :white_check_mark: | | | | :white_check_mark: | :white_check_mark: |
114+
| satellite | :white_check_mark: | :white_check_mark: | | | | |
112115
| other | :white_check_mark: | :white_check_mark: | | :white_check_mark: | :white_check_mark: | :white_check_mark: |
113116

114117
_`none` is supported on all platforms by default._

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
@@ -20,6 +20,7 @@ public class Connectivity {
2020
static final String CONNECTIVITY_ETHERNET = "ethernet";
2121
static final String CONNECTIVITY_BLUETOOTH = "bluetooth";
2222
static final String CONNECTIVITY_VPN = "vpn";
23+
static final String CONNECTIVITY_SATELLITE = "satellite";
2324
static final String CONNECTIVITY_OTHER = "other";
2425
private final ConnectivityManager connectivityManager;
2526

@@ -67,6 +68,10 @@ List<String> getCapabilitiesList(NetworkCapabilities capabilities) {
6768
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH)) {
6869
types.add(CONNECTIVITY_BLUETOOTH);
6970
}
71+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM
72+
&& capabilities.hasTransport(NetworkCapabilities.TRANSPORT_SATELLITE)) {
73+
types.add(CONNECTIVITY_SATELLITE);
74+
}
7075
if (types.isEmpty()
7176
&& capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
7277
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 .satellite:
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 satellite
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 #available(iOS 26.0, *), path.isUltraConstrained {
30+
types.append(.satellite)
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 .satellite:
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 satellite
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 #available(macOS 26.0, *), path.isUltraConstrained {
30+
types.append(.satellite)
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: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,17 @@ 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.isUltraConstrained] is true.
28+
/// Appears alongside [mobile] (e.g. `[mobile, satellite]`).
29+
///
30+
/// On Android 15 (API 35) and newer, reported when [TRANSPORT_SATELLITE] capability
31+
/// is present.
32+
///
33+
/// Not reported on other platforms.
34+
satellite,
35+
2536
/// Other: Device is connected to an unknown network
2637
other
2738
}

0 commit comments

Comments
 (0)