#ifndef COMPONENTS_USER_EDUCATION_COMMON_TUTORIAL_H_
#define COMPONENTS_USER_EDUCATION_COMMON_TUTORIAL_H_
#include "components/user_education/common/help_bubble_factory.h"
#include "components/user_education/common/help_bubble_params.h"
#include "components/user_education/common/tutorial_description.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/base/interaction/element_identifier.h"
#include "ui/base/interaction/element_tracker.h"
#include "ui/base/interaction/interaction_sequence.h"
namespace user_education {
class TutorialService;
class Tutorial {
public:
~Tutorial();
class StepBuilder {
public:
StepBuilder();
explicit StepBuilder(const TutorialDescription::Step& step);
StepBuilder(const StepBuilder&) = delete;
StepBuilder& operator=(const StepBuilder&) = delete;
~StepBuilder();
static std::unique_ptr<ui::InteractionSequence::Step>
BuildFromDescriptionStep(const TutorialDescription::Step& step,
absl::optional<std::pair<int, int>> progress,
bool is_last_step,
bool can_be_restarted,
TutorialService* tutorial_service);
StepBuilder& SetAnchorElementID(ui::ElementIdentifier anchor_element_id);
StepBuilder& SetAnchorElementName(std::string anchor_element_name);
StepBuilder& SetTitleTextID(int title_text_id);
StepBuilder& SetBodyTextID(int body_text_id);
StepBuilder& SetStepType(
ui::InteractionSequence::StepType step_type_,
ui::CustomElementEventType event_type_ = ui::CustomElementEventType());
StepBuilder& SetArrow(HelpBubbleArrow arrow_);
StepBuilder& SetProgress(absl::optional<std::pair<int, int>> progress_);
StepBuilder& SetIsLastStep(bool is_last_step_);
StepBuilder& SetMustRemainVisible(bool must_remain_visible_);
StepBuilder& SetMustBeVisibleAtStart(bool must_be_visible_);
StepBuilder& SetTransitionOnlyOnEvent(bool transition_only_on_event_);
StepBuilder& SetNameElementsCallback(
TutorialDescription::NameElementsCallback name_elements_callback_);
StepBuilder& SetCanBeRestarted(bool can_be_restarted_);
std::unique_ptr<ui::InteractionSequence::Step> Build(
TutorialService* tutorial_service);
private:
absl::optional<std::pair<int, int>> progress;
bool is_last_step = false;
bool can_be_restarted = false;
ui::InteractionSequence::StepStartCallback BuildStartCallback(
TutorialService* tutorial_service);
ui::InteractionSequence::StepStartCallback BuildMaybeShowBubbleCallback(
TutorialService* tutorial_service);
ui::InteractionSequence::StepEndCallback BuildHideBubbleCallback(
TutorialService* tutorial_service);
TutorialDescription::Step step_;
};
class Builder {
public:
Builder();
~Builder();
static std::unique_ptr<Tutorial> BuildFromDescription(
const TutorialDescription& description,
TutorialService* tutorial_service,
ui::ElementContext context);
Builder(const Builder& other) = delete;
void operator=(Builder& other) = delete;
Builder& AddStep(std::unique_ptr<ui::InteractionSequence::Step> step);
Builder& SetContext(ui::ElementContext element_context);
Builder& SetAbortedCallback(
ui::InteractionSequence::AbortedCallback callback);
Builder& SetCompletedCallback(
ui::InteractionSequence::CompletedCallback callback);
std::unique_ptr<Tutorial> Build();
private:
std::unique_ptr<ui::InteractionSequence::Builder> builder_;
};
void Start();
void Abort();
private:
explicit Tutorial(
std::unique_ptr<ui::InteractionSequence> interaction_sequence);
std::unique_ptr<ui::InteractionSequence> interaction_sequence_;
};
}
#endif