Reland WebRTC-DeprecateGlobalFieldTrialString/Enabled/ - part 14/inf
Modify cl/ a bit and add fieldtrialsstring on observer not to break downstream projects. --- WebRTC-DeprecateGlobalFieldTrialString/Enabled/ - part 14/inf This cl/ passes field trials all the way from c++ to the android NetworkMonitorAutoDetect.java Bug: webrtc:10335 Change-Id: Ic6842612eed36b684340f0f78f4087bee249cc50 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/257081 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Jonas Oreland <jonaso@webrtc.org> Cr-Commit-Position: refs/heads/main@{#36498} --- Bug: webrtc:10335 Change-Id: Ied43770977465a0042541a61d29a9015c0b9cdc8 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/258622 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Jonas Oreland <jonaso@webrtc.org> Cr-Commit-Position: refs/heads/main@{#36520}
This commit is contained in:

committed by
WebRTC LUCI CQ

parent
eaf632a8a5
commit
4bc12200b6
@ -1631,6 +1631,7 @@ if (is_android) {
|
||||
":native_api_video",
|
||||
":opensles_audio_device_module",
|
||||
":video_jni",
|
||||
"../../api:field_trials_view",
|
||||
"../../api:scoped_refptr",
|
||||
"../../api/rtc_event_log:rtc_event_log_factory",
|
||||
"../../api/task_queue:default_task_queue_factory",
|
||||
@ -1657,9 +1658,8 @@ if (is_android) {
|
||||
"../../rtc_base/synchronization:mutex",
|
||||
"../../rtc_base/system:inline",
|
||||
"../../system_wrappers",
|
||||
"../../system_wrappers:field_trial",
|
||||
"../../test:field_trial",
|
||||
"../../test:fileutils",
|
||||
"../../test:scoped_key_value_config",
|
||||
"../../test:test_support",
|
||||
"../../testing/gtest",
|
||||
]
|
||||
|
@ -88,13 +88,13 @@ public interface NetworkChangeDetector {
|
||||
};
|
||||
|
||||
/** Observer interface by which observer is notified of network changes. */
|
||||
public static interface Observer {
|
||||
public static abstract class Observer {
|
||||
/** Called when default network changes. */
|
||||
public void onConnectionTypeChanged(ConnectionType newConnectionType);
|
||||
public abstract void onConnectionTypeChanged(ConnectionType newConnectionType);
|
||||
|
||||
public void onNetworkConnect(NetworkInformation networkInfo);
|
||||
public abstract void onNetworkConnect(NetworkInformation networkInfo);
|
||||
|
||||
public void onNetworkDisconnect(long networkHandle);
|
||||
public abstract void onNetworkDisconnect(long networkHandle);
|
||||
|
||||
/**
|
||||
* Called when network preference change for a (list of) connection type(s). (e.g WIFI) is
|
||||
@ -103,7 +103,13 @@ public interface NetworkChangeDetector {
|
||||
* <p>note: `types` is a list of ConnectionTypes, so that all cellular types can be modified in
|
||||
* one call.
|
||||
*/
|
||||
public void onNetworkPreference(List<ConnectionType> types, @NetworkPreference int preference);
|
||||
public abstract void onNetworkPreference(
|
||||
List<ConnectionType> types, @NetworkPreference int preference);
|
||||
|
||||
// Add default impl. for down-stream tests.
|
||||
public String getFieldTrialsString() {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public ConnectionType getCurrentConnectionType();
|
||||
|
@ -101,20 +101,26 @@ public class NetworkMonitor {
|
||||
* multi-networking. This requires the embedding app have the platform ACCESS_NETWORK_STATE and
|
||||
* CHANGE_NETWORK_STATE permission.
|
||||
*/
|
||||
public void startMonitoring(Context applicationContext) {
|
||||
public void startMonitoring(Context applicationContext, String fieldTrialsString) {
|
||||
synchronized (networkChangeDetectorLock) {
|
||||
++numObservers;
|
||||
if (networkChangeDetector == null) {
|
||||
networkChangeDetector = createNetworkChangeDetector(applicationContext);
|
||||
networkChangeDetector = createNetworkChangeDetector(applicationContext, fieldTrialsString);
|
||||
}
|
||||
currentConnectionType = networkChangeDetector.getCurrentConnectionType();
|
||||
}
|
||||
}
|
||||
|
||||
/** Deprecated, use startMonitoring with fieldTrialsStringString argument. */
|
||||
@Deprecated
|
||||
public void startMonitoring(Context applicationContext) {
|
||||
startMonitoring(applicationContext, "");
|
||||
}
|
||||
|
||||
/** Deprecated, pass in application context in startMonitoring instead. */
|
||||
@Deprecated
|
||||
public void startMonitoring() {
|
||||
startMonitoring(ContextUtils.getApplicationContext());
|
||||
startMonitoring(ContextUtils.getApplicationContext(), "");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -123,11 +129,15 @@ public class NetworkMonitor {
|
||||
* CHANGE_NETWORK_STATE permission.
|
||||
*/
|
||||
@CalledByNative
|
||||
private void startMonitoring(@Nullable Context applicationContext, long nativeObserver) {
|
||||
Logging.d(TAG, "Start monitoring with native observer " + nativeObserver);
|
||||
private void startMonitoring(
|
||||
@Nullable Context applicationContext, long nativeObserver, String fieldTrialsString) {
|
||||
Logging.d(TAG,
|
||||
"Start monitoring with native observer " + nativeObserver
|
||||
+ " fieldTrialsString: " + fieldTrialsString);
|
||||
|
||||
startMonitoring(
|
||||
applicationContext != null ? applicationContext : ContextUtils.getApplicationContext());
|
||||
applicationContext != null ? applicationContext : ContextUtils.getApplicationContext(),
|
||||
fieldTrialsString);
|
||||
// The native observers expect a network list update after they call startMonitoring.
|
||||
synchronized (nativeNetworkObservers) {
|
||||
nativeNetworkObservers.add(nativeObserver);
|
||||
@ -177,7 +187,8 @@ public class NetworkMonitor {
|
||||
return currentConnectionType;
|
||||
}
|
||||
|
||||
private NetworkChangeDetector createNetworkChangeDetector(Context appContext) {
|
||||
private NetworkChangeDetector createNetworkChangeDetector(
|
||||
Context appContext, String fieldTrialsString) {
|
||||
return networkChangeDetectorFactory.create(new NetworkChangeDetector.Observer() {
|
||||
@Override
|
||||
public void onConnectionTypeChanged(NetworkChangeDetector.ConnectionType newConnectionType) {
|
||||
@ -199,6 +210,11 @@ public class NetworkMonitor {
|
||||
List<NetworkChangeDetector.ConnectionType> types, int preference) {
|
||||
notifyObserversOfNetworkPreference(types, preference);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFieldTrialsString() {
|
||||
return fieldTrialsString;
|
||||
}
|
||||
}, appContext);
|
||||
}
|
||||
|
||||
@ -339,10 +355,11 @@ public class NetworkMonitor {
|
||||
}
|
||||
|
||||
// For testing only.
|
||||
static NetworkMonitorAutoDetect createAndSetAutoDetectForTest(Context context) {
|
||||
static NetworkMonitorAutoDetect createAndSetAutoDetectForTest(
|
||||
Context context, String fieldTrialsString) {
|
||||
NetworkMonitor networkMonitor = getInstance();
|
||||
NetworkChangeDetector networkChangeDetector =
|
||||
networkMonitor.createNetworkChangeDetector(context);
|
||||
networkMonitor.createNetworkChangeDetector(context, fieldTrialsString);
|
||||
networkMonitor.networkChangeDetector = networkChangeDetector;
|
||||
return (NetworkMonitorAutoDetect) networkChangeDetector;
|
||||
}
|
||||
|
@ -176,26 +176,29 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver implements Netwo
|
||||
private final boolean requestVPN;
|
||||
private final boolean includeOtherUidNetworks;
|
||||
|
||||
ConnectivityManagerDelegate(Context context, Set<Network> availableNetworks) {
|
||||
ConnectivityManagerDelegate(
|
||||
Context context, Set<Network> availableNetworks, String fieldTrialsString) {
|
||||
this((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE),
|
||||
availableNetworks,
|
||||
PeerConnectionFactory.fieldTrialsFindFullName("WebRTC-NetworkMonitorAutoDetect"));
|
||||
availableNetworks, fieldTrialsString);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
ConnectivityManagerDelegate(ConnectivityManager connectivityManager,
|
||||
Set<Network> availableNetworks, String fieldTrials) {
|
||||
Set<Network> availableNetworks, String fieldTrialsString) {
|
||||
this.connectivityManager = connectivityManager;
|
||||
this.availableNetworks = availableNetworks;
|
||||
this.getAllNetworksFromCache = checkFieldTrial(fieldTrials, "getAllNetworksFromCache", false);
|
||||
this.requestVPN = checkFieldTrial(fieldTrials, "requestVPN", false);
|
||||
this.includeOtherUidNetworks = checkFieldTrial(fieldTrials, "includeOtherUidNetworks", false);
|
||||
this.getAllNetworksFromCache =
|
||||
checkFieldTrial(fieldTrialsString, "getAllNetworksFromCache", false);
|
||||
this.requestVPN = checkFieldTrial(fieldTrialsString, "requestVPN", false);
|
||||
this.includeOtherUidNetworks =
|
||||
checkFieldTrial(fieldTrialsString, "includeOtherUidNetworks", false);
|
||||
}
|
||||
|
||||
private static boolean checkFieldTrial(String fieldTrials, String key, boolean defaultValue) {
|
||||
if (fieldTrials.contains(key + ":true")) {
|
||||
private static boolean checkFieldTrial(
|
||||
String fieldTrialsString, String key, boolean defaultValue) {
|
||||
if (fieldTrialsString.contains(key + ":true")) {
|
||||
return true;
|
||||
} else if (fieldTrials.contains(key + ":false")) {
|
||||
} else if (fieldTrialsString.contains(key + ":false")) {
|
||||
return false;
|
||||
}
|
||||
return defaultValue;
|
||||
@ -638,7 +641,9 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver implements Netwo
|
||||
public NetworkMonitorAutoDetect(NetworkChangeDetector.Observer observer, Context context) {
|
||||
this.observer = observer;
|
||||
this.context = context;
|
||||
connectivityManagerDelegate = new ConnectivityManagerDelegate(context, availableNetworks);
|
||||
String fieldTrialsString = observer.getFieldTrialsString();
|
||||
connectivityManagerDelegate =
|
||||
new ConnectivityManagerDelegate(context, availableNetworks, fieldTrialsString);
|
||||
wifiManagerDelegate = new WifiManagerDelegate(context);
|
||||
|
||||
final NetworkState networkState = connectivityManagerDelegate.getNetworkState();
|
||||
|
@ -58,6 +58,7 @@ import org.webrtc.NetworkMonitorAutoDetect.SimpleNetworkCallback;
|
||||
public class NetworkMonitorTest {
|
||||
private static final long INVALID_NET_ID = -1;
|
||||
private NetworkChangeDetector detector;
|
||||
private String fieldTrialsString = "";
|
||||
|
||||
/**
|
||||
* Listens for alerts fired by the NetworkMonitor when network status changes.
|
||||
@ -94,7 +95,7 @@ public class NetworkMonitorTest {
|
||||
}
|
||||
|
||||
MockConnectivityManagerDelegate(Set<Network> availableNetworks, String fieldTrialsString) {
|
||||
super(null, availableNetworks, fieldTrialsString);
|
||||
super((ConnectivityManager) null, availableNetworks, fieldTrialsString);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -160,7 +161,13 @@ public class NetworkMonitorTest {
|
||||
|
||||
// A dummy NetworkMonitorAutoDetect.Observer.
|
||||
private static class TestNetworkMonitorAutoDetectObserver
|
||||
implements NetworkMonitorAutoDetect.Observer {
|
||||
extends NetworkMonitorAutoDetect.Observer {
|
||||
final String fieldTrialsString;
|
||||
|
||||
TestNetworkMonitorAutoDetectObserver(String fieldTrialsString) {
|
||||
this.fieldTrialsString = fieldTrialsString;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConnectionTypeChanged(ConnectionType newConnectionType) {}
|
||||
|
||||
@ -173,6 +180,11 @@ public class NetworkMonitorTest {
|
||||
@Override
|
||||
public void onNetworkPreference(List<ConnectionType> types, @NetworkPreference int preference) {
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public String getFieldTrialsString() {
|
||||
// return fieldTrialsString;
|
||||
// }
|
||||
}
|
||||
|
||||
private NetworkMonitorAutoDetect receiver;
|
||||
@ -195,7 +207,7 @@ public class NetworkMonitorTest {
|
||||
}
|
||||
});
|
||||
|
||||
receiver = NetworkMonitor.createAndSetAutoDetectForTest(context);
|
||||
receiver = NetworkMonitor.createAndSetAutoDetectForTest(context, fieldTrialsString);
|
||||
assertNotNull(receiver);
|
||||
|
||||
connectivityDelegate = new MockConnectivityManagerDelegate();
|
||||
@ -226,7 +238,8 @@ public class NetworkMonitorTest {
|
||||
public void testNetworkMonitorRegistersInConstructor() throws InterruptedException {
|
||||
Context context = InstrumentationRegistry.getTargetContext();
|
||||
|
||||
NetworkMonitorAutoDetect.Observer observer = new TestNetworkMonitorAutoDetectObserver();
|
||||
NetworkMonitorAutoDetect.Observer observer =
|
||||
new TestNetworkMonitorAutoDetectObserver(fieldTrialsString);
|
||||
|
||||
NetworkMonitorAutoDetect receiver = new NetworkMonitorAutoDetect(observer, context);
|
||||
|
||||
@ -287,7 +300,7 @@ public class NetworkMonitorTest {
|
||||
@SmallTest
|
||||
public void testConnectivityManagerDelegateDoesNotCrash() {
|
||||
ConnectivityManagerDelegate delegate = new ConnectivityManagerDelegate(
|
||||
InstrumentationRegistry.getTargetContext(), new HashSet<>());
|
||||
InstrumentationRegistry.getTargetContext(), new HashSet<>(), fieldTrialsString);
|
||||
delegate.getNetworkState();
|
||||
Network[] networks = delegate.getAllNetworks();
|
||||
if (networks.length >= 1) {
|
||||
@ -359,8 +372,9 @@ public class NetworkMonitorTest {
|
||||
assertTrue(request.equals(builder.build()));
|
||||
}
|
||||
|
||||
private NetworkRequest getNetworkRequestForFieldTrials(String fieldTrials) {
|
||||
return new ConnectivityManagerDelegate(null, new HashSet<>(), fieldTrials)
|
||||
private NetworkRequest getNetworkRequestForFieldTrials(String fieldTrialsString) {
|
||||
return new ConnectivityManagerDelegate(
|
||||
(ConnectivityManager) null, new HashSet<>(), fieldTrialsString)
|
||||
.createNetworkRequest();
|
||||
}
|
||||
|
||||
@ -372,7 +386,8 @@ public class NetworkMonitorTest {
|
||||
@Test
|
||||
@SmallTest
|
||||
public void testQueryableAPIsDoNotCrash() {
|
||||
NetworkMonitorAutoDetect.Observer observer = new TestNetworkMonitorAutoDetectObserver();
|
||||
NetworkMonitorAutoDetect.Observer observer =
|
||||
new TestNetworkMonitorAutoDetectObserver(fieldTrialsString);
|
||||
NetworkMonitorAutoDetect ncn =
|
||||
new NetworkMonitorAutoDetect(observer, InstrumentationRegistry.getTargetContext());
|
||||
ncn.getDefaultNetId();
|
||||
@ -386,7 +401,7 @@ public class NetworkMonitorTest {
|
||||
public void testStartStopMonitoring() {
|
||||
NetworkMonitor networkMonitor = NetworkMonitor.getInstance();
|
||||
Context context = ContextUtils.getApplicationContext();
|
||||
networkMonitor.startMonitoring(context);
|
||||
networkMonitor.startMonitoring(context, fieldTrialsString);
|
||||
assertEquals(1, networkMonitor.getNumObservers());
|
||||
assertEquals(detector, networkMonitor.getNetworkChangeDetector());
|
||||
networkMonitor.stopMonitoring();
|
||||
|
@ -13,9 +13,8 @@
|
||||
#include "rtc_base/ip_address.h"
|
||||
#include "sdk/android/native_unittests/application_context_provider.h"
|
||||
#include "sdk/android/src/jni/jni_helpers.h"
|
||||
#include "system_wrappers/include/field_trial.h"
|
||||
#include "test/field_trial.h"
|
||||
#include "test/gtest.h"
|
||||
#include "test/scoped_key_value_config.h"
|
||||
|
||||
namespace webrtc {
|
||||
namespace test {
|
||||
@ -47,8 +46,8 @@ class AndroidNetworkMonitorTest : public ::testing::Test {
|
||||
AndroidNetworkMonitorTest() {
|
||||
JNIEnv* env = AttachCurrentThreadIfNeeded();
|
||||
ScopedJavaLocalRef<jobject> context = test::GetAppContextForTest(env);
|
||||
network_monitor_ =
|
||||
std::make_unique<jni::AndroidNetworkMonitor>(env, context);
|
||||
network_monitor_ = std::make_unique<jni::AndroidNetworkMonitor>(
|
||||
env, context, field_trials_);
|
||||
}
|
||||
|
||||
void SetUp() override {
|
||||
@ -62,6 +61,7 @@ class AndroidNetworkMonitorTest : public ::testing::Test {
|
||||
}
|
||||
|
||||
protected:
|
||||
test::ScopedKeyValueConfig field_trials_;
|
||||
std::unique_ptr<jni::AndroidNetworkMonitor> network_monitor_;
|
||||
};
|
||||
|
||||
@ -102,7 +102,8 @@ TEST_F(AndroidNetworkMonitorTest, TestFindNetworkHandleUsingFullIpv6Address) {
|
||||
|
||||
TEST_F(AndroidNetworkMonitorTest,
|
||||
TestFindNetworkHandleIgnoringIpv6TemporaryPart) {
|
||||
ScopedFieldTrials field_trials(
|
||||
ScopedKeyValueConfig field_trials(
|
||||
field_trials_,
|
||||
"WebRTC-FindNetworkHandleWithoutIpv6TemporaryPart/Enabled/");
|
||||
// Start() updates the states introduced by the field trial.
|
||||
network_monitor_->Start();
|
||||
@ -154,7 +155,8 @@ TEST_F(AndroidNetworkMonitorTest, TestFindNetworkHandleUsingIfName) {
|
||||
}
|
||||
|
||||
TEST_F(AndroidNetworkMonitorTest, TestUnderlyingVpnType) {
|
||||
ScopedFieldTrials field_trials("WebRTC-BindUsingInterfaceName/Enabled/");
|
||||
ScopedKeyValueConfig field_trials(field_trials_,
|
||||
"WebRTC-BindUsingInterfaceName/Enabled/");
|
||||
jni::NetworkHandle ipv4_handle = 100;
|
||||
rtc::IPAddress ipv4_address(kTestIpv4Address);
|
||||
jni::NetworkInformation net_info =
|
||||
|
@ -28,7 +28,6 @@
|
||||
#include "sdk/android/generated_base_jni/NetworkMonitor_jni.h"
|
||||
#include "sdk/android/native_api/jni/java_types.h"
|
||||
#include "sdk/android/src/jni/jni_helpers.h"
|
||||
#include "system_wrappers/include/field_trial.h"
|
||||
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
@ -227,11 +226,13 @@ std::string NetworkInformation::ToString() const {
|
||||
|
||||
AndroidNetworkMonitor::AndroidNetworkMonitor(
|
||||
JNIEnv* env,
|
||||
const JavaRef<jobject>& j_application_context)
|
||||
const JavaRef<jobject>& j_application_context,
|
||||
const FieldTrialsView& field_trials)
|
||||
: android_sdk_int_(Java_NetworkMonitor_androidSdkInt(env)),
|
||||
j_application_context_(env, j_application_context),
|
||||
j_network_monitor_(env, Java_NetworkMonitor_getInstance(env)),
|
||||
network_thread_(rtc::Thread::Current()) {}
|
||||
network_thread_(rtc::Thread::Current()),
|
||||
field_trials_(field_trials) {}
|
||||
|
||||
AndroidNetworkMonitor::~AndroidNetworkMonitor() {
|
||||
RTC_DCHECK(!started_);
|
||||
@ -244,13 +245,12 @@ void AndroidNetworkMonitor::Start() {
|
||||
}
|
||||
started_ = true;
|
||||
surface_cellular_types_ =
|
||||
webrtc::field_trial::IsEnabled("WebRTC-SurfaceCellularTypes");
|
||||
find_network_handle_without_ipv6_temporary_part_ =
|
||||
webrtc::field_trial::IsEnabled(
|
||||
field_trials_.IsEnabled("WebRTC-SurfaceCellularTypes");
|
||||
find_network_handle_without_ipv6_temporary_part_ = field_trials_.IsEnabled(
|
||||
"WebRTC-FindNetworkHandleWithoutIpv6TemporaryPart");
|
||||
bind_using_ifname_ =
|
||||
!webrtc::field_trial::IsDisabled("WebRTC-BindUsingInterfaceName");
|
||||
disable_is_adapter_available_ = webrtc::field_trial::IsDisabled(
|
||||
!field_trials_.IsDisabled("WebRTC-BindUsingInterfaceName");
|
||||
disable_is_adapter_available_ = field_trials_.IsDisabled(
|
||||
"WebRTC-AndroidNetworkMonitor-IsAdapterAvailable");
|
||||
|
||||
// This pointer is also accessed by the methods called from java threads.
|
||||
@ -260,7 +260,9 @@ void AndroidNetworkMonitor::Start() {
|
||||
|
||||
JNIEnv* env = AttachCurrentThreadIfNeeded();
|
||||
Java_NetworkMonitor_startMonitoring(
|
||||
env, j_network_monitor_, j_application_context_, jlongFromPointer(this));
|
||||
env, j_network_monitor_, j_application_context_, jlongFromPointer(this),
|
||||
NativeToJavaString(
|
||||
env, field_trials_.Lookup("WebRTC-NetworkMonitorAutoDetect")));
|
||||
}
|
||||
|
||||
void AndroidNetworkMonitor::Stop() {
|
||||
@ -608,7 +610,7 @@ rtc::NetworkMonitorInterface*
|
||||
AndroidNetworkMonitorFactory::CreateNetworkMonitor(
|
||||
const FieldTrialsView& field_trials) {
|
||||
return new AndroidNetworkMonitor(AttachCurrentThreadIfNeeded(),
|
||||
j_application_context_);
|
||||
j_application_context_, field_trials);
|
||||
}
|
||||
|
||||
void AndroidNetworkMonitor::NotifyConnectionTypeChanged(
|
||||
|
@ -70,7 +70,8 @@ struct NetworkInformation {
|
||||
class AndroidNetworkMonitor : public rtc::NetworkMonitorInterface {
|
||||
public:
|
||||
AndroidNetworkMonitor(JNIEnv* env,
|
||||
const JavaRef<jobject>& j_application_context);
|
||||
const JavaRef<jobject>& j_application_context,
|
||||
const FieldTrialsView& field_trials);
|
||||
~AndroidNetworkMonitor() override;
|
||||
|
||||
// TODO(sakal): Remove once down stream dependencies have been updated.
|
||||
@ -160,6 +161,8 @@ class AndroidNetworkMonitor : public rtc::NetworkMonitorInterface {
|
||||
|
||||
rtc::scoped_refptr<PendingTaskSafetyFlag> safety_flag_
|
||||
RTC_PT_GUARDED_BY(network_thread_) = nullptr;
|
||||
|
||||
const FieldTrialsView& field_trials_;
|
||||
};
|
||||
|
||||
class AndroidNetworkMonitorFactory : public rtc::NetworkMonitorFactory {
|
||||
|
Reference in New Issue
Block a user