1 /* 2 * Copyright (c) 2021-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 FOUNDATION_ACE_FRAMEWORKS_CORE_GESTURES_GESTURE_RECOGNIZER_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_GESTURES_GESTURE_RECOGNIZER_H 18 19 #include <map> 20 #include <memory> 21 #include <set> 22 23 #include "gesture_referee.h" 24 25 #include "core/event/axis_event.h" 26 #include "core/event/touch_event.h" 27 #include "core/gestures/gesture_event.h" 28 29 namespace OHOS::Ace { 30 31 enum class DetectState { READY, DETECTING, DETECTED }; 32 33 enum class RefereeState { DETECTING, PENDING, BLOCKED, SUCCEED, FAIL }; 34 35 class ACE_EXPORT GestureRecognizer : public TouchEventTarget { 36 DECLARE_ACE_TYPE(GestureRecognizer, TouchEventTarget) 37 38 public: 39 // Called when request of handling gesture sequence is accepted by gesture referee. 40 virtual void OnAccepted(size_t touchId) = 0; 41 42 // Called when request of handling gesture sequence is rejected by gesture referee. 43 virtual void OnRejected(size_t touchId) = 0; 44 45 // Called when request of handling gesture sequence is rejected by gesture referee. OnPending(size_t touchId)46 virtual void OnPending(size_t touchId) {} 47 48 // Reconiciles the state from the given recognizer into this. The 49 // implementation must check that the given recognizer type matches the 50 // current one. The return value should be false if the reconciliation fails 51 // and true if it succeeds ReconcileFrom(const RefPtr<GestureRecognizer> & recognizer)52 virtual bool ReconcileFrom(const RefPtr<GestureRecognizer>& recognizer) 53 { 54 return true; 55 } 56 DispatchEvent(const TouchEvent & point)57 bool DispatchEvent(const TouchEvent& point) override 58 { 59 return true; 60 } 61 bool HandleEvent(const TouchEvent& point) override; 62 bool HandleEvent(const AxisEvent& event) override; 63 GetPriority()64 GesturePriority GetPriority() const 65 { 66 return priority_; 67 } 68 SetPriority(GesturePriority priority)69 void SetPriority(GesturePriority priority) 70 { 71 priority_ = priority; 72 } 73 GetPriorityMask()74 GestureMask GetPriorityMask() const 75 { 76 return priorityMask_; 77 } 78 SetPriorityMask(GestureMask priorityMask)79 void SetPriorityMask(GestureMask priorityMask) 80 { 81 priorityMask_ = priorityMask; 82 } 83 GetRefereeState()84 RefereeState GetRefereeState() const 85 { 86 return refereeState_; 87 } 88 SetRefereeState(RefereeState refereeState)89 void SetRefereeState(RefereeState refereeState) 90 { 91 refereeState_ = refereeState; 92 } 93 GetDetectState()94 DetectState GetDetectState() const 95 { 96 return state_; 97 } 98 SetGestureGroup(const WeakPtr<GestureRecognizer> & gestureGroup)99 void SetGestureGroup(const WeakPtr<GestureRecognizer>& gestureGroup) 100 { 101 gestureGroup_ = gestureGroup; 102 } 103 SetOnAction(const GestureEventFunc & onAction)104 void SetOnAction(const GestureEventFunc& onAction) 105 { 106 onAction_ = std::make_unique<GestureEventFunc>(onAction); 107 } 108 SetOnActionStart(const GestureEventFunc & onActionStart)109 void SetOnActionStart(const GestureEventFunc& onActionStart) 110 { 111 onActionStart_ = std::make_unique<GestureEventFunc>(onActionStart); 112 } 113 SetOnActionUpdate(const GestureEventFunc & onActionUpdate)114 void SetOnActionUpdate(const GestureEventFunc& onActionUpdate) 115 { 116 onActionUpdate_ = std::make_unique<GestureEventFunc>(onActionUpdate); 117 } 118 SetOnActionEnd(const GestureEventFunc & onActionEnd)119 void SetOnActionEnd(const GestureEventFunc& onActionEnd) 120 { 121 onActionEnd_ = std::make_unique<GestureEventFunc>(onActionEnd); 122 } 123 SetOnActionCancel(const GestureEventNoParameter & onActionCancel)124 void SetOnActionCancel(const GestureEventNoParameter& onActionCancel) 125 { 126 onActionCancel_ = std::make_unique<GestureEventNoParameter>(onActionCancel); 127 } 128 SendCancelMsg()129 inline void SendCancelMsg() 130 { 131 if (onActionCancel_ && *onActionCancel_) { 132 (*onActionCancel_)(); 133 } 134 } 135 SetIsExternalGesture(bool isExternalGesture)136 void SetIsExternalGesture(bool isExternalGesture) 137 { 138 isExternalGesture_ = isExternalGesture; 139 } 140 GetIsExternalGesture()141 bool GetIsExternalGesture() const 142 { 143 return isExternalGesture_; 144 } 145 146 protected: 147 virtual void HandleTouchDownEvent(const TouchEvent& event) = 0; 148 virtual void HandleTouchUpEvent(const TouchEvent& event) = 0; 149 virtual void HandleTouchMoveEvent(const TouchEvent& event) = 0; 150 virtual void HandleTouchCancelEvent(const TouchEvent& event) = 0; HandleTouchDownEvent(const AxisEvent & event)151 virtual void HandleTouchDownEvent(const AxisEvent& event) {} HandleTouchUpEvent(const AxisEvent & event)152 virtual void HandleTouchUpEvent(const AxisEvent& event) {} HandleTouchMoveEvent(const AxisEvent & event)153 virtual void HandleTouchMoveEvent(const AxisEvent& event) {} HandleTouchCancelEvent(const AxisEvent & event)154 virtual void HandleTouchCancelEvent(const AxisEvent& event) {} 155 156 virtual void AddToReferee(size_t touchId, const RefPtr<GestureRecognizer>& recognizer); 157 virtual void DelFromReferee(size_t touchId, const RefPtr<GestureRecognizer>& recognizer); 158 virtual void BatchAdjudicate( 159 const std::set<size_t>& touchIds, const RefPtr<GestureRecognizer>& recognizer, GestureDisposal disposal); 160 161 DetectState state_ { DetectState::READY }; 162 RefereeState refereeState_ { RefereeState::DETECTING }; 163 GesturePriority priority_ = GesturePriority::Low; 164 GestureMask priorityMask_ = GestureMask::Normal; 165 166 int32_t fingers_ = 1; 167 std::list<FingerInfo> fingerList_; 168 bool isExternalGesture_ = false; 169 170 std::unique_ptr<GestureEventFunc> onAction_; 171 std::unique_ptr<GestureEventFunc> onActionStart_; 172 std::unique_ptr<GestureEventFunc> onActionUpdate_; 173 std::unique_ptr<GestureEventFunc> onActionEnd_; 174 std::unique_ptr<GestureEventNoParameter> onActionCancel_; 175 176 int64_t deviceId_ = 0; 177 SourceType deviceType_ = SourceType::NONE; 178 179 private: 180 WeakPtr<GestureRecognizer> gestureGroup_; 181 }; 182 183 } // namespace OHOS::Ace 184 185 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_GESTURES_GESTURE_RECOGNIZER_H 186