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