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