1 // Copyright 2018 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/child_accounts/child_status_reporting_service.h"
6 
7 #include "base/bind.h"
8 #include "base/logging.h"
9 #include "base/threading/thread_task_runner_handle.h"
10 #include "chrome/browser/chromeos/child_accounts/event_based_status_reporting_service_factory.h"
11 #include "chrome/browser/chromeos/child_accounts/usage_time_limit_processor.h"
12 #include "chrome/browser/chromeos/policy/status_collector/child_status_collector.h"
13 #include "chrome/browser/chromeos/policy/status_uploader.h"
14 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
15 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/common/chrome_features.h"
17 #include "chrome/common/pref_names.h"
18 #include "chromeos/system/statistics_provider.h"
19 #include "components/policy/core/common/cloud/cloud_policy_client.h"
20 #include "components/policy/core/common/cloud/cloud_policy_core.h"
21 #include "components/prefs/pref_change_registrar.h"
22 #include "components/prefs/pref_service.h"
23 #include "content/public/browser/browser_context.h"
24 
25 namespace chromeos {
26 
27 namespace {
28 
29 // Default frequency for uploading status reports.
30 constexpr base::TimeDelta kStatusUploadFrequency =
31     base::TimeDelta::FromMinutes(10);
32 
33 }  // namespace
34 
ChildStatusReportingService(content::BrowserContext * context)35 ChildStatusReportingService::ChildStatusReportingService(
36     content::BrowserContext* context)
37     : context_(context) {
38   Profile* profile = Profile::FromBrowserContext(context_);
39   // If child user is registered with DMServer and has User Policy applied, it
40   // should upload device status to the server.
41   user_cloud_policy_manager_ = profile->GetUserCloudPolicyManagerChromeOS();
42   if (!user_cloud_policy_manager_) {
43     LOG(WARNING) << "Child user is not managed by User Policy - status reports "
44                     "cannot be uploaded to the server. ";
45     return;
46   }
47 
48   PrefService* pref_service = profile->GetPrefs();
49   DCHECK(pref_service->GetInitializationStatus() !=
50          PrefService::INITIALIZATION_STATUS_WAITING);
51 
52   // We immediately upload a status report after Time Limits policy changes.
53   // Make sure we listen for those events.
54   pref_change_registrar_ = std::make_unique<PrefChangeRegistrar>();
55   pref_change_registrar_->Init(pref_service);
56   pref_change_registrar_->Add(
57       prefs::kUsageTimeLimit,
58       base::BindRepeating(
59           &ChildStatusReportingService::OnTimeLimitsPolicyChanged,
60           base::Unretained(this)));
61 
62   CreateStatusUploaderIfNeeded(user_cloud_policy_manager_->core()->client());
63 
64   if (base::FeatureList::IsEnabled(features::kEventBasedStatusReporting)) {
65     EventBasedStatusReportingServiceFactory::GetForBrowserContext(context);
66   }
67 }
68 
69 ChildStatusReportingService::~ChildStatusReportingService() = default;
70 
CreateStatusUploaderIfNeeded(policy::CloudPolicyClient * client)71 void ChildStatusReportingService::CreateStatusUploaderIfNeeded(
72     policy::CloudPolicyClient* client) {
73   const base::DictionaryValue* time_limit =
74       pref_change_registrar_->prefs()->GetDictionary(prefs::kUsageTimeLimit);
75   const base::TimeDelta new_day_reset_time =
76       usage_time_limit::GetTimeUsageLimitResetTime(*time_limit);
77 
78   // Day reset time did not change, there is no need to re-create StatusUploader
79   // if it already exists.
80   if (status_uploader_ && (day_reset_time_ == new_day_reset_time))
81     return;
82 
83   VLOG(1) << "Creating status uploader for child status reporting.";
84   day_reset_time_ = new_day_reset_time;
85   status_uploader_ = std::make_unique<policy::StatusUploader>(
86       client,
87       std::make_unique<policy::ChildStatusCollector>(
88           pref_change_registrar_->prefs(),
89           Profile::FromBrowserContext(context_),
90           system::StatisticsProvider::GetInstance(),
91           policy::ChildStatusCollector::AndroidStatusFetcher(),
92           day_reset_time_),
93       base::ThreadTaskRunnerHandle::Get(), kStatusUploadFrequency);
94 }
95 
RequestImmediateStatusReport()96 bool ChildStatusReportingService::RequestImmediateStatusReport() {
97   return status_uploader_->ScheduleNextStatusUploadImmediately();
98 }
99 
GetChildScreenTime() const100 base::TimeDelta ChildStatusReportingService::GetChildScreenTime() const {
101   // Notice that this cast works because we know that |status_uploader_| has a
102   // ChildStatusCollector (see above).
103   return static_cast<policy::ChildStatusCollector*>(
104              status_uploader_->status_collector())
105       ->GetActiveChildScreenTime();
106 }
107 
OnTimeLimitsPolicyChanged()108 void ChildStatusReportingService::OnTimeLimitsPolicyChanged() {
109   CreateStatusUploaderIfNeeded(user_cloud_policy_manager_->core()->client());
110 }
111 
112 }  // namespace chromeos
113