1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/android/network_change_notifier_delegate_android.h" 6 7 #include "base/logging.h" 8 #include "jni/NetworkChangeNotifier_jni.h" 9 10 namespace net { 11 12 namespace { 13 14 // Converts a Java side connection type (integer) to 15 // the native side NetworkChangeNotifier::ConnectionType. 16 NetworkChangeNotifier::ConnectionType ConvertConnectionType( 17 jint connection_type) { 18 switch (connection_type) { 19 case NetworkChangeNotifier::CONNECTION_UNKNOWN: 20 case NetworkChangeNotifier::CONNECTION_ETHERNET: 21 case NetworkChangeNotifier::CONNECTION_WIFI: 22 case NetworkChangeNotifier::CONNECTION_2G: 23 case NetworkChangeNotifier::CONNECTION_3G: 24 case NetworkChangeNotifier::CONNECTION_4G: 25 case NetworkChangeNotifier::CONNECTION_NONE: 26 case NetworkChangeNotifier::CONNECTION_BLUETOOTH: 27 break; 28 default: 29 NOTREACHED() << "Unknown connection type received: " << connection_type; 30 return NetworkChangeNotifier::CONNECTION_UNKNOWN; 31 } 32 return static_cast<NetworkChangeNotifier::ConnectionType>(connection_type); 33 } 34 35 } // namespace 36 37 NetworkChangeNotifierDelegateAndroid::NetworkChangeNotifierDelegateAndroid() 38 : observers_(new ObserverListThreadSafe<Observer>()) { 39 JNIEnv* env = base::android::AttachCurrentThread(); 40 java_network_change_notifier_.Reset( 41 Java_NetworkChangeNotifier_init( 42 env, base::android::GetApplicationContext())); 43 Java_NetworkChangeNotifier_addNativeObserver( 44 env, java_network_change_notifier_.obj(), 45 reinterpret_cast<intptr_t>(this)); 46 SetCurrentConnectionType( 47 ConvertConnectionType( 48 Java_NetworkChangeNotifier_getCurrentConnectionType( 49 env, java_network_change_notifier_.obj()))); 50 } 51 52 NetworkChangeNotifierDelegateAndroid::~NetworkChangeNotifierDelegateAndroid() { 53 DCHECK(thread_checker_.CalledOnValidThread()); 54 observers_->AssertEmpty(); 55 JNIEnv* env = base::android::AttachCurrentThread(); 56 Java_NetworkChangeNotifier_removeNativeObserver( 57 env, java_network_change_notifier_.obj(), 58 reinterpret_cast<intptr_t>(this)); 59 } 60 61 NetworkChangeNotifier::ConnectionType 62 NetworkChangeNotifierDelegateAndroid::GetCurrentConnectionType() const { 63 base::AutoLock auto_lock(connection_type_lock_); 64 return connection_type_; 65 } 66 67 void NetworkChangeNotifierDelegateAndroid::NotifyConnectionTypeChanged( 68 JNIEnv* env, 69 jobject obj, 70 jint new_connection_type) { 71 DCHECK(thread_checker_.CalledOnValidThread()); 72 const ConnectionType actual_connection_type = ConvertConnectionType( 73 new_connection_type); 74 SetCurrentConnectionType(actual_connection_type); 75 observers_->Notify(&Observer::OnConnectionTypeChanged); 76 } 77 78 jint NetworkChangeNotifierDelegateAndroid::GetConnectionType(JNIEnv*, 79 jobject) const { 80 DCHECK(thread_checker_.CalledOnValidThread()); 81 return GetCurrentConnectionType(); 82 } 83 84 void NetworkChangeNotifierDelegateAndroid::AddObserver( 85 Observer* observer) { 86 observers_->AddObserver(observer); 87 } 88 89 void NetworkChangeNotifierDelegateAndroid::RemoveObserver( 90 Observer* observer) { 91 observers_->RemoveObserver(observer); 92 } 93 94 // static 95 bool NetworkChangeNotifierDelegateAndroid::Register(JNIEnv* env) { 96 return RegisterNativesImpl(env); 97 } 98 99 void NetworkChangeNotifierDelegateAndroid::SetCurrentConnectionType( 100 ConnectionType new_connection_type) { 101 base::AutoLock auto_lock(connection_type_lock_); 102 connection_type_ = new_connection_type; 103 } 104 105 void NetworkChangeNotifierDelegateAndroid::SetOnline() { 106 JNIEnv* env = base::android::AttachCurrentThread(); 107 Java_NetworkChangeNotifier_forceConnectivityState(env, true); 108 } 109 110 void NetworkChangeNotifierDelegateAndroid::SetOffline() { 111 JNIEnv* env = base::android::AttachCurrentThread(); 112 Java_NetworkChangeNotifier_forceConnectivityState(env, false); 113 } 114 115 } // namespace net 116