Deprecate ContextUtils.getApplicationContext.

Allows passing in the application context to NetworkMonitor in
startMonitoring. The audio code will refactored once it is moved under
sdk/android.

Bug: webrtc:8937
Change-Id: I50c917a845fc4f711899a97d34c04813cc68b68c
Reviewed-on: https://webrtc-review.googlesource.com/58091
Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
Commit-Queue: Sami Kalliomäki <sakal@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22231}
This commit is contained in:
Sami Kalliomäki
2018-02-27 16:43:13 +01:00
committed by Commit Bot
parent d2ed0a4c9e
commit 9ddc14daca
7 changed files with 75 additions and 16 deletions

View File

@ -36,7 +36,10 @@ public class ContextUtils {
/** /**
* Returns the stored application context. * Returns the stored application context.
*
* @deprecated crbug.com/webrtc/8937
*/ */
@Deprecated
public static Context getApplicationContext() { public static Context getApplicationContext() {
return applicationContext; return applicationContext;
} }

View File

@ -83,24 +83,30 @@ public class NetworkMonitor {
* multi-networking. This requires the embedding app have the platform ACCESS_NETWORK_STATE and * multi-networking. This requires the embedding app have the platform ACCESS_NETWORK_STATE and
* CHANGE_NETWORK_STATE permission. * CHANGE_NETWORK_STATE permission.
*/ */
public void startMonitoring() { public void startMonitoring(Context applicationContext) {
synchronized (autoDetectorLock) { synchronized (autoDetectorLock) {
++numMonitors; ++numMonitors;
if (autoDetector == null) { if (autoDetector == null) {
autoDetector = createAutoDetector(ContextUtils.getApplicationContext()); autoDetector = createAutoDetector(applicationContext);
} }
currentConnectionType = currentConnectionType =
NetworkMonitorAutoDetect.getConnectionType(autoDetector.getCurrentNetworkState()); NetworkMonitorAutoDetect.getConnectionType(autoDetector.getCurrentNetworkState());
} }
} }
/** Deprecated, pass in application context in startMonitoring instead. */
@Deprecated
public void startMonitoring() {
startMonitoring(ContextUtils.getApplicationContext());
}
/** /**
* Enables auto detection of the network state change and brings up mobile networks for using * Enables auto detection of the network state change and brings up mobile networks for using
* multi-networking. This requires the embedding app have the platform ACCESS_NETWORK_STATE and * multi-networking. This requires the embedding app have the platform ACCESS_NETWORK_STATE and
* CHANGE_NETWORK_STATE permission. * CHANGE_NETWORK_STATE permission.
*/ */
@CalledByNative @CalledByNative
private void startMonitoring(long nativeObserver) { private void startMonitoring(Context applicationContext, long nativeObserver) {
Logging.d(TAG, "Start monitoring with native observer " + nativeObserver); Logging.d(TAG, "Start monitoring with native observer " + nativeObserver);
startMonitoring(); startMonitoring();
@ -213,21 +219,31 @@ public class NetworkMonitor {
nativeNotifyOfActiveNetworkList(nativeObserver, networkInfos); nativeNotifyOfActiveNetworkList(nativeObserver, networkInfos);
} }
/** Adds an observer for any connection type changes. */ /**
* Adds an observer for any connection type changes.
*
* @deprecated Use getInstance(appContext).addObserver instead.
*/
@Deprecated
public static void addNetworkObserver(NetworkObserver observer) { public static void addNetworkObserver(NetworkObserver observer) {
getInstance().addNetworkObserverInternal(observer); getInstance().addObserver(observer);
} }
private void addNetworkObserverInternal(NetworkObserver observer) { public void addObserver(NetworkObserver observer) {
networkObservers.add(observer); networkObservers.add(observer);
} }
/** Removes an observer for any connection type changes. */ /**
* Removes an observer for any connection type changes.
*
* @deprecated Use getInstance(appContext).removeObserver instead.
*/
@Deprecated
public static void removeNetworkObserver(NetworkObserver observer) { public static void removeNetworkObserver(NetworkObserver observer) {
getInstance().removeNetworkObserverInternal(observer); getInstance().removeObserver(observer);
} }
private void removeNetworkObserverInternal(NetworkObserver observer) { public void removeObserver(NetworkObserver observer) {
networkObservers.remove(observer); networkObservers.remove(observer);
} }

View File

@ -17,6 +17,13 @@
namespace webrtc { namespace webrtc {
std::unique_ptr<rtc::NetworkMonitorFactory> CreateAndroidNetworkMonitorFactory(
JNIEnv* env,
jobject application_context) {
return rtc::MakeUnique<jni::AndroidNetworkMonitorFactory>(
env, JavaParamRef<jobject>(application_context));
}
std::unique_ptr<rtc::NetworkMonitorFactory> std::unique_ptr<rtc::NetworkMonitorFactory>
CreateAndroidNetworkMonitorFactory() { CreateAndroidNetworkMonitorFactory() {
return rtc::MakeUnique<jni::AndroidNetworkMonitorFactory>(); return rtc::MakeUnique<jni::AndroidNetworkMonitorFactory>();

View File

@ -11,6 +11,8 @@
#ifndef SDK_ANDROID_NATIVE_API_BASE_NETWORKMONITOR_H_ #ifndef SDK_ANDROID_NATIVE_API_BASE_NETWORKMONITOR_H_
#define SDK_ANDROID_NATIVE_API_BASE_NETWORKMONITOR_H_ #define SDK_ANDROID_NATIVE_API_BASE_NETWORKMONITOR_H_
#include <jni.h>
#include <memory> #include <memory>
#include "rtc_base/networkmonitor.h" #include "rtc_base/networkmonitor.h"
@ -21,6 +23,11 @@ namespace webrtc {
// network changes as soon as they occur, requesting a cellular interface // network changes as soon as they occur, requesting a cellular interface
// (dependent on permissions), and binding sockets to network interfaces (more // (dependent on permissions), and binding sockets to network interfaces (more
// reliable than binding to IP addresses on Android). // reliable than binding to IP addresses on Android).
std::unique_ptr<rtc::NetworkMonitorFactory> CreateAndroidNetworkMonitorFactory(
JNIEnv* env,
jobject application_context);
// Deprecated. Pass in application context instead.
std::unique_ptr<rtc::NetworkMonitorFactory> std::unique_ptr<rtc::NetworkMonitorFactory>
CreateAndroidNetworkMonitorFactory(); CreateAndroidNetworkMonitorFactory();

View File

@ -46,7 +46,7 @@ class JavaRef<jobject> {
} }
protected: protected:
JavaRef() : obj_(nullptr) {} constexpr JavaRef() : obj_(nullptr) {}
explicit JavaRef(jobject obj) : obj_(obj) {} explicit JavaRef(jobject obj) : obj_(obj) {}
jobject obj_; jobject obj_;
@ -172,6 +172,7 @@ class ScopedJavaGlobalRef : public JavaRef<T> {
public: public:
using JavaRef<T>::obj_; using JavaRef<T>::obj_;
explicit constexpr ScopedJavaGlobalRef(std::nullptr_t) {}
ScopedJavaGlobalRef(JNIEnv* env, const JavaRef<T>& other) ScopedJavaGlobalRef(JNIEnv* env, const JavaRef<T>& other)
: JavaRef<T>(static_cast<T>(env->NewGlobalRef(other.obj()))) {} : JavaRef<T>(static_cast<T>(env->NewGlobalRef(other.obj()))) {}
explicit ScopedJavaGlobalRef(const ScopedJavaLocalRef<T>& other) explicit ScopedJavaGlobalRef(const ScopedJavaLocalRef<T>& other)

View File

@ -145,8 +145,11 @@ std::string NetworkInformation::ToString() const {
return ss.str(); return ss.str();
} }
AndroidNetworkMonitor::AndroidNetworkMonitor(JNIEnv* env) AndroidNetworkMonitor::AndroidNetworkMonitor(
JNIEnv* env,
const JavaRef<jobject>& j_application_context)
: android_sdk_int_(Java_NetworkMonitor_androidSdkInt(env)), : android_sdk_int_(Java_NetworkMonitor_androidSdkInt(env)),
j_application_context_(env, j_application_context),
j_network_monitor_(env, Java_NetworkMonitor_getInstance(env)) {} j_network_monitor_(env, Java_NetworkMonitor_getInstance(env)) {}
AndroidNetworkMonitor::~AndroidNetworkMonitor() = default; AndroidNetworkMonitor::~AndroidNetworkMonitor() = default;
@ -164,8 +167,8 @@ void AndroidNetworkMonitor::Start() {
worker_thread()->socketserver()->set_network_binder(this); worker_thread()->socketserver()->set_network_binder(this);
JNIEnv* env = AttachCurrentThreadIfNeeded(); JNIEnv* env = AttachCurrentThreadIfNeeded();
Java_NetworkMonitor_startMonitoring(env, j_network_monitor_, Java_NetworkMonitor_startMonitoring(
jlongFromPointer(this)); env, j_network_monitor_, j_application_context_, jlongFromPointer(this));
} }
void AndroidNetworkMonitor::Stop() { void AndroidNetworkMonitor::Stop() {
@ -350,9 +353,20 @@ rtc::AdapterType AndroidNetworkMonitor::GetAdapterType(
return type; return type;
} }
AndroidNetworkMonitorFactory::AndroidNetworkMonitorFactory()
: j_application_context_(nullptr) {}
AndroidNetworkMonitorFactory::AndroidNetworkMonitorFactory(
JNIEnv* env,
const JavaRef<jobject>& j_application_context)
: j_application_context_(env, j_application_context) {}
AndroidNetworkMonitorFactory::~AndroidNetworkMonitorFactory() = default;
rtc::NetworkMonitorInterface* rtc::NetworkMonitorInterface*
AndroidNetworkMonitorFactory::CreateNetworkMonitor() { AndroidNetworkMonitorFactory::CreateNetworkMonitor() {
return new AndroidNetworkMonitor(AttachCurrentThreadIfNeeded()); return new AndroidNetworkMonitor(AttachCurrentThreadIfNeeded(),
j_application_context_);
} }
void AndroidNetworkMonitor::NotifyConnectionTypeChanged( void AndroidNetworkMonitor::NotifyConnectionTypeChanged(

View File

@ -55,7 +55,8 @@ struct NetworkInformation {
class AndroidNetworkMonitor : public rtc::NetworkMonitorBase, class AndroidNetworkMonitor : public rtc::NetworkMonitorBase,
public rtc::NetworkBinderInterface { public rtc::NetworkBinderInterface {
public: public:
explicit AndroidNetworkMonitor(JNIEnv* env); explicit AndroidNetworkMonitor(JNIEnv* env,
const JavaRef<jobject>& j_application_context);
~AndroidNetworkMonitor() override; ~AndroidNetworkMonitor() override;
// TODO(sakal): Remove once down stream dependencies have been updated. // TODO(sakal): Remove once down stream dependencies have been updated.
@ -90,6 +91,7 @@ class AndroidNetworkMonitor : public rtc::NetworkMonitorBase,
void OnNetworkDisconnected_w(NetworkHandle network_handle); void OnNetworkDisconnected_w(NetworkHandle network_handle);
const int android_sdk_int_; const int android_sdk_int_;
ScopedJavaGlobalRef<jobject> j_application_context_;
ScopedJavaGlobalRef<jobject> j_network_monitor_; ScopedJavaGlobalRef<jobject> j_network_monitor_;
rtc::ThreadChecker thread_checker_; rtc::ThreadChecker thread_checker_;
bool started_ = false; bool started_ = false;
@ -100,9 +102,18 @@ class AndroidNetworkMonitor : public rtc::NetworkMonitorBase,
class AndroidNetworkMonitorFactory : public rtc::NetworkMonitorFactory { class AndroidNetworkMonitorFactory : public rtc::NetworkMonitorFactory {
public: public:
AndroidNetworkMonitorFactory() {} // Deprecated. Pass in application context to this class.
AndroidNetworkMonitorFactory();
AndroidNetworkMonitorFactory(JNIEnv* env,
const JavaRef<jobject>& j_application_context);
~AndroidNetworkMonitorFactory() override;
rtc::NetworkMonitorInterface* CreateNetworkMonitor() override; rtc::NetworkMonitorInterface* CreateNetworkMonitor() override;
private:
ScopedJavaGlobalRef<jobject> j_application_context_;
}; };
} // namespace jni } // namespace jni