Add native API for creating AndroidNetworkMonitorFactory.

Moves AndroidNetworkMonitor out of pc folder. Even clients not using
PeerConnection seem to be using it and it doesn't have any dependencies
to the PeerConnection API.

Bug: webrtc:8769
Change-Id: I2bdeff9f5c9925e13388fbc77aa9b264a7583548
Reviewed-on: https://webrtc-review.googlesource.com/53260
Commit-Queue: Sami Kalliomäki <sakal@webrtc.org>
Reviewed-by: Taylor Brandstetter <deadbeef@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22051}
This commit is contained in:
Sami Kalliomäki
2018-02-16 12:55:55 +01:00
committed by Commit Bot
parent c453c16dbe
commit ad148a36ea
6 changed files with 190 additions and 111 deletions

View File

@ -36,6 +36,8 @@ config("libjingle_peerconnection_jni_warnings_config") {
generate_jni("generated_base_jni") { generate_jni("generated_base_jni") {
sources = [ sources = [
"api/org/webrtc/NetworkMonitor.java",
"api/org/webrtc/NetworkMonitorAutoDetect.java",
"src/java/org/webrtc/Histogram.java", "src/java/org/webrtc/Histogram.java",
"src/java/org/webrtc/JniCommon.java", "src/java/org/webrtc/JniCommon.java",
] ]
@ -87,6 +89,8 @@ rtc_source_set("base_jni") {
visibility = [ "*" ] visibility = [ "*" ]
sources = [ sources = [
"src/jni/androidhistogram.cc", "src/jni/androidhistogram.cc",
"src/jni/androidnetworkmonitor.cc",
"src/jni/androidnetworkmonitor.h",
"src/jni/class_loader.h", "src/jni/class_loader.h",
"src/jni/classreferenceholder.h", "src/jni/classreferenceholder.h",
"src/jni/jni_common.cc", "src/jni/jni_common.cc",
@ -411,8 +415,6 @@ generate_jni("generated_peerconnection_jni") {
"api/org/webrtc/MediaSource.java", "api/org/webrtc/MediaSource.java",
"api/org/webrtc/MediaStream.java", "api/org/webrtc/MediaStream.java",
"api/org/webrtc/MediaStreamTrack.java", "api/org/webrtc/MediaStreamTrack.java",
"api/org/webrtc/NetworkMonitor.java",
"api/org/webrtc/NetworkMonitorAutoDetect.java",
"api/org/webrtc/PeerConnection.java", "api/org/webrtc/PeerConnection.java",
"api/org/webrtc/PeerConnectionFactory.java", "api/org/webrtc/PeerConnectionFactory.java",
"api/org/webrtc/RTCStats.java", "api/org/webrtc/RTCStats.java",
@ -439,7 +441,6 @@ rtc_static_library("peerconnection_jni") {
sources = [ sources = [
"src/jni/androidnetworkmonitor_jni.h", "src/jni/androidnetworkmonitor_jni.h",
"src/jni/pc/androidnetworkmonitor.cc",
"src/jni/pc/androidnetworkmonitor.h", "src/jni/pc/androidnetworkmonitor.h",
"src/jni/pc/audiotrack.cc", "src/jni/pc/audiotrack.cc",
"src/jni/pc/callsessionfilerotatinglogsink.cc", "src/jni/pc/callsessionfilerotatinglogsink.cc",
@ -818,6 +819,8 @@ rtc_static_library("native_api_base") {
sources = [ sources = [
"native_api/base/init.cc", "native_api/base/init.cc",
"native_api/base/init.h", "native_api/base/init.h",
"native_api/base/networkmonitor.cc",
"native_api/base/networkmonitor.h",
] ]
deps = [ deps = [

View File

@ -0,0 +1,25 @@
/*
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "sdk/android/native_api/base/networkmonitor.h"
#include <memory>
#include "rtc_base/ptr_util.h"
#include "sdk/android/src/jni/androidnetworkmonitor.h"
namespace webrtc {
std::unique_ptr<rtc::NetworkMonitorFactory>
CreateAndroidNetworkMonitorFactory() {
return rtc::MakeUnique<jni::AndroidNetworkMonitorFactory>();
}
} // namespace webrtc

View File

@ -0,0 +1,29 @@
/*
* Copyright 2018 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef SDK_ANDROID_NATIVE_API_BASE_NETWORKMONITOR_H_
#define SDK_ANDROID_NATIVE_API_BASE_NETWORKMONITOR_H_
#include <memory>
#include "rtc_base/networkmonitor.h"
namespace webrtc {
// Creates an Android-specific network monitor, which is capable of detecting
// network changes as soon as they occur, requesting a cellular interface
// (dependent on permissions), and binding sockets to network interfaces (more
// reliable than binding to IP addresses on Android).
std::unique_ptr<rtc::NetworkMonitorFactory>
CreateAndroidNetworkMonitorFactory();
} // namespace webrtc
#endif // SDK_ANDROID_NATIVE_API_BASE_NETWORKMONITOR_H_

View File

@ -8,7 +8,7 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#include "sdk/android/src/jni/pc/androidnetworkmonitor.h" #include "sdk/android/src/jni/androidnetworkmonitor.h"
#include <dlfcn.h> #include <dlfcn.h>
#ifndef RTLD_NOLOAD #ifndef RTLD_NOLOAD
@ -19,8 +19,8 @@
#include "rtc_base/bind.h" #include "rtc_base/bind.h"
#include "rtc_base/checks.h" #include "rtc_base/checks.h"
#include "rtc_base/ipaddress.h" #include "rtc_base/ipaddress.h"
#include "sdk/android/generated_peerconnection_jni/jni/NetworkMonitorAutoDetect_jni.h" #include "sdk/android/generated_base_jni/jni/NetworkMonitorAutoDetect_jni.h"
#include "sdk/android/generated_peerconnection_jni/jni/NetworkMonitor_jni.h" #include "sdk/android/generated_base_jni/jni/NetworkMonitor_jni.h"
#include "sdk/android/native_api/jni/java_types.h" #include "sdk/android/native_api/jni/java_types.h"
#include "sdk/android/src/jni/jni_helpers.h" #include "sdk/android/src/jni/jni_helpers.h"
@ -130,6 +130,10 @@ static NetworkInformation GetNetworkInformationFromJava(
return network_info; return network_info;
} }
NetworkInformation::NetworkInformation() = default;
NetworkInformation::~NetworkInformation() = default;
std::string NetworkInformation::ToString() const { std::string NetworkInformation::ToString() const {
std::stringstream ss; std::stringstream ss;
ss << "NetInfo[name " << interface_name << "; handle " << handle << "; type " ss << "NetInfo[name " << interface_name << "; handle " << handle << "; type "
@ -145,6 +149,8 @@ AndroidNetworkMonitor::AndroidNetworkMonitor(JNIEnv* env)
: android_sdk_int_(Java_NetworkMonitor_androidSdkInt(env)), : android_sdk_int_(Java_NetworkMonitor_androidSdkInt(env)),
j_network_monitor_(env, Java_NetworkMonitor_getInstance(env)) {} j_network_monitor_(env, Java_NetworkMonitor_getInstance(env)) {}
AndroidNetworkMonitor::~AndroidNetworkMonitor() = default;
void AndroidNetworkMonitor::Start() { void AndroidNetworkMonitor::Start() {
RTC_CHECK(thread_checker_.CalledOnValidThread()); RTC_CHECK(thread_checker_.CalledOnValidThread());
if (started_) { if (started_) {

View File

@ -0,0 +1,119 @@
/*
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef SDK_ANDROID_SRC_JNI_ANDROIDNETWORKMONITOR_H_
#define SDK_ANDROID_SRC_JNI_ANDROIDNETWORKMONITOR_H_
#include <stdint.h>
#include <map>
#include <string>
#include <vector>
#include "rtc_base/networkmonitor.h"
#include "rtc_base/thread_checker.h"
#include "sdk/android/src/jni/jni_helpers.h"
namespace webrtc {
namespace jni {
typedef int64_t NetworkHandle;
// c++ equivalent of java NetworkMonitorAutoDetect.ConnectionType.
enum NetworkType {
NETWORK_UNKNOWN,
NETWORK_ETHERNET,
NETWORK_WIFI,
NETWORK_4G,
NETWORK_3G,
NETWORK_2G,
NETWORK_UNKNOWN_CELLULAR,
NETWORK_BLUETOOTH,
NETWORK_NONE
};
// The information is collected from Android OS so that the native code can get
// the network type and handle (Android network ID) for each interface.
struct NetworkInformation {
std::string interface_name;
NetworkHandle handle;
NetworkType type;
std::vector<rtc::IPAddress> ip_addresses;
NetworkInformation();
~NetworkInformation();
std::string ToString() const;
};
class AndroidNetworkMonitor : public rtc::NetworkMonitorBase,
public rtc::NetworkBinderInterface {
public:
explicit AndroidNetworkMonitor(JNIEnv* env);
~AndroidNetworkMonitor() override;
// TODO(sakal): Remove once down stream dependencies have been updated.
static void SetAndroidContext(JNIEnv* jni, jobject context) {}
void Start() override;
void Stop() override;
rtc::NetworkBindingResult BindSocketToNetwork(
int socket_fd,
const rtc::IPAddress& address) override;
rtc::AdapterType GetAdapterType(const std::string& if_name) override;
void OnNetworkConnected(const NetworkInformation& network_info);
void OnNetworkDisconnected(NetworkHandle network_handle);
// Always expected to be called on the network thread.
void SetNetworkInfos(const std::vector<NetworkInformation>& network_infos);
void NotifyConnectionTypeChanged(JNIEnv* env,
const JavaRef<jobject>& j_caller);
void NotifyOfNetworkConnect(JNIEnv* env,
const JavaRef<jobject>& j_caller,
const JavaRef<jobject>& j_network_info);
void NotifyOfNetworkDisconnect(JNIEnv* env,
const JavaRef<jobject>& j_caller,
jlong network_handle);
void NotifyOfActiveNetworkList(JNIEnv* env,
const JavaRef<jobject>& j_caller,
const JavaRef<jobjectArray>& j_network_infos);
private:
void OnNetworkConnected_w(const NetworkInformation& network_info);
void OnNetworkDisconnected_w(NetworkHandle network_handle);
const int android_sdk_int_;
ScopedJavaGlobalRef<jobject> j_network_monitor_;
rtc::ThreadChecker thread_checker_;
bool started_ = false;
std::map<std::string, rtc::AdapterType> adapter_type_by_name_;
std::map<rtc::IPAddress, NetworkHandle> network_handle_by_address_;
std::map<NetworkHandle, NetworkInformation> network_info_by_handle_;
};
class AndroidNetworkMonitorFactory : public rtc::NetworkMonitorFactory {
public:
AndroidNetworkMonitorFactory() {}
rtc::NetworkMonitorInterface* CreateNetworkMonitor() override;
};
} // namespace jni
} // namespace webrtc
// TODO(magjed): Remove once external clients are updated.
namespace webrtc_jni {
using webrtc::jni::AndroidNetworkMonitor;
using webrtc::jni::AndroidNetworkMonitorFactory;
} // namespace webrtc_jni
#endif // SDK_ANDROID_SRC_JNI_ANDROIDNETWORKMONITOR_H_

View File

@ -8,108 +8,5 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#ifndef SDK_ANDROID_SRC_JNI_PC_ANDROIDNETWORKMONITOR_H_ // TODO(sakal): Remove this file once clients have update to the native API.
#define SDK_ANDROID_SRC_JNI_PC_ANDROIDNETWORKMONITOR_H_ #include "sdk/android/src/jni/androidnetworkmonitor.h"
#include <stdint.h>
#include <map>
#include <string>
#include <vector>
#include "rtc_base/networkmonitor.h"
#include "rtc_base/thread_checker.h"
#include "sdk/android/src/jni/jni_helpers.h"
namespace webrtc {
namespace jni {
typedef int64_t NetworkHandle;
// c++ equivalent of java NetworkMonitorAutoDetect.ConnectionType.
enum NetworkType {
NETWORK_UNKNOWN,
NETWORK_ETHERNET,
NETWORK_WIFI,
NETWORK_4G,
NETWORK_3G,
NETWORK_2G,
NETWORK_UNKNOWN_CELLULAR,
NETWORK_BLUETOOTH,
NETWORK_NONE
};
// The information is collected from Android OS so that the native code can get
// the network type and handle (Android network ID) for each interface.
struct NetworkInformation {
std::string interface_name;
NetworkHandle handle;
NetworkType type;
std::vector<rtc::IPAddress> ip_addresses;
std::string ToString() const;
};
class AndroidNetworkMonitor : public rtc::NetworkMonitorBase,
public rtc::NetworkBinderInterface {
public:
explicit AndroidNetworkMonitor(JNIEnv* env);
// TODO(sakal): Remove once down stream dependencies have been updated.
static void SetAndroidContext(JNIEnv* jni, jobject context) {}
void Start() override;
void Stop() override;
rtc::NetworkBindingResult BindSocketToNetwork(
int socket_fd,
const rtc::IPAddress& address) override;
rtc::AdapterType GetAdapterType(const std::string& if_name) override;
void OnNetworkConnected(const NetworkInformation& network_info);
void OnNetworkDisconnected(NetworkHandle network_handle);
// Always expected to be called on the network thread.
void SetNetworkInfos(const std::vector<NetworkInformation>& network_infos);
void NotifyConnectionTypeChanged(JNIEnv* env,
const JavaRef<jobject>& j_caller);
void NotifyOfNetworkConnect(JNIEnv* env,
const JavaRef<jobject>& j_caller,
const JavaRef<jobject>& j_network_info);
void NotifyOfNetworkDisconnect(JNIEnv* env,
const JavaRef<jobject>& j_caller,
jlong network_handle);
void NotifyOfActiveNetworkList(JNIEnv* env,
const JavaRef<jobject>& j_caller,
const JavaRef<jobjectArray>& j_network_infos);
private:
void OnNetworkConnected_w(const NetworkInformation& network_info);
void OnNetworkDisconnected_w(NetworkHandle network_handle);
const int android_sdk_int_;
ScopedJavaGlobalRef<jobject> j_network_monitor_;
rtc::ThreadChecker thread_checker_;
bool started_ = false;
std::map<std::string, rtc::AdapterType> adapter_type_by_name_;
std::map<rtc::IPAddress, NetworkHandle> network_handle_by_address_;
std::map<NetworkHandle, NetworkInformation> network_info_by_handle_;
};
class AndroidNetworkMonitorFactory : public rtc::NetworkMonitorFactory {
public:
AndroidNetworkMonitorFactory() {}
rtc::NetworkMonitorInterface* CreateNetworkMonitor() override;
};
} // namespace jni
} // namespace webrtc
// TODO(magjed): Remove once external clients are updated.
namespace webrtc_jni {
using webrtc::jni::AndroidNetworkMonitor;
using webrtc::jni::AndroidNetworkMonitorFactory;
} // namespace webrtc_jni
#endif // SDK_ANDROID_SRC_JNI_PC_ANDROIDNETWORKMONITOR_H_