#ifndef CHROMEOS_ASH_COMPONENTS_GROWTH_CAMPAIGNS_MANAGER_H_
#define CHROMEOS_ASH_COMPONENTS_GROWTH_CAMPAIGNS_MANAGER_H_
#include <string>
#include "base/component_export.h"
#include "base/containers/flat_set.h"
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "chromeos/ash/components/growth/action_performer.h"
#include "chromeos/ash/components/growth/campaigns_logger.h"
#include "chromeos/ash/components/growth/campaigns_manager_client.h"
#include "chromeos/ash/components/growth/campaigns_matcher.h"
#include "chromeos/ash/components/growth/campaigns_model.h"
class PrefService;
class PrefRegistrySimple;
namespace signin {
enum class Tribool;
}
namespace growth {
class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_GROWTH) CampaignsManager {
public:
using GetCampaignCallback =
base::OnceCallback<void(const Campaign* campaign)>;
class Observer : public base::CheckedObserver {
public:
~Observer() override = default;
virtual void OnCampaignsLoadCompleted() = 0;
};
CampaignsManager(CampaignsManagerClient* client, PrefService* local_state);
CampaignsManager(const CampaignsManager&) = delete;
CampaignsManager& operator=(const CampaignsManager&) = delete;
~CampaignsManager();
static CampaignsManager* Get();
static void RegisterProfilePrefs(PrefRegistrySimple* registry);
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
void SetPrefs(PrefService* prefs);
void LoadCampaigns(base::OnceClosure load_callback, bool in_oobe = false);
const Campaign* GetCampaignBySlot(Slot slot) const;
const GURL& GetActiveUrl() const;
void SetActiveUrl(const GURL& url);
const std::string& GetOpenedAppId() const;
void SetOpenedApp(std::string app_id);
const Trigger& GetTrigger() const;
void SetTrigger(const Trigger&& trigger_type);
void SetIsUserOwner(bool is_user_owner);
void PerformAction(int campaign_id,
std::optional<int> group_id,
const Action* action);
void PerformAction(int campaign_id,
std::optional<int> group_id,
const ActionType action_type,
const base::Value::Dict* params);
void ClearEvent(CampaignEvent event, std::string_view id);
void ClearEvent(std::string_view event);
void ClearAllEvents();
void RecordEvent(const std::string& event, bool trigger_campaigns = false);
void SetMantaCapabilityForTesting(signin::Tribool value);
void SetBoardForTesting(std::optional<std::string> board);
void SetOobeCompleteTimeForTesting(base::Time time);
void SetTrackerInitializedForTesting();
const Campaigns* GetCampaignsBySlotForTesting(Slot slot) const;
std::optional<base::Time> GetRegisteredTimeForTesting();
base::flat_set<std::string> queued_events_record_only_for_testing() const {
return queued_events_record_only_;
}
base::flat_set<std::string> queued_events_record_and_trigger_for_testing()
const {
return queued_events_record_and_trigger_;
}
void SetCampaignsForTesting(const base::Value::Dict* campaigns) {
campaigns_ = campaigns->Clone();
}
private:
void RecordQueuedEventsAndMaybeTrigger();
void OnCampaignsComponentLoaded(
base::OnceClosure load_callback,
bool in_oobe,
const std::optional<const base::FilePath>& file_path);
void OnCampaignsLoaded(base::OnceClosure load_callback,
std::optional<base::Value::Dict> campaigns);
void OnOobeTimestampLoaded(base::OnceClosure load_callback,
const std::optional<const base::FilePath>& path,
base::Time oobe_time);
void OnTrackerInitialized(base::OnceClosure load_callback,
const std::optional<const base::FilePath>& path,
bool init_success);
void NotifyCampaignsLoaded();
void MaybeRecordImpressionForControl(const Campaign* campaign) const;
void RegisterTrialForCampaign(const Campaign* campaign) const;
void ClearEventsByTargeting(const EventsTargeting& events_targeting,
int campaign_id,
std::optional<int> group_id);
raw_ptr<CampaignsManagerClient> client_ = nullptr;
bool campaigns_loaded_ = false;
CampaignsPerSlot campaigns_;
CampaignsMatcher matcher_;
CampaignsLogger logger_;
ActionMap actions_map_;
base::TimeTicks campaigns_download_start_time_;
base::Time oobe_complete_time_for_test_;
bool tracker_initialized_for_test_ = false;
base::ObserverList<Observer> observers_;
base::flat_set<std::string> queued_events_record_only_;
base::flat_set<std::string> queued_events_record_and_trigger_;
base::WeakPtrFactory<CampaignsManager> weak_factory_{this};
};
}
#endif