#ifndef ASH_SYSTEM_TOAST_ANCHORED_NUDGE_MANAGER_IMPL_H_
#define ASH_SYSTEM_TOAST_ANCHORED_NUDGE_MANAGER_IMPL_H_
#include <map>
#include <string>
#include <string_view>
#include "ash/ash_export.h"
#include "ash/capture_mode/capture_mode_education_controller.h"
#include "ash/constants/notifier_catalogs.h"
#include "ash/public/cpp/session/session_observer.h"
#include "ash/public/cpp/system/anchored_nudge_data.h"
#include "ash/public/cpp/system/anchored_nudge_manager.h"
#include "ash/system/toast/anchored_nudge.h"
#include "base/memory/weak_ptr.h"
#include "base/timer/timer.h"
namespace ui {
class ImplicitAnimationObserver;
}
namespace views {
class LabelButton;
class View;
}
namespace ash {
struct AnchoredNudgeData;
class ScopedNudgePause;
class ASH_EXPORT AnchoredNudgeManagerImpl : public AnchoredNudgeManager,
public SessionObserver {
public:
AnchoredNudgeManagerImpl();
AnchoredNudgeManagerImpl(const AnchoredNudgeManagerImpl&) = delete;
AnchoredNudgeManagerImpl& operator=(const AnchoredNudgeManagerImpl&) = delete;
~AnchoredNudgeManagerImpl() override;
void Show(AnchoredNudgeData& nudge_data) override;
void Cancel(const std::string& id) override;
void MaybeRecordNudgeAction(NudgeCatalogName catalog_name) override;
std::unique_ptr<ScopedNudgePause> CreateScopedPause() override;
bool IsNudgeShown(const std::string& id) override;
void HandleNudgeWidgetDestroying(const std::string& id);
void OnSessionStateChanged(session_manager::SessionState state) override;
std::u16string_view GetNudgeBodyTextForTest(const std::string& id);
views::View* GetNudgeAnchorViewForTest(const std::string& id);
views::LabelButton* GetNudgePrimaryButtonForTest(const std::string& id);
views::LabelButton* GetNudgeSecondaryButtonForTest(const std::string& id);
AnchoredNudge* GetShownNudgeForTest(const std::string& id);
NudgeCatalogName GetNudgeCatalogNameForTest(const std::string& id);
static constexpr int kLongBodyTextLength = 60;
static constexpr base::TimeDelta kNudgeDefaultDuration = base::Seconds(6);
static constexpr base::TimeDelta kNudgeMediumDuration = base::Seconds(10);
static constexpr base::TimeDelta kNudgeLongDuration = base::Minutes(30);
AnchoredNudge* GetNudgeIfShown(const std::string& nudge_id) const;
void ResetNudgeRegistryForTesting();
private:
friend class AnchoredNudgeManagerImplTest;
class AnchorViewObserver;
class AnchorViewWidgetObserver;
class NudgeWidgetObserver;
class PausableTimer;
static std::vector<std::pair<NudgeCatalogName, base::TimeTicks>>&
GetNudgeRegistry();
void RecordNudgeShown(NudgeCatalogName catalog_name);
void RecordButtonPressed(NudgeCatalogName catalog_name,
bool is_primary_button);
void CloseAllNudges();
void PauseOrResumeDismissTimer(const std::string& nudge_id, bool pause);
base::RepeatingClosure ChainCancelCallback(base::RepeatingClosure callback,
NudgeCatalogName catalog_name,
const std::string& id,
bool is_primary_button);
void Pause() override;
void Resume() override;
std::map<std::string, raw_ptr<AnchoredNudge>> shown_nudges_;
std::map<std::string, std::unique_ptr<AnchorViewObserver>>
anchor_view_observers_;
std::map<std::string, std::unique_ptr<AnchorViewWidgetObserver>>
anchor_view_widget_observers_;
std::map<std::string, std::unique_ptr<NudgeWidgetObserver>>
nudge_widget_observers_;
std::map<std::string, std::unique_ptr<ui::ImplicitAnimationObserver>>
hide_animation_observers_;
std::map<std::string, PausableTimer> dismiss_timers_;
int pause_counter_ = 0;
base::WeakPtrFactory<AnchoredNudgeManagerImpl> weak_ptr_factory_{this};
};
}
#endif