1// Copyright (c) 2012 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/metrics/metrics_reporting_state.h" 6 7#include "base/callback.h" 8#include "base/metrics/histogram.h" 9#include "base/prefs/pref_service.h" 10#include "chrome/browser/browser_process.h" 11#include "chrome/browser/metrics/chrome_metrics_service_accessor.h" 12#include "chrome/common/pref_names.h" 13#include "chrome/installer/util/google_update_settings.h" 14#include "components/metrics/metrics_service.h" 15#include "content/public/browser/browser_thread.h" 16 17namespace { 18 19enum MetricsReportingChangeHistogramValue { 20 METRICS_REPORTING_ERROR, 21 METRICS_REPORTING_DISABLED, 22 METRICS_REPORTING_ENABLED, 23 METRICS_REPORTING_MAX 24}; 25 26void RecordMetricsReportingHistogramValue( 27 MetricsReportingChangeHistogramValue value) { 28 UMA_HISTOGRAM_ENUMERATION( 29 "UMA.MetricsReporting.Toggle", value, METRICS_REPORTING_MAX); 30} 31 32// Tries to set metrics reporting status to |enabled| and returns whatever is 33// the result of the update. 34bool SetGoogleUpdateSettings(bool enabled) { 35 GoogleUpdateSettings::SetCollectStatsConsent(enabled); 36 bool updated_pref = GoogleUpdateSettings::GetCollectStatsConsent(); 37 if (enabled != updated_pref) 38 DVLOG(1) << "Unable to set metrics reporting status to " << enabled; 39 40 return updated_pref; 41} 42 43// Does the necessary changes for MetricsReportingEnabled changes which needs 44// to be done in the main thread. 45// As arguments this function gets: 46// |to_update_pref| which indicates what the desired update should be, 47// |callback_fn| is the callback function to be called in the end 48// |updated_pref| is the result of attempted update. 49// Update considers to be successful if |to_update_pref| and |updated_pref| are 50// the same. 51void SetMetricsReporting(bool to_update_pref, 52 const OnMetricsReportingCallbackType& callback_fn, 53 bool updated_pref) { 54 metrics::MetricsService* metrics = g_browser_process->metrics_service(); 55 if (metrics) { 56 if (updated_pref) 57 metrics->Start(); 58 else 59 metrics->Stop(); 60 } 61#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) 62 g_browser_process->local_state()->SetBoolean( 63 prefs::kMetricsReportingEnabled, updated_pref); 64#endif 65 if (to_update_pref == updated_pref) { 66 RecordMetricsReportingHistogramValue(updated_pref ? 67 METRICS_REPORTING_ENABLED : METRICS_REPORTING_DISABLED); 68 } else { 69 RecordMetricsReportingHistogramValue(METRICS_REPORTING_ERROR); 70 } 71 if (!callback_fn.is_null()) 72 callback_fn.Run(updated_pref); 73} 74 75} // namespace 76 77void InitiateMetricsReportingChange( 78 bool enabled, 79 const OnMetricsReportingCallbackType& callback_fn) { 80#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) 81 if (!IsMetricsReportingUserChangable()) { 82 if (!callback_fn.is_null()) { 83 callback_fn.Run( 84 ChromeMetricsServiceAccessor::IsMetricsReportingEnabled()); 85 } 86 return; 87 } 88#endif 89 // Posts to FILE thread as SetGoogleUpdateSettings does IO operations. 90 content::BrowserThread::PostTaskAndReplyWithResult( 91 content::BrowserThread::FILE, 92 FROM_HERE, 93 base::Bind(&SetGoogleUpdateSettings, enabled), 94 base::Bind(&SetMetricsReporting, enabled, callback_fn)); 95} 96 97bool IsMetricsReportingUserChangable() { 98 const PrefService* pref_service = g_browser_process->local_state(); 99 const PrefService::Preference* pref = 100 pref_service->FindPreference(prefs::kMetricsReportingEnabled); 101 return pref && !pref->IsManaged(); 102} 103