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