1 /*
2  * Copyright (C) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef ACCESSIBILITY_ZOOM_GESTURE_H
17 #define ACCESSIBILITY_ZOOM_GESTURE_H
18 
19 #include "accessibility_event_transmission.h"
20 #include "event_handler.h"
21 #include "pointer_event.h"
22 #include "dm_common.h"
23 
24 namespace OHOS {
25 namespace Accessibility {
26 enum ACCESSIBILITY_ZOOM_STATE {
27     READY_STATE,
28     ZOOMIN_STATE,
29     SLIDING_STATE
30 };
31 
32 enum ACCESSIBILITY_ZOOM_GESTURE_MSG : uint32_t {
33     MULTI_TAP_MSG,
34 };
35 
36 struct ZOOM_FOCUS_COORDINATE {
37     float centerX;
38     float centerY;
39 };
40 
41 class AccessibilityZoomGesture : public EventTransmission {
42 public:
43     AccessibilityZoomGesture();
44     ~AccessibilityZoomGesture() = default;
45 
46     virtual bool OnPointerEvent(MMI::PointerEvent &event) override;
47     void DestroyEvents() override;
48 
49 private:
50     class ZoomGestureEventHandler : public AppExecFwk::EventHandler {
51     public:
52         ZoomGestureEventHandler(const std::shared_ptr<AppExecFwk::EventRunner> &runner,
53             AccessibilityZoomGesture &zoomGesture);
54         virtual ~ZoomGestureEventHandler() = default;
55 
56         virtual void ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event) override;
57     private:
58         AccessibilityZoomGesture &zoomGesture_;
59     };
60 
61     void TransferState(ACCESSIBILITY_ZOOM_STATE state);
62     void CacheEvents(MMI::PointerEvent &event);
63     void SendCacheEventsToNext();
64     void ClearCacheEventsAndMsg();
65     void RecognizeInReadyState(MMI::PointerEvent &event);
66     void RecognizeInZoomStateDownEvent(MMI::PointerEvent &event);
67     void RecognizeInZoomState(MMI::PointerEvent &event);
68     void RecognizeInSlidingState(MMI::PointerEvent &event);
69     void RecognizeScroll(MMI::PointerEvent &event, ZOOM_FOCUS_COORDINATE &coordinate);
70     void RecognizeScale(MMI::PointerEvent &event, ZOOM_FOCUS_COORDINATE &coordinate);
71     void CalcFocusCoordinate(MMI::PointerEvent &event, ZOOM_FOCUS_COORDINATE &coordinate);
72     float CalcScaleSpan(MMI::PointerEvent &event, ZOOM_FOCUS_COORDINATE coordinate);
73     bool IsTapOnInputMethod(MMI::PointerEvent &event);
74     bool IsDownValid();
75     bool IsUpValid();
76     bool IsMoveValid();
77     bool IsLongPress();
78     bool IsKnuckles(MMI::PointerEvent &event);
79     bool IsTripleTaps();
80     void OnTripleTaps(MMI::PointerEvent &event);
81     int64_t CalcIntervalTime(std::shared_ptr<MMI::PointerEvent> firstEvent,
82         std::shared_ptr<MMI::PointerEvent> secondEvent);
83     float CalcSeparationDistance(std::shared_ptr<MMI::PointerEvent> firstEvent,
84         std::shared_ptr<MMI::PointerEvent> secondEvent);
85     void GetWindowParam();
86     void OnZoom(int32_t centerX, int32_t centerY);
87     void OffZoom();
88     void OnScroll(float offsetX, float offsetY);
89     void OnScale(float scaleSpan);
90     void Clear();
91 
92     bool startScaling_ = false;
93     bool isLongPress_ = false;
94     float preSpan_ = 0.0f;
95     float lastSpan_ = 0.0f;
96     float screenSpan_ = 0.0f;
97     float lastScrollFocusX_ = 0.0f;
98     float lastScrollFocusY_ = 0.0f;
99     float tapDistance_ = 0.0f;
100     float multiTapDistance_ = 0.0f;
101     uint64_t screenId_ = -1;
102     uint32_t screenWidth_ = 0;
103     uint32_t screenHeight_ = 0;
104     float anchorPointX_ = 0.0f;
105     float anchorPointY_ = 0.0f;
106     float scaleRatio_ = 2.0f;
107     int32_t downPid_ = -1;
108     ACCESSIBILITY_ZOOM_STATE state_ = READY_STATE;
109     OHOS::Rosen::DisplayOrientation orientation_ =
110         OHOS::Rosen::DisplayOrientation::UNKNOWN;
111     std::shared_ptr<MMI::PointerEvent> preLastDownEvent_ = nullptr;
112     std::shared_ptr<MMI::PointerEvent> lastDownEvent_ = nullptr;
113     std::shared_ptr<MMI::PointerEvent> preLastUpEvent_ = nullptr;
114     std::shared_ptr<MMI::PointerEvent> lastUpEvent_ = nullptr;
115     std::shared_ptr<MMI::PointerEvent> currentMoveEvent_ = nullptr;
116     std::shared_ptr<MMI::PointerEvent> longPressDownEvent_ = nullptr;
117     std::shared_ptr<ZoomGestureEventHandler> zoomGestureEventHandler_ = nullptr;
118     std::vector<std::shared_ptr<MMI::PointerEvent>> cacheEvents_;
119 };
120 } // namespace Accessibility
121 } // namespace OHOS
122 #endif // ACCESSIBILITY_ZOOM_GESTURE_H