#ifndef UI_TOUCH_SELECTION_TOUCH_HANDLE_H_
#define UI_TOUCH_SELECTION_TOUCH_HANDLE_H_
#include <memory>
#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "ui/events/gesture_detection/motion_event.h"
#include "ui/gfx/geometry/point_f.h"
#include "ui/gfx/geometry/rect_f.h"
#include "ui/gfx/geometry/vector2d_f.h"
#include "ui/touch_selection/touch_handle_orientation.h"
#include "ui/touch_selection/touch_selection_draggable.h"
#include "ui/touch_selection/ui_touch_selection_export.h"
namespace ui {
class TouchHandle;
class UI_TOUCH_SELECTION_EXPORT TouchHandleDrawable {
public:
virtual ~TouchHandleDrawable() {}
virtual void SetEnabled(bool enabled) = 0;
virtual void SetOrientation(ui::TouchHandleOrientation orientation,
bool mirror_vertical,
bool mirror_horizontal) = 0;
virtual void SetOrigin(const gfx::PointF& origin) = 0;
virtual void SetAlpha(float alpha) = 0;
virtual gfx::RectF GetVisibleBounds() const = 0;
virtual float GetDrawableHorizontalPaddingRatio() const = 0;
#if BUILDFLAG(IS_OHOS)
virtual void SetEdge(const gfx::PointF& top, const gfx::PointF& bottom) = 0;
#endif
};
class UI_TOUCH_SELECTION_EXPORT TouchHandleClient
: public TouchSelectionDraggableClient {
public:
~TouchHandleClient() override {}
virtual void OnHandleTapped(const TouchHandle& handle) = 0;
virtual void SetNeedsAnimate() = 0;
virtual std::unique_ptr<TouchHandleDrawable> CreateDrawable() = 0;
virtual base::TimeDelta GetMaxTapDuration() const = 0;
virtual bool IsAdaptiveHandleOrientationEnabled() const = 0;
};
class UI_TOUCH_SELECTION_EXPORT TouchHandle : public TouchSelectionDraggable {
public:
TouchHandle(TouchHandleClient* client,
TouchHandleOrientation orientation,
const gfx::RectF& viewport_rect);
TouchHandle(const TouchHandle&) = delete;
TouchHandle& operator=(const TouchHandle&) = delete;
~TouchHandle() override;
bool WillHandleTouchEvent(const MotionEvent& event) override;
bool IsActive() const override;
void SetEnabled(bool enabled);
enum AnimationStyle { ANIMATION_NONE, ANIMATION_SMOOTH };
void SetVisible(bool visible, AnimationStyle animation_style);
void SetFocus(const gfx::PointF& top, const gfx::PointF& bottom);
void SetViewportRect(const gfx::RectF& viewport_rect);
void SetOrientation(TouchHandleOrientation orientation);
bool Animate(base::TimeTicks frame_time);
gfx::RectF GetVisibleBounds() const;
void UpdateHandleLayout();
void SetTransparent();
const gfx::PointF& focus_bottom() const { return focus_bottom_; }
TouchHandleOrientation orientation() const { return orientation_; }
float alpha() const { return alpha_; }
#if BUILDFLAG(IS_OHOS)
void SetEdge(const gfx::PointF& top, const gfx::PointF& bottom);
const gfx::PointF& focus_top() const { return focus_top_; }
bool GetEnabled() const { return enabled_; }
#endif
#ifdef OHOS_CLIPBOARD
void ResetPositionAfterDragEnd();
bool GetVisible() const { return is_visible_; }
#endif
#ifdef OHOS_EX_TOPCONTROLS
const gfx::RectF& viewport() const { return viewport_rect_; }
#endif
private:
gfx::PointF ComputeHandleOrigin() const;
void BeginDrag();
void EndDrag();
void BeginFade();
void EndFade();
void SetAlpha(float alpha);
void SetUpdateLayoutRequired();
std::unique_ptr<TouchHandleDrawable> drawable_;
const raw_ptr<TouchHandleClient> client_;
gfx::PointF focus_bottom_;
gfx::PointF focus_top_;
gfx::RectF viewport_rect_;
TouchHandleOrientation orientation_;
TouchHandleOrientation deferred_orientation_;
gfx::PointF touch_down_position_;
gfx::Vector2dF touch_drag_offset_;
base::TimeTicks touch_down_time_;
base::TimeTicks fade_end_time_;
gfx::PointF fade_start_position_;
float alpha_;
bool animate_deferred_fade_;
bool enabled_;
bool is_visible_;
bool is_dragging_;
bool is_drag_within_tap_region_;
bool is_handle_layout_update_required_;
bool mirror_vertical_;
bool mirror_horizontal_;
float handle_horizontal_padding_;
};
}
#endif