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