// 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(connection_type); } } // namespace NetworkChangeNotifierDelegateAndroid::NetworkChangeNotifierDelegateAndroid() : observers_(new ObserverListThreadSafe()) { 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(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(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