#ifndef CHROME_BROWSER_UI_TABS_ORGANIZATION_TRIGGER_POLICIES_H_
#define CHROME_BROWSER_UI_TABS_ORGANIZATION_TRIGGER_POLICIES_H_
#include <memory>
#include "base/memory/raw_ptr.h"
#include "base/time/tick_clock.h"
#include "base/time/time.h"
#include "chrome/browser/metrics/desktop_session_duration/desktop_session_duration_tracker.h"
#include "chrome/browser/ui/tabs/organization/trigger.h"
namespace content {
class BrowserContext;
}
class PrefService;
class UsageTickClock final : public base::TickClock,
metrics::DesktopSessionDurationTracker::Observer {
public:
explicit UsageTickClock(const base::TickClock* base_clock);
UsageTickClock(const UsageTickClock&) = delete;
UsageTickClock& operator=(const UsageTickClock&) = delete;
~UsageTickClock() override;
base::TimeTicks NowTicks() const override;
private:
void OnSessionStarted(base::TimeTicks session_start) override;
void OnSessionEnded(base::TimeDelta session_length,
base::TimeTicks session_end) override;
const raw_ptr<const base::TickClock> base_clock_;
const base::TimeTicks start_time_;
base::TimeDelta usage_time_in_completed_sessions_ = base::TimeDelta();
std::optional<base::TimeTicks> current_usage_session_start_time_ =
std::nullopt;
};
class BackoffLevelProvider {
public:
virtual ~BackoffLevelProvider() = default;
virtual unsigned int Get() const = 0;
virtual void Increment() = 0;
virtual void Decrement() = 0;
};
class ProfilePrefBackoffLevelProvider final : public BackoffLevelProvider {
public:
explicit ProfilePrefBackoffLevelProvider(content::BrowserContext* context);
~ProfilePrefBackoffLevelProvider() override;
unsigned int Get() const override;
void Increment() override;
void Decrement() override;
private:
raw_ptr<PrefService> prefs_;
};
class TargetFrequencyTriggerPolicy final : public TriggerPolicy {
public:
TargetFrequencyTriggerPolicy(std::unique_ptr<base::TickClock> clock,
base::TimeDelta base_period,
float backoff_base,
BackoffLevelProvider* backoff_level_provider);
~TargetFrequencyTriggerPolicy() override;
bool ShouldTrigger(float score) override;
void OnTriggerSucceeded();
void OnTriggerFailed();
private:
const std::unique_ptr<base::TickClock> clock_;
const base::TimeDelta base_period_;
const float backoff_base_;
const raw_ptr<BackoffLevelProvider> backoff_level_provider_;
base::TimeTicks cycle_start_time_;
std::optional<float> best_score = std::nullopt;
bool has_triggered_ = false;
};
class NeverTriggerPolicy final : public TriggerPolicy {
public:
bool ShouldTrigger(float score) override;
};
class DemoTriggerPolicy final : public TriggerPolicy {
public:
bool ShouldTrigger(float score) override;
};
#endif