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