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