diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn index 9863d6132e..dda61cea08 100644 --- a/sdk/android/BUILD.gn +++ b/sdk/android/BUILD.gn @@ -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", ] diff --git a/sdk/android/api/org/webrtc/NetworkChangeDetector.java b/sdk/android/api/org/webrtc/NetworkChangeDetector.java index 856fe7dad7..ed3210e00b 100644 --- a/sdk/android/api/org/webrtc/NetworkChangeDetector.java +++ b/sdk/android/api/org/webrtc/NetworkChangeDetector.java @@ -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 { *

note: `types` is a list of ConnectionTypes, so that all cellular types can be modified in * one call. */ - public void onNetworkPreference(List types, @NetworkPreference int preference); + public abstract void onNetworkPreference( + List types, @NetworkPreference int preference); + + // Add default impl. for down-stream tests. + public String getFieldTrialsString() { + return ""; + } } public ConnectionType getCurrentConnectionType(); diff --git a/sdk/android/api/org/webrtc/NetworkMonitor.java b/sdk/android/api/org/webrtc/NetworkMonitor.java index 9e14a2e00b..173f76e87e 100644 --- a/sdk/android/api/org/webrtc/NetworkMonitor.java +++ b/sdk/android/api/org/webrtc/NetworkMonitor.java @@ -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 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; } diff --git a/sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java b/sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java index 750dcb303c..a894c0d6b1 100644 --- a/sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java +++ b/sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java @@ -176,26 +176,29 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver implements Netwo private final boolean requestVPN; private final boolean includeOtherUidNetworks; - ConnectivityManagerDelegate(Context context, Set availableNetworks) { + ConnectivityManagerDelegate( + Context context, Set availableNetworks, String fieldTrialsString) { this((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE), - availableNetworks, - PeerConnectionFactory.fieldTrialsFindFullName("WebRTC-NetworkMonitorAutoDetect")); + availableNetworks, fieldTrialsString); } @VisibleForTesting ConnectivityManagerDelegate(ConnectivityManager connectivityManager, - Set availableNetworks, String fieldTrials) { + Set 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(); diff --git a/sdk/android/instrumentationtests/src/org/webrtc/NetworkMonitorTest.java b/sdk/android/instrumentationtests/src/org/webrtc/NetworkMonitorTest.java index fc87806dec..b646f1f4eb 100644 --- a/sdk/android/instrumentationtests/src/org/webrtc/NetworkMonitorTest.java +++ b/sdk/android/instrumentationtests/src/org/webrtc/NetworkMonitorTest.java @@ -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 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 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(); diff --git a/sdk/android/native_unittests/android_network_monitor_unittest.cc b/sdk/android/native_unittests/android_network_monitor_unittest.cc index c342ce692e..129168cce2 100644 --- a/sdk/android/native_unittests/android_network_monitor_unittest.cc +++ b/sdk/android/native_unittests/android_network_monitor_unittest.cc @@ -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 context = test::GetAppContextForTest(env); - network_monitor_ = - std::make_unique(env, context); + network_monitor_ = std::make_unique( + env, context, field_trials_); } void SetUp() override { @@ -62,6 +61,7 @@ class AndroidNetworkMonitorTest : public ::testing::Test { } protected: + test::ScopedKeyValueConfig field_trials_; std::unique_ptr 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 = diff --git a/sdk/android/src/jni/android_network_monitor.cc b/sdk/android/src/jni/android_network_monitor.cc index 67206c8505..59a9204fe2 100644 --- a/sdk/android/src/jni/android_network_monitor.cc +++ b/sdk/android/src/jni/android_network_monitor.cc @@ -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& j_application_context) + const JavaRef& 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( - "WebRTC-FindNetworkHandleWithoutIpv6TemporaryPart"); + 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( diff --git a/sdk/android/src/jni/android_network_monitor.h b/sdk/android/src/jni/android_network_monitor.h index a7cb766c0c..dd661acdcf 100644 --- a/sdk/android/src/jni/android_network_monitor.h +++ b/sdk/android/src/jni/android_network_monitor.h @@ -70,7 +70,8 @@ struct NetworkInformation { class AndroidNetworkMonitor : public rtc::NetworkMonitorInterface { public: AndroidNetworkMonitor(JNIEnv* env, - const JavaRef& j_application_context); + const JavaRef& 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 safety_flag_ RTC_PT_GUARDED_BY(network_thread_) = nullptr; + + const FieldTrialsView& field_trials_; }; class AndroidNetworkMonitorFactory : public rtc::NetworkMonitorFactory {