1 /*
2 * Copyright (C) 2025 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 // LCOV_EXCL_START
17 #include "window_magnification_gesture.h"
18 #include "utils.h"
19 #include "accessible_ability_manager_service.h"
20 #include "magnification_menu_manager.h"
21 #include "accessibility_window_manager.h"
22 #ifdef OHOS_BUILD_ENABLE_POWER_MANAGER
23 #include "accessibility_power_manager.h"
24 #endif
25
26 namespace OHOS {
27 namespace Accessibility {
28 namespace {
29 constexpr float TAP_MIN_DISTANCE = 8.0f;
30 constexpr float DOUBLE_TAP_SLOP = 100.0f;
31 constexpr int32_t HANDLER = 0;
32 constexpr int32_t SWITCH_MENU = -1;
33 constexpr uint32_t TAP_COUNT_THREE = 3;
34 } // namespace
35
InitGestureFuncMap()36 void WindowMagnificationGesture::InitGestureFuncMap()
37 {
38 handleEventFuncMap_ = {
39 {MagnificationGestureState::READY_STATE, {
40 {MMI::PointerEvent::POINTER_ACTION_DOWN, BIND(HandleReadyStateDown)},
41 {MMI::PointerEvent::POINTER_ACTION_UP, BIND(HandleReadyStateUp)},
42 {MMI::PointerEvent::POINTER_ACTION_MOVE, BIND(HandleReadyStateMove)},
43 {MMI::PointerEvent::POINTER_ACTION_CANCEL, BIND(HandleReadyStateCancel)},
44 }
45 },
46 {MagnificationGestureState::READY_STATE_ONE_FINGER_DOWN, {
47 {MMI::PointerEvent::POINTER_ACTION_DOWN, BIND(HandleReadyStateOneFingerDownStateDown)},
48 {MMI::PointerEvent::POINTER_ACTION_UP, BIND(HandleReadyStateOneFingerDownStateUp)},
49 {MMI::PointerEvent::POINTER_ACTION_MOVE, BIND(HandleReadyStateOneFingerDownStateMove)},
50 {MMI::PointerEvent::POINTER_ACTION_CANCEL, BIND(HandleReadyStateOneFingerDownStatCancel)},
51 }
52 },
53 {MagnificationGestureState::READY_STATE_ONE_FINGER_TAP, {
54 {MMI::PointerEvent::POINTER_ACTION_DOWN, BIND(HandleReadyStateOneFingerTapDown)},
55 }
56 },
57 {MagnificationGestureState::ZOOMIN_STATE, {
58 {MMI::PointerEvent::POINTER_ACTION_DOWN, BIND(HandleZoomInStateDown)},
59 {MMI::PointerEvent::POINTER_ACTION_UP, BIND(HandleZoomInStateUp)},
60 {MMI::PointerEvent::POINTER_ACTION_MOVE, BIND(HandleZoomInStateMove)},
61 }
62 },
63 {MagnificationGestureState::ZOOMIN_STATE_ONE_FINGER_DOWN, {
64 {MMI::PointerEvent::POINTER_ACTION_DOWN, BIND(HandleZoomInStateOneFingerDownStateDown)},
65 {MMI::PointerEvent::POINTER_ACTION_UP, BIND(HandleZoomInStateOneFingerDownStateUp)},
66 {MMI::PointerEvent::POINTER_ACTION_MOVE, BIND(HandleZoomInStateOneFingerDownStateMove)},
67 }
68 },
69 {MagnificationGestureState::ZOOMIN_STATE_ONE_FINGER_TAP, {
70 {MMI::PointerEvent::POINTER_ACTION_DOWN, BIND(HandleZoomInStateOneFingerTapDown)},
71 }
72 },
73 {MagnificationGestureState::ZOOMIN_STATE_TWO_FINGERS_DOWN, {
74 {MMI::PointerEvent::POINTER_ACTION_UP, BIND(HandleTwoFingersDownStateUp)},
75 {MMI::PointerEvent::POINTER_ACTION_MOVE, BIND(HandleTwoFingersDownStateMove)},
76 }
77 },
78 {MagnificationGestureState::SLIDING_STATE, {
79 {MMI::PointerEvent::POINTER_ACTION_DOWN, BIND(HandleSlidingStateDown)},
80 {MMI::PointerEvent::POINTER_ACTION_UP, BIND(HandleSlidingStateUp)},
81 {MMI::PointerEvent::POINTER_ACTION_MOVE, BIND(HandleSlidingStateMove)},
82 }
83 },
84 {MagnificationGestureState::MENU_SLIDING_STATE, {
85 {MMI::PointerEvent::POINTER_ACTION_UP, BIND(HandleMenuSlidingStateUp)},
86 {MMI::PointerEvent::POINTER_ACTION_MOVE, BIND(HandleMenuSlidingStateMove)},
87 }
88 },
89 {MagnificationGestureState::DRAGGING_STATE, {
90 {MMI::PointerEvent::POINTER_ACTION_UP, BIND(HandleDraggingStateUp)},
91 {MMI::PointerEvent::POINTER_ACTION_MOVE, BIND(HandleDraggingStateMove)},
92 }
93 }
94 };
95 }
96
MagnificationGestureEventHandler(const std::shared_ptr<AppExecFwk::EventRunner> & runner,WindowMagnificationGesture & server)97 MagnificationGestureEventHandler::MagnificationGestureEventHandler(
98 const std::shared_ptr<AppExecFwk::EventRunner> &runner,
99 WindowMagnificationGesture &server) : AppExecFwk::EventHandler(runner), server_(server)
100 {
101 }
102
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)103 void MagnificationGestureEventHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
104 {
105 HILOG_DEBUG();
106
107 MagnificationGestureMsg msg = static_cast<MagnificationGestureMsg>(event->GetInnerEventId());
108 int64_t param = event->GetParam();
109 HILOG_DEBUG("handler process event id = %{public}d, GestureState is %{public}d, param = %{public}d",
110 event->GetInnerEventId(), server_.GetGestureState(), static_cast<int32_t>(param));
111 switch (msg) {
112 case MagnificationGestureMsg::SINGLE_TAP_FAIL_MSG:
113 if (server_.GetTripleDown()) {
114 server_.OnDrag();
115 } else {
116 if (!server_.GetTapOnMenu()) {
117 server_.SendCacheEventsToNext();
118 server_.ResetTapCount();
119 }
120 // If this event is not canceled within 100ms, it is cleared.
121 server_.SetGestureState(static_cast<MagnificationGestureState>(event->GetParam()), HANDLER);
122 }
123 break;
124 case MagnificationGestureMsg::TRIPLE_TAP_FAIL_MSG:
125 // If no next up comes in more than 250ms, clear it.
126 server_.SendCacheEventsToNext();
127 server_.ResetTapCount();
128 server_.SetGestureState(static_cast<MagnificationGestureState>(event->GetParam()), HANDLER);
129 break;
130 case MagnificationGestureMsg::LONG_PRESS_MSG:
131 // If it is not cleared within 200ms, it indicates that the current action is a long press.
132 if (server_.GetTapOnMenu()) {
133 server_.SetGestureState(MagnificationGestureState::MENU_SLIDING_STATE, HANDLER);
134 } else {
135 server_.SetGestureState(MagnificationGestureState::SLIDING_STATE, HANDLER);
136 }
137 break;
138 default:
139 break;
140 }
141 }
142
WindowMagnificationGesture(std::shared_ptr<WindowMagnificationManager> windowMagnificationManager,std::shared_ptr<MagnificationMenuManager> menuManager)143 WindowMagnificationGesture::WindowMagnificationGesture(
144 std::shared_ptr<WindowMagnificationManager> windowMagnificationManager,
145 std::shared_ptr<MagnificationMenuManager> menuManager)
146 : windowMagnificationManager_(windowMagnificationManager), menuManager_(menuManager)
147 {
148 HILOG_DEBUG();
149 runner_ = Singleton<AccessibleAbilityManagerService>::GetInstance().GetInputManagerRunner();
150 if (!runner_) {
151 HILOG_ERROR("get runner failed");
152 return;
153 }
154
155 handler_ = std::make_shared<MagnificationGestureEventHandler>(runner_, *this);
156 if (!handler_) {
157 HILOG_ERROR("create event handler failed");
158 return;
159 }
160
161 InitGestureFuncMap();
162
163 #ifdef OHOS_BUILD_ENABLE_DISPLAY_MANAGER
164 AccessibilityDisplayManager &displayMgr = Singleton<AccessibilityDisplayManager>::GetInstance();
165 auto display = displayMgr.GetDefaultDisplay();
166 if (display == nullptr) {
167 HILOG_ERROR("get display is nullptr");
168 return;
169 }
170 moveThreshold_ = CalculateMoveThreshold(display->GetDpi());
171 float densityPixels = display->GetVirtualPixelRatio();
172 multiTapDistance_ = densityPixels * DOUBLE_TAP_SLOP + 0.5f;
173 tapDistance_ = TAP_MIN_DISTANCE;
174 #else
175 HILOG_DEBUG("not support display manager");
176 moveThreshold_ = 1;
177 multiTapDistance_ = 1 * DOUBLE_TAP_SLOP + 0.5f;
178 #endif
179 }
180
OnPointerEvent(MMI::PointerEvent & event)181 bool WindowMagnificationGesture::OnPointerEvent(MMI::PointerEvent &event)
182 {
183 if (event.GetPointerAction() == MMI::PointerEvent::POINTER_ACTION_DOWN ||
184 event.GetPointerAction() == MMI::PointerEvent::POINTER_ACTION_UP) {
185 HILOG_INFO("PointerAction: %{public}d.", event.GetPointerAction());
186 }
187
188 if (needBypassPointerEvent(event)) {
189 EventTransmission::OnPointerEvent(event);
190 return false;
191 }
192 OnPointerEventExcute(event);
193 return true;
194 }
195
needBypassPointerEvent(MMI::PointerEvent & event)196 bool WindowMagnificationGesture::needBypassPointerEvent(MMI::PointerEvent &event)
197 {
198 HILOG_DEBUG("shieldZoomGestureFlag %{public}d.", shieldZoomGestureFlag_);
199 if (shieldZoomGestureFlag_) {
200 return true;
201 }
202 if (event.GetSourceType() != MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
203 return true;
204 }
205 if (event.GetPointerId() == SCROLL_SHOT_POINTER_ID) {
206 HILOG_DEBUG("scrollshot injected.");
207 return true;
208 }
209 return false;
210 }
211
OnPointerEventExcute(MMI::PointerEvent & event)212 void WindowMagnificationGesture::OnPointerEventExcute(MMI::PointerEvent &event)
213 {
214 if (GetGestureState() == MagnificationGestureState::PASSING_THROUGH) {
215 HandlePassingThroughState(event);
216 return;
217 }
218
219 auto iter = handleEventFuncMap_.find(GetGestureState());
220 if (iter != handleEventFuncMap_.end()) {
221 auto funcMap = iter->second.find(event.GetPointerAction());
222 if (funcMap != iter->second.end()) {
223 funcMap->second(event);
224 return;
225 }
226 }
227 HILOG_ERROR("no way to handle this event.");
228 }
229
DestroyEvents()230 void WindowMagnificationGesture::DestroyEvents()
231 {
232 HILOG_DEBUG();
233 SendCacheEventsToNext();
234 ResetTapCount();
235 SetGestureState(MagnificationGestureState::READY_STATE, HANDLER);
236 if (windowMagnificationManager_ != nullptr &&
237 windowMagnificationManager_->IsMagnificationWindowShow()) {
238 HILOG_DEBUG("window gesture disable.");
239 windowMagnificationManager_->DisableWindowMagnification();
240 if (menuManager_ != nullptr) {
241 menuManager_->DisableMenuWindow();
242 }
243 isSingleTapOnWindow_ = false;
244 isTapOnHotArea_ = false;
245 Singleton<AccessibleAbilityManagerService>::GetInstance().AnnouncedForMagnification(
246 AnnounceType::ANNOUNCE_MAGNIFICATION_DISABLE);
247 }
248 }
249
CancelPostEvent(MagnificationGestureMsg msg)250 void WindowMagnificationGesture::CancelPostEvent(MagnificationGestureMsg msg)
251 {
252 if (handler_->HasInnerEvent(static_cast<uint32_t>(msg))) {
253 handler_->RemoveEvent(static_cast<uint32_t>(msg));
254 HILOG_DEBUG("innerEventID = %{public}u canceled.", static_cast<uint32_t>(msg));
255 }
256 }
257
SendCacheEventsToNext()258 void WindowMagnificationGesture::SendCacheEventsToNext()
259 {
260 HILOG_DEBUG();
261 for (auto &receivedEvent : receivedPointerEvents_) {
262 SendEventToMultimodal(receivedEvent, false, true);
263 }
264 Clear();
265 }
266
HandlePassingThroughState(MMI::PointerEvent & event)267 void WindowMagnificationGesture::HandlePassingThroughState(MMI::PointerEvent &event)
268 {
269 SendEventToMultimodal(event, false, false);
270
271 MMI::PointerEvent::PointerItem pointerItem;
272 event.GetPointerItem(event.GetPointerId(), pointerItem);
273
274 // the last finger is lifted
275 if ((event.GetPointerCount() == static_cast<int32_t>(PointerCountSize::POINTER_SIZE_1)) &&
276 (!pointerItem.IsPressed())) {
277 if (windowMagnificationManager_ != nullptr && windowMagnificationManager_->IsMagnificationWindowShow()) {
278 SetGestureState(MagnificationGestureState::ZOOMIN_STATE, event.GetPointerAction());
279 } else {
280 SetGestureState(MagnificationGestureState::READY_STATE, event.GetPointerAction());
281 }
282 }
283 }
284
HandleReadyStateDown(MMI::PointerEvent & event)285 void WindowMagnificationGesture::HandleReadyStateDown(MMI::PointerEvent &event)
286 {
287 HILOG_DEBUG();
288 if (IsKnuckles(event)) {
289 SendEventToMultimodal(event, true, false);
290 return;
291 }
292 int32_t size = event.GetPointerCount();
293 lastDownEvent_ = std::make_shared<MMI::PointerEvent>(event);
294 if (size == static_cast<int32_t>(PointerCountSize::POINTER_SIZE_1)) {
295 CancelPostEvent(MagnificationGestureMsg::SINGLE_TAP_FAIL_MSG);
296 CancelPostEvent(MagnificationGestureMsg::TRIPLE_TAP_FAIL_MSG);
297 receivedPointerEvents_.push_back(event);
298 SetGestureState(MagnificationGestureState::READY_STATE_ONE_FINGER_DOWN, event.GetPointerAction());
299 handler_->SendEvent(static_cast<uint32_t>(MagnificationGestureMsg::SINGLE_TAP_FAIL_MSG),
300 static_cast<int64_t>(MagnificationGestureState::READY_STATE),
301 static_cast<int32_t>(MagnificationTimeout::TAP_TIMEOUT));
302 return;
303 }
304
305 receivedPointerEvents_.push_back(event);
306 SendCacheEventsToNext();
307 SetGestureState(MagnificationGestureState::PASSING_THROUGH, event.GetPointerAction());
308 }
309
HandleReadyStateUp(MMI::PointerEvent & event)310 void WindowMagnificationGesture::HandleReadyStateUp(MMI::PointerEvent &event)
311 {
312 HILOG_DEBUG();
313 SendEventToMultimodal(event, false, false);
314 if (event.GetPointerCount() != static_cast<int32_t>(PointerCountSize::POINTER_SIZE_1)) {
315 SetGestureState(MagnificationGestureState::PASSING_THROUGH, event.GetPointerAction());
316 }
317 }
318
HandleReadyStateMove(MMI::PointerEvent & event)319 void WindowMagnificationGesture::HandleReadyStateMove(MMI::PointerEvent &event)
320 {
321 HILOG_DEBUG();
322 SendEventToMultimodal(event, false, false);
323 SetGestureState(MagnificationGestureState::PASSING_THROUGH, event.GetPointerAction());
324 }
325
HandleReadyStateCancel(MMI::PointerEvent & event)326 void WindowMagnificationGesture::HandleReadyStateCancel(MMI::PointerEvent &event)
327 {
328 HILOG_DEBUG();
329 SendEventToMultimodal(event, false, false);
330 if (windowMagnificationManager_ != nullptr &&
331 windowMagnificationManager_->IsMagnificationWindowShow()) {
332 SetGestureState(MagnificationGestureState::ZOOMIN_STATE, event.GetPointerAction());
333 } else {
334 SetGestureState(MagnificationGestureState::READY_STATE, event.GetPointerAction());
335 }
336 }
337
HandleReadyStateOneFingerDownStateDown(MMI::PointerEvent & event)338 void WindowMagnificationGesture::HandleReadyStateOneFingerDownStateDown(MMI::PointerEvent &event)
339 {
340 HILOG_DEBUG();
341 int32_t size = event.GetPointerCount();
342 if (size == static_cast<int32_t>(PointerCountSize::POINTER_SIZE_1)) {
343 HILOG_WARN("invalid state.");
344 } else {
345 receivedPointerEvents_.push_back(event);
346 SendCacheEventsToNext();
347 SetGestureState(MagnificationGestureState::PASSING_THROUGH, event.GetPointerAction());
348 }
349 }
350
HandleReadyStateOneFingerDownStateUp(MMI::PointerEvent & event)351 void WindowMagnificationGesture::HandleReadyStateOneFingerDownStateUp(MMI::PointerEvent &event)
352 {
353 HILOG_DEBUG();
354 receivedPointerEvents_.push_back(event);
355 CancelPostEvent(MagnificationGestureMsg::SINGLE_TAP_FAIL_MSG);
356 CancelPostEvent(MagnificationGestureMsg::TRIPLE_TAP_FAIL_MSG);
357
358 if (lastDownEvent_ == nullptr) {
359 HILOG_ERROR("lastDownEvent_ is nullptr");
360 return;
361 }
362
363 if (IsMove(event, *lastDownEvent_, tapDistance_)) {
364 SendCacheEventsToNext();
365 SetGestureState(MagnificationGestureState::PASSING_THROUGH, event.GetPointerAction());
366 return;
367 }
368 if (IsTapOnInputMethod(event)) {
369 SendCacheEventsToNext();
370 SetGestureState(MagnificationGestureState::READY_STATE, event.GetPointerAction());
371 return;
372 }
373 AddTapCount();
374 if (GetTapCount() == TAP_COUNT_THREE) {
375 isTripleDown_ = false;
376 MMI::PointerEvent::PointerItem pointerItem;
377 event.GetPointerItem(event.GetPointerId(), pointerItem);
378 OnTripleTap(pointerItem.GetDisplayX(), pointerItem.GetDisplayY());
379 Clear();
380 SetGestureState(MagnificationGestureState::ZOOMIN_STATE, event.GetPointerAction());
381 } else {
382 handler_->SendEvent(static_cast<uint32_t>(MagnificationGestureMsg::TRIPLE_TAP_FAIL_MSG),
383 static_cast<int64_t>(MagnificationGestureState::READY_STATE),
384 static_cast<int32_t>(MagnificationTimeout::DOUBLE_TAP_TIMEOUT));
385 SetGestureState(MagnificationGestureState::READY_STATE_ONE_FINGER_TAP, event.GetPointerAction());
386 }
387 }
388
HandleReadyStateOneFingerDownStateMove(MMI::PointerEvent & event)389 void WindowMagnificationGesture::HandleReadyStateOneFingerDownStateMove(MMI::PointerEvent &event)
390 {
391 HILOG_DEBUG();
392 receivedPointerEvents_.push_back(event);
393
394 if (lastDownEvent_ == nullptr) {
395 HILOG_ERROR("lastDownEvent_ is nullptr");
396 return;
397 }
398
399 if (!isTripleDown_ && GetTapCount() == TAP_COUNT_TWO) {
400 isTripleDown_ = true;
401 } else {
402 if (IsMove(event, *lastDownEvent_, tapDistance_)) {
403 CancelPostEvent(MagnificationGestureMsg::SINGLE_TAP_FAIL_MSG);
404 CancelPostEvent(MagnificationGestureMsg::TRIPLE_TAP_FAIL_MSG);
405 SendCacheEventsToNext();
406 SetGestureState(MagnificationGestureState::PASSING_THROUGH, event.GetPointerAction());
407 }
408 }
409 }
410
HandleReadyStateOneFingerDownStatCancel(MMI::PointerEvent & event)411 void WindowMagnificationGesture::HandleReadyStateOneFingerDownStatCancel(MMI::PointerEvent &event)
412 {
413 HILOG_DEBUG();
414 HandleReadyStateCancel(event);
415 }
416
HandleReadyStateOneFingerTapDown(MMI::PointerEvent & event)417 void WindowMagnificationGesture::HandleReadyStateOneFingerTapDown(MMI::PointerEvent &event)
418 {
419 HILOG_DEBUG();
420 CancelPostEvent(MagnificationGestureMsg::SINGLE_TAP_FAIL_MSG);
421 CancelPostEvent(MagnificationGestureMsg::TRIPLE_TAP_FAIL_MSG);
422 receivedPointerEvents_.push_back(event);
423
424 if (lastDownEvent_ == nullptr) {
425 HILOG_ERROR("lastDownEvent_ is nullptr");
426 return;
427 }
428
429 std::shared_ptr<MMI::PointerEvent> preLastEvent = lastDownEvent_;
430 lastDownEvent_ = std::make_shared<MMI::PointerEvent>(event);
431 if (IsMove(*preLastEvent, *lastDownEvent_, multiTapDistance_)) {
432 SendCacheEventsToNext();
433 SetGestureState(MagnificationGestureState::PASSING_THROUGH, event.GetPointerAction());
434 return;
435 }
436 handler_->SendEvent(static_cast<uint32_t>(MagnificationGestureMsg::SINGLE_TAP_FAIL_MSG),
437 static_cast<int64_t>(MagnificationGestureState::READY_STATE),
438 static_cast<int32_t>(MagnificationTimeout::TAP_TIMEOUT));
439 SetGestureState(MagnificationGestureState::READY_STATE_ONE_FINGER_DOWN, event.GetPointerAction());
440 }
441
HandleZoomInStateDown(MMI::PointerEvent & event)442 void WindowMagnificationGesture::HandleZoomInStateDown(MMI::PointerEvent &event)
443 {
444 HILOG_DEBUG();
445 if (IsKnuckles(event)) {
446 SendEventToMultimodal(event, true, false);
447 return;
448 }
449 if (windowMagnificationManager_ == nullptr) {
450 HILOG_ERROR("windowMagnificationManager_ is nullptr.");
451 SendEventToMultimodal(event, true, true);
452 return;
453 }
454
455 int32_t size = event.GetPointerCount();
456 lastDownEvent_ = std::make_shared<MMI::PointerEvent>(event);
457 MMI::PointerEvent::PointerItem pointerItem;
458 event.GetPointerItem(event.GetPointerId(), pointerItem);
459
460 if (size != static_cast<int32_t>(PointerCountSize::POINTER_SIZE_1)) {
461 return;
462 }
463 if (menuManager_ != nullptr) {
464 isTapOnMenu_ = menuManager_->IsTapOnMenu(pointerItem.GetDisplayX(), pointerItem.GetDisplayY());
465 }
466 if (isTapOnMenu_) {
467 isTapOnHotArea_ = false;
468 isSingleTapOnWindow_ = false;
469 } else {
470 isTapOnHotArea_ = windowMagnificationManager_->IsTapOnHotArea(pointerItem.GetDisplayX(),
471 pointerItem.GetDisplayY());
472 isSingleTapOnWindow_ = windowMagnificationManager_->IsTapOnMagnificationWindow(pointerItem.GetDisplayX(),
473 pointerItem.GetDisplayY());
474 if (isTapOnHotArea_) {
475 handler_->SendEvent(static_cast<uint32_t>(MagnificationGestureMsg::LONG_PRESS_MSG), 0,
476 static_cast<int32_t>(MagnificationTimeout::LONG_PRESS_TIMEOUT));
477 } else {
478 receivedPointerEvents_.push_back(event);
479 }
480 }
481
482 SetGestureState(MagnificationGestureState::ZOOMIN_STATE_ONE_FINGER_DOWN, event.GetPointerAction());
483 CancelPostEvent(MagnificationGestureMsg::SINGLE_TAP_FAIL_MSG);
484 CancelPostEvent(MagnificationGestureMsg::TRIPLE_TAP_FAIL_MSG);
485 handler_->SendEvent(static_cast<uint32_t>(MagnificationGestureMsg::SINGLE_TAP_FAIL_MSG),
486 static_cast<int64_t>(MagnificationGestureState::ZOOMIN_STATE),
487 static_cast<int32_t>(MagnificationTimeout::TAP_TIMEOUT));
488 }
489
HandleZoomInStateUp(MMI::PointerEvent & event)490 void WindowMagnificationGesture::HandleZoomInStateUp(MMI::PointerEvent &event)
491 {
492 HILOG_DEBUG();
493 SendEventToMultimodal(event, true, true);
494 }
495
HandleZoomInStateMove(MMI::PointerEvent & event)496 void WindowMagnificationGesture::HandleZoomInStateMove(MMI::PointerEvent &event)
497 {
498 HILOG_DEBUG();
499 SendEventToMultimodal(event, true, true);
500 }
501
HandleZoomInStateOneFingerDownStateDown(MMI::PointerEvent & event)502 void WindowMagnificationGesture::HandleZoomInStateOneFingerDownStateDown(MMI::PointerEvent &event)
503 {
504 HILOG_DEBUG();
505 if (windowMagnificationManager_ == nullptr) {
506 HILOG_ERROR("windowMagnificationManager_ is nullptr.");
507 return;
508 }
509
510 if (event.GetPointerCount() == static_cast<int32_t>(PointerCountSize::POINTER_SIZE_2)) {
511 CancelPostEvent(MagnificationGestureMsg::SINGLE_TAP_FAIL_MSG);
512 CancelPostEvent(MagnificationGestureMsg::TRIPLE_TAP_FAIL_MSG);
513 CancelPostEvent(MagnificationGestureMsg::LONG_PRESS_MSG);
514 isTapOnMenu_ = false;
515 isSingleTapOnWindow_ = false;
516 isTapOnHotArea_ = false;
517 lastDownEvent_ = std::make_shared<MMI::PointerEvent>(event);
518 MMI::PointerEvent::PointerItem pointerItemOne;
519 event.GetPointerItem(0, pointerItemOne);
520 bool fingerOne = windowMagnificationManager_->IsTapOnMagnificationWindow(pointerItemOne.GetDisplayX(),
521 pointerItemOne.GetDisplayY());
522
523 MMI::PointerEvent::PointerItem pointerItemTwo;
524 event.GetPointerItem(1, pointerItemTwo);
525 bool fingerTwo = windowMagnificationManager_->IsTapOnMagnificationWindow(pointerItemTwo.GetDisplayX(),
526 pointerItemTwo.GetDisplayY());
527 isDoubleFingersValid_ = fingerOne || fingerTwo;
528
529 if (isDoubleFingersValid_) {
530 SetGestureState(MagnificationGestureState::ZOOMIN_STATE_TWO_FINGERS_DOWN, event.GetPointerAction());
531 Clear();
532 } else {
533 receivedPointerEvents_.push_back(event);
534 SendCacheEventsToNext();
535 SetGestureState(MagnificationGestureState::ZOOMIN_STATE, event.GetPointerAction());
536 }
537 }
538 }
539
HandleZoomInStateOneFingerDownStateUp(MMI::PointerEvent & event)540 void WindowMagnificationGesture::HandleZoomInStateOneFingerDownStateUp(MMI::PointerEvent &event)
541 {
542 HILOG_DEBUG();
543 if (!isTapOnHotArea_) {
544 receivedPointerEvents_.push_back(event);
545 }
546 CancelPostEvent(MagnificationGestureMsg::SINGLE_TAP_FAIL_MSG);
547 CancelPostEvent(MagnificationGestureMsg::TRIPLE_TAP_FAIL_MSG);
548 CancelPostEvent(MagnificationGestureMsg::LONG_PRESS_MSG);
549
550 if (lastDownEvent_ == nullptr) {
551 HILOG_ERROR("lastDownEvent_ is nullptr");
552 return;
553 }
554
555 if (IsMove(event, *lastDownEvent_, tapDistance_)) {
556 SendCacheEventsToNext();
557 SetGestureState(MagnificationGestureState::PASSING_THROUGH, event.GetPointerAction());
558 return;
559 }
560 if (IsTapOnInputMethod(event)) {
561 SendCacheEventsToNext();
562 SetGestureState(MagnificationGestureState::ZOOMIN_STATE, event.GetPointerAction());
563 return;
564 }
565 AddTapCount();
566 if (GetTapCount() == TAP_COUNT_THREE) {
567 MMI::PointerEvent::PointerItem pointerItem;
568 event.GetPointerItem(event.GetPointerId(), pointerItem);
569 OnTripleTap(pointerItem.GetDisplayX(), pointerItem.GetDisplayY());
570 Clear();
571 SetGestureState(MagnificationGestureState::READY_STATE, event.GetPointerAction());
572 } else {
573 if (isTapOnMenu_ && menuManager_ != nullptr) {
574 menuManager_->OnMenuTap();
575 } else {
576 handler_->SendEvent(static_cast<uint32_t>(MagnificationGestureMsg::TRIPLE_TAP_FAIL_MSG),
577 static_cast<int64_t>(MagnificationGestureState::ZOOMIN_STATE),
578 static_cast<int32_t>(MagnificationTimeout::DOUBLE_TAP_TIMEOUT));
579 SetGestureState(MagnificationGestureState::ZOOMIN_STATE_ONE_FINGER_TAP, event.GetPointerAction());
580 }
581 }
582 }
583
HandleZoomInStateOneFingerDownStateMove(MMI::PointerEvent & event)584 void WindowMagnificationGesture::HandleZoomInStateOneFingerDownStateMove(MMI::PointerEvent &event)
585 {
586 HILOG_DEBUG();
587 if (event.GetPointerCount() != 1) {
588 receivedPointerEvents_.push_back(event);
589 return;
590 }
591
592 if (isTapOnMenu_ || isTapOnHotArea_) {
593 CancelPostEvent(MagnificationGestureMsg::SINGLE_TAP_FAIL_MSG);
594 } else {
595 receivedPointerEvents_.push_back(event);
596 }
597
598 if (lastDownEvent_ == nullptr) {
599 HILOG_ERROR("lastDownEvent_ is nullptr");
600 return;
601 }
602
603 if (IsMove(event, *lastDownEvent_, tapDistance_)) {
604 CancelPostEvent(MagnificationGestureMsg::SINGLE_TAP_FAIL_MSG);
605 CancelPostEvent(MagnificationGestureMsg::TRIPLE_TAP_FAIL_MSG);
606 CancelPostEvent(MagnificationGestureMsg::LONG_PRESS_MSG);
607 SendCacheEventsToNext();
608 if (isTapOnMenu_) {
609 SetGestureState(MagnificationGestureState::MENU_SLIDING_STATE, event.GetPointerAction());
610 } else if (isTapOnHotArea_) {
611 SetGestureState(MagnificationGestureState::SLIDING_STATE, event.GetPointerAction());
612 } else {
613 SetGestureState(MagnificationGestureState::PASSING_THROUGH, event.GetPointerAction());
614 }
615 }
616 }
617
HandleZoomInStateOneFingerTapDown(MMI::PointerEvent & event)618 void WindowMagnificationGesture::HandleZoomInStateOneFingerTapDown(MMI::PointerEvent &event)
619 {
620 HILOG_DEBUG();
621 CancelPostEvent(MagnificationGestureMsg::SINGLE_TAP_FAIL_MSG);
622 CancelPostEvent(MagnificationGestureMsg::TRIPLE_TAP_FAIL_MSG);
623 receivedPointerEvents_.push_back(event);
624
625 if (lastDownEvent_ == nullptr) {
626 HILOG_ERROR("lastDownEvent_ is nullptr");
627 return;
628 }
629
630 std::shared_ptr<MMI::PointerEvent> preLastEvent = lastDownEvent_;
631 lastDownEvent_ = std::make_shared<MMI::PointerEvent>(event);
632 if (IsMove(*preLastEvent, *lastDownEvent_, multiTapDistance_)) {
633 SendCacheEventsToNext();
634 SetGestureState(MagnificationGestureState::PASSING_THROUGH, event.GetPointerAction());
635 return;
636 }
637 handler_->SendEvent(static_cast<uint32_t>(MagnificationGestureMsg::SINGLE_TAP_FAIL_MSG),
638 static_cast<int64_t>(MagnificationGestureState::ZOOMIN_STATE),
639 static_cast<int32_t>(MagnificationTimeout::TAP_TIMEOUT));
640 SetGestureState(MagnificationGestureState::ZOOMIN_STATE_ONE_FINGER_DOWN, event.GetPointerAction());
641 }
642
HandleTwoFingersDownStateUp(MMI::PointerEvent & event)643 void WindowMagnificationGesture::HandleTwoFingersDownStateUp(MMI::PointerEvent &event)
644 {
645 if (windowMagnificationManager_ != nullptr) {
646 if (startScale_) {
647 windowMagnificationManager_->PersistScale();
648 }
649 startScale_ = false;
650 windowMagnificationManager_->FixSourceCenter(startScale_);
651 }
652 lastSlidingEvent_ = nullptr;
653 MMI::PointerEvent::PointerItem pointerItem;
654 event.GetPointerItem(event.GetPointerId(), pointerItem);
655 if ((event.GetPointerCount() == static_cast<int32_t>(PointerCountSize::POINTER_SIZE_1)) &&
656 (!pointerItem.IsPressed())) {
657 SetGestureState(MagnificationGestureState::ZOOMIN_STATE, event.GetPointerAction());
658 isDoubleFingersValid_ = false;
659 }
660 }
661
HandleTwoFingersDownStateMove(MMI::PointerEvent & event)662 void WindowMagnificationGesture::HandleTwoFingersDownStateMove(MMI::PointerEvent &event)
663 {
664 HILOG_DEBUG();
665 if (windowMagnificationManager_ == nullptr) {
666 HILOG_ERROR("windowMagnificationManager_ is nullptr.");
667 return;
668 }
669 if (!isDoubleFingersValid_) {
670 HILOG_ERROR("two fingers state is invalid.");
671 return;
672 }
673
674 if (event.GetPointerCount() < static_cast<int32_t>(PointerCountSize::POINTER_SIZE_2)) {
675 SetGestureState(MagnificationGestureState::SLIDING_STATE, event.GetPointerAction());
676 return;
677 }
678
679 if (lastDownEvent_ == nullptr) {
680 return;
681 }
682
683 MMI::PointerEvent::PointerItem baseFirstItem;
684 lastDownEvent_->GetPointerItem(0, baseFirstItem);
685
686 MMI::PointerEvent::PointerItem baseSecondItem;
687 lastDownEvent_->GetPointerItem(1, baseSecondItem);
688
689 float baseFocusX = (baseFirstItem.GetDisplayX() + baseSecondItem.GetDisplayX()) /
690 static_cast<float>(DIVISOR_TWO);
691 float baseFocusY = (baseFirstItem.GetDisplayY() + baseSecondItem.GetDisplayY()) /
692 static_cast<float>(DIVISOR_TWO);
693 int32_t baseOffsetX = abs(baseFirstItem.GetDisplayX() - baseSecondItem.GetDisplayX());
694 int32_t baseOffsetY = abs(baseFirstItem.GetDisplayY() - baseSecondItem.GetDisplayY());
695 float baseDistance = hypot(baseOffsetX, baseOffsetY);
696
697 if (lastSlidingEvent_ == nullptr) {
698 lastSlidingEvent_ = std::make_shared<MMI::PointerEvent>(event);
699 }
700
701 MMI::PointerEvent::PointerItem firstItem;
702 lastSlidingEvent_->GetPointerItem(0, firstItem);
703
704 MMI::PointerEvent::PointerItem secondItem;
705 lastSlidingEvent_->GetPointerItem(1, secondItem);
706
707 float lastFocusX = (firstItem.GetDisplayX() + secondItem.GetDisplayX()) /
708 static_cast<float>(DIVISOR_TWO);
709 float lastFocusY = (firstItem.GetDisplayY() + secondItem.GetDisplayY()) /
710 static_cast<float>(DIVISOR_TWO);
711 int32_t offsetX = abs(firstItem.GetDisplayX() - secondItem.GetDisplayX());
712 int32_t offsetY = abs(firstItem.GetDisplayY() - secondItem.GetDisplayY());
713 float slidingDistance = hypot(offsetX, offsetY);
714
715 MMI::PointerEvent::PointerItem firstCurrentItem;
716 event.GetPointerItem(0, firstCurrentItem);
717
718 MMI::PointerEvent::PointerItem secondCurrentItem;
719 event.GetPointerItem(1, secondCurrentItem);
720
721 float currentFocusX = (firstCurrentItem.GetDisplayX() + secondCurrentItem.GetDisplayX()) /
722 static_cast<float>(DIVISOR_TWO);
723 float currentFocusY = (firstCurrentItem.GetDisplayY() + secondCurrentItem.GetDisplayY()) /
724 static_cast<float>(DIVISOR_TWO);
725 int32_t currentOffsetX = abs(firstCurrentItem.GetDisplayX() - secondCurrentItem.GetDisplayX());
726 int32_t currentOffsetY = abs(firstCurrentItem.GetDisplayY() - secondCurrentItem.GetDisplayY());
727 float currentDistance = hypot(currentOffsetX, currentOffsetY);
728 if (abs(baseDistance - currentDistance) > MIN_SCALE_DISTANCE) {
729 startScale_ = true;
730 windowMagnificationManager_->FixSourceCenter(startScale_);
731 }
732
733 if (startScale_) {
734 float deltaSpan = currentDistance - slidingDistance;
735 windowMagnificationManager_->SetScale(deltaSpan);
736 } else {
737 int32_t deltaX = static_cast<int32_t>(currentFocusX - lastFocusX);
738 int32_t deltaY = static_cast<int32_t>(currentFocusY - lastFocusY);
739 windowMagnificationManager_->MoveMagnificationWindow(deltaX, deltaY);
740 #ifdef OHOS_BUILD_ENABLE_POWER_MANAGER
741 AccessibilityPowerManager &powerMgr = Singleton<AccessibilityPowerManager>::GetInstance();
742 powerMgr.RefreshActivity();
743 #endif
744 }
745
746 if (abs(windowMagnificationManager_->GetScale() - DEFAULT_SCALE) < EPS) {
747 startScale_ = false;
748 windowMagnificationManager_->FixSourceCenter(startScale_);
749 }
750 lastSlidingEvent_ = std::make_shared<MMI::PointerEvent>(event);
751 }
752
HandleSlidingStateDown(MMI::PointerEvent & event)753 void WindowMagnificationGesture::HandleSlidingStateDown(MMI::PointerEvent &event)
754 {
755 HILOG_DEBUG("no need process down in this sliding state.");
756 }
757
HandleSlidingStateUp(MMI::PointerEvent & event)758 void WindowMagnificationGesture::HandleSlidingStateUp(MMI::PointerEvent &event)
759 {
760 if (event.GetPointerCount() > static_cast<int32_t>(PointerCountSize::POINTER_SIZE_1) && event.GetPointerId() > 0) {
761 return;
762 }
763 lastSlidingEvent_ = nullptr;
764 Clear();
765 SetGestureState(MagnificationGestureState::ZOOMIN_STATE, event.GetPointerAction());
766 }
767
HandleSlidingStateMove(MMI::PointerEvent & event)768 void WindowMagnificationGesture::HandleSlidingStateMove(MMI::PointerEvent &event)
769 {
770 if (windowMagnificationManager_ == nullptr) {
771 HILOG_ERROR("windowMagnificationManager_ is nullptr.");
772 return;
773 }
774
775 if (event.GetPointerCount() > static_cast<int32_t>(PointerCountSize::POINTER_SIZE_1) && event.GetPointerId() > 0) {
776 return;
777 }
778
779 if (isTapOnHotArea_) {
780 if (lastSlidingEvent_ == nullptr) {
781 lastSlidingEvent_ = std::make_shared<MMI::PointerEvent>(event);
782 }
783 MMI::PointerEvent::PointerItem lastSlidingItem;
784 lastSlidingEvent_->GetPointerItem(lastSlidingEvent_->GetPointerId(), lastSlidingItem);
785
786 MMI::PointerEvent::PointerItem currentItem;
787 event.GetPointerItem(event.GetPointerId(), currentItem);
788
789 int32_t deltaX = currentItem.GetDisplayX() - lastSlidingItem.GetDisplayX();
790 int32_t deltaY = currentItem.GetDisplayY() - lastSlidingItem.GetDisplayY();
791 windowMagnificationManager_->MoveMagnificationWindow(deltaX, deltaY);
792
793 lastSlidingEvent_ = std::make_shared<MMI::PointerEvent>(event);
794 } else {
795 if (lastSlidingEvent_ != nullptr) {
796 lastSlidingEvent_ = nullptr;
797 }
798 }
799 }
800
HandleMenuSlidingStateMove(MMI::PointerEvent & event)801 void WindowMagnificationGesture::HandleMenuSlidingStateMove(MMI::PointerEvent &event)
802 {
803 if (event.GetPointerCount() > static_cast<int32_t>(PointerCountSize::POINTER_SIZE_1) && event.GetPointerId() > 0) {
804 return;
805 }
806
807 if (isTapOnMenu_ && menuManager_ != nullptr) {
808 if (lastSlidingEvent_ == nullptr) {
809 lastSlidingEvent_ = std::make_shared<MMI::PointerEvent>(event);
810 }
811 MMI::PointerEvent::PointerItem lastSlidingItem;
812 lastSlidingEvent_->GetPointerItem(lastSlidingEvent_->GetPointerId(), lastSlidingItem);
813
814 MMI::PointerEvent::PointerItem currentItem;
815 event.GetPointerItem(event.GetPointerId(), currentItem);
816
817 int32_t deltaX = currentItem.GetDisplayX() - lastSlidingItem.GetDisplayX();
818 int32_t deltaY = currentItem.GetDisplayY() - lastSlidingItem.GetDisplayY();
819 menuManager_->MoveMenuWindow(deltaX, deltaY);
820
821 lastSlidingEvent_ = std::make_shared<MMI::PointerEvent>(event);
822 } else {
823 if (lastSlidingEvent_ != nullptr) {
824 lastSlidingEvent_ = nullptr;
825 }
826 }
827 }
828
HandleMenuSlidingStateUp(MMI::PointerEvent & event)829 void WindowMagnificationGesture::HandleMenuSlidingStateUp(MMI::PointerEvent &event)
830 {
831 if (event.GetPointerCount() > static_cast<int32_t>(PointerCountSize::POINTER_SIZE_1) && event.GetPointerId() > 0) {
832 return;
833 }
834 lastSlidingEvent_ = nullptr;
835 isTapOnMenu_ = false;
836 Clear();
837 if (menuManager_ != nullptr) {
838 menuManager_->AttachToEdge();
839 }
840 SetGestureState(MagnificationGestureState::ZOOMIN_STATE, event.GetPointerAction());
841 }
842
HandleDraggingStateUp(MMI::PointerEvent & event)843 void WindowMagnificationGesture::HandleDraggingStateUp(MMI::PointerEvent &event)
844 {
845 HILOG_DEBUG();
846 if (event.GetPointerId() != DEFAULT_POINTER_ID) {
847 return;
848 }
849 SetGestureState(MagnificationGestureState::READY_STATE, HANDLER);
850 lastSlidingEvent_ = nullptr;
851 if (windowMagnificationManager_ != nullptr &&
852 windowMagnificationManager_->IsMagnificationWindowShow()) {
853 windowMagnificationManager_->DisableWindowMagnification();
854 isSingleTapOnWindow_ = false;
855 isTapOnHotArea_ = false;
856 Singleton<AccessibleAbilityManagerService>::GetInstance().AnnouncedForMagnification(
857 AnnounceType::ANNOUNCE_MAGNIFICATION_DISABLE);
858 }
859 }
860
HandleDraggingStateMove(MMI::PointerEvent & event)861 void WindowMagnificationGesture::HandleDraggingStateMove(MMI::PointerEvent &event)
862 {
863 HILOG_DEBUG();
864 if (event.GetPointerId() != DEFAULT_POINTER_ID) {
865 return;
866 }
867 if (windowMagnificationManager_ == nullptr) {
868 HILOG_ERROR("windowMagnificationManager_ is nullptr.");
869 return;
870 }
871
872 if (lastSlidingEvent_ == nullptr) {
873 lastSlidingEvent_ = std::make_shared<MMI::PointerEvent>(event);
874 }
875 MMI::PointerEvent::PointerItem lastSlidingItem;
876 lastSlidingEvent_->GetPointerItem(lastSlidingEvent_->GetPointerId(), lastSlidingItem);
877
878 MMI::PointerEvent::PointerItem currentItem;
879 event.GetPointerItem(event.GetPointerId(), currentItem);
880
881 int32_t deltaX = currentItem.GetDisplayX() - lastSlidingItem.GetDisplayX();
882 int32_t deltaY = currentItem.GetDisplayY() - lastSlidingItem.GetDisplayY();
883 windowMagnificationManager_->MoveMagnificationWindow(deltaX, deltaY);
884
885 lastSlidingEvent_ = std::make_shared<MMI::PointerEvent>(event);
886 }
887
IsMove(MMI::PointerEvent & startEvent,MMI::PointerEvent & endEvent,float slop)888 bool WindowMagnificationGesture::IsMove(MMI::PointerEvent &startEvent, MMI::PointerEvent &endEvent, float slop)
889 {
890 MMI::PointerEvent::PointerItem endItem;
891 endEvent.GetPointerItem(endEvent.GetPointerId(), endItem);
892
893 MMI::PointerEvent::PointerItem startItem;
894 startEvent.GetPointerItem(startEvent.GetPointerId(), startItem);
895 float deltaX = startItem.GetDisplayX() - endItem.GetDisplayX();
896 float deltaY = startItem.GetDisplayY() - endItem.GetDisplayY();
897 double duration = hypot(deltaX, deltaY);
898 return duration > slop;
899 }
900
Clear()901 void WindowMagnificationGesture::Clear()
902 {
903 HILOG_DEBUG();
904 receivedPointerEvents_.clear();
905 }
906
OnTripleTap(int32_t centerX,int32_t centerY)907 void WindowMagnificationGesture::OnTripleTap(int32_t centerX, int32_t centerY)
908 {
909 HILOG_INFO("OnTripleTap");
910 ResetTapCount();
911
912 if (windowMagnificationManager_ == nullptr) {
913 HILOG_ERROR("windowMagnificationManager_ is nullptr.");
914 return;
915 }
916 if (menuManager_ == nullptr) {
917 HILOG_ERROR("menuManager_ is nullptr.");
918 return;
919 }
920 if (windowMagnificationManager_->IsMagnificationWindowShow()) {
921 windowMagnificationManager_->DisableWindowMagnification();
922 menuManager_->DisableMenuWindow();
923 Singleton<AccessibleAbilityManagerService>::GetInstance().AnnouncedForMagnification(
924 AnnounceType::ANNOUNCE_MAGNIFICATION_DISABLE);
925 isSingleTapOnWindow_ = false;
926 isTapOnHotArea_ = false;
927 Utils::RecordOnZoomGestureEvent("off", false);
928 } else {
929 windowMagnificationManager_->EnableWindowMagnification(centerX, centerY);
930 Singleton<AccessibleAbilityManagerService>::GetInstance().AnnouncedForMagnification(
931 AnnounceType::ANNOUNCE_MAGNIFICATION_SCALE);
932 menuManager_->ShowMenuWindow(WINDOW_MAGNIFICATION);
933 Utils::RecordOnZoomGestureEvent("on", false);
934 }
935 }
936
SendEventToMultimodal(MMI::PointerEvent event,bool needTransfer,bool needResetTime)937 void WindowMagnificationGesture::SendEventToMultimodal(MMI::PointerEvent event, bool needTransfer, bool needResetTime)
938 {
939 if (windowMagnificationManager_ == nullptr) {
940 HILOG_ERROR("windowMagnificationManager_ is nullptr.");
941 return;
942 }
943
944 if (isTapOnMenu_) {
945 HILOG_DEBUG("Tap on menu.");
946 return;
947 }
948
949 if (isSingleTapOnWindow_ && !isTapOnHotArea_) {
950 MMI::PointerEvent::PointerItem pointer {};
951 event.GetPointerItem(event.GetPointerId(), pointer);
952
953 PointerPos coordinates = windowMagnificationManager_->ConvertCoordinates(pointer.GetDisplayX(),
954 pointer.GetDisplayY());
955
956 pointer.SetDisplayX(coordinates.posX);
957 pointer.SetDisplayY(coordinates.posY);
958 pointer.SetTargetWindowId(-1);
959 event.RemovePointerItem(event.GetPointerId());
960 event.AddPointerItem(pointer);
961 event.SetZOrder(10000); // magnification zlevel is 10000
962 }
963
964 if (needResetTime) {
965 event.SetActionTime(Utils::GetSystemTime() * US_TO_MS);
966 }
967 EventTransmission::OnPointerEvent(event);
968 }
969
ShieldZoomGesture(bool state)970 void WindowMagnificationGesture::ShieldZoomGesture(bool state)
971 {
972 HILOG_INFO("ShieldZoomGesture state = %{public}d", state);
973 shieldZoomGestureFlag_ = state;
974 if (state) {
975 Clear();
976 if (windowMagnificationManager_ != nullptr) {
977 windowMagnificationManager_->DisableWindowMagnification(true);
978 SetGestureState(MagnificationGestureState::READY_STATE, HANDLER);
979 Singleton<AccessibleAbilityManagerService>::GetInstance().AnnouncedForMagnification(
980 AnnounceType::ANNOUNCE_MAGNIFICATION_DISABLE);
981 }
982 if (menuManager_ != nullptr) {
983 menuManager_->DisableMenuWindow();
984 }
985 isSingleTapOnWindow_ = false;
986 isTapOnHotArea_ = false;
987 }
988 }
989
StartMagnificationInteract()990 void WindowMagnificationGesture::StartMagnificationInteract()
991 {
992 HILOG_DEBUG();
993 SetGestureState(MagnificationGestureState::ZOOMIN_STATE, SWITCH_MENU);
994 }
995
DisableGesture()996 void WindowMagnificationGesture::DisableGesture()
997 {
998 HILOG_DEBUG();
999 SetGestureState(MagnificationGestureState::READY_STATE, SWITCH_MENU);
1000 }
1001
IsTapOnInputMethod(MMI::PointerEvent & event)1002 bool WindowMagnificationGesture::IsTapOnInputMethod(MMI::PointerEvent &event)
1003 {
1004 int32_t pointerCount = event.GetPointerCount();
1005 if (pointerCount != 1) {
1006 HILOG_DEBUG("not single finger.");
1007 return false;
1008 }
1009 std::vector<AccessibilityWindowInfo> windowInfos =
1010 Singleton<AccessibilityWindowManager>::GetInstance().GetAccessibilityWindows();
1011 for (auto &window : windowInfos) {
1012 if (window.GetWindowType() == INPUT_METHOD_WINDOW_TYPE) {
1013 Rect inputRect = window.GetRectInScreen();
1014 int32_t leftTopX = inputRect.GetLeftTopXScreenPostion();
1015 int32_t leftTopY = inputRect.GetLeftTopYScreenPostion();
1016 int32_t rightBottomX = inputRect.GetRightBottomXScreenPostion();
1017 int32_t rightBottomY = inputRect.GetRightBottomYScreenPostion();
1018
1019 MMI::PointerEvent::PointerItem item;
1020 event.GetPointerItem(event.GetPointerId(), item);
1021 int32_t itemX = item.GetDisplayX();
1022 int32_t itemY = item.GetDisplayY();
1023 if ((itemX >= leftTopX) && (itemX <= rightBottomX) &&
1024 (itemY >= leftTopY) && (itemY <= rightBottomY)) {
1025 HILOG_INFO("tap on input method window.");
1026 return true;
1027 }
1028 }
1029 }
1030 HILOG_DEBUG("have no input method window.");
1031 return false;
1032 }
1033
IsKnuckles(MMI::PointerEvent & event)1034 bool WindowMagnificationGesture::IsKnuckles(MMI::PointerEvent &event)
1035 {
1036 HILOG_DEBUG();
1037
1038 std::vector<int32_t> pointerIdList = event.GetPointerIds();
1039 for (int32_t pointerId : pointerIdList) {
1040 MMI::PointerEvent::PointerItem item;
1041 event.GetPointerItem(pointerId, item);
1042 int32_t toolType = item.GetToolType();
1043 if (toolType == MMI::PointerEvent::TOOL_TYPE_KNUCKLE) {
1044 HILOG_INFO("is knuckle event.");
1045 return true;
1046 }
1047 }
1048 return false;
1049 }
1050
OnDrag()1051 void WindowMagnificationGesture::OnDrag()
1052 {
1053 HILOG_INFO();
1054 SetGestureState(MagnificationGestureState::DRAGGING_STATE, HANDLER);
1055 ResetTapCount();
1056 isTripleDown_ = false;
1057 if (lastDownEvent_ == nullptr) {
1058 HILOG_ERROR("lastDownEvent_ is nullptr");
1059 return;
1060 }
1061
1062 MMI::PointerEvent::PointerItem item;
1063 lastDownEvent_->GetPointerItem(lastDownEvent_->GetPointerId(), item);
1064
1065 int32_t anchorX = item.GetDisplayX();
1066 int32_t anchorY = item.GetDisplayY();
1067
1068 if (windowMagnificationManager_ == nullptr) {
1069 HILOG_ERROR("windowMagnificationManager_ is nullptr.");
1070 return;
1071 }
1072 windowMagnificationManager_->EnableWindowMagnification(anchorX, anchorY);
1073 Singleton<AccessibleAbilityManagerService>::GetInstance().AnnouncedForMagnification(
1074 AnnounceType::ANNOUNCE_MAGNIFICATION_SCALE);
1075 Clear();
1076 }
1077 } // namespace Accessibility
1078 } // namespace OHOS
1079 // LCOV_EXCL_STOP