Index: chrome/browser/policy/device_status_collector.cc |
diff --git a/chrome/browser/policy/device_status_collector.cc b/chrome/browser/policy/device_status_collector.cc |
index 3d82084c4e62ab1de5651146cb0b643bf5396426..f4fb74699fba2af87ca9fddd0c36869eb8fc8178 100644 |
--- a/chrome/browser/policy/device_status_collector.cc |
+++ b/chrome/browser/policy/device_status_collector.cc |
@@ -7,10 +7,13 @@ |
#include "base/bind.h" |
#include "base/callback.h" |
#include "base/string_number_conversions.h" |
+#include "chrome/browser/chromeos/cros_settings.h" |
+#include "chrome/browser/chromeos/cros_settings_names.h" |
#include "chrome/browser/chromeos/system/statistics_provider.h" |
#include "chrome/browser/policy/proto/device_management_backend.pb.h" |
#include "chrome/browser/prefs/pref_service.h" |
#include "chrome/browser/prefs/scoped_user_pref_update.h" |
+#include "chrome/common/chrome_notification_types.h" |
#include "chrome/common/chrome_version_info.h" |
using base::Time; |
@@ -26,9 +29,6 @@ const unsigned int kIdleStateThresholdSeconds = 300; |
// The maximum number of time periods stored in the local state. |
const unsigned int kMaxStoredActivePeriods = 500; |
-// Stores the baseline timestamp, to which the active periods are relative. |
-const char* const kPrefBaselineTime = "device_status.baseline_timestamp"; |
- |
// Stores a list of timestamps representing device active periods. |
const char* const kPrefDeviceActivePeriods = "device_status.active_periods"; |
@@ -50,12 +50,27 @@ DeviceStatusCollector::DeviceStatusCollector( |
local_state_(local_state), |
last_idle_check_(Time()), |
last_idle_state_(IDLE_STATE_UNKNOWN), |
- statistics_provider_(provider) { |
+ statistics_provider_(provider), |
+ report_version_info_(false), |
+ report_activity_times_(false), |
+ report_boot_mode_(false) { |
timer_.Start(FROM_HERE, |
TimeDelta::FromSeconds( |
DeviceStatusCollector::kPollIntervalSeconds), |
this, &DeviceStatusCollector::CheckIdleState); |
+ cros_settings_ = chromeos::CrosSettings::Get(); |
+ |
+ // Watch for changes to the individual policies that control what the status |
+ // reports contain. |
+ cros_settings_->AddSettingsObserver(chromeos::kReportDeviceVersionInfo, this); |
+ cros_settings_->AddSettingsObserver(chromeos::kReportDeviceActivityTimes, |
+ this); |
+ cros_settings_->AddSettingsObserver(chromeos::kReportDeviceBootMode, this); |
+ |
+ // Fetch the current values of the policies. |
+ UpdateReportingSettings(); |
+ |
// Get the the OS and firmware version info. |
version_loader_.GetVersion(&consumer_, |
base::Bind(&DeviceStatusCollector::OnOSVersion, |
@@ -67,11 +82,15 @@ DeviceStatusCollector::DeviceStatusCollector( |
} |
DeviceStatusCollector::~DeviceStatusCollector() { |
+ cros_settings_->RemoveSettingsObserver(chromeos::kReportDeviceVersionInfo, |
+ this); |
+ cros_settings_->RemoveSettingsObserver(chromeos::kReportDeviceActivityTimes, |
+ this); |
+ cros_settings_->RemoveSettingsObserver(chromeos::kReportDeviceBootMode, this); |
} |
// static |
void DeviceStatusCollector::RegisterPrefs(PrefService* local_state) { |
- local_state->RegisterInt64Pref(kPrefBaselineTime, Time::Now().ToTimeT()); |
local_state->RegisterListPref(kPrefDeviceActivePeriods, new ListValue); |
} |
@@ -81,6 +100,24 @@ void DeviceStatusCollector::CheckIdleState() { |
base::Unretained(this))); |
} |
+void DeviceStatusCollector::UpdateReportingSettings() { |
+ // Attempt to fetch the current value of the reporting settings. |
+ // If trusted values are not available, register this function to be called |
+ // back when they are available. |
+ bool is_trusted = cros_settings_->GetTrusted( |
+ chromeos::kReportDeviceVersionInfo, |
+ base::Bind(&DeviceStatusCollector::UpdateReportingSettings, |
+ base::Unretained(this))); |
+ if (is_trusted) { |
+ cros_settings_->GetBoolean( |
+ chromeos::kReportDeviceVersionInfo, &report_version_info_); |
+ cros_settings_->GetBoolean( |
+ chromeos::kReportDeviceActivityTimes, &report_activity_times_); |
+ cros_settings_->GetBoolean( |
+ chromeos::kReportDeviceBootMode, &report_boot_mode_); |
+ } |
+} |
+ |
Time DeviceStatusCollector::GetCurrentTime() { |
return Time::Now(); |
} |
@@ -118,6 +155,10 @@ void DeviceStatusCollector::AddActivePeriod(Time start, Time end) { |
} |
void DeviceStatusCollector::IdleStateCallback(IdleState state) { |
+ // Do nothing if device activity reporting is disabled. |
+ if (!report_activity_times_) |
+ return; |
+ |
Time now = GetCurrentTime(); |
if (state == IDLE_STATE_ACTIVE) { |
@@ -134,8 +175,8 @@ void DeviceStatusCollector::IdleStateCallback(IdleState state) { |
last_idle_state_ = state; |
} |
-void DeviceStatusCollector::GetStatus(em::DeviceStatusReportRequest* request) { |
- // Report device active periods. |
+void DeviceStatusCollector::GetActivityTimes( |
+ em::DeviceStatusReportRequest* request) { |
const ListValue* active_periods = |
local_state_->GetList(kPrefDeviceActivePeriods); |
em::TimePeriod* time_period; |
@@ -159,13 +200,18 @@ void DeviceStatusCollector::GetStatus(em::DeviceStatusReportRequest* request) { |
} |
ListPrefUpdate update(local_state_, kPrefDeviceActivePeriods); |
update.Get()->Clear(); |
+} |
+void DeviceStatusCollector::GetVersionInfo( |
+ em::DeviceStatusReportRequest* request) { |
chrome::VersionInfo version_info; |
request->set_browser_version(version_info.Version()); |
request->set_os_version(os_version_); |
request->set_firmware_version(firmware_version_); |
+} |
- // Report the state of the dev switch at boot. |
+void DeviceStatusCollector::GetBootMode( |
+ em::DeviceStatusReportRequest* request) { |
std::string dev_switch_mode; |
if (statistics_provider_->GetMachineStatistic( |
"devsw_boot", &dev_switch_mode)) { |
@@ -176,6 +222,17 @@ void DeviceStatusCollector::GetStatus(em::DeviceStatusReportRequest* request) { |
} |
} |
+void DeviceStatusCollector::GetStatus(em::DeviceStatusReportRequest* request) { |
+ if (report_activity_times_) |
+ GetActivityTimes(request); |
+ |
+ if (report_version_info_) |
+ GetVersionInfo(request); |
+ |
+ if (report_boot_mode_) |
+ GetBootMode(request); |
+} |
+ |
void DeviceStatusCollector::OnOSVersion(VersionLoader::Handle handle, |
std::string version) { |
os_version_ = version; |
@@ -186,4 +243,14 @@ void DeviceStatusCollector::OnOSFirmware(VersionLoader::Handle handle, |
firmware_version_ = version; |
} |
+void DeviceStatusCollector::Observe( |
+ int type, |
+ const content::NotificationSource& source, |
+ const content::NotificationDetails& details) { |
+ if (type == chrome::NOTIFICATION_SYSTEM_SETTING_CHANGED) |
+ UpdateReportingSettings(); |
+ else |
+ NOTREACHED(); |
+} |
+ |
} // namespace policy |