#ifndef CHROMECAST_BASE_METRICS_CAST_METRICS_HELPER_H_
#define CHROMECAST_BASE_METRICS_CAST_METRICS_HELPER_H_
#include <memory>
#include <string>
#include "base/containers/flat_map.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/no_destructor.h"
#include "base/task/sequenced_task_runner.h"
#include "base/time/time.h"
#include "base/values.h"
namespace base {
class SequencedTaskRunner;
class TickClock;
}
namespace chromecast {
namespace metrics {
class CastMetricsHelper {
public:
enum BufferingType {
kInitialBuffering,
kBufferingAfterUnderrun,
kAbortedBuffering,
};
using RecordActionCallback =
base::RepeatingCallback<void(const std::string&)>;
class MetricsSink {
public:
virtual ~MetricsSink() = default;
virtual void OnAction(const std::string& action) = 0;
virtual void OnEnumerationEvent(const std::string& name,
int value, int num_buckets) = 0;
virtual void OnTimeEvent(const std::string& name,
base::TimeDelta value,
base::TimeDelta min,
base::TimeDelta max,
int num_buckets) = 0;
};
static bool DecodeAppInfoFromMetricsName(
const std::string& metrics_name,
std::string* action_name,
std::string* app_id,
std::string* session_id,
std::string* sdk_version);
static CastMetricsHelper* GetInstance();
CastMetricsHelper(const CastMetricsHelper&) = delete;
CastMetricsHelper& operator=(const CastMetricsHelper&) = delete;
virtual void DidStartLoad(const std::string& app_id);
virtual void DidCompleteLoad(const std::string& app_id,
const std::string& session_id);
virtual void UpdateSDKInfo(const std::string& sdk_version);
virtual void LogMediaPlay();
virtual void LogMediaPause();
virtual void RecordSimpleAction(const std::string& action);
virtual void RecordEventWithValue(const std::string& action, int value);
virtual void RecordApplicationEvent(const std::string& event);
virtual void RecordApplicationEvent(const std::string& app_id,
const std::string& session_id,
const std::string& sdk_version,
const std::string& event);
virtual void RecordApplicationEventWithValue(const std::string& event,
int value);
virtual void RecordApplicationEventWithValue(const std::string& app_id,
const std::string& session_id,
const std::string& sdk_version,
const std::string& event,
int value);
virtual void LogTimeToFirstPaint();
virtual void LogTimeToFirstAudio();
virtual void LogTimeToBufferAv(BufferingType buffering_type,
base::TimeDelta time);
virtual std::string GetMetricsNameWithAppName(
const std::string& prefix,
const std::string& suffix) const;
virtual void SetMetricsSink(MetricsSink* delegate);
virtual void SetRecordActionCallback(RecordActionCallback callback);
void SetDummySessionIdForTesting();
private:
static std::string EncodeAppInfoIntoMetricsName(
const std::string& action_name,
const std::string& app_id,
const std::string& session_id,
const std::string& sdk_version);
friend class base::NoDestructor<CastMetricsHelper>;
friend class CastMetricsHelperTest;
friend class MockCastMetricsHelper;
CastMetricsHelper(scoped_refptr<base::SequencedTaskRunner> task_runner =
base::SequencedTaskRunner::GetCurrentDefault(),
const base::TickClock* tick_clock = nullptr);
virtual ~CastMetricsHelper();
void LogEnumerationHistogramEvent(const std::string& name,
int value, int num_buckets);
void LogTimeHistogramEvent(const std::string& name,
base::TimeDelta value,
base::TimeDelta min,
base::TimeDelta max,
int num_buckets);
void LogMediumTimeHistogramEvent(const std::string& name,
base::TimeDelta value);
base::Value::Dict CreateEventBase(const std::string& name);
base::TimeTicks Now();
const scoped_refptr<base::SequencedTaskRunner> task_runner_;
const raw_ptr<const base::TickClock> tick_clock_;
base::flat_map<std::string , base::TimeTicks>
app_load_start_times_;
base::TimeTicks app_start_time_;
std::string app_id_;
std::string session_id_;
std::string sdk_version_;
raw_ptr<MetricsSink> metrics_sink_;
bool logged_first_audio_;
RecordActionCallback record_action_callback_;
};
}
}
#endif