#ifndef ASH_ACCESSIBILITY_SWITCH_ACCESS_POINT_SCAN_CONTROLLER_H_
#define ASH_ACCESSIBILITY_SWITCH_ACCESS_POINT_SCAN_CONTROLLER_H_
#include <optional>
#include "ash/accessibility/switch_access/point_scan_layer_animation_info.h"
#include "ash/accessibility/ui/accessibility_animation_one_shot.h"
#include "ash/accessibility/ui/accessibility_layer.h"
#include "ash/ash_export.h"
#include "ui/gfx/geometry/point_f.h"
namespace ash {
class PointScanLayer;
class ASH_EXPORT PointScanController : public AccessibilityLayerDelegate {
public:
PointScanController();
~PointScanController() override;
PointScanController(const PointScanController&) = delete;
PointScanController& operator=(const PointScanController&) = delete;
enum class PointScanState {
kOff,
kHorizontalRangeScanning,
kHorizontalScanning,
kVerticalRangeScanning,
kVerticalScanning,
};
void Start();
void StartHorizontalRangeScan();
void StartHorizontalLineScan();
void StartVerticalRangeScan();
void StartVerticalLineScan();
void Stop();
void HideAll();
void ResetAnimation();
std::optional<gfx::PointF> OnPointSelect();
bool IsPointScanEnabled();
void SetSpeedDipsPerSecond(int speed_dips_per_second);
private:
void OnDeviceScaleFactorChanged() override;
void UpdateTimeInfo(PointScanLayerAnimationInfo* animation_info,
base::TimeTicks timestamp);
bool AnimateLine(base::TimeTicks timestamp);
PointScanLayerAnimationInfo horizontal_range_layer_info_;
std::unique_ptr<PointScanLayer> horizontal_range_layer_;
PointScanLayerAnimationInfo horizontal_line_layer_info_;
std::unique_ptr<PointScanLayer> horizontal_line_layer_;
PointScanLayerAnimationInfo vertical_range_layer_info_;
std::unique_ptr<PointScanLayer> vertical_range_layer_;
PointScanLayerAnimationInfo vertical_line_layer_info_;
std::unique_ptr<PointScanLayer> vertical_line_layer_;
std::unique_ptr<AccessibilityAnimationOneShot> point_scan_animation_;
PointScanState state_ = PointScanState::kOff;
};
}
#endif