• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
GetInstance()20 NetworkStateNotifier* NetworkStateNotifier::GetInstance() {
21   return Singleton<NetworkStateNotifier>::get();
22 }
23 
24 // static
GetOfflineDuration()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 
NetworkStateNotifier()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 
~NetworkStateNotifier()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 
OnNetworkManagerChanged(NetworkLibrary * cros)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 
UpdateNetworkState(NetworkStateDetails::State new_state)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
RetrieveState()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