1c29fa5a6Sopenharmony_ci/*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License.
5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at
6c29fa5a6Sopenharmony_ci *
7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8c29fa5a6Sopenharmony_ci *
9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and
13c29fa5a6Sopenharmony_ci * limitations under the License.
14c29fa5a6Sopenharmony_ci */
15c29fa5a6Sopenharmony_ci
16c29fa5a6Sopenharmony_ci#include "event_dispatch_handler.h"
17c29fa5a6Sopenharmony_ci
18c29fa5a6Sopenharmony_ci#include <cinttypes>
19c29fa5a6Sopenharmony_ci
20c29fa5a6Sopenharmony_ci#include <linux/input-event-codes.h>
21c29fa5a6Sopenharmony_ci
22c29fa5a6Sopenharmony_ci#include "transaction/rs_interfaces.h"
23c29fa5a6Sopenharmony_ci
24c29fa5a6Sopenharmony_ci#include "anr_manager.h"
25c29fa5a6Sopenharmony_ci#include "app_debug_listener.h"
26c29fa5a6Sopenharmony_ci#include "bytrace_adapter.h"
27c29fa5a6Sopenharmony_ci#include "dfx_hisysevent.h"
28c29fa5a6Sopenharmony_ci#include "error_multimodal.h"
29c29fa5a6Sopenharmony_ci#include "event_log_helper.h"
30c29fa5a6Sopenharmony_ci#include "input_event_data_transformation.h"
31c29fa5a6Sopenharmony_ci#include "input_event_handler.h"
32c29fa5a6Sopenharmony_ci#include "i_input_windows_manager.h"
33c29fa5a6Sopenharmony_ci#include "mouse_device_state.h"
34c29fa5a6Sopenharmony_ci#include "napi_constants.h"
35c29fa5a6Sopenharmony_ci#include "proto.h"
36c29fa5a6Sopenharmony_ci#include "util.h"
37c29fa5a6Sopenharmony_ci
38c29fa5a6Sopenharmony_ci#undef MMI_LOG_DOMAIN
39c29fa5a6Sopenharmony_ci#define MMI_LOG_DOMAIN MMI_LOG_DISPATCH
40c29fa5a6Sopenharmony_ci#undef MMI_LOG_TAG
41c29fa5a6Sopenharmony_ci#define MMI_LOG_TAG "EventDispatchHandler"
42c29fa5a6Sopenharmony_ci
43c29fa5a6Sopenharmony_cinamespace OHOS {
44c29fa5a6Sopenharmony_cinamespace MMI {
45c29fa5a6Sopenharmony_cinamespace {
46c29fa5a6Sopenharmony_ciconstexpr int64_t ERROR_TIME {3000000};
47c29fa5a6Sopenharmony_ciconstexpr int32_t INTERVAL_TIME { 3000 }; // log time interval is 3 seconds.
48c29fa5a6Sopenharmony_ciconstexpr int32_t INTERVAL_DURATION { 10 };
49c29fa5a6Sopenharmony_ciconstexpr int32_t THREE_FINGERS { 3 };
50c29fa5a6Sopenharmony_ci} // namespace
51c29fa5a6Sopenharmony_ci
52c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
53c29fa5a6Sopenharmony_civoid EventDispatchHandler::HandleKeyEvent(const std::shared_ptr<KeyEvent> keyEvent)
54c29fa5a6Sopenharmony_ci{
55c29fa5a6Sopenharmony_ci    CHKPV(keyEvent);
56c29fa5a6Sopenharmony_ci    auto udsServer = InputHandler->GetUDSServer();
57c29fa5a6Sopenharmony_ci    CHKPV(udsServer);
58c29fa5a6Sopenharmony_ci    DispatchKeyEventPid(*udsServer, keyEvent);
59c29fa5a6Sopenharmony_ci}
60c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
61c29fa5a6Sopenharmony_ci
62c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
63c29fa5a6Sopenharmony_civoid EventDispatchHandler::HandlePointerEvent(const std::shared_ptr<PointerEvent> pointerEvent)
64c29fa5a6Sopenharmony_ci{
65c29fa5a6Sopenharmony_ci    CHKPV(pointerEvent);
66c29fa5a6Sopenharmony_ci    HandlePointerEventInner(pointerEvent);
67c29fa5a6Sopenharmony_ci}
68c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
69c29fa5a6Sopenharmony_ci
70c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_TOUCH
71c29fa5a6Sopenharmony_civoid EventDispatchHandler::HandleTouchEvent(const std::shared_ptr<PointerEvent> pointerEvent)
72c29fa5a6Sopenharmony_ci{
73c29fa5a6Sopenharmony_ci    CHKPV(pointerEvent);
74c29fa5a6Sopenharmony_ci    HandlePointerEventInner(pointerEvent);
75c29fa5a6Sopenharmony_ci}
76c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_TOUCH
77c29fa5a6Sopenharmony_ci
78c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
79c29fa5a6Sopenharmony_civoid EventDispatchHandler::FilterInvalidPointerItem(const std::shared_ptr<PointerEvent> pointerEvent, int32_t fd)
80c29fa5a6Sopenharmony_ci{
81c29fa5a6Sopenharmony_ci    CHKPV(pointerEvent);
82c29fa5a6Sopenharmony_ci    auto udsServer = InputHandler->GetUDSServer();
83c29fa5a6Sopenharmony_ci    CHKPV(udsServer);
84c29fa5a6Sopenharmony_ci    auto pointerIdList = pointerEvent->GetPointerIds();
85c29fa5a6Sopenharmony_ci    if (pointerIdList.size() > 1) {
86c29fa5a6Sopenharmony_ci        for (const auto& id : pointerIdList) {
87c29fa5a6Sopenharmony_ci            PointerEvent::PointerItem pointeritem;
88c29fa5a6Sopenharmony_ci            if (!pointerEvent->GetPointerItem(id, pointeritem)) {
89c29fa5a6Sopenharmony_ci                MMI_HILOGW("Can't find this pointerItem");
90c29fa5a6Sopenharmony_ci                continue;
91c29fa5a6Sopenharmony_ci            }
92c29fa5a6Sopenharmony_ci            auto itemPid = WIN_MGR->GetWindowPid(pointeritem.GetTargetWindowId());
93c29fa5a6Sopenharmony_ci            if ((itemPid >= 0) && (itemPid != udsServer->GetClientPid(fd))) {
94c29fa5a6Sopenharmony_ci                pointerEvent->RemovePointerItem(id);
95c29fa5a6Sopenharmony_ci                MMI_HILOGD("pointerIdList size:%{public}zu", pointerEvent->GetPointerIds().size());
96c29fa5a6Sopenharmony_ci            }
97c29fa5a6Sopenharmony_ci        }
98c29fa5a6Sopenharmony_ci    }
99c29fa5a6Sopenharmony_ci}
100c29fa5a6Sopenharmony_ci
101c29fa5a6Sopenharmony_cistd::shared_ptr<WindowInfo> EventDispatchHandler::SearchCancelList (int32_t pointerId, int32_t windowId)
102c29fa5a6Sopenharmony_ci{
103c29fa5a6Sopenharmony_ci    if (cancelEventList_.find(pointerId) == cancelEventList_.end()) {
104c29fa5a6Sopenharmony_ci        return nullptr;
105c29fa5a6Sopenharmony_ci    }
106c29fa5a6Sopenharmony_ci    auto windowList = cancelEventList_[pointerId];
107c29fa5a6Sopenharmony_ci    for (auto &info : windowList) {
108c29fa5a6Sopenharmony_ci        if (info->id == windowId) {
109c29fa5a6Sopenharmony_ci            return info;
110c29fa5a6Sopenharmony_ci        }
111c29fa5a6Sopenharmony_ci    }
112c29fa5a6Sopenharmony_ci    return nullptr;
113c29fa5a6Sopenharmony_ci}
114c29fa5a6Sopenharmony_ci
115c29fa5a6Sopenharmony_cibool EventDispatchHandler::ReissueEvent(std::shared_ptr<PointerEvent> &point, int32_t windowId,
116c29fa5a6Sopenharmony_ci    std::optional<WindowInfo> &windowInfo)
117c29fa5a6Sopenharmony_ci{
118c29fa5a6Sopenharmony_ci    int32_t pointerId = point->GetPointerId();
119c29fa5a6Sopenharmony_ci    if (windowInfo == std::nullopt) {
120c29fa5a6Sopenharmony_ci        std::shared_ptr<WindowInfo> curInfo = SearchCancelList(pointerId, windowId);
121c29fa5a6Sopenharmony_ci        if (curInfo != nullptr && point->GetPointerAction() == PointerEvent::POINTER_ACTION_UP) {
122c29fa5a6Sopenharmony_ci            point->SetPointerAction(PointerEvent::POINTER_ACTION_CANCEL);
123c29fa5a6Sopenharmony_ci            windowInfo = std::make_optional(*curInfo);
124c29fa5a6Sopenharmony_ci            MMI_HILOG_DISPATCHI("Touch event send cancel to window:%{public}d", windowId);
125c29fa5a6Sopenharmony_ci        } else {
126c29fa5a6Sopenharmony_ci            if (point->GetPointerAction() != PointerEvent::POINTER_ACTION_MOVE) {
127c29fa5a6Sopenharmony_ci                MMI_HILOGE("Window:%{public}d is nullptr", windowId);
128c29fa5a6Sopenharmony_ci            }
129c29fa5a6Sopenharmony_ci            return false;
130c29fa5a6Sopenharmony_ci        }
131c29fa5a6Sopenharmony_ci    }
132c29fa5a6Sopenharmony_ci    std::shared_ptr<WindowInfo> curWindowInfo = std::make_shared<WindowInfo>(*windowInfo);
133c29fa5a6Sopenharmony_ci    if (point->GetPointerAction() == PointerEvent::POINTER_ACTION_DOWN) {
134c29fa5a6Sopenharmony_ci        if (cancelEventList_.find(pointerId) == cancelEventList_.end()) {
135c29fa5a6Sopenharmony_ci            cancelEventList_[pointerId] = std::set<std::shared_ptr<WindowInfo>, EventDispatchHandler::CancelCmp>();
136c29fa5a6Sopenharmony_ci        }
137c29fa5a6Sopenharmony_ci        cancelEventList_[pointerId].insert(curWindowInfo);
138c29fa5a6Sopenharmony_ci    } else if (point->GetPointerAction() == PointerEvent::POINTER_ACTION_UP ||
139c29fa5a6Sopenharmony_ci        point->GetPointerAction() == PointerEvent::POINTER_ACTION_CANCEL) {
140c29fa5a6Sopenharmony_ci        if (cancelEventList_.find(pointerId) != cancelEventList_.end() &&
141c29fa5a6Sopenharmony_ci            cancelEventList_[pointerId].find(curWindowInfo) != cancelEventList_[pointerId].end()) {
142c29fa5a6Sopenharmony_ci            cancelEventList_[pointerId].erase(curWindowInfo);
143c29fa5a6Sopenharmony_ci        } else {
144c29fa5a6Sopenharmony_ci            return false;
145c29fa5a6Sopenharmony_ci        }
146c29fa5a6Sopenharmony_ci    }
147c29fa5a6Sopenharmony_ci    return true;
148c29fa5a6Sopenharmony_ci}
149c29fa5a6Sopenharmony_ci
150c29fa5a6Sopenharmony_civoid EventDispatchHandler::HandleMultiWindowPointerEvent(std::shared_ptr<PointerEvent> point,
151c29fa5a6Sopenharmony_ci    PointerEvent::PointerItem pointerItem)
152c29fa5a6Sopenharmony_ci{
153c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
154c29fa5a6Sopenharmony_ci    CHKPV(point);
155c29fa5a6Sopenharmony_ci    std::vector<int32_t> windowIds;
156c29fa5a6Sopenharmony_ci    WIN_MGR->GetTargetWindowIds(pointerItem.GetPointerId(), point->GetSourceType(), windowIds);
157c29fa5a6Sopenharmony_ci    int32_t count = 0;
158c29fa5a6Sopenharmony_ci    int32_t pointerId = point->GetPointerId();
159c29fa5a6Sopenharmony_ci    if (point->GetPointerAction() == PointerEvent::POINTER_ACTION_DOWN) {
160c29fa5a6Sopenharmony_ci        if (cancelEventList_.find(pointerId) != cancelEventList_.end()) {
161c29fa5a6Sopenharmony_ci            cancelEventList_.erase(pointerId);
162c29fa5a6Sopenharmony_ci        }
163c29fa5a6Sopenharmony_ci    }
164c29fa5a6Sopenharmony_ci    for (auto windowId : windowIds) {
165c29fa5a6Sopenharmony_ci        auto pointerEvent = std::make_shared<PointerEvent>(*point);
166c29fa5a6Sopenharmony_ci        auto windowInfo = WIN_MGR->GetWindowAndDisplayInfo(windowId, point->GetTargetDisplayId());
167c29fa5a6Sopenharmony_ci        if (!ReissueEvent(pointerEvent, windowId, windowInfo)) {
168c29fa5a6Sopenharmony_ci            continue;
169c29fa5a6Sopenharmony_ci        }
170c29fa5a6Sopenharmony_ci        if (!windowInfo) {
171c29fa5a6Sopenharmony_ci            continue;
172c29fa5a6Sopenharmony_ci        }
173c29fa5a6Sopenharmony_ci        if (pointerEvent->GetPointerAction() == PointerEvent::POINTER_ACTION_PULL_UP &&
174c29fa5a6Sopenharmony_ci            windowInfo->windowInputType == WindowInputType::TRANSMIT_ALL && windowIds.size() > 1) {
175c29fa5a6Sopenharmony_ci            MMI_HILOGD("When the drag is finished, the multi-window distribution is canceled. window:%{public}d,"
176c29fa5a6Sopenharmony_ci                "windowInputType:%{public}d", windowId, static_cast<int32_t>(windowInfo->windowInputType));
177c29fa5a6Sopenharmony_ci            pointerEvent->SetPointerAction(PointerEvent::POINTER_ACTION_CANCEL);
178c29fa5a6Sopenharmony_ci        }
179c29fa5a6Sopenharmony_ci        auto fd = WIN_MGR->GetClientFd(pointerEvent, windowInfo->id);
180c29fa5a6Sopenharmony_ci        if (fd < 0) {
181c29fa5a6Sopenharmony_ci            auto udsServer = InputHandler->GetUDSServer();
182c29fa5a6Sopenharmony_ci            CHKPV(udsServer);
183c29fa5a6Sopenharmony_ci            fd = udsServer->GetClientFd(windowInfo->pid);
184c29fa5a6Sopenharmony_ci            MMI_HILOGI("Window:%{public}d exit front desk, windowfd:%{public}d", windowId, fd);
185c29fa5a6Sopenharmony_ci        }
186c29fa5a6Sopenharmony_ci        pointerEvent->SetTargetWindowId(windowId);
187c29fa5a6Sopenharmony_ci        pointerEvent->SetAgentWindowId(windowInfo->agentWindowId);
188c29fa5a6Sopenharmony_ci        int32_t windowX = pointerItem.GetDisplayX() - windowInfo->area.x;
189c29fa5a6Sopenharmony_ci        int32_t windowY = pointerItem.GetDisplayY() - windowInfo->area.y;
190c29fa5a6Sopenharmony_ci        if (!windowInfo->transform.empty()) {
191c29fa5a6Sopenharmony_ci            auto windowXY = WIN_MGR->TransformWindowXY(*windowInfo, pointerItem.GetDisplayX(),
192c29fa5a6Sopenharmony_ci                pointerItem.GetDisplayY());
193c29fa5a6Sopenharmony_ci            windowX = windowXY.first;
194c29fa5a6Sopenharmony_ci            windowY = windowXY.second;
195c29fa5a6Sopenharmony_ci        }
196c29fa5a6Sopenharmony_ci        pointerItem.SetWindowX(windowX);
197c29fa5a6Sopenharmony_ci        pointerItem.SetWindowY(windowY);
198c29fa5a6Sopenharmony_ci        pointerItem.SetTargetWindowId(windowId);
199c29fa5a6Sopenharmony_ci        pointerEvent->UpdatePointerItem(pointerId, pointerItem);
200c29fa5a6Sopenharmony_ci        pointerEvent->SetDispatchTimes(count++);
201c29fa5a6Sopenharmony_ci        DispatchPointerEventInner(pointerEvent, fd);
202c29fa5a6Sopenharmony_ci    }
203c29fa5a6Sopenharmony_ci    if (point->GetPointerAction() == PointerEvent::POINTER_ACTION_UP ||
204c29fa5a6Sopenharmony_ci        point->GetPointerAction() == PointerEvent::POINTER_ACTION_PULL_UP ||
205c29fa5a6Sopenharmony_ci        point->GetPointerAction() == PointerEvent::POINTER_ACTION_CANCEL ||
206c29fa5a6Sopenharmony_ci        point->GetPointerAction() == PointerEvent::POINTER_ACTION_HOVER_EXIT) {
207c29fa5a6Sopenharmony_ci        WIN_MGR->ClearTargetWindowId(pointerId);
208c29fa5a6Sopenharmony_ci    }
209c29fa5a6Sopenharmony_ci}
210c29fa5a6Sopenharmony_ci
211c29fa5a6Sopenharmony_civoid EventDispatchHandler::NotifyPointerEventToRS(int32_t pointAction, const std::string& programName,
212c29fa5a6Sopenharmony_ci    uint32_t pid, int32_t pointCnt)
213c29fa5a6Sopenharmony_ci{
214c29fa5a6Sopenharmony_ci    OHOS::Rosen::RSInterfaces::GetInstance().NotifyTouchEvent(pointAction, pointCnt);
215c29fa5a6Sopenharmony_ci}
216c29fa5a6Sopenharmony_ci
217c29fa5a6Sopenharmony_cibool EventDispatchHandler::AcquireEnableMark(std::shared_ptr<PointerEvent> event)
218c29fa5a6Sopenharmony_ci{
219c29fa5a6Sopenharmony_ci    auto currentEventTime = std::chrono::high_resolution_clock::now();
220c29fa5a6Sopenharmony_ci    int64_t tm64Cost = std::chrono::duration_cast<std::chrono::milliseconds>(
221c29fa5a6Sopenharmony_ci        std::chrono::high_resolution_clock::now() - LasteventBeginTime_).count();
222c29fa5a6Sopenharmony_ci
223c29fa5a6Sopenharmony_ci    if (event->GetPointerAction() == PointerEvent::POINTER_ACTION_PULL_MOVE
224c29fa5a6Sopenharmony_ci        || event->GetPointerAction() == PointerEvent::POINTER_ACTION_MOVE) {
225c29fa5a6Sopenharmony_ci        enableMark_ = (tm64Cost > INTERVAL_DURATION) ? true : false;
226c29fa5a6Sopenharmony_ci        if (enableMark_) {
227c29fa5a6Sopenharmony_ci            LasteventBeginTime_ = currentEventTime;
228c29fa5a6Sopenharmony_ci        }
229c29fa5a6Sopenharmony_ci        MMI_HILOGD("Id:%{public}d, markEnabled:%{public}d", event->GetId(), enableMark_);
230c29fa5a6Sopenharmony_ci        return enableMark_;
231c29fa5a6Sopenharmony_ci    }
232c29fa5a6Sopenharmony_ci    return true;
233c29fa5a6Sopenharmony_ci}
234c29fa5a6Sopenharmony_ci
235c29fa5a6Sopenharmony_civoid EventDispatchHandler::SendWindowStateError(int32_t pid, int32_t windowId)
236c29fa5a6Sopenharmony_ci{
237c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
238c29fa5a6Sopenharmony_ci    auto udsServer = InputHandler->GetUDSServer();
239c29fa5a6Sopenharmony_ci    auto sess = udsServer->GetSessionByPid(WIN_MGR->GetWindowStateNotifyPid());
240c29fa5a6Sopenharmony_ci    if (sess != nullptr) {
241c29fa5a6Sopenharmony_ci        NetPacket pkt(MmiMessageId::WINDOW_STATE_ERROR_NOTIFY);
242c29fa5a6Sopenharmony_ci        pkt << pid << windowId;
243c29fa5a6Sopenharmony_ci        if (!sess->SendMsg(pkt)) {
244c29fa5a6Sopenharmony_ci            MMI_HILOGE("SendMsg failed");
245c29fa5a6Sopenharmony_ci            return;
246c29fa5a6Sopenharmony_ci        }
247c29fa5a6Sopenharmony_ci        windowStateErrorInfo_.windowId = -1;
248c29fa5a6Sopenharmony_ci        windowStateErrorInfo_.startTime = -1;
249c29fa5a6Sopenharmony_ci        windowStateErrorInfo_.pid = -1;
250c29fa5a6Sopenharmony_ci    }
251c29fa5a6Sopenharmony_ci}
252c29fa5a6Sopenharmony_ci
253c29fa5a6Sopenharmony_civoid EventDispatchHandler::HandlePointerEventInner(const std::shared_ptr<PointerEvent> point)
254c29fa5a6Sopenharmony_ci{
255c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
256c29fa5a6Sopenharmony_ci    CHKPV(point);
257c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_ANCO
258c29fa5a6Sopenharmony_ci    if (point->GetAncoDeal()) {
259c29fa5a6Sopenharmony_ci        MMI_HILOGD("event dealed by anco, ignore it");
260c29fa5a6Sopenharmony_ci        return;
261c29fa5a6Sopenharmony_ci    }
262c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_ANCO
263c29fa5a6Sopenharmony_ci    int32_t pointerId = point->GetPointerId();
264c29fa5a6Sopenharmony_ci    PointerEvent::PointerItem pointerItem;
265c29fa5a6Sopenharmony_ci    if (!point->GetPointerItem(pointerId, pointerItem)) {
266c29fa5a6Sopenharmony_ci        MMI_HILOGE("Can't find pointer item, pointer:%{public}d", pointerId);
267c29fa5a6Sopenharmony_ci        return;
268c29fa5a6Sopenharmony_ci    }
269c29fa5a6Sopenharmony_ci    std::vector<int32_t> windowIds;
270c29fa5a6Sopenharmony_ci    WIN_MGR->GetTargetWindowIds(pointerItem.GetPointerId(), point->GetSourceType(), windowIds);
271c29fa5a6Sopenharmony_ci    if (!windowIds.empty()) {
272c29fa5a6Sopenharmony_ci        HandleMultiWindowPointerEvent(point, pointerItem);
273c29fa5a6Sopenharmony_ci        return;
274c29fa5a6Sopenharmony_ci    }
275c29fa5a6Sopenharmony_ci    auto udsServer = InputHandler->GetUDSServer();
276c29fa5a6Sopenharmony_ci    auto fd = WIN_MGR->GetClientFd(point);
277c29fa5a6Sopenharmony_ci    auto pid = WIN_MGR->GetPidByWindowId(point->GetTargetWindowId());
278c29fa5a6Sopenharmony_ci    if (WIN_MGR->GetCancelEventFlag(point) && udsServer->GetSession(fd) == nullptr &&
279c29fa5a6Sopenharmony_ci        pid != -1 && point->GetTargetWindowId() != -1) {
280c29fa5a6Sopenharmony_ci        if (point->GetTargetWindowId() == windowStateErrorInfo_.windowId && pid == windowStateErrorInfo_.pid) {
281c29fa5a6Sopenharmony_ci            if (GetSysClockTime() - windowStateErrorInfo_.startTime >= ERROR_TIME) {
282c29fa5a6Sopenharmony_ci                SendWindowStateError(pid, point->GetTargetWindowId());
283c29fa5a6Sopenharmony_ci            }
284c29fa5a6Sopenharmony_ci        } else {
285c29fa5a6Sopenharmony_ci            windowStateErrorInfo_.windowId = point->GetTargetWindowId();
286c29fa5a6Sopenharmony_ci            windowStateErrorInfo_.startTime = GetSysClockTime();
287c29fa5a6Sopenharmony_ci            windowStateErrorInfo_.pid = pid;
288c29fa5a6Sopenharmony_ci        }
289c29fa5a6Sopenharmony_ci    }
290c29fa5a6Sopenharmony_ci    DispatchPointerEventInner(point, fd);
291c29fa5a6Sopenharmony_ci}
292c29fa5a6Sopenharmony_ci
293c29fa5a6Sopenharmony_civoid EventDispatchHandler::DispatchPointerEventInner(std::shared_ptr<PointerEvent> point, int32_t fd)
294c29fa5a6Sopenharmony_ci{
295c29fa5a6Sopenharmony_ci    currentTime_ = point->GetActionTime();
296c29fa5a6Sopenharmony_ci    if (fd < 0 && currentTime_ - eventTime_ > INTERVAL_TIME) {
297c29fa5a6Sopenharmony_ci        eventTime_ = currentTime_;
298c29fa5a6Sopenharmony_ci        if (point->GetPointerCount() < THREE_FINGERS &&
299c29fa5a6Sopenharmony_ci            point->GetPointerAction() != PointerEvent::POINTER_ACTION_AXIS_UPDATE &&
300c29fa5a6Sopenharmony_ci            point->GetPointerAction() != PointerEvent::POINTER_ACTION_SWIPE_UPDATE &&
301c29fa5a6Sopenharmony_ci            point->GetPointerAction() != PointerEvent::POINTER_ACTION_MOVE) {
302c29fa5a6Sopenharmony_ci            MMI_HILOGE("InputTracking id:%{public}d The fd less than 0, fd:%{public}d", point->GetId(), fd);
303c29fa5a6Sopenharmony_ci        }
304c29fa5a6Sopenharmony_ci        return;
305c29fa5a6Sopenharmony_ci    }
306c29fa5a6Sopenharmony_ci    auto udsServer = InputHandler->GetUDSServer();
307c29fa5a6Sopenharmony_ci    CHKPV(udsServer);
308c29fa5a6Sopenharmony_ci    auto sess = udsServer->GetSession(fd);
309c29fa5a6Sopenharmony_ci    if (sess == nullptr) {
310c29fa5a6Sopenharmony_ci        return;
311c29fa5a6Sopenharmony_ci    }
312c29fa5a6Sopenharmony_ci    auto currentTime = GetSysClockTime();
313c29fa5a6Sopenharmony_ci    BytraceAdapter::StartBytrace(point, BytraceAdapter::TRACE_STOP);
314c29fa5a6Sopenharmony_ci    if (ANRMgr->TriggerANR(ANR_DISPATCH, currentTime, sess)) {
315c29fa5a6Sopenharmony_ci        MMI_HILOGD("The pointer event does not report normally,app not respon. PointerEvent(deviceid:%{public}d,"
316c29fa5a6Sopenharmony_ci            "action:%{public}s)", point->GetDeviceId(), point->DumpPointerAction());
317c29fa5a6Sopenharmony_ci        return;
318c29fa5a6Sopenharmony_ci    }
319c29fa5a6Sopenharmony_ci    auto pointerEvent = std::make_shared<PointerEvent>(*point);
320c29fa5a6Sopenharmony_ci    pointerEvent->SetMarkEnabled(AcquireEnableMark(pointerEvent));
321c29fa5a6Sopenharmony_ci    pointerEvent->SetSensorInputTime(point->GetSensorInputTime());
322c29fa5a6Sopenharmony_ci    FilterInvalidPointerItem(pointerEvent, fd);
323c29fa5a6Sopenharmony_ci    NetPacket pkt(MmiMessageId::ON_POINTER_EVENT);
324c29fa5a6Sopenharmony_ci    InputEventDataTransformation::Marshalling(pointerEvent, pkt);
325c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_SECURITY_COMPONENT
326c29fa5a6Sopenharmony_ci    InputEventDataTransformation::MarshallingEnhanceData(pointerEvent, pkt);
327c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_SECURITY_COMPONENT
328c29fa5a6Sopenharmony_ci    int32_t pointerAc = pointerEvent->GetPointerAction();
329c29fa5a6Sopenharmony_ci    if (pointerAc == PointerEvent::POINTER_ACTION_PULL_DOWN || pointerAc == PointerEvent::POINTER_ACTION_UP ||
330c29fa5a6Sopenharmony_ci        pointerAc == PointerEvent::POINTER_ACTION_DOWN || pointerAc == PointerEvent::POINTER_ACTION_PULL_UP) {
331c29fa5a6Sopenharmony_ci        NotifyPointerEventToRS(pointerAc, sess->GetProgramName(),
332c29fa5a6Sopenharmony_ci            static_cast<uint32_t>(sess->GetPid()), pointerEvent->GetPointerCount());
333c29fa5a6Sopenharmony_ci    }
334c29fa5a6Sopenharmony_ci    if (pointerAc != PointerEvent::POINTER_ACTION_MOVE && pointerAc != PointerEvent::POINTER_ACTION_AXIS_UPDATE &&
335c29fa5a6Sopenharmony_ci        pointerAc != PointerEvent::POINTER_ACTION_ROTATE_UPDATE &&
336c29fa5a6Sopenharmony_ci        pointerAc != PointerEvent::POINTER_ACTION_PULL_MOVE) {
337c29fa5a6Sopenharmony_ci        MMI_HILOG_FREEZEI("SendMsg to %{public}s:pid:%{public}d, action:%{public}d",
338c29fa5a6Sopenharmony_ci            sess->GetProgramName().c_str(), sess->GetPid(), pointerEvent->GetPointerAction());
339c29fa5a6Sopenharmony_ci    }
340c29fa5a6Sopenharmony_ci    if (!udsServer->SendMsg(fd, pkt)) {
341c29fa5a6Sopenharmony_ci        MMI_HILOGE("Sending structure of EventTouch failed! errCode:%{public}d", MSG_SEND_FAIL);
342c29fa5a6Sopenharmony_ci        return;
343c29fa5a6Sopenharmony_ci    }
344c29fa5a6Sopenharmony_ci    if (sess->GetPid() != AppDebugListener::GetInstance()->GetAppDebugPid() && pointerEvent->IsMarkEnabled()) {
345c29fa5a6Sopenharmony_ci        MMI_HILOGD("Session pid:%{public}d", sess->GetPid());
346c29fa5a6Sopenharmony_ci        ANRMgr->AddTimer(ANR_DISPATCH, point->GetId(), currentTime, sess);
347c29fa5a6Sopenharmony_ci    }
348c29fa5a6Sopenharmony_ci}
349c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_POINTER
350c29fa5a6Sopenharmony_ci
351c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
352c29fa5a6Sopenharmony_ciint32_t EventDispatchHandler::DispatchKeyEventPid(UDSServer& udsServer, std::shared_ptr<KeyEvent> key)
353c29fa5a6Sopenharmony_ci{
354c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
355c29fa5a6Sopenharmony_ci    CHKPR(key, PARAM_INPUT_INVALID);
356c29fa5a6Sopenharmony_ci    int32_t ret = RET_OK;
357c29fa5a6Sopenharmony_ci    // 1.Determine whether the key event is a focus type event or an operation type event,
358c29fa5a6Sopenharmony_ci    // 2.Determine whether the current focus window has a safety sub window.
359c29fa5a6Sopenharmony_ci    auto secSubWindowTargets = WIN_MGR->UpdateTarget(key);
360c29fa5a6Sopenharmony_ci    for (const auto &item : secSubWindowTargets) {
361c29fa5a6Sopenharmony_ci        key->ClearFlag(InputEvent::EVENT_FLAG_PRIVACY_MODE);
362c29fa5a6Sopenharmony_ci        if (item.second.privacyMode == SecureFlag::PRIVACY_MODE) {
363c29fa5a6Sopenharmony_ci            key->AddFlag(InputEvent::EVENT_FLAG_PRIVACY_MODE);
364c29fa5a6Sopenharmony_ci        }
365c29fa5a6Sopenharmony_ci        key->SetTargetWindowId(item.second.id);
366c29fa5a6Sopenharmony_ci        key->SetAgentWindowId(item.second.agentWindowId);
367c29fa5a6Sopenharmony_ci        ret = DispatchKeyEvent(item.first, udsServer, key);
368c29fa5a6Sopenharmony_ci    }
369c29fa5a6Sopenharmony_ci    return ret;
370c29fa5a6Sopenharmony_ci}
371c29fa5a6Sopenharmony_ci
372c29fa5a6Sopenharmony_ciint32_t EventDispatchHandler::DispatchKeyEvent(int32_t fd, UDSServer& udsServer, std::shared_ptr<KeyEvent> key)
373c29fa5a6Sopenharmony_ci{
374c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
375c29fa5a6Sopenharmony_ci    CHKPR(key, PARAM_INPUT_INVALID);
376c29fa5a6Sopenharmony_ci    currentTime_ = key->GetActionTime();
377c29fa5a6Sopenharmony_ci    if (fd < 0 && currentTime_ - eventTime_ > INTERVAL_TIME) {
378c29fa5a6Sopenharmony_ci        eventTime_ = currentTime_;
379c29fa5a6Sopenharmony_ci        MMI_HILOGE("Invalid fd, fd:%{public}d", fd);
380c29fa5a6Sopenharmony_ci        DfxHisysevent::OnUpdateTargetKey(key, fd, OHOS::HiviewDFX::HiSysEvent::EventType::FAULT);
381c29fa5a6Sopenharmony_ci        return RET_ERR;
382c29fa5a6Sopenharmony_ci    }
383c29fa5a6Sopenharmony_ci    MMI_HILOGD("Event dispatcher of server, KeyEvent:KeyCode:%{private}d, Action:%{public}d, EventType:%{public}d,"
384c29fa5a6Sopenharmony_ci        "Fd:%{public}d", key->GetKeyCode(), key->GetAction(), key->GetEventType(), fd);
385c29fa5a6Sopenharmony_ci    auto session = udsServer.GetSession(fd);
386c29fa5a6Sopenharmony_ci    CHKPR(session, RET_ERR);
387c29fa5a6Sopenharmony_ci    auto currentTime = GetSysClockTime();
388c29fa5a6Sopenharmony_ci    if (ANRMgr->TriggerANR(ANR_DISPATCH, currentTime, session)) {
389c29fa5a6Sopenharmony_ci        if (!EventLogHelper::IsBetaVersion()) {
390c29fa5a6Sopenharmony_ci            MMI_HILOGW("The key event does not report normally, application not response."
391c29fa5a6Sopenharmony_ci                "KeyEvent(deviceid:%{public}d, key action:%{public}d)",
392c29fa5a6Sopenharmony_ci                key->GetDeviceId(), key->GetKeyAction());
393c29fa5a6Sopenharmony_ci        } else {
394c29fa5a6Sopenharmony_ci            MMI_HILOGW("The key event does not report normally, application not response."
395c29fa5a6Sopenharmony_ci                "KeyEvent(deviceid:%{public}d, keycode:%{private}d, key action:%{public}d)",
396c29fa5a6Sopenharmony_ci                key->GetDeviceId(), key->GetKeyCode(), key->GetKeyAction());
397c29fa5a6Sopenharmony_ci        }
398c29fa5a6Sopenharmony_ci        return RET_OK;
399c29fa5a6Sopenharmony_ci    }
400c29fa5a6Sopenharmony_ci
401c29fa5a6Sopenharmony_ci    NetPacket pkt(MmiMessageId::ON_KEY_EVENT);
402c29fa5a6Sopenharmony_ci    InputEventDataTransformation::KeyEventToNetPacket(key, pkt);
403c29fa5a6Sopenharmony_ci    BytraceAdapter::StartBytrace(key, BytraceAdapter::KEY_DISPATCH_EVENT);
404c29fa5a6Sopenharmony_ci    pkt << fd;
405c29fa5a6Sopenharmony_ci
406c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_SECURITY_COMPONENT
407c29fa5a6Sopenharmony_ci    InputEventDataTransformation::MarshallingEnhanceData(key, pkt);
408c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_SECURITY_COMPONENT
409c29fa5a6Sopenharmony_ci    if (pkt.ChkRWError()) {
410c29fa5a6Sopenharmony_ci        MMI_HILOGE("Packet write structure of EventKeyboard failed");
411c29fa5a6Sopenharmony_ci        return RET_ERR;
412c29fa5a6Sopenharmony_ci    }
413c29fa5a6Sopenharmony_ci    MMI_HILOGI("InputTracking id:%{public}d, SendMsg to %{public}s:pid:%{public}d",
414c29fa5a6Sopenharmony_ci        key->GetId(), session->GetProgramName().c_str(), session->GetPid());
415c29fa5a6Sopenharmony_ci    if (!udsServer.SendMsg(fd, pkt)) {
416c29fa5a6Sopenharmony_ci        MMI_HILOGE("Sending structure of EventKeyboard failed! errCode:%{public}d", MSG_SEND_FAIL);
417c29fa5a6Sopenharmony_ci        return MSG_SEND_FAIL;
418c29fa5a6Sopenharmony_ci    }
419c29fa5a6Sopenharmony_ci    if (session->GetPid() != AppDebugListener::GetInstance()->GetAppDebugPid()) {
420c29fa5a6Sopenharmony_ci        MMI_HILOGD("Session pid:%{public}d", session->GetPid());
421c29fa5a6Sopenharmony_ci        ANRMgr->AddTimer(ANR_DISPATCH, key->GetId(), currentTime, session);
422c29fa5a6Sopenharmony_ci    }
423c29fa5a6Sopenharmony_ci    return RET_OK;
424c29fa5a6Sopenharmony_ci}
425c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
426c29fa5a6Sopenharmony_ci} // namespace MMI
427c29fa5a6Sopenharmony_ci} // namespace OHOS
428