Index: talk/app/webrtc/java/jni/androidnetworkmonitor_jni.cc |
diff --git a/talk/app/webrtc/java/jni/androidnetworkmonitor_jni.cc b/talk/app/webrtc/java/jni/androidnetworkmonitor_jni.cc |
index f7a8c07c60a3e63926ec1914dabf3aae08cfbe69..64a9dc0ab51b57557f45056e77cfc8f0a7d0e81b 100644 |
--- a/talk/app/webrtc/java/jni/androidnetworkmonitor_jni.cc |
+++ b/talk/app/webrtc/java/jni/androidnetworkmonitor_jni.cc |
@@ -32,8 +32,62 @@ |
#include "talk/app/webrtc/java/jni/jni_helpers.h" |
namespace webrtc_jni { |
+ |
jobject AndroidNetworkMonitor::application_context_ = nullptr; |
+static rtc::NetworkType GetNetworkTypeFromJava( |
+ JNIEnv* jni, jobject j_network_type) { |
+ std::string enum_name = GetJavaEnumName( |
+ jni, "org/webrtc/NetworkMonitorAutoDetect$ConnectionType", |
+ j_network_type); |
+ if (enum_name == "CONNECTION_UNKNOWN") { |
+ return rtc::NetworkType::NETWORK_UNKNOWN; |
+ } |
+ if (enum_name == "CONNECTION_ETHERNET") { |
+ return rtc::NetworkType::NETWORK_ETHERNET; |
+ } |
+ if (enum_name == "CONNECTION_WIFI") { |
+ return rtc::NetworkType::NETWORK_WIFI; |
+ } |
+ if (enum_name == "CONNECTION_4G") { |
+ return rtc::NetworkType::NETWORK_4G; |
+ } |
+ if (enum_name == "CONNECTION_3G") { |
+ return rtc::NetworkType::NETWORK_3G; |
+ } |
+ if (enum_name == "CONNECTION_2G") { |
+ return rtc::NetworkType::NETWORK_2G; |
+ } |
+ if (enum_name == "CONNECTION_BLUETOOTH") { |
+ return rtc::NetworkType::NETWORK_BLUETOOTH; |
+ } |
+ if (enum_name == "CONNECTION_NONE") { |
+ return rtc::NetworkType::NETWORK_NONE; |
+ } |
+ return rtc::NetworkType::NETWORK_UNKNOWN; |
+} |
+ |
+static rtc::NetworkInformation GetNetworkInformationFromJava( |
+ JNIEnv* jni, jobject j_network_info) { |
+ rtc::NetworkInformation network_info; |
+ jclass j_network_info_class = GetObjectClass(jni, j_network_info); |
+ jfieldID j_interface_name_id = |
+ GetFieldID(jni, j_network_info_class, "name", "Ljava/lang/String;"); |
+ jfieldID j_handle_id = GetFieldID(jni, j_network_info_class, "handle", "I"); |
+ jfieldID j_type_id = |
+ GetFieldID(jni, j_network_info_class, "type", |
+ "Lorg/webrtc/NetworkMonitorAutoDetect$ConnectionType;"); |
+ |
+ network_info.interface_name = JavaToStdString( |
+ jni, GetStringField(jni, j_network_info, j_interface_name_id)); |
+ network_info.handle = static_cast<uint32_t>(GetIntField(jni, j_network_info, j_handle_id)); |
+ network_info.type = |
+ GetNetworkTypeFromJava(jni, GetObjectField(jni, j_network_info, j_type_id)); |
+ CHECK_EXCEPTION(jni) << "Error during NetworkMonitor.GetNetworkInfoFromJava"; |
+ return network_info; |
+} |
+ |
+ |
// static |
void AndroidNetworkMonitor::SetAndroidContext(JNIEnv* jni, jobject context) { |
if (application_context_) { |
@@ -75,6 +129,23 @@ void AndroidNetworkMonitor::Stop() { |
CHECK_EXCEPTION(jni()) << "Error during NetworkMonitor.stopMonitoring"; |
} |
+bool AndroidNetworkMonitor::GetAllNetworkInfos( |
+ std::vector<rtc::NetworkInformation>* network_infos) { |
+ RTC_CHECK(thread_checker_.CalledOnValidThread()); |
+ network_infos->clear(); |
+ jmethodID m = GetMethodID(jni(), *j_network_monitor_class_, |
+ "getAllNetworkInfos", |
+ "()[Lorg/webrtc/NetworkMonitorAutoDetect$NetworkInformation;"); |
+ jobjectArray j_network_infos = static_cast<jobjectArray>( |
+ jni()->CallObjectMethod(*j_network_monitor_, m)); |
+ size_t num_infos = jni()->GetArrayLength(j_network_infos); |
+ for (size_t i = 0; i < num_infos; ++i) { |
+ jobject j_network_info = jni()->GetObjectArrayElement(j_network_infos, i); |
+ network_infos->push_back(GetNetworkInformationFromJava(jni(), j_network_info)); |
+ } |
+ return true; |
+} |
+ |
JOW(void, NetworkMonitor_nativeNotifyConnectionTypeChanged)( |
JNIEnv* jni, jobject j_monitor, jlong j_native_monitor) { |
rtc::NetworkMonitorInterface* network_monitor = |
@@ -82,4 +153,12 @@ JOW(void, NetworkMonitor_nativeNotifyConnectionTypeChanged)( |
network_monitor->OnNetworksChanged(); |
} |
+JOW(void, NetworkMonitor_nativeUpdateNetworkInformation)( |
+ JNIEnv* jni, jobject j_monitor, jlong j_native_monitor, jobject j_network_info) { |
+ rtc::NetworkMonitorInterface* network_monitor = |
+ reinterpret_cast<rtc::NetworkMonitorInterface*>(j_native_monitor); |
+ rtc::NetworkInformation network_info = GetNetworkInformationFromJava(jni, j_network_info); |
+ network_monitor->OnNetworkAvailable(network_info); |
+} |
+ |
} // namespace webrtc_jni |