| Index: components/metrics_services_manager/metrics_services_manager.cc
|
| diff --git a/components/metrics_services_manager/metrics_services_manager.cc b/components/metrics_services_manager/metrics_services_manager.cc
|
| index e1ec65096b3e21b946d8fdb24bb489d1c3b6fc71..7b87f884a91557cc8324d8fd549feb9aa10960ed 100644
|
| --- a/components/metrics_services_manager/metrics_services_manager.cc
|
| +++ b/components/metrics_services_manager/metrics_services_manager.cc
|
| @@ -68,27 +68,40 @@ void MetricsServicesManager::OnRendererProcessCrash() {
|
| metrics::MetricsServiceClient*
|
| MetricsServicesManager::GetMetricsServiceClient() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| - if (!metrics_service_client_)
|
| + if (!metrics_service_client_) {
|
| metrics_service_client_ = client_->CreateMetricsServiceClient();
|
| + // base::Unretained is safe since |this| owns the metrics_service_client_.
|
| + metrics_service_client_->SetUpdateRunningServicesCallback(
|
| + base::Bind(&MetricsServicesManager::UpdateRunningServices,
|
| + base::Unretained(this)));
|
| + }
|
| return metrics_service_client_.get();
|
| }
|
|
|
| -void MetricsServicesManager::UpdatePermissions(bool may_record,
|
| - bool may_upload) {
|
| +void MetricsServicesManager::UpdatePermissions(bool current_may_record,
|
| + bool current_may_upload) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| + // If the user has opted out of metrics, delete local UKM state.
|
| + if (may_record_ && !current_may_record) {
|
| + ukm::UkmService* ukm = GetUkmService();
|
| + if (ukm) {
|
| + ukm->Purge();
|
| + ukm->ResetClientId();
|
| + }
|
| + }
|
| +
|
| // Stash the current permissions so that we can update the RapporServiceImpl
|
| // correctly when the Rappor preference changes. The metrics recording
|
| // preference partially determines the initial rappor setting, and also
|
| // controls whether FINE metrics are sent.
|
| - may_record_ = may_record;
|
| - may_upload_ = may_upload;
|
| + may_record_ = current_may_record;
|
| + may_upload_ = current_may_upload;
|
| UpdateRunningServices();
|
| }
|
|
|
| void MetricsServicesManager::UpdateRunningServices() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| metrics::MetricsService* metrics = GetMetricsService();
|
| - ukm::UkmService* ukm = GetUkmService();
|
|
|
| if (client_->OnlyDoMetricsRecording()) {
|
| metrics->StartRecordingForTests();
|
| @@ -102,23 +115,16 @@ void MetricsServicesManager::UpdateRunningServices() {
|
| if (may_record_) {
|
| if (!metrics->recording_active())
|
| metrics->Start();
|
| -
|
| - if (may_upload_) {
|
| + if (may_upload_)
|
| metrics->EnableReporting();
|
| -#if !defined(OFFICIAL_BUILD)
|
| - // TODO(holte): Make UKM check sync state instead of official build.
|
| - if (ukm)
|
| - ukm->EnableReporting();
|
| -#endif
|
| - } else {
|
| + else
|
| metrics->DisableReporting();
|
| - if (ukm)
|
| - ukm->DisableReporting();
|
| - }
|
| } else {
|
| metrics->Stop();
|
| }
|
|
|
| + UpdateUkmService();
|
| +
|
| int recording_groups = 0;
|
| #if defined(GOOGLE_CHROME_BUILD)
|
| if (may_record_)
|
| @@ -137,6 +143,24 @@ void MetricsServicesManager::UpdateRunningServices() {
|
| GetRapporServiceImpl()->Update(recording_groups, may_upload_);
|
| }
|
|
|
| +void MetricsServicesManager::UpdateUkmService() {
|
| + ukm::UkmService* ukm = GetUkmService();
|
| + if (!ukm)
|
| + return;
|
| + bool sync_enabled =
|
| + metrics_service_client_->IsHistorySyncEnabledOnAllProfiles();
|
| + if (may_record_ && sync_enabled) {
|
| + ukm->EnableRecording();
|
| + if (may_upload_)
|
| + ukm->EnableReporting();
|
| + else
|
| + ukm->DisableReporting();
|
| + } else {
|
| + ukm->DisableRecording();
|
| + ukm->DisableReporting();
|
| + }
|
| +}
|
| +
|
| void MetricsServicesManager::UpdateUploadPermissions(bool may_upload) {
|
| UpdatePermissions(client_->IsMetricsReportingEnabled(), may_upload);
|
| }
|
|
|