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}
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index 9863d61..dda61ce 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -1631,6 +1631,7 @@
":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 @@
"../../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 856fe7d..ed3210e 100644
--- a/sdk/android/api/org/webrtc/NetworkChangeDetector.java
+++ b/sdk/android/api/org/webrtc/NetworkChangeDetector.java
@@ -88,13 +88,13 @@
};
/** 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 @@
* <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();
diff --git a/sdk/android/api/org/webrtc/NetworkMonitor.java b/sdk/android/api/org/webrtc/NetworkMonitor.java
index 9e14a2e..173f76e 100644
--- a/sdk/android/api/org/webrtc/NetworkMonitor.java
+++ b/sdk/android/api/org/webrtc/NetworkMonitor.java
@@ -101,20 +101,26 @@
* 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 @@
* 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 @@
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 @@
List<NetworkChangeDetector.ConnectionType> types, int preference) {
notifyObserversOfNetworkPreference(types, preference);
}
+
+ @Override
+ public String getFieldTrialsString() {
+ return fieldTrialsString;
+ }
}, appContext);
}
@@ -339,10 +355,11 @@
}
// 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 750dcb3..a894c0d 100644
--- a/sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java
+++ b/sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java
@@ -176,26 +176,29 @@
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 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 fc87806..b646f1f 100644
--- a/sdk/android/instrumentationtests/src/org/webrtc/NetworkMonitorTest.java
+++ b/sdk/android/instrumentationtests/src/org/webrtc/NetworkMonitorTest.java
@@ -58,6 +58,7 @@
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 @@
}
MockConnectivityManagerDelegate(Set<Network> availableNetworks, String fieldTrialsString) {
- super(null, availableNetworks, fieldTrialsString);
+ super((ConnectivityManager) null, availableNetworks, fieldTrialsString);
}
@Override
@@ -160,7 +161,13 @@
// 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 @@
@Override
public void onNetworkPreference(List<ConnectionType> types, @NetworkPreference int preference) {
}
+
+ // @Override
+ // public String getFieldTrialsString() {
+ // return fieldTrialsString;
+ // }
}
private NetworkMonitorAutoDetect receiver;
@@ -195,7 +207,7 @@
}
});
- receiver = NetworkMonitor.createAndSetAutoDetectForTest(context);
+ receiver = NetworkMonitor.createAndSetAutoDetectForTest(context, fieldTrialsString);
assertNotNull(receiver);
connectivityDelegate = new MockConnectivityManagerDelegate();
@@ -226,7 +238,8 @@
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 @@
@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 @@
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 @@
@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 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 c342ce6..129168c 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 @@
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 @@
}
protected:
+ test::ScopedKeyValueConfig field_trials_;
std::unique_ptr<jni::AndroidNetworkMonitor> network_monitor_;
};
@@ -102,7 +102,8 @@
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, 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 67206c8..59a9204 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 @@
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 @@
}
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 @@
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 @@
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 a7cb766..dd661ac 100644
--- a/sdk/android/src/jni/android_network_monitor.h
+++ b/sdk/android/src/jni/android_network_monitor.h
@@ -70,7 +70,8 @@
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 @@
rtc::scoped_refptr<PendingTaskSafetyFlag> safety_flag_
RTC_PT_GUARDED_BY(network_thread_) = nullptr;
+
+ const FieldTrialsView& field_trials_;
};
class AndroidNetworkMonitorFactory : public rtc::NetworkMonitorFactory {