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 "mmi_service.h"
17c29fa5a6Sopenharmony_ci
18c29fa5a6Sopenharmony_ci#include <parameters.h>
19c29fa5a6Sopenharmony_ci#include <sys/signalfd.h>
20c29fa5a6Sopenharmony_ci
21c29fa5a6Sopenharmony_ci#include <cinttypes>
22c29fa5a6Sopenharmony_ci#include <csignal>
23c29fa5a6Sopenharmony_ci#include <cstdlib>
24c29fa5a6Sopenharmony_ci#include "string_ex.h"
25c29fa5a6Sopenharmony_ci#ifdef OHOS_RSS_CLIENT
26c29fa5a6Sopenharmony_ci#include <unordered_map>
27c29fa5a6Sopenharmony_ci#endif // OHOS_RSS_CLIENT
28c29fa5a6Sopenharmony_ci
29c29fa5a6Sopenharmony_ci#include "ability_manager_client.h"
30c29fa5a6Sopenharmony_ci#include "anr_manager.h"
31c29fa5a6Sopenharmony_ci#include "app_debug_listener.h"
32c29fa5a6Sopenharmony_ci#include "app_state_observer.h"
33c29fa5a6Sopenharmony_ci#include "device_event_monitor.h"
34c29fa5a6Sopenharmony_ci#include "dfx_define.h"
35c29fa5a6Sopenharmony_ci#include "dfx_dump_catcher.h"
36c29fa5a6Sopenharmony_ci#include "dfx_hisysevent.h"
37c29fa5a6Sopenharmony_ci#include "dfx_json_formatter.h"
38c29fa5a6Sopenharmony_ci
39c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
40c29fa5a6Sopenharmony_ci#include "display_event_monitor.h"
41c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
42c29fa5a6Sopenharmony_ci#include "event_dump.h"
43c29fa5a6Sopenharmony_ci#include "event_statistic.h"
44c29fa5a6Sopenharmony_ci#include "event_log_helper.h"
45c29fa5a6Sopenharmony_ci#include "ffrt.h"
46c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_FINGERSENSE_WRAPPER
47c29fa5a6Sopenharmony_ci#include "fingersense_wrapper.h"
48c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_FINGERSENSE_WRAPPER
49c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_GESTURESENSE_WRAPPER
50c29fa5a6Sopenharmony_ci#include "gesturesense_wrapper.h"
51c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_GESTURESENSE_WRAPPER
52c29fa5a6Sopenharmony_ci#include "infrared_emitter_controller.h"
53c29fa5a6Sopenharmony_ci#include "input_device_manager.h"
54c29fa5a6Sopenharmony_ci#include "ipc_skeleton.h"
55c29fa5a6Sopenharmony_ci#include "i_input_windows_manager.h"
56c29fa5a6Sopenharmony_ci#include "i_pointer_drawing_manager.h"
57c29fa5a6Sopenharmony_ci#include "i_preference_manager.h"
58c29fa5a6Sopenharmony_ci#include "key_auto_repeat.h"
59c29fa5a6Sopenharmony_ci#include "key_command_handler.h"
60c29fa5a6Sopenharmony_ci#include "key_map_manager.h"
61c29fa5a6Sopenharmony_ci#ifdef SHORTCUT_KEY_MANAGER_ENABLED
62c29fa5a6Sopenharmony_ci#include "key_shortcut_manager.h"
63c29fa5a6Sopenharmony_ci#endif // SHORTCUT_KEY_MANAGER_ENABLED
64c29fa5a6Sopenharmony_ci#include "mmi_log.h"
65c29fa5a6Sopenharmony_ci#include "multimodal_input_connect_def_parcel.h"
66c29fa5a6Sopenharmony_ci#include "permission_helper.h"
67c29fa5a6Sopenharmony_ci#include "timer_manager.h"
68c29fa5a6Sopenharmony_ci#include "tokenid_kit.h"
69c29fa5a6Sopenharmony_ci#include "touch_event_normalize.h"
70c29fa5a6Sopenharmony_ci#include "touch_gesture_adapter.h"
71c29fa5a6Sopenharmony_ci#include "util.h"
72c29fa5a6Sopenharmony_ci#include "util_ex.h"
73c29fa5a6Sopenharmony_ci#include "watchdog_task.h"
74c29fa5a6Sopenharmony_ci#include "xcollie/watchdog.h"
75c29fa5a6Sopenharmony_ci#include "xcollie/xcollie.h"
76c29fa5a6Sopenharmony_ci#include "xcollie/xcollie_define.h"
77c29fa5a6Sopenharmony_ci
78c29fa5a6Sopenharmony_ci#ifdef OHOS_RSS_CLIENT
79c29fa5a6Sopenharmony_ci#include "res_sched_client.h"
80c29fa5a6Sopenharmony_ci#include "res_type.h"
81c29fa5a6Sopenharmony_ci#include "system_ability_definition.h"
82c29fa5a6Sopenharmony_ci#endif // OHOS_RSS_CLIENT
83c29fa5a6Sopenharmony_ci#include "setting_datashare.h"
84c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_ANCO
85c29fa5a6Sopenharmony_ci#include "app_mgr_client.h"
86c29fa5a6Sopenharmony_ci#include "running_process_info.h"
87c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_ANCO
88c29fa5a6Sopenharmony_ci
89c29fa5a6Sopenharmony_ci#ifdef PLAYER_FRAMEWORK_EXISTS
90c29fa5a6Sopenharmony_ci#include "input_screen_capture_agent.h"
91c29fa5a6Sopenharmony_ci#endif // PLAYER_FRAMEWORK_EXISTS
92c29fa5a6Sopenharmony_ci
93c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_VKEYBOARD
94c29fa5a6Sopenharmony_ci#include "vkeyboard.h"
95c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_VKEYBOARD
96c29fa5a6Sopenharmony_ci
97c29fa5a6Sopenharmony_ci#undef MMI_LOG_TAG
98c29fa5a6Sopenharmony_ci#define MMI_LOG_TAG "MMIService"
99c29fa5a6Sopenharmony_ci#undef MMI_LOG_DOMAIN
100c29fa5a6Sopenharmony_ci#define MMI_LOG_DOMAIN MMI_LOG_SERVER
101c29fa5a6Sopenharmony_ci
102c29fa5a6Sopenharmony_cinamespace OHOS {
103c29fa5a6Sopenharmony_cinamespace MMI {
104c29fa5a6Sopenharmony_cinamespace {
105c29fa5a6Sopenharmony_cistd::mutex g_instanceMutex;
106c29fa5a6Sopenharmony_ciMMIService* g_MMIService;
107c29fa5a6Sopenharmony_ciconst std::string DEF_INPUT_SEAT { "seat0" };
108c29fa5a6Sopenharmony_ciconst std::string THREAD_NAME { "mmi-service" };
109c29fa5a6Sopenharmony_ciconstexpr int32_t WATCHDOG_INTERVAL_TIME { 30000 };
110c29fa5a6Sopenharmony_ci[[ maybe_unused ]] constexpr int32_t WATCHDOG_DELAY_TIME { 40000 };
111c29fa5a6Sopenharmony_ciconstexpr int32_t RELOAD_DEVICE_TIME { 2000 };
112c29fa5a6Sopenharmony_ci[[ maybe_unused ]] constexpr int32_t WATCHDOG_WARNTIME { 6000 };
113c29fa5a6Sopenharmony_ci[[ maybe_unused ]] constexpr int32_t WATCHDOG_BLOCKTIME { 3000 };
114c29fa5a6Sopenharmony_ciconstexpr int32_t REMOVE_OBSERVER { -2 };
115c29fa5a6Sopenharmony_ciconstexpr int32_t REPEAT_COUNT { 2 };
116c29fa5a6Sopenharmony_ciconstexpr int32_t UNSUBSCRIBED { -1 };
117c29fa5a6Sopenharmony_ciconstexpr int32_t UNOBSERVED { -1 };
118c29fa5a6Sopenharmony_ciconstexpr int32_t SUBSCRIBED { 1 };
119c29fa5a6Sopenharmony_ci[[ maybe_unused ]] constexpr int32_t DISTRIBUTE_TIME { 1000 }; // 1000ms
120c29fa5a6Sopenharmony_ciconstexpr int32_t COMMON_PARAMETER_ERROR { 401 };
121c29fa5a6Sopenharmony_ciconstexpr size_t MAX_FRAME_NUMS { 100 };
122c29fa5a6Sopenharmony_ciconstexpr int32_t THREAD_BLOCK_TIMER_SPAN_S { 3 };
123c29fa5a6Sopenharmony_ciconstexpr int32_t PRINT_INTERVAL_TIME { 30000 };
124c29fa5a6Sopenharmony_ciconst std::set<int32_t> g_keyCodeValueSet = {
125c29fa5a6Sopenharmony_ci    KeyEvent::KEYCODE_FN, KeyEvent::KEYCODE_DPAD_UP, KeyEvent::KEYCODE_DPAD_DOWN, KeyEvent::KEYCODE_DPAD_LEFT,
126c29fa5a6Sopenharmony_ci    KeyEvent::KEYCODE_DPAD_RIGHT, KeyEvent::KEYCODE_ALT_LEFT, KeyEvent::KEYCODE_ALT_RIGHT,
127c29fa5a6Sopenharmony_ci    KeyEvent::KEYCODE_SHIFT_LEFT, KeyEvent::KEYCODE_SHIFT_RIGHT, KeyEvent::KEYCODE_TAB, KeyEvent::KEYCODE_ENTER,
128c29fa5a6Sopenharmony_ci    KeyEvent::KEYCODE_DEL, KeyEvent::KEYCODE_MENU, KeyEvent::KEYCODE_PAGE_UP, KeyEvent::KEYCODE_PAGE_DOWN,
129c29fa5a6Sopenharmony_ci    KeyEvent::KEYCODE_ESCAPE, KeyEvent::KEYCODE_FORWARD_DEL, KeyEvent::KEYCODE_CTRL_LEFT, KeyEvent::KEYCODE_CTRL_RIGHT,
130c29fa5a6Sopenharmony_ci    KeyEvent::KEYCODE_CAPS_LOCK, KeyEvent::KEYCODE_SCROLL_LOCK, KeyEvent::KEYCODE_META_LEFT,
131c29fa5a6Sopenharmony_ci    KeyEvent::KEYCODE_META_RIGHT, KeyEvent::KEYCODE_SYSRQ, KeyEvent::KEYCODE_BREAK, KeyEvent::KEYCODE_MOVE_HOME,
132c29fa5a6Sopenharmony_ci    KeyEvent::KEYCODE_MOVE_END, KeyEvent::KEYCODE_INSERT, KeyEvent::KEYCODE_F1, KeyEvent::KEYCODE_F2,
133c29fa5a6Sopenharmony_ci    KeyEvent::KEYCODE_F3, KeyEvent::KEYCODE_F4, KeyEvent::KEYCODE_F5, KeyEvent::KEYCODE_F6, KeyEvent::KEYCODE_F7,
134c29fa5a6Sopenharmony_ci    KeyEvent::KEYCODE_F8, KeyEvent::KEYCODE_F9, KeyEvent::KEYCODE_F10, KeyEvent::KEYCODE_F11, KeyEvent::KEYCODE_F12,
135c29fa5a6Sopenharmony_ci    KeyEvent::KEYCODE_NUM_LOCK
136c29fa5a6Sopenharmony_ci};
137c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_ANCO
138c29fa5a6Sopenharmony_ciconstexpr int32_t DEFAULT_USER_ID { 100 };
139c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_ANCO
140c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_VKEYBOARD
141c29fa5a6Sopenharmony_ciconst std::string DEVICE_TYPE_HPR { "HPR" };
142c29fa5a6Sopenharmony_ciconst std::string PRODUCT_TYPE = OHOS::system::GetParameter("const.build.product", "HYM");
143c29fa5a6Sopenharmony_ci// Define vkeyboard functions from vendor
144c29fa5a6Sopenharmony_ciconst std::string VKEYBOARD_PATH { "libvkeyboard.z.so" };
145c29fa5a6Sopenharmony_civoid* g_VKeyboardHandle = nullptr;
146c29fa5a6Sopenharmony_citypedef void (*ALGORITHM_KEYDOWN_TYPE)(
147c29fa5a6Sopenharmony_ci    double screenX, double screenY, int touchId, bool tipDown, string buttonName);
148c29fa5a6Sopenharmony_ciALGORITHM_KEYDOWN_TYPE algorithm_keydown_ = nullptr;
149c29fa5a6Sopenharmony_citypedef void (*ALGORITHM_KEYUP_TYPE)(
150c29fa5a6Sopenharmony_ci    double screenX, double screenY, int touchId, bool tipDown, string buttonName);
151c29fa5a6Sopenharmony_ciALGORITHM_KEYUP_TYPE algorithm_keyup_ = nullptr;
152c29fa5a6Sopenharmony_citypedef int32_t (*GAUSSIANKEYBOARD_GETKEYCODEBYKEYNAME_TYPE)(string keyName);
153c29fa5a6Sopenharmony_ciGAUSSIANKEYBOARD_GETKEYCODEBYKEYNAME_TYPE gaussiankeyboard_getKeyCodeByKeyName_ = nullptr;
154c29fa5a6Sopenharmony_citypedef int32_t (*GAUSSIANKEYBOARD_GETKEYCODEBYKEYNAMEANDSHIFT_TYPE)(string keyName, bool& useShift);
155c29fa5a6Sopenharmony_ciGAUSSIANKEYBOARD_GETKEYCODEBYKEYNAMEANDSHIFT_TYPE gaussiankeyboard_getKeyCodeByKeyNameAndShift_ = nullptr;
156c29fa5a6Sopenharmony_citypedef void (*GAUSSIANKEYBOARD_UPDATEMOTIONSPACE_TYPE)(
157c29fa5a6Sopenharmony_ci    string keyName, bool useShift, std::vector<int32_t>& pattern);
158c29fa5a6Sopenharmony_ciGAUSSIANKEYBOARD_UPDATEMOTIONSPACE_TYPE gaussiankeyboard_updateMotionSpace_ = nullptr;
159c29fa5a6Sopenharmony_citypedef void (*GAUSSIANKEYBOARD_SETVKEYBOARDAREA_TYPE)(
160c29fa5a6Sopenharmony_ci    double topLeftX, double topLeftY, double bottomRightX, double bottomRightY);
161c29fa5a6Sopenharmony_ciGAUSSIANKEYBOARD_SETVKEYBOARDAREA_TYPE gaussiankeyboard_setVKeyboardArea_ = nullptr;
162c29fa5a6Sopenharmony_citypedef void (*BAYESIANENGINE_MAPTOUCHTOBUTTON_TYPE)(
163c29fa5a6Sopenharmony_ci    double screenX, double screenY, int touchId, bool tipDown, string& buttonName,
164c29fa5a6Sopenharmony_ci    long long timestamp, bool updateDynamicGaussian, vector<pair<string, double>>& sortedNegLogProb);
165c29fa5a6Sopenharmony_ciBAYESIANENGINE_MAPTOUCHTOBUTTON_TYPE bayesianengine_mapTouchToButton_ = nullptr;
166c29fa5a6Sopenharmony_ci// Return message type.
167c29fa5a6Sopenharmony_citypedef int32_t (*STATEMACINEMESSAGQUEUE_GETMESSAGE_TYPE)(
168c29fa5a6Sopenharmony_ci    string& buttonName, string& toggleButtonName, int& buttonMode, string& RestList);
169c29fa5a6Sopenharmony_ciSTATEMACINEMESSAGQUEUE_GETMESSAGE_TYPE statemachineMessageQueue_getMessage_ = nullptr;
170c29fa5a6Sopenharmony_citypedef void (*STATEMACINEMESSAGQUEUE_CLEARMESSAGE_TYPE)();
171c29fa5a6Sopenharmony_ciSTATEMACINEMESSAGQUEUE_CLEARMESSAGE_TYPE statemachineMessageQueue_clearMessage_ = nullptr;
172c29fa5a6Sopenharmony_citypedef bool (*GAUSSIANKEYBOARD_ISINSIDEVKEYBOARDAREA_TYPE)(double x, double y);
173c29fa5a6Sopenharmony_ciGAUSSIANKEYBOARD_ISINSIDEVKEYBOARDAREA_TYPE gaussiankeyboard_isInsideVKeyboardArea_ = nullptr;
174c29fa5a6Sopenharmony_citypedef bool (*GAUSSIANKEYBOARD_ISVKEYBOARDVISIBLE_TYPE)();
175c29fa5a6Sopenharmony_ciGAUSSIANKEYBOARD_ISVKEYBOARDVISIBLE_TYPE gaussiankeyboard_isVKeyboardVisible_ = nullptr;
176c29fa5a6Sopenharmony_citypedef bool (*ALGORITHM_ISKEYDOWNINKEYBOARD_TYPE)(int touchId);
177c29fa5a6Sopenharmony_ciALGORITHM_ISKEYDOWNINKEYBOARD_TYPE algorithm_isKeyDownInKeyboard_ = nullptr;
178c29fa5a6Sopenharmony_cistd::vector<int32_t> g_VKeyDownSet;
179c29fa5a6Sopenharmony_cistd::unordered_set<int32_t> g_VKeyModifiersDownSet;
180c29fa5a6Sopenharmony_ci// Shared key event for key injection for printing.
181c29fa5a6Sopenharmony_cistd::shared_ptr<KeyEvent> g_VKeySharedKeyEvent { nullptr };
182c29fa5a6Sopenharmony_ci// Shared key event for UI rendering.
183c29fa5a6Sopenharmony_cistd::shared_ptr<KeyEvent> g_VKeySharedUIKeyEvent { nullptr };
184c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_VKEYBOARD
185c29fa5a6Sopenharmony_ci} // namespace
186c29fa5a6Sopenharmony_ci
187c29fa5a6Sopenharmony_ciconst bool REGISTER_RESULT = SystemAbility::MakeAndRegisterAbility(MMIService::GetInstance());
188c29fa5a6Sopenharmony_ci
189c29fa5a6Sopenharmony_citemplate <class... Ts> void CheckDefineOutput(const char *fmt, Ts... args)
190c29fa5a6Sopenharmony_ci{
191c29fa5a6Sopenharmony_ci    CHKPV(fmt);
192c29fa5a6Sopenharmony_ci    char buf[MAX_PACKET_BUF_SIZE] = {};
193c29fa5a6Sopenharmony_ci    int32_t ret = snprintf_s(buf, MAX_PACKET_BUF_SIZE, MAX_PACKET_BUF_SIZE - 1, fmt, args...);
194c29fa5a6Sopenharmony_ci    if (ret == -1) {
195c29fa5a6Sopenharmony_ci        KMSG_LOGE("Call snprintf_s failed.ret = %d", ret);
196c29fa5a6Sopenharmony_ci        return;
197c29fa5a6Sopenharmony_ci    }
198c29fa5a6Sopenharmony_ci    KMSG_LOGI("%s", buf);
199c29fa5a6Sopenharmony_ci    MMI_HILOGI("%{public}s", buf);
200c29fa5a6Sopenharmony_ci}
201c29fa5a6Sopenharmony_ci
202c29fa5a6Sopenharmony_cistatic void CheckDefine()
203c29fa5a6Sopenharmony_ci{
204c29fa5a6Sopenharmony_ci    CheckDefineOutput("ChkDefs:");
205c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER_DRAWING
206c29fa5a6Sopenharmony_ci    CheckDefineOutput("%-40s", "OHOS_BUILD_ENABLE_POINTER_DRAWING");
207c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER_DRAWING
208c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_INTERCEPTOR
209c29fa5a6Sopenharmony_ci    CheckDefineOutput("%-40s", "OHOS_BUILD_ENABLE_INTERCEPTOR");
210c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_INTERCEPTOR
211c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
212c29fa5a6Sopenharmony_ci    CheckDefineOutput("%-40s", "OHOS_BUILD_ENABLE_KEYBOARD");
213c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
214c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
215c29fa5a6Sopenharmony_ci    CheckDefineOutput("%-40s", "OHOS_BUILD_ENABLE_POINTER");
216c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
217c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_TOUCH
218c29fa5a6Sopenharmony_ci    CheckDefineOutput("%-40s", "OHOS_BUILD_ENABLE_TOUCH");
219c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_TOUCH
220c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_MONITOR
221c29fa5a6Sopenharmony_ci    CheckDefineOutput("%-40s", "OHOS_BUILD_ENABLE_MONITOR");
222c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_MONITOR
223c29fa5a6Sopenharmony_ci}
224c29fa5a6Sopenharmony_ci
225c29fa5a6Sopenharmony_ciMMIService::MMIService() : SystemAbility(MULTIMODAL_INPUT_CONNECT_SERVICE_ID, true) {}
226c29fa5a6Sopenharmony_ci
227c29fa5a6Sopenharmony_ciMMIService::~MMIService()
228c29fa5a6Sopenharmony_ci{
229c29fa5a6Sopenharmony_ci    if (g_MMIService != nullptr) {
230c29fa5a6Sopenharmony_ci        g_MMIService = nullptr;
231c29fa5a6Sopenharmony_ci    }
232c29fa5a6Sopenharmony_ci    MMI_HILOGI("~MMIService");
233c29fa5a6Sopenharmony_ci}
234c29fa5a6Sopenharmony_ci
235c29fa5a6Sopenharmony_ciMMIService* MMIService::GetInstance()
236c29fa5a6Sopenharmony_ci{
237c29fa5a6Sopenharmony_ci    if (g_MMIService == nullptr) {
238c29fa5a6Sopenharmony_ci        std::lock_guard<std::mutex> lock(g_instanceMutex);
239c29fa5a6Sopenharmony_ci        if (g_MMIService == nullptr) {
240c29fa5a6Sopenharmony_ci            MMI_HILOGI("New MMIService");
241c29fa5a6Sopenharmony_ci            g_MMIService = new MMIService();
242c29fa5a6Sopenharmony_ci        }
243c29fa5a6Sopenharmony_ci    }
244c29fa5a6Sopenharmony_ci    return g_MMIService;
245c29fa5a6Sopenharmony_ci}
246c29fa5a6Sopenharmony_ci
247c29fa5a6Sopenharmony_ciint32_t MMIService::AddEpoll(EpollEventType type, int32_t fd)
248c29fa5a6Sopenharmony_ci{
249c29fa5a6Sopenharmony_ci    if (type < EPOLL_EVENT_BEGIN || type >= EPOLL_EVENT_END) {
250c29fa5a6Sopenharmony_ci        MMI_HILOGE("Invalid param type");
251c29fa5a6Sopenharmony_ci        return RET_ERR;
252c29fa5a6Sopenharmony_ci    }
253c29fa5a6Sopenharmony_ci    if (fd < 0) {
254c29fa5a6Sopenharmony_ci        MMI_HILOGE("Invalid param fd_");
255c29fa5a6Sopenharmony_ci        return RET_ERR;
256c29fa5a6Sopenharmony_ci    }
257c29fa5a6Sopenharmony_ci    if (mmiFd_ < 0) {
258c29fa5a6Sopenharmony_ci        MMI_HILOGE("Invalid param mmiFd_");
259c29fa5a6Sopenharmony_ci        return RET_ERR;
260c29fa5a6Sopenharmony_ci    }
261c29fa5a6Sopenharmony_ci    auto eventData = std::make_shared<mmi_epoll_event>();
262c29fa5a6Sopenharmony_ci    eventData->fd = fd;
263c29fa5a6Sopenharmony_ci    eventData->event_type = type;
264c29fa5a6Sopenharmony_ci    MMI_HILOGI("userdata:[fd:%{public}d, type:%{public}d]", eventData->fd, eventData->event_type);
265c29fa5a6Sopenharmony_ci
266c29fa5a6Sopenharmony_ci    struct epoll_event ev = {};
267c29fa5a6Sopenharmony_ci    ev.events = EPOLLIN;
268c29fa5a6Sopenharmony_ci    ev.data.fd = fd;
269c29fa5a6Sopenharmony_ci    auto ret = EpollCtl(fd, EPOLL_CTL_ADD, ev, mmiFd_);
270c29fa5a6Sopenharmony_ci    if (ret < 0) {
271c29fa5a6Sopenharmony_ci        eventData = nullptr;
272c29fa5a6Sopenharmony_ci        ev.data.ptr = nullptr;
273c29fa5a6Sopenharmony_ci        return ret;
274c29fa5a6Sopenharmony_ci    }
275c29fa5a6Sopenharmony_ci    AddEpollEvent(fd, eventData);
276c29fa5a6Sopenharmony_ci    return RET_OK;
277c29fa5a6Sopenharmony_ci}
278c29fa5a6Sopenharmony_ci
279c29fa5a6Sopenharmony_ciint32_t MMIService::DelEpoll(EpollEventType type, int32_t fd)
280c29fa5a6Sopenharmony_ci{
281c29fa5a6Sopenharmony_ci    if (type < EPOLL_EVENT_BEGIN || type >= EPOLL_EVENT_END) {
282c29fa5a6Sopenharmony_ci        MMI_HILOGE("Invalid param type");
283c29fa5a6Sopenharmony_ci        return RET_ERR;
284c29fa5a6Sopenharmony_ci    }
285c29fa5a6Sopenharmony_ci    if (fd < 0) {
286c29fa5a6Sopenharmony_ci        MMI_HILOGE("Invalid param fd_");
287c29fa5a6Sopenharmony_ci        return RET_ERR;
288c29fa5a6Sopenharmony_ci    }
289c29fa5a6Sopenharmony_ci    if (mmiFd_ < 0) {
290c29fa5a6Sopenharmony_ci        MMI_HILOGE("Invalid param mmiFd_");
291c29fa5a6Sopenharmony_ci        return RET_ERR;
292c29fa5a6Sopenharmony_ci    }
293c29fa5a6Sopenharmony_ci    struct epoll_event ev = {};
294c29fa5a6Sopenharmony_ci    auto ret = EpollCtl(fd, EPOLL_CTL_DEL, ev, mmiFd_);
295c29fa5a6Sopenharmony_ci    if (ret < 0) {
296c29fa5a6Sopenharmony_ci        MMI_HILOGE("DelEpoll failed");
297c29fa5a6Sopenharmony_ci        return ret;
298c29fa5a6Sopenharmony_ci    }
299c29fa5a6Sopenharmony_ci    return RET_OK;
300c29fa5a6Sopenharmony_ci}
301c29fa5a6Sopenharmony_ci
302c29fa5a6Sopenharmony_cibool MMIService::IsRunning() const
303c29fa5a6Sopenharmony_ci{
304c29fa5a6Sopenharmony_ci    return (state_ == ServiceRunningState::STATE_RUNNING);
305c29fa5a6Sopenharmony_ci}
306c29fa5a6Sopenharmony_ci
307c29fa5a6Sopenharmony_cibool MMIService::InitLibinputService()
308c29fa5a6Sopenharmony_ci{
309c29fa5a6Sopenharmony_ci    if (!(libinputAdapter_.Init([] (void *event, int64_t frameTime) {
310c29fa5a6Sopenharmony_ci        ::OHOS::DelayedSingleton<InputEventHandler>::GetInstance()->OnEvent(event, frameTime);
311c29fa5a6Sopenharmony_ci        }
312c29fa5a6Sopenharmony_ci        ))) {
313c29fa5a6Sopenharmony_ci        MMI_HILOGE("Libinput init, bind failed");
314c29fa5a6Sopenharmony_ci        return false;
315c29fa5a6Sopenharmony_ci    }
316c29fa5a6Sopenharmony_ci    auto inputFds = libinputAdapter_.GetInputFds();
317c29fa5a6Sopenharmony_ci    for (auto fd : inputFds) {
318c29fa5a6Sopenharmony_ci        auto ret = AddEpoll(EPOLL_EVENT_INPUT, fd);
319c29fa5a6Sopenharmony_ci        if (ret < 0) {
320c29fa5a6Sopenharmony_ci            MMI_HILOGE("AddEpoll error ret:%{public}d", ret);
321c29fa5a6Sopenharmony_ci            EpollClose();
322c29fa5a6Sopenharmony_ci            return false;
323c29fa5a6Sopenharmony_ci        }
324c29fa5a6Sopenharmony_ci        MMI_HILOGD("AddEpoll, epollfd:%{public}d, fd:%{public}d", mmiFd_, fd);
325c29fa5a6Sopenharmony_ci    }
326c29fa5a6Sopenharmony_ci    return true;
327c29fa5a6Sopenharmony_ci}
328c29fa5a6Sopenharmony_ci
329c29fa5a6Sopenharmony_cibool MMIService::InitService()
330c29fa5a6Sopenharmony_ci{
331c29fa5a6Sopenharmony_ci    MMI_HILOGD("Server msg handler Init");
332c29fa5a6Sopenharmony_ci    sMsgHandler_.Init(*this);
333c29fa5a6Sopenharmony_ci    if (state_ != ServiceRunningState::STATE_NOT_START) {
334c29fa5a6Sopenharmony_ci        MMI_HILOGE("Service running status is not enabled");
335c29fa5a6Sopenharmony_ci        return false;
336c29fa5a6Sopenharmony_ci    }
337c29fa5a6Sopenharmony_ci    if (EpollCreate(MAX_EVENT_SIZE) < 0) {
338c29fa5a6Sopenharmony_ci        MMI_HILOGE("Create epoll failed");
339c29fa5a6Sopenharmony_ci        return false;
340c29fa5a6Sopenharmony_ci    }
341c29fa5a6Sopenharmony_ci    auto ret = AddEpoll(EPOLL_EVENT_SOCKET, epollFd_);
342c29fa5a6Sopenharmony_ci    if (ret < 0) {
343c29fa5a6Sopenharmony_ci        MMI_HILOGE("AddEpoll error ret:%{public}d", ret);
344c29fa5a6Sopenharmony_ci        EpollClose();
345c29fa5a6Sopenharmony_ci        return false;
346c29fa5a6Sopenharmony_ci    }
347c29fa5a6Sopenharmony_ci    state_ = ServiceRunningState::STATE_RUNNING;
348c29fa5a6Sopenharmony_ci    if (!(Publish(this))) {
349c29fa5a6Sopenharmony_ci        state_ = ServiceRunningState::STATE_NOT_START;
350c29fa5a6Sopenharmony_ci        MMI_HILOGE("Service initialization failed");
351c29fa5a6Sopenharmony_ci        EpollClose();
352c29fa5a6Sopenharmony_ci        return false;
353c29fa5a6Sopenharmony_ci    }
354c29fa5a6Sopenharmony_ci    MMI_HILOGI("AddEpoll, epollfd:%{public}d, fd:%{public}d", mmiFd_, epollFd_);
355c29fa5a6Sopenharmony_ci    return true;
356c29fa5a6Sopenharmony_ci}
357c29fa5a6Sopenharmony_ci
358c29fa5a6Sopenharmony_cibool MMIService::InitDelegateTasks()
359c29fa5a6Sopenharmony_ci{
360c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
361c29fa5a6Sopenharmony_ci    if (!delegateTasks_.Init()) {
362c29fa5a6Sopenharmony_ci        MMI_HILOGE("The delegate task init failed");
363c29fa5a6Sopenharmony_ci        return false;
364c29fa5a6Sopenharmony_ci    }
365c29fa5a6Sopenharmony_ci    auto ret = AddEpoll(EPOLL_EVENT_ETASK, delegateTasks_.GetReadFd());
366c29fa5a6Sopenharmony_ci    if (ret < 0) {
367c29fa5a6Sopenharmony_ci        MMI_HILOGE("AddEpoll error ret:%{public}d", ret);
368c29fa5a6Sopenharmony_ci        EpollClose();
369c29fa5a6Sopenharmony_ci        return false;
370c29fa5a6Sopenharmony_ci    }
371c29fa5a6Sopenharmony_ci    std::function<int32_t(DTaskCallback)> fun = [this](DTaskCallback cb) -> int32_t {
372c29fa5a6Sopenharmony_ci        return delegateTasks_.PostSyncTask(cb);
373c29fa5a6Sopenharmony_ci    };
374c29fa5a6Sopenharmony_ci    delegateInterface_ = std::make_shared<DelegateInterface>(fun);
375c29fa5a6Sopenharmony_ci    delegateInterface_->Init();
376c29fa5a6Sopenharmony_ci    MMI_HILOGI("AddEpoll, epollfd:%{public}d, fd:%{public}d", mmiFd_, delegateTasks_.GetReadFd());
377c29fa5a6Sopenharmony_ci    return true;
378c29fa5a6Sopenharmony_ci}
379c29fa5a6Sopenharmony_ci__attribute__((no_sanitize("cfi")))
380c29fa5a6Sopenharmony_ciint32_t MMIService::Init()
381c29fa5a6Sopenharmony_ci{
382c29fa5a6Sopenharmony_ci    CheckDefine();
383c29fa5a6Sopenharmony_ci    MMI_HILOGD("WindowsManager Init");
384c29fa5a6Sopenharmony_ci    WIN_MGR->Init(*this);
385c29fa5a6Sopenharmony_ci    MMI_HILOGD("NapProcess Init");
386c29fa5a6Sopenharmony_ci    NapProcess::GetInstance()->Init(*this);
387c29fa5a6Sopenharmony_ci    MMI_HILOGD("ANRManager Init");
388c29fa5a6Sopenharmony_ci    ANRMgr->Init(*this);
389c29fa5a6Sopenharmony_ci    MMI_HILOGI("PointerDrawingManager Init");
390c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
391c29fa5a6Sopenharmony_ci    if (!IPointerDrawingManager::GetInstance()->Init()) {
392c29fa5a6Sopenharmony_ci        MMI_HILOGE("Pointer draw init failed");
393c29fa5a6Sopenharmony_ci        return POINTER_DRAW_INIT_FAIL;
394c29fa5a6Sopenharmony_ci    }
395c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
396c29fa5a6Sopenharmony_ci    mmiFd_ = EpollCreate(MAX_EVENT_SIZE);
397c29fa5a6Sopenharmony_ci    if (mmiFd_ < 0) {
398c29fa5a6Sopenharmony_ci        MMI_HILOGE("Create epoll failed");
399c29fa5a6Sopenharmony_ci        return EPOLL_CREATE_FAIL;
400c29fa5a6Sopenharmony_ci    }
401c29fa5a6Sopenharmony_ci    MMI_HILOGD("Input msg handler init");
402c29fa5a6Sopenharmony_ci    InputHandler->Init(*this);
403c29fa5a6Sopenharmony_ci    MMI_HILOGD("Libinput service init");
404c29fa5a6Sopenharmony_ci    if (!InitLibinputService()) {
405c29fa5a6Sopenharmony_ci        MMI_HILOGE("Libinput init failed");
406c29fa5a6Sopenharmony_ci        return LIBINPUT_INIT_FAIL;
407c29fa5a6Sopenharmony_ci    }
408c29fa5a6Sopenharmony_ci    MMI_HILOGD("Init DelegateTasks init");
409c29fa5a6Sopenharmony_ci    if (!InitDelegateTasks()) {
410c29fa5a6Sopenharmony_ci        MMI_HILOGE("Delegate tasks init failed");
411c29fa5a6Sopenharmony_ci        return ETASKS_INIT_FAIL;
412c29fa5a6Sopenharmony_ci    }
413c29fa5a6Sopenharmony_ci    SetRecvFun([this] (SessionPtr sess, NetPacket& pkt) {sMsgHandler_.OnMsgHandler(sess, pkt);});
414c29fa5a6Sopenharmony_ci    KeyMapMgr->GetConfigKeyValue("default_keymap", KeyMapMgr->GetDefaultKeyId());
415c29fa5a6Sopenharmony_ci    OHOS::system::SetParameter(INPUT_POINTER_DEVICES, "false");
416c29fa5a6Sopenharmony_ci    if (!InitService()) {
417c29fa5a6Sopenharmony_ci        MMI_HILOGE("Saservice init failed");
418c29fa5a6Sopenharmony_ci        return SASERVICE_INIT_FAIL;
419c29fa5a6Sopenharmony_ci    }
420c29fa5a6Sopenharmony_ci    MMI_HILOGI("Set para input.pointer.device false");
421c29fa5a6Sopenharmony_ci    return RET_OK;
422c29fa5a6Sopenharmony_ci}
423c29fa5a6Sopenharmony_ci
424c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_VKEYBOARD
425c29fa5a6Sopenharmony_cibool IsEightFingersDown(int32_t pointerId, int32_t pointerAction)
426c29fa5a6Sopenharmony_ci{
427c29fa5a6Sopenharmony_ci    if (pointerAction == MMI::PointerEvent::POINTER_ACTION_UP) {
428c29fa5a6Sopenharmony_ci        std::vector<int32_t>::iterator ite = std::find(g_VKeyDownSet.begin(), g_VKeyDownSet.end(), pointerId);
429c29fa5a6Sopenharmony_ci        if (ite != g_VKeyDownSet.end()) {
430c29fa5a6Sopenharmony_ci            g_VKeyDownSet.erase(ite);
431c29fa5a6Sopenharmony_ci        }
432c29fa5a6Sopenharmony_ci    } else if (pointerAction == MMI::PointerEvent::POINTER_ACTION_DOWN) {
433c29fa5a6Sopenharmony_ci        if (std::find(g_VKeyDownSet.begin(), g_VKeyDownSet.end(), pointerId) == g_VKeyDownSet.end()) {
434c29fa5a6Sopenharmony_ci            g_VKeyDownSet.push_back(pointerId);
435c29fa5a6Sopenharmony_ci        }
436c29fa5a6Sopenharmony_ci    }
437c29fa5a6Sopenharmony_ci    const int32_t totalFingerNum = 8;
438c29fa5a6Sopenharmony_ci    return g_VKeyDownSet.size() == totalFingerNum;
439c29fa5a6Sopenharmony_ci}
440c29fa5a6Sopenharmony_ci
441c29fa5a6Sopenharmony_civoid HandleKeyActionHelper(int32_t action, int32_t keyCode, OHOS::MMI::KeyEvent::KeyItem &item)
442c29fa5a6Sopenharmony_ci{
443c29fa5a6Sopenharmony_ci    if (action == OHOS::MMI::KeyEvent::KEY_ACTION_DOWN) {
444c29fa5a6Sopenharmony_ci        g_VKeySharedKeyEvent->AddPressedKeyItems(item);
445c29fa5a6Sopenharmony_ci    }
446c29fa5a6Sopenharmony_ci    if (action == OHOS::MMI::KeyEvent::KEY_ACTION_UP) {
447c29fa5a6Sopenharmony_ci        std::optional<OHOS::MMI::KeyEvent::KeyItem> pressedKeyItem = g_VKeySharedKeyEvent->GetKeyItem(keyCode);
448c29fa5a6Sopenharmony_ci        if (pressedKeyItem) {
449c29fa5a6Sopenharmony_ci            item.SetDownTime(pressedKeyItem->GetDownTime());
450c29fa5a6Sopenharmony_ci        } else {
451c29fa5a6Sopenharmony_ci            MMI_HILOGW("VKeyboard find pressed key failed");
452c29fa5a6Sopenharmony_ci        }
453c29fa5a6Sopenharmony_ci        g_VKeySharedKeyEvent->RemoveReleasedKeyItems(item);
454c29fa5a6Sopenharmony_ci        g_VKeySharedKeyEvent->AddPressedKeyItems(item);
455c29fa5a6Sopenharmony_ci    }
456c29fa5a6Sopenharmony_ci}
457c29fa5a6Sopenharmony_ci
458c29fa5a6Sopenharmony_ci// Ref: oh_input_manager.
459c29fa5a6Sopenharmony_ci// Receive: action and keyCode.
460c29fa5a6Sopenharmony_ci// send out modified global g_VKeySharedKeyEvent to the event normalizer.
461c29fa5a6Sopenharmony_ciint32_t HandleKeyInjectEventHelper(std::shared_ptr<EventNormalizeHandler> eventNormalizeHandler,
462c29fa5a6Sopenharmony_ci    int32_t action, int32_t keyCode)
463c29fa5a6Sopenharmony_ci{
464c29fa5a6Sopenharmony_ci    MMI_HILOGI("VKeyboard HandleKeyInjectEventHelper, injectEvent");
465c29fa5a6Sopenharmony_ci    if (keyCode < 0) {
466c29fa5a6Sopenharmony_ci        MMI_HILOGE("VKeyboard keyCode is less 0, can not process");
467c29fa5a6Sopenharmony_ci        return COMMON_PARAMETER_ERROR;
468c29fa5a6Sopenharmony_ci    }
469c29fa5a6Sopenharmony_ci    CHKPR(g_VKeySharedKeyEvent, ERROR_NULL_POINTER);
470c29fa5a6Sopenharmony_ci    g_VKeySharedKeyEvent->ClearFlag();
471c29fa5a6Sopenharmony_ci    if (g_VKeySharedKeyEvent->GetAction() == OHOS::MMI::KeyEvent::KEY_ACTION_UP) {
472c29fa5a6Sopenharmony_ci        std::optional<OHOS::MMI::KeyEvent::KeyItem> preUpKeyItem = g_VKeySharedKeyEvent->GetKeyItem();
473c29fa5a6Sopenharmony_ci        if (preUpKeyItem) {
474c29fa5a6Sopenharmony_ci            g_VKeySharedKeyEvent->RemoveReleasedKeyItems(*preUpKeyItem);
475c29fa5a6Sopenharmony_ci        } else {
476c29fa5a6Sopenharmony_ci            MMI_HILOGE("VKeyboard the preUpKeyItem is nullopt");
477c29fa5a6Sopenharmony_ci        }
478c29fa5a6Sopenharmony_ci    }
479c29fa5a6Sopenharmony_ci    int64_t time = OHOS::MMI::GetSysClockTime();
480c29fa5a6Sopenharmony_ci    g_VKeySharedKeyEvent->SetActionTime(time);
481c29fa5a6Sopenharmony_ci    g_VKeySharedKeyEvent->SetRepeat(true);
482c29fa5a6Sopenharmony_ci    g_VKeySharedKeyEvent->SetKeyCode(keyCode);
483c29fa5a6Sopenharmony_ci    bool isKeyPressed = false;
484c29fa5a6Sopenharmony_ci    if (action == OHOS::MMI::KeyEvent::KEY_ACTION_DOWN) {
485c29fa5a6Sopenharmony_ci        g_VKeySharedKeyEvent->SetAction(OHOS::MMI::KeyEvent::KEY_ACTION_DOWN);
486c29fa5a6Sopenharmony_ci        g_VKeySharedKeyEvent->SetKeyAction(OHOS::MMI::KeyEvent::KEY_ACTION_DOWN);
487c29fa5a6Sopenharmony_ci        isKeyPressed = true;
488c29fa5a6Sopenharmony_ci    } else if (action == OHOS::MMI::KeyEvent::KEY_ACTION_UP) {
489c29fa5a6Sopenharmony_ci        g_VKeySharedKeyEvent->SetAction(OHOS::MMI::KeyEvent::KEY_ACTION_UP);
490c29fa5a6Sopenharmony_ci        g_VKeySharedKeyEvent->SetKeyAction(OHOS::MMI::KeyEvent::KEY_ACTION_UP);
491c29fa5a6Sopenharmony_ci        isKeyPressed = false;
492c29fa5a6Sopenharmony_ci    }
493c29fa5a6Sopenharmony_ci    OHOS::MMI::KeyEvent::KeyItem item;
494c29fa5a6Sopenharmony_ci    item.SetDownTime(time);
495c29fa5a6Sopenharmony_ci    item.SetKeyCode(keyCode);
496c29fa5a6Sopenharmony_ci    item.SetPressed(isKeyPressed);
497c29fa5a6Sopenharmony_ci    HandleKeyActionHelper(action, keyCode, item);
498c29fa5a6Sopenharmony_ci    g_VKeySharedKeyEvent->AddFlag(OHOS::MMI::InputEvent::EVENT_FLAG_SIMULATE);
499c29fa5a6Sopenharmony_ci
500c29fa5a6Sopenharmony_ci    eventNormalizeHandler->HandleKeyEvent(g_VKeySharedKeyEvent);
501c29fa5a6Sopenharmony_ci    return RET_OK;
502c29fa5a6Sopenharmony_ci}
503c29fa5a6Sopenharmony_ci
504c29fa5a6Sopenharmony_ci// @brief Send out combination key press.
505c29fa5a6Sopenharmony_ci// Note that toggleBtn may contain more than one modifiers, like Ctrl+Shift.
506c29fa5a6Sopenharmony_ciint32_t SendCombinationKeyPress(std::vector<int32_t>& toggleKeyCodes, int32_t triggerKeyCode)
507c29fa5a6Sopenharmony_ci{
508c29fa5a6Sopenharmony_ci    std::shared_ptr<EventNormalizeHandler> eventNormalizeHandler = InputHandler->GetEventNormalizeHandler();
509c29fa5a6Sopenharmony_ci    CHKPR(eventNormalizeHandler, ERROR_NULL_POINTER);
510c29fa5a6Sopenharmony_ci    // Trigger all modifier(s), if not done already.
511c29fa5a6Sopenharmony_ci    for (auto& toggleCode: toggleKeyCodes) {
512c29fa5a6Sopenharmony_ci        if (g_VKeyModifiersDownSet.count(toggleCode) == 0) {
513c29fa5a6Sopenharmony_ci            // Not exist, then trigger the modifier.
514c29fa5a6Sopenharmony_ci            HandleKeyInjectEventHelper(eventNormalizeHandler, OHOS::MMI::KeyEvent::KEY_ACTION_DOWN,
515c29fa5a6Sopenharmony_ci                toggleCode);
516c29fa5a6Sopenharmony_ci            g_VKeyModifiersDownSet.insert(toggleCode);
517c29fa5a6Sopenharmony_ci        }
518c29fa5a6Sopenharmony_ci    }
519c29fa5a6Sopenharmony_ci    // Trigger key.
520c29fa5a6Sopenharmony_ci    HandleKeyInjectEventHelper(eventNormalizeHandler, OHOS::MMI::KeyEvent::KEY_ACTION_DOWN,
521c29fa5a6Sopenharmony_ci        triggerKeyCode);
522c29fa5a6Sopenharmony_ci    // Release key.
523c29fa5a6Sopenharmony_ci    HandleKeyInjectEventHelper(eventNormalizeHandler, OHOS::MMI::KeyEvent::KEY_ACTION_UP,
524c29fa5a6Sopenharmony_ci        triggerKeyCode);
525c29fa5a6Sopenharmony_ci    return RET_OK;
526c29fa5a6Sopenharmony_ci}
527c29fa5a6Sopenharmony_ci
528c29fa5a6Sopenharmony_ci// @brief Release (remove from key event handler) and reset visual state on UI.
529c29fa5a6Sopenharmony_ciint32_t SendKeyRelease(int32_t keyCode)
530c29fa5a6Sopenharmony_ci{
531c29fa5a6Sopenharmony_ci    std::shared_ptr<EventNormalizeHandler> eventNormalizeHandler = InputHandler->GetEventNormalizeHandler();
532c29fa5a6Sopenharmony_ci    CHKPR(eventNormalizeHandler, ERROR_NULL_POINTER);
533c29fa5a6Sopenharmony_ci    // Release key.
534c29fa5a6Sopenharmony_ci    HandleKeyInjectEventHelper(eventNormalizeHandler, OHOS::MMI::KeyEvent::KEY_ACTION_UP,
535c29fa5a6Sopenharmony_ci        keyCode);
536c29fa5a6Sopenharmony_ci    g_VKeyModifiersDownSet.erase(keyCode);
537c29fa5a6Sopenharmony_ci    return RET_OK;
538c29fa5a6Sopenharmony_ci}
539c29fa5a6Sopenharmony_ci
540c29fa5a6Sopenharmony_ci// @brief Print (inject key code) and reset visual state on UI.
541c29fa5a6Sopenharmony_ciint32_t SendKeyPress(int32_t keyCode)
542c29fa5a6Sopenharmony_ci{
543c29fa5a6Sopenharmony_ci    std::shared_ptr<EventNormalizeHandler> eventNormalizeHandler = InputHandler->GetEventNormalizeHandler();
544c29fa5a6Sopenharmony_ci    CHKPR(eventNormalizeHandler, ERROR_NULL_POINTER);
545c29fa5a6Sopenharmony_ci    // Trigger key.
546c29fa5a6Sopenharmony_ci    HandleKeyInjectEventHelper(eventNormalizeHandler, OHOS::MMI::KeyEvent::KEY_ACTION_DOWN,
547c29fa5a6Sopenharmony_ci        keyCode);
548c29fa5a6Sopenharmony_ci    // Release key.
549c29fa5a6Sopenharmony_ci    HandleKeyInjectEventHelper(eventNormalizeHandler, OHOS::MMI::KeyEvent::KEY_ACTION_UP,
550c29fa5a6Sopenharmony_ci        keyCode);
551c29fa5a6Sopenharmony_ci    g_VKeyModifiersDownSet.erase(keyCode);
552c29fa5a6Sopenharmony_ci    return RET_OK;
553c29fa5a6Sopenharmony_ci}
554c29fa5a6Sopenharmony_ci
555c29fa5a6Sopenharmony_ci// @brief Only toggle visual state on UI without changing key event handler.
556c29fa5a6Sopenharmony_ciint32_t ToggleKeyVisualState(std::string& keyName, int32_t keyCode, bool visualPressed)
557c29fa5a6Sopenharmony_ci{
558c29fa5a6Sopenharmony_ci    std::shared_ptr<EventNormalizeHandler> eventNormalizeHandler = InputHandler->GetEventNormalizeHandler();
559c29fa5a6Sopenharmony_ci    CHKPR(eventNormalizeHandler, ERROR_NULL_POINTER);
560c29fa5a6Sopenharmony_ci    g_VKeySharedUIKeyEvent->SetKeyAction(KeyEvent::KEY_ACTION_UNKNOWN);
561c29fa5a6Sopenharmony_ci    // If this shared event's previous action is up, it means
562c29fa5a6Sopenharmony_ci    // there is a key up event left in the pressed seq. remove it now.
563c29fa5a6Sopenharmony_ci    if (g_VKeySharedUIKeyEvent->GetVKeyboardAction() == KeyEvent::VKeyboardAction::VKEY_UP) {
564c29fa5a6Sopenharmony_ci        std::optional<OHOS::MMI::KeyEvent::KeyItem> preUpKeyItem = g_VKeySharedUIKeyEvent->GetKeyItem();
565c29fa5a6Sopenharmony_ci        if (preUpKeyItem) {
566c29fa5a6Sopenharmony_ci            g_VKeySharedUIKeyEvent->RemoveReleasedKeyItems(*preUpKeyItem);
567c29fa5a6Sopenharmony_ci        } else {
568c29fa5a6Sopenharmony_ci            MMI_HILOGE("VKeyboard the preUpKeyItem is nullopt");
569c29fa5a6Sopenharmony_ci        }
570c29fa5a6Sopenharmony_ci    }
571c29fa5a6Sopenharmony_ci    int64_t time = OHOS::MMI::GetSysClockTime();
572c29fa5a6Sopenharmony_ci    g_VKeySharedUIKeyEvent->SetActionTime(time);
573c29fa5a6Sopenharmony_ci
574c29fa5a6Sopenharmony_ci    KeyEvent::KeyItem keyItem;
575c29fa5a6Sopenharmony_ci    keyItem.SetDownTime(time);
576c29fa5a6Sopenharmony_ci    keyItem.SetKeyCode(keyCode);
577c29fa5a6Sopenharmony_ci    keyItem.SetPressed(visualPressed);
578c29fa5a6Sopenharmony_ci
579c29fa5a6Sopenharmony_ci    g_VKeySharedUIKeyEvent->SetKeyCode(keyCode);
580c29fa5a6Sopenharmony_ci    g_VKeySharedUIKeyEvent->SetKeyName(keyName);
581c29fa5a6Sopenharmony_ci
582c29fa5a6Sopenharmony_ci    if (visualPressed) {
583c29fa5a6Sopenharmony_ci        g_VKeySharedUIKeyEvent->SetVKeyboardAction(KeyEvent::VKeyboardAction::VKEY_DOWN);
584c29fa5a6Sopenharmony_ci        g_VKeySharedUIKeyEvent->AddPressedKeyItems(keyItem);
585c29fa5a6Sopenharmony_ci    } else {
586c29fa5a6Sopenharmony_ci        g_VKeySharedUIKeyEvent->SetVKeyboardAction(KeyEvent::VKeyboardAction::VKEY_UP);
587c29fa5a6Sopenharmony_ci        // Get the correct down time from pressed keys (when it is down)
588c29fa5a6Sopenharmony_ci        std::optional<OHOS::MMI::KeyEvent::KeyItem> pressedKeyItem = g_VKeySharedUIKeyEvent->GetKeyItem(keyCode);
589c29fa5a6Sopenharmony_ci        if (pressedKeyItem) {
590c29fa5a6Sopenharmony_ci            keyItem.SetDownTime(pressedKeyItem->GetDownTime());
591c29fa5a6Sopenharmony_ci        } else {
592c29fa5a6Sopenharmony_ci            MMI_HILOGW("VKeyboard find pressed key failed");
593c29fa5a6Sopenharmony_ci        }
594c29fa5a6Sopenharmony_ci        // Remove the old ones (down key item) and add the new one (up key item)
595c29fa5a6Sopenharmony_ci        g_VKeySharedUIKeyEvent->RemoveReleasedKeyItems(keyItem);
596c29fa5a6Sopenharmony_ci        g_VKeySharedUIKeyEvent->AddPressedKeyItems(keyItem);
597c29fa5a6Sopenharmony_ci    }
598c29fa5a6Sopenharmony_ci    eventNormalizeHandler->HandleKeyEvent(g_VKeySharedUIKeyEvent);
599c29fa5a6Sopenharmony_ci    return RET_OK;
600c29fa5a6Sopenharmony_ci}
601c29fa5a6Sopenharmony_ci
602c29fa5a6Sopenharmony_ci// Use temporary events for vk-UI related communications.
603c29fa5a6Sopenharmony_ciint32_t SendKeyboardAction(KeyEvent::VKeyboardAction action)
604c29fa5a6Sopenharmony_ci{
605c29fa5a6Sopenharmony_ci    std::shared_ptr<EventNormalizeHandler> eventNormalizeHandler = InputHandler->GetEventNormalizeHandler();
606c29fa5a6Sopenharmony_ci    CHKPR(eventNormalizeHandler, ERROR_NULL_POINTER);
607c29fa5a6Sopenharmony_ci    std::shared_ptr<KeyEvent> keyEvent = KeyEvent::Create();
608c29fa5a6Sopenharmony_ci    CHKPR(keyEvent, ERROR_NULL_POINTER);
609c29fa5a6Sopenharmony_ci    int32_t keyEventId = 1234;
610c29fa5a6Sopenharmony_ci    int32_t keyEventDeviceId = 99;
611c29fa5a6Sopenharmony_ci    keyEvent->SetId(keyEventId);
612c29fa5a6Sopenharmony_ci    keyEvent->SetDeviceId(keyEventDeviceId);
613c29fa5a6Sopenharmony_ci    keyEvent->SetKeyAction(KeyEvent::KEY_ACTION_UNKNOWN);
614c29fa5a6Sopenharmony_ci    keyEvent->SetVKeyboardAction(action);
615c29fa5a6Sopenharmony_ci    KeyEvent::KeyItem keyItem;
616c29fa5a6Sopenharmony_ci    keyEvent->AddKeyItem(keyItem);
617c29fa5a6Sopenharmony_ci    eventNormalizeHandler->HandleKeyEvent(keyEvent);
618c29fa5a6Sopenharmony_ci    return RET_OK;
619c29fa5a6Sopenharmony_ci}
620c29fa5a6Sopenharmony_ci
621c29fa5a6Sopenharmony_ciint32_t PointerEventHandler(std::shared_ptr<PointerEvent> pointerEvent)
622c29fa5a6Sopenharmony_ci{
623c29fa5a6Sopenharmony_ci    int32_t pointerAction = pointerEvent->GetPointerAction();
624c29fa5a6Sopenharmony_ci    if (pointerAction != MMI::PointerEvent::POINTER_ACTION_UP &&
625c29fa5a6Sopenharmony_ci        pointerAction != MMI::PointerEvent::POINTER_ACTION_DOWN &&
626c29fa5a6Sopenharmony_ci        pointerAction != MMI::PointerEvent::POINTER_ACTION_MOVE) {
627c29fa5a6Sopenharmony_ci        return 0;
628c29fa5a6Sopenharmony_ci    }
629c29fa5a6Sopenharmony_ci    // Set touch point
630c29fa5a6Sopenharmony_ci    int32_t pointerId = pointerEvent->GetPointerId();
631c29fa5a6Sopenharmony_ci    PointerEvent::PointerItem pointerItem;
632c29fa5a6Sopenharmony_ci    if (!pointerEvent->GetPointerItem(pointerId, pointerItem)) {
633c29fa5a6Sopenharmony_ci        MMI_HILOGE("VKeyboard can't find pointer item");
634c29fa5a6Sopenharmony_ci        return RET_ERR;
635c29fa5a6Sopenharmony_ci    }
636c29fa5a6Sopenharmony_ci    // Note: make sure this logic happens before the range-checking logic.
637c29fa5a6Sopenharmony_ci    // Check if pointer action is not POINTER_ACTION_MOVE and 8 fingers down
638c29fa5a6Sopenharmony_ci    if (pointerAction != MMI::PointerEvent::POINTER_ACTION_MOVE && IsEightFingersDown(pointerId, pointerAction)) {
639c29fa5a6Sopenharmony_ci        SendKeyboardAction(KeyEvent::VKeyboardAction::ACTIVATE_KEYBOARD);
640c29fa5a6Sopenharmony_ci        return RET_OK;
641c29fa5a6Sopenharmony_ci    }
642c29fa5a6Sopenharmony_ci    double physicalX = pointerItem.GetDisplayXPos();
643c29fa5a6Sopenharmony_ci    double physicalY = pointerItem.GetDisplayYPos();
644c29fa5a6Sopenharmony_ci    // Note:
645c29fa5a6Sopenharmony_ci    // for delete gestures, it must begin from the backspace key, but stops when the finger moves out of range.
646c29fa5a6Sopenharmony_ci    // for pinch gestures, we allow out-of-range gestures (e.g., for floating -> full,
647c29fa5a6Sopenharmony_ci    // it's okay if the fingers are moving out of the boundary during the gestures since the kbd is very small)
648c29fa5a6Sopenharmony_ci    bool insideVKeyboardArea = gaussiankeyboard_isInsideVKeyboardArea_(physicalX, physicalY);
649c29fa5a6Sopenharmony_ci    bool isVkeyboardVisible = gaussiankeyboard_isVKeyboardVisible_();
650c29fa5a6Sopenharmony_ci    bool isTouchInVKeyboard = algorithm_isKeyDownInKeyboard_(pointerId);
651c29fa5a6Sopenharmony_ci    // Note: during layout switch, it's possible that a continuous movement
652c29fa5a6Sopenharmony_ci    // happens outside of keyboard (e.g., keyboard already switched)
653c29fa5a6Sopenharmony_ci    // or happens when kbd is not visible (e.g., when the prev layout dismissed but new one hasn't shown yet).
654c29fa5a6Sopenharmony_ci    // if (!isTouchInVKeyboard && (!isVkeyboardVisible || (!insideVKeyboardArea && !insideVTrackpadArea)))
655c29fa5a6Sopenharmony_ci    if (!isTouchInVKeyboard && (!isVkeyboardVisible || !insideVKeyboardArea)) {
656c29fa5a6Sopenharmony_ci        // no unhanded touch points AND (kbd not visible) OR (kbd visible and out of range).
657c29fa5a6Sopenharmony_ci        // i.e., we still want to process the touch move outside of
658c29fa5a6Sopenharmony_ci        // kbd range if at least one point is already on the kbd.
659c29fa5a6Sopenharmony_ci        return RET_OK;
660c29fa5a6Sopenharmony_ci    }
661c29fa5a6Sopenharmony_ci
662c29fa5a6Sopenharmony_ci    TOUCHPOINT tp;
663c29fa5a6Sopenharmony_ci    tp.InKeyboard = insideVKeyboardArea;
664c29fa5a6Sopenharmony_ci    // When track pad is integrated the tp should be set as tp.InTrackpad = insideVTrackPadArea;
665c29fa5a6Sopenharmony_ci    tp.ScreenX = physicalX;
666c29fa5a6Sopenharmony_ci    tp.ScreenY = physicalY;
667c29fa5a6Sopenharmony_ci    tp.TouchId = pointerId;
668c29fa5a6Sopenharmony_ci    // Note: Down & Move treated as down.
669c29fa5a6Sopenharmony_ci    tp.TipDown = (pointerAction != MMI::PointerEvent::POINTER_ACTION_UP);
670c29fa5a6Sopenharmony_ci
671c29fa5a6Sopenharmony_ci    std::vector<pair<string, double>> sortedNegLogProb;
672c29fa5a6Sopenharmony_ci    string buttonName = "";
673c29fa5a6Sopenharmony_ci    // Note: only Down will update dynamic gaussian.
674c29fa5a6Sopenharmony_ci    bool updateDynamicGaussian = (pointerAction == MMI::PointerEvent::POINTER_ACTION_DOWN);
675c29fa5a6Sopenharmony_ci
676c29fa5a6Sopenharmony_ci    // NOTE: we don't run MapTouchToButton for all touchpoints -- only if the touchpoints fall within the kbd range.
677c29fa5a6Sopenharmony_ci    // for out-of-range points, we still continue to process potential out-of-range
678c29fa5a6Sopenharmony_ci    // gestures (e.g., fingers move out of range during pinch or move up/down gesture)
679c29fa5a6Sopenharmony_ci    // in such case, isTouchInVKeyboard == true means it origins from inside kbd so a cache has been found.
680c29fa5a6Sopenharmony_ci    if (insideVKeyboardArea || isTouchInVKeyboard) {
681c29fa5a6Sopenharmony_ci        // Need to add valid time here.
682c29fa5a6Sopenharmony_ci        bayesianengine_mapTouchToButton_(tp.ScreenX, tp.ScreenY, tp.TouchId, tp.TipDown, buttonName,
683c29fa5a6Sopenharmony_ci            0, updateDynamicGaussian, sortedNegLogProb);
684c29fa5a6Sopenharmony_ci        tp.ButtonName = buttonName;
685c29fa5a6Sopenharmony_ci        if (!tp.ButtonName.empty()) {
686c29fa5a6Sopenharmony_ci            MMI_HILOGI("VKeyboard touch name %{private}s", buttonName.c_str());
687c29fa5a6Sopenharmony_ci        } else {
688c29fa5a6Sopenharmony_ci            MMI_HILOGE("VKeyboard button name null");
689c29fa5a6Sopenharmony_ci            return RET_ERR;
690c29fa5a6Sopenharmony_ci        }
691c29fa5a6Sopenharmony_ci    }
692c29fa5a6Sopenharmony_ci    if (pointerAction == MMI::PointerEvent::POINTER_ACTION_DOWN) {
693c29fa5a6Sopenharmony_ci        algorithm_keydown_(tp.ScreenX, tp.ScreenY, tp.TouchId, tp.TipDown, tp.ButtonName);
694c29fa5a6Sopenharmony_ci        if (insideVKeyboardArea) {
695c29fa5a6Sopenharmony_ci            int32_t keyCode = gaussiankeyboard_getKeyCodeByKeyName_(buttonName);
696c29fa5a6Sopenharmony_ci            if (keyCode >= 0) {
697c29fa5a6Sopenharmony_ci                ToggleKeyVisualState(buttonName, keyCode, true);
698c29fa5a6Sopenharmony_ci            } else {
699c29fa5a6Sopenharmony_ci                MMI_HILOGW("VKeyboard PointerEventHandler, key code not found for %{private}s", buttonName.c_str());
700c29fa5a6Sopenharmony_ci            }
701c29fa5a6Sopenharmony_ci        }
702c29fa5a6Sopenharmony_ci    } else if (pointerAction == MMI::PointerEvent::POINTER_ACTION_UP) {
703c29fa5a6Sopenharmony_ci        algorithm_keyup_(tp.ScreenX, tp.ScreenY, tp.TouchId, tp.TipDown, tp.ButtonName);
704c29fa5a6Sopenharmony_ci        int32_t keyCode = gaussiankeyboard_getKeyCodeByKeyName_(buttonName);
705c29fa5a6Sopenharmony_ci        if (keyCode >= 0) {
706c29fa5a6Sopenharmony_ci            SendKeyRelease(keyCode);
707c29fa5a6Sopenharmony_ci            ToggleKeyVisualState(buttonName, keyCode, false);
708c29fa5a6Sopenharmony_ci        } else {
709c29fa5a6Sopenharmony_ci            MMI_HILOGW("VKeyboard PointerEventHandler, key code not found for %{private}s", buttonName.c_str());
710c29fa5a6Sopenharmony_ci        }
711c29fa5a6Sopenharmony_ci    } else {
712c29fa5a6Sopenharmony_ci        // New touch move logic: turn to touch down to support gestures.
713c29fa5a6Sopenharmony_ci        algorithm_keydown_(tp.ScreenX, tp.ScreenY, tp.TouchId, tp.TipDown, tp.ButtonName);
714c29fa5a6Sopenharmony_ci    }
715c29fa5a6Sopenharmony_ci
716c29fa5a6Sopenharmony_ci    std::vector<int32_t> toggleKeyCodes;
717c29fa5a6Sopenharmony_ci
718c29fa5a6Sopenharmony_ci    while (true) {
719c29fa5a6Sopenharmony_ci        string buttonName;
720c29fa5a6Sopenharmony_ci        string toggleButtonName;
721c29fa5a6Sopenharmony_ci        int buttonMode;
722c29fa5a6Sopenharmony_ci        string restList;
723c29fa5a6Sopenharmony_ci        StateMachineMessageType type = (StateMachineMessageType)statemachineMessageQueue_getMessage_(
724c29fa5a6Sopenharmony_ci            buttonName, toggleButtonName, buttonMode, restList);
725c29fa5a6Sopenharmony_ci        if (type == StateMachineMessageType::NoMessage) {
726c29fa5a6Sopenharmony_ci            break;
727c29fa5a6Sopenharmony_ci        }
728c29fa5a6Sopenharmony_ci        switch (type) {
729c29fa5a6Sopenharmony_ci            case StateMachineMessageType::KeyPressed: {
730c29fa5a6Sopenharmony_ci                // See if this key can be directly printed or not.
731c29fa5a6Sopenharmony_ci                bool useShift = false;
732c29fa5a6Sopenharmony_ci                int32_t code = gaussiankeyboard_getKeyCodeByKeyNameAndShift_(buttonName, useShift);
733c29fa5a6Sopenharmony_ci                if (code >= 0) {
734c29fa5a6Sopenharmony_ci                    if (!useShift) {
735c29fa5a6Sopenharmony_ci                        SendKeyPress(code);
736c29fa5a6Sopenharmony_ci                    } else {
737c29fa5a6Sopenharmony_ci                        toggleKeyCodes.clear();
738c29fa5a6Sopenharmony_ci                        toggleKeyCodes.push_back(KeyEvent::KEYCODE_SHIFT_LEFT);
739c29fa5a6Sopenharmony_ci                        SendCombinationKeyPress(toggleKeyCodes, code);
740c29fa5a6Sopenharmony_ci                        // If this key is triggered with use shift ON, then it shall be resumed after use.
741c29fa5a6Sopenharmony_ci                        SendKeyRelease(KeyEvent::KEYCODE_SHIFT_LEFT);
742c29fa5a6Sopenharmony_ci                    }
743c29fa5a6Sopenharmony_ci                } else {
744c29fa5a6Sopenharmony_ci                    MMI_HILOGW("VKeyboard key code not found.");
745c29fa5a6Sopenharmony_ci                }
746c29fa5a6Sopenharmony_ci                break;
747c29fa5a6Sopenharmony_ci            }
748c29fa5a6Sopenharmony_ci            case StateMachineMessageType::ButtonSound: {
749c29fa5a6Sopenharmony_ci                break;
750c29fa5a6Sopenharmony_ci            }
751c29fa5a6Sopenharmony_ci            case StateMachineMessageType::ResetButtonColor: {
752c29fa5a6Sopenharmony_ci                SendKeyboardAction(KeyEvent::VKeyboardAction::RESET_BUTTON_COLOR);
753c29fa5a6Sopenharmony_ci                break;
754c29fa5a6Sopenharmony_ci            }
755c29fa5a6Sopenharmony_ci            case StateMachineMessageType::CombinationKeyPressed: {
756c29fa5a6Sopenharmony_ci                toggleKeyCodes.clear();
757c29fa5a6Sopenharmony_ci                std::string remainStr = toggleButtonName;
758c29fa5a6Sopenharmony_ci                int32_t toggleCode(-1), triggerCode(-1);
759c29fa5a6Sopenharmony_ci                while (remainStr.find(';') != std::string::npos) {
760c29fa5a6Sopenharmony_ci                    // still has more than one
761c29fa5a6Sopenharmony_ci                    size_t pos = remainStr.find(';');
762c29fa5a6Sopenharmony_ci                    toggleCode = gaussiankeyboard_getKeyCodeByKeyName_(remainStr.substr(0, pos));
763c29fa5a6Sopenharmony_ci                    if (toggleCode >= 0) {
764c29fa5a6Sopenharmony_ci                        toggleKeyCodes.push_back(toggleCode);
765c29fa5a6Sopenharmony_ci                    }
766c29fa5a6Sopenharmony_ci                    remainStr = remainStr.substr(pos + 1);
767c29fa5a6Sopenharmony_ci                }
768c29fa5a6Sopenharmony_ci                // Add the last piece.
769c29fa5a6Sopenharmony_ci                toggleCode = gaussiankeyboard_getKeyCodeByKeyName_(remainStr);
770c29fa5a6Sopenharmony_ci                if (toggleCode >= 0) {
771c29fa5a6Sopenharmony_ci                    toggleKeyCodes.push_back(toggleCode);
772c29fa5a6Sopenharmony_ci                }
773c29fa5a6Sopenharmony_ci                // Trigger code:
774c29fa5a6Sopenharmony_ci                triggerCode = gaussiankeyboard_getKeyCodeByKeyName_(buttonName);
775c29fa5a6Sopenharmony_ci                if (toggleKeyCodes.size() > 0 && triggerCode >= 0) {
776c29fa5a6Sopenharmony_ci                    // valid toggle key code(s) and trigger key code
777c29fa5a6Sopenharmony_ci                    SendCombinationKeyPress(toggleKeyCodes, triggerCode);
778c29fa5a6Sopenharmony_ci                } else {
779c29fa5a6Sopenharmony_ci                    MMI_HILOGW("VKeyboard combination keycodes not found for %{private}s + %{private}s",
780c29fa5a6Sopenharmony_ci                        toggleButtonName.c_str(), buttonName.c_str());
781c29fa5a6Sopenharmony_ci                }
782c29fa5a6Sopenharmony_ci                break;
783c29fa5a6Sopenharmony_ci            }
784c29fa5a6Sopenharmony_ci            case StateMachineMessageType::BackSwipeLeft: {
785c29fa5a6Sopenharmony_ci                // Send Shift+Left.
786c29fa5a6Sopenharmony_ci                toggleKeyCodes.clear();
787c29fa5a6Sopenharmony_ci                toggleKeyCodes.push_back(KeyEvent::KEYCODE_SHIFT_LEFT);
788c29fa5a6Sopenharmony_ci                SendCombinationKeyPress(toggleKeyCodes, KeyEvent::KEYCODE_DPAD_LEFT);
789c29fa5a6Sopenharmony_ci                break;
790c29fa5a6Sopenharmony_ci            }
791c29fa5a6Sopenharmony_ci            case StateMachineMessageType::BackSwipeRight: {
792c29fa5a6Sopenharmony_ci                // Send Shift+Right
793c29fa5a6Sopenharmony_ci                toggleKeyCodes.clear();
794c29fa5a6Sopenharmony_ci                toggleKeyCodes.push_back(KeyEvent::KEYCODE_SHIFT_LEFT);
795c29fa5a6Sopenharmony_ci                SendCombinationKeyPress(toggleKeyCodes, KeyEvent::KEYCODE_DPAD_RIGHT);
796c29fa5a6Sopenharmony_ci                break;
797c29fa5a6Sopenharmony_ci            }
798c29fa5a6Sopenharmony_ci            case StateMachineMessageType::BackspaceSwipeRelease: {
799c29fa5a6Sopenharmony_ci                SendKeyRelease(KeyEvent::KEYCODE_SHIFT_LEFT);
800c29fa5a6Sopenharmony_ci                int swipeCharCounter(buttonMode);
801c29fa5a6Sopenharmony_ci                if (swipeCharCounter < 0) {
802c29fa5a6Sopenharmony_ci                    // Backspace character
803c29fa5a6Sopenharmony_ci                    SendKeyPress(KeyEvent::KEYCODE_DEL);
804c29fa5a6Sopenharmony_ci                } else if (swipeCharCounter > 0) {
805c29fa5a6Sopenharmony_ci                    // del character. (note: actually there is no difference when the text is selected)
806c29fa5a6Sopenharmony_ci                    SendKeyPress(KeyEvent::KEYCODE_FORWARD_DEL);
807c29fa5a6Sopenharmony_ci                } else {
808c29fa5a6Sopenharmony_ci                    // No char deleted. just release the shift if it was pressed down before.
809c29fa5a6Sopenharmony_ci                    MMI_HILOGI("VKeyboard SendSwipeDeleteMsg, swipeCharCounter = %{private}d. Release Shift.",
810c29fa5a6Sopenharmony_ci                        swipeCharCounter);
811c29fa5a6Sopenharmony_ci                }
812c29fa5a6Sopenharmony_ci                break;
813c29fa5a6Sopenharmony_ci            }
814c29fa5a6Sopenharmony_ci            case StateMachineMessageType::SwitchLayout: {
815c29fa5a6Sopenharmony_ci                int gestureId = buttonMode;
816c29fa5a6Sopenharmony_ci                auto gestureType = static_cast<VGestureMode>(gestureId);
817c29fa5a6Sopenharmony_ci                // Note: this LayoutAction is used within backend algorithm,
818c29fa5a6Sopenharmony_ci                // which may be different from the protocol with front end (VKeyboardAction)
819c29fa5a6Sopenharmony_ci                switch (gestureType) {
820c29fa5a6Sopenharmony_ci                    case VGestureMode::TWO_HANDS_UP: {
821c29fa5a6Sopenharmony_ci                        MMI_HILOGI("VKeyboard 8-finger move up to enable trackpad (not linked yet).");
822c29fa5a6Sopenharmony_ci                        // If we are sure that only full keyboard is kept, then we no longer need this move up/down gesture.
823c29fa5a6Sopenharmony_ci                        break;
824c29fa5a6Sopenharmony_ci                    }
825c29fa5a6Sopenharmony_ci                    case VGestureMode::TWO_HANDS_DOWN: {
826c29fa5a6Sopenharmony_ci                        MMI_HILOGI("VKeyboard 8-finger move down to disable trackpad (not linked yet).");
827c29fa5a6Sopenharmony_ci                        // If we are sure that only full keyboard is kept, then we no longer need this move up/down gesture.
828c29fa5a6Sopenharmony_ci                        break;
829c29fa5a6Sopenharmony_ci                    }
830c29fa5a6Sopenharmony_ci                    case VGestureMode::TWO_HANDS_INWARDS: {
831c29fa5a6Sopenharmony_ci                        MMI_HILOGI("VKeyboard 2-finger move inwards to switch to floating kbd.");
832c29fa5a6Sopenharmony_ci                        SendKeyboardAction(KeyEvent::VKeyboardAction::TWO_FINGERS_IN);
833c29fa5a6Sopenharmony_ci                        break;
834c29fa5a6Sopenharmony_ci                    }
835c29fa5a6Sopenharmony_ci                    case VGestureMode::TWO_HANDS_OUTWARDS: {
836c29fa5a6Sopenharmony_ci                        MMI_HILOGI("VKeyboard 2-finger move outwards to switch to standard/full kbd.");
837c29fa5a6Sopenharmony_ci                        // Note: if we have both standard and full kdb, then the front
838c29fa5a6Sopenharmony_ci                        // end shall track and resume user's previous choice of layout.
839c29fa5a6Sopenharmony_ci                        SendKeyboardAction(KeyEvent::VKeyboardAction::TWO_FINGERS_OUT);
840c29fa5a6Sopenharmony_ci                        break;
841c29fa5a6Sopenharmony_ci                    }
842c29fa5a6Sopenharmony_ci                    default: {
843c29fa5a6Sopenharmony_ci                        // other gestures not implemented/supported yet.
844c29fa5a6Sopenharmony_ci                        MMI_HILOGW("VKeyboard gesture not implemented or supported, gestureId: %{private}d", gestureId);
845c29fa5a6Sopenharmony_ci                    }
846c29fa5a6Sopenharmony_ci                }
847c29fa5a6Sopenharmony_ci                SendKeyboardAction(KeyEvent::VKeyboardAction::RESET_BUTTON_COLOR);
848c29fa5a6Sopenharmony_ci                break;
849c29fa5a6Sopenharmony_ci            }
850c29fa5a6Sopenharmony_ci            default:
851c29fa5a6Sopenharmony_ci                break;
852c29fa5a6Sopenharmony_ci        }
853c29fa5a6Sopenharmony_ci    }
854c29fa5a6Sopenharmony_ci    return RET_OK;
855c29fa5a6Sopenharmony_ci}
856c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_VKEYBOARD
857c29fa5a6Sopenharmony_ci
858c29fa5a6Sopenharmony_civoid MMIService::OnStart()
859c29fa5a6Sopenharmony_ci{
860c29fa5a6Sopenharmony_ci    CHK_PID_AND_TID();
861c29fa5a6Sopenharmony_ci    int32_t ret = Init();
862c29fa5a6Sopenharmony_ci    CHKNOKRV(ret, "Init mmi_service failed");
863c29fa5a6Sopenharmony_ci    MMI_HILOGD("Started successfully");
864c29fa5a6Sopenharmony_ci    AddReloadDeviceTimer();
865c29fa5a6Sopenharmony_ci    t_ = std::thread([this] {this->OnThread();});
866c29fa5a6Sopenharmony_ci    pthread_setname_np(t_.native_handle(), THREAD_NAME.c_str());
867c29fa5a6Sopenharmony_ci    eventMonitorThread_ = std::thread(&EventStatistic::WriteEventFile);
868c29fa5a6Sopenharmony_ci    pthread_setname_np(eventMonitorThread_.native_handle(), "event-monitor");
869c29fa5a6Sopenharmony_ci#ifdef OHOS_RSS_CLIENT
870c29fa5a6Sopenharmony_ci    MMI_HILOGI("Add system ability listener start");
871c29fa5a6Sopenharmony_ci    AddSystemAbilityListener(RES_SCHED_SYS_ABILITY_ID);
872c29fa5a6Sopenharmony_ci    MMI_HILOGI("Add system ability listener success");
873c29fa5a6Sopenharmony_ci#endif // OHOS_RSS_CLIENT
874c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_FINGERSENSE_WRAPPER) && defined(OHOS_BUILD_ENABLE_KEYBOARD)
875c29fa5a6Sopenharmony_ci    FINGERSENSE_WRAPPER->InitFingerSenseWrapper();
876c29fa5a6Sopenharmony_ci    MMI_HILOGI("Add system ability listener start");
877c29fa5a6Sopenharmony_ci    AddSystemAbilityListener(COMMON_EVENT_SERVICE_ID);
878c29fa5a6Sopenharmony_ci    MMI_HILOGI("Add system ability listener success");
879c29fa5a6Sopenharmony_ci    AddSystemAbilityListener(RENDER_SERVICE);
880c29fa5a6Sopenharmony_ci    DISPLAY_MONITOR->InitCommonEventSubscriber();
881c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_FINGERSENSE_WRAPPER && OHOS_BUILD_ENABLE_KEYBOARD
882c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_GESTURESENSE_WRAPPER
883c29fa5a6Sopenharmony_ci    GESTURESENSE_WRAPPER->InitGestureSenseWrapper();
884c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_GESTURESENSE_WRAPPER
885c29fa5a6Sopenharmony_ci    MMI_HILOGI("Add app manager service listener start");
886c29fa5a6Sopenharmony_ci    AddSystemAbilityListener(APP_MGR_SERVICE_ID);
887c29fa5a6Sopenharmony_ci    APP_OBSERVER_MGR->InitAppStateObserver();
888c29fa5a6Sopenharmony_ci    MMI_HILOGI("Add app manager service listener end");
889c29fa5a6Sopenharmony_ci    AddAppDebugListener();
890c29fa5a6Sopenharmony_ci    AddSystemAbilityListener(DISPLAY_MANAGER_SERVICE_SA_ID);
891c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_ANCO
892c29fa5a6Sopenharmony_ci    InitAncoUds();
893c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_ANCO
894c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_VKEYBOARD
895c29fa5a6Sopenharmony_ci    isHPR_ = PRODUCT_TYPE == DEVICE_TYPE_HPR;
896c29fa5a6Sopenharmony_ci    if (isHPR_) {
897c29fa5a6Sopenharmony_ci        DelegateInterface::HandlerSummary summary = {};
898c29fa5a6Sopenharmony_ci        summary.handlerName = "VKeyboard";
899c29fa5a6Sopenharmony_ci        summary.eventType = HANDLE_EVENT_TYPE_POINTER;
900c29fa5a6Sopenharmony_ci        summary.mode = HandlerMode::SYNC;
901c29fa5a6Sopenharmony_ci        summary.priority = 0;
902c29fa5a6Sopenharmony_ci        summary.deviceTags = 0;
903c29fa5a6Sopenharmony_ci        summary.cb = PointerEventHandler;
904c29fa5a6Sopenharmony_ci        delegateInterface_->AddHandler(InputHandlerType::MONITOR, summary);
905c29fa5a6Sopenharmony_ci
906c29fa5a6Sopenharmony_ci        // Initialize vkeyboard handler
907c29fa5a6Sopenharmony_ci        g_VKeyboardHandle = dlopen(VKEYBOARD_PATH.c_str(), RTLD_NOW);
908c29fa5a6Sopenharmony_ci        if (g_VKeyboardHandle != nullptr) {
909c29fa5a6Sopenharmony_ci            algorithm_keydown_ = (ALGORITHM_KEYDOWN_TYPE)dlsym(g_VKeyboardHandle, "AlgorithmKeyDown");
910c29fa5a6Sopenharmony_ci            algorithm_keyup_ = (ALGORITHM_KEYUP_TYPE)dlsym(g_VKeyboardHandle, "AlgorithmKeyUp");
911c29fa5a6Sopenharmony_ci            gaussiankeyboard_getKeyCodeByKeyName_ = (GAUSSIANKEYBOARD_GETKEYCODEBYKEYNAME_TYPE)dlsym(
912c29fa5a6Sopenharmony_ci                g_VKeyboardHandle, "GaussianKeyboardGetKeyCodeByKeyName");
913c29fa5a6Sopenharmony_ci            gaussiankeyboard_getKeyCodeByKeyNameAndShift_ = (GAUSSIANKEYBOARD_GETKEYCODEBYKEYNAMEANDSHIFT_TYPE)dlsym(
914c29fa5a6Sopenharmony_ci                g_VKeyboardHandle, "GaussianKeyboardGetKeyCodeByKeyNameAndShift");
915c29fa5a6Sopenharmony_ci            gaussiankeyboard_updateMotionSpace_ = (GAUSSIANKEYBOARD_UPDATEMOTIONSPACE_TYPE)dlsym(
916c29fa5a6Sopenharmony_ci                g_VKeyboardHandle, "GaussianKeyboardUpdateMotionSpace");
917c29fa5a6Sopenharmony_ci            gaussiankeyboard_setVKeyboardArea_ = (GAUSSIANKEYBOARD_SETVKEYBOARDAREA_TYPE)dlsym(
918c29fa5a6Sopenharmony_ci                g_VKeyboardHandle, "GaussianKeyboardSetVKeyboardArea");
919c29fa5a6Sopenharmony_ci            bayesianengine_mapTouchToButton_ = (BAYESIANENGINE_MAPTOUCHTOBUTTON_TYPE)dlsym(
920c29fa5a6Sopenharmony_ci                g_VKeyboardHandle, "BayesianEngineMapTouchToButton");
921c29fa5a6Sopenharmony_ci            statemachineMessageQueue_getMessage_ = (STATEMACINEMESSAGQUEUE_GETMESSAGE_TYPE)dlsym(
922c29fa5a6Sopenharmony_ci                g_VKeyboardHandle, "StateMachineMessageQueueGetMessage");
923c29fa5a6Sopenharmony_ci            gaussiankeyboard_isInsideVKeyboardArea_ = (GAUSSIANKEYBOARD_ISINSIDEVKEYBOARDAREA_TYPE)dlsym(
924c29fa5a6Sopenharmony_ci                g_VKeyboardHandle, "GaussianKeyboardIsInsideVKeyboardArea");
925c29fa5a6Sopenharmony_ci            gaussiankeyboard_isVKeyboardVisible_ = (GAUSSIANKEYBOARD_ISVKEYBOARDVISIBLE_TYPE)dlsym(
926c29fa5a6Sopenharmony_ci                g_VKeyboardHandle, "GaussianKeyboardIsVKeyboardVisible");
927c29fa5a6Sopenharmony_ci            algorithm_isKeyDownInKeyboard_ = (ALGORITHM_ISKEYDOWNINKEYBOARD_TYPE)dlsym(
928c29fa5a6Sopenharmony_ci                g_VKeyboardHandle, "AlgorithmIsKeyDownInKeyboard");
929c29fa5a6Sopenharmony_ci        }
930c29fa5a6Sopenharmony_ci    }
931c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_VKEYBOARD
932c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING)
933c29fa5a6Sopenharmony_ci    IPointerDrawingManager::GetInstance()->InitPointerObserver();
934c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING
935c29fa5a6Sopenharmony_ci    InitPreferences();
936c29fa5a6Sopenharmony_ci    TimerMgr->AddTimer(WATCHDOG_INTERVAL_TIME, -1, [this]() {
937c29fa5a6Sopenharmony_ci        MMI_HILOGI("Set thread status flag to true");
938c29fa5a6Sopenharmony_ci        threadStatusFlag_ = true;
939c29fa5a6Sopenharmony_ci    });
940c29fa5a6Sopenharmony_ci    [[ maybe_unused ]] auto taskFunc = [this]() {
941c29fa5a6Sopenharmony_ci        if (threadStatusFlag_) {
942c29fa5a6Sopenharmony_ci            MMI_HILOGI("Set thread status flag to false");
943c29fa5a6Sopenharmony_ci            threadStatusFlag_ = false;
944c29fa5a6Sopenharmony_ci        } else {
945c29fa5a6Sopenharmony_ci            MMI_HILOGI("Mmi-server Timeout");
946c29fa5a6Sopenharmony_ci        }
947c29fa5a6Sopenharmony_ci    };
948c29fa5a6Sopenharmony_ci    MMI_HILOGI("Run periodical task success");
949c29fa5a6Sopenharmony_ci    InitPrintClientInfo();
950c29fa5a6Sopenharmony_ci}
951c29fa5a6Sopenharmony_ci
952c29fa5a6Sopenharmony_civoid MMIService::OnStop()
953c29fa5a6Sopenharmony_ci{
954c29fa5a6Sopenharmony_ci    CHK_PID_AND_TID();
955c29fa5a6Sopenharmony_ci    UdsStop();
956c29fa5a6Sopenharmony_ci    libinputAdapter_.Stop();
957c29fa5a6Sopenharmony_ci    state_ = ServiceRunningState::STATE_NOT_START;
958c29fa5a6Sopenharmony_ci#ifdef OHOS_RSS_CLIENT
959c29fa5a6Sopenharmony_ci    MMI_HILOGI("Remove system ability listener start");
960c29fa5a6Sopenharmony_ci    RemoveSystemAbilityListener(RES_SCHED_SYS_ABILITY_ID);
961c29fa5a6Sopenharmony_ci    MMI_HILOGI("Remove system ability listener success");
962c29fa5a6Sopenharmony_ci#endif // OHOS_RSS_CLIENT
963c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_FINGERSENSE_WRAPPER
964c29fa5a6Sopenharmony_ci    RemoveSystemAbilityListener(COMMON_EVENT_SERVICE_ID);
965c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_FINGERSENSE_WRAPPER
966c29fa5a6Sopenharmony_ci    RemoveSystemAbilityListener(APP_MGR_SERVICE_ID);
967c29fa5a6Sopenharmony_ci    RemoveSystemAbilityListener(RENDER_SERVICE);
968c29fa5a6Sopenharmony_ci    RemoveAppDebugListener();
969c29fa5a6Sopenharmony_ci    RemoveSystemAbilityListener(DISPLAY_MANAGER_SERVICE_SA_ID);
970c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_ANCO
971c29fa5a6Sopenharmony_ci    StopAncoUds();
972c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_ANCO
973c29fa5a6Sopenharmony_ci}
974c29fa5a6Sopenharmony_ci
975c29fa5a6Sopenharmony_civoid MMIService::AddAppDebugListener()
976c29fa5a6Sopenharmony_ci{
977c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
978c29fa5a6Sopenharmony_ci    appDebugListener_ = AppDebugListener::GetInstance();
979c29fa5a6Sopenharmony_ci    auto errCode =
980c29fa5a6Sopenharmony_ci        AAFwk::AbilityManagerClient::GetInstance()->RegisterAppDebugListener(appDebugListener_);
981c29fa5a6Sopenharmony_ci    if (errCode != RET_OK) {
982c29fa5a6Sopenharmony_ci        MMI_HILOGE("Call RegisterAppDebugListener failed, errCode:%{public}d", errCode);
983c29fa5a6Sopenharmony_ci    }
984c29fa5a6Sopenharmony_ci}
985c29fa5a6Sopenharmony_ci
986c29fa5a6Sopenharmony_civoid MMIService::RemoveAppDebugListener()
987c29fa5a6Sopenharmony_ci{
988c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
989c29fa5a6Sopenharmony_ci    CHKPV(appDebugListener_);
990c29fa5a6Sopenharmony_ci    auto errCode =
991c29fa5a6Sopenharmony_ci        AAFwk::AbilityManagerClient::GetInstance()->UnregisterAppDebugListener(appDebugListener_);
992c29fa5a6Sopenharmony_ci    if (errCode != RET_OK) {
993c29fa5a6Sopenharmony_ci        MMI_HILOGE("Call UnregisterAppDebugListener failed, errCode:%{public}d", errCode);
994c29fa5a6Sopenharmony_ci    }
995c29fa5a6Sopenharmony_ci}
996c29fa5a6Sopenharmony_ci
997c29fa5a6Sopenharmony_ciint32_t MMIService::AllocSocketFd(const std::string &programName, const int32_t moduleType, int32_t &toReturnClientFd,
998c29fa5a6Sopenharmony_ci    int32_t &tokenType)
999c29fa5a6Sopenharmony_ci{
1000c29fa5a6Sopenharmony_ci    toReturnClientFd = IMultimodalInputConnect::INVALID_SOCKET_FD;
1001c29fa5a6Sopenharmony_ci    int32_t serverFd = IMultimodalInputConnect::INVALID_SOCKET_FD;
1002c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
1003c29fa5a6Sopenharmony_ci    int32_t uid = GetCallingUid();
1004c29fa5a6Sopenharmony_ci    MMI_HILOGI("Enter, programName:%{public}s, moduleType:%{public}d, pid:%{public}d",
1005c29fa5a6Sopenharmony_ci        programName.c_str(), moduleType, pid);
1006c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1007c29fa5a6Sopenharmony_ci        [this, &programName, moduleType, uid, pid, &serverFd, &toReturnClientFd, &tokenType] {
1008c29fa5a6Sopenharmony_ci            return this->AddSocketPairInfo(programName, moduleType, uid, pid, serverFd, toReturnClientFd, tokenType);
1009c29fa5a6Sopenharmony_ci        }
1010c29fa5a6Sopenharmony_ci        );
1011c29fa5a6Sopenharmony_ci    DfxHisysevent::ClientConnectData data = {
1012c29fa5a6Sopenharmony_ci        .pid = pid,
1013c29fa5a6Sopenharmony_ci        .uid = uid,
1014c29fa5a6Sopenharmony_ci        .moduleType = moduleType,
1015c29fa5a6Sopenharmony_ci        .programName = programName,
1016c29fa5a6Sopenharmony_ci        .serverFd = serverFd
1017c29fa5a6Sopenharmony_ci    };
1018c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1019c29fa5a6Sopenharmony_ci        MMI_HILOGE("Call AddSocketPairInfo failed, return:%{public}d", ret);
1020c29fa5a6Sopenharmony_ci        DfxHisysevent::OnClientConnect(data, OHOS::HiviewDFX::HiSysEvent::EventType::FAULT);
1021c29fa5a6Sopenharmony_ci        return ret;
1022c29fa5a6Sopenharmony_ci    }
1023c29fa5a6Sopenharmony_ci    MMI_HILOGIK("Leave, programName:%{public}s, moduleType:%{public}d, alloc success", programName.c_str(),
1024c29fa5a6Sopenharmony_ci                moduleType);
1025c29fa5a6Sopenharmony_ci    DfxHisysevent::OnClientConnect(data, OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR);
1026c29fa5a6Sopenharmony_ci    return RET_OK;
1027c29fa5a6Sopenharmony_ci}
1028c29fa5a6Sopenharmony_ci
1029c29fa5a6Sopenharmony_ciint32_t MMIService::AddInputEventFilter(sptr<IEventFilter> filter, int32_t filterId, int32_t priority,
1030c29fa5a6Sopenharmony_ci    uint32_t deviceTags)
1031c29fa5a6Sopenharmony_ci{
1032c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1033c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH) || defined(OHOS_BUILD_ENABLE_KEYBOARD)
1034c29fa5a6Sopenharmony_ci    CHKPR(filter, ERROR_NULL_POINTER);
1035c29fa5a6Sopenharmony_ci    int32_t clientPid = GetCallingPid();
1036c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1037c29fa5a6Sopenharmony_ci        [this, filter, filterId, priority, deviceTags, clientPid] {
1038c29fa5a6Sopenharmony_ci            return sMsgHandler_.AddInputEventFilter(filter, filterId, priority, deviceTags, clientPid);
1039c29fa5a6Sopenharmony_ci        }
1040c29fa5a6Sopenharmony_ci        );
1041c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1042c29fa5a6Sopenharmony_ci        MMI_HILOGE("Add event filter failed, return:%{public}d", ret);
1043c29fa5a6Sopenharmony_ci        return ret;
1044c29fa5a6Sopenharmony_ci    }
1045c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH || OHOS_BUILD_ENABLE_KEYBOARD
1046c29fa5a6Sopenharmony_ci    return RET_OK;
1047c29fa5a6Sopenharmony_ci}
1048c29fa5a6Sopenharmony_ci
1049c29fa5a6Sopenharmony_ciint32_t MMIService::RemoveInputEventFilter(int32_t filterId)
1050c29fa5a6Sopenharmony_ci{
1051c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1052c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH) || defined(OHOS_BUILD_ENABLE_KEYBOARD)
1053c29fa5a6Sopenharmony_ci    int32_t clientPid = GetCallingPid();
1054c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1055c29fa5a6Sopenharmony_ci        [this, filterId, clientPid] {
1056c29fa5a6Sopenharmony_ci            return sMsgHandler_.RemoveInputEventFilter(filterId, clientPid);
1057c29fa5a6Sopenharmony_ci        }
1058c29fa5a6Sopenharmony_ci        );
1059c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1060c29fa5a6Sopenharmony_ci        MMI_HILOGE("Remove event filter failed, return:%{public}d", ret);
1061c29fa5a6Sopenharmony_ci        return ret;
1062c29fa5a6Sopenharmony_ci    }
1063c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH || OHOS_BUILD_ENABLE_KEYBOARD
1064c29fa5a6Sopenharmony_ci    return RET_OK;
1065c29fa5a6Sopenharmony_ci}
1066c29fa5a6Sopenharmony_ci
1067c29fa5a6Sopenharmony_civoid MMIService::OnConnected(SessionPtr s)
1068c29fa5a6Sopenharmony_ci{
1069c29fa5a6Sopenharmony_ci    CHKPV(s);
1070c29fa5a6Sopenharmony_ci    MMI_HILOGI("fd:%{public}d", s->GetFd());
1071c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_ANCO
1072c29fa5a6Sopenharmony_ci    if (s->GetProgramName() != SHELL_ASSISTANT) {
1073c29fa5a6Sopenharmony_ci        return;
1074c29fa5a6Sopenharmony_ci    }
1075c29fa5a6Sopenharmony_ci    auto appMgrClient = DelayedSingleton<AppExecFwk::AppMgrClient>::GetInstance();
1076c29fa5a6Sopenharmony_ci    if (appMgrClient == nullptr) {
1077c29fa5a6Sopenharmony_ci        return;
1078c29fa5a6Sopenharmony_ci    }
1079c29fa5a6Sopenharmony_ci    int32_t userid = WIN_MGR->GetCurrentUserId();
1080c29fa5a6Sopenharmony_ci    if (userid < 0) {
1081c29fa5a6Sopenharmony_ci        userid = DEFAULT_USER_ID;
1082c29fa5a6Sopenharmony_ci    }
1083c29fa5a6Sopenharmony_ci    std::vector<AppExecFwk::RunningProcessInfo> info;
1084c29fa5a6Sopenharmony_ci    appMgrClient->GetProcessRunningInfosByUserId(info, userid);
1085c29fa5a6Sopenharmony_ci    for (auto &item : info) {
1086c29fa5a6Sopenharmony_ci        if (item.bundleNames.empty()) {
1087c29fa5a6Sopenharmony_ci            continue;
1088c29fa5a6Sopenharmony_ci        }
1089c29fa5a6Sopenharmony_ci        if (SHELL_ASSISTANT == item.bundleNames[0].c_str()) {
1090c29fa5a6Sopenharmony_ci            MMI_HILOGW("Record client processes pid %{public}d", item.pid_);
1091c29fa5a6Sopenharmony_ci            shellAssitentPid_ = item.pid_;
1092c29fa5a6Sopenharmony_ci        }
1093c29fa5a6Sopenharmony_ci    }
1094c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_ANCO
1095c29fa5a6Sopenharmony_ci}
1096c29fa5a6Sopenharmony_ci
1097c29fa5a6Sopenharmony_civoid MMIService::OnDisconnected(SessionPtr s)
1098c29fa5a6Sopenharmony_ci{
1099c29fa5a6Sopenharmony_ci    CHKPV(s);
1100c29fa5a6Sopenharmony_ci    MMI_HILOGW("Enter, session desc:%{public}s, fd:%{public}d", s->GetDescript().c_str(), s->GetFd());
1101c29fa5a6Sopenharmony_ci    auto ret = RemoveInputEventFilter(-1);
1102c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1103c29fa5a6Sopenharmony_ci        MMI_HILOGF("Remove all filter failed, ret:%{public}d", ret);
1104c29fa5a6Sopenharmony_ci    }
1105c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_ANCO
1106c29fa5a6Sopenharmony_ci    if (s->GetProgramName() == SHELL_ASSISTANT && shellAssitentPid_ == s->GetPid()) {
1107c29fa5a6Sopenharmony_ci        MMI_HILOGW("Clean all shell windows pid: %{public}d", s->GetPid());
1108c29fa5a6Sopenharmony_ci        shellAssitentPid_ = -1;
1109c29fa5a6Sopenharmony_ci        IInputWindowsManager::GetInstance()->CleanShellWindowIds();
1110c29fa5a6Sopenharmony_ci    }
1111c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_ANCO
1112c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
1113c29fa5a6Sopenharmony_ci    IPointerDrawingManager::GetInstance()->DeletePointerVisible(s->GetPid());
1114c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1115c29fa5a6Sopenharmony_ci}
1116c29fa5a6Sopenharmony_ci
1117c29fa5a6Sopenharmony_ciint32_t MMIService::SetMouseScrollRows(int32_t rows)
1118c29fa5a6Sopenharmony_ci{
1119c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1120c29fa5a6Sopenharmony_ci#if defined OHOS_BUILD_ENABLE_POINTER
1121c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1122c29fa5a6Sopenharmony_ci        [rows] {
1123c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<MouseEventNormalize>::GetInstance()->SetMouseScrollRows(rows);
1124c29fa5a6Sopenharmony_ci        }
1125c29fa5a6Sopenharmony_ci        );
1126c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1127c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set the number of mouse scrolling rows failed, return:%{public}d", ret);
1128c29fa5a6Sopenharmony_ci        return ret;
1129c29fa5a6Sopenharmony_ci    }
1130c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1131c29fa5a6Sopenharmony_ci    return RET_OK;
1132c29fa5a6Sopenharmony_ci}
1133c29fa5a6Sopenharmony_ci
1134c29fa5a6Sopenharmony_ciint32_t MMIService::SetCustomCursor(int32_t pid, int32_t windowId, int32_t focusX, int32_t focusY, void* pixelMap)
1135c29fa5a6Sopenharmony_ci{
1136c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1137c29fa5a6Sopenharmony_ci#if defined OHOS_BUILD_ENABLE_POINTER
1138c29fa5a6Sopenharmony_ci    int32_t ret = CheckPidPermission(pid);
1139c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1140c29fa5a6Sopenharmony_ci        MMI_HILOGE("Check pid permission failed");
1141c29fa5a6Sopenharmony_ci        return ret;
1142c29fa5a6Sopenharmony_ci    }
1143c29fa5a6Sopenharmony_ci    ret = delegateTasks_.PostSyncTask(std::bind(
1144c29fa5a6Sopenharmony_ci        [pixelMap, pid, windowId, focusX, focusY] {
1145c29fa5a6Sopenharmony_ci            return IPointerDrawingManager::GetInstance()->SetCustomCursor(pixelMap, pid, windowId, focusX, focusY);
1146c29fa5a6Sopenharmony_ci        }
1147c29fa5a6Sopenharmony_ci        ));
1148c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1149c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set the custom cursor failed, ret:%{public}d", ret);
1150c29fa5a6Sopenharmony_ci        return ret;
1151c29fa5a6Sopenharmony_ci    }
1152c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1153c29fa5a6Sopenharmony_ci    return RET_OK;
1154c29fa5a6Sopenharmony_ci}
1155c29fa5a6Sopenharmony_ci
1156c29fa5a6Sopenharmony_ciint32_t MMIService::SetMouseIcon(int32_t windowId, void* pixelMap)
1157c29fa5a6Sopenharmony_ci{
1158c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1159c29fa5a6Sopenharmony_ci#if defined OHOS_BUILD_ENABLE_POINTER
1160c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
1161c29fa5a6Sopenharmony_ci    int32_t ret = CheckPidPermission(pid);
1162c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1163c29fa5a6Sopenharmony_ci        MMI_HILOGE("Check pid permission failed");
1164c29fa5a6Sopenharmony_ci        return ret;
1165c29fa5a6Sopenharmony_ci    }
1166c29fa5a6Sopenharmony_ci    ret = delegateTasks_.PostSyncTask(std::bind(
1167c29fa5a6Sopenharmony_ci        [pid, windowId, pixelMap] {
1168c29fa5a6Sopenharmony_ci            return IPointerDrawingManager::GetInstance()->SetMouseIcon(pid, windowId, pixelMap);
1169c29fa5a6Sopenharmony_ci        }
1170c29fa5a6Sopenharmony_ci        ));
1171c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1172c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set the mouse icon failed, return:%{public}d", ret);
1173c29fa5a6Sopenharmony_ci        return ret;
1174c29fa5a6Sopenharmony_ci    }
1175c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1176c29fa5a6Sopenharmony_ci    return RET_OK;
1177c29fa5a6Sopenharmony_ci}
1178c29fa5a6Sopenharmony_ci
1179c29fa5a6Sopenharmony_ciint32_t MMIService::SetMouseHotSpot(int32_t pid, int32_t windowId, int32_t hotSpotX, int32_t hotSpotY)
1180c29fa5a6Sopenharmony_ci{
1181c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1182c29fa5a6Sopenharmony_ci#if defined OHOS_BUILD_ENABLE_POINTER
1183c29fa5a6Sopenharmony_ci    int32_t ret = CheckPidPermission(pid);
1184c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1185c29fa5a6Sopenharmony_ci        MMI_HILOGE("Check pid permission failed");
1186c29fa5a6Sopenharmony_ci        return ret;
1187c29fa5a6Sopenharmony_ci    }
1188c29fa5a6Sopenharmony_ci    ret = delegateTasks_.PostSyncTask(
1189c29fa5a6Sopenharmony_ci        [pid, windowId, hotSpotX, hotSpotY] {
1190c29fa5a6Sopenharmony_ci            return IPointerDrawingManager::GetInstance()->SetMouseHotSpot(pid, windowId, hotSpotX, hotSpotY);
1191c29fa5a6Sopenharmony_ci        }
1192c29fa5a6Sopenharmony_ci        );
1193c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1194c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set the mouse hot spot failed, return:%{public}d", ret);
1195c29fa5a6Sopenharmony_ci        return ret;
1196c29fa5a6Sopenharmony_ci    }
1197c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1198c29fa5a6Sopenharmony_ci    return RET_OK;
1199c29fa5a6Sopenharmony_ci}
1200c29fa5a6Sopenharmony_ci
1201c29fa5a6Sopenharmony_ciint32_t MMIService::SetNapStatus(int32_t pid, int32_t uid, std::string bundleName, int32_t napStatus)
1202c29fa5a6Sopenharmony_ci{
1203c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1204c29fa5a6Sopenharmony_ci    int32_t ret = CheckPidPermission(pid);
1205c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1206c29fa5a6Sopenharmony_ci        MMI_HILOGE("Check pid permission failed");
1207c29fa5a6Sopenharmony_ci        return ret;
1208c29fa5a6Sopenharmony_ci    }
1209c29fa5a6Sopenharmony_ci    NapProcess::GetInstance()->SetNapStatus(pid, uid, bundleName, napStatus);
1210c29fa5a6Sopenharmony_ci    return RET_OK;
1211c29fa5a6Sopenharmony_ci}
1212c29fa5a6Sopenharmony_ci
1213c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
1214c29fa5a6Sopenharmony_ciint32_t MMIService::ReadMouseScrollRows(int32_t &rows)
1215c29fa5a6Sopenharmony_ci{
1216c29fa5a6Sopenharmony_ci    rows = MouseEventHdr->GetMouseScrollRows();
1217c29fa5a6Sopenharmony_ci    return RET_OK;
1218c29fa5a6Sopenharmony_ci}
1219c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1220c29fa5a6Sopenharmony_ci
1221c29fa5a6Sopenharmony_ciint32_t MMIService::GetMouseScrollRows(int32_t &rows)
1222c29fa5a6Sopenharmony_ci{
1223c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1224c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
1225c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1226c29fa5a6Sopenharmony_ci        [this, &rows] {
1227c29fa5a6Sopenharmony_ci            return this->ReadMouseScrollRows(rows);
1228c29fa5a6Sopenharmony_ci        }
1229c29fa5a6Sopenharmony_ci        );
1230c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1231c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get the number of mouse scrolling rows failed, ret:%{public}d", ret);
1232c29fa5a6Sopenharmony_ci        return ret;
1233c29fa5a6Sopenharmony_ci    }
1234c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1235c29fa5a6Sopenharmony_ci    return RET_OK;
1236c29fa5a6Sopenharmony_ci}
1237c29fa5a6Sopenharmony_ci
1238c29fa5a6Sopenharmony_ciint32_t MMIService::SetPointerSize(int32_t size)
1239c29fa5a6Sopenharmony_ci{
1240c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1241c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING)
1242c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1243c29fa5a6Sopenharmony_ci        [size] {
1244c29fa5a6Sopenharmony_ci            return IPointerDrawingManager::GetInstance()->SetPointerSize(size);
1245c29fa5a6Sopenharmony_ci        }
1246c29fa5a6Sopenharmony_ci        );
1247c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1248c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set pointer size failed, return:%{public}d", ret);
1249c29fa5a6Sopenharmony_ci        return ret;
1250c29fa5a6Sopenharmony_ci    }
1251c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING
1252c29fa5a6Sopenharmony_ci    return RET_OK;
1253c29fa5a6Sopenharmony_ci}
1254c29fa5a6Sopenharmony_ci
1255c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING)
1256c29fa5a6Sopenharmony_ciint32_t MMIService::ReadPointerSize(int32_t &size)
1257c29fa5a6Sopenharmony_ci{
1258c29fa5a6Sopenharmony_ci    size = IPointerDrawingManager::GetInstance()->GetPointerSize();
1259c29fa5a6Sopenharmony_ci    return RET_OK;
1260c29fa5a6Sopenharmony_ci}
1261c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING
1262c29fa5a6Sopenharmony_ci
1263c29fa5a6Sopenharmony_ciint32_t MMIService::GetPointerSize(int32_t &size)
1264c29fa5a6Sopenharmony_ci{
1265c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1266c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING)
1267c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1268c29fa5a6Sopenharmony_ci        [this, &size] {
1269c29fa5a6Sopenharmony_ci            return this->ReadPointerSize(size);
1270c29fa5a6Sopenharmony_ci        }
1271c29fa5a6Sopenharmony_ci        );
1272c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1273c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get pointer size failed, return:%{public}d", ret);
1274c29fa5a6Sopenharmony_ci        return ret;
1275c29fa5a6Sopenharmony_ci    }
1276c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING
1277c29fa5a6Sopenharmony_ci    return RET_OK;
1278c29fa5a6Sopenharmony_ci}
1279c29fa5a6Sopenharmony_ci
1280c29fa5a6Sopenharmony_ciint32_t MMIService::SetMousePrimaryButton(int32_t primaryButton)
1281c29fa5a6Sopenharmony_ci{
1282c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1283c29fa5a6Sopenharmony_ci#if defined OHOS_BUILD_ENABLE_POINTER
1284c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1285c29fa5a6Sopenharmony_ci        [primaryButton] {
1286c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<MouseEventNormalize>::GetInstance()->SetMousePrimaryButton(primaryButton);
1287c29fa5a6Sopenharmony_ci        }
1288c29fa5a6Sopenharmony_ci        );
1289c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1290c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set mouse primary button failed, return:%{public}d", ret);
1291c29fa5a6Sopenharmony_ci        return ret;
1292c29fa5a6Sopenharmony_ci    }
1293c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1294c29fa5a6Sopenharmony_ci    return RET_OK;
1295c29fa5a6Sopenharmony_ci}
1296c29fa5a6Sopenharmony_ci
1297c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
1298c29fa5a6Sopenharmony_ciint32_t MMIService::ReadMousePrimaryButton(int32_t &primaryButton)
1299c29fa5a6Sopenharmony_ci{
1300c29fa5a6Sopenharmony_ci    primaryButton = MouseEventHdr->GetMousePrimaryButton();
1301c29fa5a6Sopenharmony_ci    return RET_OK;
1302c29fa5a6Sopenharmony_ci}
1303c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1304c29fa5a6Sopenharmony_ci
1305c29fa5a6Sopenharmony_ciint32_t MMIService::GetMousePrimaryButton(int32_t &primaryButton)
1306c29fa5a6Sopenharmony_ci{
1307c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1308c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
1309c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1310c29fa5a6Sopenharmony_ci        [this, &primaryButton] {
1311c29fa5a6Sopenharmony_ci            return this->ReadMousePrimaryButton(primaryButton);
1312c29fa5a6Sopenharmony_ci        }
1313c29fa5a6Sopenharmony_ci        );
1314c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1315c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get mouse primary button failed, return:%{public}d", ret);
1316c29fa5a6Sopenharmony_ci        return ret;
1317c29fa5a6Sopenharmony_ci    }
1318c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1319c29fa5a6Sopenharmony_ci    return RET_OK;
1320c29fa5a6Sopenharmony_ci}
1321c29fa5a6Sopenharmony_ci
1322c29fa5a6Sopenharmony_ciint32_t MMIService::SetPointerVisible(bool visible, int32_t priority)
1323c29fa5a6Sopenharmony_ci{
1324c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1325c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING)
1326c29fa5a6Sopenharmony_ci    auto tokenId = IPCSkeleton::GetCallingTokenID();
1327c29fa5a6Sopenharmony_ci    auto tokenType = OHOS::Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId);
1328c29fa5a6Sopenharmony_ci    bool isHap = false;
1329c29fa5a6Sopenharmony_ci    if (tokenType == OHOS::Security::AccessToken::TOKEN_HAP) {
1330c29fa5a6Sopenharmony_ci        isHap = true;
1331c29fa5a6Sopenharmony_ci    }
1332c29fa5a6Sopenharmony_ci    int32_t clientPid = GetCallingPid();
1333c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1334c29fa5a6Sopenharmony_ci        [clientPid, visible, priority, isHap] {
1335c29fa5a6Sopenharmony_ci            return IPointerDrawingManager::GetInstance()->SetPointerVisible(clientPid, visible, priority, isHap);
1336c29fa5a6Sopenharmony_ci        }
1337c29fa5a6Sopenharmony_ci        );
1338c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1339c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set pointer visible failed, return:%{public}d", ret);
1340c29fa5a6Sopenharmony_ci        return ret;
1341c29fa5a6Sopenharmony_ci    }
1342c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING
1343c29fa5a6Sopenharmony_ci    return RET_OK;
1344c29fa5a6Sopenharmony_ci}
1345c29fa5a6Sopenharmony_ci
1346c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING)
1347c29fa5a6Sopenharmony_ciint32_t MMIService::CheckPointerVisible(bool &visible)
1348c29fa5a6Sopenharmony_ci{
1349c29fa5a6Sopenharmony_ci    visible = IPointerDrawingManager::GetInstance()->IsPointerVisible();
1350c29fa5a6Sopenharmony_ci    return RET_OK;
1351c29fa5a6Sopenharmony_ci}
1352c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING
1353c29fa5a6Sopenharmony_ci
1354c29fa5a6Sopenharmony_ciint32_t MMIService::IsPointerVisible(bool &visible)
1355c29fa5a6Sopenharmony_ci{
1356c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1357c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING)
1358c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1359c29fa5a6Sopenharmony_ci        [this, &visible] {
1360c29fa5a6Sopenharmony_ci            return this->CheckPointerVisible(visible);
1361c29fa5a6Sopenharmony_ci        }
1362c29fa5a6Sopenharmony_ci        );
1363c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1364c29fa5a6Sopenharmony_ci        MMI_HILOGE("Is pointer visible failed, return:%{public}d", ret);
1365c29fa5a6Sopenharmony_ci        return ret;
1366c29fa5a6Sopenharmony_ci    }
1367c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING
1368c29fa5a6Sopenharmony_ci    return RET_OK;
1369c29fa5a6Sopenharmony_ci}
1370c29fa5a6Sopenharmony_ci
1371c29fa5a6Sopenharmony_ciint32_t MMIService::MarkProcessed(int32_t eventType, int32_t eventId)
1372c29fa5a6Sopenharmony_ci{
1373c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1374c29fa5a6Sopenharmony_ci    CHKPR(ANRMgr, RET_ERR);
1375c29fa5a6Sopenharmony_ci    int32_t clientPid = GetCallingPid();
1376c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1377c29fa5a6Sopenharmony_ci        [clientPid, eventType, eventId] {
1378c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<ANRManager>::GetInstance()->MarkProcessed(clientPid, eventType, eventId);
1379c29fa5a6Sopenharmony_ci        }
1380c29fa5a6Sopenharmony_ci        );
1381c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1382c29fa5a6Sopenharmony_ci        MMI_HILOGD("Mark event processed failed, ret:%{public}d", ret);
1383c29fa5a6Sopenharmony_ci        return ret;
1384c29fa5a6Sopenharmony_ci    }
1385c29fa5a6Sopenharmony_ci    return RET_OK;
1386c29fa5a6Sopenharmony_ci}
1387c29fa5a6Sopenharmony_ci
1388c29fa5a6Sopenharmony_ciint32_t MMIService::SetPointerColor(int32_t color)
1389c29fa5a6Sopenharmony_ci{
1390c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1391c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING)
1392c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1393c29fa5a6Sopenharmony_ci        [color] {
1394c29fa5a6Sopenharmony_ci            return IPointerDrawingManager::GetInstance()->SetPointerColor(color);
1395c29fa5a6Sopenharmony_ci        }
1396c29fa5a6Sopenharmony_ci        );
1397c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1398c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set pointer color failed, return:%{public}d", ret);
1399c29fa5a6Sopenharmony_ci        return ret;
1400c29fa5a6Sopenharmony_ci    }
1401c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING
1402c29fa5a6Sopenharmony_ci    return RET_OK;
1403c29fa5a6Sopenharmony_ci}
1404c29fa5a6Sopenharmony_ci
1405c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING)
1406c29fa5a6Sopenharmony_ciint32_t MMIService::ReadPointerColor(int32_t &color)
1407c29fa5a6Sopenharmony_ci{
1408c29fa5a6Sopenharmony_ci    color = IPointerDrawingManager::GetInstance()->GetPointerColor();
1409c29fa5a6Sopenharmony_ci    return RET_OK;
1410c29fa5a6Sopenharmony_ci}
1411c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING
1412c29fa5a6Sopenharmony_ci
1413c29fa5a6Sopenharmony_ciint32_t MMIService::GetPointerColor(int32_t &color)
1414c29fa5a6Sopenharmony_ci{
1415c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1416c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING)
1417c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1418c29fa5a6Sopenharmony_ci        [this, &color] {
1419c29fa5a6Sopenharmony_ci            return this->ReadPointerColor(color);
1420c29fa5a6Sopenharmony_ci        }
1421c29fa5a6Sopenharmony_ci        );
1422c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1423c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get pointer color failed, return:%{public}d", ret);
1424c29fa5a6Sopenharmony_ci        return ret;
1425c29fa5a6Sopenharmony_ci    }
1426c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING
1427c29fa5a6Sopenharmony_ci    return RET_OK;
1428c29fa5a6Sopenharmony_ci}
1429c29fa5a6Sopenharmony_ci
1430c29fa5a6Sopenharmony_ciint32_t MMIService::SetPointerSpeed(int32_t speed)
1431c29fa5a6Sopenharmony_ci{
1432c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1433c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
1434c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1435c29fa5a6Sopenharmony_ci        [speed] {
1436c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<MouseEventNormalize>::GetInstance()->SetPointerSpeed(speed);
1437c29fa5a6Sopenharmony_ci        }
1438c29fa5a6Sopenharmony_ci        );
1439c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1440c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set pointer speed failed, return:%{public}d", ret);
1441c29fa5a6Sopenharmony_ci        return ret;
1442c29fa5a6Sopenharmony_ci    }
1443c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1444c29fa5a6Sopenharmony_ci    return RET_OK;
1445c29fa5a6Sopenharmony_ci}
1446c29fa5a6Sopenharmony_ci
1447c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
1448c29fa5a6Sopenharmony_ciint32_t MMIService::ReadPointerSpeed(int32_t &speed)
1449c29fa5a6Sopenharmony_ci{
1450c29fa5a6Sopenharmony_ci    speed = MouseEventHdr->GetPointerSpeed();
1451c29fa5a6Sopenharmony_ci    return RET_OK;
1452c29fa5a6Sopenharmony_ci}
1453c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1454c29fa5a6Sopenharmony_ci
1455c29fa5a6Sopenharmony_ciint32_t MMIService::GetPointerSpeed(int32_t &speed)
1456c29fa5a6Sopenharmony_ci{
1457c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1458c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
1459c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1460c29fa5a6Sopenharmony_ci        [this, &speed] {
1461c29fa5a6Sopenharmony_ci            return this->ReadPointerSpeed(speed);
1462c29fa5a6Sopenharmony_ci        }
1463c29fa5a6Sopenharmony_ci        );
1464c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1465c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get pointer speed failed, return:%{public}d", ret);
1466c29fa5a6Sopenharmony_ci        return ret;
1467c29fa5a6Sopenharmony_ci    }
1468c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1469c29fa5a6Sopenharmony_ci    return RET_OK;
1470c29fa5a6Sopenharmony_ci}
1471c29fa5a6Sopenharmony_ci
1472c29fa5a6Sopenharmony_ciint32_t MMIService::NotifyNapOnline()
1473c29fa5a6Sopenharmony_ci{
1474c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1475c29fa5a6Sopenharmony_ci    NapProcess::GetInstance()->NotifyNapOnline();
1476c29fa5a6Sopenharmony_ci    return RET_OK;
1477c29fa5a6Sopenharmony_ci}
1478c29fa5a6Sopenharmony_ci
1479c29fa5a6Sopenharmony_ciint32_t MMIService::RemoveInputEventObserver()
1480c29fa5a6Sopenharmony_ci{
1481c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1482c29fa5a6Sopenharmony_ci    NapProcess::GetInstance()->RemoveInputEventObserver();
1483c29fa5a6Sopenharmony_ci    return RET_OK;
1484c29fa5a6Sopenharmony_ci}
1485c29fa5a6Sopenharmony_ci
1486c29fa5a6Sopenharmony_ciint32_t MMIService::SetPointerStyle(int32_t windowId, PointerStyle pointerStyle, bool isUiExtension)
1487c29fa5a6Sopenharmony_ci{
1488c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1489c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
1490c29fa5a6Sopenharmony_ci    int32_t clientPid = GetCallingPid();
1491c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1492c29fa5a6Sopenharmony_ci        [clientPid, windowId, pointerStyle, isUiExtension] {
1493c29fa5a6Sopenharmony_ci            return IPointerDrawingManager::GetInstance()->SetPointerStyle(
1494c29fa5a6Sopenharmony_ci                clientPid, windowId, pointerStyle, isUiExtension);
1495c29fa5a6Sopenharmony_ci        }
1496c29fa5a6Sopenharmony_ci        );
1497c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1498c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set pointer style failed, return:%{public}d", ret);
1499c29fa5a6Sopenharmony_ci        return ret;
1500c29fa5a6Sopenharmony_ci    }
1501c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1502c29fa5a6Sopenharmony_ci    return RET_OK;
1503c29fa5a6Sopenharmony_ci}
1504c29fa5a6Sopenharmony_ci
1505c29fa5a6Sopenharmony_ciint32_t MMIService::ClearWindowPointerStyle(int32_t pid, int32_t windowId)
1506c29fa5a6Sopenharmony_ci{
1507c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1508c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
1509c29fa5a6Sopenharmony_ci    int32_t ret = CheckPidPermission(pid);
1510c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1511c29fa5a6Sopenharmony_ci        MMI_HILOGE("Check pid permission failed");
1512c29fa5a6Sopenharmony_ci        return ret;
1513c29fa5a6Sopenharmony_ci    }
1514c29fa5a6Sopenharmony_ci    ret = delegateTasks_.PostSyncTask(
1515c29fa5a6Sopenharmony_ci        [pid, windowId] {
1516c29fa5a6Sopenharmony_ci            return IPointerDrawingManager::GetInstance()->ClearWindowPointerStyle(pid, windowId);
1517c29fa5a6Sopenharmony_ci        }
1518c29fa5a6Sopenharmony_ci        );
1519c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1520c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set pointer style failed, return:%{public}d", ret);
1521c29fa5a6Sopenharmony_ci        return ret;
1522c29fa5a6Sopenharmony_ci    }
1523c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1524c29fa5a6Sopenharmony_ci    return RET_OK;
1525c29fa5a6Sopenharmony_ci}
1526c29fa5a6Sopenharmony_ci
1527c29fa5a6Sopenharmony_ciint32_t MMIService::GetPointerStyle(int32_t windowId, PointerStyle &pointerStyle, bool isUiExtension)
1528c29fa5a6Sopenharmony_ci{
1529c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1530c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
1531c29fa5a6Sopenharmony_ci    int32_t clientPid = GetCallingPid();
1532c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1533c29fa5a6Sopenharmony_ci        [clientPid, windowId, &pointerStyle, isUiExtension] {
1534c29fa5a6Sopenharmony_ci            return IPointerDrawingManager::GetInstance()->GetPointerStyle(
1535c29fa5a6Sopenharmony_ci                clientPid, windowId, pointerStyle, isUiExtension);
1536c29fa5a6Sopenharmony_ci        }
1537c29fa5a6Sopenharmony_ci        );
1538c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1539c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get pointer style failed, return:%{public}d", ret);
1540c29fa5a6Sopenharmony_ci        return ret;
1541c29fa5a6Sopenharmony_ci    }
1542c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1543c29fa5a6Sopenharmony_ci    return RET_OK;
1544c29fa5a6Sopenharmony_ci}
1545c29fa5a6Sopenharmony_ci
1546c29fa5a6Sopenharmony_ciint32_t MMIService::SetHoverScrollState(bool state)
1547c29fa5a6Sopenharmony_ci{
1548c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1549c29fa5a6Sopenharmony_ci#if defined OHOS_BUILD_ENABLE_POINTER
1550c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1551c29fa5a6Sopenharmony_ci        [state] {
1552c29fa5a6Sopenharmony_ci            return ::OHOS::MMI::IInputWindowsManager::GetInstance()->SetHoverScrollState(state);
1553c29fa5a6Sopenharmony_ci        }
1554c29fa5a6Sopenharmony_ci        );
1555c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1556c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set mouse hover scroll state failed, return:%{public}d", ret);
1557c29fa5a6Sopenharmony_ci        return ret;
1558c29fa5a6Sopenharmony_ci    }
1559c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1560c29fa5a6Sopenharmony_ci    return RET_OK;
1561c29fa5a6Sopenharmony_ci}
1562c29fa5a6Sopenharmony_ci
1563c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
1564c29fa5a6Sopenharmony_ciint32_t MMIService::ReadHoverScrollState(bool &state)
1565c29fa5a6Sopenharmony_ci{
1566c29fa5a6Sopenharmony_ci    state = WIN_MGR->GetHoverScrollState();
1567c29fa5a6Sopenharmony_ci    return RET_OK;
1568c29fa5a6Sopenharmony_ci}
1569c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1570c29fa5a6Sopenharmony_ci
1571c29fa5a6Sopenharmony_ciint32_t MMIService::GetHoverScrollState(bool &state)
1572c29fa5a6Sopenharmony_ci{
1573c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1574c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
1575c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1576c29fa5a6Sopenharmony_ci        [this, &state] {
1577c29fa5a6Sopenharmony_ci            return this->ReadHoverScrollState(state);
1578c29fa5a6Sopenharmony_ci        }
1579c29fa5a6Sopenharmony_ci        );
1580c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1581c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get mouse hover scroll state, return:%{public}d", ret);
1582c29fa5a6Sopenharmony_ci        return ret;
1583c29fa5a6Sopenharmony_ci    }
1584c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
1585c29fa5a6Sopenharmony_ci    return RET_OK;
1586c29fa5a6Sopenharmony_ci}
1587c29fa5a6Sopenharmony_ci
1588c29fa5a6Sopenharmony_ciint32_t MMIService::OnSupportKeys(int32_t deviceId, std::vector<int32_t> &keys, std::vector<bool> &keystroke)
1589c29fa5a6Sopenharmony_ci{
1590c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1591c29fa5a6Sopenharmony_ci    int32_t ret = INPUT_DEV_MGR->SupportKeys(deviceId, keys, keystroke);
1592c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1593c29fa5a6Sopenharmony_ci        MMI_HILOGE("Device id not support");
1594c29fa5a6Sopenharmony_ci        return ret;
1595c29fa5a6Sopenharmony_ci    }
1596c29fa5a6Sopenharmony_ci    if (keystroke.size() > MAX_SUPPORT_KEY) {
1597c29fa5a6Sopenharmony_ci        MMI_HILOGE("Device exceeds the max range");
1598c29fa5a6Sopenharmony_ci        return RET_ERR;
1599c29fa5a6Sopenharmony_ci    }
1600c29fa5a6Sopenharmony_ci    return RET_OK;
1601c29fa5a6Sopenharmony_ci}
1602c29fa5a6Sopenharmony_ci
1603c29fa5a6Sopenharmony_ciint32_t MMIService::SupportKeys(int32_t deviceId, std::vector<int32_t> &keys, std::vector<bool> &keystroke)
1604c29fa5a6Sopenharmony_ci{
1605c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1606c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1607c29fa5a6Sopenharmony_ci        [this, deviceId, &keys, &keystroke] {
1608c29fa5a6Sopenharmony_ci            return this->OnSupportKeys(deviceId, keys, keystroke);
1609c29fa5a6Sopenharmony_ci        }
1610c29fa5a6Sopenharmony_ci        );
1611c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1612c29fa5a6Sopenharmony_ci        MMI_HILOGE("Support keys info process failed, ret:%{public}d", ret);
1613c29fa5a6Sopenharmony_ci        return ret;
1614c29fa5a6Sopenharmony_ci    }
1615c29fa5a6Sopenharmony_ci    return RET_OK;
1616c29fa5a6Sopenharmony_ci}
1617c29fa5a6Sopenharmony_ci
1618c29fa5a6Sopenharmony_ciint32_t MMIService::OnGetDeviceIds(std::vector<int32_t> &ids)
1619c29fa5a6Sopenharmony_ci{
1620c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1621c29fa5a6Sopenharmony_ci    ids = INPUT_DEV_MGR->GetInputDeviceIds();
1622c29fa5a6Sopenharmony_ci    return RET_OK;
1623c29fa5a6Sopenharmony_ci}
1624c29fa5a6Sopenharmony_ci
1625c29fa5a6Sopenharmony_ciint32_t MMIService::GetDeviceIds(std::vector<int32_t> &ids)
1626c29fa5a6Sopenharmony_ci{
1627c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1628c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1629c29fa5a6Sopenharmony_ci        [this, &ids] {
1630c29fa5a6Sopenharmony_ci            return this->OnGetDeviceIds(ids);
1631c29fa5a6Sopenharmony_ci        }
1632c29fa5a6Sopenharmony_ci        );
1633c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1634c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get deviceids failed, ret:%{public}d", ret);
1635c29fa5a6Sopenharmony_ci        return ret;
1636c29fa5a6Sopenharmony_ci    }
1637c29fa5a6Sopenharmony_ci    return RET_OK;
1638c29fa5a6Sopenharmony_ci}
1639c29fa5a6Sopenharmony_ci
1640c29fa5a6Sopenharmony_ciint32_t MMIService::OnGetDevice(int32_t deviceId, std::shared_ptr<InputDevice> &inputDevice)
1641c29fa5a6Sopenharmony_ci{
1642c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1643c29fa5a6Sopenharmony_ci    if (INPUT_DEV_MGR->GetInputDevice(deviceId) == nullptr) {
1644c29fa5a6Sopenharmony_ci        MMI_HILOGE("Input device not found");
1645c29fa5a6Sopenharmony_ci        return COMMON_PARAMETER_ERROR;
1646c29fa5a6Sopenharmony_ci    }
1647c29fa5a6Sopenharmony_ci    inputDevice = INPUT_DEV_MGR->GetInputDevice(deviceId);
1648c29fa5a6Sopenharmony_ci    return RET_OK;
1649c29fa5a6Sopenharmony_ci}
1650c29fa5a6Sopenharmony_ci
1651c29fa5a6Sopenharmony_ciint32_t MMIService::GetDevice(int32_t deviceId, std::shared_ptr<InputDevice> &inputDevice)
1652c29fa5a6Sopenharmony_ci{
1653c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1654c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1655c29fa5a6Sopenharmony_ci        [this, deviceId, &inputDevice] {
1656c29fa5a6Sopenharmony_ci            return this->OnGetDevice(deviceId, inputDevice);
1657c29fa5a6Sopenharmony_ci        }
1658c29fa5a6Sopenharmony_ci        );
1659c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1660c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get input device info failed, ret:%{public}d", ret);
1661c29fa5a6Sopenharmony_ci        return ret;
1662c29fa5a6Sopenharmony_ci    }
1663c29fa5a6Sopenharmony_ci    return RET_OK;
1664c29fa5a6Sopenharmony_ci}
1665c29fa5a6Sopenharmony_ci
1666c29fa5a6Sopenharmony_ciint32_t MMIService::OnRegisterDevListener(int32_t pid)
1667c29fa5a6Sopenharmony_ci{
1668c29fa5a6Sopenharmony_ci    auto sess = GetSession(GetClientFd(pid));
1669c29fa5a6Sopenharmony_ci    CHKPR(sess, RET_ERR);
1670c29fa5a6Sopenharmony_ci    INPUT_DEV_MGR->AddDevListener(sess);
1671c29fa5a6Sopenharmony_ci    return RET_OK;
1672c29fa5a6Sopenharmony_ci}
1673c29fa5a6Sopenharmony_ci
1674c29fa5a6Sopenharmony_ciint32_t MMIService::RegisterDevListener()
1675c29fa5a6Sopenharmony_ci{
1676c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1677c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
1678c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1679c29fa5a6Sopenharmony_ci        [this, pid] {
1680c29fa5a6Sopenharmony_ci            return this->OnRegisterDevListener(pid);
1681c29fa5a6Sopenharmony_ci        }
1682c29fa5a6Sopenharmony_ci        );
1683c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1684c29fa5a6Sopenharmony_ci        MMI_HILOGE("Register device listener failed, ret:%{public}d", ret);
1685c29fa5a6Sopenharmony_ci        return ret;
1686c29fa5a6Sopenharmony_ci    }
1687c29fa5a6Sopenharmony_ci    return RET_OK;
1688c29fa5a6Sopenharmony_ci}
1689c29fa5a6Sopenharmony_ci
1690c29fa5a6Sopenharmony_ciint32_t MMIService::OnUnregisterDevListener(int32_t pid)
1691c29fa5a6Sopenharmony_ci{
1692c29fa5a6Sopenharmony_ci    auto sess = GetSession(GetClientFd(pid));
1693c29fa5a6Sopenharmony_ci    INPUT_DEV_MGR->RemoveDevListener(sess);
1694c29fa5a6Sopenharmony_ci    return RET_OK;
1695c29fa5a6Sopenharmony_ci}
1696c29fa5a6Sopenharmony_ci
1697c29fa5a6Sopenharmony_ciint32_t MMIService::UnregisterDevListener()
1698c29fa5a6Sopenharmony_ci{
1699c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1700c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
1701c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1702c29fa5a6Sopenharmony_ci        [this, pid] {
1703c29fa5a6Sopenharmony_ci            return this->OnUnregisterDevListener(pid);
1704c29fa5a6Sopenharmony_ci        }
1705c29fa5a6Sopenharmony_ci        );
1706c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1707c29fa5a6Sopenharmony_ci        MMI_HILOGE("Unregister device listener failed failed, ret:%{public}d", ret);
1708c29fa5a6Sopenharmony_ci        return ret;
1709c29fa5a6Sopenharmony_ci    }
1710c29fa5a6Sopenharmony_ci    return RET_OK;
1711c29fa5a6Sopenharmony_ci}
1712c29fa5a6Sopenharmony_ci
1713c29fa5a6Sopenharmony_ciint32_t MMIService::OnGetKeyboardType(int32_t deviceId, int32_t &keyboardType)
1714c29fa5a6Sopenharmony_ci{
1715c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1716c29fa5a6Sopenharmony_ci    int32_t ret = INPUT_DEV_MGR->GetKeyboardType(deviceId, keyboardType);
1717c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1718c29fa5a6Sopenharmony_ci        MMI_HILOGD("GetKeyboardType call failed");
1719c29fa5a6Sopenharmony_ci        return ret;
1720c29fa5a6Sopenharmony_ci    }
1721c29fa5a6Sopenharmony_ci    return RET_OK;
1722c29fa5a6Sopenharmony_ci}
1723c29fa5a6Sopenharmony_ci
1724c29fa5a6Sopenharmony_ciint32_t MMIService::GetKeyboardType(int32_t deviceId, int32_t &keyboardType)
1725c29fa5a6Sopenharmony_ci{
1726c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1727c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1728c29fa5a6Sopenharmony_ci        [this, deviceId, &keyboardType] {
1729c29fa5a6Sopenharmony_ci            return this->OnGetKeyboardType(deviceId, keyboardType);
1730c29fa5a6Sopenharmony_ci        }
1731c29fa5a6Sopenharmony_ci        );
1732c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1733c29fa5a6Sopenharmony_ci        MMI_HILOGD("Get keyboard type failed, ret:%{public}d", ret);
1734c29fa5a6Sopenharmony_ci        return ret;
1735c29fa5a6Sopenharmony_ci    }
1736c29fa5a6Sopenharmony_ci    return ret;
1737c29fa5a6Sopenharmony_ci}
1738c29fa5a6Sopenharmony_ci
1739c29fa5a6Sopenharmony_ciint32_t MMIService::SetKeyboardRepeatDelay(int32_t delay)
1740c29fa5a6Sopenharmony_ci{
1741c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1742c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
1743c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1744c29fa5a6Sopenharmony_ci        [delay] {
1745c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<KeyAutoRepeat>::GetInstance()->SetKeyboardRepeatDelay(delay);
1746c29fa5a6Sopenharmony_ci        }
1747c29fa5a6Sopenharmony_ci        );
1748c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1749c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set keyboard repeat delay failed, ret:%{public}d", ret);
1750c29fa5a6Sopenharmony_ci        return ret;
1751c29fa5a6Sopenharmony_ci    }
1752c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
1753c29fa5a6Sopenharmony_ci    return RET_OK;
1754c29fa5a6Sopenharmony_ci}
1755c29fa5a6Sopenharmony_ci
1756c29fa5a6Sopenharmony_ciint32_t MMIService::SetKeyboardRepeatRate(int32_t rate)
1757c29fa5a6Sopenharmony_ci{
1758c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1759c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
1760c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1761c29fa5a6Sopenharmony_ci        [rate] {
1762c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<KeyAutoRepeat>::GetInstance()->SetKeyboardRepeatRate(rate);
1763c29fa5a6Sopenharmony_ci        }
1764c29fa5a6Sopenharmony_ci        );
1765c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1766c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set keyboard repeat rate failed, ret:%{public}d", ret);
1767c29fa5a6Sopenharmony_ci        return ret;
1768c29fa5a6Sopenharmony_ci    }
1769c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
1770c29fa5a6Sopenharmony_ci    return RET_OK;
1771c29fa5a6Sopenharmony_ci}
1772c29fa5a6Sopenharmony_ci
1773c29fa5a6Sopenharmony_ciint32_t MMIService::GetKeyboardRepeatDelay(int32_t &delay)
1774c29fa5a6Sopenharmony_ci{
1775c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1776c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
1777c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1778c29fa5a6Sopenharmony_ci        [&delay] {
1779c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<KeyAutoRepeat>::GetInstance()->GetKeyboardRepeatDelay(delay);
1780c29fa5a6Sopenharmony_ci        }
1781c29fa5a6Sopenharmony_ci        );
1782c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1783c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get keyboard repeat delay failed, ret:%{public}d", ret);
1784c29fa5a6Sopenharmony_ci        return ret;
1785c29fa5a6Sopenharmony_ci    }
1786c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
1787c29fa5a6Sopenharmony_ci    return RET_OK;
1788c29fa5a6Sopenharmony_ci}
1789c29fa5a6Sopenharmony_ci
1790c29fa5a6Sopenharmony_ciint32_t MMIService::GetKeyboardRepeatRate(int32_t &rate)
1791c29fa5a6Sopenharmony_ci{
1792c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1793c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
1794c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1795c29fa5a6Sopenharmony_ci        [&rate] {
1796c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<KeyAutoRepeat>::GetInstance()->GetKeyboardRepeatRate(rate);
1797c29fa5a6Sopenharmony_ci        }
1798c29fa5a6Sopenharmony_ci        );
1799c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1800c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get keyboard repeat rate failed, ret:%{public}d", ret);
1801c29fa5a6Sopenharmony_ci        return ret;
1802c29fa5a6Sopenharmony_ci    }
1803c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
1804c29fa5a6Sopenharmony_ci    return RET_OK;
1805c29fa5a6Sopenharmony_ci}
1806c29fa5a6Sopenharmony_ci
1807c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || defined(OHOS_BUILD_ENABLE_MONITOR)
1808c29fa5a6Sopenharmony_ciint32_t MMIService::CheckAddInput(int32_t pid, InputHandlerType handlerType, HandleEventType eventType,
1809c29fa5a6Sopenharmony_ci    int32_t priority, uint32_t deviceTags)
1810c29fa5a6Sopenharmony_ci{
1811c29fa5a6Sopenharmony_ci    auto sess = GetSessionByPid(pid);
1812c29fa5a6Sopenharmony_ci    CHKPR(sess, ERROR_NULL_POINTER);
1813c29fa5a6Sopenharmony_ci    return sMsgHandler_.OnAddInputHandler(sess, handlerType, eventType, priority, deviceTags);
1814c29fa5a6Sopenharmony_ci}
1815c29fa5a6Sopenharmony_ci
1816c29fa5a6Sopenharmony_ciint32_t MMIService::CheckAddInput(int32_t pid, InputHandlerType handlerType, std::vector<int32_t> actionsType)
1817c29fa5a6Sopenharmony_ci{
1818c29fa5a6Sopenharmony_ci    auto sess = GetSessionByPid(pid);
1819c29fa5a6Sopenharmony_ci    CHKPR(sess, ERROR_NULL_POINTER);
1820c29fa5a6Sopenharmony_ci    return sMsgHandler_.OnAddInputHandler(sess, handlerType, actionsType);
1821c29fa5a6Sopenharmony_ci}
1822c29fa5a6Sopenharmony_ci
1823c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_INTERCEPTOR || OHOS_BUILD_ENABLE_MONITOR
1824c29fa5a6Sopenharmony_ci
1825c29fa5a6Sopenharmony_ciint32_t MMIService::AddInputHandler(InputHandlerType handlerType, HandleEventType eventType, int32_t priority,
1826c29fa5a6Sopenharmony_ci    uint32_t deviceTags, std::vector<int32_t> actionsType)
1827c29fa5a6Sopenharmony_ci{
1828c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1829c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_MONITOR) && defined(PLAYER_FRAMEWORK_EXISTS)
1830c29fa5a6Sopenharmony_ci    bool isRegisterCaptureCb = false;
1831c29fa5a6Sopenharmony_ci    if (!PER_HELPER->VerifySystemApp() && handlerType == InputHandlerType::MONITOR) {
1832c29fa5a6Sopenharmony_ci        isRegisterCaptureCb = true;
1833c29fa5a6Sopenharmony_ci    }
1834c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_MONITOR && PLAYER_FRAMEWORK_EXISTS
1835c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || defined(OHOS_BUILD_ENABLE_MONITOR)
1836c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
1837c29fa5a6Sopenharmony_ci    int32_t ret = RET_ERR;
1838c29fa5a6Sopenharmony_ci    if (actionsType.empty()) {
1839c29fa5a6Sopenharmony_ci        ret = delegateTasks_.PostSyncTask(
1840c29fa5a6Sopenharmony_ci            [this, pid, handlerType, eventType, priority, deviceTags, isRegisterCaptureCb] {
1841c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_MONITOR) && defined(PLAYER_FRAMEWORK_EXISTS)
1842c29fa5a6Sopenharmony_ci                if (isRegisterCaptureCb) {
1843c29fa5a6Sopenharmony_ci                    RegisterScreenCaptureCallback();
1844c29fa5a6Sopenharmony_ci                }
1845c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_MONITOR && PLAYER_FRAMEWORK_EXISTS
1846c29fa5a6Sopenharmony_ci                return this->CheckAddInput(pid, handlerType, eventType, priority, deviceTags);
1847c29fa5a6Sopenharmony_ci            }
1848c29fa5a6Sopenharmony_ci            );
1849c29fa5a6Sopenharmony_ci    } else {
1850c29fa5a6Sopenharmony_ci        ret = delegateTasks_.PostSyncTask(
1851c29fa5a6Sopenharmony_ci            [this, pid, handlerType, actionsType, isRegisterCaptureCb] {
1852c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_MONITOR) && defined(PLAYER_FRAMEWORK_EXISTS)
1853c29fa5a6Sopenharmony_ci                if (isRegisterCaptureCb) {
1854c29fa5a6Sopenharmony_ci                    RegisterScreenCaptureCallback();
1855c29fa5a6Sopenharmony_ci                }
1856c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_MONITOR && PLAYER_FRAMEWORK_EXISTS
1857c29fa5a6Sopenharmony_ci                return this->CheckAddInput(pid, handlerType, actionsType);
1858c29fa5a6Sopenharmony_ci            }
1859c29fa5a6Sopenharmony_ci            );
1860c29fa5a6Sopenharmony_ci    }
1861c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1862c29fa5a6Sopenharmony_ci        MMI_HILOGE("Add input handler failed, ret:%{public}d", ret);
1863c29fa5a6Sopenharmony_ci        return ret;
1864c29fa5a6Sopenharmony_ci    }
1865c29fa5a6Sopenharmony_ci    ret = ObserverAddInputHandler(pid);
1866c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1867c29fa5a6Sopenharmony_ci        MMI_HILOGE("AddInputHandler info to observer failed, ret:%{public}d", ret);
1868c29fa5a6Sopenharmony_ci        return ret;
1869c29fa5a6Sopenharmony_ci    }
1870c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_INTERCEPTOR || OHOS_BUILD_ENABLE_MONITOR
1871c29fa5a6Sopenharmony_ci    return RET_OK;
1872c29fa5a6Sopenharmony_ci}
1873c29fa5a6Sopenharmony_ci
1874c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || defined(OHOS_BUILD_ENABLE_MONITOR)
1875c29fa5a6Sopenharmony_ciint32_t MMIService::CheckRemoveInput(int32_t pid, InputHandlerType handlerType, HandleEventType eventType,
1876c29fa5a6Sopenharmony_ci    int32_t priority, uint32_t deviceTags)
1877c29fa5a6Sopenharmony_ci{
1878c29fa5a6Sopenharmony_ci    auto sess = GetSessionByPid(pid);
1879c29fa5a6Sopenharmony_ci    CHKPR(sess, ERROR_NULL_POINTER);
1880c29fa5a6Sopenharmony_ci    return sMsgHandler_.OnRemoveInputHandler(sess, handlerType, eventType, priority, deviceTags);
1881c29fa5a6Sopenharmony_ci}
1882c29fa5a6Sopenharmony_ci
1883c29fa5a6Sopenharmony_ciint32_t MMIService::CheckRemoveInput(int32_t pid, InputHandlerType handlerType, std::vector<int32_t> actionsType)
1884c29fa5a6Sopenharmony_ci{
1885c29fa5a6Sopenharmony_ci    auto sess = GetSessionByPid(pid);
1886c29fa5a6Sopenharmony_ci    CHKPR(sess, ERROR_NULL_POINTER);
1887c29fa5a6Sopenharmony_ci    return sMsgHandler_.OnRemoveInputHandler(sess, handlerType, actionsType);
1888c29fa5a6Sopenharmony_ci}
1889c29fa5a6Sopenharmony_ci
1890c29fa5a6Sopenharmony_ciint32_t MMIService::ObserverAddInputHandler(int32_t pid)
1891c29fa5a6Sopenharmony_ci{
1892c29fa5a6Sopenharmony_ci    if (NapProcess::GetInstance()->GetNapClientPid() != REMOVE_OBSERVER) {
1893c29fa5a6Sopenharmony_ci        OHOS::MMI::NapProcess::NapStatusData napData;
1894c29fa5a6Sopenharmony_ci        napData.pid = GetCallingPid();
1895c29fa5a6Sopenharmony_ci        napData.uid = GetCallingUid();
1896c29fa5a6Sopenharmony_ci        auto sess = GetSessionByPid(pid);
1897c29fa5a6Sopenharmony_ci        CHKPR(sess, ERROR_NULL_POINTER);
1898c29fa5a6Sopenharmony_ci        napData.bundleName = sess->GetProgramName();
1899c29fa5a6Sopenharmony_ci        int32_t syncState = SUBSCRIBED;
1900c29fa5a6Sopenharmony_ci        MMI_HILOGD("AddInputHandler info to observer : pid:%{public}d, uid:%d, bundleName:%{public}s",
1901c29fa5a6Sopenharmony_ci            napData.pid, napData.uid, napData.bundleName.c_str());
1902c29fa5a6Sopenharmony_ci        NapProcess::GetInstance()->AddMmiSubscribedEventData(napData, syncState);
1903c29fa5a6Sopenharmony_ci        if (NapProcess::GetInstance()->GetNapClientPid() != UNOBSERVED) {
1904c29fa5a6Sopenharmony_ci            NapProcess::GetInstance()->NotifyBundleName(napData, syncState);
1905c29fa5a6Sopenharmony_ci        }
1906c29fa5a6Sopenharmony_ci    }
1907c29fa5a6Sopenharmony_ci    return RET_OK;
1908c29fa5a6Sopenharmony_ci}
1909c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_INTERCEPTOR || OHOS_BUILD_ENABLE_MONITOR
1910c29fa5a6Sopenharmony_ci
1911c29fa5a6Sopenharmony_ciint32_t MMIService::RemoveInputHandler(InputHandlerType handlerType, HandleEventType eventType, int32_t priority,
1912c29fa5a6Sopenharmony_ci    uint32_t deviceTags, std::vector<int32_t> actionsType)
1913c29fa5a6Sopenharmony_ci{
1914c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1915c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_INTERCEPTOR) || defined(OHOS_BUILD_ENABLE_MONITOR)
1916c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
1917c29fa5a6Sopenharmony_ci    int32_t ret = RET_ERR;
1918c29fa5a6Sopenharmony_ci    if (actionsType.empty()) {
1919c29fa5a6Sopenharmony_ci        ret = delegateTasks_.PostSyncTask(
1920c29fa5a6Sopenharmony_ci            [this, pid, handlerType, eventType, priority, deviceTags] {
1921c29fa5a6Sopenharmony_ci                return this->CheckRemoveInput(pid, handlerType, eventType, priority, deviceTags);
1922c29fa5a6Sopenharmony_ci            }
1923c29fa5a6Sopenharmony_ci            );
1924c29fa5a6Sopenharmony_ci    } else {
1925c29fa5a6Sopenharmony_ci        ret = delegateTasks_.PostSyncTask(
1926c29fa5a6Sopenharmony_ci            [this, pid, handlerType, actionsType] {
1927c29fa5a6Sopenharmony_ci                return this->CheckRemoveInput(pid, handlerType, actionsType);
1928c29fa5a6Sopenharmony_ci            }
1929c29fa5a6Sopenharmony_ci            );
1930c29fa5a6Sopenharmony_ci    }
1931c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1932c29fa5a6Sopenharmony_ci        MMI_HILOGE("Remove input handler failed, ret:%{public}d", ret);
1933c29fa5a6Sopenharmony_ci        return ret;
1934c29fa5a6Sopenharmony_ci    }
1935c29fa5a6Sopenharmony_ci    if (NapProcess::GetInstance()->GetNapClientPid() != REMOVE_OBSERVER) {
1936c29fa5a6Sopenharmony_ci        OHOS::MMI::NapProcess::NapStatusData napData;
1937c29fa5a6Sopenharmony_ci        napData.pid = GetCallingPid();
1938c29fa5a6Sopenharmony_ci        napData.uid = GetCallingUid();
1939c29fa5a6Sopenharmony_ci        auto sess = GetSessionByPid(pid);
1940c29fa5a6Sopenharmony_ci        CHKPR(sess, ERROR_NULL_POINTER);
1941c29fa5a6Sopenharmony_ci        napData.bundleName = sess->GetProgramName();
1942c29fa5a6Sopenharmony_ci        int32_t syncState = UNSUBSCRIBED;
1943c29fa5a6Sopenharmony_ci        MMI_HILOGD("RemoveInputHandler info to observer : pid:%{public}d, uid:%{public}d, bundleName:%{public}s",
1944c29fa5a6Sopenharmony_ci            napData.pid, napData.uid, napData.bundleName.c_str());
1945c29fa5a6Sopenharmony_ci        NapProcess::GetInstance()->AddMmiSubscribedEventData(napData, syncState);
1946c29fa5a6Sopenharmony_ci        if (NapProcess::GetInstance()->GetNapClientPid() != UNOBSERVED) {
1947c29fa5a6Sopenharmony_ci            NapProcess::GetInstance()->NotifyBundleName(napData, syncState);
1948c29fa5a6Sopenharmony_ci        }
1949c29fa5a6Sopenharmony_ci    }
1950c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_INTERCEPTOR || OHOS_BUILD_ENABLE_MONITOR
1951c29fa5a6Sopenharmony_ci    return RET_OK;
1952c29fa5a6Sopenharmony_ci}
1953c29fa5a6Sopenharmony_ci
1954c29fa5a6Sopenharmony_ciint32_t MMIService::AddGestureMonitor(InputHandlerType handlerType,
1955c29fa5a6Sopenharmony_ci    HandleEventType eventType, TouchGestureType gestureType, int32_t fingers)
1956c29fa5a6Sopenharmony_ci{
1957c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1958c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_TOUCH) && defined(OHOS_BUILD_ENABLE_MONITOR)
1959c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
1960c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
1961c29fa5a6Sopenharmony_ci        [this, pid, handlerType, eventType, gestureType, fingers]() -> int32_t {
1962c29fa5a6Sopenharmony_ci            if (((eventType & HANDLE_EVENT_TYPE_TOUCH_GESTURE) != HANDLE_EVENT_TYPE_TOUCH_GESTURE)) {
1963c29fa5a6Sopenharmony_ci                MMI_HILOGE("Illegal type:%{public}d", eventType);
1964c29fa5a6Sopenharmony_ci                return RET_ERR;
1965c29fa5a6Sopenharmony_ci            }
1966c29fa5a6Sopenharmony_ci            if (!GestureMonitorHandler::CheckMonitorValid(gestureType, fingers)) {
1967c29fa5a6Sopenharmony_ci                MMI_HILOGE("Wrong number of fingers:%{public}d", fingers);
1968c29fa5a6Sopenharmony_ci                return RET_ERR;
1969c29fa5a6Sopenharmony_ci            }
1970c29fa5a6Sopenharmony_ci            if (touchGestureAdapter_ == nullptr) {
1971c29fa5a6Sopenharmony_ci                touchGestureAdapter_ = TouchGestureAdapter::GetGestureFactory();
1972c29fa5a6Sopenharmony_ci            }
1973c29fa5a6Sopenharmony_ci            if (touchGestureAdapter_ != nullptr) {
1974c29fa5a6Sopenharmony_ci                touchGestureAdapter_->SetGestureCondition(true, gestureType, fingers);
1975c29fa5a6Sopenharmony_ci            }
1976c29fa5a6Sopenharmony_ci            if (delegateInterface_ != nullptr && !delegateInterface_->HasHandler("touchGesture")) {
1977c29fa5a6Sopenharmony_ci                auto fun = [this](std::shared_ptr<PointerEvent> event) -> int32_t {
1978c29fa5a6Sopenharmony_ci                    CHKPR(touchGestureAdapter_, ERROR_NULL_POINTER);
1979c29fa5a6Sopenharmony_ci                    touchGestureAdapter_->process(event);
1980c29fa5a6Sopenharmony_ci                    return RET_OK;
1981c29fa5a6Sopenharmony_ci                };
1982c29fa5a6Sopenharmony_ci                int32_t ret = delegateInterface_->AddHandler(InputHandlerType::MONITOR,
1983c29fa5a6Sopenharmony_ci                    {"touchGesture", HANDLE_EVENT_TYPE_POINTER, HandlerMode::SYNC, 0, 0, fun});
1984c29fa5a6Sopenharmony_ci                if (ret != RET_OK) {
1985c29fa5a6Sopenharmony_ci                    MMI_HILOGE("Failed to add gesture recognizer, ret:%{public}d", ret);
1986c29fa5a6Sopenharmony_ci                    return ret;
1987c29fa5a6Sopenharmony_ci                }
1988c29fa5a6Sopenharmony_ci            }
1989c29fa5a6Sopenharmony_ci            auto sess = GetSessionByPid(pid);
1990c29fa5a6Sopenharmony_ci            CHKPR(sess, ERROR_NULL_POINTER);
1991c29fa5a6Sopenharmony_ci            return sMsgHandler_.OnAddGestureMonitor(sess, handlerType, eventType, gestureType, fingers);
1992c29fa5a6Sopenharmony_ci        });
1993c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
1994c29fa5a6Sopenharmony_ci        MMI_HILOGE("Add gesture handler failed, ret:%{public}d", ret);
1995c29fa5a6Sopenharmony_ci        return ret;
1996c29fa5a6Sopenharmony_ci    }
1997c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_TOUCH && OHOS_BUILD_ENABLE_MONITOR
1998c29fa5a6Sopenharmony_ci    return RET_OK;
1999c29fa5a6Sopenharmony_ci}
2000c29fa5a6Sopenharmony_ci
2001c29fa5a6Sopenharmony_ciint32_t MMIService::RemoveGestureMonitor(InputHandlerType handlerType,
2002c29fa5a6Sopenharmony_ci    HandleEventType eventType, TouchGestureType gestureType, int32_t fingers)
2003c29fa5a6Sopenharmony_ci{
2004c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2005c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_TOUCH) && defined(OHOS_BUILD_ENABLE_MONITOR)
2006c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
2007c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2008c29fa5a6Sopenharmony_ci        [this, pid, handlerType, eventType, gestureType, fingers]() -> int32_t {
2009c29fa5a6Sopenharmony_ci            auto sess = GetSessionByPid(pid);
2010c29fa5a6Sopenharmony_ci            CHKPR(sess, ERROR_NULL_POINTER);
2011c29fa5a6Sopenharmony_ci            int32_t ret = sMsgHandler_.OnRemoveGestureMonitor(sess, handlerType, eventType, gestureType, fingers);
2012c29fa5a6Sopenharmony_ci            if (ret != RET_OK) {
2013c29fa5a6Sopenharmony_ci                MMI_HILOGE("Failed to remove gesture recognizer, ret:%{public}d", ret);
2014c29fa5a6Sopenharmony_ci                return ret;
2015c29fa5a6Sopenharmony_ci            }
2016c29fa5a6Sopenharmony_ci            auto monitorHandler = InputHandler->GetMonitorHandler();
2017c29fa5a6Sopenharmony_ci            if (monitorHandler && !monitorHandler->CheckHasInputHandler(HANDLE_EVENT_TYPE_TOUCH_GESTURE)) {
2018c29fa5a6Sopenharmony_ci                if (delegateInterface_ && delegateInterface_->HasHandler("touchGesture")) {
2019c29fa5a6Sopenharmony_ci                    delegateInterface_->RemoveHandler(InputHandlerType::MONITOR, "touchGesture");
2020c29fa5a6Sopenharmony_ci                }
2021c29fa5a6Sopenharmony_ci            }
2022c29fa5a6Sopenharmony_ci            if (touchGestureAdapter_) {
2023c29fa5a6Sopenharmony_ci                touchGestureAdapter_->SetGestureCondition(false, gestureType, fingers);
2024c29fa5a6Sopenharmony_ci            }
2025c29fa5a6Sopenharmony_ci            return RET_OK;
2026c29fa5a6Sopenharmony_ci        });
2027c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2028c29fa5a6Sopenharmony_ci        MMI_HILOGE("Remove gesture handler failed, ret:%{public}d", ret);
2029c29fa5a6Sopenharmony_ci        return ret;
2030c29fa5a6Sopenharmony_ci    }
2031c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_TOUCH && OHOS_BUILD_ENABLE_MONITOR
2032c29fa5a6Sopenharmony_ci    return RET_OK;
2033c29fa5a6Sopenharmony_ci}
2034c29fa5a6Sopenharmony_ci
2035c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_MONITOR
2036c29fa5a6Sopenharmony_ciint32_t MMIService::CheckMarkConsumed(int32_t pid, int32_t eventId)
2037c29fa5a6Sopenharmony_ci{
2038c29fa5a6Sopenharmony_ci    auto sess = GetSessionByPid(pid);
2039c29fa5a6Sopenharmony_ci    CHKPR(sess, ERROR_NULL_POINTER);
2040c29fa5a6Sopenharmony_ci    return sMsgHandler_.OnMarkConsumed(sess, eventId);
2041c29fa5a6Sopenharmony_ci}
2042c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_MONITOR
2043c29fa5a6Sopenharmony_ci
2044c29fa5a6Sopenharmony_ciint32_t MMIService::MarkEventConsumed(int32_t eventId)
2045c29fa5a6Sopenharmony_ci{
2046c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
2047c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_MONITOR
2048c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
2049c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2050c29fa5a6Sopenharmony_ci        [this, pid, eventId] {
2051c29fa5a6Sopenharmony_ci            return this->CheckMarkConsumed(pid, eventId);
2052c29fa5a6Sopenharmony_ci        }
2053c29fa5a6Sopenharmony_ci        );
2054c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2055c29fa5a6Sopenharmony_ci        MMI_HILOGE("Mark event consumed failed, ret:%{public}d", ret);
2056c29fa5a6Sopenharmony_ci        return ret;
2057c29fa5a6Sopenharmony_ci    }
2058c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_MONITOR
2059c29fa5a6Sopenharmony_ci    return RET_OK;
2060c29fa5a6Sopenharmony_ci}
2061c29fa5a6Sopenharmony_ci
2062c29fa5a6Sopenharmony_ciint32_t MMIService::MoveMouseEvent(int32_t offsetX, int32_t offsetY)
2063c29fa5a6Sopenharmony_ci{
2064c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
2065c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING)
2066c29fa5a6Sopenharmony_ci    int32_t ret =
2067c29fa5a6Sopenharmony_ci        delegateTasks_.PostSyncTask(
2068c29fa5a6Sopenharmony_ci            [this, offsetX, offsetY] {
2069c29fa5a6Sopenharmony_ci                return sMsgHandler_.OnMoveMouse(offsetX, offsetY);
2070c29fa5a6Sopenharmony_ci            }
2071c29fa5a6Sopenharmony_ci            );
2072c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2073c29fa5a6Sopenharmony_ci        MMI_HILOGE("The movemouse event processed failed, ret:%{public}d", ret);
2074c29fa5a6Sopenharmony_ci        return ret;
2075c29fa5a6Sopenharmony_ci    }
2076c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING
2077c29fa5a6Sopenharmony_ci    return RET_OK;
2078c29fa5a6Sopenharmony_ci}
2079c29fa5a6Sopenharmony_ci
2080c29fa5a6Sopenharmony_ciint32_t MMIService::InjectKeyEvent(const std::shared_ptr<KeyEvent> keyEvent, bool isNativeInject)
2081c29fa5a6Sopenharmony_ci{
2082c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
2083c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
2084c29fa5a6Sopenharmony_ci    int32_t ret;
2085c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
2086c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_ANCO
2087c29fa5a6Sopenharmony_ci    ret = InjectKeyEventExt(keyEvent, pid, isNativeInject);
2088c29fa5a6Sopenharmony_ci#else
2089c29fa5a6Sopenharmony_ci    ret = delegateTasks_.PostSyncTask(
2090c29fa5a6Sopenharmony_ci        [this, keyEvent, pid, isNativeInject] {
2091c29fa5a6Sopenharmony_ci            return this->CheckInjectKeyEvent(keyEvent, pid, isNativeInject);
2092c29fa5a6Sopenharmony_ci        }
2093c29fa5a6Sopenharmony_ci        );
2094c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_ANCO
2095c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2096c29fa5a6Sopenharmony_ci        MMI_HILOGE("Inject key event failed, ret:%{public}d", ret);
2097c29fa5a6Sopenharmony_ci        return ret;
2098c29fa5a6Sopenharmony_ci    }
2099c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
2100c29fa5a6Sopenharmony_ci    return RET_OK;
2101c29fa5a6Sopenharmony_ci}
2102c29fa5a6Sopenharmony_ci
2103c29fa5a6Sopenharmony_ciint32_t MMIService::CheckInjectKeyEvent(const std::shared_ptr<KeyEvent> keyEvent, int32_t pid, bool isNativeInject)
2104c29fa5a6Sopenharmony_ci{
2105c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
2106c29fa5a6Sopenharmony_ci    CHKPR(keyEvent, ERROR_NULL_POINTER);
2107c29fa5a6Sopenharmony_ci    LogTracer lt(keyEvent->GetId(), keyEvent->GetEventType(), keyEvent->GetKeyAction());
2108c29fa5a6Sopenharmony_ci    return sMsgHandler_.OnInjectKeyEvent(keyEvent, pid, isNativeInject);
2109c29fa5a6Sopenharmony_ci#else
2110c29fa5a6Sopenharmony_ci    return RET_OK;
2111c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
2112c29fa5a6Sopenharmony_ci}
2113c29fa5a6Sopenharmony_ci
2114c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
2115c29fa5a6Sopenharmony_ciint32_t MMIService::OnGetKeyState(std::vector<int32_t> &pressedKeys, std::map<int32_t, int32_t> &specialKeysState)
2116c29fa5a6Sopenharmony_ci{
2117c29fa5a6Sopenharmony_ci    auto keyEvent = KeyEventHdr->GetKeyEvent();
2118c29fa5a6Sopenharmony_ci    CHKPR(keyEvent, ERROR_NULL_POINTER);
2119c29fa5a6Sopenharmony_ci    pressedKeys = keyEvent->GetPressedKeys();
2120c29fa5a6Sopenharmony_ci    for (auto iter = pressedKeys.begin(); iter != pressedKeys.end();) {
2121c29fa5a6Sopenharmony_ci        if (g_keyCodeValueSet.find(*iter) == g_keyCodeValueSet.end()) {
2122c29fa5a6Sopenharmony_ci            iter = pressedKeys.erase(iter);
2123c29fa5a6Sopenharmony_ci            continue;
2124c29fa5a6Sopenharmony_ci        }
2125c29fa5a6Sopenharmony_ci        ++iter;
2126c29fa5a6Sopenharmony_ci    }
2127c29fa5a6Sopenharmony_ci    specialKeysState[KeyEvent::KEYCODE_CAPS_LOCK] =
2128c29fa5a6Sopenharmony_ci        static_cast<int32_t>(keyEvent->GetFunctionKey(KeyEvent::CAPS_LOCK_FUNCTION_KEY));
2129c29fa5a6Sopenharmony_ci    specialKeysState[KeyEvent::KEYCODE_SCROLL_LOCK] =
2130c29fa5a6Sopenharmony_ci        static_cast<int32_t>(keyEvent->GetFunctionKey(KeyEvent::SCROLL_LOCK_FUNCTION_KEY));
2131c29fa5a6Sopenharmony_ci    specialKeysState[KeyEvent::KEYCODE_NUM_LOCK] =
2132c29fa5a6Sopenharmony_ci        static_cast<int32_t>(keyEvent->GetFunctionKey(KeyEvent::NUM_LOCK_FUNCTION_KEY));
2133c29fa5a6Sopenharmony_ci    return RET_OK;
2134c29fa5a6Sopenharmony_ci}
2135c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
2136c29fa5a6Sopenharmony_ci
2137c29fa5a6Sopenharmony_ciint32_t MMIService::CheckInjectPointerEvent(const std::shared_ptr<PointerEvent> pointerEvent,
2138c29fa5a6Sopenharmony_ci    int32_t pid, bool isNativeInject, bool isShell)
2139c29fa5a6Sopenharmony_ci{
2140c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
2141c29fa5a6Sopenharmony_ci    CHKPR(pointerEvent, ERROR_NULL_POINTER);
2142c29fa5a6Sopenharmony_ci    LogTracer lt(pointerEvent->GetId(), pointerEvent->GetEventType(), pointerEvent->GetPointerAction());
2143c29fa5a6Sopenharmony_ci    return sMsgHandler_.OnInjectPointerEvent(pointerEvent, pid, isNativeInject, isShell);
2144c29fa5a6Sopenharmony_ci#else
2145c29fa5a6Sopenharmony_ci    return RET_OK;
2146c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
2147c29fa5a6Sopenharmony_ci}
2148c29fa5a6Sopenharmony_ci
2149c29fa5a6Sopenharmony_ciint32_t MMIService::InjectPointerEvent(const std::shared_ptr<PointerEvent> pointerEvent, bool isNativeInject)
2150c29fa5a6Sopenharmony_ci{
2151c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
2152c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
2153c29fa5a6Sopenharmony_ci    int32_t ret;
2154c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
2155c29fa5a6Sopenharmony_ci    bool isShell = PER_HELPER->RequestFromShell();
2156c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_ANCO
2157c29fa5a6Sopenharmony_ci    ret = InjectPointerEventExt(pointerEvent, pid, isNativeInject, isShell);
2158c29fa5a6Sopenharmony_ci#else
2159c29fa5a6Sopenharmony_ci    ret = delegateTasks_.PostSyncTask(
2160c29fa5a6Sopenharmony_ci        [this, pointerEvent, pid, isNativeInject, isShell] {
2161c29fa5a6Sopenharmony_ci            return this->CheckInjectPointerEvent(pointerEvent, pid, isNativeInject, isShell);
2162c29fa5a6Sopenharmony_ci        }
2163c29fa5a6Sopenharmony_ci        );
2164c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_ANCO
2165c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2166c29fa5a6Sopenharmony_ci        MMI_HILOGE("Inject pointer event failed, ret:%{public}d", ret);
2167c29fa5a6Sopenharmony_ci        return ret;
2168c29fa5a6Sopenharmony_ci    }
2169c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
2170c29fa5a6Sopenharmony_ci    return RET_OK;
2171c29fa5a6Sopenharmony_ci}
2172c29fa5a6Sopenharmony_ci
2173c29fa5a6Sopenharmony_ci#ifdef OHOS_RSS_CLIENT
2174c29fa5a6Sopenharmony_civoid MMIService::OnAddResSchedSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
2175c29fa5a6Sopenharmony_ci{
2176c29fa5a6Sopenharmony_ci    int sleepSeconds = 1;
2177c29fa5a6Sopenharmony_ci    sleep(sleepSeconds);
2178c29fa5a6Sopenharmony_ci    uint64_t tid = tid_.load();
2179c29fa5a6Sopenharmony_ci    int32_t userInteraction = 2;
2180c29fa5a6Sopenharmony_ci    std::unordered_map<std::string, std::string> payload;
2181c29fa5a6Sopenharmony_ci    payload["uid"] = std::to_string(getuid());
2182c29fa5a6Sopenharmony_ci    payload["pid"] = std::to_string(getpid());
2183c29fa5a6Sopenharmony_ci    payload["extType"] = "10002";
2184c29fa5a6Sopenharmony_ci    payload["tid"] = std::to_string(tid);
2185c29fa5a6Sopenharmony_ci    payload["isSa"] = "1";
2186c29fa5a6Sopenharmony_ci    payload["cgroupPrio"] = "1";
2187c29fa5a6Sopenharmony_ci    payload["threadName"] = "mmi_service";
2188c29fa5a6Sopenharmony_ci    ResourceSchedule::ResSchedClient::GetInstance().ReportData(
2189c29fa5a6Sopenharmony_ci        ResourceSchedule::ResType::RES_TYPE_KEY_PERF_SCENE, userInteraction, payload);
2190c29fa5a6Sopenharmony_ci}
2191c29fa5a6Sopenharmony_ci#endif // OHOS_RSS_CLIENT
2192c29fa5a6Sopenharmony_ci
2193c29fa5a6Sopenharmony_civoid MMIService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
2194c29fa5a6Sopenharmony_ci{
2195c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2196c29fa5a6Sopenharmony_ci    MMI_HILOGI("systemAbilityId is %{public}d", systemAbilityId);
2197c29fa5a6Sopenharmony_ci#ifdef OHOS_RSS_CLIENT
2198c29fa5a6Sopenharmony_ci    if (systemAbilityId == RES_SCHED_SYS_ABILITY_ID) {
2199c29fa5a6Sopenharmony_ci        OnAddResSchedSystemAbility(systemAbilityId, deviceId);
2200c29fa5a6Sopenharmony_ci    }
2201c29fa5a6Sopenharmony_ci#endif // OHOS_RSS_CLIENT
2202c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_FINGERSENSE_WRAPPER
2203c29fa5a6Sopenharmony_ci    if (systemAbilityId == COMMON_EVENT_SERVICE_ID) {
2204c29fa5a6Sopenharmony_ci        isCesStart_ = true;
2205c29fa5a6Sopenharmony_ci    }
2206c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_FINGERSENSE_WRAPPER
2207c29fa5a6Sopenharmony_ci    if (systemAbilityId == APP_MGR_SERVICE_ID) {
2208c29fa5a6Sopenharmony_ci        APP_OBSERVER_MGR->InitAppStateObserver();
2209c29fa5a6Sopenharmony_ci    }
2210c29fa5a6Sopenharmony_ci    if (systemAbilityId == COMMON_EVENT_SERVICE_ID) {
2211c29fa5a6Sopenharmony_ci        DEVICE_MONITOR->InitCommonEventSubscriber();
2212c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_KEYBOARD) && defined(OHOS_BUILD_ENABLE_FINGERSENSE_WRAPPER)
2213c29fa5a6Sopenharmony_ci        DISPLAY_MONITOR->InitCommonEventSubscriber();
2214c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD && OHOS_BUILD_ENABLE_FINGERSENSE_WRAPPER
2215c29fa5a6Sopenharmony_ci    }
2216c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING)
2217c29fa5a6Sopenharmony_ci    if (systemAbilityId == RENDER_SERVICE) {
2218c29fa5a6Sopenharmony_ci        IPointerDrawingManager::GetInstance()->InitPointerCallback();
2219c29fa5a6Sopenharmony_ci    }
2220c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING
2221c29fa5a6Sopenharmony_ci    if (systemAbilityId == DISPLAY_MANAGER_SERVICE_SA_ID) {
2222c29fa5a6Sopenharmony_ci        WIN_MGR->SetFoldState();
2223c29fa5a6Sopenharmony_ci    }
2224c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING)
2225c29fa5a6Sopenharmony_ci    if (systemAbilityId == DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID) {
2226c29fa5a6Sopenharmony_ci        if (SettingDataShare::GetInstance(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID).CheckIfSettingsDataReady()) {
2227c29fa5a6Sopenharmony_ci            IPointerDrawingManager::GetInstance()->InitPointerObserver();
2228c29fa5a6Sopenharmony_ci            auto keyHandler = InputHandler->GetKeyCommandHandler();
2229c29fa5a6Sopenharmony_ci            if (keyHandler != nullptr) {
2230c29fa5a6Sopenharmony_ci                keyHandler->InitKeyObserver();
2231c29fa5a6Sopenharmony_ci            }
2232c29fa5a6Sopenharmony_ci        }
2233c29fa5a6Sopenharmony_ci    }
2234c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING
2235c29fa5a6Sopenharmony_ci}
2236c29fa5a6Sopenharmony_ci
2237c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_MONITOR) && defined(PLAYER_FRAMEWORK_EXISTS)
2238c29fa5a6Sopenharmony_civoid MMIService::ScreenCaptureCallback(int32_t pid, bool isStart)
2239c29fa5a6Sopenharmony_ci{
2240c29fa5a6Sopenharmony_ci    auto service = MMIService::GetInstance();
2241c29fa5a6Sopenharmony_ci    CHKPV(service);
2242c29fa5a6Sopenharmony_ci    int32_t ret = service->delegateTasks_.PostSyncTask(
2243c29fa5a6Sopenharmony_ci        [pid, isStart] {
2244c29fa5a6Sopenharmony_ci            auto monitorHandler = InputHandler->GetMonitorHandler();
2245c29fa5a6Sopenharmony_ci            CHKPR(monitorHandler, RET_ERR);
2246c29fa5a6Sopenharmony_ci            monitorHandler->ProcessScreenCapture(pid, isStart);
2247c29fa5a6Sopenharmony_ci            return RET_OK;
2248c29fa5a6Sopenharmony_ci        });
2249c29fa5a6Sopenharmony_ci}
2250c29fa5a6Sopenharmony_ci
2251c29fa5a6Sopenharmony_civoid MMIService::RegisterScreenCaptureCallback()
2252c29fa5a6Sopenharmony_ci{
2253c29fa5a6Sopenharmony_ci    if (hasRegisterListener_) {
2254c29fa5a6Sopenharmony_ci        return;
2255c29fa5a6Sopenharmony_ci    }
2256c29fa5a6Sopenharmony_ci    InputScreenCaptureAgent::GetInstance().RegisterListener(ScreenCaptureCallback);
2257c29fa5a6Sopenharmony_ci    hasRegisterListener_ = true;
2258c29fa5a6Sopenharmony_ci}
2259c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_MONITOR && PLAYER_FRAMEWORK_EXISTS
2260c29fa5a6Sopenharmony_ci
2261c29fa5a6Sopenharmony_ciint32_t MMIService::SubscribeKeyEvent(int32_t subscribeId, const std::shared_ptr<KeyOption> option)
2262c29fa5a6Sopenharmony_ci{
2263c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
2264c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
2265c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
2266c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2267c29fa5a6Sopenharmony_ci        [this, pid, subscribeId, option] {
2268c29fa5a6Sopenharmony_ci            return sMsgHandler_.OnSubscribeKeyEvent(this, pid, subscribeId, option);
2269c29fa5a6Sopenharmony_ci        });
2270c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2271c29fa5a6Sopenharmony_ci        MMI_HILOGE("The subscribe key event processed failed, ret:%{public}d", ret);
2272c29fa5a6Sopenharmony_ci        return ret;
2273c29fa5a6Sopenharmony_ci    }
2274c29fa5a6Sopenharmony_ci    if (NapProcess::GetInstance()->GetNapClientPid() != REMOVE_OBSERVER) {
2275c29fa5a6Sopenharmony_ci        OHOS::MMI::NapProcess::NapStatusData napData;
2276c29fa5a6Sopenharmony_ci        napData.pid = GetCallingPid();
2277c29fa5a6Sopenharmony_ci        napData.uid = GetCallingUid();
2278c29fa5a6Sopenharmony_ci        auto sess = GetSessionByPid(pid);
2279c29fa5a6Sopenharmony_ci        CHKPR(sess, ERROR_NULL_POINTER);
2280c29fa5a6Sopenharmony_ci        napData.bundleName = sess->GetProgramName();
2281c29fa5a6Sopenharmony_ci        int32_t syncState = SUBSCRIBED;
2282c29fa5a6Sopenharmony_ci        MMI_HILOGD("SubscribeKeyEvent info to observer : pid:%{public}d, uid:%{public}d, bundleName:%{public}s",
2283c29fa5a6Sopenharmony_ci            napData.pid, napData.uid, napData.bundleName.c_str());
2284c29fa5a6Sopenharmony_ci        NapProcess::GetInstance()->AddMmiSubscribedEventData(napData, syncState);
2285c29fa5a6Sopenharmony_ci        if (NapProcess::GetInstance()->GetNapClientPid() != UNOBSERVED) {
2286c29fa5a6Sopenharmony_ci            NapProcess::GetInstance()->NotifyBundleName(napData, syncState);
2287c29fa5a6Sopenharmony_ci        }
2288c29fa5a6Sopenharmony_ci    }
2289c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
2290c29fa5a6Sopenharmony_ci    return RET_OK;
2291c29fa5a6Sopenharmony_ci}
2292c29fa5a6Sopenharmony_ci
2293c29fa5a6Sopenharmony_ciint32_t MMIService::UnsubscribeKeyEvent(int32_t subscribeId)
2294c29fa5a6Sopenharmony_ci{
2295c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2296c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
2297c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
2298c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2299c29fa5a6Sopenharmony_ci        [this, pid, subscribeId] {
2300c29fa5a6Sopenharmony_ci            return sMsgHandler_.OnUnsubscribeKeyEvent(this, pid, subscribeId);
2301c29fa5a6Sopenharmony_ci        });
2302c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2303c29fa5a6Sopenharmony_ci        MMI_HILOGE("The unsubscribe key event processed failed, ret:%{public}d", ret);
2304c29fa5a6Sopenharmony_ci        return ret;
2305c29fa5a6Sopenharmony_ci    }
2306c29fa5a6Sopenharmony_ci    if (NapProcess::GetInstance()->GetNapClientPid() != REMOVE_OBSERVER) {
2307c29fa5a6Sopenharmony_ci        OHOS::MMI::NapProcess::NapStatusData napData;
2308c29fa5a6Sopenharmony_ci        napData.pid = GetCallingPid();
2309c29fa5a6Sopenharmony_ci        napData.uid = GetCallingUid();
2310c29fa5a6Sopenharmony_ci        auto sess = GetSessionByPid(pid);
2311c29fa5a6Sopenharmony_ci        CHKPR(sess, ERROR_NULL_POINTER);
2312c29fa5a6Sopenharmony_ci        napData.bundleName = sess->GetProgramName();
2313c29fa5a6Sopenharmony_ci        int32_t syncState = UNSUBSCRIBED;
2314c29fa5a6Sopenharmony_ci        MMI_HILOGD("UnsubscribeKeyEvent info to observer : pid:%{public}d, uid:%{public}d, bundleName:%{public}s",
2315c29fa5a6Sopenharmony_ci            napData.pid, napData.uid, napData.bundleName.c_str());
2316c29fa5a6Sopenharmony_ci        NapProcess::GetInstance()->AddMmiSubscribedEventData(napData, syncState);
2317c29fa5a6Sopenharmony_ci        if (NapProcess::GetInstance()->GetNapClientPid() != UNOBSERVED) {
2318c29fa5a6Sopenharmony_ci            NapProcess::GetInstance()->NotifyBundleName(napData, syncState);
2319c29fa5a6Sopenharmony_ci        }
2320c29fa5a6Sopenharmony_ci    }
2321c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
2322c29fa5a6Sopenharmony_ci    return RET_OK;
2323c29fa5a6Sopenharmony_ci}
2324c29fa5a6Sopenharmony_ci
2325c29fa5a6Sopenharmony_ciint32_t MMIService::SubscribeHotkey(int32_t subscribeId, const std::shared_ptr<KeyOption> option)
2326c29fa5a6Sopenharmony_ci{
2327c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
2328c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
2329c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
2330c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2331c29fa5a6Sopenharmony_ci        [this, pid, subscribeId, option] {
2332c29fa5a6Sopenharmony_ci            return sMsgHandler_.OnSubscribeHotkey(this, pid, subscribeId, option);
2333c29fa5a6Sopenharmony_ci        });
2334c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2335c29fa5a6Sopenharmony_ci        MMI_HILOGE("ServerMsgHandler::OnSubscribeHotkey fail, error:%{public}d", ret);
2336c29fa5a6Sopenharmony_ci        return ret;
2337c29fa5a6Sopenharmony_ci    }
2338c29fa5a6Sopenharmony_ci    if (NapProcess::GetInstance()->GetNapClientPid() != REMOVE_OBSERVER) {
2339c29fa5a6Sopenharmony_ci        OHOS::MMI::NapProcess::NapStatusData napData;
2340c29fa5a6Sopenharmony_ci        napData.pid = GetCallingPid();
2341c29fa5a6Sopenharmony_ci        napData.uid = GetCallingUid();
2342c29fa5a6Sopenharmony_ci        auto sess = GetSessionByPid(pid);
2343c29fa5a6Sopenharmony_ci        CHKPR(sess, ERROR_NULL_POINTER);
2344c29fa5a6Sopenharmony_ci        napData.bundleName = sess->GetProgramName();
2345c29fa5a6Sopenharmony_ci        int32_t syncState = SUBSCRIBED;
2346c29fa5a6Sopenharmony_ci        MMI_HILOGD("SubscribeHotkey info to observer : pid:%{public}d, bundleName:%{public}s",
2347c29fa5a6Sopenharmony_ci            napData.pid, napData.bundleName.c_str());
2348c29fa5a6Sopenharmony_ci        NapProcess::GetInstance()->AddMmiSubscribedEventData(napData, syncState);
2349c29fa5a6Sopenharmony_ci        if (NapProcess::GetInstance()->GetNapClientPid() != UNOBSERVED) {
2350c29fa5a6Sopenharmony_ci            NapProcess::GetInstance()->NotifyBundleName(napData, syncState);
2351c29fa5a6Sopenharmony_ci        }
2352c29fa5a6Sopenharmony_ci    }
2353c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
2354c29fa5a6Sopenharmony_ci    return RET_OK;
2355c29fa5a6Sopenharmony_ci}
2356c29fa5a6Sopenharmony_ci
2357c29fa5a6Sopenharmony_ciint32_t MMIService::UnsubscribeHotkey(int32_t subscribeId)
2358c29fa5a6Sopenharmony_ci{
2359c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2360c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
2361c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
2362c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2363c29fa5a6Sopenharmony_ci        [this, pid, subscribeId] {
2364c29fa5a6Sopenharmony_ci            return sMsgHandler_.OnUnsubscribeHotkey(this, pid, subscribeId);
2365c29fa5a6Sopenharmony_ci        });
2366c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2367c29fa5a6Sopenharmony_ci        MMI_HILOGE("ServerMsgHandler::OnUnsubscribeHotkey fail, error:%{public}d", ret);
2368c29fa5a6Sopenharmony_ci        return ret;
2369c29fa5a6Sopenharmony_ci    }
2370c29fa5a6Sopenharmony_ci    if (NapProcess::GetInstance()->GetNapClientPid() != REMOVE_OBSERVER) {
2371c29fa5a6Sopenharmony_ci        OHOS::MMI::NapProcess::NapStatusData napData;
2372c29fa5a6Sopenharmony_ci        napData.pid = GetCallingPid();
2373c29fa5a6Sopenharmony_ci        napData.uid = GetCallingUid();
2374c29fa5a6Sopenharmony_ci        auto sess = GetSessionByPid(pid);
2375c29fa5a6Sopenharmony_ci        CHKPR(sess, ERROR_NULL_POINTER);
2376c29fa5a6Sopenharmony_ci        napData.bundleName = sess->GetProgramName();
2377c29fa5a6Sopenharmony_ci        int32_t syncState = UNSUBSCRIBED;
2378c29fa5a6Sopenharmony_ci        MMI_HILOGD("UnsubscribeHotkey info to observer : pid:%{public}d, bundleName:%{public}s",
2379c29fa5a6Sopenharmony_ci            napData.pid, napData.bundleName.c_str());
2380c29fa5a6Sopenharmony_ci        NapProcess::GetInstance()->AddMmiSubscribedEventData(napData, syncState);
2381c29fa5a6Sopenharmony_ci        if (NapProcess::GetInstance()->GetNapClientPid() != UNOBSERVED) {
2382c29fa5a6Sopenharmony_ci            NapProcess::GetInstance()->NotifyBundleName(napData, syncState);
2383c29fa5a6Sopenharmony_ci        }
2384c29fa5a6Sopenharmony_ci    }
2385c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
2386c29fa5a6Sopenharmony_ci    return RET_OK;
2387c29fa5a6Sopenharmony_ci}
2388c29fa5a6Sopenharmony_ci
2389c29fa5a6Sopenharmony_ciint32_t MMIService::SubscribeSwitchEvent(int32_t subscribeId, int32_t switchType)
2390c29fa5a6Sopenharmony_ci{
2391c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2392c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_SWITCH
2393c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
2394c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2395c29fa5a6Sopenharmony_ci        [this, pid, subscribeId, switchType] {
2396c29fa5a6Sopenharmony_ci            return sMsgHandler_.OnSubscribeSwitchEvent(this, pid, subscribeId, switchType);
2397c29fa5a6Sopenharmony_ci        }
2398c29fa5a6Sopenharmony_ci        );
2399c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2400c29fa5a6Sopenharmony_ci        MMI_HILOGE("The subscribe switch event processed failed, ret:%{public}d", ret);
2401c29fa5a6Sopenharmony_ci        return ret;
2402c29fa5a6Sopenharmony_ci    }
2403c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_SWITCH
2404c29fa5a6Sopenharmony_ci    return RET_OK;
2405c29fa5a6Sopenharmony_ci}
2406c29fa5a6Sopenharmony_ci
2407c29fa5a6Sopenharmony_ciint32_t MMIService::UnsubscribeSwitchEvent(int32_t subscribeId)
2408c29fa5a6Sopenharmony_ci{
2409c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2410c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_SWITCH
2411c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
2412c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2413c29fa5a6Sopenharmony_ci        [this, pid, subscribeId] {
2414c29fa5a6Sopenharmony_ci            return sMsgHandler_.OnUnsubscribeSwitchEvent(this, pid, subscribeId);
2415c29fa5a6Sopenharmony_ci        }
2416c29fa5a6Sopenharmony_ci        );
2417c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2418c29fa5a6Sopenharmony_ci        MMI_HILOGE("The unsubscribe switch event processed failed, ret:%{public}d", ret);
2419c29fa5a6Sopenharmony_ci        return ret;
2420c29fa5a6Sopenharmony_ci    }
2421c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_SWITCH
2422c29fa5a6Sopenharmony_ci    return RET_OK;
2423c29fa5a6Sopenharmony_ci}
2424c29fa5a6Sopenharmony_ci
2425c29fa5a6Sopenharmony_ciint32_t MMIService::SetAnrObserver()
2426c29fa5a6Sopenharmony_ci{
2427c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2428c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
2429c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2430c29fa5a6Sopenharmony_ci        [pid] {
2431c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<ANRManager>::GetInstance()->SetANRNoticedPid(pid);
2432c29fa5a6Sopenharmony_ci        }
2433c29fa5a6Sopenharmony_ci        );
2434c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2435c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set ANRNoticed pid failed, ret:%{public}d", ret);
2436c29fa5a6Sopenharmony_ci        return ret;
2437c29fa5a6Sopenharmony_ci    }
2438c29fa5a6Sopenharmony_ci    return RET_OK;
2439c29fa5a6Sopenharmony_ci}
2440c29fa5a6Sopenharmony_ci
2441c29fa5a6Sopenharmony_ciint32_t MMIService::GetDisplayBindInfo(DisplayBindInfos &infos)
2442c29fa5a6Sopenharmony_ci{
2443c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2444c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2445c29fa5a6Sopenharmony_ci        [&infos] {
2446c29fa5a6Sopenharmony_ci            return ::OHOS::MMI::IInputWindowsManager::GetInstance()->GetDisplayBindInfo(infos);
2447c29fa5a6Sopenharmony_ci        }
2448c29fa5a6Sopenharmony_ci        );
2449c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2450c29fa5a6Sopenharmony_ci        MMI_HILOGE("GetDisplayBindInfo pid failed, ret:%{public}d", ret);
2451c29fa5a6Sopenharmony_ci        return ret;
2452c29fa5a6Sopenharmony_ci    }
2453c29fa5a6Sopenharmony_ci    return RET_OK;
2454c29fa5a6Sopenharmony_ci}
2455c29fa5a6Sopenharmony_ci
2456c29fa5a6Sopenharmony_ciint32_t MMIService::GetAllMmiSubscribedEvents(std::map<std::tuple<int32_t, int32_t, std::string>, int32_t> &datas)
2457c29fa5a6Sopenharmony_ci{
2458c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2459c29fa5a6Sopenharmony_ci    NapProcess::GetInstance()->GetAllMmiSubscribedEvents(datas);
2460c29fa5a6Sopenharmony_ci    return RET_OK;
2461c29fa5a6Sopenharmony_ci}
2462c29fa5a6Sopenharmony_ci
2463c29fa5a6Sopenharmony_ciint32_t MMIService::SetDisplayBind(int32_t deviceId, int32_t displayId, std::string &msg)
2464c29fa5a6Sopenharmony_ci{
2465c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2466c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2467c29fa5a6Sopenharmony_ci        [deviceId, displayId, &msg] {
2468c29fa5a6Sopenharmony_ci            return ::OHOS::MMI::IInputWindowsManager::GetInstance()->SetDisplayBind(deviceId, displayId, msg);
2469c29fa5a6Sopenharmony_ci        }
2470c29fa5a6Sopenharmony_ci        );
2471c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2472c29fa5a6Sopenharmony_ci        MMI_HILOGE("SetDisplayBind pid failed, ret:%{public}d", ret);
2473c29fa5a6Sopenharmony_ci        return ret;
2474c29fa5a6Sopenharmony_ci    }
2475c29fa5a6Sopenharmony_ci    return RET_OK;
2476c29fa5a6Sopenharmony_ci}
2477c29fa5a6Sopenharmony_ci
2478c29fa5a6Sopenharmony_ciint32_t MMIService::GetFunctionKeyState(int32_t funcKey, bool &state)
2479c29fa5a6Sopenharmony_ci{
2480c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2481c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
2482c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2483c29fa5a6Sopenharmony_ci        [this, funcKey, &state] {
2484c29fa5a6Sopenharmony_ci            return sMsgHandler_.OnGetFunctionKeyState(funcKey, state);
2485c29fa5a6Sopenharmony_ci        }
2486c29fa5a6Sopenharmony_ci        );
2487c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2488c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to get the keyboard status, ret:%{public}d", ret);
2489c29fa5a6Sopenharmony_ci        return ret;
2490c29fa5a6Sopenharmony_ci    }
2491c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
2492c29fa5a6Sopenharmony_ci    return RET_OK;
2493c29fa5a6Sopenharmony_ci}
2494c29fa5a6Sopenharmony_ci
2495c29fa5a6Sopenharmony_ciint32_t MMIService::SetFunctionKeyState(int32_t funcKey, bool enable)
2496c29fa5a6Sopenharmony_ci{
2497c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2498c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
2499c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2500c29fa5a6Sopenharmony_ci        [this, funcKey, enable] {
2501c29fa5a6Sopenharmony_ci            return sMsgHandler_.OnSetFunctionKeyState(funcKey, enable);
2502c29fa5a6Sopenharmony_ci        }
2503c29fa5a6Sopenharmony_ci        );
2504c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2505c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to update the keyboard status, ret:%{public}d", ret);
2506c29fa5a6Sopenharmony_ci        return ret;
2507c29fa5a6Sopenharmony_ci    }
2508c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
2509c29fa5a6Sopenharmony_ci    return RET_OK;
2510c29fa5a6Sopenharmony_ci}
2511c29fa5a6Sopenharmony_ci
2512c29fa5a6Sopenharmony_ciint32_t MMIService::SetPointerLocation(int32_t x, int32_t y)
2513c29fa5a6Sopenharmony_ci{
2514c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2515c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING)
2516c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2517c29fa5a6Sopenharmony_ci        [x, y] {
2518c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<MouseEventNormalize>::GetInstance()->SetPointerLocation(x, y);
2519c29fa5a6Sopenharmony_ci        }
2520c29fa5a6Sopenharmony_ci        );
2521c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2522c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set pointer location failed, ret:%{public}d", ret);
2523c29fa5a6Sopenharmony_ci        return ret;
2524c29fa5a6Sopenharmony_ci    }
2525c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING
2526c29fa5a6Sopenharmony_ci    return RET_OK;
2527c29fa5a6Sopenharmony_ci}
2528c29fa5a6Sopenharmony_ci
2529c29fa5a6Sopenharmony_civoid MMIService::OnDelegateTask(epoll_event &ev)
2530c29fa5a6Sopenharmony_ci{
2531c29fa5a6Sopenharmony_ci    if ((ev.events & EPOLLIN) == 0) {
2532c29fa5a6Sopenharmony_ci        MMI_HILOGW("Not epollin");
2533c29fa5a6Sopenharmony_ci        return;
2534c29fa5a6Sopenharmony_ci    }
2535c29fa5a6Sopenharmony_ci    DelegateTasks::TaskData data = {};
2536c29fa5a6Sopenharmony_ci    auto res = read(delegateTasks_.GetReadFd(), &data, sizeof(data));
2537c29fa5a6Sopenharmony_ci    if (res == -1) {
2538c29fa5a6Sopenharmony_ci        MMI_HILOGW("Read failed erron:%{public}d", errno);
2539c29fa5a6Sopenharmony_ci    }
2540c29fa5a6Sopenharmony_ci    MMI_HILOGD("RemoteRequest notify td:%{public}" PRId64 ",std:%{public}" PRId64 ""
2541c29fa5a6Sopenharmony_ci        ",taskId:%{public}d",
2542c29fa5a6Sopenharmony_ci        GetThisThreadId(), data.tid, data.taskId);
2543c29fa5a6Sopenharmony_ci    delegateTasks_.ProcessTasks();
2544c29fa5a6Sopenharmony_ci}
2545c29fa5a6Sopenharmony_ci
2546c29fa5a6Sopenharmony_civoid MMIService::OnThread()
2547c29fa5a6Sopenharmony_ci{
2548c29fa5a6Sopenharmony_ci    SetThreadName(std::string("mmi_service"));
2549c29fa5a6Sopenharmony_ci    uint64_t tid = GetThisThreadId();
2550c29fa5a6Sopenharmony_ci    delegateTasks_.SetWorkerThreadId(tid);
2551c29fa5a6Sopenharmony_ci    MMI_HILOGI("Main worker thread start. tid:%{public}" PRId64 "", tid);
2552c29fa5a6Sopenharmony_ci#ifdef OHOS_RSS_CLIENT
2553c29fa5a6Sopenharmony_ci    tid_.store(tid);
2554c29fa5a6Sopenharmony_ci#endif // OHOS_RSS_CLIENT
2555c29fa5a6Sopenharmony_ci    libinputAdapter_.ProcessPendingEvents();
2556c29fa5a6Sopenharmony_ci    while (state_ == ServiceRunningState::STATE_RUNNING) {
2557c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_FINGERSENSE_WRAPPER) && defined(OHOS_BUILD_ENABLE_KEYBOARD)
2558c29fa5a6Sopenharmony_ci        if (isCesStart_ && !DISPLAY_MONITOR->IsCommonEventSubscriberInit()) {
2559c29fa5a6Sopenharmony_ci            DISPLAY_MONITOR->InitCommonEventSubscriber();
2560c29fa5a6Sopenharmony_ci        }
2561c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_FINGERSENSE_WRAPPER && OHOS_BUILD_ENABLE_KEYBOARD
2562c29fa5a6Sopenharmony_ci        epoll_event ev[MAX_EVENT_SIZE] = {};
2563c29fa5a6Sopenharmony_ci        int32_t timeout = TimerMgr->CalcNextDelay();
2564c29fa5a6Sopenharmony_ci        MMI_HILOGD("timeout:%{public}d", timeout);
2565c29fa5a6Sopenharmony_ci        int32_t count = EpollWait(ev[0], MAX_EVENT_SIZE, timeout, mmiFd_);
2566c29fa5a6Sopenharmony_ci        for (int32_t i = 0; i < count && state_ == ServiceRunningState::STATE_RUNNING; i++) {
2567c29fa5a6Sopenharmony_ci            auto mmiEdIter = epollEventMap_.find(ev[i].data.fd);
2568c29fa5a6Sopenharmony_ci            if (mmiEdIter == epollEventMap_.end()) {
2569c29fa5a6Sopenharmony_ci                MMI_HILOGW("Invalid event %{public}d %{public}d", ev[i].data.fd, count);
2570c29fa5a6Sopenharmony_ci                continue;
2571c29fa5a6Sopenharmony_ci            }
2572c29fa5a6Sopenharmony_ci            std::shared_ptr<mmi_epoll_event> mmiEd = mmiEdIter->second;
2573c29fa5a6Sopenharmony_ci            CHKPC(mmiEd);
2574c29fa5a6Sopenharmony_ci            epoll_event event = ev[i];
2575c29fa5a6Sopenharmony_ci            if (mmiEd->event_type == EPOLL_EVENT_INPUT) {
2576c29fa5a6Sopenharmony_ci                CalculateFuntionRunningTime([this, &mmiEd] () { libinputAdapter_.EventDispatch(mmiEd->fd); },
2577c29fa5a6Sopenharmony_ci                    "EPOLL_EVENT_INPUT");
2578c29fa5a6Sopenharmony_ci            } else if (mmiEd->event_type == EPOLL_EVENT_SOCKET) {
2579c29fa5a6Sopenharmony_ci                CalculateFuntionRunningTime([this, &event]() { this->OnEpollEvent(event); }, "MMI:EPOLL_EVENT_SOCKET");
2580c29fa5a6Sopenharmony_ci            } else if (mmiEd->event_type == EPOLL_EVENT_SIGNAL) {
2581c29fa5a6Sopenharmony_ci                OnSignalEvent(mmiEd->fd);
2582c29fa5a6Sopenharmony_ci            } else if (mmiEd->event_type == EPOLL_EVENT_ETASK) {
2583c29fa5a6Sopenharmony_ci                CalculateFuntionRunningTime([this, &event]() { this->OnDelegateTask(event); }, "MMI:EPOLL_EVENT_ETASK");
2584c29fa5a6Sopenharmony_ci            } else {
2585c29fa5a6Sopenharmony_ci                MMI_HILOGW("Unknown epoll event type:%{public}d", mmiEd->event_type);
2586c29fa5a6Sopenharmony_ci            }
2587c29fa5a6Sopenharmony_ci        }
2588c29fa5a6Sopenharmony_ci        TimerMgr->ProcessTimers();
2589c29fa5a6Sopenharmony_ci        if (state_ != ServiceRunningState::STATE_RUNNING) {
2590c29fa5a6Sopenharmony_ci            break;
2591c29fa5a6Sopenharmony_ci        }
2592c29fa5a6Sopenharmony_ci    }
2593c29fa5a6Sopenharmony_ci    MMI_HILOGI("Main worker thread stop. tid:%{public}" PRId64 "", tid);
2594c29fa5a6Sopenharmony_ci}
2595c29fa5a6Sopenharmony_ci
2596c29fa5a6Sopenharmony_cibool MMIService::InitSignalHandler()
2597c29fa5a6Sopenharmony_ci{
2598c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
2599c29fa5a6Sopenharmony_ci    sigset_t mask = { 0 };
2600c29fa5a6Sopenharmony_ci    int32_t retCode = sigfillset(&mask);
2601c29fa5a6Sopenharmony_ci    if (retCode < 0) {
2602c29fa5a6Sopenharmony_ci        MMI_HILOGE("Fill signal set failed:%{public}d", errno);
2603c29fa5a6Sopenharmony_ci        return false;
2604c29fa5a6Sopenharmony_ci    }
2605c29fa5a6Sopenharmony_ci
2606c29fa5a6Sopenharmony_ci    retCode = sigprocmask(SIG_SETMASK, &mask, nullptr);
2607c29fa5a6Sopenharmony_ci    if (retCode < 0) {
2608c29fa5a6Sopenharmony_ci        MMI_HILOGE("Sigprocmask failed:%{public}d", errno);
2609c29fa5a6Sopenharmony_ci        return false;
2610c29fa5a6Sopenharmony_ci    }
2611c29fa5a6Sopenharmony_ci
2612c29fa5a6Sopenharmony_ci    int32_t fdSignal = signalfd(-1, &mask, SFD_NONBLOCK | SFD_CLOEXEC);
2613c29fa5a6Sopenharmony_ci    if (fdSignal < 0) {
2614c29fa5a6Sopenharmony_ci        MMI_HILOGE("Signal fd failed:%{public}d", errno);
2615c29fa5a6Sopenharmony_ci        return false;
2616c29fa5a6Sopenharmony_ci    }
2617c29fa5a6Sopenharmony_ci
2618c29fa5a6Sopenharmony_ci    retCode = AddEpoll(EPOLL_EVENT_SIGNAL, fdSignal);
2619c29fa5a6Sopenharmony_ci    if (retCode < 0) {
2620c29fa5a6Sopenharmony_ci        MMI_HILOGE("AddEpoll signalFd failed:%{public}d", retCode);
2621c29fa5a6Sopenharmony_ci        close(fdSignal);
2622c29fa5a6Sopenharmony_ci        return false;
2623c29fa5a6Sopenharmony_ci    }
2624c29fa5a6Sopenharmony_ci    return true;
2625c29fa5a6Sopenharmony_ci}
2626c29fa5a6Sopenharmony_ci
2627c29fa5a6Sopenharmony_civoid MMIService::OnSignalEvent(int32_t signalFd)
2628c29fa5a6Sopenharmony_ci{
2629c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
2630c29fa5a6Sopenharmony_ci    signalfd_siginfo sigInfo;
2631c29fa5a6Sopenharmony_ci    int32_t size = ::read(signalFd, &sigInfo, sizeof(signalfd_siginfo));
2632c29fa5a6Sopenharmony_ci    if (size != static_cast<int32_t>(sizeof(signalfd_siginfo))) {
2633c29fa5a6Sopenharmony_ci        MMI_HILOGE("Read signal info failed, invalid size:%{public}d, errno:%{public}d", size, errno);
2634c29fa5a6Sopenharmony_ci        return;
2635c29fa5a6Sopenharmony_ci    }
2636c29fa5a6Sopenharmony_ci    int32_t signo = static_cast<int32_t>(sigInfo.ssi_signo);
2637c29fa5a6Sopenharmony_ci    MMI_HILOGD("Receive signal:%{public}d", signo);
2638c29fa5a6Sopenharmony_ci    switch (signo) {
2639c29fa5a6Sopenharmony_ci        case SIGINT:
2640c29fa5a6Sopenharmony_ci        case SIGQUIT:
2641c29fa5a6Sopenharmony_ci        case SIGILL:
2642c29fa5a6Sopenharmony_ci        case SIGABRT:
2643c29fa5a6Sopenharmony_ci        case SIGBUS:
2644c29fa5a6Sopenharmony_ci        case SIGFPE:
2645c29fa5a6Sopenharmony_ci        case SIGKILL:
2646c29fa5a6Sopenharmony_ci        case SIGSEGV:
2647c29fa5a6Sopenharmony_ci        case SIGTERM: {
2648c29fa5a6Sopenharmony_ci            state_ = ServiceRunningState::STATE_EXIT;
2649c29fa5a6Sopenharmony_ci            break;
2650c29fa5a6Sopenharmony_ci        }
2651c29fa5a6Sopenharmony_ci        default: {
2652c29fa5a6Sopenharmony_ci            break;
2653c29fa5a6Sopenharmony_ci        }
2654c29fa5a6Sopenharmony_ci    }
2655c29fa5a6Sopenharmony_ci}
2656c29fa5a6Sopenharmony_ci
2657c29fa5a6Sopenharmony_civoid MMIService::AddReloadDeviceTimer()
2658c29fa5a6Sopenharmony_ci{
2659c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
2660c29fa5a6Sopenharmony_ci    TimerMgr->AddTimer(RELOAD_DEVICE_TIME, REPEAT_COUNT, [this]() {
2661c29fa5a6Sopenharmony_ci        auto deviceIds = INPUT_DEV_MGR->GetInputDeviceIds();
2662c29fa5a6Sopenharmony_ci        if (deviceIds.empty()) {
2663c29fa5a6Sopenharmony_ci            libinputAdapter_.ReloadDevice();
2664c29fa5a6Sopenharmony_ci        }
2665c29fa5a6Sopenharmony_ci    });
2666c29fa5a6Sopenharmony_ci}
2667c29fa5a6Sopenharmony_ci
2668c29fa5a6Sopenharmony_ciint32_t MMIService::Dump(int32_t fd, const std::vector<std::u16string> &args)
2669c29fa5a6Sopenharmony_ci{
2670c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
2671c29fa5a6Sopenharmony_ci    if (fd < 0) {
2672c29fa5a6Sopenharmony_ci        MMI_HILOGE("The fd is invalid");
2673c29fa5a6Sopenharmony_ci        return DUMP_PARAM_ERR;
2674c29fa5a6Sopenharmony_ci    }
2675c29fa5a6Sopenharmony_ci    if (args.empty()) {
2676c29fa5a6Sopenharmony_ci        MMI_HILOGE("The args cannot be empty");
2677c29fa5a6Sopenharmony_ci        mprintf(fd, "args cannot be empty\n");
2678c29fa5a6Sopenharmony_ci        MMIEventDump->DumpHelp(fd);
2679c29fa5a6Sopenharmony_ci        return DUMP_PARAM_ERR;
2680c29fa5a6Sopenharmony_ci    }
2681c29fa5a6Sopenharmony_ci    std::vector<std::string> argList = { "" };
2682c29fa5a6Sopenharmony_ci    std::transform(args.begin(), args.end(), std::back_inserter(argList),
2683c29fa5a6Sopenharmony_ci        [](const std::u16string &arg) { return Str16ToStr8(arg); });
2684c29fa5a6Sopenharmony_ci    MMIEventDump->ParseCommand(fd, argList);
2685c29fa5a6Sopenharmony_ci    return RET_OK;
2686c29fa5a6Sopenharmony_ci}
2687c29fa5a6Sopenharmony_ci
2688c29fa5a6Sopenharmony_ciint32_t MMIService::SetMouseCaptureMode(int32_t windowId, bool isCaptureMode)
2689c29fa5a6Sopenharmony_ci{
2690c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2691c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2692c29fa5a6Sopenharmony_ci        [windowId, isCaptureMode] {
2693c29fa5a6Sopenharmony_ci            return ::OHOS::MMI::IInputWindowsManager::GetInstance()->SetMouseCaptureMode(windowId, isCaptureMode);
2694c29fa5a6Sopenharmony_ci        }
2695c29fa5a6Sopenharmony_ci        );
2696c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2697c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set capture failed, return:%{public}d", ret);
2698c29fa5a6Sopenharmony_ci        return ret;
2699c29fa5a6Sopenharmony_ci    }
2700c29fa5a6Sopenharmony_ci    return RET_OK;
2701c29fa5a6Sopenharmony_ci}
2702c29fa5a6Sopenharmony_ci
2703c29fa5a6Sopenharmony_ciint32_t MMIService::OnGetWindowPid(int32_t windowId, int32_t &windowPid)
2704c29fa5a6Sopenharmony_ci{
2705c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
2706c29fa5a6Sopenharmony_ci    windowPid = WIN_MGR->GetWindowPid(windowId);
2707c29fa5a6Sopenharmony_ci    if (windowPid == RET_ERR) {
2708c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get window pid failed");
2709c29fa5a6Sopenharmony_ci        return RET_ERR;
2710c29fa5a6Sopenharmony_ci    }
2711c29fa5a6Sopenharmony_ci    MMI_HILOGD("windowpid is %{public}d", windowPid);
2712c29fa5a6Sopenharmony_ci    return RET_OK;
2713c29fa5a6Sopenharmony_ci}
2714c29fa5a6Sopenharmony_ci
2715c29fa5a6Sopenharmony_ciint32_t MMIService::GetWindowPid(int32_t windowId)
2716c29fa5a6Sopenharmony_ci{
2717c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2718c29fa5a6Sopenharmony_ci    int32_t windowPid = INVALID_PID;
2719c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2720c29fa5a6Sopenharmony_ci        [this, windowId, &windowPid] {
2721c29fa5a6Sopenharmony_ci            return this->OnGetWindowPid(windowId, windowPid);
2722c29fa5a6Sopenharmony_ci        }
2723c29fa5a6Sopenharmony_ci        );
2724c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2725c29fa5a6Sopenharmony_ci        MMI_HILOGE("OnGetWindowPid failed, ret:%{public}d", ret);
2726c29fa5a6Sopenharmony_ci        return ret;
2727c29fa5a6Sopenharmony_ci    }
2728c29fa5a6Sopenharmony_ci    MMI_HILOGD("windowpid is %{public}d", windowPid);
2729c29fa5a6Sopenharmony_ci    return windowPid;
2730c29fa5a6Sopenharmony_ci}
2731c29fa5a6Sopenharmony_ci
2732c29fa5a6Sopenharmony_ciint32_t MMIService::AppendExtraData(const ExtraData &extraData)
2733c29fa5a6Sopenharmony_ci{
2734c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
2735c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2736c29fa5a6Sopenharmony_ci        [extraData] {
2737c29fa5a6Sopenharmony_ci            return ::OHOS::MMI::IInputWindowsManager::GetInstance()->AppendExtraData(extraData);
2738c29fa5a6Sopenharmony_ci        }
2739c29fa5a6Sopenharmony_ci        );
2740c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2741c29fa5a6Sopenharmony_ci        MMI_HILOGE("Append extra data failed:%{public}d", ret);
2742c29fa5a6Sopenharmony_ci    }
2743c29fa5a6Sopenharmony_ci    return ret;
2744c29fa5a6Sopenharmony_ci}
2745c29fa5a6Sopenharmony_ci
2746c29fa5a6Sopenharmony_ciint32_t MMIService::EnableInputDevice(bool enable)
2747c29fa5a6Sopenharmony_ci{
2748c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
2749c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2750c29fa5a6Sopenharmony_ci        [enable] {
2751c29fa5a6Sopenharmony_ci            return ::OHOS::MMI::InputDeviceManager::GetInstance()->OnEnableInputDevice(enable);
2752c29fa5a6Sopenharmony_ci        }
2753c29fa5a6Sopenharmony_ci        );
2754c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2755c29fa5a6Sopenharmony_ci        MMI_HILOGE("OnEnableInputDevice failed:%{public}d", ret);
2756c29fa5a6Sopenharmony_ci    }
2757c29fa5a6Sopenharmony_ci    return ret;
2758c29fa5a6Sopenharmony_ci}
2759c29fa5a6Sopenharmony_ci
2760c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_KEYBOARD) && defined(OHOS_BUILD_ENABLE_COMBINATION_KEY)
2761c29fa5a6Sopenharmony_ciint32_t MMIService::UpdateCombineKeyState(bool enable)
2762c29fa5a6Sopenharmony_ci{
2763c29fa5a6Sopenharmony_ci    auto eventSubscriberHandler = InputHandler->GetSubscriberHandler();
2764c29fa5a6Sopenharmony_ci    CHKPR(eventSubscriberHandler, RET_ERR);
2765c29fa5a6Sopenharmony_ci    int32_t ret = eventSubscriberHandler->EnableCombineKey(enable);
2766c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2767c29fa5a6Sopenharmony_ci        MMI_HILOGE("EnableCombineKey is failed in key command:%{public}d", ret);
2768c29fa5a6Sopenharmony_ci    }
2769c29fa5a6Sopenharmony_ci
2770c29fa5a6Sopenharmony_ci    auto eventKeyCommandHandler = InputHandler->GetKeyCommandHandler();
2771c29fa5a6Sopenharmony_ci    CHKPR(eventKeyCommandHandler, RET_ERR);
2772c29fa5a6Sopenharmony_ci    ret = eventKeyCommandHandler->EnableCombineKey(enable);
2773c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2774c29fa5a6Sopenharmony_ci        MMI_HILOGE("EnableCombineKey is failed in key command:%{public}d", ret);
2775c29fa5a6Sopenharmony_ci    }
2776c29fa5a6Sopenharmony_ci    return ret;
2777c29fa5a6Sopenharmony_ci}
2778c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD && OHOS_BUILD_ENABLE_COMBINATION_KEY
2779c29fa5a6Sopenharmony_ci
2780c29fa5a6Sopenharmony_ciint32_t MMIService::CheckPidPermission(int32_t pid)
2781c29fa5a6Sopenharmony_ci{
2782c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
2783c29fa5a6Sopenharmony_ci    int32_t checkingPid = GetCallingPid();
2784c29fa5a6Sopenharmony_ci    if (checkingPid != pid) {
2785c29fa5a6Sopenharmony_ci        MMI_HILOGE("check pid failed, input pid:%{public}d, but checking pid:%{public}d", pid, checkingPid);
2786c29fa5a6Sopenharmony_ci        return RET_ERR;
2787c29fa5a6Sopenharmony_ci    }
2788c29fa5a6Sopenharmony_ci    return RET_OK;
2789c29fa5a6Sopenharmony_ci}
2790c29fa5a6Sopenharmony_ci
2791c29fa5a6Sopenharmony_ciint32_t MMIService::EnableCombineKey(bool enable)
2792c29fa5a6Sopenharmony_ci{
2793c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
2794c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_KEYBOARD) && defined(OHOS_BUILD_ENABLE_COMBINATION_KEY)
2795c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2796c29fa5a6Sopenharmony_ci        [this, enable] {
2797c29fa5a6Sopenharmony_ci            return this->UpdateCombineKeyState(enable);
2798c29fa5a6Sopenharmony_ci        }
2799c29fa5a6Sopenharmony_ci        );
2800c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2801c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set key down duration failed:%{public}d", ret);
2802c29fa5a6Sopenharmony_ci        return ret;
2803c29fa5a6Sopenharmony_ci    }
2804c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD && OHOS_BUILD_ENABLE_COMBINATION_KEY
2805c29fa5a6Sopenharmony_ci    return RET_OK;
2806c29fa5a6Sopenharmony_ci}
2807c29fa5a6Sopenharmony_ci
2808c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_KEYBOARD) && defined(OHOS_BUILD_ENABLE_COMBINATION_KEY)
2809c29fa5a6Sopenharmony_ciint32_t MMIService::UpdateSettingsXml(const std::string &businessId, int32_t delay)
2810c29fa5a6Sopenharmony_ci{
2811c29fa5a6Sopenharmony_ci    std::shared_ptr<KeyCommandHandler> eventKeyCommandHandler = InputHandler->GetKeyCommandHandler();
2812c29fa5a6Sopenharmony_ci    CHKPR(eventKeyCommandHandler, RET_ERR);
2813c29fa5a6Sopenharmony_ci    return eventKeyCommandHandler->UpdateSettingsXml(businessId, delay);
2814c29fa5a6Sopenharmony_ci}
2815c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD && OHOS_BUILD_ENABLE_COMBINATION_KEY
2816c29fa5a6Sopenharmony_ci
2817c29fa5a6Sopenharmony_ciint32_t MMIService::SetKeyDownDuration(const std::string &businessId, int32_t delay)
2818c29fa5a6Sopenharmony_ci{
2819c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2820c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_KEYBOARD) && defined(OHOS_BUILD_ENABLE_COMBINATION_KEY)
2821c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2822c29fa5a6Sopenharmony_ci        [this, businessId, delay] {
2823c29fa5a6Sopenharmony_ci            return this->UpdateSettingsXml(businessId, delay);
2824c29fa5a6Sopenharmony_ci        }
2825c29fa5a6Sopenharmony_ci        );
2826c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2827c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set key down duration failed:%{public}d", ret);
2828c29fa5a6Sopenharmony_ci        return ret;
2829c29fa5a6Sopenharmony_ci    }
2830c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD && OHOS_BUILD_ENABLE_COMBINATION_KEY
2831c29fa5a6Sopenharmony_ci    return RET_OK;
2832c29fa5a6Sopenharmony_ci}
2833c29fa5a6Sopenharmony_ci
2834c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
2835c29fa5a6Sopenharmony_ciint32_t MMIService::ReadTouchpadScrollSwich(bool &switchFlag)
2836c29fa5a6Sopenharmony_ci{
2837c29fa5a6Sopenharmony_ci    MouseEventHdr->GetTouchpadScrollSwitch(switchFlag);
2838c29fa5a6Sopenharmony_ci    return RET_OK;
2839c29fa5a6Sopenharmony_ci}
2840c29fa5a6Sopenharmony_ci
2841c29fa5a6Sopenharmony_ciint32_t MMIService::ReadTouchpadScrollDirection(bool &switchFlag)
2842c29fa5a6Sopenharmony_ci{
2843c29fa5a6Sopenharmony_ci    MouseEventHdr->GetTouchpadScrollDirection(switchFlag);
2844c29fa5a6Sopenharmony_ci    return RET_OK;
2845c29fa5a6Sopenharmony_ci}
2846c29fa5a6Sopenharmony_ci
2847c29fa5a6Sopenharmony_ciint32_t MMIService::ReadTouchpadTapSwitch(bool &switchFlag)
2848c29fa5a6Sopenharmony_ci{
2849c29fa5a6Sopenharmony_ci    MouseEventHdr->GetTouchpadTapSwitch(switchFlag);
2850c29fa5a6Sopenharmony_ci    return RET_OK;
2851c29fa5a6Sopenharmony_ci}
2852c29fa5a6Sopenharmony_ci
2853c29fa5a6Sopenharmony_ciint32_t MMIService::ReadTouchpadPointerSpeed(int32_t &speed)
2854c29fa5a6Sopenharmony_ci{
2855c29fa5a6Sopenharmony_ci    MouseEventHdr->GetTouchpadPointerSpeed(speed);
2856c29fa5a6Sopenharmony_ci    return RET_OK;
2857c29fa5a6Sopenharmony_ci}
2858c29fa5a6Sopenharmony_ci
2859c29fa5a6Sopenharmony_ciint32_t MMIService::ReadTouchpadPinchSwitch(bool &switchFlag)
2860c29fa5a6Sopenharmony_ci{
2861c29fa5a6Sopenharmony_ci    TOUCH_EVENT_HDR->GetTouchpadPinchSwitch(switchFlag);
2862c29fa5a6Sopenharmony_ci    return RET_OK;
2863c29fa5a6Sopenharmony_ci}
2864c29fa5a6Sopenharmony_ci
2865c29fa5a6Sopenharmony_ciint32_t MMIService::ReadTouchpadSwipeSwitch(bool &switchFlag)
2866c29fa5a6Sopenharmony_ci{
2867c29fa5a6Sopenharmony_ci    TOUCH_EVENT_HDR->GetTouchpadSwipeSwitch(switchFlag);
2868c29fa5a6Sopenharmony_ci    return RET_OK;
2869c29fa5a6Sopenharmony_ci}
2870c29fa5a6Sopenharmony_ci
2871c29fa5a6Sopenharmony_ciint32_t MMIService::ReadTouchpadRightMenuType(int32_t &type)
2872c29fa5a6Sopenharmony_ci{
2873c29fa5a6Sopenharmony_ci    MouseEventHdr->GetTouchpadRightClickType(type);
2874c29fa5a6Sopenharmony_ci    return RET_OK;
2875c29fa5a6Sopenharmony_ci}
2876c29fa5a6Sopenharmony_ci
2877c29fa5a6Sopenharmony_ciint32_t MMIService::ReadTouchpadRotateSwitch(bool &rotateSwitch)
2878c29fa5a6Sopenharmony_ci{
2879c29fa5a6Sopenharmony_ci    TOUCH_EVENT_HDR->GetTouchpadRotateSwitch(rotateSwitch);
2880c29fa5a6Sopenharmony_ci    return RET_OK;
2881c29fa5a6Sopenharmony_ci}
2882c29fa5a6Sopenharmony_ci
2883c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
2884c29fa5a6Sopenharmony_ci
2885c29fa5a6Sopenharmony_ciint32_t MMIService::SetTouchpadScrollSwitch(bool switchFlag)
2886c29fa5a6Sopenharmony_ci{
2887c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2888c29fa5a6Sopenharmony_ci#if defined OHOS_BUILD_ENABLE_POINTER
2889c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2890c29fa5a6Sopenharmony_ci        [switchFlag] {
2891c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<MouseEventNormalize>::GetInstance()->SetTouchpadScrollSwitch(switchFlag);
2892c29fa5a6Sopenharmony_ci        }
2893c29fa5a6Sopenharmony_ci        );
2894c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2895c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set touchpad scroll switch failed, return:%{public}d", ret);
2896c29fa5a6Sopenharmony_ci        return ret;
2897c29fa5a6Sopenharmony_ci    }
2898c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
2899c29fa5a6Sopenharmony_ci    return RET_OK;
2900c29fa5a6Sopenharmony_ci}
2901c29fa5a6Sopenharmony_ci
2902c29fa5a6Sopenharmony_ciint32_t MMIService::GetTouchpadScrollSwitch(bool &switchFlag)
2903c29fa5a6Sopenharmony_ci{
2904c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2905c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
2906c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2907c29fa5a6Sopenharmony_ci        [this, &switchFlag] {
2908c29fa5a6Sopenharmony_ci            return this->ReadTouchpadScrollSwich(switchFlag);
2909c29fa5a6Sopenharmony_ci        }
2910c29fa5a6Sopenharmony_ci        );
2911c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2912c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get touchpad scroll switch failed, return:%{public}d", ret);
2913c29fa5a6Sopenharmony_ci        return ret;
2914c29fa5a6Sopenharmony_ci    }
2915c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
2916c29fa5a6Sopenharmony_ci    return RET_OK;
2917c29fa5a6Sopenharmony_ci}
2918c29fa5a6Sopenharmony_ci
2919c29fa5a6Sopenharmony_ciint32_t MMIService::SetTouchpadScrollDirection(bool state)
2920c29fa5a6Sopenharmony_ci{
2921c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2922c29fa5a6Sopenharmony_ci#if defined OHOS_BUILD_ENABLE_POINTER
2923c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2924c29fa5a6Sopenharmony_ci        [state] {
2925c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<MouseEventNormalize>::GetInstance()->SetTouchpadScrollDirection(state);
2926c29fa5a6Sopenharmony_ci        }
2927c29fa5a6Sopenharmony_ci        );
2928c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2929c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set touchpad scroll direction switch failed, return:%{public}d", ret);
2930c29fa5a6Sopenharmony_ci        return ret;
2931c29fa5a6Sopenharmony_ci    }
2932c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
2933c29fa5a6Sopenharmony_ci    return RET_OK;
2934c29fa5a6Sopenharmony_ci}
2935c29fa5a6Sopenharmony_ci
2936c29fa5a6Sopenharmony_ciint32_t MMIService::GetTouchpadScrollDirection(bool &state)
2937c29fa5a6Sopenharmony_ci{
2938c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2939c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
2940c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2941c29fa5a6Sopenharmony_ci        [this, &state] {
2942c29fa5a6Sopenharmony_ci            return this->ReadTouchpadScrollDirection(state);
2943c29fa5a6Sopenharmony_ci        }
2944c29fa5a6Sopenharmony_ci        );
2945c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2946c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get touchpad scroll direction switch failed, return:%{public}d", ret);
2947c29fa5a6Sopenharmony_ci        return ret;
2948c29fa5a6Sopenharmony_ci    }
2949c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
2950c29fa5a6Sopenharmony_ci    return RET_OK;
2951c29fa5a6Sopenharmony_ci}
2952c29fa5a6Sopenharmony_ci
2953c29fa5a6Sopenharmony_ciint32_t MMIService::SetTouchpadTapSwitch(bool switchFlag)
2954c29fa5a6Sopenharmony_ci{
2955c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2956c29fa5a6Sopenharmony_ci#if defined OHOS_BUILD_ENABLE_POINTER
2957c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2958c29fa5a6Sopenharmony_ci        [switchFlag] {
2959c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<MouseEventNormalize>::GetInstance()->SetTouchpadTapSwitch(switchFlag);
2960c29fa5a6Sopenharmony_ci        }
2961c29fa5a6Sopenharmony_ci        );
2962c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2963c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set touchpad tap switch failed, return:%{public}d", ret);
2964c29fa5a6Sopenharmony_ci        return ret;
2965c29fa5a6Sopenharmony_ci    }
2966c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
2967c29fa5a6Sopenharmony_ci    return RET_OK;
2968c29fa5a6Sopenharmony_ci}
2969c29fa5a6Sopenharmony_ci
2970c29fa5a6Sopenharmony_ciint32_t MMIService::GetTouchpadTapSwitch(bool &switchFlag)
2971c29fa5a6Sopenharmony_ci{
2972c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2973c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
2974c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2975c29fa5a6Sopenharmony_ci        [this, &switchFlag] {
2976c29fa5a6Sopenharmony_ci            return this->ReadTouchpadTapSwitch(switchFlag);
2977c29fa5a6Sopenharmony_ci        }
2978c29fa5a6Sopenharmony_ci        );
2979c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2980c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get touchpad tap switch failed, return:%{public}d", ret);
2981c29fa5a6Sopenharmony_ci        return ret;
2982c29fa5a6Sopenharmony_ci    }
2983c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
2984c29fa5a6Sopenharmony_ci    return RET_OK;
2985c29fa5a6Sopenharmony_ci}
2986c29fa5a6Sopenharmony_ci
2987c29fa5a6Sopenharmony_ciint32_t MMIService::SetTouchpadPointerSpeed(int32_t speed)
2988c29fa5a6Sopenharmony_ci{
2989c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
2990c29fa5a6Sopenharmony_ci#if defined OHOS_BUILD_ENABLE_POINTER
2991c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
2992c29fa5a6Sopenharmony_ci        [speed] {
2993c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<MouseEventNormalize>::GetInstance()->SetTouchpadPointerSpeed(speed);
2994c29fa5a6Sopenharmony_ci        }
2995c29fa5a6Sopenharmony_ci        );
2996c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
2997c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set touchpad speed failed, return:%{public}d", ret);
2998c29fa5a6Sopenharmony_ci        return ret;
2999c29fa5a6Sopenharmony_ci    }
3000c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
3001c29fa5a6Sopenharmony_ci    return RET_OK;
3002c29fa5a6Sopenharmony_ci}
3003c29fa5a6Sopenharmony_ci
3004c29fa5a6Sopenharmony_ciint32_t MMIService::GetTouchpadPointerSpeed(int32_t &speed)
3005c29fa5a6Sopenharmony_ci{
3006c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3007c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
3008c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3009c29fa5a6Sopenharmony_ci        [this, &speed] {
3010c29fa5a6Sopenharmony_ci            return this->ReadTouchpadPointerSpeed(speed);
3011c29fa5a6Sopenharmony_ci        }
3012c29fa5a6Sopenharmony_ci        );
3013c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3014c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get touchpad speed failed, return:%{public}d", ret);
3015c29fa5a6Sopenharmony_ci        return ret;
3016c29fa5a6Sopenharmony_ci    }
3017c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
3018c29fa5a6Sopenharmony_ci    return RET_OK;
3019c29fa5a6Sopenharmony_ci}
3020c29fa5a6Sopenharmony_ci
3021c29fa5a6Sopenharmony_ciint32_t MMIService::SetTouchpadPinchSwitch(bool switchFlag)
3022c29fa5a6Sopenharmony_ci{
3023c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3024c29fa5a6Sopenharmony_ci#if defined OHOS_BUILD_ENABLE_POINTER
3025c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3026c29fa5a6Sopenharmony_ci        [switchFlag] {
3027c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<TouchEventNormalize>::GetInstance()->SetTouchpadPinchSwitch(switchFlag);
3028c29fa5a6Sopenharmony_ci        }
3029c29fa5a6Sopenharmony_ci        );
3030c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3031c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set touch pad pinch switch failed, return:%{public}d", ret);
3032c29fa5a6Sopenharmony_ci        return ret;
3033c29fa5a6Sopenharmony_ci    }
3034c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
3035c29fa5a6Sopenharmony_ci    return RET_OK;
3036c29fa5a6Sopenharmony_ci}
3037c29fa5a6Sopenharmony_ci
3038c29fa5a6Sopenharmony_ciint32_t MMIService::GetTouchpadPinchSwitch(bool &switchFlag)
3039c29fa5a6Sopenharmony_ci{
3040c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3041c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
3042c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3043c29fa5a6Sopenharmony_ci        [this, &switchFlag] {
3044c29fa5a6Sopenharmony_ci            return this->ReadTouchpadPinchSwitch(switchFlag);
3045c29fa5a6Sopenharmony_ci        }
3046c29fa5a6Sopenharmony_ci        );
3047c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3048c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get touch pad pinch switch failed, return:%{public}d", ret);
3049c29fa5a6Sopenharmony_ci        return ret;
3050c29fa5a6Sopenharmony_ci    }
3051c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
3052c29fa5a6Sopenharmony_ci    return RET_OK;
3053c29fa5a6Sopenharmony_ci}
3054c29fa5a6Sopenharmony_ci
3055c29fa5a6Sopenharmony_ciint32_t MMIService::SetTouchpadSwipeSwitch(bool switchFlag)
3056c29fa5a6Sopenharmony_ci{
3057c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3058c29fa5a6Sopenharmony_ci#if defined OHOS_BUILD_ENABLE_POINTER
3059c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3060c29fa5a6Sopenharmony_ci        [switchFlag] {
3061c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<TouchEventNormalize>::GetInstance()->SetTouchpadSwipeSwitch(switchFlag);
3062c29fa5a6Sopenharmony_ci        }
3063c29fa5a6Sopenharmony_ci        );
3064c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3065c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set touchpad swipe switch failed, return:%{public}d", ret);
3066c29fa5a6Sopenharmony_ci        return ret;
3067c29fa5a6Sopenharmony_ci    }
3068c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
3069c29fa5a6Sopenharmony_ci    return RET_OK;
3070c29fa5a6Sopenharmony_ci}
3071c29fa5a6Sopenharmony_ci
3072c29fa5a6Sopenharmony_ciint32_t MMIService::GetTouchpadSwipeSwitch(bool &switchFlag)
3073c29fa5a6Sopenharmony_ci{
3074c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3075c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
3076c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3077c29fa5a6Sopenharmony_ci        [this, &switchFlag] {
3078c29fa5a6Sopenharmony_ci            return this->ReadTouchpadSwipeSwitch(switchFlag);
3079c29fa5a6Sopenharmony_ci        }
3080c29fa5a6Sopenharmony_ci        );
3081c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3082c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get touchpad swipe switch failed, return:%{public}d", ret);
3083c29fa5a6Sopenharmony_ci        return ret;
3084c29fa5a6Sopenharmony_ci    }
3085c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
3086c29fa5a6Sopenharmony_ci    return RET_OK;
3087c29fa5a6Sopenharmony_ci}
3088c29fa5a6Sopenharmony_ci
3089c29fa5a6Sopenharmony_ciint32_t MMIService::SetTouchpadRightClickType(int32_t type)
3090c29fa5a6Sopenharmony_ci{
3091c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3092c29fa5a6Sopenharmony_ci#if defined OHOS_BUILD_ENABLE_POINTER
3093c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3094c29fa5a6Sopenharmony_ci        [type] {
3095c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<MouseEventNormalize>::GetInstance()->SetTouchpadRightClickType(type);
3096c29fa5a6Sopenharmony_ci        }
3097c29fa5a6Sopenharmony_ci        );
3098c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3099c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set touchpad right button menu type failed, return:%{public}d", ret);
3100c29fa5a6Sopenharmony_ci        return ret;
3101c29fa5a6Sopenharmony_ci    }
3102c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
3103c29fa5a6Sopenharmony_ci    return RET_OK;
3104c29fa5a6Sopenharmony_ci}
3105c29fa5a6Sopenharmony_ci
3106c29fa5a6Sopenharmony_ciint32_t MMIService::GetTouchpadRightClickType(int32_t &type)
3107c29fa5a6Sopenharmony_ci{
3108c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3109c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
3110c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3111c29fa5a6Sopenharmony_ci        [this, &type] {
3112c29fa5a6Sopenharmony_ci            return this->ReadTouchpadRightMenuType(type);
3113c29fa5a6Sopenharmony_ci        }
3114c29fa5a6Sopenharmony_ci        );
3115c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3116c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get touchpad right button menu type failed, return:%{public}d", ret);
3117c29fa5a6Sopenharmony_ci        return ret;
3118c29fa5a6Sopenharmony_ci    }
3119c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
3120c29fa5a6Sopenharmony_ci    return RET_OK;
3121c29fa5a6Sopenharmony_ci}
3122c29fa5a6Sopenharmony_ci
3123c29fa5a6Sopenharmony_ciint32_t MMIService::SetTouchpadRotateSwitch(bool rotateSwitch)
3124c29fa5a6Sopenharmony_ci{
3125c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3126c29fa5a6Sopenharmony_ci#if defined OHOS_BUILD_ENABLE_POINTER
3127c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3128c29fa5a6Sopenharmony_ci        [rotateSwitch] {
3129c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<TouchEventNormalize>::GetInstance()->SetTouchpadRotateSwitch(rotateSwitch);
3130c29fa5a6Sopenharmony_ci        }
3131c29fa5a6Sopenharmony_ci        );
3132c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3133c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set touchpad rotate switch failed, ret:%{public}d", ret);
3134c29fa5a6Sopenharmony_ci        return ret;
3135c29fa5a6Sopenharmony_ci    }
3136c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
3137c29fa5a6Sopenharmony_ci    return RET_OK;
3138c29fa5a6Sopenharmony_ci}
3139c29fa5a6Sopenharmony_ci
3140c29fa5a6Sopenharmony_ciint32_t MMIService::GetTouchpadRotateSwitch(bool &rotateSwitch)
3141c29fa5a6Sopenharmony_ci{
3142c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3143c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
3144c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3145c29fa5a6Sopenharmony_ci        [this, &rotateSwitch] {
3146c29fa5a6Sopenharmony_ci            return this->ReadTouchpadRotateSwitch(rotateSwitch);
3147c29fa5a6Sopenharmony_ci        }
3148c29fa5a6Sopenharmony_ci        );
3149c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3150c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get touchpad rotate switch failed, ret:%{public}d", ret);
3151c29fa5a6Sopenharmony_ci        return ret;
3152c29fa5a6Sopenharmony_ci    }
3153c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
3154c29fa5a6Sopenharmony_ci    return RET_OK;
3155c29fa5a6Sopenharmony_ci}
3156c29fa5a6Sopenharmony_ci
3157c29fa5a6Sopenharmony_ciint32_t MMIService::SetShieldStatus(int32_t shieldMode, bool isShield)
3158c29fa5a6Sopenharmony_ci{
3159c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3160c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
3161c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3162c29fa5a6Sopenharmony_ci        [this, shieldMode, isShield] {
3163c29fa5a6Sopenharmony_ci            return sMsgHandler_.SetShieldStatus(shieldMode, isShield);
3164c29fa5a6Sopenharmony_ci        }
3165c29fa5a6Sopenharmony_ci        );
3166c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3167c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set shield event interception state failed, return:%{public}d", ret);
3168c29fa5a6Sopenharmony_ci        return ret;
3169c29fa5a6Sopenharmony_ci    }
3170c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
3171c29fa5a6Sopenharmony_ci    return RET_OK;
3172c29fa5a6Sopenharmony_ci}
3173c29fa5a6Sopenharmony_ci
3174c29fa5a6Sopenharmony_ciint32_t MMIService::GetShieldStatus(int32_t shieldMode, bool &isShield)
3175c29fa5a6Sopenharmony_ci{
3176c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3177c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
3178c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3179c29fa5a6Sopenharmony_ci        [this, shieldMode, &isShield] {
3180c29fa5a6Sopenharmony_ci            return sMsgHandler_.GetShieldStatus(shieldMode, isShield);
3181c29fa5a6Sopenharmony_ci        }
3182c29fa5a6Sopenharmony_ci        );
3183c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3184c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to set shield event interception status, ret:%{public}d", ret);
3185c29fa5a6Sopenharmony_ci        return ret;
3186c29fa5a6Sopenharmony_ci    }
3187c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
3188c29fa5a6Sopenharmony_ci    return RET_OK;
3189c29fa5a6Sopenharmony_ci}
3190c29fa5a6Sopenharmony_ci
3191c29fa5a6Sopenharmony_ciint32_t MMIService::GetKeyState(std::vector<int32_t> &pressedKeys, std::map<int32_t, int32_t> &specialKeysState)
3192c29fa5a6Sopenharmony_ci{
3193c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3194c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
3195c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3196c29fa5a6Sopenharmony_ci        [this, &pressedKeys, &specialKeysState] {
3197c29fa5a6Sopenharmony_ci            return this->OnGetKeyState(pressedKeys, specialKeysState);
3198c29fa5a6Sopenharmony_ci        }
3199c29fa5a6Sopenharmony_ci        );
3200c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3201c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get pressed keys failed, return:%{public}d", ret);
3202c29fa5a6Sopenharmony_ci        return ret;
3203c29fa5a6Sopenharmony_ci    }
3204c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
3205c29fa5a6Sopenharmony_ci    return RET_OK;
3206c29fa5a6Sopenharmony_ci}
3207c29fa5a6Sopenharmony_ci
3208c29fa5a6Sopenharmony_ciint32_t MMIService::Authorize(bool isAuthorize)
3209c29fa5a6Sopenharmony_ci{
3210c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3211c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3212c29fa5a6Sopenharmony_ci        [this, isAuthorize] {
3213c29fa5a6Sopenharmony_ci            return this->OnAuthorize(isAuthorize);
3214c29fa5a6Sopenharmony_ci        }
3215c29fa5a6Sopenharmony_ci        );
3216c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3217c29fa5a6Sopenharmony_ci        MMI_HILOGE("OnAuthorize failed, ret:%{public}d", ret);
3218c29fa5a6Sopenharmony_ci        return ret;
3219c29fa5a6Sopenharmony_ci    }
3220c29fa5a6Sopenharmony_ci    return RET_OK;
3221c29fa5a6Sopenharmony_ci}
3222c29fa5a6Sopenharmony_ci
3223c29fa5a6Sopenharmony_ciint32_t MMIService::OnAuthorize(bool isAuthorize)
3224c29fa5a6Sopenharmony_ci{
3225c29fa5a6Sopenharmony_ci    return sMsgHandler_.OnAuthorize(isAuthorize);
3226c29fa5a6Sopenharmony_ci}
3227c29fa5a6Sopenharmony_ci
3228c29fa5a6Sopenharmony_ciint32_t MMIService::CancelInjection()
3229c29fa5a6Sopenharmony_ci{
3230c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3231c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3232c29fa5a6Sopenharmony_ci        [this] {
3233c29fa5a6Sopenharmony_ci            return this->OnCancelInjection();
3234c29fa5a6Sopenharmony_ci        }
3235c29fa5a6Sopenharmony_ci        );
3236c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3237c29fa5a6Sopenharmony_ci        MMI_HILOGE("OnCancelInjection failed, ret:%{public}d", ret);
3238c29fa5a6Sopenharmony_ci        return ret;
3239c29fa5a6Sopenharmony_ci    }
3240c29fa5a6Sopenharmony_ci    return RET_OK;
3241c29fa5a6Sopenharmony_ci}
3242c29fa5a6Sopenharmony_ci
3243c29fa5a6Sopenharmony_ciint32_t MMIService::OnCancelInjection()
3244c29fa5a6Sopenharmony_ci{
3245c29fa5a6Sopenharmony_ci    return sMsgHandler_.OnCancelInjection();
3246c29fa5a6Sopenharmony_ci}
3247c29fa5a6Sopenharmony_ci
3248c29fa5a6Sopenharmony_ciint32_t MMIService::HasIrEmitter(bool &hasIrEmitter)
3249c29fa5a6Sopenharmony_ci{
3250c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3251c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3252c29fa5a6Sopenharmony_ci        [this, &hasIrEmitter] {
3253c29fa5a6Sopenharmony_ci            return this->OnHasIrEmitter(hasIrEmitter);
3254c29fa5a6Sopenharmony_ci        }
3255c29fa5a6Sopenharmony_ci        );
3256c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3257c29fa5a6Sopenharmony_ci        MMI_HILOGE("OnHasIrEmitter failed, ret:%{public}d", ret);
3258c29fa5a6Sopenharmony_ci        return ret;
3259c29fa5a6Sopenharmony_ci    }
3260c29fa5a6Sopenharmony_ci    return RET_OK;
3261c29fa5a6Sopenharmony_ci}
3262c29fa5a6Sopenharmony_ci
3263c29fa5a6Sopenharmony_ciint32_t MMIService::GetInfraredFrequencies(std::vector<InfraredFrequency>& frequencies)
3264c29fa5a6Sopenharmony_ci{
3265c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3266c29fa5a6Sopenharmony_ci    MMI_HILOGI("Start get infrared frequency");
3267c29fa5a6Sopenharmony_ci    std::vector<InfraredFrequencyInfo> infos;
3268c29fa5a6Sopenharmony_ci    if (!InfraredEmitterController::GetInstance()->GetFrequencies(infos)) {
3269c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to get frequencies");
3270c29fa5a6Sopenharmony_ci        return RET_ERR;
3271c29fa5a6Sopenharmony_ci    }
3272c29fa5a6Sopenharmony_ci    for (auto &item : infos) {
3273c29fa5a6Sopenharmony_ci        InfraredFrequency info;
3274c29fa5a6Sopenharmony_ci        info.min_ = item.min_;
3275c29fa5a6Sopenharmony_ci        info.max_ = item.max_;
3276c29fa5a6Sopenharmony_ci        frequencies.push_back(info);
3277c29fa5a6Sopenharmony_ci    }
3278c29fa5a6Sopenharmony_ci    std::string context = "";
3279c29fa5a6Sopenharmony_ci    int32_t size = static_cast<int32_t>(frequencies.size());
3280c29fa5a6Sopenharmony_ci    for (int32_t i = 0; i < size; i++) {
3281c29fa5a6Sopenharmony_ci        context = context + "frequencies[" + std::to_string(i) + "]. max=" + std::to_string(frequencies[i].max_) +
3282c29fa5a6Sopenharmony_ci        ",min=" + std::to_string(frequencies[i].min_) + ";";
3283c29fa5a6Sopenharmony_ci    }
3284c29fa5a6Sopenharmony_ci    MMI_HILOGD("Data from hdf context:%{public}s", context.c_str());
3285c29fa5a6Sopenharmony_ci    return RET_OK;
3286c29fa5a6Sopenharmony_ci}
3287c29fa5a6Sopenharmony_ci
3288c29fa5a6Sopenharmony_ciint32_t MMIService::TransmitInfrared(int64_t number, std::vector<int64_t>& pattern)
3289c29fa5a6Sopenharmony_ci{
3290c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3291c29fa5a6Sopenharmony_ci    std::string context = "infraredFrequency:" + std::to_string(number) + ";";
3292c29fa5a6Sopenharmony_ci    int32_t size = static_cast<int32_t>(pattern.size());
3293c29fa5a6Sopenharmony_ci    for (int32_t i = 0; i < size; i++) {
3294c29fa5a6Sopenharmony_ci        context = context + "index:" + std::to_string(i) + ": pattern:" + std::to_string(pattern[i]) + ";";
3295c29fa5a6Sopenharmony_ci    }
3296c29fa5a6Sopenharmony_ci    MMI_HILOGI("TransmitInfrared para context:%{public}s", context.c_str());
3297c29fa5a6Sopenharmony_ci    if (!InfraredEmitterController::GetInstance()->Transmit(number, pattern)) {
3298c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to transmit");
3299c29fa5a6Sopenharmony_ci        return RET_ERR;
3300c29fa5a6Sopenharmony_ci    }
3301c29fa5a6Sopenharmony_ci    return RET_OK;
3302c29fa5a6Sopenharmony_ci}
3303c29fa5a6Sopenharmony_ci
3304c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_VKEYBOARD
3305c29fa5a6Sopenharmony_ciint32_t MMIService::SetVKeyboardArea(double topLeftX, double topLeftY, double bottomRightX, double bottomRightY)
3306c29fa5a6Sopenharmony_ci{
3307c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3308c29fa5a6Sopenharmony_ci    if (!isHPR_) {
3309c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to set virtual keyboard area, feature not supported");
3310c29fa5a6Sopenharmony_ci        return RET_ERR;
3311c29fa5a6Sopenharmony_ci    }
3312c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3313c29fa5a6Sopenharmony_ci        [this, topLeftX, topLeftY, bottomRightX, bottomRightY] {
3314c29fa5a6Sopenharmony_ci            return this->OnSetVKeyboardArea(topLeftX, topLeftY, bottomRightX, bottomRightY);
3315c29fa5a6Sopenharmony_ci        }
3316c29fa5a6Sopenharmony_ci        );
3317c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3318c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to set virtual keyboard area, ret:%{public}d", ret);
3319c29fa5a6Sopenharmony_ci    }
3320c29fa5a6Sopenharmony_ci    return ret;
3321c29fa5a6Sopenharmony_ci}
3322c29fa5a6Sopenharmony_ci
3323c29fa5a6Sopenharmony_ciint32_t MMIService::OnSetVKeyboardArea(double topLeftX, double topLeftY, double bottomRightX, double bottomRightY)
3324c29fa5a6Sopenharmony_ci{
3325c29fa5a6Sopenharmony_ci    gaussiankeyboard_setVKeyboardArea_(topLeftX, topLeftY, bottomRightX, bottomRightY);
3326c29fa5a6Sopenharmony_ci    int32_t sKeyEventID = 1234;
3327c29fa5a6Sopenharmony_ci    int32_t sKeyEventDeviceId = 99;
3328c29fa5a6Sopenharmony_ci    // Init the shared key event used by later key injection module and set common fields.
3329c29fa5a6Sopenharmony_ci    g_VKeySharedKeyEvent = KeyEvent::Create();
3330c29fa5a6Sopenharmony_ci    CHKPR(g_VKeySharedKeyEvent, ERROR_NULL_POINTER);
3331c29fa5a6Sopenharmony_ci    g_VKeySharedKeyEvent->SetId(sKeyEventID);
3332c29fa5a6Sopenharmony_ci    g_VKeySharedKeyEvent->SetDeviceId(sKeyEventDeviceId);
3333c29fa5a6Sopenharmony_ci    // Init the shared UI key event for UI rendering.
3334c29fa5a6Sopenharmony_ci    g_VKeySharedUIKeyEvent = KeyEvent::Create();
3335c29fa5a6Sopenharmony_ci    CHKPR(g_VKeySharedUIKeyEvent, ERROR_NULL_POINTER);
3336c29fa5a6Sopenharmony_ci    g_VKeySharedUIKeyEvent->SetId(sKeyEventID);
3337c29fa5a6Sopenharmony_ci    g_VKeySharedUIKeyEvent->SetDeviceId(sKeyEventDeviceId);
3338c29fa5a6Sopenharmony_ci    return RET_OK;
3339c29fa5a6Sopenharmony_ci}
3340c29fa5a6Sopenharmony_ci
3341c29fa5a6Sopenharmony_ciint32_t MMIService::SetMotionSpace(std::string& keyName, bool useShift, std::vector<int32_t>& pattern)
3342c29fa5a6Sopenharmony_ci{
3343c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3344c29fa5a6Sopenharmony_ci    if (!isHPR_) {
3345c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to set motion space, feature not supported");
3346c29fa5a6Sopenharmony_ci        return RET_ERR;
3347c29fa5a6Sopenharmony_ci    }
3348c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3349c29fa5a6Sopenharmony_ci        [this, &keyName, useShift, &pattern] {
3350c29fa5a6Sopenharmony_ci            return this->OnSetMotionSpace(keyName, useShift, pattern);
3351c29fa5a6Sopenharmony_ci        }
3352c29fa5a6Sopenharmony_ci        );
3353c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3354c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to set motion space, ret:%{public}d", ret);
3355c29fa5a6Sopenharmony_ci    }
3356c29fa5a6Sopenharmony_ci    return ret;
3357c29fa5a6Sopenharmony_ci}
3358c29fa5a6Sopenharmony_ci
3359c29fa5a6Sopenharmony_ciint32_t MMIService::OnSetMotionSpace(std::string& keyName, bool useShift, std::vector<int32_t>& pattern)
3360c29fa5a6Sopenharmony_ci{
3361c29fa5a6Sopenharmony_ci    if (pattern.size() == MotionSpacePatternIndex::PATTERN_SIZE) {
3362c29fa5a6Sopenharmony_ci        auto motionSpaceType = static_cast<MotionSpaceType>(pattern[MotionSpacePatternIndex::PATTERN_MST_ID]);
3363c29fa5a6Sopenharmony_ci        if (motionSpaceType != MotionSpaceType::TRACKPAD) {
3364c29fa5a6Sopenharmony_ci            gaussiankeyboard_updateMotionSpace_(keyName, useShift, pattern);
3365c29fa5a6Sopenharmony_ci        }
3366c29fa5a6Sopenharmony_ci        return RET_OK;
3367c29fa5a6Sopenharmony_ci    } else {
3368c29fa5a6Sopenharmony_ci        return COMMON_PARAMETER_ERROR;
3369c29fa5a6Sopenharmony_ci    }
3370c29fa5a6Sopenharmony_ci}
3371c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_VKEYBOARD
3372c29fa5a6Sopenharmony_ci
3373c29fa5a6Sopenharmony_ciint32_t MMIService::OnHasIrEmitter(bool &hasIrEmitter)
3374c29fa5a6Sopenharmony_ci{
3375c29fa5a6Sopenharmony_ci    hasIrEmitter = false;
3376c29fa5a6Sopenharmony_ci    return RET_OK;
3377c29fa5a6Sopenharmony_ci}
3378c29fa5a6Sopenharmony_ci
3379c29fa5a6Sopenharmony_ciint32_t MMIService::SetPixelMapData(int32_t infoId, void* pixelMap)
3380c29fa5a6Sopenharmony_ci{
3381c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3382c29fa5a6Sopenharmony_ci    CHKPR(pixelMap, ERROR_NULL_POINTER);
3383c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3384c29fa5a6Sopenharmony_ci        [this, infoId, pixelMap] {
3385c29fa5a6Sopenharmony_ci            return sMsgHandler_.SetPixelMapData(infoId, pixelMap);
3386c29fa5a6Sopenharmony_ci        }
3387c29fa5a6Sopenharmony_ci        );
3388c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3389c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to set pixelmap, ret:%{public}d", ret);
3390c29fa5a6Sopenharmony_ci        return ret;
3391c29fa5a6Sopenharmony_ci    }
3392c29fa5a6Sopenharmony_ci    return RET_OK;
3393c29fa5a6Sopenharmony_ci}
3394c29fa5a6Sopenharmony_ci
3395c29fa5a6Sopenharmony_civoid MMIService::InitPreferences()
3396c29fa5a6Sopenharmony_ci{
3397c29fa5a6Sopenharmony_ci    PREFERENCES_MGR->InitPreferences();
3398c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_MOVE_EVENT_FILTERS
3399c29fa5a6Sopenharmony_ci    int32_t ret = SetMoveEventFilters(PREFERENCES_MGR->GetBoolValue("moveEventFilterFlag", false));
3400c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3401c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to read moveEventFilterFlag, ret:%{public}d", ret);
3402c29fa5a6Sopenharmony_ci    }
3403c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_MOVE_EVENT_FILTERS
3404c29fa5a6Sopenharmony_ci}
3405c29fa5a6Sopenharmony_ci
3406c29fa5a6Sopenharmony_ciint32_t MMIService::SetMoveEventFilters(bool flag)
3407c29fa5a6Sopenharmony_ci{
3408c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3409c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_MOVE_EVENT_FILTERS
3410c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3411c29fa5a6Sopenharmony_ci        std::bind(&InputEventHandler::SetMoveEventFilters, InputHandler, flag));
3412c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3413c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to set move event filter flag, ret:%{public}d", ret);
3414c29fa5a6Sopenharmony_ci        return ret;
3415c29fa5a6Sopenharmony_ci    }
3416c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_MOVE_EVENT_FILTERS
3417c29fa5a6Sopenharmony_ci    return RET_OK;
3418c29fa5a6Sopenharmony_ci}
3419c29fa5a6Sopenharmony_ci
3420c29fa5a6Sopenharmony_ciint32_t MMIService::SetCurrentUser(int32_t userId)
3421c29fa5a6Sopenharmony_ci{
3422c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3423c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3424c29fa5a6Sopenharmony_ci        [userId] {
3425c29fa5a6Sopenharmony_ci            return ::OHOS::MMI::IInputWindowsManager::GetInstance()->SetCurrentUser(userId);
3426c29fa5a6Sopenharmony_ci        }
3427c29fa5a6Sopenharmony_ci        );
3428c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3429c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to set current user, ret:%{public}d", ret);
3430c29fa5a6Sopenharmony_ci        return ret;
3431c29fa5a6Sopenharmony_ci    }
3432c29fa5a6Sopenharmony_ci    return RET_OK;
3433c29fa5a6Sopenharmony_ci}
3434c29fa5a6Sopenharmony_ci
3435c29fa5a6Sopenharmony_ciint32_t MMIService::SetTouchpadThreeFingersTapSwitch(bool switchFlag)
3436c29fa5a6Sopenharmony_ci{
3437c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3438c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
3439c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3440c29fa5a6Sopenharmony_ci        [switchFlag] {
3441c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<TouchEventNormalize>::GetInstance()->SetTouchpadThreeFingersTapSwitch(
3442c29fa5a6Sopenharmony_ci                switchFlag);
3443c29fa5a6Sopenharmony_ci        }
3444c29fa5a6Sopenharmony_ci        );
3445c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3446c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to SetTouchpadThreeFingersTapSwitch status, ret:%{public}d", ret);
3447c29fa5a6Sopenharmony_ci        return ret;
3448c29fa5a6Sopenharmony_ci    }
3449c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
3450c29fa5a6Sopenharmony_ci    return RET_OK;
3451c29fa5a6Sopenharmony_ci}
3452c29fa5a6Sopenharmony_ci
3453c29fa5a6Sopenharmony_ciint32_t MMIService::GetTouchpadThreeFingersTapSwitch(bool &switchFlag)
3454c29fa5a6Sopenharmony_ci{
3455c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3456c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
3457c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3458c29fa5a6Sopenharmony_ci        [&switchFlag] {
3459c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<TouchEventNormalize>::GetInstance()->GetTouchpadThreeFingersTapSwitch(
3460c29fa5a6Sopenharmony_ci                switchFlag);
3461c29fa5a6Sopenharmony_ci        }
3462c29fa5a6Sopenharmony_ci        );
3463c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3464c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to GetTouchpadThreeFingersTapSwitch status, ret:%{public}d", ret);
3465c29fa5a6Sopenharmony_ci        return ret;
3466c29fa5a6Sopenharmony_ci    }
3467c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
3468c29fa5a6Sopenharmony_ci    return RET_OK;
3469c29fa5a6Sopenharmony_ci}
3470c29fa5a6Sopenharmony_ci
3471c29fa5a6Sopenharmony_ciint32_t MMIService::AddVirtualInputDevice(std::shared_ptr<InputDevice> device, int32_t &deviceId)
3472c29fa5a6Sopenharmony_ci{
3473c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3474c29fa5a6Sopenharmony_ci    CHKPR(device, ERROR_NULL_POINTER);
3475c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3476c29fa5a6Sopenharmony_ci        [device, &deviceId] {
3477c29fa5a6Sopenharmony_ci            return ::OHOS::MMI::InputDeviceManager::GetInstance()->AddVirtualInputDevice(device, deviceId);
3478c29fa5a6Sopenharmony_ci        }
3479c29fa5a6Sopenharmony_ci        );
3480c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3481c29fa5a6Sopenharmony_ci        MMI_HILOGE("AddVirtualInputDevice failed:%{public}d", ret);
3482c29fa5a6Sopenharmony_ci    }
3483c29fa5a6Sopenharmony_ci    return ret;
3484c29fa5a6Sopenharmony_ci}
3485c29fa5a6Sopenharmony_ci
3486c29fa5a6Sopenharmony_ciint32_t MMIService::RemoveVirtualInputDevice(int32_t deviceId)
3487c29fa5a6Sopenharmony_ci{
3488c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3489c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3490c29fa5a6Sopenharmony_ci        [deviceId] {
3491c29fa5a6Sopenharmony_ci            return ::OHOS::MMI::InputDeviceManager::GetInstance()->RemoveVirtualInputDevice(deviceId);
3492c29fa5a6Sopenharmony_ci        }
3493c29fa5a6Sopenharmony_ci        );
3494c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3495c29fa5a6Sopenharmony_ci        MMI_HILOGE("RemoveVirtualInputDevice failed:%{public}d", ret);
3496c29fa5a6Sopenharmony_ci    }
3497c29fa5a6Sopenharmony_ci    return ret;
3498c29fa5a6Sopenharmony_ci}
3499c29fa5a6Sopenharmony_ci
3500c29fa5a6Sopenharmony_ciint32_t MMIService::EnableHardwareCursorStats(bool enable)
3501c29fa5a6Sopenharmony_ci{
3502c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3503c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING)
3504c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
3505c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3506c29fa5a6Sopenharmony_ci        [pid, enable] {
3507c29fa5a6Sopenharmony_ci            return IPointerDrawingManager::GetInstance()->EnableHardwareCursorStats(pid, enable);
3508c29fa5a6Sopenharmony_ci        }
3509c29fa5a6Sopenharmony_ci        );
3510c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3511c29fa5a6Sopenharmony_ci        MMI_HILOGE("Enable hardware cursor stats failed, ret:%{public}d", ret);
3512c29fa5a6Sopenharmony_ci        return ret;
3513c29fa5a6Sopenharmony_ci    }
3514c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING
3515c29fa5a6Sopenharmony_ci    return RET_OK;
3516c29fa5a6Sopenharmony_ci}
3517c29fa5a6Sopenharmony_ci
3518c29fa5a6Sopenharmony_ciint32_t MMIService::GetHardwareCursorStats(uint32_t &frameCount, uint32_t &vsyncCount)
3519c29fa5a6Sopenharmony_ci{
3520c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3521c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING)
3522c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
3523c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3524c29fa5a6Sopenharmony_ci        [pid, &frameCount, &vsyncCount] {
3525c29fa5a6Sopenharmony_ci            return IPointerDrawingManager::GetInstance()->GetHardwareCursorStats(pid, frameCount, vsyncCount);
3526c29fa5a6Sopenharmony_ci        }
3527c29fa5a6Sopenharmony_ci        );
3528c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3529c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get hardware cursor stats failed, ret:%{public}d", ret);
3530c29fa5a6Sopenharmony_ci        return ret;
3531c29fa5a6Sopenharmony_ci    }
3532c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING
3533c29fa5a6Sopenharmony_ci    return RET_OK;
3534c29fa5a6Sopenharmony_ci}
3535c29fa5a6Sopenharmony_ci
3536c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_MAGICCURSOR
3537c29fa5a6Sopenharmony_ciint32_t MMIService::GetPointerSnapshot(void *pixelMapPtr)
3538c29fa5a6Sopenharmony_ci{
3539c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3540c29fa5a6Sopenharmony_ci#if defined OHOS_BUILD_ENABLE_POINTER
3541c29fa5a6Sopenharmony_ci    MMI_HILOGI("Get pointer snapshot from process(%{public}d)", GetCallingPid());
3542c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(std::bind(
3543c29fa5a6Sopenharmony_ci        std::bind(&IPointerDrawingManager::GetPointerSnapshot, IPointerDrawingManager::GetInstance(), pixelMapPtr)));
3544c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3545c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get the pointer snapshot failed, ret: %{public}d", ret);
3546c29fa5a6Sopenharmony_ci        return ret;
3547c29fa5a6Sopenharmony_ci    }
3548c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
3549c29fa5a6Sopenharmony_ci    return RET_OK;
3550c29fa5a6Sopenharmony_ci}
3551c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_MAGICCURSOR
3552c29fa5a6Sopenharmony_ci
3553c29fa5a6Sopenharmony_ciint32_t MMIService::SetTouchpadScrollRows(int32_t rows)
3554c29fa5a6Sopenharmony_ci{
3555c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3556c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
3557c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3558c29fa5a6Sopenharmony_ci        [rows] {
3559c29fa5a6Sopenharmony_ci            return ::OHOS::DelayedSingleton<TouchEventNormalize>::GetInstance()->SetTouchpadScrollRows(rows);
3560c29fa5a6Sopenharmony_ci        }
3561c29fa5a6Sopenharmony_ci        );
3562c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3563c29fa5a6Sopenharmony_ci        MMI_HILOGE("Set the number of touchpad scrolling rows failed, return %{public}d", ret);
3564c29fa5a6Sopenharmony_ci        return ret;
3565c29fa5a6Sopenharmony_ci    }
3566c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
3567c29fa5a6Sopenharmony_ci    return RET_OK;
3568c29fa5a6Sopenharmony_ci}
3569c29fa5a6Sopenharmony_ci
3570c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
3571c29fa5a6Sopenharmony_ciint32_t MMIService::ReadTouchpadScrollRows(int32_t &rows)
3572c29fa5a6Sopenharmony_ci{
3573c29fa5a6Sopenharmony_ci    rows = TOUCH_EVENT_HDR->GetTouchpadScrollRows();
3574c29fa5a6Sopenharmony_ci    return RET_OK;
3575c29fa5a6Sopenharmony_ci}
3576c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
3577c29fa5a6Sopenharmony_ci
3578c29fa5a6Sopenharmony_ciint32_t MMIService::GetTouchpadScrollRows(int32_t &rows)
3579c29fa5a6Sopenharmony_ci{
3580c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3581c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
3582c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3583c29fa5a6Sopenharmony_ci        [this, &rows] {
3584c29fa5a6Sopenharmony_ci            return this->ReadTouchpadScrollRows(rows);
3585c29fa5a6Sopenharmony_ci        }
3586c29fa5a6Sopenharmony_ci        );
3587c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3588c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get the number of touchpad scrolling rows failed, return %{public}d, pid:%{public}d", ret,
3589c29fa5a6Sopenharmony_ci            GetCallingPid());
3590c29fa5a6Sopenharmony_ci        return ret;
3591c29fa5a6Sopenharmony_ci    }
3592c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
3593c29fa5a6Sopenharmony_ci    return RET_OK;
3594c29fa5a6Sopenharmony_ci}
3595c29fa5a6Sopenharmony_ci
3596c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_ANCO
3597c29fa5a6Sopenharmony_ciint32_t MMIService::AncoAddChannel(sptr<IAncoChannel> channel)
3598c29fa5a6Sopenharmony_ci{
3599c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask([channel]() {
3600c29fa5a6Sopenharmony_ci        return WIN_MGR->AncoAddChannel(channel);
3601c29fa5a6Sopenharmony_ci    });
3602c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3603c29fa5a6Sopenharmony_ci        MMI_HILOGE("AncoAddChannel fail, error:%{public}d", ret);
3604c29fa5a6Sopenharmony_ci    }
3605c29fa5a6Sopenharmony_ci    return ret;
3606c29fa5a6Sopenharmony_ci}
3607c29fa5a6Sopenharmony_ci
3608c29fa5a6Sopenharmony_ciint32_t MMIService::AncoRemoveChannel(sptr<IAncoChannel> channel)
3609c29fa5a6Sopenharmony_ci{
3610c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask([channel]() {
3611c29fa5a6Sopenharmony_ci        return WIN_MGR->AncoRemoveChannel(channel);
3612c29fa5a6Sopenharmony_ci    });
3613c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3614c29fa5a6Sopenharmony_ci        MMI_HILOGE("AncoRemoveChannel fail, error:%{public}d", ret);
3615c29fa5a6Sopenharmony_ci    }
3616c29fa5a6Sopenharmony_ci    return ret;
3617c29fa5a6Sopenharmony_ci}
3618c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_ANCO
3619c29fa5a6Sopenharmony_ci
3620c29fa5a6Sopenharmony_ciint32_t MMIService::TransferBinderClientSrv(const sptr<IRemoteObject> &binderClientObject)
3621c29fa5a6Sopenharmony_ci{
3622c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3623c29fa5a6Sopenharmony_ci    int32_t pid = GetCallingPid();
3624c29fa5a6Sopenharmony_ci    int32_t ret =
3625c29fa5a6Sopenharmony_ci        delegateTasks_.PostSyncTask(
3626c29fa5a6Sopenharmony_ci            [this, pid, binderClientObject] {
3627c29fa5a6Sopenharmony_ci                return sMsgHandler_.OnTransferBinderClientSrv(binderClientObject, pid);
3628c29fa5a6Sopenharmony_ci            }
3629c29fa5a6Sopenharmony_ci        );
3630c29fa5a6Sopenharmony_ci    MMI_HILOGI("TransferBinderClientSrv result:%{public}d", ret);
3631c29fa5a6Sopenharmony_ci    return ret;
3632c29fa5a6Sopenharmony_ci}
3633c29fa5a6Sopenharmony_ci
3634c29fa5a6Sopenharmony_civoid MMIService::CalculateFuntionRunningTime(std::function<void()> func, const std::string &flag)
3635c29fa5a6Sopenharmony_ci{
3636c29fa5a6Sopenharmony_ci    std::function<void (void *)> printLog = std::bind(&MMIService::PrintLog, this, flag, THREAD_BLOCK_TIMER_SPAN_S,
3637c29fa5a6Sopenharmony_ci        getpid(), gettid());
3638c29fa5a6Sopenharmony_ci    int32_t id = HiviewDFX::XCollie::GetInstance().SetTimer(flag, THREAD_BLOCK_TIMER_SPAN_S, printLog, nullptr,
3639c29fa5a6Sopenharmony_ci        HiviewDFX::XCOLLIE_FLAG_NOOP);
3640c29fa5a6Sopenharmony_ci    func();
3641c29fa5a6Sopenharmony_ci    HiviewDFX::XCollie::GetInstance().CancelTimer(id);
3642c29fa5a6Sopenharmony_ci}
3643c29fa5a6Sopenharmony_ci
3644c29fa5a6Sopenharmony_civoid MMIService::PrintLog(const std::string &flag, int32_t duration, int32_t pid, int32_t tid)
3645c29fa5a6Sopenharmony_ci{
3646c29fa5a6Sopenharmony_ci    std::string dfxThreadBlockMsg { "MMIBlockTask name:" };
3647c29fa5a6Sopenharmony_ci    dfxThreadBlockMsg += flag;
3648c29fa5a6Sopenharmony_ci    dfxThreadBlockMsg += ", duration time:";
3649c29fa5a6Sopenharmony_ci    dfxThreadBlockMsg += std::to_string(duration);
3650c29fa5a6Sopenharmony_ci    dfxThreadBlockMsg += ", pid:";
3651c29fa5a6Sopenharmony_ci    dfxThreadBlockMsg += std::to_string(pid);
3652c29fa5a6Sopenharmony_ci    dfxThreadBlockMsg += ", tid:";
3653c29fa5a6Sopenharmony_ci    dfxThreadBlockMsg += std::to_string(tid);
3654c29fa5a6Sopenharmony_ci    MMI_HILOGW("DfxThreadBlockMsg:%{public}s", dfxThreadBlockMsg.c_str());
3655c29fa5a6Sopenharmony_ci    OHOS::HiviewDFX::DfxDumpCatcher dumpCatcher;
3656c29fa5a6Sopenharmony_ci    dumpCatcher.DumpCatch(pid, tid, dfxThreadBlockMsg, MAX_FRAME_NUMS, false);
3657c29fa5a6Sopenharmony_ci}
3658c29fa5a6Sopenharmony_ci
3659c29fa5a6Sopenharmony_ciint32_t MMIService::SkipPointerLayer(bool isSkip)
3660c29fa5a6Sopenharmony_ci{
3661c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3662c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) && defined(OHOS_BUILD_ENABLE_POINTER_DRAWING)
3663c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3664c29fa5a6Sopenharmony_ci        [isSkip] {
3665c29fa5a6Sopenharmony_ci            return IPointerDrawingManager::GetInstance()->SkipPointerLayer(isSkip);
3666c29fa5a6Sopenharmony_ci        }
3667c29fa5a6Sopenharmony_ci        );
3668c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3669c29fa5a6Sopenharmony_ci        MMI_HILOGE("Skip pointer layerfailed, return:%{public}d", ret);
3670c29fa5a6Sopenharmony_ci        return ret;
3671c29fa5a6Sopenharmony_ci    }
3672c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER && OHOS_BUILD_ENABLE_POINTER_DRAWING
3673c29fa5a6Sopenharmony_ci    return RET_OK;
3674c29fa5a6Sopenharmony_ci}
3675c29fa5a6Sopenharmony_ci
3676c29fa5a6Sopenharmony_civoid MMIService::OnSessionDelete(SessionPtr session)
3677c29fa5a6Sopenharmony_ci{
3678c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3679c29fa5a6Sopenharmony_ci    CHKPV(session);
3680c29fa5a6Sopenharmony_ci    std::string programName = session->GetProgramName();
3681c29fa5a6Sopenharmony_ci    std::lock_guard<std::mutex> guard(mutex_);
3682c29fa5a6Sopenharmony_ci    auto it = clientInfos_.find(programName);
3683c29fa5a6Sopenharmony_ci    if (it != clientInfos_.end()) {
3684c29fa5a6Sopenharmony_ci        clientInfos_.erase(it);
3685c29fa5a6Sopenharmony_ci        MMI_HILOGD("Clear the client info, programName:%{public}s", programName.c_str());
3686c29fa5a6Sopenharmony_ci    }
3687c29fa5a6Sopenharmony_ci}
3688c29fa5a6Sopenharmony_ci
3689c29fa5a6Sopenharmony_ciint32_t MMIService::SetClientInfo(int32_t pid, uint64_t readThreadId)
3690c29fa5a6Sopenharmony_ci{
3691c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3692c29fa5a6Sopenharmony_ci    auto sess = GetSessionByPid(pid);
3693c29fa5a6Sopenharmony_ci    CHKPR(sess, ERROR_NULL_POINTER);
3694c29fa5a6Sopenharmony_ci    std::string programName = sess->GetProgramName();
3695c29fa5a6Sopenharmony_ci    std::lock_guard<std::mutex> guard(mutex_);
3696c29fa5a6Sopenharmony_ci    if (clientInfos_.find(programName) != clientInfos_.end()) {
3697c29fa5a6Sopenharmony_ci        clientInfos_[programName].pid = pid;
3698c29fa5a6Sopenharmony_ci        clientInfos_[programName].readThreadId = readThreadId;
3699c29fa5a6Sopenharmony_ci        return RET_OK;
3700c29fa5a6Sopenharmony_ci    }
3701c29fa5a6Sopenharmony_ci    ClientInfo clientInfo {
3702c29fa5a6Sopenharmony_ci        .pid = pid,
3703c29fa5a6Sopenharmony_ci        .readThreadId = readThreadId
3704c29fa5a6Sopenharmony_ci    };
3705c29fa5a6Sopenharmony_ci    clientInfos_[programName] = clientInfo;
3706c29fa5a6Sopenharmony_ci    return RET_OK;
3707c29fa5a6Sopenharmony_ci}
3708c29fa5a6Sopenharmony_ci
3709c29fa5a6Sopenharmony_civoid MMIService::InitPrintClientInfo()
3710c29fa5a6Sopenharmony_ci{
3711c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3712c29fa5a6Sopenharmony_ci    TimerMgr->AddLongTimer(PRINT_INTERVAL_TIME, -1, [this]() {
3713c29fa5a6Sopenharmony_ci        ffrt::submit([this] {
3714c29fa5a6Sopenharmony_ci            for (const auto &info : clientInfos_) {
3715c29fa5a6Sopenharmony_ci                if (static_cast<uint64_t>(info.second.pid) == info.second.readThreadId) {
3716c29fa5a6Sopenharmony_ci                    MMI_HILOGW("The application main thread and event reading thread are combined, such as:"
3717c29fa5a6Sopenharmony_ci                    "programName:%{public}s, pid:%{public}d, mainThreadId:%{public}d, readThreadId:%{public}" PRIu64,
3718c29fa5a6Sopenharmony_ci                    info.first.c_str(), info.second.pid, info.second.pid, info.second.readThreadId);
3719c29fa5a6Sopenharmony_ci                    return;
3720c29fa5a6Sopenharmony_ci                }
3721c29fa5a6Sopenharmony_ci            }
3722c29fa5a6Sopenharmony_ci            if (!clientInfos_.empty()) {
3723c29fa5a6Sopenharmony_ci                auto it = clientInfos_.begin();
3724c29fa5a6Sopenharmony_ci                MMI_HILOGI("The application main thread and event reading thread are separated, such as:"
3725c29fa5a6Sopenharmony_ci                "programName:%{public}s, pid:%{public}d, mainThreadId:%{public}d, readThreadId:%{public}" PRIu64,
3726c29fa5a6Sopenharmony_ci                it->first.c_str(), it->second.pid, it->second.pid, it->second.readThreadId);
3727c29fa5a6Sopenharmony_ci            }
3728c29fa5a6Sopenharmony_ci        });
3729c29fa5a6Sopenharmony_ci    });
3730c29fa5a6Sopenharmony_ci    std::function<void(SessionPtr)> callback = [this](SessionPtr sess) {
3731c29fa5a6Sopenharmony_ci        return this->OnSessionDelete(sess);
3732c29fa5a6Sopenharmony_ci    };
3733c29fa5a6Sopenharmony_ci    AddSessionDeletedCallback(callback);
3734c29fa5a6Sopenharmony_ci}
3735c29fa5a6Sopenharmony_ci
3736c29fa5a6Sopenharmony_ciint32_t MMIService::GetIntervalSinceLastInput(int64_t &timeInterval)
3737c29fa5a6Sopenharmony_ci{
3738c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
3739c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(std::bind(&InputEventHandler::GetIntervalSinceLastInput,
3740c29fa5a6Sopenharmony_ci        InputHandler, std::ref(timeInterval)));
3741c29fa5a6Sopenharmony_ci    MMI_HILOGD("timeInterval:%{public}" PRId64, timeInterval);
3742c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3743c29fa5a6Sopenharmony_ci        MMI_HILOGE("Failed to GetIntervalSinceLastInput, ret:%{public}d", ret);
3744c29fa5a6Sopenharmony_ci    }
3745c29fa5a6Sopenharmony_ci    return ret;
3746c29fa5a6Sopenharmony_ci}
3747c29fa5a6Sopenharmony_ci
3748c29fa5a6Sopenharmony_ciint32_t MMIService::GetAllSystemHotkeys(std::vector<std::unique_ptr<KeyOption>> &keyOptions)
3749c29fa5a6Sopenharmony_ci{
3750c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3751c29fa5a6Sopenharmony_ci    int32_t ret = delegateTasks_.PostSyncTask(
3752c29fa5a6Sopenharmony_ci        [this, &keyOptions] {
3753c29fa5a6Sopenharmony_ci            return this->OnGetAllSystemHotkey(keyOptions);
3754c29fa5a6Sopenharmony_ci        }
3755c29fa5a6Sopenharmony_ci        );
3756c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
3757c29fa5a6Sopenharmony_ci        MMI_HILOGD("Get all system hot key, ret:%{public}d", ret);
3758c29fa5a6Sopenharmony_ci        return ret;
3759c29fa5a6Sopenharmony_ci    }
3760c29fa5a6Sopenharmony_ci    return RET_OK;
3761c29fa5a6Sopenharmony_ci}
3762c29fa5a6Sopenharmony_ci
3763c29fa5a6Sopenharmony_ciint32_t MMIService::OnGetAllSystemHotkey(std::vector<std::unique_ptr<KeyOption>> &keyOptions)
3764c29fa5a6Sopenharmony_ci{
3765c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
3766c29fa5a6Sopenharmony_ci    #ifdef SHORTCUT_KEY_MANAGER_ENABLED
3767c29fa5a6Sopenharmony_ci    return KEY_SHORTCUT_MGR->GetAllSystemHotkeys(keyOptions);
3768c29fa5a6Sopenharmony_ci    #endif // SHORTCUT_KEY_MANAGER_ENABLED
3769c29fa5a6Sopenharmony_ci    MMI_HILOGI("OnGetAllSystemHotkey function does not support");
3770c29fa5a6Sopenharmony_ci    return ERROR_UNSUPPORT;
3771c29fa5a6Sopenharmony_ci}
3772c29fa5a6Sopenharmony_ci} // namespace MMI
3773c29fa5a6Sopenharmony_ci} // namespace OHOS
3774