10000 Support to ignore network adapters used for ICE on Android, iOS and M… · liliBestCoder/flutter-webrtc@07bdb39 · GitHub
[go: up one dir, main page]

Skip to content

Commit 07bdb39

Browse files
Support to ignore network adapters used for ICE on Android, iOS and MacOS. (flutter-webrtc#1388)
* Added Adapter types in flutter * export adapter types * Support for networkIgnoreMask on Android * Support for networkIgnoreMask on iOS and MacOS * Updated C++ to support initialize with options * Ensuring initialized from flutter * Reformatted * Added missing break statement * Used adapter types from PeerConnectionFactory * Upgrade libwebrtc android => 114.5735.02
1 parent a4a7166 commit 07bdb39

File tree

7 files changed

+132
-20
lines changed

7 files changed

+132
-20
lines changed

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ android {
5151
}
5252

5353
dependencies {
54-
implementation 'io.github.webrtc-sdk:android:114.5735.01'
54+
implementation 'io.github.webrtc-sdk:android:114.5735.02'
5555
implementation 'com.twilio:audioswitch:1.1.7'
5656
implementation 'androidx.annotation:annotation:1.1.0'
5757
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

android/src/main/java/com/cloudwebrtc/webrtc/MethodCallHandlerImpl.java

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ void dispose() {
138138
mPeerConnectionObservers.clear();
139139
}
140140

141-
private void ensureInitialized() {
141+
private void initialize(int networkIgnoreMask) {
142142
if (mFactory != null) {
143143
return;
144144
}
@@ -163,8 +163,11 @@ private void ensureInitialized() {
163163

164164
getUserMediaImpl.audioDeviceModule = (JavaAudioDeviceModule) audioDeviceModule;
165165

166+
final Options options = new Options();
167+
options.networkIgnoreMask = networkIgnoreMask;
168+
166169
mFactory = PeerConnectionFactory.builder()
167-
.setOptions(new Options())
170+
.setOptions(options)
168171
.setVideoEncoderFactory(new SimulcastVideoEncoderFactoryWrapper(eglContext, true, true))
169172
.setVideoDecoderFactory(new WrappedVideoDecoderFactory(eglContext))
170173
.setAudioDeviceModule(audioDeviceModule)
@@ -173,10 +176,46 @@ private void ensureInitialized() {
173176

174177
@Override
175178
public void onMethodCall(MethodCall call, @NonNull Result notSafeResult) {
176-
ensureInitialized();
177179

178180
final AnyThreadResult result = new AnyThreadResult(notSafeResult);
179181
switch (call.method) {
182+
case "initialize": {
183+
int networkIgnoreMask = Options.ADAPTER_TYPE_UNKNOWN;
184+
Map<String, Object> options = call.argument("options");
185+
ConstraintsMap constraintsMap = new ConstraintsMap(options);
186+
if (constraintsMap.hasKey("networkIgnoreMask")
187+
&& constraintsMap.getType("networkIgnoreMask") == ObjectType.Array) {
188+
final ConstraintsArray ignoredAdapters = constraintsMap.getArray("networkIgnoreMask");
189+
if (ignoredAdapters != null) {
190+
for (Object adapter : ignoredAdapters.toArrayList()) {
191+
switch (adapter.toString()) {
192+
case "adapterTypeEthernet":
193+
networkIgnoreMask += Options.ADAPTER_TYPE_ETHERNET;
194+
break;
195+
case "adapterTypeWifi":
196+
networkIgnoreMask += Options.ADAPTER_TYPE_WIFI;
197+
break;
198+
case "adapterTypeCellular":
199+
networkIgnoreMask += Options.ADAPTER_TYPE_CELLULAR;
200+
break;
201+
case "adapterTypeVpn":
202+
networkIgnoreMask += Options.ADAPTER_TYPE_VPN;
203+
break;
204+
case "adapterTypeLoopback":
205+
networkIgnoreMask += Options.ADAPTER_TYPE_LOOPBACK;
206+
break;
207+
case "adapterTypeAny":
208+
networkIgnoreMask += Options.ADAPTER_TYPE_ANY;
209+
break;
210+
}
211+
}
212+
213+
}
214+
}
215+
initialize(networkIgnoreMask);
216+
result.success(null);
217+
break;
218+
}
180219
case "createPeerConnection": {
181220
Map<String, Object> constraints = call.argument("constraints");
182221
Map<String, Object> configuration = call.argument("configuration");

common/cpp/src/flutter_webrtc.cc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@ FlutterWebRTC::~FlutterWebRTC() {}
1919
void FlutterWebRTC::HandleMethodCall(
2020
const MethodCallProxy& method_call,
2121
std::unique_ptr<MethodResultProxy> result) {
22-
if (method_call.method_name().compare("createPeerConnection") == 0) {
22+
if (method_call.method_name().compare("initialize") == 0) {
23+
const EncodableMap params =
24+
GetValue<EncodableMap>(*method_call.arguments());
25+
const EncodableMap options = findMap(params, "options");
26+
result->Success();
27+
} else if (method_call.method_name().compare("createPeerConnection") == 0) {
2328
if (!method_call.arguments()) {
2429
result->Error("Bad Arguments", "Null arguments received");
2530
return;

common/darwin/Classes/FlutterWebRTCPlugin.m

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -135,15 +135,6 @@ - (instancetype)initWithChannel:(FlutterMethodChannel*)channel
135135
self.viewController = viewController;
136136
#endif
137137
}
138-
// RTCSetMinDebugLogLevel(RTCLoggingSeverityVerbose);
139-
VideoDecoderFactory* decoderFactory = [[VideoDecoderFactory alloc] init];
140-
VideoEncoderFactory* encoderFactory = [[VideoEncoderFactory alloc] init];
141-
142-
VideoEncoderFactorySimulcast* simulcastFactory =
143-
[[VideoEncoderFactorySimulcast alloc] initWithPrimary:encoderFactory fallback:encoderFactory];
144-
145-
_peerConnectionFactory = [[RTCPeerConnectionFactory alloc] initWithEncoderFactory:simulcastFactory
146-
decoderFactory:decoderFactory];
147138

148139
NSDictionary* fieldTrials = @{kRTCFieldTrialUseNWPathMonitor : kRTCFieldTrialEnabledValue};
149140
RTCInitFieldTrialDictionary(fieldTrials);
@@ -223,8 +214,55 @@ - (void)didSessionRouteChange:(NSNotification*)notification {
223214
#endif
224215
}
225216

217+
- (void)initialize:(NSArray*)networkIgnoreMask {
218+
// RTCSetMinDebugLogLevel(RTCLoggingSeverityVerbose);
219+
if (!_peerConnectionFactory) {
220+
VideoDecoderFactory* decoderFactory = [[VideoDecoderFactory alloc] init];
221+
VideoEncoderFactory* encoderFactory = [[VideoEncoderFactory alloc] init];
222+
223+
VideoEncoderFactorySimulcast* simulcastFactory =
224+
[[VideoEncoderFactorySimulcast alloc] initWithPrimary:encoderFactory fallback:encoderFactory];
225+
226+
_peerConnectionFactory = [[RTCPeerConnectionFactory alloc] initWithEncoderFactory:simulcastFactory
227+
decoderFactory:decoderFactory];
228+
229+
RTCPeerConnectionFactoryOptions *options = [[RTCPeerConnectionFactoryOptions alloc] init];
230+
for (NSString* adapter in networkIgnoreMask)
231+
{
232+
if ([@"adapterTypeEthernet" isEqualToString:adapter]) {
233+
options.ignoreEthernetNetworkAdapter = YES;
234+
} else if ([@"adapterTypeWifi" isEqualToString:adapter]) {
235+
options.ignoreWiFiNetworkAdapter = YES;
236+
} else if ([@"adapterTypeCellular" isEqualToString:adapter]) {
237+
options.ignoreCellularNetworkAdapter = YES;
238+
} else if ([@"adapterTypeVpn" isEqualToString:adapter]) {
239+
options.ignoreVPNNetworkAdapter = YES;
240+
} else if ([@"adapterTypeLoopback" isEqualToString:adapter]) {
241+
options.ignoreLoopbackNetworkAdapter = YES;
242+
} else if ([@"adapterTypeAny" isEqualToString:adapter]) {
243+
options.ignoreEthernetNetworkAdapter = YES;
244+
options.ignoreWiFiNetworkAdapter = YES;
245+
options.ignoreCellularNetworkAdapter = YES;
246+
options.ignoreVPNNetworkAdapter = YES;
247+
options.ignoreLoopbackNetworkAdapter = YES;
248+
}
249+
}
250+
251+
[_peerConnectionFactory setOptions: options];
252+
}
253+
}
254+
226255
- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
227-
if ([@"createPeerConnection" isEqualToString:call.method]) {
256+
if ([@"initialize" isEqualToString:call.method]) {
257+
NSDictionary* argsMap = call.arguments;
258+
NSDictionary* options = argsMap[@"options"];
259+
NSArray* networkIgnoreMask = [NSArray new];
260+
if (options[@"networkIgnoreMask"] != nil) {
261+
networkIgnoreMask = ((NSArray*)options[@"networkIgnoreMask"]);
262+
}
263+
[self initialize:networkIgnoreMask];
264+
result(@"");
265+
} else if ([@"createPeerConnection" isEqualToString:call.method]) {
228266
NSDictionary* argsMap = call.arguments;
229267
NSDictionary* configuration = argsMap[@"configuration"];
230268
NSDictionary* constraints = argsMap[@"constraints"];

lib/flutter_webrtc.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ export 'src/native/rtc_video_renderer_impl.dart'
1414
export 'src/native/rtc_video_view_impl.dart'
1515
if (dart.library.html) 'src/web/rtc_video_view_impl.dart';
1616
export 'src/native/utils.dart' if (dart.library.html) 'src/web/utils.dart';
17+
export 'src/native/adapter_type.dart';

lib/src/native/adapter_type.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import 'package:flutter/foundation.dart';
2+
3+
enum AdapterType {
4+
adapterTypeUnknown,
5+
adapterTypeEthernet,
6+
adapterTypeWifi,
7+
adapterTypeCellular,
8+
adapterTypeVpn,
9+
adapterTypeLoopback,
10+
adapterTypeAny
11+
}
12+
13+
extension AdapterTypeExt on AdapterType {
14+
String get value => describeEnum(this);
15+
}

lib/src/native/utils.dart

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,23 @@ class WebRTC {
2323
static bool get platformIsWeb => false;
2424

2525
static Future<T?> invokeMethod<T, P>(String methodName,
26-
[dynamic param]) async =>
27-
_channel.invokeMethod<T>(
28-
methodName,
29-
param,
30-
);
26+
[dynamic param]) async {
27+
await initialize();
28+
29+
return _channel.invokeMethod<T>(
30+
methodName,
31+
param,
32+
);
33+
}
34+
35+
static bool initialized = false;
36+
37+
static Future<void> initialize({Map<String, dynamic>? options}) async {
38+
if (!initialized) {
39+
await _channel.invokeMethod<void>('initialize', <String, dynamic>{
40+
'options': options ?? {},
41+
});
42+
initialized = true;
43+
}
44+
}
3145
}

0 commit comments

Comments
 (0)
0