|  | // Copyright 2020 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef CHROME_BROWSER_ASH_CROSAPI_METRICS_REPORTING_ASH_H_ | 
|  | #define CHROME_BROWSER_ASH_CROSAPI_METRICS_REPORTING_ASH_H_ | 
|  |  | 
|  | #include <memory> | 
|  |  | 
|  | #include "base/callback_list.h" | 
|  | #include "base/gtest_prod_util.h" | 
|  | #include "chromeos/crosapi/mojom/metrics_reporting.mojom.h" | 
|  | #include "components/prefs/pref_change_registrar.h" | 
|  | #include "mojo/public/cpp/bindings/pending_receiver.h" | 
|  | #include "mojo/public/cpp/bindings/receiver_set.h" | 
|  | #include "mojo/public/cpp/bindings/remote_set.h" | 
|  |  | 
|  | namespace metrics { | 
|  | class MetricsService; | 
|  | }  // namespace metrics | 
|  |  | 
|  | namespace crosapi { | 
|  |  | 
|  | // The ash-chrome implementation of the MetricsReporting crosapi interface. | 
|  | // This class must only be used from the main thread. | 
|  | class MetricsReportingAsh : public mojom::MetricsReporting { | 
|  | public: | 
|  | // Allows stubbing out the metrics reporting subsystem. | 
|  | class Delegate { | 
|  | public: | 
|  | virtual ~Delegate() = default; | 
|  | virtual bool IsMetricsReportingEnabled() = 0; | 
|  | virtual void SetMetricsReportingEnabled(bool enabled) = 0; | 
|  | virtual std::string GetClientId() = 0; | 
|  | virtual base::CallbackListSubscription AddEnablementObserver( | 
|  | const base::RepeatingCallback<void(bool)>& observer) = 0; | 
|  | }; | 
|  | static std::unique_ptr<MetricsReportingAsh> CreateMetricsReportingAsh( | 
|  | metrics::MetricsService* metrics_service); | 
|  |  | 
|  | // Constructs a metrics service impl. Do not use this directly and use the | 
|  | // Factory interface instead. | 
|  | explicit MetricsReportingAsh(std::unique_ptr<Delegate> delegate); | 
|  | MetricsReportingAsh(const MetricsReportingAsh&) = delete; | 
|  | MetricsReportingAsh& operator=(const MetricsReportingAsh&) = delete; | 
|  | ~MetricsReportingAsh() override; | 
|  |  | 
|  | void BindReceiver(mojo::PendingReceiver<mojom::MetricsReporting> receiver); | 
|  |  | 
|  | // crosapi::mojom::MetricsReporting: | 
|  | void AddObserver( | 
|  | mojo::PendingRemote<mojom::MetricsReportingObserver> observer) override; | 
|  | void SetMetricsReportingEnabled( | 
|  | bool enabled, | 
|  | SetMetricsReportingEnabledCallback callback) override; | 
|  |  | 
|  | void OnEnablementChange(bool enabled); | 
|  |  | 
|  | private: | 
|  | // Notifies all observers of the current metrics state. | 
|  | void NotifyObservers(); | 
|  |  | 
|  | std::unique_ptr<Delegate> delegate_; | 
|  |  | 
|  | // Handle for the observer watching the metrics enablement state. This needs | 
|  | // to remain active for the lifetime of the observer. | 
|  | base::CallbackListSubscription observer_subscription_; | 
|  |  | 
|  | // Observes the metrics enabled pref. | 
|  | PrefChangeRegistrar pref_change_registrar_; | 
|  |  | 
|  | // This class supports any number of connections. | 
|  | mojo::ReceiverSet<mojom::MetricsReporting> receivers_; | 
|  |  | 
|  | // This class supports any number of observers. | 
|  | mojo::RemoteSet<mojom::MetricsReportingObserver> observers_; | 
|  | }; | 
|  |  | 
|  | }  // namespace crosapi | 
|  |  | 
|  | #endif  // CHROME_BROWSER_ASH_CROSAPI_METRICS_REPORTING_ASH_H_ |