blob: d90eadf9838e86fb8fcbf3cad3636f833c0123dc [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/ash/crosapi/metrics_reporting_ash.h"
#include <utility>
#include "base/bind.h"
#include "base/check.h"
#include "chrome/browser/ash/settings/stats_reporting_controller.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chromeos/crosapi/mojom/metrics_reporting.mojom.h"
#include "components/metrics/metrics_pref_names.h"
#include "components/prefs/pref_service.h"
namespace crosapi {
namespace {
// Delegate for production, which uses the real reporting subsystem.
class DelegateImpl : public MetricsReportingAsh::Delegate {
public:
DelegateImpl() = default;
DelegateImpl(const DelegateImpl&) = delete;
DelegateImpl& operator=(const DelegateImpl&) = delete;
~DelegateImpl() override = default;
// MetricsReportingAsh::Delegate:
void SetMetricsReportingEnabled(bool enabled) override {
// Use primary profile because Lacros does not support multi-signin.
Profile* profile = ProfileManager::GetPrimaryUserProfile();
// Chrome OS uses this wrapper around the underlying metrics pref.
ash::StatsReportingController::Get()->SetEnabled(profile, enabled);
}
};
} // namespace
MetricsReportingAsh::MetricsReportingAsh(PrefService* local_state)
: MetricsReportingAsh(std::make_unique<DelegateImpl>(), local_state) {}
MetricsReportingAsh::MetricsReportingAsh(std::unique_ptr<Delegate> delegate,
PrefService* local_state)
: delegate_(std::move(delegate)), local_state_(local_state) {
DCHECK(delegate_);
DCHECK(local_state_);
pref_change_registrar_.Init(local_state_);
// base::Unretained() is safe because PrefChangeRegistrar removes all
// observers when it is destroyed.
pref_change_registrar_.Add(
metrics::prefs::kMetricsReportingEnabled,
base::BindRepeating(&MetricsReportingAsh::NotifyObservers,
base::Unretained(this)));
}
MetricsReportingAsh::~MetricsReportingAsh() = default;
void MetricsReportingAsh::BindReceiver(
mojo::PendingReceiver<mojom::MetricsReporting> receiver) {
receivers_.Add(this, std::move(receiver));
}
void MetricsReportingAsh::AddObserver(
mojo::PendingRemote<mojom::MetricsReportingObserver> observer) {
mojo::Remote<mojom::MetricsReportingObserver> remote(std::move(observer));
// Fire the observer with the initial value.
bool enabled = IsMetricsReportingEnabled();
remote->OnMetricsReportingChanged(enabled);
// Store the observer for future notifications.
observers_.Add(std::move(remote));
}
void MetricsReportingAsh::SetMetricsReportingEnabled(
bool enabled,
SetMetricsReportingEnabledCallback callback) {
delegate_->SetMetricsReportingEnabled(enabled);
std::move(callback).Run();
}
void MetricsReportingAsh::NotifyObservers() {
bool enabled = IsMetricsReportingEnabled();
for (auto& observer : observers_) {
observer->OnMetricsReportingChanged(enabled);
}
}
bool MetricsReportingAsh::IsMetricsReportingEnabled() const {
return local_state_->GetBoolean(metrics::prefs::kMetricsReportingEnabled);
}
} // namespace crosapi