Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/policy/device_status_collector.h" | 5 #include "chrome/browser/policy/device_status_collector.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback.h" | 8 #include "base/callback.h" |
| 9 #include "base/string_number_conversions.h" | 9 #include "base/string_number_conversions.h" |
| 10 #include "chrome/browser/chromeos/cros_settings.h" | 10 #include "chrome/browser/chromeos/cros_settings.h" |
| 11 #include "chrome/browser/chromeos/cros_settings_names.h" | 11 #include "chrome/browser/chromeos/cros_settings_names.h" |
| 12 #include "chrome/browser/chromeos/system/statistics_provider.h" | 12 #include "chrome/browser/chromeos/system/statistics_provider.h" |
| 13 #include "chrome/browser/policy/proto/device_management_backend.pb.h" | 13 #include "chrome/browser/policy/proto/device_management_backend.pb.h" |
| 14 #include "chrome/browser/prefs/pref_service.h" | 14 #include "chrome/browser/prefs/pref_service.h" |
| 15 #include "chrome/browser/prefs/scoped_user_pref_update.h" | 15 #include "chrome/browser/prefs/scoped_user_pref_update.h" |
| 16 #include "chrome/common/chrome_notification_types.h" | 16 #include "chrome/common/chrome_notification_types.h" |
| 17 #include "chrome/common/chrome_version_info.h" | 17 #include "chrome/common/chrome_version_info.h" |
| 18 #include "chrome/common/pref_names.h" | 18 #include "chrome/common/pref_names.h" |
| 19 #include "content/browser/geolocation/geolocation_provider.h" | |
| 20 #include "content/public/browser/browser_thread.h" | |
| 19 | 21 |
| 20 using base::Time; | 22 using base::Time; |
| 21 using base::TimeDelta; | 23 using base::TimeDelta; |
| 22 using chromeos::VersionLoader; | 24 using chromeos::VersionLoader; |
| 23 | 25 |
| 24 namespace em = enterprise_management; | 26 namespace em = enterprise_management; |
| 25 | 27 |
| 26 namespace { | 28 namespace { |
| 27 // How many seconds of inactivity triggers the idle state. | 29 // How many seconds of inactivity triggers the idle state. |
| 28 const unsigned int kIdleStateThresholdSeconds = 300; | 30 const unsigned int kIdleStateThresholdSeconds = 300; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 46 int previous_activity = 0; | 48 int previous_activity = 0; |
| 47 activity_times->GetInteger(day_key, &previous_activity); | 49 activity_times->GetInteger(day_key, &previous_activity); |
| 48 activity_times->SetInteger(day_key, | 50 activity_times->SetInteger(day_key, |
| 49 previous_activity + activity.InMilliseconds()); | 51 previous_activity + activity.InMilliseconds()); |
| 50 } | 52 } |
| 51 | 53 |
| 52 } // namespace | 54 } // namespace |
| 53 | 55 |
| 54 namespace policy { | 56 namespace policy { |
| 55 | 57 |
| 58 // Helper class for retrieving the device's geographic location. | |
| 59 class DeviceStatusLocationHelper : public GeolocationObserver { | |
|
Joao da Silva
2012/04/20 09:49:57
I'd move this one to its own file.
bartfab (slow)
2012/04/20 14:10:15
Done.
| |
| 60 public: | |
| 61 explicit DeviceStatusLocationHelper(PrefService* local_state); | |
| 62 virtual ~DeviceStatusLocationHelper(); | |
| 63 void Destruct(); | |
| 64 | |
| 65 const Geoposition& GetPosition() const; | |
| 66 | |
| 67 static void RegisterPrefs(PrefService* local_state); | |
| 68 | |
| 69 virtual void OnLocationUpdate(const Geoposition& position); | |
|
Joao da Silva
2012/04/20 09:49:57
OVERRIDE
bartfab (slow)
2012/04/20 14:10:15
Done.
| |
| 70 | |
| 71 void SetGeolocationProviderForTest(GeolocationProvider* provider); | |
| 72 | |
| 73 static const unsigned int kPollIntervalSeconds = 1800; | |
| 74 | |
| 75 private: | |
| 76 void Init(const Geoposition& position); | |
| 77 void DestructInternal(); | |
| 78 | |
| 79 void ScheduleUpdate(const Geoposition& position); | |
| 80 | |
| 81 void StartObserving(); | |
| 82 void StopObserving(); | |
| 83 | |
| 84 void ReceiveUpdate(const Geoposition& position); | |
| 85 | |
| 86 // Used by UI thread only | |
| 87 PrefService* local_state_; | |
| 88 Geoposition position_; | |
| 89 | |
| 90 // Used by IO thread only | |
| 91 base::OneShotTimer<DeviceStatusLocationHelper> *timer_; | |
| 92 GeolocationProvider* provider_; | |
| 93 bool observing_; | |
| 94 | |
| 95 DISALLOW_COPY_AND_ASSIGN(DeviceStatusLocationHelper); | |
| 96 }; | |
| 97 | |
| 98 DeviceStatusLocationHelper::DeviceStatusLocationHelper( | |
| 99 PrefService* local_state) | |
| 100 : local_state_(local_state), | |
| 101 timer_(NULL), | |
| 102 provider_(NULL), | |
| 103 observing_(false) { | |
| 104 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | |
| 105 Geoposition position; | |
| 106 std::string timestamp_str; | |
| 107 int64 timestamp; | |
| 108 const base::DictionaryValue* location = | |
| 109 local_state_->GetDictionary(prefs::kDeviceLocation); | |
| 110 if (location->GetDouble("latitude", &position.latitude) && | |
| 111 location->GetDouble("longitude", &position.longitude) && | |
| 112 location->GetDouble("altitude", &position.altitude) && | |
| 113 location->GetDouble("accuracy", &position.accuracy) && | |
| 114 location->GetDouble("altitude_accuracy", | |
| 115 &position.altitude_accuracy) && | |
| 116 location->GetDouble("heading", &position.heading) && | |
| 117 location->GetDouble("speed", &position.speed) && | |
| 118 location->GetString("timestamp", ×tamp_str) && | |
| 119 base::StringToInt64(timestamp_str, ×tamp)) { | |
| 120 position.timestamp = base::Time::FromInternalValue(timestamp); | |
|
Joao da Silva
2012/04/20 09:49:57
Nit: base::Time -> Time
bartfab (slow)
2012/04/20 14:10:15
It moved to its own .cc file without "using base::
| |
| 121 position_ = position; | |
| 122 } | |
| 123 content::BrowserThread::PostTask( | |
| 124 content::BrowserThread::IO, | |
| 125 FROM_HERE, | |
| 126 base::Bind(&DeviceStatusLocationHelper::Init, | |
| 127 base::Unretained(this), | |
| 128 position_)); | |
| 129 } | |
| 130 | |
| 131 DeviceStatusLocationHelper::~DeviceStatusLocationHelper() { | |
| 132 // Do not call the destructor directly. Call Destruct() instead. | |
| 133 // The destructor is only public so that the DeleteSoon task can call it. | |
|
Joao da Silva
2012/04/20 09:49:57
Make the dtor private, and add
friend class base:
bartfab (slow)
2012/04/20 14:10:15
Done.
| |
| 134 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | |
| 135 DCHECK(local_state_ == NULL); | |
| 136 DCHECK(timer_ == NULL); | |
| 137 } | |
| 138 | |
| 139 void DeviceStatusLocationHelper::Destruct() { | |
| 140 // This class has a specific shutdown sequence that ensures all classes it | |
| 141 // interfaces with are notified on the appropriate threads and any tasks | |
| 142 // posted to it are processed before destrucion. | |
|
Joao da Silva
2012/04/20 09:49:57
*destruction
bartfab (slow)
2012/04/20 14:10:15
Done.
| |
| 143 // | |
| 144 // The shutdown sequence is initiated by calling Destruct() on the UI thread: | |
| 145 // | |
| 146 // 1. Destruct() makes the UI thread ignore any further updates it receives, | |
| 147 // then posts DestructInner() to the IO thread. | |
| 148 // 2. DestructInner() reaches the IO thread after any updates queued up for it | |
|
Joao da Silva
2012/04/20 09:49:57
In these 2 lines: DestructInner -> DestructInterna
bartfab (slow)
2012/04/20 14:10:15
Done.
| |
| 149 // have been processed. This function destroys the poll timer and detaches | |
| 150 // from the GeolocationProvider so that no further updates can be received | |
| 151 // by the IO thread. Then, it posts DeleteSoon() back to the UI thread. | |
| 152 // 3. DeleteSoon() reaches the UI thread after any updates queued for it have | |
| 153 // been processed. At this point, there are no more tasks queued up for | |
| 154 // either of the threads and it is safe for the object to be deleted. | |
| 155 // 4. ~DeviceStatusLocationHelper() is run by DeleteSoon() and the object RIP. | |
| 156 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | |
| 157 local_state_ = NULL; | |
| 158 content::BrowserThread::PostTask( | |
| 159 content::BrowserThread::IO, | |
| 160 FROM_HERE, | |
| 161 base::Bind(&DeviceStatusLocationHelper::DestructInternal, | |
| 162 base::Unretained(this))); | |
| 163 } | |
| 164 | |
| 165 const Geoposition& DeviceStatusLocationHelper::GetPosition() const { | |
| 166 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | |
| 167 return position_; | |
| 168 } | |
| 169 | |
| 170 // static | |
| 171 void DeviceStatusLocationHelper::RegisterPrefs(PrefService* local_state) { | |
| 172 local_state->RegisterDictionaryPref(prefs::kDeviceLocation, | |
| 173 new DictionaryValue); | |
| 174 } | |
| 175 | |
| 176 void DeviceStatusLocationHelper::OnLocationUpdate(const Geoposition& position) { | |
| 177 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | |
| 178 if (!position.IsValidFix()) | |
| 179 return; | |
| 180 content::BrowserThread::PostTask( | |
| 181 content::BrowserThread::UI, | |
| 182 FROM_HERE, | |
| 183 base::Bind(&DeviceStatusLocationHelper::ReceiveUpdate, | |
| 184 base::Unretained(this), position)); | |
| 185 StopObserving(); | |
| 186 ScheduleUpdate(position); | |
| 187 } | |
| 188 | |
| 189 void DeviceStatusLocationHelper::SetGeolocationProviderForTest( | |
| 190 GeolocationProvider* provider) { | |
| 191 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | |
| 192 DCHECK(!provider_); | |
| 193 provider_ = provider; | |
| 194 } | |
| 195 | |
| 196 void DeviceStatusLocationHelper::Init(const Geoposition& position) { | |
| 197 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | |
| 198 if (!provider_) | |
| 199 provider_ = GeolocationProvider::GetInstance(); | |
| 200 timer_ = new base::OneShotTimer<DeviceStatusLocationHelper>(); | |
| 201 provider_->OnPermissionGranted(); | |
|
Joao da Silva
2012/04/20 09:49:57
Doesn't this need a GURL?
bartfab (slow)
2012/04/20 14:10:15
The GURL parameter was not actually being used for
Joao da Silva
2012/04/20 14:21:09
I see, thanks for the clarification.
| |
| 202 ScheduleUpdate(position); | |
| 203 } | |
| 204 | |
| 205 void DeviceStatusLocationHelper::DestructInternal() { | |
| 206 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | |
| 207 delete timer_; | |
| 208 timer_ = 0; | |
| 209 StopObserving(); | |
| 210 content::BrowserThread::DeleteSoon(content::BrowserThread::UI, | |
| 211 FROM_HERE, | |
| 212 this); | |
| 213 } | |
| 214 | |
| 215 void DeviceStatusLocationHelper::ScheduleUpdate(const Geoposition& position) { | |
| 216 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | |
| 217 if (position.IsValidFix()) { | |
| 218 TimeDelta elapsed = Time::Now() - position.timestamp; | |
| 219 TimeDelta interval = TimeDelta::FromSeconds(kPollIntervalSeconds); | |
| 220 if (elapsed > interval) | |
| 221 StartObserving(); | |
| 222 timer_->Start(FROM_HERE, interval - elapsed, this, | |
| 223 &DeviceStatusLocationHelper::StartObserving); | |
|
Joao da Silva
2012/04/20 09:49:57
Shouldn't this be in an else block here, so that i
bartfab (slow)
2012/04/20 14:10:15
Done.
| |
| 224 } else { | |
| 225 StartObserving(); | |
| 226 } | |
| 227 } | |
| 228 | |
| 229 void DeviceStatusLocationHelper::StartObserving() { | |
| 230 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | |
| 231 timer_->Stop(); | |
| 232 provider_->AddObserver(this, GeolocationObserverOptions(true)); | |
| 233 observing_ = true; | |
| 234 } | |
| 235 | |
| 236 void DeviceStatusLocationHelper::StopObserving() { | |
| 237 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); | |
| 238 if (!observing_) | |
| 239 return; | |
| 240 provider_->RemoveObserver(this); | |
| 241 observing_ = false; | |
| 242 } | |
| 243 | |
| 244 void DeviceStatusLocationHelper::ReceiveUpdate(const Geoposition& position) { | |
| 245 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | |
| 246 if (!local_state_) | |
| 247 return; | |
| 248 position_ = position; | |
| 249 DictionaryValue location; | |
| 250 location.SetDouble("latitude", position.latitude); | |
| 251 location.SetDouble("longitude", position.longitude); | |
| 252 location.SetDouble("altitude", position.altitude); | |
| 253 location.SetDouble("accuracy", position.accuracy); | |
| 254 location.SetDouble("altitude_accuracy", position.altitude_accuracy); | |
| 255 location.SetDouble("heading", position.heading); | |
| 256 location.SetDouble("speed", position.speed); | |
| 257 location.SetString("timestamp", | |
| 258 base::Int64ToString(position.timestamp.ToInternalValue())); | |
| 259 local_state_->Set(prefs::kDeviceLocation, location); | |
| 260 } | |
| 261 | |
| 56 DeviceStatusCollector::DeviceStatusCollector( | 262 DeviceStatusCollector::DeviceStatusCollector( |
| 57 PrefService* local_state, | 263 PrefService* local_state, |
| 58 chromeos::system::StatisticsProvider* provider) | 264 chromeos::system::StatisticsProvider* provider) |
| 59 : max_stored_past_activity_days_(kMaxStoredPastActivityDays), | 265 : max_stored_past_activity_days_(kMaxStoredPastActivityDays), |
| 60 max_stored_future_activity_days_(kMaxStoredFutureActivityDays), | 266 max_stored_future_activity_days_(kMaxStoredFutureActivityDays), |
| 61 local_state_(local_state), | 267 local_state_(local_state), |
| 62 last_idle_check_(Time()), | 268 last_idle_check_(Time()), |
| 63 statistics_provider_(provider), | 269 statistics_provider_(provider), |
| 270 geolocation_provider_for_test_(NULL), | |
| 271 location_helper_(NULL), | |
| 64 report_version_info_(false), | 272 report_version_info_(false), |
| 65 report_activity_times_(false), | 273 report_activity_times_(false), |
| 66 report_boot_mode_(false) { | 274 report_boot_mode_(false), |
| 275 report_location_(false) { | |
| 67 timer_.Start(FROM_HERE, | 276 timer_.Start(FROM_HERE, |
| 68 TimeDelta::FromSeconds(kPollIntervalSeconds), | 277 TimeDelta::FromSeconds(kPollIntervalSeconds), |
| 69 this, &DeviceStatusCollector::CheckIdleState); | 278 this, &DeviceStatusCollector::CheckIdleState); |
| 70 | 279 |
| 71 cros_settings_ = chromeos::CrosSettings::Get(); | 280 cros_settings_ = chromeos::CrosSettings::Get(); |
| 72 | 281 |
| 73 // Watch for changes to the individual policies that control what the status | 282 // Watch for changes to the individual policies that control what the status |
| 74 // reports contain. | 283 // reports contain. |
| 75 cros_settings_->AddSettingsObserver(chromeos::kReportDeviceVersionInfo, this); | 284 cros_settings_->AddSettingsObserver(chromeos::kReportDeviceVersionInfo, this); |
| 76 cros_settings_->AddSettingsObserver(chromeos::kReportDeviceActivityTimes, | 285 cros_settings_->AddSettingsObserver(chromeos::kReportDeviceActivityTimes, |
| 77 this); | 286 this); |
| 78 cros_settings_->AddSettingsObserver(chromeos::kReportDeviceBootMode, this); | 287 cros_settings_->AddSettingsObserver(chromeos::kReportDeviceBootMode, this); |
| 288 cros_settings_->AddSettingsObserver(chromeos::kReportDeviceLocation, this); | |
| 79 | 289 |
| 80 // Fetch the current values of the policies. | 290 // Fetch the current values of the policies. |
| 81 UpdateReportingSettings(); | 291 UpdateReportingSettings(); |
| 82 | 292 |
| 83 // Get the the OS and firmware version info. | 293 // Get the the OS and firmware version info. |
| 84 version_loader_.GetVersion(&consumer_, | 294 version_loader_.GetVersion(&consumer_, |
| 85 base::Bind(&DeviceStatusCollector::OnOSVersion, | 295 base::Bind(&DeviceStatusCollector::OnOSVersion, |
| 86 base::Unretained(this)), | 296 base::Unretained(this)), |
| 87 VersionLoader::VERSION_FULL); | 297 VersionLoader::VERSION_FULL); |
| 88 version_loader_.GetFirmware(&consumer_, | 298 version_loader_.GetFirmware(&consumer_, |
| 89 base::Bind(&DeviceStatusCollector::OnOSFirmware, | 299 base::Bind(&DeviceStatusCollector::OnOSFirmware, |
| 90 base::Unretained(this))); | 300 base::Unretained(this))); |
| 91 } | 301 } |
| 92 | 302 |
| 93 DeviceStatusCollector::~DeviceStatusCollector() { | 303 DeviceStatusCollector::~DeviceStatusCollector() { |
| 94 cros_settings_->RemoveSettingsObserver(chromeos::kReportDeviceVersionInfo, | 304 cros_settings_->RemoveSettingsObserver(chromeos::kReportDeviceVersionInfo, |
| 95 this); | 305 this); |
| 96 cros_settings_->RemoveSettingsObserver(chromeos::kReportDeviceActivityTimes, | 306 cros_settings_->RemoveSettingsObserver(chromeos::kReportDeviceActivityTimes, |
| 97 this); | 307 this); |
| 98 cros_settings_->RemoveSettingsObserver(chromeos::kReportDeviceBootMode, this); | 308 cros_settings_->RemoveSettingsObserver(chromeos::kReportDeviceBootMode, this); |
| 309 cros_settings_->RemoveSettingsObserver(chromeos::kReportDeviceLocation, this); | |
| 310 | |
| 311 if (location_helper_) | |
| 312 location_helper_->Destruct(); | |
| 99 } | 313 } |
| 100 | 314 |
| 101 // static | 315 // static |
| 102 void DeviceStatusCollector::RegisterPrefs(PrefService* local_state) { | 316 void DeviceStatusCollector::RegisterPrefs(PrefService* local_state) { |
| 103 local_state->RegisterDictionaryPref(prefs::kDeviceActivityTimes, | 317 local_state->RegisterDictionaryPref(prefs::kDeviceActivityTimes, |
| 104 new DictionaryValue); | 318 new DictionaryValue); |
| 319 DeviceStatusLocationHelper::RegisterPrefs(local_state); | |
| 105 } | 320 } |
| 106 | 321 |
| 107 void DeviceStatusCollector::CheckIdleState() { | 322 void DeviceStatusCollector::CheckIdleState() { |
| 108 CalculateIdleState(kIdleStateThresholdSeconds, | 323 CalculateIdleState(kIdleStateThresholdSeconds, |
| 109 base::Bind(&DeviceStatusCollector::IdleStateCallback, | 324 base::Bind(&DeviceStatusCollector::IdleStateCallback, |
| 110 base::Unretained(this))); | 325 base::Unretained(this))); |
| 111 } | 326 } |
| 112 | 327 |
| 328 void DeviceStatusCollector::SetGeolocationProviderForTest( | |
| 329 GeolocationProvider* provider) { | |
| 330 geolocation_provider_for_test_ = provider; | |
| 331 if (location_helper_) | |
| 332 location_helper_->SetGeolocationProviderForTest(provider); | |
| 333 } | |
| 334 | |
| 113 void DeviceStatusCollector::UpdateReportingSettings() { | 335 void DeviceStatusCollector::UpdateReportingSettings() { |
| 114 // Attempt to fetch the current value of the reporting settings. | 336 // Attempt to fetch the current value of the reporting settings. |
| 115 // If trusted values are not available, register this function to be called | 337 // If trusted values are not available, register this function to be called |
| 116 // back when they are available. | 338 // back when they are available. |
| 117 if (!cros_settings_->PrepareTrustedValues( | 339 if (!cros_settings_->PrepareTrustedValues( |
| 118 base::Bind(&DeviceStatusCollector::UpdateReportingSettings, | 340 base::Bind(&DeviceStatusCollector::UpdateReportingSettings, |
| 119 base::Unretained(this)))) { | 341 base::Unretained(this)))) { |
| 120 return; | 342 return; |
| 121 } | 343 } |
| 122 cros_settings_->GetBoolean( | 344 cros_settings_->GetBoolean( |
| 123 chromeos::kReportDeviceVersionInfo, &report_version_info_); | 345 chromeos::kReportDeviceVersionInfo, &report_version_info_); |
| 124 cros_settings_->GetBoolean( | 346 cros_settings_->GetBoolean( |
| 125 chromeos::kReportDeviceActivityTimes, &report_activity_times_); | 347 chromeos::kReportDeviceActivityTimes, &report_activity_times_); |
| 126 cros_settings_->GetBoolean( | 348 cros_settings_->GetBoolean( |
| 127 chromeos::kReportDeviceBootMode, &report_boot_mode_); | 349 chromeos::kReportDeviceBootMode, &report_boot_mode_); |
| 350 cros_settings_->GetBoolean( | |
| 351 chromeos::kReportDeviceLocation, &report_location_); | |
| 352 | |
| 353 if (report_location_) { | |
| 354 if (!location_helper_) { | |
| 355 location_helper_ = new DeviceStatusLocationHelper(local_state_); | |
| 356 if (geolocation_provider_for_test_) | |
|
Joao da Silva
2012/04/20 09:49:57
Braces around the block when it spans more than 1
bartfab (slow)
2012/04/20 14:10:15
Done.
| |
| 357 location_helper_->SetGeolocationProviderForTest( | |
| 358 geolocation_provider_for_test_); | |
| 359 } | |
| 360 } else { | |
| 361 if (location_helper_) { | |
| 362 location_helper_->Destruct(); | |
| 363 location_helper_ = NULL; | |
| 364 } | |
| 365 local_state_->ClearPref(prefs::kDeviceLocation); | |
| 366 } | |
| 128 } | 367 } |
| 129 | 368 |
| 130 Time DeviceStatusCollector::GetCurrentTime() { | 369 Time DeviceStatusCollector::GetCurrentTime() { |
| 131 return Time::Now(); | 370 return Time::Now(); |
| 132 } | 371 } |
| 133 | 372 |
| 134 // Remove all out-of-range activity times from the local store. | 373 // Remove all out-of-range activity times from the local store. |
| 135 void DeviceStatusCollector::PruneStoredActivityPeriods(Time base_time) { | 374 void DeviceStatusCollector::PruneStoredActivityPeriods(Time base_time) { |
| 136 const DictionaryValue* activity_times = | 375 const DictionaryValue* activity_times = |
| 137 local_state_->GetDictionary(prefs::kDeviceActivityTimes); | 376 local_state_->GetDictionary(prefs::kDeviceActivityTimes); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 251 std::string dev_switch_mode; | 490 std::string dev_switch_mode; |
| 252 if (statistics_provider_->GetMachineStatistic( | 491 if (statistics_provider_->GetMachineStatistic( |
| 253 "devsw_boot", &dev_switch_mode)) { | 492 "devsw_boot", &dev_switch_mode)) { |
| 254 if (dev_switch_mode == "1") | 493 if (dev_switch_mode == "1") |
| 255 request->set_boot_mode("Dev"); | 494 request->set_boot_mode("Dev"); |
| 256 else if (dev_switch_mode == "0") | 495 else if (dev_switch_mode == "0") |
| 257 request->set_boot_mode("Verified"); | 496 request->set_boot_mode("Verified"); |
| 258 } | 497 } |
| 259 } | 498 } |
| 260 | 499 |
| 500 void DeviceStatusCollector::GetLocation( | |
| 501 em::DeviceStatusReportRequest* request) { | |
| 502 em::DeviceLocation* location = request->mutable_device_location(); | |
| 503 if (!location_helper_) { | |
| 504 location->set_error_code( | |
| 505 em::DeviceLocation::ERROR_CODE_POSITION_UNAVAILABLE); | |
| 506 } else { | |
| 507 const Geoposition& position = location_helper_->GetPosition(); | |
| 508 if (!position.IsValidFix()) { | |
| 509 location->set_error_code( | |
| 510 em::DeviceLocation::ERROR_CODE_POSITION_UNAVAILABLE); | |
| 511 location->set_error_message(position.error_message); | |
| 512 } else { | |
| 513 location->set_latitude(position.latitude); | |
| 514 location->set_longitude(position.longitude); | |
| 515 location->set_accuracy(position.accuracy); | |
| 516 location->set_timestamp( | |
| 517 (position.timestamp - Time::UnixEpoch()).InMilliseconds()); | |
| 518 if (position.is_valid_altitude()) | |
| 519 location->set_altitude(position.altitude); | |
| 520 if (position.is_valid_altitude_accuracy()) | |
| 521 location->set_altitude_accuracy(position.altitude_accuracy); | |
| 522 if (position.is_valid_heading()) | |
| 523 location->set_heading(position.heading); | |
| 524 if (position.is_valid_speed()) | |
| 525 location->set_speed(position.speed); | |
| 526 location->set_error_code(em::DeviceLocation::ERROR_CODE_NONE); | |
| 527 } | |
| 528 } | |
| 529 } | |
| 530 | |
| 261 void DeviceStatusCollector::GetStatus(em::DeviceStatusReportRequest* request) { | 531 void DeviceStatusCollector::GetStatus(em::DeviceStatusReportRequest* request) { |
| 262 if (report_activity_times_) | 532 if (report_activity_times_) |
| 263 GetActivityTimes(request); | 533 GetActivityTimes(request); |
| 264 | 534 |
| 265 if (report_version_info_) | 535 if (report_version_info_) |
| 266 GetVersionInfo(request); | 536 GetVersionInfo(request); |
| 267 | 537 |
| 268 if (report_boot_mode_) | 538 if (report_boot_mode_) |
| 269 GetBootMode(request); | 539 GetBootMode(request); |
| 540 | |
| 541 if (report_location_) | |
| 542 GetLocation(request); | |
| 270 } | 543 } |
| 271 | 544 |
| 272 void DeviceStatusCollector::OnOSVersion(VersionLoader::Handle handle, | 545 void DeviceStatusCollector::OnOSVersion(VersionLoader::Handle handle, |
| 273 std::string version) { | 546 std::string version) { |
| 274 os_version_ = version; | 547 os_version_ = version; |
| 275 } | 548 } |
| 276 | 549 |
| 277 void DeviceStatusCollector::OnOSFirmware(VersionLoader::Handle handle, | 550 void DeviceStatusCollector::OnOSFirmware(VersionLoader::Handle handle, |
| 278 std::string version) { | 551 std::string version) { |
| 279 firmware_version_ = version; | 552 firmware_version_ = version; |
| 280 } | 553 } |
| 281 | 554 |
| 282 void DeviceStatusCollector::Observe( | 555 void DeviceStatusCollector::Observe( |
| 283 int type, | 556 int type, |
| 284 const content::NotificationSource& source, | 557 const content::NotificationSource& source, |
| 285 const content::NotificationDetails& details) { | 558 const content::NotificationDetails& details) { |
| 286 if (type == chrome::NOTIFICATION_SYSTEM_SETTING_CHANGED) | 559 if (type == chrome::NOTIFICATION_SYSTEM_SETTING_CHANGED) |
| 287 UpdateReportingSettings(); | 560 UpdateReportingSettings(); |
| 288 else | 561 else |
| 289 NOTREACHED(); | 562 NOTREACHED(); |
| 290 } | 563 } |
| 291 | 564 |
| 292 } // namespace policy | 565 } // namespace policy |
| OLD | NEW |