#ifndef UI_VIEWS_INTERACTION_WIDGET_FOCUS_OBSERVER_H_
#define UI_VIEWS_INTERACTION_WIDGET_FOCUS_OBSERVER_H_
#include <vector>
#include "base/callback_list.h"
#include "base/functional/callback_forward.h"
#include "ui/base/interaction/framework_specific_implementation.h"
#include "ui/base/interaction/framework_specific_registration_list.h"
#include "ui/base/interaction/state_observer.h"
#include "ui/views/widget/widget.h"
namespace views::test {
namespace internal {
class WidgetFocusSupplier : public ui::FrameworkSpecificImplementation {
public:
WidgetFocusSupplier();
~WidgetFocusSupplier() override;
using WidgetFocusChangedCallback =
base::RepeatingCallback<void(Widget*)>;
base::CallbackListSubscription AddWidgetFocusChangedCallback(
WidgetFocusChangedCallback callback);
protected:
void OnWidgetFocusChanged(Widget* focused_now);
virtual Widget::Widgets GetAllWidgets() const = 0;
private:
friend class WidgetFocusSupplierFrame;
base::RepeatingCallbackList<void(Widget*)> callbacks_;
};
class WidgetFocusSupplierFrame {
public:
WidgetFocusSupplierFrame();
~WidgetFocusSupplierFrame();
WidgetFocusSupplierFrame(const WidgetFocusSupplierFrame&) = delete;
void operator=(const WidgetFocusSupplierFrame&) = delete;
static WidgetFocusSupplierFrame* GetCurrentFrame();
using SupplierList =
ui::FrameworkSpecificRegistrationList<WidgetFocusSupplier>;
SupplierList& supplier_list() { return supplier_list_; }
Widget* GetActiveWidget();
private:
SupplierList supplier_list_;
};
}
class WidgetFocusObserver : public ui::test::StateObserver<Widget*> {
public:
WidgetFocusObserver();
~WidgetFocusObserver() override;
Widget* GetStateObserverInitialState() const override;
private:
void OnWidgetFocusChanged(Widget* focused_now);
std::vector<base::CallbackListSubscription> subscriptions_;
};
DECLARE_STATE_IDENTIFIER_VALUE(WidgetFocusObserver, kCurrentWidgetFocus);
}
#endif