#ifndef ASH_METRICS_FEATURE_DISCOVERY_DURATION_REPORTER_IMPL_H_
#define ASH_METRICS_FEATURE_DISCOVERY_DURATION_REPORTER_IMPL_H_
#include <map>
#include "ash/public/cpp/feature_discovery_duration_reporter.h"
#include "ash/public/cpp/session/session_observer.h"
#include "ash/session/session_controller_impl.h"
#include "base/gtest_prod_util.h"
#include "base/scoped_observation.h"
class PrefRegistrySimple;
class PrefService;
namespace base {
class TimeTicks;
}
namespace ash {
class FeatureDiscoveryDurationReporterImpl
: public FeatureDiscoveryDurationReporter,
public SessionObserver {
public:
explicit FeatureDiscoveryDurationReporterImpl(
SessionController* session_controller);
FeatureDiscoveryDurationReporterImpl(
const FeatureDiscoveryDurationReporterImpl&) = delete;
FeatureDiscoveryDurationReporterImpl& operator=(
const FeatureDiscoveryDurationReporterImpl&) = delete;
~FeatureDiscoveryDurationReporterImpl() override;
static void RegisterProfilePrefs(PrefRegistrySimple* registry);
void MaybeActivateObservation(
feature_discovery::TrackableFeature feature) override;
void MaybeFinishObservation(
feature_discovery::TrackableFeature feature) override;
void AddObserver(ReporterObserver* observer) override;
void RemoveObserver(ReporterObserver* observer) override;
private:
friend class FeatureDiscoveryDurationReporterImplTest;
FRIEND_TEST_ALL_PREFIXES(FeatureDiscoveryDurationReporterBrowserTest,
SaveCumulatedTimeWhenSignout);
void SetActive(bool active);
void Activate();
void Deactivate();
void OnSessionStateChanged(session_manager::SessionState state) override;
void OnActiveUserPrefServiceChanged(PrefService* pref_service) override;
bool is_active() const { return is_active_; }
base::ObserverList<ReporterObserver> observers_;
std::map<feature_discovery::TrackableFeature, base::TimeTicks>
active_time_recordings_;
raw_ptr<PrefService> active_pref_service_ = nullptr;
bool is_active_ = false;
base::ScopedObservation<SessionController, SessionObserver>
session_controller_observation_{this};
};
}
#endif