diff options
Diffstat (limited to 'chromium/net/android/network_change_notifier_delegate_android.cc')
-rw-r--r-- | chromium/net/android/network_change_notifier_delegate_android.cc | 112 |
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 |