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 "anr_handler.h"
17 #include "bytrace_adapter.h"
18 #include "event_log_helper.h"
19 #include "input_event_data_transformation.h"
20 #include "input_manager_impl.h"
21 #ifdef OHOS_BUILD_ENABLE_MONITOR
22 #include "input_monitor_manager.h"
23 #endif // OHOS_BUILD_ENABLE_MONITOR
24 #include "long_press_event_subscribe_manager.h"
25 #include "mmi_client.h"
26 #include "multimodal_event_handler.h"
27 #include "multimodal_input_connect_manager.h"
28 #include "time_cost_chk.h"
29 #include "pre_monitor_manager.h"
30
31 #undef MMI_LOG_TAG
32 #define MMI_LOG_TAG "ClientMsgHandler"
33
34 namespace OHOS {
35 namespace MMI {
36 namespace {
37 constexpr int32_t PRINT_INTERVAL_COUNT { 50 };
38 } // namespace
Init()39 void ClientMsgHandler::Init()
40 {
41 MsgCallback funs[] = {
42 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
43 { MmiMessageId::ON_KEY_EVENT, [this] (const UDSClient& client, NetPacket& pkt) {
44 return this->OnKeyEvent(client, pkt); }},
45 { MmiMessageId::ON_SUBSCRIBE_KEY, [this] (const UDSClient &client, NetPacket &pkt) {
46 return this->OnSubscribeKeyEventCallback(client, pkt); }},
47 { MmiMessageId::ON_SUBSCRIBE_KEY_MONITOR, [this] (const UDSClient &client, NetPacket &pkt) {
48 return this->OnSubscribeKeyMonitor(client, pkt); }},
49 { MmiMessageId::ON_PRE_KEY_EVENT, [this] (const UDSClient &client, NetPacket &pkt) {
50 return this->OnPreKeyEvent(client, pkt); }},
51 #endif // OHOS_BUILD_ENABLE_KEYBOARD
52 #ifdef OHOS_BUILD_ENABLE_SWITCH
53 { MmiMessageId::ON_SUBSCRIBE_SWITCH, [this] (const UDSClient &client, NetPacket &pkt) {
54 return this->OnSubscribeSwitchEventCallback(client, pkt); }},
55 #endif // OHOS_BUILD_ENABLE_SWITCH
56 { MmiMessageId::ON_SUBSCRIBE_TABLET, [this] (const UDSClient &client, NetPacket &pkt) {
57 return this->OnSubscribeTabletProximityCallback(client, pkt); }},
58 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
59 { MmiMessageId::ON_POINTER_EVENT, [this] (const UDSClient& client, NetPacket& pkt) {
60 return this->OnPointerEvent(client, pkt); }},
61 { MmiMessageId::ON_SUBSCRIBE_LONG_PRESS, [this] (const UDSClient& client, NetPacket& pkt) {
62 return this->OnSubscribeLongPressEventCallback(client, pkt); }},
63 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
64 { MmiMessageId::ADD_INPUT_DEVICE_LISTENER, [this] (const UDSClient& client, NetPacket& pkt) {
65 return this->OnDevListener(client, pkt); }},
66 { MmiMessageId::NOTICE_ANR, [this] (const UDSClient& client, NetPacket& pkt) {
67 return this->OnAnr(client, pkt); }},
68 #if defined(OHOS_BUILD_ENABLE_KEYBOARD) && (defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || \
69 defined(OHOS_BUILD_ENABLE_MONITOR))
70 { MmiMessageId::REPORT_KEY_EVENT, [this] (const UDSClient& client, NetPacket& pkt) {
71 return this->ReportKeyEvent(client, pkt); }},
72 #endif // OHOS_BUILD_ENABLE_KEYBOARD
73 #if (defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)) && \
74 (defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || defined(OHOS_BUILD_ENABLE_MONITOR))
75 { MmiMessageId::REPORT_POINTER_EVENT, [this] (const UDSClient& client, NetPacket& pkt) {
76 return this->ReportPointerEvent(client, pkt); }},
77 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
78 { MmiMessageId::NOTIFY_BUNDLE_NAME, [this] (const UDSClient& client, NetPacket& pkt) {
79 return this->NotifyBundleName(client, pkt); }},
80 { MmiMessageId::WINDOW_STATE_ERROR_NOTIFY, [this] (const UDSClient& client, NetPacket& pkt) {
81 return this->NotifyWindowStateError(client, pkt); }},
82 { MmiMessageId::SET_INPUT_DEVICE_ENABLED, [this] (const UDSClient& client, NetPacket& pkt) {
83 return this->OnSetInputDeviceAck(client, pkt); }} };
84 for (auto &it : funs) {
85 if (!RegistrationEvent(it)) {
86 MMI_HILOGW("Failed to register event errCode:%{public}d", EVENT_REG_FAIL);
87 }
88 }
89 }
90
InitProcessedCallback()91 void ClientMsgHandler::InitProcessedCallback()
92 {
93 CALL_DEBUG_ENTER;
94 int32_t tokenType = MULTIMODAL_INPUT_CONNECT_MGR->GetTokenType();
95 if (tokenType == TokenType::TOKEN_HAP || tokenType == TokenType::TOKEN_SYSTEM_HAP) {
96 MMI_HILOGD("Current session is hap");
97 dispatchCallback_ = [] (int32_t eventId, int64_t actionTime) {
98 return ClientMsgHandler::OnDispatchEventProcessed(eventId, actionTime);
99 };
100 } else if (tokenType == static_cast<int32_t>(TokenType::TOKEN_NATIVE)) {
101 MMI_HILOGD("Current session is native");
102 } else {
103 MMI_HILOGE("Current session is unknown tokenType:%{public}d", tokenType);
104 }
105 }
106
OnMsgHandler(const UDSClient & client,NetPacket & pkt)107 void ClientMsgHandler::OnMsgHandler(const UDSClient& client, NetPacket& pkt)
108 {
109 auto id = pkt.GetMsgId();
110 TimeCostChk chk("ClientMsgHandler::OnMsgHandler", "overtime 300(us)", MAX_OVER_TIME, id);
111 auto callback = GetMsgCallback(id);
112 CHKPV(callback);
113 ResetLogTrace();
114 auto ret = (*callback)(client, pkt);
115 if (ret < 0) {
116 MMI_HILOGE("Msg handling failed. id:%{public}d, ret:%{public}d", id, ret);
117 return;
118 }
119 }
120
121 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
OnKeyEvent(const UDSClient & client,NetPacket & pkt)122 int32_t ClientMsgHandler::OnKeyEvent(const UDSClient& client, NetPacket& pkt)
123 {
124 auto key = KeyEvent::Create();
125 CHKPR(key, ERROR_NULL_POINTER);
126 int32_t ret = InputEventDataTransformation::NetPacketToKeyEvent(pkt, key);
127 if (ret != RET_OK) {
128 MMI_HILOG_DISPATCHE("Read netPacket failed");
129 return RET_ERR;
130 }
131 LogTracer lt(key->GetId(), key->GetEventType(), key->GetKeyAction());
132 int32_t fd = 0;
133 pkt >> fd;
134 #ifdef OHOS_BUILD_ENABLE_SECURITY_COMPONENT
135 if (InputEventDataTransformation::UnmarshallingEnhanceData(pkt, key) != ERR_OK) {
136 MMI_HILOG_DISPATCHE("Failed to deserialize enhance data key event");
137 return RET_ERR;
138 }
139 #endif // OHOS_BUILD_ENABLE_SECURITY_COMPONENT
140 if (pkt.ChkRWError()) {
141 MMI_HILOG_DISPATCHE("Packet read fd failed");
142 return PACKET_READ_FAIL;
143 }
144 MMI_HILOG_DISPATCHD("Key event dispatcher of client, Fd:%{public}d", fd);
145 MMI_HILOG_DISPATCHI("Received");
146 BytraceAdapter::StartBytrace(key, BytraceAdapter::TRACE_START, BytraceAdapter::KEY_DISPATCH_EVENT);
147 key->SetProcessedCallback(dispatchCallback_);
148 InputMgrImpl.OnKeyEvent(key);
149 key->MarkProcessed();
150 return RET_OK;
151 }
152
OnPreKeyEvent(const UDSClient & client,NetPacket & pkt)153 int32_t ClientMsgHandler::OnPreKeyEvent(const UDSClient& client, NetPacket& pkt)
154 {
155 auto keyEvent = KeyEvent::Create();
156 CHKPR(keyEvent, ERROR_NULL_POINTER);
157 int32_t ret = InputEventDataTransformation::NetPacketToKeyEvent(pkt, keyEvent);
158 if (ret != RET_OK) {
159 MMI_HILOG_DISPATCHE("Read netPacket failed");
160 return RET_ERR;
161 }
162 int32_t fd = -1;
163 int32_t handlerId = -1;
164 pkt >> fd >> handlerId;
165 if (pkt.ChkRWError()) {
166 MMI_HILOG_ANRDETECTE("Packet read fd failed");
167 return PACKET_READ_FAIL;
168 }
169 MMI_HILOG_DISPATCHD("PRE key event dispathcer of clent, Fd:%{public}d", fd);
170 BytraceAdapter::StartBytrace(keyEvent, BytraceAdapter::TRACE_START, BytraceAdapter::KEY_DISPATCH_EVENT);
171 PRE_MONITOR_MGR.OnPreKeyEvent(keyEvent, handlerId);
172 return RET_OK;
173 }
174 #endif // OHOS_BUILD_ENABLE_KEYBOARD
175
NotifyBundleName(const UDSClient & client,NetPacket & pkt)176 int32_t ClientMsgHandler::NotifyBundleName(const UDSClient& client, NetPacket& pkt)
177 {
178 CALL_DEBUG_ENTER;
179 int32_t pid = 0;
180 int32_t uid = 0;
181 int32_t syncStatus = 0;
182 std::string bundleName;
183 pkt >> pid >> uid >> bundleName >> syncStatus;
184 InputMgrImpl.NotifyBundleName(pid, uid, bundleName, syncStatus);
185 MMI_HILOGD("NotifyBundleName pid:%{public}d, uid:%{public}d, bundleName:%{public}s, syncStatus:%{public}d",
186 pid, uid, bundleName.c_str(), syncStatus);
187 return RET_OK;
188 }
189
190 #if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
OnPointerEvent(const UDSClient & client,NetPacket & pkt)191 int32_t ClientMsgHandler::OnPointerEvent(const UDSClient& client, NetPacket& pkt)
192 {
193 CALL_DEBUG_ENTER;
194 auto pointerEvent = PointerEvent::Create();
195 CHKPR(pointerEvent, ERROR_NULL_POINTER);
196 if (InputEventDataTransformation::Unmarshalling(pkt, pointerEvent) != ERR_OK) {
197 MMI_HILOG_DISPATCHE("Failed to deserialize pointer event");
198 return RET_ERR;
199 }
200 #ifdef OHOS_BUILD_ENABLE_SECURITY_COMPONENT
201 if (InputEventDataTransformation::UnmarshallingEnhanceData(pkt, pointerEvent) != ERR_OK) {
202 MMI_HILOG_DISPATCHE("Failed to deserialize enhance data pointer event");
203 return RET_ERR;
204 }
205 #endif // OHOS_BUILD_ENABLE_SECURITY_COMPONENT
206 LogTracer lt(pointerEvent->GetId(), pointerEvent->GetEventType(), pointerEvent->GetPointerAction());
207 if (pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_AXIS_UPDATE &&
208 pointerEvent->GetPointerAction() != PointerEvent::POINTER_ACTION_ROTATE_UPDATE) {
209 std::string logInfo = std::string("ac: ") + pointerEvent->DumpPointerAction();
210 aggregator_.Record({MMI_LOG_DISPATCH, INPUT_KEY_FLOW, __FUNCTION__, __LINE__}, logInfo.c_str(),
211 std::to_string(pointerEvent->GetId()));
212 }
213 if (PointerEvent::POINTER_ACTION_CANCEL == pointerEvent->GetPointerAction() ||
214 PointerEvent::POINTER_ACTION_HOVER_CANCEL == pointerEvent->GetPointerAction() ||
215 PointerEvent::POINTER_ACTION_FINGERPRINT_CANCEL == pointerEvent->GetPointerAction()) {
216 MMI_HILOG_DISPATCHI("Operation canceled");
217 }
218 pointerEvent->SetProcessedCallback(dispatchCallback_);
219 BytraceAdapter::StartBytrace(pointerEvent, BytraceAdapter::TRACE_START, BytraceAdapter::POINT_DISPATCH_EVENT);
220 processedCount_++;
221 if (processedCount_ == PRINT_INTERVAL_COUNT) {
222 MMI_HILOG_FREEZEI("Last eventId:%{public}d, current eventId:%{public}d", lastEventId_, pointerEvent->GetId());
223 processedCount_ = 0;
224 lastEventId_ = pointerEvent->GetId();
225 }
226 InputMgrImpl.OnPointerEvent(pointerEvent);
227 if (pointerEvent->GetSourceType() == PointerEvent::SOURCE_TYPE_JOYSTICK) {
228 pointerEvent->MarkProcessed();
229 }
230 return RET_OK;
231 }
232
OnSubscribeLongPressEventCallback(const UDSClient & client,NetPacket & pkt)233 int32_t ClientMsgHandler::OnSubscribeLongPressEventCallback(const UDSClient& client, NetPacket& pkt)
234 {
235 LongPressEvent longPressEvent;
236 int32_t ret = InputEventDataTransformation::NetPacketToLongPressEvent(pkt, longPressEvent);
237 if (ret != RET_OK) {
238 MMI_HILOGE("Read net packet failed");
239 return RET_ERR;
240 }
241 int32_t fd = -1;
242 int32_t subscribeId = -1;
243 pkt >> fd >> subscribeId;
244 if (pkt.ChkRWError()) {
245 MMI_HILOGE("Packet read fd failed");
246 return PACKET_READ_FAIL;
247 }
248 return LONG_PRESS_EVENT_SUBSCRIBE_MGR.OnSubscribeLongPressEventCallback(longPressEvent, subscribeId);
249 }
250
251 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
252
253 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
OnSubscribeKeyEventCallback(const UDSClient & client,NetPacket & pkt)254 int32_t ClientMsgHandler::OnSubscribeKeyEventCallback(const UDSClient &client, NetPacket &pkt)
255 {
256 std::shared_ptr<KeyEvent> keyEvent = KeyEvent::Create();
257 CHKPR(keyEvent, ERROR_NULL_POINTER);
258 int32_t ret = InputEventDataTransformation::NetPacketToKeyEvent(pkt, keyEvent);
259 if (ret != RET_OK) {
260 MMI_HILOGE("Read net packet failed");
261 return RET_ERR;
262 }
263 LogTracer lt(keyEvent->GetId(), keyEvent->GetEventType(), keyEvent->GetKeyAction());
264 int32_t fd = -1;
265 int32_t subscribeId = -1;
266 pkt >> fd >> subscribeId;
267 if (pkt.ChkRWError()) {
268 MMI_HILOGE("Packet read fd failed");
269 return PACKET_READ_FAIL;
270 }
271 if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER) {
272 if (!EventLogHelper::IsBetaVersion()) {
273 MMI_HILOGI("Subscribe:%{public}d,Fd:%{public}d,KeyEvent:%{public}d, "
274 "Action:%{public}d, KeyAction:%{public}d, EventType:%{public}d,Flag:%{public}u",
275 subscribeId, fd, keyEvent->GetId(), keyEvent->GetAction(), keyEvent->GetKeyAction(),
276 keyEvent->GetEventType(), keyEvent->GetFlag());
277 } else {
278 MMI_HILOGI("Subscribe:%{public}d,Fd:%{public}d,KeyEvent:%{public}d, "
279 "Action:%{public}d, KeyAction:%{public}d, EventType:%{public}d,Flag:%{public}u",
280 subscribeId, fd, keyEvent->GetId(), keyEvent->GetAction(), keyEvent->GetKeyAction(),
281 keyEvent->GetEventType(), keyEvent->GetFlag());
282 }
283 } else {
284 MMI_HILOGD("Subscribe:%{public}d,Fd:%{public}d,KeyEvent:%{public}d,"
285 "KeyCode:%{private}d,ActionTime:%{public}" PRId64 ",ActionStartTime:%{public}" PRId64 ","
286 "Action:%{public}d,KeyAction:%{public}d,EventType:%{public}d,Flag:%{public}u",
287 subscribeId, fd, keyEvent->GetId(), keyEvent->GetKeyCode(), keyEvent->GetActionTime(),
288 keyEvent->GetActionStartTime(), keyEvent->GetAction(), keyEvent->GetKeyAction(),
289 keyEvent->GetEventType(), keyEvent->GetFlag());
290 }
291
292 BytraceAdapter::StartBytrace(keyEvent, BytraceAdapter::TRACE_START, BytraceAdapter::KEY_SUBSCRIBE_EVENT);
293 return KeyEventInputSubscribeMgr.OnSubscribeKeyEventCallback(keyEvent, subscribeId);
294 }
295
OnSubscribeKeyMonitor(const UDSClient & client,NetPacket & pkt)296 int32_t ClientMsgHandler::OnSubscribeKeyMonitor(const UDSClient &client, NetPacket &pkt)
297 {
298 std::shared_ptr<KeyEvent> keyEvent = KeyEvent::Create();
299 CHKPR(keyEvent, ERROR_NULL_POINTER);
300 int32_t ret = InputEventDataTransformation::NetPacketToKeyEvent(pkt, keyEvent);
301 if (ret != RET_OK) {
302 MMI_HILOGE("Read net packet failed");
303 return RET_ERR;
304 }
305 MMI_HILOGD("Key monitor(No:%{public}d, KC:%{private}d, KA:%{public}d)",
306 keyEvent->GetId(), keyEvent->GetKeyCode(), keyEvent->GetKeyAction());
307 LogTracer lt(keyEvent->GetId(), keyEvent->GetEventType(), keyEvent->GetKeyAction());
308 return KeyEventInputSubscribeMgr.OnSubscribeKeyMonitor(keyEvent);
309 }
310 #endif // OHOS_BUILD_ENABLE_KEYBOARD
311
312 #ifdef OHOS_BUILD_ENABLE_SWITCH
OnSubscribeSwitchEventCallback(const UDSClient & client,NetPacket & pkt)313 int32_t ClientMsgHandler::OnSubscribeSwitchEventCallback(const UDSClient &client, NetPacket &pkt)
314 {
315 std::shared_ptr<SwitchEvent> switchEvent = std::make_shared<SwitchEvent>(0);
316 int32_t ret = InputEventDataTransformation::NetPacketToSwitchEvent(pkt, switchEvent);
317 if (ret != RET_OK) {
318 MMI_HILOGE("Read net packet failed");
319 return RET_ERR;
320 }
321 LogTracer lt(switchEvent->GetId(), switchEvent->GetEventType(), switchEvent->GetAction());
322 int32_t fd = -1;
323 int32_t subscribeId = -1;
324 pkt >> fd >> subscribeId;
325 if (pkt.ChkRWError()) {
326 MMI_HILOGE("Packet read fd failed");
327 return PACKET_READ_FAIL;
328 }
329 return SWITCH_EVENT_INPUT_SUBSCRIBE_MGR.OnSubscribeSwitchEventCallback(switchEvent, subscribeId);
330 }
331 #endif
332
OnSubscribeTabletProximityCallback(const UDSClient & client,NetPacket & pkt)333 int32_t ClientMsgHandler::OnSubscribeTabletProximityCallback(const UDSClient &client, NetPacket &pkt)
334 {
335 auto pointerEvent = PointerEvent::Create();
336 int32_t ret = InputEventDataTransformation::Unmarshalling(pkt, pointerEvent);
337 if (ret != RET_OK) {
338 MMI_HILOGE("Read net packet failed");
339 return RET_ERR;
340 }
341 LogTracer lt(pointerEvent->GetId(), pointerEvent->GetEventType(), pointerEvent->GetAction());
342 int32_t fd = -1;
343 int32_t subscribeId = -1;
344 pkt >> fd >> subscribeId;
345 if (pkt.ChkRWError()) {
346 MMI_HILOGE("Packet read fd failed");
347 return PACKET_READ_FAIL;
348 }
349 return TABLET_EVENT_INPUT_SUBSCRIBE_MGR.OnSubscribeTabletProximityCallback(pointerEvent, subscribeId);
350 }
351
OnDevListener(const UDSClient & client,NetPacket & pkt)352 int32_t ClientMsgHandler::OnDevListener(const UDSClient& client, NetPacket& pkt)
353 {
354 CALL_DEBUG_ENTER;
355 std::string type;
356 int32_t deviceId = 0;
357 pkt >> type >> deviceId;
358 if (pkt.ChkRWError()) {
359 MMI_HILOGE("Packet read type failed");
360 return RET_ERR;
361 }
362 INPUT_DEVICE_IMPL.OnDevListener(deviceId, type);
363 return RET_OK;
364 }
365
366 #if defined(OHOS_BUILD_ENABLE_KEYBOARD) && (defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || \
367 defined(OHOS_BUILD_ENABLE_MONITOR))
ReportKeyEvent(const UDSClient & client,NetPacket & pkt)368 int32_t ClientMsgHandler::ReportKeyEvent(const UDSClient& client, NetPacket& pkt)
369 {
370 CALL_DEBUG_ENTER;
371 InputHandlerType handlerType;
372 uint32_t deviceTags = 0;
373 pkt >> handlerType >> deviceTags;
374 if (pkt.ChkRWError()) {
375 MMI_HILOG_DISPATCHE("Packet read handler failed");
376 return RET_ERR;
377 }
378 auto keyEvent = KeyEvent::Create();
379 CHKPR(keyEvent, ERROR_NULL_POINTER);
380 if (InputEventDataTransformation::NetPacketToKeyEvent(pkt, keyEvent) != ERR_OK) {
381 MMI_HILOG_DISPATCHE("Failed to deserialize key event");
382 return RET_ERR;
383 }
384 LogTracer lt(keyEvent->GetId(), keyEvent->GetEventType(), keyEvent->GetKeyAction());
385 BytraceAdapter::StartBytrace(keyEvent, BytraceAdapter::TRACE_START, BytraceAdapter::KEY_INTERCEPT_EVENT);
386 switch (handlerType) {
387 case INTERCEPTOR: {
388 #ifdef OHOS_BUILD_ENABLE_INTERCEPTOR
389 InputInterMgr->OnInputEvent(keyEvent, deviceTags);
390 #endif // OHOS_BUILD_ENABLE_INTERCEPTOR
391 break;
392 }
393 case MONITOR: {
394 #ifdef OHOS_BUILD_ENABLE_MONITOR
395 IMonitorMgr.OnInputEvent(keyEvent, deviceTags);
396 #endif // OHOS_BUILD_ENABLE_MONITOR
397 break;
398 }
399 default: {
400 MMI_HILOG_DISPATCHW("Failed to intercept or monitor on the event");
401 break;
402 }
403 }
404 return RET_OK;
405 }
406 #endif // OHOS_BUILD_ENABLE_KEYBOARD && OHOS_BUILD_ENABLE_INTERCEPTOR || OHOS_BUILD_ENABLE_MONITOR
407
408 #if (defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)) && \
409 (defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || defined(OHOS_BUILD_ENABLE_MONITOR))
ReportPointerEvent(const UDSClient & client,NetPacket & pkt)410 int32_t ClientMsgHandler::ReportPointerEvent(const UDSClient& client, NetPacket& pkt)
411 {
412 InputHandlerType handlerType;
413 uint32_t deviceTags = 0;
414 pkt >> handlerType >> deviceTags;
415 if (pkt.ChkRWError()) {
416 MMI_HILOG_DISPATCHE("Packet read Pointer data failed");
417 return RET_ERR;
418 }
419 MMI_HILOG_DISPATCHD("Client handlerType:%{public}d", handlerType);
420 auto pointerEvent = PointerEvent::Create();
421 CHKPR(pointerEvent, ERROR_NULL_POINTER);
422 if (InputEventDataTransformation::Unmarshalling(pkt, pointerEvent) != ERR_OK) {
423 MMI_HILOG_DISPATCHW("Failed to deserialize pointer event");
424 return RET_ERR;
425 }
426 LogTracer lt(pointerEvent->GetId(), pointerEvent->GetEventType(), pointerEvent->GetPointerAction());
427 BytraceAdapter::StartBytrace(pointerEvent, BytraceAdapter::TRACE_START, BytraceAdapter::POINT_INTERCEPT_EVENT);
428 switch (handlerType) {
429 case INTERCEPTOR: {
430 #ifdef OHOS_BUILD_ENABLE_INTERCEPTOR
431 InputInterMgr->OnInputEvent(pointerEvent, deviceTags);
432 #endif // OHOS_BUILD_ENABLE_INTERCEPTOR
433 break;
434 }
435 case MONITOR: {
436 #ifdef OHOS_BUILD_ENABLE_MONITOR
437 IMonitorMgr.OnInputEvent(pointerEvent, deviceTags);
438 #endif // OHOS_BUILD_ENABLE_MONITOR
439 break;
440 }
441 default: {
442 MMI_HILOG_DISPATCHW("Failed to intercept or monitor on the event");
443 break;
444 }
445 }
446 return RET_OK;
447 }
448 #endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
449
OnDispatchEventProcessed(int32_t eventId,int64_t actionTime)450 void ClientMsgHandler::OnDispatchEventProcessed(int32_t eventId, int64_t actionTime)
451 {
452 CALL_DEBUG_ENTER;
453 ANRHDL->SetLastProcessedEventId(ANR_DISPATCH, eventId, actionTime);
454 }
455
OnAnr(const UDSClient & client,NetPacket & pkt)456 int32_t ClientMsgHandler::OnAnr(const UDSClient& client, NetPacket& pkt)
457 {
458 CALL_DEBUG_ENTER;
459 int32_t pid = 0;
460 int32_t eventId = 0;
461 pkt >> pid;
462 pkt >> eventId;
463 if (pkt.ChkRWError()) {
464 MMI_HILOG_ANRDETECTE("Packet read data failed");
465 return RET_ERR;
466 }
467 MMI_HILOG_ANRDETECTI("Client pid:%{public}d eventId:%{public}d", pid, eventId);
468 InputMgrImpl.OnAnr(pid, eventId);
469 return RET_OK;
470 }
471
NotifyWindowStateError(const UDSClient & client,NetPacket & pkt)472 int32_t ClientMsgHandler::NotifyWindowStateError(const UDSClient& client, NetPacket& pkt)
473 {
474 CALL_DEBUG_ENTER;
475 int32_t pid = 0;
476 int32_t windowId = 0;
477 pkt >> pid;
478 pkt >> windowId;
479 if (pkt.ChkRWError()) {
480 MMI_HILOG_ANRDETECTE("Packet read data failed");
481 return RET_ERR;
482 }
483 MMI_HILOG_ANRDETECTI("Client pid:%{public}d windowId:%{public}d", pid, windowId);
484 InputMgrImpl.OnWindowStateError(pid, windowId);
485 return RET_OK;
486 }
487
OnSetInputDeviceAck(const UDSClient & client,NetPacket & pkt)488 int32_t ClientMsgHandler::OnSetInputDeviceAck(const UDSClient& client, NetPacket& pkt)
489 {
490 CALL_DEBUG_ENTER;
491 int32_t index = 0;
492 int32_t result = 0;
493 pkt >> index >> result;
494 if (pkt.ChkRWError()) {
495 MMI_HILOGE("Packet read type failed");
496 return RET_ERR;
497 }
498 INPUT_DEVICE_IMPL.OnSetInputDeviceAck(index, result);
499 return RET_OK;
500 }
501 } // namespace MMI
502 } // namespace OHOS
503