// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_METRICS_DEMOGRAPHIC_METRICS_PROVIDER_H_ #define COMPONENTS_METRICS_DEMOGRAPHIC_METRICS_PROVIDER_H_ #include #include "base/time/time.h" #include "components/metrics/metrics_log_uploader.h" #include "components/metrics/metrics_provider.h" #include "components/metrics/ukm_demographic_metrics_provider.h" #include "components/sync/base/user_demographics.h" #include "components/sync/driver/sync_service.h" #include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h" #include "third_party/metrics_proto/user_demographics.pb.h" namespace base { struct Feature; } namespace metrics { // Provider of the synced user’s noised birth year and gender to the UMA metrics // server. The synced user's birth year and gender were provided to Google when // the user created their Google account, to use in accordance with Google's // privacy policy. The provided birth year and gender are used in aggregate and // anonymized form to measure usage of Chrome features by age groups and gender // - helping Chrome ensure features are useful to a wide range of users. Users // can avoid aggregation of usage data by birth year and gender by either a) // turning off sending usage statistics to Google or b) turning off sync. class DemographicMetricsProvider : public MetricsProvider, public UkmDemographicMetricsProvider { public: // Interface that represents the client that retrieves Profile information. class ProfileClient { public: virtual ~ProfileClient() = default; // Gets the total number of profiles that are on disk (loaded + not loaded) // for the browser. virtual int GetNumberOfProfilesOnDisk() = 0; // Gets a weak pointer to the ProfileSyncService of the Profile. virtual syncer::SyncService* GetSyncService() = 0; // Gets the network time that represents now. virtual base::Time GetNetworkTime() const = 0; }; DemographicMetricsProvider( std::unique_ptr profile_client, MetricsLogUploader::MetricServiceType metrics_service_type); ~DemographicMetricsProvider() override; // Provides the synced user's noised birth year and gender to a metrics report // of type ReportType. This function is templated to support any type of proto // metrics report, e.g., ukm::Report and metrics::ChromeUserMetricsExtension. // The ReportType should be a proto message class that has a // metrics::UserDemographicsProto message field. template void ProvideSyncedUserNoisedBirthYearAndGender(ReportType* report) { DCHECK(report); base::Optional user_demographics = ProvideSyncedUserNoisedBirthYearAndGender(); if (user_demographics.has_value()) { report->mutable_user_demographics()->set_birth_year( user_demographics.value().birth_year); report->mutable_user_demographics()->set_gender( user_demographics.value().gender); } } // MetricsProvider: void ProvideCurrentSessionData( ChromeUserMetricsExtension* uma_proto) override; // UkmDemographicMetricsProvider: void ProvideSyncedUserNoisedBirthYearAndGenderToReport( ukm::Report* report) override; // Feature switch to report user's noised birth year and gender. static const base::Feature kDemographicMetricsReporting; protected: // Provides the synced user's noised birth year and gender. Virtual for // testing. virtual base::Optional ProvideSyncedUserNoisedBirthYearAndGender(); private: void LogUserDemographicsStatusInHistogram( syncer::UserDemographicsStatus status); std::unique_ptr profile_client_; // The type of the metrics service for which to emit the user demographics // status histogram (e.g., UMA). const MetricsLogUploader::MetricServiceType metrics_service_type_; DISALLOW_COPY_AND_ASSIGN(DemographicMetricsProvider); }; } // namespace metrics #endif // COMPONENTS_METRICS_DEMOGRAPHIC_METRICS_PROVIDER_H_