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_COMPONENTS_TOUCH_LISTENER_RENDER_TOUCH_LISTENER_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_TOUCH_LISTENER_RENDER_TOUCH_LISTENER_H
18 
19 #include "base/utils/event_callback.h"
20 #include "base/utils/macros.h"
21 #include "core/components/proxy/render_item_proxy.h"
22 #include "core/gestures/raw_recognizer.h"
23 #include "core/gestures/swipe_recognizer.h"
24 #include "core/pipeline/base/component.h"
25 #include "core/pipeline/base/render_node.h"
26 
27 namespace OHOS::Ace {
28 
29 class ACE_EXPORT RenderTouchListener final : public RenderProxy, public TouchEventTarget {
30     DECLARE_ACE_TYPE(RenderTouchListener, RenderProxy, TouchEventTarget);
31 
32 public:
33     RenderTouchListener();
34     ~RenderTouchListener() override = default;
35     static RefPtr<RenderNode> Create();
36     void Update(const RefPtr<Component>& component) override;
37 
SetOnTouchDown(const OnTouchEventCallback & onTouchDown)38     void SetOnTouchDown(const OnTouchEventCallback& onTouchDown) const
39     {
40         if (onTouchDown) {
41             rawRecognizer_->SetOnTouchDown(onTouchDown);
42         }
43     }
SetOnTouchMove(const OnTouchEventCallback & onTouchMove)44     void SetOnTouchMove(const OnTouchEventCallback& onTouchMove) const
45     {
46         if (onTouchMove) {
47             rawRecognizer_->SetOnTouchMove(onTouchMove);
48         }
49     }
SetOnTouchUp(const OnTouchEventCallback & onTouchUp)50     void SetOnTouchUp(const OnTouchEventCallback& onTouchUp) const
51     {
52         if (onTouchUp) {
53             rawRecognizer_->SetOnTouchUp(onTouchUp);
54         }
55     }
SetOnTouchCancel(const OnTouchEventCallback & onTouchCancel)56     void SetOnTouchCancel(const OnTouchEventCallback& onTouchCancel) const
57     {
58         if (onTouchCancel) {
59             rawRecognizer_->SetOnTouchCancel(onTouchCancel);
60         }
61     }
SetOnSwipe(const SwipeCallback & onSwipeCallback)62     void SetOnSwipe(const SwipeCallback& onSwipeCallback)
63     {
64         if (onSwipeCallback) {
65             if (!swipeRecognizer_) {
66                 swipeRecognizer_ = AceType::MakeRefPtr<SwipeRecognizer>();
67             }
68         }
69     }
70 
71     bool GetVisible() const override;
72 
73     bool DispatchEvent(const TouchEvent& point) override;
74     bool HandleEvent(const TouchEvent& point) override;
75     bool TriggerTouchCallBack(const TouchEvent& changedPoint);
76 
SetOnTouchFocusEventCallback(const std::function<void (void)> & onTouchFocusEventCallback)77     void SetOnTouchFocusEventCallback(const std::function<void(void)>& onTouchFocusEventCallback)
78     {
79         onTouchFocusEventCallback_ = onTouchFocusEventCallback;
80     }
81 
82 protected:
83     void OnTouchTestHit(
84         const Offset& coordinateOffset, const TouchRestrict& touchRestrict, TouchTestResult& result) override;
85 
86 private:
87     RefPtr<RawRecognizer> rawRecognizer_;
88     RefPtr<SwipeRecognizer> swipeRecognizer_;
89 
90     bool isVisible_ = true;
91     Offset coordinateOffset_;
92     std::function<void(const std::shared_ptr<TouchEventInfo>&)> onTouchEventCallback_;
93     std::function<void(void)> onTouchFocusEventCallback_;
94     std::map<int, TouchEvent> touchPointMap_;
95 };
96 
97 } // namespace OHOS::Ace
98 
99 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_TOUCH_LISTENER_RENDER_TOUCH_LISTENER_H
100