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