diff --git a/sdk/android/api/org/webrtc/IceCandidate.java b/sdk/android/api/org/webrtc/IceCandidate.java index eebc9d9fa6..6df71f04e9 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 class IceCandidate { 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 a5eeb58c63..e1243b93cb 100644 --- a/sdk/android/api/org/webrtc/PeerConnection.java +++ b/sdk/android/api/org/webrtc/PeerConnection.java @@ -14,7 +14,9 @@ import android.support.annotation.Nullable; 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 @@ public class PeerConnection { // 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 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 8dba39aa09..247e8fa34c 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 CreateJavaIceCandidate( - JNIEnv* env, - const std::string& sdp_mid, - int sdp_mline_index, - const std::string& sdp, - const std::string server_url) { +ScopedJavaLocalRef 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 @@ ScopedJavaLocalRef NativeToJavaCandidate( // 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 NativeToJavaIceCandidate( @@ -66,7 +68,7 @@ ScopedJavaLocalRef NativeToJavaIceCandidate( 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 NativeToJavaCandidateArray( diff --git a/sdk/android/src/jni/pc/peer_connection.cc b/sdk/android/src/jni/pc/peer_connection.cc index d6290c5df0..d21609b2fa 100644 --- a/sdk/android/src/jni/pc/peer_connection.cc +++ b/sdk/android/src/jni/pc/peer_connection.cc @@ -133,6 +133,11 @@ ScopedJavaLocalRef NativeToJavaCandidatePairChange( } // namespace +ScopedJavaLocalRef NativeToJavaAdapterType(JNIEnv* env, + int adapterType) { + return Java_AdapterType_fromNativeIndex(env, adapterType); +} + void JavaToNativeRTCConfiguration( JNIEnv* jni, const JavaRef& j_rtc_config, diff --git a/sdk/android/src/jni/pc/peer_connection.h b/sdk/android/src/jni/pc/peer_connection.h index c6db49a427..a9e2af2a47 100644 --- a/sdk/android/src/jni/pc/peer_connection.h +++ b/sdk/android/src/jni/pc/peer_connection.h @@ -34,6 +34,9 @@ void JavaToNativeRTCConfiguration( rtc::KeyType GetRtcConfigKeyType(JNIEnv* env, const JavaRef& j_rtc_config); +ScopedJavaLocalRef 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.