From 9ddc14dacae3248fc703d193771da278c16b8026 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sami=20Kalliom=C3=A4ki?= Date: Tue, 27 Feb 2018 16:43:13 +0100 Subject: [PATCH] Deprecate ContextUtils.getApplicationContext. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Commit-Queue: Sami Kalliomäki Cr-Commit-Position: refs/heads/master@{#22231} --- .../java/src/org/webrtc/ContextUtils.java | 3 ++ .../api/org/webrtc/NetworkMonitor.java | 34 ++++++++++++++----- sdk/android/native_api/base/networkmonitor.cc | 7 ++++ sdk/android/native_api/base/networkmonitor.h | 7 ++++ sdk/android/native_api/jni/scoped_java_ref.h | 3 +- sdk/android/src/jni/androidnetworkmonitor.cc | 22 +++++++++--- sdk/android/src/jni/androidnetworkmonitor.h | 15 ++++++-- 7 files changed, 75 insertions(+), 16 deletions(-) diff --git a/rtc_base/java/src/org/webrtc/ContextUtils.java b/rtc_base/java/src/org/webrtc/ContextUtils.java index a53059a9cc..f0e6ef0736 100644 --- a/rtc_base/java/src/org/webrtc/ContextUtils.java +++ b/rtc_base/java/src/org/webrtc/ContextUtils.java @@ -36,7 +36,10 @@ public class ContextUtils { /** * Returns the stored application context. + * + * @deprecated crbug.com/webrtc/8937 */ + @Deprecated public static Context getApplicationContext() { return applicationContext; } diff --git a/sdk/android/api/org/webrtc/NetworkMonitor.java b/sdk/android/api/org/webrtc/NetworkMonitor.java index 89d0a45227..2d7f08d51e 100644 --- a/sdk/android/api/org/webrtc/NetworkMonitor.java +++ b/sdk/android/api/org/webrtc/NetworkMonitor.java @@ -83,24 +83,30 @@ public class NetworkMonitor { * multi-networking. This requires the embedding app have the platform ACCESS_NETWORK_STATE and * CHANGE_NETWORK_STATE permission. */ - public void startMonitoring() { + public void startMonitoring(Context applicationContext) { synchronized (autoDetectorLock) { ++numMonitors; if (autoDetector == null) { - autoDetector = createAutoDetector(ContextUtils.getApplicationContext()); + autoDetector = createAutoDetector(applicationContext); } currentConnectionType = 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 * multi-networking. This requires the embedding app have the platform ACCESS_NETWORK_STATE and * CHANGE_NETWORK_STATE permission. */ @CalledByNative - private void startMonitoring(long nativeObserver) { + private void startMonitoring(Context applicationContext, long nativeObserver) { Logging.d(TAG, "Start monitoring with native observer " + nativeObserver); startMonitoring(); @@ -213,21 +219,31 @@ public class NetworkMonitor { 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) { - getInstance().addNetworkObserverInternal(observer); + getInstance().addObserver(observer); } - private void addNetworkObserverInternal(NetworkObserver observer) { + public void addObserver(NetworkObserver 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) { - getInstance().removeNetworkObserverInternal(observer); + getInstance().removeObserver(observer); } - private void removeNetworkObserverInternal(NetworkObserver observer) { + public void removeObserver(NetworkObserver observer) { networkObservers.remove(observer); } diff --git a/sdk/android/native_api/base/networkmonitor.cc b/sdk/android/native_api/base/networkmonitor.cc index 786c533c40..a7cf456d3d 100644 --- a/sdk/android/native_api/base/networkmonitor.cc +++ b/sdk/android/native_api/base/networkmonitor.cc @@ -17,6 +17,13 @@ namespace webrtc { +std::unique_ptr CreateAndroidNetworkMonitorFactory( + JNIEnv* env, + jobject application_context) { + return rtc::MakeUnique( + env, JavaParamRef(application_context)); +} + std::unique_ptr CreateAndroidNetworkMonitorFactory() { return rtc::MakeUnique(); diff --git a/sdk/android/native_api/base/networkmonitor.h b/sdk/android/native_api/base/networkmonitor.h index 3301bff7dd..537a2470c9 100644 --- a/sdk/android/native_api/base/networkmonitor.h +++ b/sdk/android/native_api/base/networkmonitor.h @@ -11,6 +11,8 @@ #ifndef SDK_ANDROID_NATIVE_API_BASE_NETWORKMONITOR_H_ #define SDK_ANDROID_NATIVE_API_BASE_NETWORKMONITOR_H_ +#include + #include #include "rtc_base/networkmonitor.h" @@ -21,6 +23,11 @@ namespace webrtc { // 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 CreateAndroidNetworkMonitorFactory( + JNIEnv* env, + jobject application_context); + +// Deprecated. Pass in application context instead. std::unique_ptr CreateAndroidNetworkMonitorFactory(); diff --git a/sdk/android/native_api/jni/scoped_java_ref.h b/sdk/android/native_api/jni/scoped_java_ref.h index 02948e091e..b26ef2c4c5 100644 --- a/sdk/android/native_api/jni/scoped_java_ref.h +++ b/sdk/android/native_api/jni/scoped_java_ref.h @@ -46,7 +46,7 @@ class JavaRef { } protected: - JavaRef() : obj_(nullptr) {} + constexpr JavaRef() : obj_(nullptr) {} explicit JavaRef(jobject obj) : obj_(obj) {} jobject obj_; @@ -172,6 +172,7 @@ class ScopedJavaGlobalRef : public JavaRef { public: using JavaRef::obj_; + explicit constexpr ScopedJavaGlobalRef(std::nullptr_t) {} ScopedJavaGlobalRef(JNIEnv* env, const JavaRef& other) : JavaRef(static_cast(env->NewGlobalRef(other.obj()))) {} explicit ScopedJavaGlobalRef(const ScopedJavaLocalRef& other) diff --git a/sdk/android/src/jni/androidnetworkmonitor.cc b/sdk/android/src/jni/androidnetworkmonitor.cc index 9a4eb18bfc..9555eff3f6 100644 --- a/sdk/android/src/jni/androidnetworkmonitor.cc +++ b/sdk/android/src/jni/androidnetworkmonitor.cc @@ -145,8 +145,11 @@ std::string NetworkInformation::ToString() const { return ss.str(); } -AndroidNetworkMonitor::AndroidNetworkMonitor(JNIEnv* env) +AndroidNetworkMonitor::AndroidNetworkMonitor( + JNIEnv* env, + const JavaRef& j_application_context) : android_sdk_int_(Java_NetworkMonitor_androidSdkInt(env)), + j_application_context_(env, j_application_context), j_network_monitor_(env, Java_NetworkMonitor_getInstance(env)) {} AndroidNetworkMonitor::~AndroidNetworkMonitor() = default; @@ -164,8 +167,8 @@ void AndroidNetworkMonitor::Start() { worker_thread()->socketserver()->set_network_binder(this); JNIEnv* env = AttachCurrentThreadIfNeeded(); - Java_NetworkMonitor_startMonitoring(env, j_network_monitor_, - jlongFromPointer(this)); + Java_NetworkMonitor_startMonitoring( + env, j_network_monitor_, j_application_context_, jlongFromPointer(this)); } void AndroidNetworkMonitor::Stop() { @@ -350,9 +353,20 @@ rtc::AdapterType AndroidNetworkMonitor::GetAdapterType( return type; } +AndroidNetworkMonitorFactory::AndroidNetworkMonitorFactory() + : j_application_context_(nullptr) {} + +AndroidNetworkMonitorFactory::AndroidNetworkMonitorFactory( + JNIEnv* env, + const JavaRef& j_application_context) + : j_application_context_(env, j_application_context) {} + +AndroidNetworkMonitorFactory::~AndroidNetworkMonitorFactory() = default; + rtc::NetworkMonitorInterface* AndroidNetworkMonitorFactory::CreateNetworkMonitor() { - return new AndroidNetworkMonitor(AttachCurrentThreadIfNeeded()); + return new AndroidNetworkMonitor(AttachCurrentThreadIfNeeded(), + j_application_context_); } void AndroidNetworkMonitor::NotifyConnectionTypeChanged( diff --git a/sdk/android/src/jni/androidnetworkmonitor.h b/sdk/android/src/jni/androidnetworkmonitor.h index ae052bfa70..9e45d2b50f 100644 --- a/sdk/android/src/jni/androidnetworkmonitor.h +++ b/sdk/android/src/jni/androidnetworkmonitor.h @@ -55,7 +55,8 @@ struct NetworkInformation { class AndroidNetworkMonitor : public rtc::NetworkMonitorBase, public rtc::NetworkBinderInterface { public: - explicit AndroidNetworkMonitor(JNIEnv* env); + explicit AndroidNetworkMonitor(JNIEnv* env, + const JavaRef& j_application_context); ~AndroidNetworkMonitor() override; // 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); const int android_sdk_int_; + ScopedJavaGlobalRef j_application_context_; ScopedJavaGlobalRef j_network_monitor_; rtc::ThreadChecker thread_checker_; bool started_ = false; @@ -100,9 +102,18 @@ class AndroidNetworkMonitor : public rtc::NetworkMonitorBase, class AndroidNetworkMonitorFactory : public rtc::NetworkMonitorFactory { public: - AndroidNetworkMonitorFactory() {} + // Deprecated. Pass in application context to this class. + AndroidNetworkMonitorFactory(); + + AndroidNetworkMonitorFactory(JNIEnv* env, + const JavaRef& j_application_context); + + ~AndroidNetworkMonitorFactory() override; rtc::NetworkMonitorInterface* CreateNetworkMonitor() override; + + private: + ScopedJavaGlobalRef j_application_context_; }; } // namespace jni