Propagating Network Type in Candidate for JNI

Bug: webrtc:10419
Change-Id: I32726c9a4095c998996acdbf00f72de18ed462c4
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/149025
Commit-Queue: Alex Drake <alexdrake@google.com>
Reviewed-by: Alex Glaznev <glaznev@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28848}
diff --git a/sdk/android/api/org/webrtc/IceCandidate.java b/sdk/android/api/org/webrtc/IceCandidate.java
index eebc9d9..6df71f0 100644
--- a/sdk/android/api/org/webrtc/IceCandidate.java
+++ b/sdk/android/api/org/webrtc/IceCandidate.java
@@ -10,6 +10,8 @@
 
 package org.webrtc;
 
+import org.webrtc.PeerConnection;
+
 /**
  * Representation of a single ICE Candidate, mirroring
  * {@code IceCandidateInterface} in the C++ API.
@@ -19,25 +21,30 @@
   public final int sdpMLineIndex;
   public final String sdp;
   public final String serverUrl;
+  public final PeerConnection.AdapterType adapterType;
 
   public IceCandidate(String sdpMid, int sdpMLineIndex, String sdp) {
     this.sdpMid = sdpMid;
     this.sdpMLineIndex = sdpMLineIndex;
     this.sdp = sdp;
     this.serverUrl = "";
+    this.adapterType = PeerConnection.AdapterType.UNKNOWN;
   }
 
   @CalledByNative
-  IceCandidate(String sdpMid, int sdpMLineIndex, String sdp, String serverUrl) {
+  IceCandidate(String sdpMid, int sdpMLineIndex, String sdp, String serverUrl,
+      PeerConnection.AdapterType adapterType) {
     this.sdpMid = sdpMid;
     this.sdpMLineIndex = sdpMLineIndex;
     this.sdp = sdp;
     this.serverUrl = serverUrl;
+    this.adapterType = adapterType;
   }
 
   @Override
   public String toString() {
-    return sdpMid + ":" + sdpMLineIndex + ":" + sdp + ":" + serverUrl;
+    return sdpMid + ":" + sdpMLineIndex + ":" + sdp + ":" + serverUrl + ":"
+        + adapterType.toString();
   }
 
   @CalledByNative
diff --git a/sdk/android/api/org/webrtc/PeerConnection.java b/sdk/android/api/org/webrtc/PeerConnection.java
index a5eeb58..e1243b9 100644
--- a/sdk/android/api/org/webrtc/PeerConnection.java
+++ b/sdk/android/api/org/webrtc/PeerConnection.java
@@ -14,7 +14,9 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import org.webrtc.CandidatePairChangeEvent;
 import org.webrtc.DataChannel;
 import org.webrtc.MediaStreamTrack;
@@ -374,12 +376,29 @@
 
   // Keep in sync with webrtc/rtc_base/network_constants.h.
   public enum AdapterType {
-    UNKNOWN,
-    ETHERNET,
-    WIFI,
-    CELLULAR,
-    VPN,
-    LOOPBACK,
+    UNKNOWN(0),
+    ETHERNET(1 << 0),
+    WIFI(1 << 1),
+    CELLULAR(1 << 2),
+    VPN(1 << 3),
+    LOOPBACK(1 << 4),
+    ADAPTER_TYPE_ANY(1 << 5);
+
+    public final Integer bitMask;
+    private AdapterType(Integer bitMask) {
+      this.bitMask = bitMask;
+    }
+    private static final Map<Integer, AdapterType> BY_BITMASK = new HashMap<>();
+    static {
+      for (AdapterType t : values()) {
+        BY_BITMASK.put(t.bitMask, t);
+      }
+    }
+
+    @CalledByNative("AdapterType")
+    static AdapterType fromNativeIndex(int nativeIndex) {
+      return BY_BITMASK.get(nativeIndex);
+    }
   }
 
   /** Java version of rtc::KeyType */
diff --git a/sdk/android/src/jni/pc/ice_candidate.cc b/sdk/android/src/jni/pc/ice_candidate.cc
index 8dba39a..247e8fa 100644
--- a/sdk/android/src/jni/pc/ice_candidate.cc
+++ b/sdk/android/src/jni/pc/ice_candidate.cc
@@ -16,21 +16,23 @@
 #include "sdk/android/generated_peerconnection_jni/IceCandidate_jni.h"
 #include "sdk/android/native_api/jni/java_types.h"
 #include "sdk/android/src/jni/pc/media_stream_track.h"
+#include "sdk/android/src/jni/pc/peer_connection.h"
 
 namespace webrtc {
 namespace jni {
 
 namespace {
 
-ScopedJavaLocalRef<jobject> CreateJavaIceCandidate(
-    JNIEnv* env,
-    const std::string& sdp_mid,
-    int sdp_mline_index,
-    const std::string& sdp,
-    const std::string server_url) {
+ScopedJavaLocalRef<jobject> CreateJavaIceCandidate(JNIEnv* env,
+                                                   const std::string& sdp_mid,
+                                                   int sdp_mline_index,
+                                                   const std::string& sdp,
+                                                   const std::string server_url,
+                                                   int adapterType) {
   return Java_IceCandidate_Constructor(
       env, NativeToJavaString(env, sdp_mid), sdp_mline_index,
-      NativeToJavaString(env, sdp), NativeToJavaString(env, server_url));
+      NativeToJavaString(env, sdp), NativeToJavaString(env, server_url),
+      NativeToJavaAdapterType(env, adapterType));
 }
 
 }  // namespace
@@ -56,7 +58,7 @@
   // sdp_mline_index is not used, pass an invalid value -1.
   return CreateJavaIceCandidate(env, candidate.transport_name(),
                                 -1 /* sdp_mline_index */, sdp,
-                                "" /* server_url */);
+                                "" /* server_url */, candidate.network_type());
 }
 
 ScopedJavaLocalRef<jobject> NativeToJavaIceCandidate(
@@ -66,7 +68,7 @@
   RTC_CHECK(candidate.ToString(&sdp)) << "got so far: " << sdp;
   return CreateJavaIceCandidate(env, candidate.sdp_mid(),
                                 candidate.sdp_mline_index(), sdp,
-                                candidate.candidate().url());
+                                candidate.candidate().url(), 0);
 }
 
 ScopedJavaLocalRef<jobjectArray> NativeToJavaCandidateArray(
diff --git a/sdk/android/src/jni/pc/peer_connection.cc b/sdk/android/src/jni/pc/peer_connection.cc
index d6290c5..d21609b 100644
--- a/sdk/android/src/jni/pc/peer_connection.cc
+++ b/sdk/android/src/jni/pc/peer_connection.cc
@@ -133,6 +133,11 @@
 
 }  // namespace
 
+ScopedJavaLocalRef<jobject> NativeToJavaAdapterType(JNIEnv* env,
+                                                    int adapterType) {
+  return Java_AdapterType_fromNativeIndex(env, adapterType);
+}
+
 void JavaToNativeRTCConfiguration(
     JNIEnv* jni,
     const JavaRef<jobject>& j_rtc_config,
diff --git a/sdk/android/src/jni/pc/peer_connection.h b/sdk/android/src/jni/pc/peer_connection.h
index c6db49a..a9e2af2 100644
--- a/sdk/android/src/jni/pc/peer_connection.h
+++ b/sdk/android/src/jni/pc/peer_connection.h
@@ -34,6 +34,9 @@
 rtc::KeyType GetRtcConfigKeyType(JNIEnv* env,
                                  const JavaRef<jobject>& j_rtc_config);
 
+ScopedJavaLocalRef<jobject> NativeToJavaAdapterType(JNIEnv* env,
+                                                    int adapterType);
+
 // Adapter between the C++ PeerConnectionObserver interface and the Java
 // PeerConnection.Observer interface.  Wraps an instance of the Java interface
 // and dispatches C++ callbacks to Java.