| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef CHROME_BROWSER_POLICY_DEVICE_STATUS_COLLECTOR_H_ | |
| 6 #define CHROME_BROWSER_POLICY_DEVICE_STATUS_COLLECTOR_H_ | |
| 7 | |
| 8 #include <string> | |
| 9 | |
| 10 #include "base/basictypes.h" | |
| 11 #include "base/compiler_specific.h" | |
| 12 #include "base/memory/weak_ptr.h" | |
| 13 #include "base/time.h" | |
| 14 #include "base/timer.h" | |
| 15 #include "chrome/browser/chromeos/version_loader.h" | |
| 16 #include "chrome/browser/idle.h" | |
| 17 #include "chrome/browser/policy/cloud_policy_client.h" | |
| 18 #include "chrome/common/cancelable_task_tracker.h" | |
| 19 #include "content/public/browser/geolocation.h" | |
| 20 #include "content/public/browser/notification_observer.h" | |
| 21 #include "content/public/common/geoposition.h" | |
| 22 | |
| 23 namespace chromeos { | |
| 24 class CrosSettings; | |
| 25 namespace system { | |
| 26 class StatisticsProvider; | |
| 27 } | |
| 28 } | |
| 29 | |
| 30 namespace content { | |
| 31 class NotificationDetails; | |
| 32 class NotificationSource; | |
| 33 } | |
| 34 | |
| 35 namespace enterprise_management { | |
| 36 class DeviceStatusReportRequest; | |
| 37 } | |
| 38 | |
| 39 class PrefService; | |
| 40 class PrefServiceSimple; | |
| 41 | |
| 42 namespace policy { | |
| 43 | |
| 44 // Collects and summarizes the status of an enterprised-managed ChromeOS device. | |
| 45 class DeviceStatusCollector : public CloudPolicyClient::StatusProvider, | |
| 46 public content::NotificationObserver { | |
| 47 public: | |
| 48 // TODO(bartfab): Remove this once crbug.com/125931 is addressed and a proper | |
| 49 // way to mock geolocation exists. | |
| 50 typedef void(*LocationUpdateRequester)( | |
| 51 const content::GeolocationUpdateCallback& callback); | |
| 52 | |
| 53 DeviceStatusCollector(PrefService* local_state, | |
| 54 chromeos::system::StatisticsProvider* provider, | |
| 55 LocationUpdateRequester location_update_requester); | |
| 56 virtual ~DeviceStatusCollector(); | |
| 57 | |
| 58 void GetStatus(enterprise_management::DeviceStatusReportRequest* request); | |
| 59 | |
| 60 // CloudPolicyClient::StatusProvider: | |
| 61 virtual bool GetDeviceStatus( | |
| 62 enterprise_management::DeviceStatusReportRequest* status) OVERRIDE; | |
| 63 virtual bool GetSessionStatus( | |
| 64 enterprise_management::SessionStatusReportRequest* status) OVERRIDE; | |
| 65 virtual void OnSubmittedSuccessfully() OVERRIDE; | |
| 66 | |
| 67 static void RegisterPrefs(PrefServiceSimple* local_state); | |
| 68 | |
| 69 // How often, in seconds, to poll to see if the user is idle. | |
| 70 static const unsigned int kIdlePollIntervalSeconds = 30; | |
| 71 | |
| 72 protected: | |
| 73 // Check whether the user has been idle for a certain period of time. | |
| 74 virtual void CheckIdleState(); | |
| 75 | |
| 76 // Used instead of base::Time::Now(), to make testing possible. | |
| 77 virtual base::Time GetCurrentTime(); | |
| 78 | |
| 79 // Callback which receives the results of the idle state check. | |
| 80 void IdleStateCallback(IdleState state); | |
| 81 | |
| 82 // The number of days in the past to store device activity. | |
| 83 // This is kept in case device status uploads fail for a number of days. | |
| 84 unsigned int max_stored_past_activity_days_; | |
| 85 | |
| 86 // The number of days in the future to store device activity. | |
| 87 // When changing the system time and/or timezones, it's possible to record | |
| 88 // activity time that is slightly in the future. | |
| 89 unsigned int max_stored_future_activity_days_; | |
| 90 | |
| 91 private: | |
| 92 // Prevents the local store of activity periods from growing too large by | |
| 93 // removing entries that are outside the reporting window. | |
| 94 void PruneStoredActivityPeriods(base::Time base_time); | |
| 95 | |
| 96 // Trims the store activity periods to only retain data within the | |
| 97 // [|min_day_key|, |max_day_key|). The record for |min_day_key| will be | |
| 98 // adjusted by subtracting |min_day_trim_duration|. | |
| 99 void TrimStoredActivityPeriods(int64 min_day_key, | |
| 100 int min_day_trim_duration, | |
| 101 int64 max_day_key); | |
| 102 | |
| 103 void AddActivePeriod(base::Time start, base::Time end); | |
| 104 | |
| 105 // Callbacks from chromeos::VersionLoader. | |
| 106 void OnOSVersion(const std::string& version); | |
| 107 void OnOSFirmware(const std::string& version); | |
| 108 | |
| 109 // Helpers for the various portions of the status. | |
| 110 void GetActivityTimes( | |
| 111 enterprise_management::DeviceStatusReportRequest* request); | |
| 112 void GetVersionInfo( | |
| 113 enterprise_management::DeviceStatusReportRequest* request); | |
| 114 void GetBootMode( | |
| 115 enterprise_management::DeviceStatusReportRequest* request); | |
| 116 void GetLocation( | |
| 117 enterprise_management::DeviceStatusReportRequest* request); | |
| 118 | |
| 119 // Update the cached values of the reporting settings. | |
| 120 void UpdateReportingSettings(); | |
| 121 | |
| 122 // content::NotificationObserver interface. | |
| 123 virtual void Observe( | |
| 124 int type, | |
| 125 const content::NotificationSource& source, | |
| 126 const content::NotificationDetails& details) OVERRIDE; | |
| 127 | |
| 128 void ScheduleGeolocationUpdateRequest(); | |
| 129 | |
| 130 // content::GeolocationUpdateCallback implementation. | |
| 131 void ReceiveGeolocationUpdate(const content::Geoposition&); | |
| 132 | |
| 133 // How often to poll to see if the user is idle. | |
| 134 int poll_interval_seconds_; | |
| 135 | |
| 136 PrefService* local_state_; | |
| 137 | |
| 138 // The last time an idle state check was performed. | |
| 139 base::Time last_idle_check_; | |
| 140 | |
| 141 // The maximum key that went into the last report generated by | |
| 142 // GetDeviceStatus(), and the duration for it. This is used to trim the | |
| 143 // stored data in OnSubmittedSuccessfully(). Trimming is delayed so | |
| 144 // unsuccessful uploads don't result in dropped data. | |
| 145 int64 last_reported_day_; | |
| 146 int duration_for_last_reported_day_; | |
| 147 | |
| 148 // Whether a geolocation update is currently in progress. | |
| 149 bool geolocation_update_in_progress_; | |
| 150 | |
| 151 base::RepeatingTimer<DeviceStatusCollector> idle_poll_timer_; | |
| 152 base::OneShotTimer<DeviceStatusCollector> geolocation_update_timer_; | |
| 153 | |
| 154 chromeos::VersionLoader version_loader_; | |
| 155 CancelableTaskTracker tracker_; | |
| 156 | |
| 157 std::string os_version_; | |
| 158 std::string firmware_version_; | |
| 159 | |
| 160 content::Geoposition position_; | |
| 161 | |
| 162 chromeos::system::StatisticsProvider* statistics_provider_; | |
| 163 | |
| 164 chromeos::CrosSettings* cros_settings_; | |
| 165 | |
| 166 base::WeakPtrFactory<DeviceStatusCollector> weak_factory_; | |
| 167 | |
| 168 // TODO(bartfab): Remove this once crbug.com/125931 is addressed and a proper | |
| 169 // way to mock geolocation exists. | |
| 170 LocationUpdateRequester location_update_requester_; | |
| 171 | |
| 172 // Cached values of the reporting settings from the device policy. | |
| 173 bool report_version_info_; | |
| 174 bool report_activity_times_; | |
| 175 bool report_boot_mode_; | |
| 176 bool report_location_; | |
| 177 | |
| 178 DISALLOW_COPY_AND_ASSIGN(DeviceStatusCollector); | |
| 179 }; | |
| 180 | |
| 181 } // namespace policy | |
| 182 | |
| 183 #endif // CHROME_BROWSER_POLICY_DEVICE_STATUS_COLLECTOR_H_ | |
| OLD | NEW |