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.
5 #include "net/android/network_change_notifier_delegate_android.h"
7 #include "base/logging.h"
8 #include "jni/NetworkChangeNotifier_jni.h"
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:
28 NOTREACHED() << "Unknown connection type received: " << connection_type;
29 return NetworkChangeNotifier::CONNECTION_UNKNOWN;
31 return static_cast<NetworkChangeNotifier::ConnectionType>(connection_type);
36 NetworkChangeNotifierDelegateAndroid::NetworkChangeNotifierDelegateAndroid()
37 : observers_(new ObserverListThreadSafe<Observer>()) {
38 JNIEnv* env = base::android::AttachCurrentThread();
39 java_network_change_notifier_.Reset(
40 Java_NetworkChangeNotifier_init(
41 env, base::android::GetApplicationContext()));
42 Java_NetworkChangeNotifier_addNativeObserver(
43 env, java_network_change_notifier_.obj(), reinterpret_cast<jint>(this));
44 SetCurrentConnectionType(
45 ConvertConnectionType(
46 Java_NetworkChangeNotifier_getCurrentConnectionType(
47 env, java_network_change_notifier_.obj())));
50 NetworkChangeNotifierDelegateAndroid::~NetworkChangeNotifierDelegateAndroid() {
51 DCHECK(thread_checker_.CalledOnValidThread());
52 observers_->AssertEmpty();
53 JNIEnv* env = base::android::AttachCurrentThread();
54 Java_NetworkChangeNotifier_removeNativeObserver(
55 env, java_network_change_notifier_.obj(), reinterpret_cast<jint>(this));
58 NetworkChangeNotifier::ConnectionType
59 NetworkChangeNotifierDelegateAndroid::GetCurrentConnectionType() const {
60 base::AutoLock auto_lock(connection_type_lock_);
61 return connection_type_;
64 void NetworkChangeNotifierDelegateAndroid::NotifyConnectionTypeChanged(
67 jint new_connection_type) {
68 DCHECK(thread_checker_.CalledOnValidThread());
69 const ConnectionType actual_connection_type = ConvertConnectionType(
71 SetCurrentConnectionType(actual_connection_type);
72 observers_->Notify(&Observer::OnConnectionTypeChanged);
75 jint NetworkChangeNotifierDelegateAndroid::GetConnectionType(JNIEnv*,
77 DCHECK(thread_checker_.CalledOnValidThread());
78 return GetCurrentConnectionType();
81 void NetworkChangeNotifierDelegateAndroid::AddObserver(
83 observers_->AddObserver(observer);
86 void NetworkChangeNotifierDelegateAndroid::RemoveObserver(
88 observers_->RemoveObserver(observer);
92 bool NetworkChangeNotifierDelegateAndroid::Register(JNIEnv* env) {
93 return RegisterNativesImpl(env);
96 void NetworkChangeNotifierDelegateAndroid::SetCurrentConnectionType(
97 ConnectionType new_connection_type) {
98 base::AutoLock auto_lock(connection_type_lock_);
99 connection_type_ = new_connection_type;
102 void NetworkChangeNotifierDelegateAndroid::SetOnline() {
103 JNIEnv* env = base::android::AttachCurrentThread();
104 Java_NetworkChangeNotifier_forceConnectivityState(env, true);
107 void NetworkChangeNotifierDelegateAndroid::SetOffline() {
108 JNIEnv* env = base::android::AttachCurrentThread();
109 Java_NetworkChangeNotifier_forceConnectivityState(env, false);