#ifndef CHROMEOS_ASH_COMPONENTS_GROWTH_CAMPAIGNS_MODEL_H_
#define CHROMEOS_ASH_COMPONENTS_GROWTH_CAMPAIGNS_MODEL_H_
#include <memory>
#include <optional>
#include "base/component_export.h"
#include "base/features.h"
#include "base/time/time.h"
#include "base/values.h"
#include "chromeos/ash/components/growth/action_performer.h"
namespace base {
class Time;
class Version;
}
namespace gfx {
class Image;
struct VectorIcon;
}
namespace ui {
class ImageModel;
}
namespace growth {
enum class Slot {
kMinValue = 0,
kDemoModeApp = kMinValue,
kDemoModeFreePlayApps = 1,
kNudge = 2,
kNotification = 3,
kOobePerkDiscovery = 4,
kDemoModeSignInExperience = 5,
kDryRun = 6,
kMaxValue = kDryRun
};
enum class BuiltInVectorIcon {
kRedeem = 0,
kHelpApp = 1,
kMaxValue = kHelpApp
};
enum class BuiltInImage {
kGeminiApp = 0,
kG1 = 1,
kSparkRebuy = 2,
kSpark1PApp = 3,
kSparkV2 = 4,
kG1Notification = 5,
kMall = 6,
kPrintJobsIcon = 7,
kGoogleDocsIcon = 8,
kYouTubeIcon = 9,
kPlayStoreIcon = 10,
kRNotification = 11,
kMallAppIcon = 12,
kPersonalizationIcon = 13,
kMaxValue = kPersonalizationIcon,
};
enum class WindowAnchorType {
kCaptionButtonContainer = 0,
kWindowBounds = 1,
kMaxValue = kWindowBounds
};
enum class TriggerType {
kUnSpecified = -1,
kAppOpened = 0,
kCampaignsLoaded = 1,
kEvent = 2,
kDelayedOneShotTimer = 3,
kMaxValue = kDelayedOneShotTimer
};
class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_GROWTH) Trigger {
public:
explicit Trigger(TriggerType type);
~Trigger();
TriggerType type;
std::vector<std::string> events;
};
using Targeting = base::Value::Dict;
using Targetings = base::Value::List;
using Payload = base::Value::Dict;
using Campaign = base::Value::Dict;
using Campaigns = base::Value::List;
COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_GROWTH)
const Payload* GetPayloadBySlot(const Campaign* campaign, Slot slot);
COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_GROWTH)
std::optional<int> GetCampaignId(const Campaign* campaign);
COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_GROWTH)
std::optional<int> GetCampaignGroupId(const Campaign* campaign);
COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_GROWTH)
std::optional<int> GetStudyId(const Campaign* campaign);
COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_GROWTH)
std::optional<bool> ShouldRegisterTrialWithTriggerEventName(
const Campaign* campaign);
using CampaignsPerSlot = base::Value::Dict;
Campaigns* GetMutableCampaignsBySlot(CampaignsPerSlot* campaigns_per_slot,
Slot slot);
const Campaigns* GetCampaignsBySlot(const CampaignsPerSlot* campaigns_per_slot,
Slot slot);
const Targetings* GetTargetings(const Campaign* campaign);
const Payload* GetPayloadBySlot(const Campaign* campaign, Slot slot);
class TargetingBase {
public:
TargetingBase(const Targeting* targeting_dict, const char* targeting_path);
TargetingBase(const TargetingBase&) = delete;
TargetingBase& operator=(const TargetingBase) = delete;
~TargetingBase();
bool IsValid() const;
protected:
const base::Value::List* GetListCriteria(const char* path_suffix) const;
const std::optional<bool> GetBoolCriteria(const char* path_suffix) const;
const std::optional<int> GetIntCriteria(const char* path_suffix) const;
const std::string* GetStringCriteria(const char* path_suffix) const;
const base::Value::Dict* GetDictCriteria(const char* path_suffix) const;
private:
const std::string GetCriteriaPath(const char* path_suffix) const;
raw_ptr<const Targeting> targeting_;
const char* targeting_path_;
};
class DemoModeTargeting : public TargetingBase {
public:
explicit DemoModeTargeting(const Targeting* targeting_dict);
DemoModeTargeting(const DemoModeTargeting&) = delete;
DemoModeTargeting& operator=(const DemoModeTargeting) = delete;
~DemoModeTargeting();
const base::Value::List* GetStoreIds() const;
const base::Value::List* GetRetailers() const;
const base::Value::List* GetCountries() const;
const std::optional<base::Version> GetAppMinVersion() const;
const std::optional<base::Version> GetAppMaxVersion() const;
const std::optional<bool> TargetCloudGamingDevice() const;
const std::optional<bool> TargetFeatureAwareDevice() const;
};
class TimeWindowTargeting {
public:
explicit TimeWindowTargeting(const base::Value::Dict* time_window_dict);
TimeWindowTargeting(const TimeWindowTargeting&) = delete;
TimeWindowTargeting& operator=(const TimeWindowTargeting) = delete;
~TimeWindowTargeting();
const base::Time GetStartTime() const;
const base::Time GetEndTime() const;
private:
raw_ptr<const base::Value::Dict> time_window_dict_;
};
class NumberRangeTargeting {
public:
explicit NumberRangeTargeting(const base::Value::Dict* number_range_dict);
NumberRangeTargeting(const NumberRangeTargeting&) = delete;
NumberRangeTargeting& operator=(const NumberRangeTargeting) = delete;
~NumberRangeTargeting();
const std::optional<int> GetStart() const;
const std::optional<int> GetEnd() const;
private:
raw_ptr<const base::Value::Dict> number_range_dict_;
};
class StringListTargeting {
public:
explicit StringListTargeting(const base::Value::Dict* string_list_dict);
StringListTargeting(const StringListTargeting&) = delete;
StringListTargeting& operator=(const StringListTargeting) = delete;
~StringListTargeting();
const base::Value::List* GetIncludes() const;
const base::Value::List* GetExcludes() const;
private:
raw_ptr<const base::Value::Dict> string_list_dict_;
};
class DeviceTargeting : public TargetingBase {
public:
explicit DeviceTargeting(const Targeting* targeting_dict);
DeviceTargeting(const DeviceTargeting&) = delete;
DeviceTargeting& operator=(const DeviceTargeting) = delete;
~DeviceTargeting();
const std::unique_ptr<StringListTargeting> GetBoards() const;
const base::Value::List* GetLocales() const;
const base::Value::List* GetUserLocales() const;
const base::Value::List* GetIncludedCountries() const;
const base::Value::List* GetExcludedCountries() const;
const std::optional<int> GetMinMilestone() const;
const std::optional<int> GetMaxMilestone() const;
const std::optional<base::Version> GetMinVersion() const;
const std::optional<base::Version> GetMaxVersion() const;
const std::optional<bool> GetFeatureAwareDevice() const;
std::unique_ptr<TimeWindowTargeting> GetRegisteredTime() const;
const std::unique_ptr<NumberRangeTargeting> GetDeviceAge() const;
const std::unique_ptr<StringListTargeting> GetChannels() const;
};
class SessionTargeting : public TargetingBase {
public:
explicit SessionTargeting(const Targeting* targeting_dict);
SessionTargeting(const SessionTargeting&) = delete;
SessionTargeting& operator=(const SessionTargeting) = delete;
~SessionTargeting();
std::optional<const base::Feature*> GetFeature() const;
const base::Value::List* GetExperimentTags() const;
std::optional<bool> GetMinorUser() const;
std::optional<bool> GetIsOwner() const;
};
class AppTargeting {
public:
explicit AppTargeting(const base::Value::Dict* app);
AppTargeting(const AppTargeting&) = delete;
AppTargeting& operator=(const AppTargeting) = delete;
~AppTargeting();
const std::string* GetAppId() const;
private:
raw_ptr<const base::Value::Dict> app_dict_;
};
class EventsTargeting {
public:
explicit EventsTargeting(const base::Value::Dict* config);
EventsTargeting(const EventsTargeting&) = delete;
EventsTargeting& operator=(const EventsTargeting) = delete;
~EventsTargeting();
int GetImpressionCap() const;
int GetDismissalCap() const;
std::optional<int> GetGroupImpressionCap() const;
std::optional<int> GetGroupDismissalCap() const;
const base::Value::List* GetEventsConditions() const;
private:
raw_ptr<const base::Value::Dict> config_dict_;
};
class TriggerTargeting {
public:
explicit TriggerTargeting(const base::Value::Dict* app);
TriggerTargeting(const TriggerTargeting&) = delete;
TriggerTargeting& operator=(const TriggerTargeting) = delete;
~TriggerTargeting();
std::optional<int> GetTriggerType() const;
const base::Value::List* GetTriggerEvents() const;
private:
raw_ptr<const base::Value::Dict> trigger_dict_;
};
class RuntimeTargeting : public TargetingBase {
public:
explicit RuntimeTargeting(const Targeting* targeting_dict);
RuntimeTargeting(const RuntimeTargeting&) = delete;
RuntimeTargeting& operator=(const RuntimeTargeting) = delete;
~RuntimeTargeting();
const std::vector<std::unique_ptr<TimeWindowTargeting>> GetSchedulings()
const;
const std::vector<std::unique_ptr<AppTargeting>> GetAppsOpened() const;
const std::vector<std::string> GetActiveUrlRegexes() const;
std::unique_ptr<EventsTargeting> GetEventsTargeting() const;
const std::vector<std::unique_ptr<TriggerTargeting>> GetTriggers() const;
const base::Value::List* GetUserPrefTargetings() const;
std::unique_ptr<AppTargeting> GetHotseatAppIcon() const;
};
class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_GROWTH) Action {
public:
explicit Action(const base::Value::Dict* action_dict);
Action(const Action&) = delete;
Action& operator=(const Action) = delete;
~Action();
std::optional<growth::ActionType> GetActionType() const;
const base::Value::Dict* GetParams() const;
raw_ptr<const base::Value::Dict> action_dict_;
};
class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_GROWTH) Anchor {
public:
explicit Anchor(const base::Value::Dict* anchor_dict);
Anchor(const Anchor&) = delete;
Anchor& operator=(const Anchor) = delete;
~Anchor();
const std::optional<WindowAnchorType> GetActiveAppWindowAnchorType() const;
const std::string* GetShelfAppButtonId() const;
private:
raw_ptr<const base::Value::Dict> anchor_dict_;
};
class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_GROWTH) Image {
public:
explicit Image(const base::Value::Dict* image_dict);
Image(const Image&) = delete;
Image& operator=(const Image) = delete;
~Image();
const gfx::Image* GetImage() const;
private:
const gfx::Image* GetBuiltInImage() const;
raw_ptr<const base::Value::Dict> image_dict_;
};
class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_GROWTH) VectorIcon {
public:
explicit VectorIcon(const base::Value::Dict* vector_icon_dict);
VectorIcon(const VectorIcon&) = delete;
VectorIcon& operator=(const VectorIcon) = delete;
~VectorIcon();
const gfx::VectorIcon* GetVectorIcon() const;
private:
const gfx::VectorIcon* GetBuiltInVectorIcon() const;
raw_ptr<const base::Value::Dict> vector_icon_dict_;
};
class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_GROWTH) ImageModel {
public:
explicit ImageModel(const base::Value::Dict* image_model_dict);
ImageModel(const Image&) = delete;
ImageModel& operator=(const ImageModel) = delete;
~ImageModel();
const std::optional<ui::ImageModel> GetImageModel() const;
private:
const std::optional<ui::ImageModel> GetBuiltInImageModel() const;
raw_ptr<const base::Value::Dict> image_model_dict_;
};
}
#endif