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 {