• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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