blob: 75fca2d08516e09afe9be9fcb5c642e45ddfb453 [file] [log] [blame]
// Copyright 2020 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.
#include "chrome/browser/lacros/metrics_reporting_observer.h"
#include "base/bind.h"
#include "base/check.h"
#include "base/memory/raw_ptr.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/metrics/metrics_reporting_state.h"
#include "chromeos/lacros/lacros_service.h"
#include "chromeos/startup/browser_params_proxy.h"
#include "components/metrics/metrics_pref_names.h"
#include "components/metrics/metrics_service.h"
#include "components/metrics/metrics_state_manager.h"
class MetricsServiceProxyImpl
: public MetricsReportingObserver::MetricsServiceProxy {
public:
explicit MetricsServiceProxyImpl(metrics::MetricsService* metrics_service)
: metrics_service_(metrics_service) {}
MetricsServiceProxyImpl(const MetricsServiceProxyImpl&) = delete;
MetricsServiceProxyImpl& operator=(const MetricsReportingObserver&) = delete;
~MetricsServiceProxyImpl() override = default;
void SetReportingEnabled(bool enabled) override {
ChangeMetricsReportingState(enabled);
}
void SetExternalClientId(const std::string& client_id) override {
metrics_service_->SetExternalClientId(client_id);
}
void RecreateClientIdIfNecessary() override {
if (metrics_service_->IsMetricsReportingEnabled())
metrics_service_->ResetClientId();
}
private:
raw_ptr<metrics::MetricsService> metrics_service_;
};
std::unique_ptr<MetricsReportingObserver>
MetricsReportingObserver::CreateObserver(
metrics::MetricsService* metrics_service) {
return std::make_unique<MetricsReportingObserver>(
std::make_unique<MetricsServiceProxyImpl>(metrics_service));
}
MetricsReportingObserver::MetricsReportingObserver(
std::unique_ptr<MetricsServiceProxy> metrics_service)
: metrics_service_(std::move(metrics_service)) {
DCHECK(metrics_service_);
auto* lacros_service = chromeos::LacrosService::Get();
if (lacros_service->IsMetricsReportingAvailable()) {
lacros_service->BindMetricsReporting(
metrics_reporting_remote_.BindNewPipeAndPassReceiver());
metrics_reporting_remote_->AddObserver(
receiver_.BindNewPipeAndPassRemoteWithVersion());
}
}
MetricsReportingObserver::~MetricsReportingObserver() = default;
void MetricsReportingObserver::InitSettingsFromAsh() {
auto* lacros_service = chromeos::LacrosService::Get();
if (!lacros_service->IsMetricsReportingAvailable()) {
LOG(WARNING) << "MetricsReporting API not available";
return;
}
// Set the initial state.
ChangeMetricsReportingState(
chromeos::BrowserParamsProxy::Get()->AshMetricsEnabled());
}
void MetricsReportingObserver::OnMetricsReportingChanged(
bool enabled,
const absl::optional<std::string>& client_id) {
if (enabled) {
if (client_id) {
metrics_service_->SetExternalClientId(client_id.value());
} else {
LOG(WARNING) << "UMA client id should have been provided, but wasn't. "
"A random id will be used.";
}
}
metrics_service_->SetReportingEnabled(enabled);
if (enabled) {
metrics_service_->RecreateClientIdIfNecessary();
}
}