#ifndef ASH_SYSTEM_ACCESSIBILITY_FLOATING_ACCESSIBILITY_VIEW_H_
#define ASH_SYSTEM_ACCESSIBILITY_FLOATING_ACCESSIBILITY_VIEW_H_
#include "ash/public/cpp/accessibility_controller_enums.h"
#include "ash/public/cpp/keyboard/keyboard_controller_observer.h"
#include "ash/shell_observer.h"
#include "ash/system/tray/system_tray_observer.h"
#include "ash/system/tray/tray_bubble_view.h"
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/layout/box_layout_view.h"
#include "ui/views/metadata/view_factory.h"
namespace ash {
class FloatingMenuButton;
class TrayBackgroundView;
class FloatingAccessibilityBubbleView : public TrayBubbleView {
METADATA_HEADER(FloatingAccessibilityBubbleView, TrayBubbleView)
public:
explicit FloatingAccessibilityBubbleView(
const TrayBubbleView::InitParams& init_params);
FloatingAccessibilityBubbleView(const FloatingAccessibilityBubbleView&) =
delete;
FloatingAccessibilityBubbleView& operator=(
const FloatingAccessibilityBubbleView&) = delete;
~FloatingAccessibilityBubbleView() override;
bool IsAnchoredToStatusArea() const override;
bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
void AdjustAccessibleName(std::u16string& new_name,
ax::mojom::NameFrom& name_from) override;
};
BEGIN_VIEW_BUILDER(,
FloatingAccessibilityBubbleView,
TrayBubbleView)
END_VIEW_BUILDER
class FloatingAccessibilityView : public views::BoxLayoutView,
public views::ViewObserver,
public KeyboardControllerObserver,
public SystemTrayObserver {
METADATA_HEADER(FloatingAccessibilityView, views::BoxLayoutView)
public:
enum ButtonId {
kPosition = 1,
kSettingsList = 2,
kDictation = 3,
kSelectToSpeak = 4,
kVirtualKeyboard = 5,
kIme = 6,
};
class Delegate {
public:
virtual void OnDetailedMenuEnabled(bool enabled) {}
virtual void OnLayoutChanged() {}
virtual void OnFocused() {}
virtual void OnBlurred() {}
virtual ~Delegate() = default;
};
explicit FloatingAccessibilityView(Delegate* delegate);
FloatingAccessibilityView& operator=(const FloatingAccessibilityView&) =
delete;
~FloatingAccessibilityView() override;
FloatingAccessibilityView(const FloatingAccessibilityView&) = delete;
void Initialize();
void SetMenuPosition(FloatingMenuPosition position);
void SetDetailedViewShown(bool shown);
void FocusOnDetailedViewButton();
private:
friend class FloatingAccessibilityControllerTest;
void OnA11yTrayButtonPressed();
void OnPositionButtonPressed();
void OnViewVisibilityChanged(views::View* observed_view,
views::View* starting_view,
bool visible) override;
void OnViewFocused(views::View* view) override;
void OnViewBlurred(views::View* view) override;
void OnKeyboardVisibilityChanged(bool visible) override;
void OnFocusLeavingSystemTray(bool reverse) override;
void OnImeMenuTrayBubbleShown() override;
TrayBackgroundView* dictation_button() {
return dictation_button_observation_.GetSource();
}
TrayBackgroundView* select_to_speak_button() {
return select_to_speak_button_observation_.GetSource();
}
TrayBackgroundView* virtual_keyboard_button() {
return virtual_keyboard_button_observation_.GetSource();
}
ImeMenuTray* ime_button() { return ime_button_observation_.GetSource(); }
base::ScopedObservation<TrayBackgroundView, ViewObserver>
dictation_button_observation_{this};
base::ScopedObservation<TrayBackgroundView, ViewObserver>
select_to_speak_button_observation_{this};
base::ScopedObservation<TrayBackgroundView, ViewObserver>
virtual_keyboard_button_observation_{this};
raw_ptr<FloatingMenuButton> a11y_tray_button_ = nullptr;
raw_ptr<FloatingMenuButton> position_button_ = nullptr;
base::ScopedObservation<ImeMenuTray, ViewObserver> ime_button_observation_{
this};
const raw_ptr<Delegate> delegate_;
};
BEGIN_VIEW_BUILDER(,
FloatingAccessibilityView,
views::BoxLayoutView)
END_VIEW_BUILDER
}
DEFINE_VIEW_BUILDER(, ash::FloatingAccessibilityBubbleView)
DEFINE_VIEW_BUILDER(, ash::FloatingAccessibilityView)
#endif