blob: 126080d9af9f802275b1946b1921c9f78195f986 [file] [log] [blame]
Vincent Boisselle275215f2019-06-27 19:33:511// Copyright 2019 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 "components/metrics/demographic_metrics_provider.h"
Vincent Boisselle743efdb2019-07-13 16:59:036
Vincent Boisselle275215f2019-06-27 19:33:517#include "base/feature_list.h"
Vincent Boissellef2acc1a2019-10-18 01:43:518#include "base/metrics/histogram_functions.h"
Vincent Boisselle30da39772019-07-24 18:55:479#include "base/optional.h"
Vincent Boisselle30da39772019-07-24 18:55:4710#include "components/sync/base/sync_prefs.h"
Vincent Boisselle30da39772019-07-24 18:55:4711#include "components/sync/driver/sync_service.h"
Vincent Boissellef2acc1a2019-10-18 01:43:5112#include "third_party/metrics_proto/ukm/report.pb.h"
Vincent Boisselle275215f2019-06-27 19:33:5113
14namespace metrics {
15
Vincent Boisselle30da39772019-07-24 18:55:4716// static
17const base::Feature DemographicMetricsProvider::kDemographicMetricsReporting = {
Caitlin Fischer53c61a4e2020-04-17 19:18:3118 "DemographicMetricsReporting", base::FEATURE_ENABLED_BY_DEFAULT};
Vincent Boisselle743efdb2019-07-13 16:59:0319
20DemographicMetricsProvider::DemographicMetricsProvider(
Vincent Boissellef2acc1a2019-10-18 01:43:5121 std::unique_ptr<ProfileClient> profile_client,
22 MetricsLogUploader::MetricServiceType metrics_service_type)
23 : profile_client_(std::move(profile_client)),
24 metrics_service_type_(metrics_service_type) {
Vincent Boisselle30da39772019-07-24 18:55:4725 DCHECK(profile_client_);
Vincent Boisselle743efdb2019-07-13 16:59:0326}
27
Vincent Boisselle30da39772019-07-24 18:55:4728DemographicMetricsProvider::~DemographicMetricsProvider() {}
29
Vincent Boissellef2acc1a2019-10-18 01:43:5130base::Optional<syncer::UserDemographics>
31DemographicMetricsProvider::ProvideSyncedUserNoisedBirthYearAndGender() {
Vincent Boisselle743efdb2019-07-13 16:59:0332 // Skip if feature disabled.
33 if (!base::FeatureList::IsEnabled(kDemographicMetricsReporting))
Vincent Boissellef2acc1a2019-10-18 01:43:5134 return base::nullopt;
Vincent Boisselle743efdb2019-07-13 16:59:0335
Vincent Boisselle30da39772019-07-24 18:55:4736 // Skip if not exactly one Profile on disk. Having more than one Profile that
37 // is using the browser can make demographics less relevant. This approach
38 // cannot determine if there is more than 1 distinct user using the Profile.
Vincent Boisselle7577df02019-08-01 19:07:0439 if (profile_client_->GetNumberOfProfilesOnDisk() != 1) {
Vincent Boissellef2acc1a2019-10-18 01:43:5140 LogUserDemographicsStatusInHistogram(
Vincent Boisselle7577df02019-08-01 19:07:0441 syncer::UserDemographicsStatus::kMoreThanOneProfile);
Vincent Boissellef2acc1a2019-10-18 01:43:5142 return base::nullopt;
Vincent Boisselle7577df02019-08-01 19:07:0443 }
Vincent Boisselle743efdb2019-07-13 16:59:0344
Vincent Boisselle30da39772019-07-24 18:55:4745 syncer::SyncService* sync_service = profile_client_->GetSyncService();
46 // Skip if no sync service.
Vincent Boisselle7577df02019-08-01 19:07:0447 if (!sync_service) {
Vincent Boissellef2acc1a2019-10-18 01:43:5148 LogUserDemographicsStatusInHistogram(
Vincent Boisselle7577df02019-08-01 19:07:0449 syncer::UserDemographicsStatus::kNoSyncService);
Vincent Boissellef2acc1a2019-10-18 01:43:5150 return base::nullopt;
Vincent Boisselle7577df02019-08-01 19:07:0451 }
Vincent Boisselle30da39772019-07-24 18:55:4752
Vincent Boisselle7577df02019-08-01 19:07:0453 syncer::UserDemographicsResult demographics_result =
Vincent Boisselle892e9b7e2019-08-21 17:27:3254 sync_service->GetUserNoisedBirthYearAndGender(
55 profile_client_->GetNetworkTime());
Vincent Boissellef2acc1a2019-10-18 01:43:5156 LogUserDemographicsStatusInHistogram(demographics_result.status());
57
58 if (demographics_result.IsSuccess())
59 return demographics_result.value();
60
61 return base::nullopt;
62}
63
64void DemographicMetricsProvider::ProvideCurrentSessionData(
65 ChromeUserMetricsExtension* uma_proto) {
66 ProvideSyncedUserNoisedBirthYearAndGender(uma_proto);
67}
68
69void DemographicMetricsProvider::
70 ProvideSyncedUserNoisedBirthYearAndGenderToReport(ukm::Report* report) {
71 ProvideSyncedUserNoisedBirthYearAndGender(report);
72}
73
74void DemographicMetricsProvider::LogUserDemographicsStatusInHistogram(
75 syncer::UserDemographicsStatus status) {
76 switch (metrics_service_type_) {
77 case MetricsLogUploader::MetricServiceType::UMA:
78 base::UmaHistogramEnumeration("UMA.UserDemographics.Status", status);
79 return;
80 case MetricsLogUploader::MetricServiceType::UKM:
81 base::UmaHistogramEnumeration("UKM.UserDemographics.Status", status);
82 return;
Vincent Boisselle30da39772019-07-24 18:55:4783 }
Vincent Boissellef2acc1a2019-10-18 01:43:5184 NOTREACHED();
Vincent Boisselle30da39772019-07-24 18:55:4785}
Vincent Boisselle275215f2019-06-27 19:33:5186
87} // namespace metrics