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 "event_monitor_handler.h"
17
18 #include "anr_manager.h"
19 #include "app_debug_listener.h"
20 #include "bytrace_adapter.h"
21 #include "define_multimodal.h"
22 #include "input_event_data_transformation.h"
23 #include "input_event_handler.h"
24 #include "mmi_log.h"
25 #include "napi_constants.h"
26 #include "net_packet.h"
27 #include "proto.h"
28 #include "util_ex.h"
29
30 #undef MMI_LOG_DOMAIN
31 #define MMI_LOG_DOMAIN MMI_LOG_HANDLER
32 #undef MMI_LOG_TAG
33 #define MMI_LOG_TAG "EventMonitorHandler"
34
35 namespace OHOS {
36 namespace MMI {
37 namespace {
38 #ifdef OHOS_BUILD_ENABLE_TOUCH
39 constexpr size_t MAX_EVENTIDS_SIZE { 1000 };
40 #endif // OHOS_BUILD_ENABLE_TOUCH
41 constexpr int32_t ACTIVE_EVENT { 2 };
42 constexpr int32_t REMOVE_OBSERVER { -2 };
43 constexpr int32_t UNOBSERVED { -1 };
44 } // namespace
45
46 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
HandleKeyEvent(const std::shared_ptr<KeyEvent> keyEvent)47 void EventMonitorHandler::HandleKeyEvent(const std::shared_ptr<KeyEvent> keyEvent)
48 {
49 CHKPV(keyEvent);
50 OnHandleEvent(keyEvent);
51 CHKPV(nextHandler_);
52 nextHandler_->HandleKeyEvent(keyEvent);
53 }
54 #endif // OHOS_BUILD_ENABLE_KEYBOARD
55
56 #ifdef OHOS_BUILD_ENABLE_POINTER
HandlePointerEvent(const std::shared_ptr<PointerEvent> pointerEvent)57 void EventMonitorHandler::HandlePointerEvent(const std::shared_ptr<PointerEvent> pointerEvent)
58 {
59 CHKPV(pointerEvent);
60 if (OnHandleEvent(pointerEvent)) {
61 BytraceAdapter::StartBytrace(pointerEvent, BytraceAdapter::TRACE_STOP);
62 MMI_HILOGD("Monitor is succeeded");
63 return;
64 }
65 CHKPV(nextHandler_);
66 nextHandler_->HandlePointerEvent(pointerEvent);
67 }
68 #endif // OHOS_BUILD_ENABLE_POINTER
69
70 #ifdef OHOS_BUILD_ENABLE_TOUCH
HandleTouchEvent(const std::shared_ptr<PointerEvent> pointerEvent)71 void EventMonitorHandler::HandleTouchEvent(const std::shared_ptr<PointerEvent> pointerEvent)
72 {
73 CHKPV(pointerEvent);
74 if (OnHandleEvent(pointerEvent)) {
75 BytraceAdapter::StartBytrace(pointerEvent, BytraceAdapter::TRACE_STOP);
76 MMI_HILOGD("Monitor is succeeded");
77 return;
78 }
79 int32_t pointerId = pointerEvent->GetPointerId();
80 PointerEvent::PointerItem item;
81 if (pointerEvent->GetPointerItem(pointerId, item)) {
82 if (item.GetToolType() == PointerEvent::TOOL_TYPE_KNUCKLE) {
83 MMI_HILOGD("Knuckle event, skip");
84 return;
85 }
86 }
87 CHKPV(nextHandler_);
88 nextHandler_->HandleTouchEvent(pointerEvent);
89 }
90 #endif // OHOS_BUILD_ENABLE_TOUCH
91
CheckHasInputHandler(HandleEventType eventType)92 bool EventMonitorHandler::CheckHasInputHandler(HandleEventType eventType)
93 {
94 return monitors_.CheckHasInputHandler(eventType);
95 }
96
AddInputHandler(InputHandlerType handlerType, HandleEventType eventType, std::shared_ptr<IInputEventConsumer> callback)97 int32_t EventMonitorHandler::AddInputHandler(InputHandlerType handlerType,
98 HandleEventType eventType, std::shared_ptr<IInputEventConsumer> callback)
99 {
100 CALL_INFO_TRACE;
101 CHKPR(callback, RET_ERR);
102 if ((eventType & HANDLE_EVENT_TYPE_ALL) == HANDLE_EVENT_TYPE_NONE) {
103 MMI_HILOGE("Invalid event type");
104 return RET_ERR;
105 }
106 InitSessionLostCallback();
107 SessionHandler mon { handlerType, eventType, nullptr, callback };
108 return monitors_.AddMonitor(mon);
109 }
110
AddInputHandler(InputHandlerType handlerType, HandleEventType eventType, SessionPtr session, TouchGestureType gestureType, int32_t fingers)111 int32_t EventMonitorHandler::AddInputHandler(InputHandlerType handlerType,
112 HandleEventType eventType, SessionPtr session, TouchGestureType gestureType, int32_t fingers)
113 {
114 CALL_INFO_TRACE;
115 CHKPR(session, RET_ERR);
116 if ((eventType & HANDLE_EVENT_TYPE_ALL) == HANDLE_EVENT_TYPE_NONE) {
117 MMI_HILOGE("Invalid event type");
118 return RET_ERR;
119 }
120 InitSessionLostCallback();
121 SessionHandler mon { handlerType, eventType, session, gestureType, fingers };
122 return monitors_.AddMonitor(mon);
123 }
124
AddInputHandler(InputHandlerType handlerType, std::vector<int32_t> actionsType, SessionPtr session)125 int32_t EventMonitorHandler::AddInputHandler(InputHandlerType handlerType,
126 std::vector<int32_t> actionsType, SessionPtr session)
127 {
128 CALL_INFO_TRACE;
129 CHKPR(session, RET_ERR);
130 InitSessionLostCallback();
131 SessionHandler mon { handlerType, HANDLE_EVENT_TYPE_NONE, session, actionsType };
132 return monitors_.AddMonitor(mon);
133 }
134
RemoveInputHandler(InputHandlerType handlerType, HandleEventType eventType, std::shared_ptr<IInputEventConsumer> callback)135 void EventMonitorHandler::RemoveInputHandler(InputHandlerType handlerType,
136 HandleEventType eventType, std::shared_ptr<IInputEventConsumer> callback)
137 {
138 CALL_INFO_TRACE;
139 CHKPV(callback);
140 if (handlerType == InputHandlerType::MONITOR) {
141 SessionHandler monitor {handlerType, eventType, nullptr, callback};
142 monitors_.RemoveMonitor(monitor);
143 }
144 }
145
RemoveInputHandler(InputHandlerType handlerType, std::vector<int32_t> actionsType, SessionPtr session)146 void EventMonitorHandler::RemoveInputHandler(InputHandlerType handlerType, std::vector<int32_t> actionsType,
147 SessionPtr session)
148 {
149 CALL_INFO_TRACE;
150 if (handlerType == InputHandlerType::MONITOR) {
151 SessionHandler monitor { handlerType, HANDLE_EVENT_TYPE_NONE, session, actionsType };
152 monitors_.RemoveMonitor(monitor);
153 }
154 }
155
RemoveInputHandler(InputHandlerType handlerType, HandleEventType eventType, SessionPtr session, TouchGestureType gestureType, int32_t fingers)156 void EventMonitorHandler::RemoveInputHandler(InputHandlerType handlerType, HandleEventType eventType,
157 SessionPtr session, TouchGestureType gestureType, int32_t fingers)
158 {
159 CALL_INFO_TRACE;
160 if (handlerType == InputHandlerType::MONITOR) {
161 SessionHandler monitor { handlerType, eventType, session, gestureType, fingers };
162 monitors_.RemoveMonitor(monitor);
163 }
164 }
165
MarkConsumed(int32_t eventId, SessionPtr session)166 void EventMonitorHandler::MarkConsumed(int32_t eventId, SessionPtr session)
167 {
168 LogTracer lt(eventId, 0, 0);
169 monitors_.MarkConsumed(eventId, session);
170 }
171
172 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
OnHandleEvent(std::shared_ptr<KeyEvent> keyEvent)173 bool EventMonitorHandler::OnHandleEvent(std::shared_ptr<KeyEvent> keyEvent)
174 {
175 MMI_HILOGD("Handle KeyEvent");
176 CHKPF(keyEvent);
177 if (keyEvent->HasFlag(InputEvent::EVENT_FLAG_NO_MONITOR)) {
178 MMI_HILOGD("This event has been tagged as not to be monitored");
179 } else {
180 if (monitors_.HandleEvent(keyEvent)) {
181 MMI_HILOGD("Key event was consumed");
182 return true;
183 }
184 }
185 return false;
186 }
187 #endif // OHOS_BUILD_ENABLE_KEYBOARD
188
189 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
OnHandleEvent(std::shared_ptr<PointerEvent> pointerEvent)190 bool EventMonitorHandler::OnHandleEvent(std::shared_ptr<PointerEvent> pointerEvent)
191 {
192 CHKPF(pointerEvent);
193 if (pointerEvent->HasFlag(InputEvent::EVENT_FLAG_NO_MONITOR)) {
194 MMI_HILOGD("This event has been tagged as not to be monitored");
195 } else {
196 if (monitors_.HandleEvent(pointerEvent)) {
197 MMI_HILOGD("Pointer event was monitor");
198 return true;
199 }
200 }
201 MMI_HILOGD("Interception and monitor failed");
202 return false;
203 }
204 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
205
InitSessionLostCallback()206 void EventMonitorHandler::InitSessionLostCallback()
207 {
208 if (sessionLostCallbackInitialized_) {
209 return;
210 }
211 auto udsServerPtr = InputHandler->GetUDSServer();
212 CHKPV(udsServerPtr);
213 udsServerPtr->AddSessionDeletedCallback([this] (SessionPtr session) {
214 return this->OnSessionLost(session);
215 });
216 sessionLostCallbackInitialized_ = true;
217 MMI_HILOGD("The callback on session deleted is registered successfully");
218 }
219
OnSessionLost(SessionPtr session)220 void EventMonitorHandler::OnSessionLost(SessionPtr session)
221 {
222 monitors_.OnSessionLost(session);
223 }
224
Expect(std::shared_ptr<PointerEvent> pointerEvent) const225 bool EventMonitorHandler::SessionHandler::Expect(std::shared_ptr<PointerEvent> pointerEvent) const
226 {
227 if (GestureMonitorHandler::IsTouchGestureEvent(pointerEvent->GetPointerAction())) {
228 return (((eventType_ & HANDLE_EVENT_TYPE_TOUCH_GESTURE) == HANDLE_EVENT_TYPE_TOUCH_GESTURE) &&
229 gesture_.IsMatchGesture(pointerEvent->GetPointerAction(), pointerEvent->GetPointerCount()));
230 } else {
231 return ((eventType_ & HANDLE_EVENT_TYPE_POINTER) == HANDLE_EVENT_TYPE_POINTER);
232 }
233 }
234
SendToClient(std::shared_ptr<KeyEvent> keyEvent, NetPacket &pkt) const235 void EventMonitorHandler::SessionHandler::SendToClient(std::shared_ptr<KeyEvent> keyEvent, NetPacket &pkt) const
236 {
237 CHKPV(keyEvent);
238 CHKPV(session_);
239 if (InputEventDataTransformation::KeyEventToNetPacket(keyEvent, pkt) != RET_OK) {
240 MMI_HILOGE("Packet key event failed, errCode:%{public}d", STREAM_BUF_WRITE_FAIL);
241 return;
242 }
243 if (!session_->SendMsg(pkt)) {
244 MMI_HILOGE("Send message failed, errCode:%{public}d", MSG_SEND_FAIL);
245 }
246 }
247
SendToClient(std::shared_ptr<PointerEvent> pointerEvent, NetPacket &pkt) const248 void EventMonitorHandler::SessionHandler::SendToClient(std::shared_ptr<PointerEvent> pointerEvent,
249 NetPacket &pkt) const
250 {
251 CHKPV(pointerEvent);
252 CHKPV(session_);
253 MMI_HILOGD("Service SendToClient InputHandlerType:%{public}d, TokenType:%{public}d, pid:%{public}d",
254 handlerType_, session_->GetTokenType(), session_->GetPid());
255 if (!session_->SendMsg(pkt)) {
256 MMI_HILOGE("Send message failed, errCode:%{public}d", MSG_SEND_FAIL);
257 }
258 }
259
AddMonitor(const SessionHandler& monitor)260 int32_t EventMonitorHandler::MonitorCollection::AddMonitor(const SessionHandler& monitor)
261 {
262 if (monitors_.size() >= MAX_N_INPUT_MONITORS) {
263 MMI_HILOGE("The number of monitors exceeds the maximum:%{public}zu, monitors errCode:%{public}d",
264 monitors_.size(), INVALID_MONITOR_MON);
265 return RET_ERR;
266 }
267 bool isFound = false;
268 SessionHandler handler = monitor;
269 auto iter = monitors_.find(monitor);
270 if (iter != monitors_.end()) {
271 isFound = true;
272 }
273 if (isFound && iter->actionsType_.empty()) {
274 return UpdateEventTypeMonitor(iter, monitor, handler, isFound);
275 } else if (isFound && !iter->actionsType_.empty()) {
276 return UpdateActionsTypeMonitor(iter, monitor, isFound);
277 }
278
279 if (!monitor.actionsType_.empty()) {
280 for (auto action : monitor.actionsType_) {
281 if (std::find(insertToMonitorsActions_.begin(), insertToMonitorsActions_.end(), action) ==
282 insertToMonitorsActions_.end()) {
283 insertToMonitorsActions_.push_back(action);
284 }
285 }
286 }
287 auto [sIter, isOk] = monitors_.insert(monitor);
288 if (!isOk) {
289 MMI_HILOGE("Failed to add monitor");
290 return RET_ERR;
291 }
292 MMI_HILOGD("Service Add Monitor Success");
293 return RET_OK;
294 }
295
UpdateEventTypeMonitor(const std::set<SessionHandler>::iterator &iter, const SessionHandler &monitor, SessionHandler &handler, bool isFound)296 int32_t EventMonitorHandler::MonitorCollection::UpdateEventTypeMonitor(const std::set<SessionHandler>::iterator &iter,
297 const SessionHandler &monitor, SessionHandler &handler, bool isFound)
298 {
299 if (iter->eventType_ == monitor.eventType_ &&
300 ((monitor.eventType_ & HANDLE_EVENT_TYPE_TOUCH_GESTURE) != HANDLE_EVENT_TYPE_TOUCH_GESTURE)) {
301 MMI_HILOGD("Monitor with event type (%{public}u) already exists", monitor.eventType_);
302 return RET_OK;
303 }
304 if ((monitor.eventType_ & HANDLE_EVENT_TYPE_TOUCH_GESTURE) == HANDLE_EVENT_TYPE_TOUCH_GESTURE) {
305 auto gestureHandler = iter->gesture_;
306 gestureHandler.AddGestureMonitor(monitor.gesture_.gestureType_, monitor.gesture_.fingers_);
307 handler(gestureHandler);
308 }
309
310 monitors_.erase(iter);
311 auto [sIter, isOk] = monitors_.insert(handler);
312 if (!isOk) {
313 if (isFound) {
314 MMI_HILOGE("Internal error: monitor has been removed");
315 } else {
316 MMI_HILOGE("Failed to add monitor");
317 }
318 return RET_ERR;
319 }
320 MMI_HILOGD("Event type is updated:%{public}u", monitor.eventType_);
321 return RET_OK;
322 }
323
UpdateActionsTypeMonitor(const std::set<SessionHandler>::iterator &iter, const SessionHandler &monitor, bool isFound)324 int32_t EventMonitorHandler::MonitorCollection::UpdateActionsTypeMonitor(const std::set<SessionHandler>::iterator &iter,
325 const SessionHandler &monitor, bool isFound)
326 {
327 if (!IsNeedInsertToMonitors(iter->actionsType_)) {
328 return RET_OK;
329 }
330 monitors_.erase(iter);
331 auto [sIter, isOk] = monitors_.insert(monitor);
332 if (!isOk && isFound) {
333 MMI_HILOGE("Internal error: monitor has been removed");
334 return RET_ERR;
335 } else if (!isOk && !isFound) {
336 MMI_HILOGE("Failed to add monitor");
337 return RET_ERR;
338 }
339 MMI_HILOGD("Actions type is updated");
340 return RET_OK;
341 }
342
IsNeedInsertToMonitors(std::vector<int32_t> actionsType)343 bool EventMonitorHandler::MonitorCollection::IsNeedInsertToMonitors(std::vector<int32_t> actionsType)
344 {
345 bool isNeedInsertToMonitors = false;
346 for (auto action : actionsType) {
347 if (std::find(insertToMonitorsActions_.begin(), insertToMonitorsActions_.end(), action) ==
348 insertToMonitorsActions_.end()) {
349 insertToMonitorsActions_.push_back(action);
350 isNeedInsertToMonitors = true;
351 }
352 }
353 return isNeedInsertToMonitors;
354 }
355
RemoveMonitor(const SessionHandler& monitor)356 void EventMonitorHandler::MonitorCollection::RemoveMonitor(const SessionHandler& monitor)
357 {
358 SessionHandler handler = monitor;
359 auto iter = monitors_.find(monitor);
360 if (iter == monitors_.cend()) {
361 MMI_HILOGE("Monitor does not exist");
362 return;
363 }
364
365 if ((monitor.eventType_ & HANDLE_EVENT_TYPE_TOUCH_GESTURE) == HANDLE_EVENT_TYPE_TOUCH_GESTURE) {
366 auto gestureHandler = iter->gesture_;
367 gestureHandler.RemoveGestureMonitor(monitor.gesture_.gestureType_, monitor.gesture_.fingers_);
368 handler(gestureHandler);
369 }
370 monitors_.erase(iter);
371 if (monitor.session_) {
372 int32_t pid = monitor.session_->GetPid();
373 auto it = endScreenCaptureMonitors_.find(pid);
374 if (it != endScreenCaptureMonitors_.end()) {
375 auto setIter = endScreenCaptureMonitors_[pid].find(monitor);
376 if (setIter != endScreenCaptureMonitors_[pid].end()) {
377 endScreenCaptureMonitors_[pid].erase(setIter);
378 }
379 if (endScreenCaptureMonitors_[pid].empty()) {
380 endScreenCaptureMonitors_.erase(it);
381 }
382 }
383 }
384 if (monitor.eventType_ == HANDLE_EVENT_TYPE_NONE) {
385 MMI_HILOGD("Unregister monitor successfully");
386 return;
387 }
388
389 auto [sIter, isOk] = monitors_.insert(handler);
390 if (!isOk) {
391 MMI_HILOGE("Internal error, monitor has been removed");
392 return;
393 }
394 MMI_HILOGD("Event type is updated:%{public}u", monitor.eventType_);
395 }
396
MarkConsumed(int32_t eventId, SessionPtr session)397 void EventMonitorHandler::MonitorCollection::MarkConsumed(int32_t eventId, SessionPtr session)
398 {
399 if (!HasMonitor(session)) {
400 MMI_HILOGW("Specified monitor does not exist");
401 return;
402 }
403 auto tIter = states_.begin();
404 for (; tIter != states_.end(); ++tIter) {
405 const auto &eventIds = tIter->second.eventIds_;
406 if (eventIds.find(eventId) != eventIds.cend()) {
407 break;
408 }
409 }
410 if (tIter == states_.end()) {
411 MMI_HILOGE("No operation corresponding to this event");
412 return;
413 }
414 ConsumptionState &state = tIter->second;
415
416 if (state.isMonitorConsumed_) {
417 MMI_HILOGE("Corresponding operation has been marked as consumed");
418 return;
419 }
420 state.isMonitorConsumed_ = true;
421 CHKPV(state.lastPointerEvent_);
422 #ifdef OHOS_BUILD_ENABLE_TOUCH
423 MMI_HILOGD("Cancel operation");
424 auto pointerEvent = std::make_shared<PointerEvent>(*state.lastPointerEvent_);
425 pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_CANCEL);
426 pointerEvent->SetActionTime(GetSysClockTime());
427 pointerEvent->UpdateId();
428 pointerEvent->AddFlag(InputEvent::EVENT_FLAG_NO_INTERCEPT | InputEvent::EVENT_FLAG_NO_MONITOR);
429 auto inputEventNormalizeHandler = InputHandler->GetEventNormalizeHandler();
430 CHKPV(inputEventNormalizeHandler);
431 inputEventNormalizeHandler->HandleTouchEvent(pointerEvent);
432 #endif // OHOS_BUILD_ENABLE_TOUCH
433 }
434
435 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
HandleEvent(std::shared_ptr<KeyEvent> keyEvent)436 bool EventMonitorHandler::MonitorCollection::HandleEvent(std::shared_ptr<KeyEvent> keyEvent)
437 {
438 CHKPF(keyEvent);
439 MMI_HILOGD("There are currently %{public}zu monitors", monitors_.size());
440 NetPacket pkt(MmiMessageId::REPORT_KEY_EVENT);
441 pkt << InputHandlerType::MONITOR << static_cast<uint32_t>(evdev_device_udev_tags::EVDEV_UDEV_TAG_INPUT);
442 if (pkt.ChkRWError()) {
443 MMI_HILOGE("Packet write key event failed");
444 return false;
445 }
446 for (const auto &mon : monitors_) {
447 if ((mon.eventType_ & HANDLE_EVENT_TYPE_KEY) == HANDLE_EVENT_TYPE_KEY) {
448 mon.SendToClient(keyEvent, pkt);
449 }
450 }
451 if (NapProcess::GetInstance()->GetNapClientPid() != REMOVE_OBSERVER &&
452 NapProcess::GetInstance()->GetNapClientPid() != UNOBSERVED) {
453 for (const auto &mon : monitors_) {
454 OHOS::MMI::NapProcess::NapStatusData napData;
455 auto sess = mon.session_;
456 if (!sess) {
457 continue;
458 }
459 napData.pid = sess->GetPid();
460 napData.uid = sess->GetUid();
461 napData.bundleName = sess->GetProgramName();
462 if (NapProcess::GetInstance()->IsNeedNotify(napData)) {
463 int32_t syncState = ACTIVE_EVENT;
464 NapProcess::GetInstance()->AddMmiSubscribedEventData(napData, syncState);
465 NapProcess::GetInstance()->NotifyBundleName(napData, syncState);
466 }
467 }
468 }
469 return false;
470 }
471 #endif // OHOS_BUILD_ENABLE_KEYBOARD
472
473 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
HandleEvent(std::shared_ptr<PointerEvent> pointerEvent)474 bool EventMonitorHandler::MonitorCollection::HandleEvent(std::shared_ptr<PointerEvent> pointerEvent)
475 {
476 CHKPF(pointerEvent);
477 #ifdef OHOS_BUILD_ENABLE_TOUCH
478 UpdateConsumptionState(pointerEvent);
479 #endif // OHOS_BUILD_ENABLE_TOUCH
480 Monitor(pointerEvent);
481 if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_TOUCHSCREEN ||
482 pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_TOUCHPAD) {
483 auto iter = states_.find(pointerEvent->GetDeviceId());
484 return (iter != states_.end() ? iter->second.isMonitorConsumed_ : false);
485 }
486 MMI_HILOGD("This is not a touch-screen event");
487 return false;
488 }
489 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
490
HasMonitor(SessionPtr session)491 bool EventMonitorHandler::MonitorCollection::HasMonitor(SessionPtr session)
492 {
493 SessionHandler monitor { InputHandlerType::MONITOR, HANDLE_EVENT_TYPE_ALL, session };
494 return (monitors_.find(monitor) != monitors_.end());
495 }
496
HasScreenCaptureMonitor(SessionPtr session)497 bool EventMonitorHandler::MonitorCollection::HasScreenCaptureMonitor(SessionPtr session)
498 {
499 int32_t pid = session->GetPid();
500 return (endScreenCaptureMonitors_.find(pid) != endScreenCaptureMonitors_.end());
501 }
502
RemoveScreenCaptureMonitor(SessionPtr session)503 void EventMonitorHandler::MonitorCollection::RemoveScreenCaptureMonitor(SessionPtr session)
504 {
505 if (session->GetTokenType() != TokenType::TOKEN_HAP) {
506 return;
507 }
508 int32_t pid = session->GetPid();
509 std::set<SessionHandler> monitorSet;
510 for (const auto &monitor : monitors_) {
511 if (monitor.session_ == session) {
512 SessionHandler screenCaptureMointor(monitor);
513 monitorSet.insert(screenCaptureMointor);
514 }
515 }
516 for (const auto &monitor : monitorSet) {
517 auto it = monitors_.find(monitor);
518 if (it != monitors_.end()) {
519 monitors_.erase(it);
520 }
521 }
522 endScreenCaptureMonitors_.emplace(pid, monitorSet);
523 }
524
RecoveryScreenCaptureMonitor(SessionPtr session)525 void EventMonitorHandler::MonitorCollection::RecoveryScreenCaptureMonitor(SessionPtr session)
526 {
527 if (session->GetTokenType() != TokenType::TOKEN_HAP) {
528 return;
529 }
530 int32_t pid = session->GetPid();
531 auto it = endScreenCaptureMonitors_.find(pid);
532 if (it != endScreenCaptureMonitors_.end()) {
533 for (auto &monitor : endScreenCaptureMonitors_[pid]) {
534 SessionHandler screenCaptureMointor(monitor);
535 monitors_.insert(screenCaptureMointor);
536 }
537 endScreenCaptureMonitors_.erase(it);
538 }
539 }
540
541 #ifdef OHOS_BUILD_ENABLE_TOUCH
UpdateConsumptionState(std::shared_ptr<PointerEvent> pointerEvent)542 void EventMonitorHandler::MonitorCollection::UpdateConsumptionState(std::shared_ptr<PointerEvent> pointerEvent)
543 {
544 CALL_DEBUG_ENTER;
545 CHKPV(pointerEvent);
546 if (pointerEvent->GetSourceType() != PointerEvent::SOURCE_TYPE_TOUCHSCREEN &&
547 pointerEvent->GetSourceType() != PointerEvent::SOURCE_TYPE_TOUCHPAD) {
548 return;
549 }
550 auto sIter = states_.find(pointerEvent->GetDeviceId());
551 if (sIter == states_.end()) {
552 auto [tIter, isOk] = states_.emplace(pointerEvent->GetDeviceId(), ConsumptionState());
553 if (!isOk) {
554 MMI_HILOGE("Failed to emplace consumption state");
555 return;
556 }
557 sIter = tIter;
558 }
559 ConsumptionState &state = sIter->second;
560 if (state.eventIds_.size() >= MAX_EVENTIDS_SIZE) {
561 auto iter = state.eventIds_.begin();
562 state.eventIds_.erase(iter);
563 }
564 auto [tIter, isOk] = state.eventIds_.emplace(pointerEvent->GetId());
565 if (!isOk) {
566 MMI_HILOGW("Failed to stash event");
567 }
568 state.lastPointerEvent_ = pointerEvent;
569
570 if (pointerEvent->GetPointerIds().size() != 1) {
571 MMI_HILOGD("In intermediate process");
572 return;
573 }
574 if (pointerEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_DOWN ||
575 pointerEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_AXIS_BEGIN ||
576 pointerEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_SWIPE_BEGIN) {
577 MMI_HILOGD("First press down");
578 state.eventIds_.clear();
579 auto [tIter, isOk] = state.eventIds_.emplace(pointerEvent->GetId());
580 if (!isOk) {
581 MMI_HILOGW("Event number is duplicated");
582 }
583 state.isMonitorConsumed_ = false;
584 } else if (pointerEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_UP ||
585 pointerEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_AXIS_END ||
586 pointerEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_SWIPE_END) {
587 MMI_HILOGD("Last lift up");
588 state.eventIds_.clear();
589 }
590 }
591 #endif // OHOS_BUILD_ENABLE_TOUCH
592
593 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
IsSendToClient(const SessionHandler &monitor, std::shared_ptr<PointerEvent> pointerEvent, NetPacket &pkt)594 void EventMonitorHandler::MonitorCollection::IsSendToClient(const SessionHandler &monitor,
595 std::shared_ptr<PointerEvent> pointerEvent, NetPacket &pkt)
596 {
597 if (monitor.Expect(pointerEvent)) {
598 if (pointerEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_SWIPE_BEGIN ||
599 pointerEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_SWIPE_END) {
600 MMI_HILOGI("Swipe event sended in monitor! action type: %{public}d finger count: %{public}d",
601 pointerEvent->GetPointerAction(),
602 pointerEvent->GetFingerCount());
603 }
604 if (monitor.session_) {
605 monitor.SendToClient(pointerEvent, pkt);
606 return;
607 }
608 if (monitor.callback_) {
609 monitor.callback_->OnInputEvent(monitor.handlerType_, pointerEvent);
610 }
611 }
612 if (monitor.actionsType_.empty()) {
613 return;
614 }
615 auto iter = std::find(monitor.actionsType_.begin(), monitor.actionsType_.end(),
616 pointerEvent->GetPointerAction());
617 if (iter != monitor.actionsType_.end() && monitor.session_) {
618 monitor.SendToClient(pointerEvent, pkt);
619 }
620 }
621
Monitor(std::shared_ptr<PointerEvent> pointerEvent)622 void EventMonitorHandler::MonitorCollection::Monitor(std::shared_ptr<PointerEvent> pointerEvent)
623 {
624 CHKPV(pointerEvent);
625 MMI_HILOGD("There are currently %{public}zu monitors", monitors_.size());
626 NetPacket pkt(MmiMessageId::REPORT_POINTER_EVENT);
627 pkt << InputHandlerType::MONITOR << static_cast<uint32_t>(evdev_device_udev_tags::EVDEV_UDEV_TAG_INPUT);
628 if (pkt.ChkRWError()) {
629 MMI_HILOGE("Packet write pointer event failed");
630 return;
631 }
632 if (InputEventDataTransformation::Marshalling(pointerEvent, pkt) != RET_OK) {
633 MMI_HILOGE("Marshalling pointer event failed, errCode:%{public}d", STREAM_BUF_WRITE_FAIL);
634 return;
635 }
636 for (const auto &monitor : monitors_) {
637 IsSendToClient(monitor, pointerEvent, pkt);
638 }
639 if (NapProcess::GetInstance()->GetNapClientPid() != REMOVE_OBSERVER &&
640 NapProcess::GetInstance()->GetNapClientPid() != UNOBSERVED) {
641 for (const auto &mon : monitors_) {
642 OHOS::MMI::NapProcess::NapStatusData napData;
643 auto sess = mon.session_;
644 if (!sess) {
645 continue;
646 }
647 napData.pid = sess->GetPid();
648 napData.uid = sess->GetUid();
649 napData.bundleName = sess->GetProgramName();
650 if (NapProcess::GetInstance()->IsNeedNotify(napData)) {
651 int32_t syncState = ACTIVE_EVENT;
652 NapProcess::GetInstance()->AddMmiSubscribedEventData(napData, syncState);
653 NapProcess::GetInstance()->NotifyBundleName(napData, syncState);
654 }
655 }
656 }
657 }
658 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
659
OnSessionLost(SessionPtr session)660 void EventMonitorHandler::MonitorCollection::OnSessionLost(SessionPtr session)
661 {
662 CALL_INFO_TRACE;
663 std::set<SessionHandler>::const_iterator cItr = monitors_.cbegin();
664 while (cItr != monitors_.cend()) {
665 if (cItr->session_ != session) {
666 ++cItr;
667 } else {
668 cItr = monitors_.erase(cItr);
669 }
670 }
671 CHKPV(session);
672 int32_t pid = session->GetPid();
673 auto it = endScreenCaptureMonitors_.find(pid);
674 if (it != endScreenCaptureMonitors_.end()) {
675 endScreenCaptureMonitors_.erase(it);
676 }
677 }
678
CheckHasInputHandler(HandleEventType eventType)679 bool EventMonitorHandler::MonitorCollection::CheckHasInputHandler(HandleEventType eventType)
680 {
681 for (const auto &item : monitors_) {
682 if ((item.eventType_ & eventType) == eventType) {
683 return true;
684 }
685 }
686 return false;
687 }
688
Dump(int32_t fd, const std::vector<std::string> &args)689 void EventMonitorHandler::Dump(int32_t fd, const std::vector<std::string> &args)
690 {
691 return monitors_.Dump(fd, args);
692 }
693
Dump(int32_t fd, const std::vector<std::string> &args)694 void EventMonitorHandler::MonitorCollection::Dump(int32_t fd, const std::vector<std::string> &args)
695 {
696 CALL_DEBUG_ENTER;
697 mprintf(fd, "Monitor information:\t");
698 mprintf(fd, "monitors: count=%zu", monitors_.size());
699 for (const auto &item : monitors_) {
700 SessionPtr session = item.session_;
701 if (!session) {
702 continue;
703 }
704 mprintf(fd,
705 "handlerType:%d | Pid:%d | Uid:%d | Fd:%d "
706 "| EarliestEventTime:%" PRId64 " | Descript:%s "
707 "| EventType:%u | ProgramName:%s \t",
708 item.handlerType_, session->GetPid(),
709 session->GetUid(), session->GetFd(),
710 session->GetEarliestEventTime(), session->GetDescript().c_str(),
711 item.eventType_, session->GetProgramName().c_str());
712 }
713 }
714
715 #ifdef PLAYER_FRAMEWORK_EXISTS
ProcessScreenCapture(int32_t pid, bool isStart)716 void EventMonitorHandler::ProcessScreenCapture(int32_t pid, bool isStart)
717 {
718 auto udsServerPtr = InputHandler->GetUDSServer();
719 CHKPV(udsServerPtr);
720 SessionPtr session = udsServerPtr->GetSessionByPid(pid);
721 CHKPV(session);
722 if (isStart) {
723 if (!monitors_.HasMonitor(session) && !monitors_.HasScreenCaptureMonitor(session)) {
724 MMI_HILOGI("This process has no screen capture monitor");
725 return;
726 }
727 monitors_.RecoveryScreenCaptureMonitor(session);
728 } else {
729 if (!monitors_.HasMonitor(session)) {
730 MMI_HILOGI("This process has no screen capture monitor");
731 return;
732 }
733 monitors_.RemoveScreenCaptureMonitor(session);
734 }
735 }
736 #endif // PLAYER_FRAMEWORK_EXISTS
737 } // namespace MMI
738 } // namespace OHOS
739