12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/android/network_change_notifier_delegate_android.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "jni/NetworkChangeNotifier_jni.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net { 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Converts a Java side connection type (integer) to 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the native side NetworkChangeNotifier::ConnectionType. 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkChangeNotifier::ConnectionType ConvertConnectionType( 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) jint connection_type) { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (connection_type) { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case NetworkChangeNotifier::CONNECTION_UNKNOWN: 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case NetworkChangeNotifier::CONNECTION_ETHERNET: 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case NetworkChangeNotifier::CONNECTION_WIFI: 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case NetworkChangeNotifier::CONNECTION_2G: 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case NetworkChangeNotifier::CONNECTION_3G: 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case NetworkChangeNotifier::CONNECTION_4G: 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case NetworkChangeNotifier::CONNECTION_NONE: 2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) case NetworkChangeNotifier::CONNECTION_BLUETOOTH: 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Unknown connection type received: " << connection_type; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NetworkChangeNotifier::CONNECTION_UNKNOWN; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<NetworkChangeNotifier::ConnectionType>(connection_type); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkChangeNotifierDelegateAndroid::NetworkChangeNotifierDelegateAndroid() 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : observers_(new ObserverListThreadSafe<Observer>()) { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) java_network_change_notifier_.Reset( 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Java_NetworkChangeNotifier_init( 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env, base::android::GetApplicationContext())); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Java_NetworkChangeNotifier_addNativeObserver( 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env, java_network_change_notifier_.obj(), 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) reinterpret_cast<intptr_t>(this)); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCurrentConnectionType( 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ConvertConnectionType( 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Java_NetworkChangeNotifier_getCurrentConnectionType( 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env, java_network_change_notifier_.obj()))); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkChangeNotifierDelegateAndroid::~NetworkChangeNotifierDelegateAndroid() { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_->AssertEmpty(); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Java_NetworkChangeNotifier_removeNativeObserver( 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env, java_network_change_notifier_.obj(), 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) reinterpret_cast<intptr_t>(this)); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkChangeNotifier::ConnectionType 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)NetworkChangeNotifierDelegateAndroid::GetCurrentConnectionType() const { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoLock auto_lock(connection_type_lock_); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return connection_type_; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkChangeNotifierDelegateAndroid::NotifyConnectionTypeChanged( 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JNIEnv* env, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) jobject obj, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) jint new_connection_type) { 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ConnectionType actual_connection_type = ConvertConnectionType( 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_connection_type); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetCurrentConnectionType(actual_connection_type); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_->Notify(&Observer::OnConnectionTypeChanged); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)jint NetworkChangeNotifierDelegateAndroid::GetConnectionType(JNIEnv*, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) jobject) const { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetCurrentConnectionType(); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkChangeNotifierDelegateAndroid::AddObserver( 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Observer* observer) { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_->AddObserver(observer); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkChangeNotifierDelegateAndroid::RemoveObserver( 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Observer* observer) { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) observers_->RemoveObserver(observer); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NetworkChangeNotifierDelegateAndroid::Register(JNIEnv* env) { 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RegisterNativesImpl(env); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkChangeNotifierDelegateAndroid::SetCurrentConnectionType( 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ConnectionType new_connection_type) { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoLock auto_lock(connection_type_lock_); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connection_type_ = new_connection_type; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkChangeNotifierDelegateAndroid::SetOnline() { 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Java_NetworkChangeNotifier_forceConnectivityState(env, true); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void NetworkChangeNotifierDelegateAndroid::SetOffline() { 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Java_NetworkChangeNotifier_forceConnectivityState(env, false); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace net 116