1 /*
2 * Copyright (c) 2021-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 "pointer_event.h"
17
18 #include "mmi_log.h"
19
20 #undef MMI_LOG_TAG
21 #define MMI_LOG_TAG "PointerEvent"
22
23 using namespace OHOS::HiviewDFX;
24 namespace OHOS {
25 namespace MMI {
26 namespace {
27 constexpr double MAX_PRESSURE { 1.0 };
28 constexpr size_t MAX_N_PRESSED_BUTTONS { 10 };
29 constexpr size_t MAX_N_POINTER_ITEMS { 10 };
30 constexpr int32_t SIMULATE_EVENT_START_ID { 10000 };
31 #ifdef OHOS_BUILD_ENABLE_SECURITY_COMPONENT
32 constexpr size_t MAX_N_ENHANCE_DATA_SIZE { 64 };
33 #endif // OHOS_BUILD_ENABLE_SECURITY_COMPONENT
34 constexpr size_t MAX_N_BUFFER_SIZE { 512 };
35 constexpr size_t MAX_N_PRESSED_KEYS { 10 };
36 } // namespace
37
from(std::shared_ptr<InputEvent> inputEvent)38 std::shared_ptr<PointerEvent> PointerEvent::from(std::shared_ptr<InputEvent> inputEvent)
39 {
40 return nullptr;
41 }
42
PointerItem()43 PointerEvent::PointerItem::PointerItem() {}
44
~PointerItem()45 PointerEvent::PointerItem::~PointerItem() {}
46
GetPointerId() const47 int32_t PointerEvent::PointerItem::GetPointerId() const
48 {
49 return pointerId_;
50 }
51
SetPointerId(int32_t pointerId)52 void PointerEvent::PointerItem::SetPointerId(int32_t pointerId)
53 {
54 pointerId_ = pointerId;
55 }
56
GetDownTime() const57 int64_t PointerEvent::PointerItem::GetDownTime() const
58 {
59 return downTime_;
60 }
61
SetDownTime(int64_t downTime)62 void PointerEvent::PointerItem::SetDownTime(int64_t downTime)
63 {
64 downTime_ = downTime;
65 }
66
IsPressed() const67 bool PointerEvent::PointerItem::IsPressed() const
68 {
69 return pressed_;
70 }
71
SetPressed(bool pressed)72 void PointerEvent::PointerItem::SetPressed(bool pressed)
73 {
74 pressed_ = pressed;
75 }
76
GetDisplayX() const77 int32_t PointerEvent::PointerItem::GetDisplayX() const
78 {
79 return displayX_;
80 }
81
SetDisplayX(int32_t x)82 void PointerEvent::PointerItem::SetDisplayX(int32_t x)
83 {
84 displayX_ = x;
85 }
86
GetDisplayY() const87 int32_t PointerEvent::PointerItem::GetDisplayY() const
88 {
89 return displayY_;
90 }
91
SetDisplayY(int32_t y)92 void PointerEvent::PointerItem::SetDisplayY(int32_t y)
93 {
94 displayY_ = y;
95 }
96
GetWindowX() const97 int32_t PointerEvent::PointerItem::GetWindowX() const
98 {
99 return windowX_;
100 }
101
SetWindowX(int32_t x)102 void PointerEvent::PointerItem::SetWindowX(int32_t x)
103 {
104 windowX_ = x;
105 }
106
GetWindowY() const107 int32_t PointerEvent::PointerItem::GetWindowY() const
108 {
109 return windowY_;
110 }
111
SetWindowY(int32_t y)112 void PointerEvent::PointerItem::SetWindowY(int32_t y)
113 {
114 windowY_ = y;
115 }
116
GetDisplayXPos() const117 double PointerEvent::PointerItem::GetDisplayXPos() const
118 {
119 return displayXPos_;
120 }
121
SetDisplayXPos(double x)122 void PointerEvent::PointerItem::SetDisplayXPos(double x)
123 {
124 displayXPos_ = x;
125 }
126
GetDisplayYPos() const127 double PointerEvent::PointerItem::GetDisplayYPos() const
128 {
129 return displayYPos_;
130 }
131
SetDisplayYPos(double y)132 void PointerEvent::PointerItem::SetDisplayYPos(double y)
133 {
134 displayYPos_ = y;
135 }
136
GetWindowXPos() const137 double PointerEvent::PointerItem::GetWindowXPos() const
138 {
139 return windowXPos_;
140 }
141
SetWindowXPos(double x)142 void PointerEvent::PointerItem::SetWindowXPos(double x)
143 {
144 windowXPos_ = x;
145 }
146
GetWindowYPos() const147 double PointerEvent::PointerItem::GetWindowYPos() const
148 {
149 return windowYPos_;
150 }
151
SetWindowYPos(double y)152 void PointerEvent::PointerItem::SetWindowYPos(double y)
153 {
154 windowYPos_ = y;
155 }
156
GetFixedDisplayX() const157 int32_t PointerEvent::PointerItem::GetFixedDisplayX() const
158 {
159 return fixedDisplayX_;
160 }
161
SetFixedDisplayX(int32_t fixedDisplayX)162 void PointerEvent::PointerItem::SetFixedDisplayX(int32_t fixedDisplayX)
163 {
164 fixedDisplayX_ = fixedDisplayX;
165 }
166
GetFixedDisplayY() const167 int32_t PointerEvent::PointerItem::GetFixedDisplayY() const
168 {
169 return fixedDisplayY_;
170 }
171
SetFixedDisplayY(int32_t fixedDisplayY)172 void PointerEvent::PointerItem::SetFixedDisplayY(int32_t fixedDisplayY)
173 {
174 fixedDisplayY_ = fixedDisplayY;
175 }
176
GetWidth() const177 int32_t PointerEvent::PointerItem::GetWidth() const
178 {
179 return width_;
180 }
181
SetWidth(int32_t width)182 void PointerEvent::PointerItem::SetWidth(int32_t width)
183 {
184 width_ = width;
185 }
186
GetHeight() const187 int32_t PointerEvent::PointerItem::GetHeight() const
188 {
189 return height_;
190 }
191
SetHeight(int32_t height)192 void PointerEvent::PointerItem::SetHeight(int32_t height)
193 {
194 height_ = height;
195 }
196
GetTiltX() const197 double PointerEvent::PointerItem::GetTiltX() const
198 {
199 return tiltX_;
200 }
201
SetTiltX(double tiltX)202 void PointerEvent::PointerItem::SetTiltX(double tiltX)
203 {
204 tiltX_ = tiltX;
205 }
206
GetTiltY() const207 double PointerEvent::PointerItem::GetTiltY() const
208 {
209 return tiltY_;
210 }
211
SetTiltY(double tiltY)212 void PointerEvent::PointerItem::SetTiltY(double tiltY)
213 {
214 tiltY_ = tiltY;
215 }
216
GetToolDisplayX() const217 int32_t PointerEvent::PointerItem::GetToolDisplayX() const
218 {
219 return toolDisplayX_;
220 }
221
SetToolDisplayX(int32_t x)222 void PointerEvent::PointerItem::SetToolDisplayX(int32_t x)
223 {
224 toolDisplayX_ = x;
225 }
226
GetToolDisplayY() const227 int32_t PointerEvent::PointerItem::GetToolDisplayY() const
228 {
229 return toolDisplayY_;
230 }
231
SetToolDisplayY(int32_t y)232 void PointerEvent::PointerItem::SetToolDisplayY(int32_t y)
233 {
234 toolDisplayY_ = y;
235 }
236
GetToolWindowX() const237 int32_t PointerEvent::PointerItem::GetToolWindowX() const
238 {
239 return toolWindowX_;
240 }
241
SetToolWindowX(int32_t x)242 void PointerEvent::PointerItem::SetToolWindowX(int32_t x)
243 {
244 toolWindowX_ = x;
245 }
246
GetToolWindowY() const247 int32_t PointerEvent::PointerItem::GetToolWindowY() const
248 {
249 return toolWindowY_;
250 }
251
SetToolWindowY(int32_t y)252 void PointerEvent::PointerItem::SetToolWindowY(int32_t y)
253 {
254 toolWindowY_ = y;
255 }
256
GetToolWidth() const257 int32_t PointerEvent::PointerItem::GetToolWidth() const
258 {
259 return toolWidth_;
260 }
261
SetToolWidth(int32_t width)262 void PointerEvent::PointerItem::SetToolWidth(int32_t width)
263 {
264 toolWidth_ = width;
265 }
266
GetToolHeight() const267 int32_t PointerEvent::PointerItem::GetToolHeight() const
268 {
269 return toolHeight_;
270 }
271
SetToolHeight(int32_t height)272 void PointerEvent::PointerItem::SetToolHeight(int32_t height)
273 {
274 toolHeight_ = height;
275 }
276
GetPressure() const277 double PointerEvent::PointerItem::GetPressure() const
278 {
279 return pressure_;
280 }
281
SetPressure(double pressure)282 void PointerEvent::PointerItem::SetPressure(double pressure)
283 {
284 if (pressure < 0.0) {
285 pressure_ = 0.0;
286 } else if (TOOL_TYPE_PEN == GetToolType()) {
287 pressure_ = pressure >= MAX_PRESSURE ? MAX_PRESSURE : pressure;
288 } else {
289 pressure_ = pressure;
290 }
291 }
292
GetMoveFlag() const293 int32_t PointerEvent::PointerItem::GetMoveFlag() const
294 {
295 return moveFlag_;
296 }
297
SetMoveFlag(int32_t moveflag)298 void PointerEvent::PointerItem::SetMoveFlag(int32_t moveflag)
299 {
300 moveFlag_ = moveflag;
301 }
302
303
GetLongAxis() const304 int32_t PointerEvent::PointerItem::GetLongAxis() const
305 {
306 return longAxis_;
307 }
308
SetLongAxis(int32_t longAxis)309 void PointerEvent::PointerItem::SetLongAxis(int32_t longAxis)
310 {
311 longAxis_ = longAxis;
312 }
313
GetShortAxis() const314 int32_t PointerEvent::PointerItem::GetShortAxis() const
315 {
316 return shortAxis_;
317 }
318
SetShortAxis(int32_t shortAxis)319 void PointerEvent::PointerItem::SetShortAxis(int32_t shortAxis)
320 {
321 shortAxis_ = shortAxis;
322 }
323
GetDeviceId() const324 int32_t PointerEvent::PointerItem::GetDeviceId() const
325 {
326 return deviceId_;
327 }
328
SetDeviceId(int32_t deviceId)329 void PointerEvent::PointerItem::SetDeviceId(int32_t deviceId)
330 {
331 deviceId_ = deviceId;
332 }
333
GetToolType() const334 int32_t PointerEvent::PointerItem::GetToolType() const
335 {
336 return toolType_;
337 }
338
SetToolType(int32_t toolType)339 void PointerEvent::PointerItem::SetToolType(int32_t toolType)
340 {
341 toolType_ = toolType;
342 }
343
GetTargetWindowId() const344 int32_t PointerEvent::PointerItem::GetTargetWindowId() const
345 {
346 return targetWindowId_;
347 }
348
SetTargetWindowId(int32_t windowId)349 void PointerEvent::PointerItem::SetTargetWindowId(int32_t windowId)
350 {
351 targetWindowId_ = windowId;
352 }
353
GetRawDx() const354 int32_t PointerEvent::PointerItem::GetRawDx() const
355 {
356 return rawDx_;
357 }
358
SetRawDx(int32_t rawDx)359 void PointerEvent::PointerItem::SetRawDx(int32_t rawDx)
360 {
361 rawDx_ = rawDx;
362 }
363
GetOriginPointerId() const364 int32_t PointerEvent::PointerItem::GetOriginPointerId() const
365 {
366 return originPointerId_;
367 }
368
SetOriginPointerId(int32_t originPointerId)369 void PointerEvent::PointerItem::SetOriginPointerId(int32_t originPointerId)
370 {
371 originPointerId_ = originPointerId;
372 }
373
GetRawDy() const374 int32_t PointerEvent::PointerItem::GetRawDy() const
375 {
376 return rawDy_;
377 }
378
SetRawDy(int32_t rawDy)379 void PointerEvent::PointerItem::SetRawDy(int32_t rawDy)
380 {
381 rawDy_ = rawDy;
382 }
383
GetRawDisplayX() const384 int32_t PointerEvent::PointerItem::GetRawDisplayX() const
385 {
386 return rawDisplayX_;
387 }
388
SetRawDisplayX(int32_t rawDisplayX)389 void PointerEvent::PointerItem::SetRawDisplayX(int32_t rawDisplayX)
390 {
391 rawDisplayX_ = rawDisplayX;
392 }
393
GetRawDisplayY() const394 int32_t PointerEvent::PointerItem::GetRawDisplayY() const
395 {
396 return rawDisplayY_;
397 }
398
SetRawDisplayY(int32_t rawDisplayY)399 void PointerEvent::PointerItem::SetRawDisplayY(int32_t rawDisplayY)
400 {
401 rawDisplayY_ = rawDisplayY;
402 }
403
GetBlobId() const404 int32_t PointerEvent::PointerItem::GetBlobId() const
405 {
406 return blobId_;
407 }
408
SetBlobId(int32_t blobId)409 void PointerEvent::PointerItem::SetBlobId(int32_t blobId)
410 {
411 blobId_ = blobId;
412 }
413
GetAngle() const414 int32_t PointerEvent::PointerItem::GetAngle() const
415 {
416 return angle_;
417 }
418
SetAngle(int32_t angle)419 void PointerEvent::PointerItem::SetAngle(int32_t angle)
420 {
421 angle_ = angle;
422 }
423
IsCanceled() const424 bool PointerEvent::PointerItem::IsCanceled() const
425 {
426 return canceled_;
427 }
428
SetCanceled(bool canceled)429 void PointerEvent::PointerItem::SetCanceled(bool canceled)
430 {
431 canceled_ = canceled;
432 }
433
WriteToParcel(Parcel & out) const434 bool PointerEvent::PointerItem::WriteToParcel(Parcel &out) const
435 {
436 return (
437 out.WriteInt32(pointerId_) &&
438 out.WriteInt64(downTime_) &&
439 out.WriteBool(pressed_) &&
440 out.WriteInt32(displayX_) &&
441 out.WriteInt32(displayY_) &&
442 out.WriteInt32(windowX_) &&
443 out.WriteInt32(windowY_) &&
444 out.WriteInt32(width_) &&
445 out.WriteInt32(height_) &&
446 out.WriteInt32(toolDisplayX_) &&
447 out.WriteInt32(toolDisplayY_) &&
448 out.WriteInt32(toolWindowX_) &&
449 out.WriteInt32(toolWindowY_) &&
450 out.WriteInt32(toolWidth_) &&
451 out.WriteInt32(toolHeight_) &&
452 out.WriteDouble(tiltX_) &&
453 out.WriteDouble(tiltY_) &&
454 out.WriteDouble(pressure_) &&
455 out.WriteInt32(longAxis_) &&
456 out.WriteInt32(shortAxis_) &&
457 out.WriteInt32(toolType_) &&
458 out.WriteInt32(deviceId_) &&
459 out.WriteInt32(rawDx_) &&
460 out.WriteInt32(rawDy_) &&
461 out.WriteInt32(rawDisplayX_) &&
462 out.WriteInt32(rawDisplayY_) &&
463 out.WriteInt32(targetWindowId_) &&
464 out.WriteInt32(originPointerId_) &&
465 out.WriteDouble(displayXPos_) &&
466 out.WriteDouble(displayYPos_) &&
467 out.WriteDouble(windowXPos_) &&
468 out.WriteDouble(windowYPos_) &&
469 out.WriteInt32(blobId_) &&
470 out.WriteInt32(angle_) &&
471 out.WriteInt32(fixedDisplayX_) &&
472 out.WriteInt32(fixedDisplayY_)
473 );
474 }
475
ReadFromParcel(Parcel & in)476 bool PointerEvent::PointerItem::ReadFromParcel(Parcel &in)
477 {
478 return (
479 in.ReadInt32(pointerId_) &&
480 in.ReadInt64(downTime_) &&
481 in.ReadBool(pressed_) &&
482 in.ReadInt32(displayX_) &&
483 in.ReadInt32(displayY_) &&
484 in.ReadInt32(windowX_) &&
485 in.ReadInt32(windowY_) &&
486 in.ReadInt32(width_) &&
487 in.ReadInt32(height_) &&
488 in.ReadInt32(toolDisplayX_) &&
489 in.ReadInt32(toolDisplayY_) &&
490 in.ReadInt32(toolWindowX_) &&
491 in.ReadInt32(toolWindowY_) &&
492 in.ReadInt32(toolWidth_) &&
493 in.ReadInt32(toolHeight_) &&
494 in.ReadDouble(tiltX_) &&
495 in.ReadDouble(tiltY_) &&
496 in.ReadDouble(pressure_) &&
497 in.ReadInt32(longAxis_) &&
498 in.ReadInt32(shortAxis_) &&
499 in.ReadInt32(toolType_) &&
500 in.ReadInt32(deviceId_) &&
501 in.ReadInt32(rawDx_) &&
502 in.ReadInt32(rawDy_) &&
503 in.ReadInt32(rawDisplayX_) &&
504 in.ReadInt32(rawDisplayY_) &&
505 in.ReadInt32(targetWindowId_) &&
506 in.ReadInt32(originPointerId_) &&
507 in.ReadDouble(displayXPos_) &&
508 in.ReadDouble(displayYPos_) &&
509 in.ReadDouble(windowXPos_) &&
510 in.ReadDouble(windowYPos_) &&
511 in.ReadInt32(blobId_) &&
512 in.ReadInt32(angle_) &&
513 in.ReadInt32(fixedDisplayX_) &&
514 in.ReadInt32(fixedDisplayY_)
515 );
516 }
517
PointerEvent(int32_t eventType)518 PointerEvent::PointerEvent(int32_t eventType) : InputEvent(eventType) {}
519
PointerEvent(const PointerEvent & other)520 PointerEvent::PointerEvent(const PointerEvent& other)
521 : InputEvent(other), pointerId_(other.pointerId_), pointers_(other.pointers_),
522 pressedButtons_(other.pressedButtons_),
523 pointerAction_(other.pointerAction_), originPointerAction_(other.originPointerAction_),
524 buttonId_(other.buttonId_), fingerCount_(other.fingerCount_), pullId_(other.pullId_), zOrder_(other.zOrder_),
525 axes_(other.axes_), axisValues_(other.axisValues_), velocity_(other.velocity_),
526 pressedKeys_(other.pressedKeys_), buffer_(other.buffer_), axisEventType_(other.axisEventType_),
527 #ifdef OHOS_BUILD_ENABLE_FINGERPRINT
528 fingerprintDistanceX_(other.fingerprintDistanceX_), fingerprintDistanceY_(other.fingerprintDistanceY_),
529 #endif // OHOS_BUILD_ENABLE_FINGERPRINT
530 dispatchTimes_(other.dispatchTimes_),
531 #ifdef OHOS_BUILD_ENABLE_SECURITY_COMPONENT
532 enhanceData_(other.enhanceData_),
533 #endif // OHOS_BUILD_ENABLE_SECURITY_COMPONENT
534 #ifdef OHOS_BUILD_ENABLE_ANCO
535 ancoDeal_(other.ancoDeal_),
536 #endif // OHOS_BUILD_ENABLE_ANCO
537 handleEventType_(other.handleEventType_),
538 settings_(other.settings_),
539 autoToVirtualScreen_(other.autoToVirtualScreen_),
540 handOption_(other.handOption_), fixedMode_(other.fixedMode_) {}
541
~PointerEvent()542 PointerEvent::~PointerEvent() {}
543
Create()544 std::shared_ptr<PointerEvent> PointerEvent::Create()
545 {
546 auto event = std::shared_ptr<PointerEvent>(new (std::nothrow) PointerEvent(InputEvent::EVENT_TYPE_POINTER));
547 CHKPP(event);
548 return event;
549 }
550
Reset()551 void PointerEvent::Reset()
552 {
553 InputEvent::Reset();
554 handOption_ = -1;
555 pointerId_ = -1;
556 pointers_.clear();
557 pressedButtons_.clear();
558 pointerAction_ = POINTER_ACTION_UNKNOWN;
559 originPointerAction_ = POINTER_ACTION_UNKNOWN;
560 buttonId_ = -1;
561 fingerCount_ = 0;
562 zOrder_ = -1.0f;
563 dispatchTimes_ = 0;
564 axes_ = 0U;
565 axisValues_.fill(0.0);
566 velocity_ = 0.0;
567 axisEventType_ = AXIS_EVENT_TYPE_UNKNOWN;
568 pressedKeys_.clear();
569 #ifdef OHOS_BUILD_ENABLE_FINGERPRINT
570 fingerprintDistanceX_ = 0.0;
571 fingerprintDistanceY_ = 0.0;
572 #endif // OHOS_BUILD_ENABLE_FINGERPRINT
573 }
574
ToString()575 std::string PointerEvent::ToString()
576 {
577 std::string eventStr = InputEvent::ToString();
578 eventStr += ",pointerId:" + std::to_string(pointerId_);
579 eventStr += ",pointerAction:" + std::to_string(pointerAction_);
580 eventStr += ",buttonId:" + std::to_string(buttonId_);
581 eventStr += ",pointers:[";
582 size_t pointerSize = 0;
583 for (auto it = pointers_.begin(); it != pointers_.end(); it++) {
584 pointerSize++;
585 eventStr += "{displayX:" + std::to_string((*it).GetDisplayX());
586 eventStr += ",displayY:" + std::to_string((*it).GetDisplayY());
587 eventStr += ",windowX:" + std::to_string((*it).GetWindowX());
588 eventStr += ",windowY:" + std::to_string((*it).GetWindowY());
589 eventStr += ",targetWindowId:" + std::to_string((*it).GetTargetWindowId());
590 eventStr += ",longAxis:" + std::to_string((*it).GetLongAxis());
591 eventStr += ",shortAxis:" + std::to_string((*it).GetShortAxis()) + "}";
592 if (pointerSize != pointers_.size()) {
593 eventStr += ",";
594 }
595 }
596 eventStr += "],pressedButtons:[";
597 size_t buttonsSize = 0;
598 for (auto it = pressedButtons_.begin(); it != pressedButtons_.end(); it++) {
599 buttonsSize++;
600 eventStr += std::to_string(*it);
601 if (buttonsSize != pressedButtons_.size()) {
602 eventStr += ",";
603 }
604 }
605 eventStr += "]";
606 return eventStr;
607 }
608
GetPointerAction() const609 int32_t PointerEvent::GetPointerAction() const
610 {
611 return pointerAction_;
612 }
613
SetPointerAction(int32_t pointerAction)614 void PointerEvent::SetPointerAction(int32_t pointerAction)
615 {
616 pointerAction_ = pointerAction;
617 originPointerAction_ = pointerAction;
618 }
619
GetOriginPointerAction() const620 int32_t PointerEvent::GetOriginPointerAction() const
621 {
622 return originPointerAction_;
623 }
624
SetOriginPointerAction(int32_t pointerAction)625 void PointerEvent::SetOriginPointerAction(int32_t pointerAction)
626 {
627 originPointerAction_ = pointerAction;
628 }
629
GetHandOption() const630 int32_t PointerEvent::GetHandOption() const
631 {
632 return handOption_;
633 }
634
SetHandOption(int32_t handOption)635 void PointerEvent::SetHandOption(int32_t handOption)
636 {
637 handOption_ = handOption;
638 }
639
640 static const std::unordered_map<int32_t, std::string> pointerActionMap = {
641 { PointerEvent::POINTER_ACTION_CANCEL, "cancel" },
642 { PointerEvent::POINTER_ACTION_DOWN, "down" },
643 { PointerEvent::POINTER_ACTION_MOVE, "move" },
644 { PointerEvent::POINTER_ACTION_UP, "up" },
645 { PointerEvent::POINTER_ACTION_AXIS_BEGIN, "axis-begin" },
646 { PointerEvent::POINTER_ACTION_AXIS_UPDATE, "axis-update" },
647 { PointerEvent::POINTER_ACTION_AXIS_END, "axis-end" },
648 { PointerEvent::POINTER_ACTION_BUTTON_DOWN, "button-down" },
649 { PointerEvent::POINTER_ACTION_BUTTON_UP, "button-up" },
650 { PointerEvent::POINTER_ACTION_ENTER_WINDOW, "enter-window" },
651 { PointerEvent::POINTER_ACTION_LEAVE_WINDOW, "leave-window" },
652 { PointerEvent::POINTER_ACTION_PULL_DOWN, "pull-down" },
653 { PointerEvent::POINTER_ACTION_PULL_MOVE, "pull-move" },
654 { PointerEvent::POINTER_ACTION_PULL_UP, "pull-up" },
655 { PointerEvent::POINTER_ACTION_PULL_IN_WINDOW, "pull-in-window" },
656 { PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW, "pull-out-window" },
657 { PointerEvent::POINTER_ACTION_SWIPE_BEGIN, "swipe-begin" },
658 { PointerEvent::POINTER_ACTION_SWIPE_UPDATE, "swipe-update" },
659 { PointerEvent::POINTER_ACTION_SWIPE_END, "swipe-end" },
660 { PointerEvent::POINTER_ACTION_ROTATE_BEGIN, "rotate-begin" },
661 { PointerEvent::POINTER_ACTION_ROTATE_UPDATE, "rotate-update" },
662 { PointerEvent::POINTER_ACTION_ROTATE_END, "rotate-end" },
663 { PointerEvent::POINTER_ACTION_TRIPTAP, "touchpad-triptap" },
664 { PointerEvent::POINTER_ACTION_QUADTAP, "quadtap" },
665 { PointerEvent::POINTER_ACTION_HOVER_MOVE, "hover-move" },
666 { PointerEvent::POINTER_ACTION_HOVER_ENTER, "hover-enter" },
667 { PointerEvent::POINTER_ACTION_HOVER_EXIT, "hover-exit" },
668 { PointerEvent::POINTER_ACTION_FINGERPRINT_DOWN, "fingerprint-down" },
669 { PointerEvent::POINTER_ACTION_FINGERPRINT_UP, "fingerprint-up" },
670 { PointerEvent::POINTER_ACTION_FINGERPRINT_SLIDE, "fingerprint-slide" },
671 { PointerEvent::POINTER_ACTION_FINGERPRINT_RETOUCH, "fingerprint-retouch" },
672 { PointerEvent::POINTER_ACTION_FINGERPRINT_CLICK, "fingerprint-click" },
673 { PointerEvent::TOUCH_ACTION_SWIPE_DOWN, "touch-swipe-down" },
674 { PointerEvent::TOUCH_ACTION_SWIPE_UP, "touch-swipe-up" },
675 { PointerEvent::TOUCH_ACTION_SWIPE_LEFT, "touch-swipe-left" },
676 { PointerEvent::TOUCH_ACTION_SWIPE_RIGHT, "touch-swipe-right" },
677 { PointerEvent::TOUCH_ACTION_PINCH_OPENED, "touch-pinch-open" },
678 { PointerEvent::TOUCH_ACTION_PINCH_CLOSEED, "touch-pinch-close" },
679 { PointerEvent::TOUCH_ACTION_GESTURE_END, "touch-gesture-end" },
680 { PointerEvent::POINTER_ACTION_PROXIMITY_IN, "pen-proximity-in" },
681 { PointerEvent::POINTER_ACTION_PROXIMITY_OUT, "pen-proximity-out" },
682 };
683
DumpPointerAction() const684 const char* PointerEvent::DumpPointerAction() const
685 {
686 if (pointerAction_ == PointerEvent::POINTER_ACTION_AXIS_BEGIN) {
687 if (HasAxis(axes_, PointerEvent::AXIS_TYPE_SCROLL_VERTICAL) ||
688 HasAxis(axes_, PointerEvent::AXIS_TYPE_SCROLL_HORIZONTAL)) {
689 return "axis-begin";
690 } else if (HasAxis(axes_, PointerEvent::AXIS_TYPE_PINCH)) {
691 return "pinch-begin";
692 }
693 } else if (pointerAction_ == PointerEvent::POINTER_ACTION_AXIS_UPDATE) {
694 if (HasAxis(axes_, PointerEvent::AXIS_TYPE_SCROLL_VERTICAL) ||
695 HasAxis(axes_, PointerEvent::AXIS_TYPE_SCROLL_HORIZONTAL)) {
696 return "axis-update";
697 } else if (HasAxis(axes_, PointerEvent::AXIS_TYPE_PINCH)) {
698 return "pinch-update";
699 }
700 } else if (pointerAction_ == PointerEvent::POINTER_ACTION_AXIS_END) {
701 if (HasAxis(axes_, PointerEvent::AXIS_TYPE_SCROLL_VERTICAL) ||
702 HasAxis(axes_, PointerEvent::AXIS_TYPE_SCROLL_HORIZONTAL)) {
703 return "axis-end";
704 } else if (HasAxis(axes_, PointerEvent::AXIS_TYPE_PINCH)) {
705 return "pinch-end";
706 }
707 }
708 auto it = pointerActionMap.find(pointerAction_);
709 if (it != pointerActionMap.end()) {
710 return it->second.c_str();
711 }
712 return "unknown";
713 }
714
GetPointerId() const715 int32_t PointerEvent::GetPointerId() const
716 {
717 return pointerId_;
718 }
719
SetPointerId(int32_t pointerId)720 void PointerEvent::SetPointerId(int32_t pointerId)
721 {
722 pointerId_ = pointerId;
723 }
724
GetPointerItem(int32_t pointerId,PointerItem & pointerItem) const725 bool PointerEvent::GetPointerItem(int32_t pointerId, PointerItem &pointerItem) const
726 {
727 for (const auto &item : pointers_) {
728 if (item.GetPointerId() == pointerId) {
729 pointerItem = item;
730 return true;
731 }
732 }
733 return false;
734 }
735
RemovePointerItem(int32_t pointerId)736 void PointerEvent::RemovePointerItem(int32_t pointerId)
737 {
738 for (auto it = pointers_.begin(); it != pointers_.end(); ++it) {
739 if (it->GetPointerId() == pointerId) {
740 pointers_.erase(it);
741 break;
742 }
743 }
744 }
745
RemoveAllPointerItems()746 void PointerEvent::RemoveAllPointerItems()
747 {
748 pointers_.clear();
749 }
750
AddPointerItem(PointerItem & pointerItem)751 void PointerEvent::AddPointerItem(PointerItem &pointerItem)
752 {
753 if (pointers_.size() >= MAX_N_POINTER_ITEMS) {
754 MMI_HILOGE("Exceed maximum allowed number of pointer items");
755 return;
756 }
757 int32_t pointerId = pointerItem.GetPointerId();
758 for (auto &item : pointers_) {
759 if (item.GetPointerId() == pointerId) {
760 item = pointerItem;
761 return;
762 }
763 }
764 pointers_.push_back(pointerItem);
765 }
766
UpdatePointerItem(int32_t pointerId,PointerItem & pointerItem)767 void PointerEvent::UpdatePointerItem(int32_t pointerId, PointerItem &pointerItem)
768 {
769 for (auto &item : pointers_) {
770 if ((item.GetPointerId() % SIMULATE_EVENT_START_ID) == pointerId) {
771 item = pointerItem;
772 return;
773 }
774 }
775 AddPointerItem(pointerItem);
776 }
777
GetPressedButtons() const778 std::set<int32_t> PointerEvent::GetPressedButtons() const
779 {
780 return pressedButtons_;
781 }
782
IsButtonPressed(int32_t buttonId) const783 bool PointerEvent::IsButtonPressed(int32_t buttonId) const
784 {
785 return (pressedButtons_.find(buttonId) != pressedButtons_.end());
786 }
787
SetButtonPressed(int32_t buttonId)788 void PointerEvent::SetButtonPressed(int32_t buttonId)
789 {
790 if (pressedButtons_.size() >= MAX_N_PRESSED_BUTTONS) {
791 MMI_HILOGE("Exceed maximum allowed number of pressed buttons");
792 return;
793 }
794 auto iter = pressedButtons_.insert(buttonId);
795 if (!iter.second) {
796 MMI_HILOGE("Insert value failed, button:%{public}d", buttonId);
797 }
798 }
799
DeleteReleaseButton(int32_t buttonId)800 void PointerEvent::DeleteReleaseButton(int32_t buttonId)
801 {
802 if (pressedButtons_.find(buttonId) != pressedButtons_.end()) {
803 pressedButtons_.erase(buttonId);
804 }
805 }
806
ClearButtonPressed()807 void PointerEvent::ClearButtonPressed()
808 {
809 pressedButtons_.clear();
810 }
811
GetPointerCount() const812 int32_t PointerEvent::GetPointerCount() const
813 {
814 return static_cast<int32_t>(pointers_.size());
815 }
816
GetPointerIds() const817 std::vector<int32_t> PointerEvent::GetPointerIds() const
818 {
819 std::vector<int32_t> pointerIdList;
820 for (const auto &item : pointers_) {
821 pointerIdList.push_back(item.GetPointerId());
822 }
823 return pointerIdList;
824 }
825
GetAllPointerItems() const826 std::list<PointerEvent::PointerItem> PointerEvent::GetAllPointerItems() const
827 {
828 return pointers_;
829 }
830
GetButtonId() const831 int32_t PointerEvent::GetButtonId() const
832 {
833 return buttonId_;
834 }
835
SetButtonId(int32_t buttonId)836 void PointerEvent::SetButtonId(int32_t buttonId)
837 {
838 buttonId_ = buttonId;
839 }
840
GetFingerCount() const841 int32_t PointerEvent::GetFingerCount() const
842 {
843 return fingerCount_;
844 }
845
SetFingerCount(int32_t fingerCount)846 void PointerEvent::SetFingerCount(int32_t fingerCount)
847 {
848 fingerCount_ = fingerCount;
849 }
850
GetZOrder() const851 float PointerEvent::GetZOrder() const
852 {
853 return zOrder_;
854 }
855
SetZOrder(float zOrder)856 void PointerEvent::SetZOrder(float zOrder)
857 {
858 zOrder_ = zOrder;
859 }
860
GetAxisValue(AxisType axis) const861 double PointerEvent::GetAxisValue(AxisType axis) const
862 {
863 double axisValue {};
864 if ((axis >= AXIS_TYPE_UNKNOWN) && (axis < AXIS_TYPE_MAX)) {
865 axisValue = axisValues_[axis];
866 }
867 return axisValue;
868 }
869
SetAxisValue(AxisType axis,double axisValue)870 void PointerEvent::SetAxisValue(AxisType axis, double axisValue)
871 {
872 if ((axis >= AXIS_TYPE_UNKNOWN) && (axis < AXIS_TYPE_MAX)) {
873 axisValues_[axis] = axisValue;
874 axes_ = static_cast<uint32_t>(axes_ | static_cast<uint32_t>(1 << axis));
875 }
876 }
877
ClearAxisValue()878 void PointerEvent::ClearAxisValue()
879 {
880 axisValues_ = {};
881 axes_ = 0;
882 }
883
ClearAxisStatus(AxisType axis)884 void PointerEvent::ClearAxisStatus(AxisType axis)
885 {
886 axes_ &= ~static_cast<uint32_t>(1U << axis);
887 }
888
HasAxis(uint32_t axes,AxisType axis)889 bool PointerEvent::HasAxis(uint32_t axes, AxisType axis)
890 {
891 bool ret { false };
892 if ((axis >= AXIS_TYPE_UNKNOWN) && (axis < AXIS_TYPE_MAX)) {
893 ret = static_cast<bool>(static_cast<uint32_t>(axes) & (1 << static_cast<uint32_t>(axis)));
894 }
895 return ret;
896 }
897
GetVelocity() const898 double PointerEvent::GetVelocity() const
899 {
900 return velocity_;
901 }
902
SetVelocity(double velocity)903 void PointerEvent::SetVelocity(double velocity)
904 {
905 velocity_ = velocity;
906 }
907
SetPressedKeys(const std::vector<int32_t> pressedKeys)908 void PointerEvent::SetPressedKeys(const std::vector<int32_t> pressedKeys)
909 {
910 pressedKeys_ = pressedKeys;
911 }
912
GetPressedKeys() const913 std::vector<int32_t> PointerEvent::GetPressedKeys() const
914 {
915 return pressedKeys_;
916 }
917
GetAxisEventType() const918 int32_t PointerEvent::GetAxisEventType() const
919 {
920 return axisEventType_;
921 }
922
SetAxisEventType(int32_t axisEventType)923 void PointerEvent::SetAxisEventType(int32_t axisEventType)
924 {
925 axisEventType_ = axisEventType;
926 }
927
GetPullId() const928 int32_t PointerEvent::GetPullId() const
929 {
930 return pullId_;
931 }
932
SetPullId(int32_t pullId)933 void PointerEvent::SetPullId(int32_t pullId)
934 {
935 pullId_ = pullId;
936 }
937
938 #ifdef OHOS_BUILD_ENABLE_SECURITY_COMPONENT
SetEnhanceData(const std::vector<uint8_t> & enhanceData)939 void PointerEvent::SetEnhanceData(const std::vector<uint8_t>& enhanceData)
940 {
941 enhanceData_ = enhanceData;
942 }
943
GetEnhanceData() const944 std::vector<uint8_t> PointerEvent::GetEnhanceData() const
945 {
946 return enhanceData_;
947 }
948 #endif // OHOS_BUILD_ENABLE_SECURITY_COMPONENT
949
WriteToParcel(Parcel & out) const950 bool PointerEvent::WriteToParcel(Parcel &out) const
951 {
952 if (!InputEvent::WriteToParcel(out)) {
953 return false;
954 }
955
956 WRITEINT32(out, pointerId_);
957
958 WRITEINT32(out, static_cast<int32_t>(pointers_.size()));
959
960 for (const auto &item : pointers_) {
961 if (!item.WriteToParcel(out)) {
962 return false;
963 }
964 }
965
966 WRITEINT32(out, static_cast<int32_t>(buffer_.size()));
967
968 for (const auto& buff : buffer_) {
969 WRITEUINT8(out, buff);
970 }
971
972 WRITEINT32(out, static_cast<int32_t>(pressedButtons_.size()));
973
974 for (const auto &item : pressedButtons_) {
975 WRITEINT32(out, item);
976 }
977
978 WRITEINT32(out, static_cast<int32_t>(pressedKeys_.size()));
979
980 for (const auto &item : pressedKeys_) {
981 WRITEINT32(out, item);
982 }
983
984 WRITEINT32(out, pointerAction_);
985
986 WRITEINT32(out, originPointerAction_);
987
988 WRITEINT32(out, buttonId_);
989
990 WRITEINT32(out, fingerCount_);
991
992 WRITEFLOAT(out, zOrder_);
993
994 const uint32_t axes { GetAxes() };
995 WRITEUINT32(out, axes);
996
997 for (int32_t i = AXIS_TYPE_UNKNOWN; i < AXIS_TYPE_MAX; ++i) {
998 const AxisType axis { static_cast<AxisType>(i) };
999 if (HasAxis(axes, axis)) {
1000 WRITEDOUBLE(out, GetAxisValue(axis));
1001 }
1002 }
1003 WRITEDOUBLE(out, velocity_);
1004 WRITEINT32(out, axisEventType_);
1005 WRITEINT32(out, pullId_);
1006 #ifdef OHOS_BUILD_ENABLE_SECURITY_COMPONENT
1007 WRITEINT32(out, static_cast<int32_t>(enhanceData_.size()));
1008 for (uint32_t i = 0; i < enhanceData_.size(); i++) {
1009 WRITEUINT32(out, enhanceData_[i]);
1010 }
1011 #endif // OHOS_BUILD_ENABLE_SECURITY_COMPONENT
1012
1013 #ifdef OHOS_BUILD_ENABLE_FINGERPRINT
1014 WRITEDOUBLE(out, fingerprintDistanceX_);
1015 WRITEDOUBLE(out, fingerprintDistanceY_);
1016 #endif // OHOS_BUILD_ENABLE_FINGERPRINT
1017 WRITEINT32(out, handOption_);
1018 WRITEINT32(out, static_cast<int32_t>(fixedMode_));
1019 WRITEBOOL(out, autoToVirtualScreen_);
1020 return true;
1021 }
1022
ReadFromParcel(Parcel & in)1023 bool PointerEvent::ReadFromParcel(Parcel &in)
1024 {
1025 if (!InputEvent::ReadFromParcel(in)) {
1026 return false;
1027 }
1028
1029 READINT32(in, pointerId_);
1030
1031 int32_t nPointers;
1032 READINT32(in, nPointers);
1033 if (nPointers > static_cast<int32_t>(MAX_N_POINTER_ITEMS)) {
1034 return false;
1035 }
1036
1037 for (int32_t i = 0; i < nPointers; ++i) {
1038 PointerItem item;
1039 if (!item.ReadFromParcel(in)) {
1040 return false;
1041 }
1042 AddPointerItem(item);
1043 }
1044
1045 if (!ReadBufferFromParcel(in)) {
1046 return false;
1047 }
1048
1049 int32_t nPressedButtons;
1050 READINT32(in, nPressedButtons);
1051 if (nPressedButtons > static_cast<int32_t>(MAX_N_PRESSED_BUTTONS)) {
1052 return false;
1053 }
1054
1055 for (int32_t i = 0; i < nPressedButtons; ++i) {
1056 int32_t buttonId = 0;
1057 READINT32(in, buttonId);
1058 SetButtonPressed(buttonId);
1059 }
1060
1061 int32_t nPressedKeys = 0;
1062 READINT32(in, nPressedKeys);
1063 if (nPressedKeys > static_cast<int32_t>(MAX_N_PRESSED_KEYS)) {
1064 return false;
1065 }
1066
1067 for (int32_t i = 0; i < nPressedKeys; i++) {
1068 int32_t val = 0;
1069 READINT32(in, val);
1070 pressedKeys_.emplace_back(val);
1071 }
1072 READINT32(in, pointerAction_);
1073
1074 READINT32(in, originPointerAction_);
1075
1076 READINT32(in, buttonId_);
1077
1078 READINT32(in, fingerCount_);
1079
1080 READFLOAT(in, zOrder_);
1081
1082 if (!ReadAxisFromParcel(in)) {
1083 return false;
1084 }
1085 READDOUBLE(in, velocity_);
1086
1087 READINT32(in, axisEventType_);
1088 READINT32(in, pullId_);
1089 #ifdef OHOS_BUILD_ENABLE_SECURITY_COMPONENT
1090 if (!ReadEnhanceDataFromParcel(in)) {
1091 return false;
1092 }
1093 #endif // OHOS_BUILD_ENABLE_SECURITY_COMPONENT
1094
1095 #ifdef OHOS_BUILD_ENABLE_FINGERPRINT
1096 READDOUBLE(in, fingerprintDistanceX_);
1097 READDOUBLE(in, fingerprintDistanceY_);
1098 #endif // OHOS_BUILD_ENABLE_FINGERPRINT
1099 READINT32(in, handOption_);
1100 if (!ReadFixedModeFromParcel(in)) {
1101 return false;
1102 }
1103 READBOOL(in, autoToVirtualScreen_);
1104 return true;
1105 }
1106
ReadFixedModeFromParcel(Parcel & in)1107 bool PointerEvent::ReadFixedModeFromParcel(Parcel &in)
1108 {
1109 int32_t value = 0;
1110 READINT32(in, value);
1111 if (value < static_cast<int32_t>(FixedMode::SCREEN_MODE_UNKNOWN) ||
1112 value >= static_cast<int32_t>(FixedMode::SCREEN_MODE_MAX)) {
1113 MMI_HILOGE("invalid fixed mode %{public}d", value);
1114 return false;
1115 }
1116 fixedMode_ = static_cast<FixedMode>(value);
1117 return true;
1118 }
1119
ReadAxisFromParcel(Parcel & in)1120 bool PointerEvent::ReadAxisFromParcel(Parcel &in)
1121 {
1122 uint32_t axes = 0;
1123 READUINT32(in, axes);
1124
1125 for (int32_t i = AXIS_TYPE_UNKNOWN; i < AXIS_TYPE_MAX; ++i) {
1126 const AxisType axis { static_cast<AxisType>(i) };
1127 if (HasAxis(axes, axis)) {
1128 double val;
1129 READDOUBLE(in, val);
1130 SetAxisValue(axis, val);
1131 }
1132 }
1133 return true;
1134 }
1135
1136 #ifdef OHOS_BUILD_ENABLE_FINGERPRINT
SetFingerprintDistanceX(double x)1137 void PointerEvent::SetFingerprintDistanceX(double x)
1138 {
1139 fingerprintDistanceX_ = x;
1140 }
1141
SetFingerprintDistanceY(double y)1142 void PointerEvent::SetFingerprintDistanceY(double y)
1143 {
1144 fingerprintDistanceY_ = y;
1145 }
1146
GetFingerprintDistanceX() const1147 double PointerEvent::GetFingerprintDistanceX() const
1148 {
1149 return fingerprintDistanceX_;
1150 }
1151
GetFingerprintDistanceY() const1152 double PointerEvent::GetFingerprintDistanceY() const
1153 {
1154 return fingerprintDistanceY_;
1155 }
1156 #endif // OHOS_BUILD_ENABLE_FINGERPRINT
1157
1158 #ifdef OHOS_BUILD_ENABLE_SECURITY_COMPONENT
ReadEnhanceDataFromParcel(Parcel & in)1159 bool PointerEvent::ReadEnhanceDataFromParcel(Parcel &in)
1160 {
1161 int32_t size = 0;
1162 READINT32(in, size);
1163 if (size > static_cast<int32_t>(MAX_N_ENHANCE_DATA_SIZE) || size < 0) {
1164 MMI_HILOGE("The enhanceData_ size is invalid");
1165 return false;
1166 }
1167
1168 for (int32_t i = 0; i < size; i++) {
1169 uint32_t val = 0;
1170 READUINT32(in, val);
1171 enhanceData_.emplace_back(val);
1172 }
1173 return true;
1174 }
1175 #endif // OHOS_BUILD_ENABLE_SECURITY_COMPONENT
1176
ReadBufferFromParcel(Parcel & in)1177 bool PointerEvent::ReadBufferFromParcel(Parcel &in)
1178 {
1179 int32_t bufflen = 0;
1180 READINT32(in, bufflen);
1181 if (bufflen > static_cast<int32_t>(MAX_N_BUFFER_SIZE)) {
1182 return false;
1183 }
1184
1185 for (int32_t i = 0; i < bufflen; ++i) {
1186 uint8_t data;
1187 READUINT8(in, data);
1188 buffer_.push_back(data);
1189 }
1190 return true;
1191 }
1192
IsValidCheckMouseFunc() const1193 bool PointerEvent::IsValidCheckMouseFunc() const
1194 {
1195 CALL_DEBUG_ENTER;
1196 if (pointers_.size() != 1) {
1197 MMI_HILOGE("Pointers_ is invalid");
1198 return false;
1199 }
1200
1201 const size_t maxPressedButtons = 3;
1202 if (pressedButtons_.size() > maxPressedButtons) {
1203 MMI_HILOGE("PressedButtons_.size is greater than three and is invalid");
1204 return false;
1205 }
1206
1207 for (const auto &item : pressedButtons_) {
1208 if (item != MOUSE_BUTTON_LEFT && item != MOUSE_BUTTON_RIGHT && item != MOUSE_BUTTON_MIDDLE) {
1209 MMI_HILOGE("PressedButtons_ is invalid");
1210 return false;
1211 }
1212 }
1213
1214 int32_t pointAction = GetPointerAction();
1215 bool checkFlag = pointAction != POINTER_ACTION_CANCEL && pointAction != POINTER_ACTION_MOVE &&
1216 pointAction != POINTER_ACTION_AXIS_BEGIN && pointAction != POINTER_ACTION_AXIS_UPDATE &&
1217 pointAction != POINTER_ACTION_AXIS_END && pointAction != POINTER_ACTION_BUTTON_DOWN &&
1218 pointAction != POINTER_ACTION_BUTTON_UP;
1219 if (checkFlag) {
1220 MMI_HILOGE("PointAction is invalid");
1221 return false;
1222 }
1223
1224 int32_t buttonId = GetButtonId();
1225 if (pointAction == POINTER_ACTION_BUTTON_DOWN || pointAction == POINTER_ACTION_BUTTON_UP) {
1226 if (buttonId != MOUSE_BUTTON_LEFT && buttonId != MOUSE_BUTTON_RIGHT && buttonId != MOUSE_BUTTON_MIDDLE) {
1227 MMI_HILOGE("ButtonId is invalid");
1228 return false;
1229 }
1230 } else {
1231 if (buttonId != BUTTON_NONE) {
1232 MMI_HILOGE("ButtonId is not BUTTON_NONE and is invalid");
1233 return false;
1234 }
1235 }
1236 return true;
1237 }
1238
IsValidCheckMouse() const1239 bool PointerEvent::IsValidCheckMouse() const
1240 {
1241 CALL_DEBUG_ENTER;
1242 int32_t mousePointID = GetPointerId();
1243 if (mousePointID < 0) {
1244 MMI_HILOGE("MousePointID is invalid");
1245 return false;
1246 }
1247
1248 if (!IsValidCheckMouseFunc()) {
1249 MMI_HILOGE("IsValidCheckMouseFunc is invalid");
1250 return false;
1251 }
1252
1253 for (const auto &item : pointers_) {
1254 if (item.GetPointerId() < 0) {
1255 MMI_HILOGE("Item.pointerid is invalid");
1256 return false;
1257 }
1258
1259 if (item.GetPointerId() != mousePointID) {
1260 MMI_HILOGE("Item.pointerid is not same to mousePointID and is invalid");
1261 return false;
1262 }
1263
1264 if (item.GetDownTime() > 0) {
1265 MMI_HILOGE("Item.downtime is invalid");
1266 return false;
1267 }
1268
1269 if (item.IsPressed() != false) {
1270 MMI_HILOGE("Item.ispressed is not false and is invalid");
1271 return false;
1272 }
1273 }
1274 return true;
1275 }
1276
IsValidCheckTouchFunc() const1277 bool PointerEvent::IsValidCheckTouchFunc() const
1278 {
1279 CALL_DEBUG_ENTER;
1280 if (GetPointerId() < 0) {
1281 MMI_HILOGE("TouchPointID is invalid");
1282 return false;
1283 }
1284
1285 if (!pressedButtons_.empty()) {
1286 MMI_HILOGE("PressedButtons_.size is invalid");
1287 return false;
1288 }
1289
1290 int32_t pointAction = GetPointerAction();
1291 if (pointAction != POINTER_ACTION_CANCEL && pointAction != POINTER_ACTION_MOVE &&
1292 pointAction != POINTER_ACTION_DOWN && pointAction != POINTER_ACTION_UP) {
1293 MMI_HILOGE("PointAction is invalid");
1294 return false;
1295 }
1296
1297 if (GetButtonId() != BUTTON_NONE) {
1298 MMI_HILOGE("ButtonId is invalid");
1299 return false;
1300 }
1301 return true;
1302 }
1303
IsValidCheckTouch() const1304 bool PointerEvent::IsValidCheckTouch() const
1305 {
1306 CALL_DEBUG_ENTER;
1307 if (!IsValidCheckTouchFunc()) {
1308 MMI_HILOGE("IsValidCheckTouchFunc is invalid");
1309 return false;
1310 }
1311 bool isSameItem = false;
1312 int32_t touchPointID = GetPointerId();
1313 for (auto item = pointers_.begin(); item != pointers_.end(); item++) {
1314 if (item->GetPointerId() < 0) {
1315 MMI_HILOGE("Item.pointerid is invalid");
1316 return false;
1317 }
1318
1319 if (item->GetPointerId() == touchPointID) {
1320 isSameItem = true;
1321 }
1322
1323 if (item->GetDownTime() <= 0) {
1324 MMI_HILOGE("Item.downtime is invalid");
1325 return false;
1326 }
1327
1328 if (item->IsPressed() != false) {
1329 MMI_HILOGE("Item.ispressed is not false and is invalid");
1330 return false;
1331 }
1332
1333 auto itemtmp = item;
1334 for (++itemtmp; itemtmp != pointers_.end(); itemtmp++) {
1335 if (item->GetPointerId() == itemtmp->GetPointerId()) {
1336 MMI_HILOGE("Pointitems pointerid exist same items and is invalid");
1337 return false;
1338 }
1339 }
1340 }
1341
1342 if (!isSameItem) {
1343 MMI_HILOGE("Item.pointerid is not same to touchPointID and is invalid");
1344 return false;
1345 }
1346 return true;
1347 }
1348
IsValid() const1349 bool PointerEvent::IsValid() const
1350 {
1351 CALL_DEBUG_ENTER;
1352 switch (GetSourceType()) {
1353 case SOURCE_TYPE_MOUSE: {
1354 if (!IsValidCheckMouse()) {
1355 MMI_HILOGE("IsValidCheckMouse is invalid");
1356 return false;
1357 }
1358 break;
1359 }
1360 case SOURCE_TYPE_TOUCHSCREEN:
1361 case SOURCE_TYPE_TOUCHPAD: {
1362 if (!IsValidCheckTouch()) {
1363 MMI_HILOGE("IsValidCheckTouch is invalid");
1364 return false;
1365 }
1366 break;
1367 }
1368 case SOURCE_TYPE_JOYSTICK:
1369 break;
1370 default: {
1371 MMI_HILOGE("SourceType is invalid");
1372 return false;
1373 }
1374 }
1375 return true;
1376 }
1377
SetBuffer(std::vector<uint8_t> buffer)1378 void PointerEvent::SetBuffer(std::vector<uint8_t> buffer)
1379 {
1380 buffer_ = buffer;
1381 }
1382
ClearBuffer()1383 void PointerEvent::ClearBuffer()
1384 {
1385 buffer_.clear();
1386 }
1387
GetBuffer() const1388 std::vector<uint8_t> PointerEvent::GetBuffer() const
1389 {
1390 return buffer_;
1391 }
1392
GetDispatchTimes() const1393 int32_t PointerEvent::GetDispatchTimes() const
1394 {
1395 return dispatchTimes_;
1396 }
1397
SetDispatchTimes(int32_t dispatchTimes)1398 void PointerEvent::SetDispatchTimes(int32_t dispatchTimes)
1399 {
1400 dispatchTimes_ = dispatchTimes;
1401 }
1402
SetHandlerEventType(HandleEventType eventType)1403 void PointerEvent::SetHandlerEventType(HandleEventType eventType)
1404 {
1405 handleEventType_ = eventType;
1406 }
1407
GetHandlerEventType() const1408 HandleEventType PointerEvent::GetHandlerEventType() const
1409 {
1410 return handleEventType_;
1411 }
1412
1413 #ifdef OHOS_BUILD_ENABLE_ANCO
SetAncoDeal(bool ancoDeal)1414 void PointerEvent::SetAncoDeal(bool ancoDeal)
1415 {
1416 ancoDeal_ = ancoDeal;
1417 }
1418
GetAncoDeal() const1419 bool PointerEvent::GetAncoDeal() const
1420 {
1421 return ancoDeal_;
1422 }
1423 #endif // OHOS_BUILD_ENABLE_ANCO
1424
SetAutoToVirtualScreen(bool autoToVirtualScreen)1425 void PointerEvent::SetAutoToVirtualScreen(bool autoToVirtualScreen)
1426 {
1427 autoToVirtualScreen_ = autoToVirtualScreen;
1428 }
1429
GetAutoToVirtualScreen() const1430 bool PointerEvent::GetAutoToVirtualScreen() const
1431 {
1432 return autoToVirtualScreen_;
1433 }
1434
SetFixedMode(PointerEvent::FixedMode fixedMode)1435 void PointerEvent::SetFixedMode(PointerEvent::FixedMode fixedMode)
1436 {
1437 fixedMode_ = fixedMode;
1438 }
1439
GetFixedMode() const1440 PointerEvent::FixedMode PointerEvent::GetFixedMode() const
1441 {
1442 return fixedMode_;
1443 }
1444
GetFixedModeStr() const1445 std::string PointerEvent::GetFixedModeStr() const
1446 {
1447 switch (fixedMode_) {
1448 case PointerEvent::FixedMode::NORMAL:
1449 return "normal";
1450 case PointerEvent::FixedMode::ONE_HAND:
1451 return "one-hand";
1452 default:
1453 return "unknown";
1454 }
1455 }
1456
ActionToShortStr(int32_t action)1457 std::string_view PointerEvent::ActionToShortStr(int32_t action)
1458 {
1459 // 该函数逻辑简单,功能单一,考虑性能影响,使用switch-case而不是表驱动实现。
1460 switch (action) {
1461 case PointerEvent::POINTER_ACTION_CANCEL:
1462 return "P:C:";
1463 case PointerEvent::POINTER_ACTION_DOWN:
1464 return "P:D:";
1465 case PointerEvent::POINTER_ACTION_MOVE:
1466 return "P:M:";
1467 case PointerEvent::POINTER_ACTION_UP:
1468 return "P:U:";
1469 case PointerEvent::POINTER_ACTION_AXIS_BEGIN:
1470 return "P:AB:";
1471 case PointerEvent::POINTER_ACTION_AXIS_UPDATE:
1472 return "P:AU:";
1473 case PointerEvent::POINTER_ACTION_AXIS_END:
1474 return "P:AE:";
1475 case PointerEvent::POINTER_ACTION_BUTTON_DOWN:
1476 return "P:BD:";
1477 case PointerEvent::POINTER_ACTION_BUTTON_UP:
1478 return "P:BU:";
1479 case PointerEvent::POINTER_ACTION_ENTER_WINDOW:
1480 return "P:EW:";
1481 case PointerEvent::POINTER_ACTION_LEAVE_WINDOW:
1482 return "P:LW:";
1483 case PointerEvent::POINTER_ACTION_PULL_DOWN:
1484 return "P:PD:";
1485 case PointerEvent::POINTER_ACTION_PULL_MOVE:
1486 return "P:PM:";
1487 case PointerEvent::POINTER_ACTION_PULL_UP:
1488 return "P:PU:";
1489 case PointerEvent::POINTER_ACTION_PULL_IN_WINDOW:
1490 return "P:PI:";
1491 case PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW:
1492 return "P:PO:";
1493 case PointerEvent::POINTER_ACTION_SWIPE_BEGIN:
1494 return "P:SB:";
1495 case PointerEvent::POINTER_ACTION_SWIPE_UPDATE:
1496 return "P:SU:";
1497 case PointerEvent::POINTER_ACTION_SWIPE_END:
1498 return "P:SE:";
1499 case PointerEvent::POINTER_ACTION_ROTATE_BEGIN:
1500 return "P:RB:";
1501 case PointerEvent::POINTER_ACTION_ROTATE_UPDATE:
1502 return "P:RU:";
1503 case PointerEvent::POINTER_ACTION_ROTATE_END:
1504 return "P:RE:";
1505 case PointerEvent::POINTER_ACTION_TRIPTAP:
1506 return "P:TT:";
1507 case PointerEvent::POINTER_ACTION_QUADTAP:
1508 return "P:Q:";
1509 case PointerEvent::POINTER_ACTION_HOVER_MOVE:
1510 return "P:HM:";
1511 case PointerEvent::POINTER_ACTION_HOVER_ENTER:
1512 return "P:HE:";
1513 case PointerEvent::POINTER_ACTION_HOVER_EXIT:
1514 return "P:HEX:";
1515 case PointerEvent::POINTER_ACTION_FINGERPRINT_DOWN:
1516 return "P:FD:";
1517 case PointerEvent::POINTER_ACTION_FINGERPRINT_UP:
1518 return "P:FU:";
1519 case PointerEvent::POINTER_ACTION_FINGERPRINT_SLIDE:
1520 return "P:FS:";
1521 case PointerEvent::POINTER_ACTION_FINGERPRINT_RETOUCH:
1522 return "P:FR:";
1523 case PointerEvent::POINTER_ACTION_FINGERPRINT_CLICK:
1524 return "P:FC:";
1525 case PointerEvent::POINTER_ACTION_FINGERPRINT_CANCEL:
1526 return "P:FCA:";
1527 case PointerEvent::POINTER_ACTION_UNKNOWN:
1528 return "P:UK:";
1529 default:
1530 return "P:?:";
1531 }
1532 }
1533
SetScrollRows(int32_t scrollRows)1534 void PointerEvent::SetScrollRows(int32_t scrollRows)
1535 {
1536 settings_.scrollRows_ = scrollRows;
1537 }
1538
GetScrollRows() const1539 int32_t PointerEvent::GetScrollRows() const
1540 {
1541 return settings_.scrollRows_;
1542 }
1543 } // namespace MMI
1544 } // namespace OHOS
1545