1 /*
2 * Copyright (c) 2024 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 #include "touch_gesture_adapter.h"
17
18 #include "input_event_handler.h"
19
20 #undef MMI_LOG_DOMAIN
21 #define MMI_LOG_DOMAIN MMI_LOG_HANDLER
22 #undef MMI_LOG_TAG
23 #define MMI_LOG_TAG "TouchGestureAdapter"
24
25 namespace OHOS {
26 namespace MMI {
TouchGestureAdapter(TouchGestureType type,std::shared_ptr<TouchGestureAdapter> next)27 TouchGestureAdapter::TouchGestureAdapter(TouchGestureType type, std::shared_ptr<TouchGestureAdapter> next)
28 : gestureType_(type), nextAdapter_(next)
29 {}
30
SetGestureCondition(bool flag,TouchGestureType type,int32_t fingers)31 void TouchGestureAdapter::SetGestureCondition(bool flag, TouchGestureType type, int32_t fingers)
32 {
33 static bool isAll = false;
34 if (gestureDetector_ != nullptr &&
35 (type == gestureType_ || type == TOUCH_GESTURE_TYPE_ALL)) {
36 if (type == TOUCH_GESTURE_TYPE_ALL) {
37 isAll = flag;
38 }
39 if (flag) {
40 gestureDetector_->AddGestureFingers(fingers);
41 }
42 if (!flag && !isAll) {
43 gestureDetector_->RemoveGestureFingers(fingers);
44 }
45 }
46 if (nextAdapter_ != nullptr) {
47 nextAdapter_->SetGestureCondition(flag, type, fingers);
48 }
49 }
50
process(std::shared_ptr<PointerEvent> event)51 void TouchGestureAdapter::process(std::shared_ptr<PointerEvent> event)
52 {
53 OnTouchEvent(event);
54 if (ShouldDeliverToNext() && nextAdapter_ != nullptr) {
55 nextAdapter_->process(event);
56 }
57 }
58
HandleGestureWindowEmerged(int32_t windowId,std::shared_ptr<PointerEvent> lastTouchEvent)59 void TouchGestureAdapter::HandleGestureWindowEmerged(int32_t windowId, std::shared_ptr<PointerEvent> lastTouchEvent)
60 {
61 if (gestureDetector_ != nullptr) {
62 gestureDetector_->HandleGestureWindowEmerged(windowId, lastTouchEvent);
63 }
64 if (nextAdapter_ != nullptr) {
65 nextAdapter_->HandleGestureWindowEmerged(windowId, lastTouchEvent);
66 }
67 }
68
Init()69 void TouchGestureAdapter::Init()
70 {
71 if (gestureDetector_ == nullptr) {
72 gestureDetector_ = std::make_shared<TouchGestureDetector>(gestureType_, shared_from_this());
73 }
74 if (nextAdapter_ != nullptr) {
75 nextAdapter_->Init();
76 }
77 }
78
GetGestureFactory()79 std::shared_ptr<TouchGestureAdapter> TouchGestureAdapter::GetGestureFactory()
80 {
81 std::shared_ptr<TouchGestureAdapter> pinch =
82 std::make_shared<TouchGestureAdapter>(TOUCH_GESTURE_TYPE_PINCH, nullptr);
83 std::shared_ptr<TouchGestureAdapter> swipe =
84 std::make_shared<TouchGestureAdapter>(TOUCH_GESTURE_TYPE_SWIPE, pinch);
85 swipe->Init();
86 return swipe;
87 }
88
OnTouchEvent(std::shared_ptr<PointerEvent> event)89 void TouchGestureAdapter::OnTouchEvent(std::shared_ptr<PointerEvent> event)
90 {
91 CHKPV(event);
92 CHKPV(gestureDetector_);
93 if (event->GetSourceType() != PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
94 return;
95 }
96 shouldDeliverToNext_ = true;
97
98 if (!gestureStarted_ && (event->GetPointerAction() == PointerEvent::POINTER_ACTION_UP)) {
99 gestureDetector_->OnTouchEvent(event);
100 return;
101 }
102 if (gestureType_ == TOUCH_GESTURE_TYPE_SWIPE) {
103 OnSwipeGesture(event);
104 } else if (gestureType_ == TOUCH_GESTURE_TYPE_PINCH) {
105 OnPinchGesture(event);
106 }
107 if (gestureStarted_ && (event->GetPointerAction() == PointerEvent::POINTER_ACTION_MOVE)) {
108 shouldDeliverToNext_ = false;
109 }
110 }
111
OnSwipeGesture(std::shared_ptr<PointerEvent> event)112 void TouchGestureAdapter::OnSwipeGesture(std::shared_ptr<PointerEvent> event)
113 {
114 CHKPV(gestureDetector_);
115 if (state_ == GestureState::PINCH) {
116 return;
117 }
118 gestureStarted_ = gestureDetector_->OnTouchEvent(event);
119 state_ = gestureStarted_ ? GestureState::SWIPE : GestureState::IDLE;
120 }
121
OnPinchGesture(std::shared_ptr<PointerEvent> event)122 void TouchGestureAdapter::OnPinchGesture(std::shared_ptr<PointerEvent> event)
123 {
124 CHKPV(gestureDetector_);
125 if (state_ == GestureState::SWIPE) {
126 return;
127 }
128 gestureStarted_ = gestureDetector_->OnTouchEvent(event);
129 state_ = gestureStarted_ ? GestureState::PINCH : GestureState::IDLE;
130 }
131
OnGestureEvent(std::shared_ptr<PointerEvent> event,GestureMode mode)132 bool TouchGestureAdapter::OnGestureEvent(std::shared_ptr<PointerEvent> event, GestureMode mode)
133 {
134 #ifdef OHOS_BUILD_ENABLE_MONITOR
135 auto pointEvent = std::make_shared<PointerEvent>(*event);
136 pointEvent->UpdateId();
137 pointEvent->SetHandlerEventType(HANDLE_EVENT_TYPE_TOUCH_GESTURE);
138 switch (mode) {
139 case GestureMode::ACTION_SWIPE_DOWN:
140 pointEvent->SetPointerAction(PointerEvent::TOUCH_ACTION_SWIPE_DOWN);
141 break;
142 case GestureMode::ACTION_SWIPE_UP:
143 pointEvent->SetPointerAction(PointerEvent::TOUCH_ACTION_SWIPE_UP);
144 break;
145 case GestureMode::ACTION_SWIPE_LEFT:
146 pointEvent->SetPointerAction(PointerEvent::TOUCH_ACTION_SWIPE_LEFT);
147 break;
148 case GestureMode::ACTION_SWIPE_RIGHT:
149 pointEvent->SetPointerAction(PointerEvent::TOUCH_ACTION_SWIPE_RIGHT);
150 break;
151 case GestureMode::ACTION_PINCH_CLOSED:
152 pointEvent->SetPointerAction(PointerEvent::TOUCH_ACTION_PINCH_CLOSEED);
153 break;
154 case GestureMode::ACTION_PINCH_OPENED:
155 pointEvent->SetPointerAction(PointerEvent::TOUCH_ACTION_PINCH_OPENED);
156 break;
157 case GestureMode::ACTION_GESTURE_END:
158 pointEvent->SetPointerAction(PointerEvent::TOUCH_ACTION_GESTURE_END);
159 break;
160 default:
161 MMI_HILOGW("unknow mode:%{public}d", mode);
162 return false;
163 }
164 auto monitor = InputHandler->GetMonitorHandler();
165 CHKPF(monitor);
166 monitor->HandlePointerEvent(pointEvent);
167 #endif // OHOS_BUILD_ENABLE_MONITOR
168 return true;
169 }
170
OnGestureTrend(std::shared_ptr<PointerEvent> event)171 void TouchGestureAdapter::OnGestureTrend(std::shared_ptr<PointerEvent> event)
172 {
173 WIN_MGR->CancelAllTouches(event);
174 }
175 } // namespace MMI
176 } // namespace OHOS