summaryrefslogtreecommitdiff
path: root/chromium/net/android/network_change_notifier_delegate_android.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/android/network_change_notifier_delegate_android.cc')
-rw-r--r--chromium/net/android/network_change_notifier_delegate_android.cc112
1 files changed, 112 insertions, 0 deletions
diff --git a/chromium/net/android/network_change_notifier_delegate_android.cc b/chromium/net/android/network_change_notifier_delegate_android.cc
new file mode 100644
index 00000000000..0031260b73e
--- /dev/null
+++ b/chromium/net/android/network_change_notifier_delegate_android.cc
@@ -0,0 +1,112 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/android/network_change_notifier_delegate_android.h"
+
+#include "base/logging.h"
+#include "jni/NetworkChangeNotifier_jni.h"
+
+namespace net {
+
+namespace {
+
+// Converts a Java side connection type (integer) to
+// the native side NetworkChangeNotifier::ConnectionType.
+NetworkChangeNotifier::ConnectionType ConvertConnectionType(
+ jint connection_type) {
+ switch (connection_type) {
+ case NetworkChangeNotifier::CONNECTION_UNKNOWN:
+ case NetworkChangeNotifier::CONNECTION_ETHERNET:
+ case NetworkChangeNotifier::CONNECTION_WIFI:
+ case NetworkChangeNotifier::CONNECTION_2G:
+ case NetworkChangeNotifier::CONNECTION_3G:
+ case NetworkChangeNotifier::CONNECTION_4G:
+ case NetworkChangeNotifier::CONNECTION_NONE:
+ break;
+ default:
+ NOTREACHED() << "Unknown connection type received: " << connection_type;
+ return NetworkChangeNotifier::CONNECTION_UNKNOWN;
+ }
+ return static_cast<NetworkChangeNotifier::ConnectionType>(connection_type);
+}
+
+} // namespace
+
+NetworkChangeNotifierDelegateAndroid::NetworkChangeNotifierDelegateAndroid()
+ : observers_(new ObserverListThreadSafe<Observer>()) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ java_network_change_notifier_.Reset(
+ Java_NetworkChangeNotifier_init(
+ env, base::android::GetApplicationContext()));
+ Java_NetworkChangeNotifier_addNativeObserver(
+ env, java_network_change_notifier_.obj(), reinterpret_cast<jint>(this));
+ SetCurrentConnectionType(
+ ConvertConnectionType(
+ Java_NetworkChangeNotifier_getCurrentConnectionType(
+ env, java_network_change_notifier_.obj())));
+}
+
+NetworkChangeNotifierDelegateAndroid::~NetworkChangeNotifierDelegateAndroid() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ observers_->AssertEmpty();
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_NetworkChangeNotifier_removeNativeObserver(
+ env, java_network_change_notifier_.obj(), reinterpret_cast<jint>(this));
+}
+
+NetworkChangeNotifier::ConnectionType
+NetworkChangeNotifierDelegateAndroid::GetCurrentConnectionType() const {
+ base::AutoLock auto_lock(connection_type_lock_);
+ return connection_type_;
+}
+
+void NetworkChangeNotifierDelegateAndroid::NotifyConnectionTypeChanged(
+ JNIEnv* env,
+ jobject obj,
+ jint new_connection_type) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ const ConnectionType actual_connection_type = ConvertConnectionType(
+ new_connection_type);
+ SetCurrentConnectionType(actual_connection_type);
+ observers_->Notify(&Observer::OnConnectionTypeChanged);
+}
+
+jint NetworkChangeNotifierDelegateAndroid::GetConnectionType(JNIEnv*,
+ jobject) const {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ return GetCurrentConnectionType();
+}
+
+void NetworkChangeNotifierDelegateAndroid::AddObserver(
+ Observer* observer) {
+ observers_->AddObserver(observer);
+}
+
+void NetworkChangeNotifierDelegateAndroid::RemoveObserver(
+ Observer* observer) {
+ observers_->RemoveObserver(observer);
+}
+
+// static
+bool NetworkChangeNotifierDelegateAndroid::Register(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
+
+void NetworkChangeNotifierDelegateAndroid::SetCurrentConnectionType(
+ ConnectionType new_connection_type) {
+ base::AutoLock auto_lock(connection_type_lock_);
+ connection_type_ = new_connection_type;
+}
+
+void NetworkChangeNotifierDelegateAndroid::SetOnline() {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_NetworkChangeNotifier_forceConnectivityState(env, true);
+}
+
+void NetworkChangeNotifierDelegateAndroid::SetOffline() {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_NetworkChangeNotifier_forceConnectivityState(env, false);
+}
+
+} // namespace net