Home | History | Annotate | Download | only in chromeos
      1 // Copyright (c) 2011 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 "chrome/browser/chromeos/network_state_notifier.h"
      6 
      7 #include "base/message_loop.h"
      8 #include "base/time.h"
      9 #include "chrome/browser/chromeos/cros/cros_library.h"
     10 #include "content/browser/browser_thread.h"
     11 #include "content/common/notification_service.h"
     12 #include "content/common/notification_type.h"
     13 
     14 namespace chromeos {
     15 
     16 using base::Time;
     17 using base::TimeDelta;
     18 
     19 // static
     20 NetworkStateNotifier* NetworkStateNotifier::GetInstance() {
     21   return Singleton<NetworkStateNotifier>::get();
     22 }
     23 
     24 // static
     25 TimeDelta NetworkStateNotifier::GetOfflineDuration() {
     26   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
     27   // TODO(oshima): make this instance method so that
     28   // we can mock this for ui_tests.
     29   // http://crbug.com/4825 .
     30   return base::Time::Now() - GetInstance()->offline_start_time_;
     31 }
     32 
     33 NetworkStateNotifier::NetworkStateNotifier()
     34     : ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)),
     35       state_(RetrieveState()),
     36       offline_start_time_(Time::Now()) {
     37   // Note that this gets added as a NetworkManagerObserver
     38   // in browser_init.cc
     39 }
     40 
     41 NetworkStateNotifier::~NetworkStateNotifier() {
     42   // Let the NetworkManagerObserver leak to avoid a DCHECK
     43   // failure in CommandLine::ForCurrentProcess.
     44 //  if (CrosLibrary::Get()->EnsureLoaded())
     45 //    CrosLibrary::Get()->GetNetworkLibrary()->
     46 //        RemoveNetworkManagerObserver(this);
     47 }
     48 
     49 void NetworkStateNotifier::OnNetworkManagerChanged(NetworkLibrary* cros) {
     50   DCHECK(CrosLibrary::Get()->EnsureLoaded());
     51   // Update the state 500ms later using UI thread.
     52   // See http://crosbug.com/4558
     53   BrowserThread::PostDelayedTask(
     54       BrowserThread::UI, FROM_HERE,
     55       task_factory_.NewRunnableMethod(
     56           &NetworkStateNotifier::UpdateNetworkState,
     57           RetrieveState()),
     58       500);
     59 }
     60 
     61 void NetworkStateNotifier::UpdateNetworkState(
     62     NetworkStateDetails::State new_state) {
     63   DVLOG(1) << "UpdateNetworkState: new=" << new_state << ", old=" << state_;
     64   if (state_ == NetworkStateDetails::CONNECTED &&
     65       new_state != NetworkStateDetails::CONNECTED) {
     66     offline_start_time_ = Time::Now();
     67   }
     68 
     69   state_ = new_state;
     70   NetworkStateDetails details(state_);
     71   NotificationService::current()->Notify(
     72       NotificationType::NETWORK_STATE_CHANGED,
     73       NotificationService::AllSources(),
     74       Details<NetworkStateDetails>(&details));
     75 };
     76 
     77 // static
     78 NetworkStateDetails::State NetworkStateNotifier::RetrieveState() {
     79   // Running on desktop means always connected, for now.
     80   if (!CrosLibrary::Get()->EnsureLoaded())
     81     return NetworkStateDetails::CONNECTED;
     82   NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary();
     83   if (cros->Connected()) {
     84     return NetworkStateDetails::CONNECTED;
     85   } else if (cros->Connecting()) {
     86     return NetworkStateDetails::CONNECTING;
     87   } else {
     88     return NetworkStateDetails::DISCONNECTED;
     89   }
     90 }
     91 
     92 
     93 }  // namespace chromeos
     94