1c29fa5a6Sopenharmony_ci/*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2021-2024 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 "key_subscriber_handler.h"
17c29fa5a6Sopenharmony_ci
18c29fa5a6Sopenharmony_ci#include <sstream>
19c29fa5a6Sopenharmony_ci
20c29fa5a6Sopenharmony_ci#include "app_state_observer.h"
21c29fa5a6Sopenharmony_ci#include "bytrace_adapter.h"
22c29fa5a6Sopenharmony_ci#ifdef CALL_MANAGER_SERVICE_ENABLED
23c29fa5a6Sopenharmony_ci#include "call_manager_client.h"
24c29fa5a6Sopenharmony_ci#endif // CALL_MANAGER_SERVICE_ENABLED
25c29fa5a6Sopenharmony_ci#include "common_event_data.h"
26c29fa5a6Sopenharmony_ci#include "common_event_manager.h"
27c29fa5a6Sopenharmony_ci#include "common_event_support.h"
28c29fa5a6Sopenharmony_ci#include "display_event_monitor.h"
29c29fa5a6Sopenharmony_ci#include "define_multimodal.h"
30c29fa5a6Sopenharmony_ci#include "device_event_monitor.h"
31c29fa5a6Sopenharmony_ci#include "dfx_hisysevent.h"
32c29fa5a6Sopenharmony_ci#include "error_multimodal.h"
33c29fa5a6Sopenharmony_ci#include "event_log_helper.h"
34c29fa5a6Sopenharmony_ci#include "input_event_data_transformation.h"
35c29fa5a6Sopenharmony_ci#include "input_event_handler.h"
36c29fa5a6Sopenharmony_ci#include "key_auto_repeat.h"
37c29fa5a6Sopenharmony_ci#include "net_packet.h"
38c29fa5a6Sopenharmony_ci#include "proto.h"
39c29fa5a6Sopenharmony_ci#ifdef SHORTCUT_KEY_MANAGER_ENABLED
40c29fa5a6Sopenharmony_ci#include "key_shortcut_manager.h"
41c29fa5a6Sopenharmony_ci#endif // SHORTCUT_KEY_MANAGER_ENABLED
42c29fa5a6Sopenharmony_ci#include "setting_datashare.h"
43c29fa5a6Sopenharmony_ci#include "timer_manager.h"
44c29fa5a6Sopenharmony_ci#include "util_ex.h"
45c29fa5a6Sopenharmony_ci#include "want.h"
46c29fa5a6Sopenharmony_ci
47c29fa5a6Sopenharmony_ci#undef MMI_LOG_DOMAIN
48c29fa5a6Sopenharmony_ci#define MMI_LOG_DOMAIN MMI_LOG_HANDLER
49c29fa5a6Sopenharmony_ci#undef MMI_LOG_TAG
50c29fa5a6Sopenharmony_ci#define MMI_LOG_TAG "KeySubscriberHandler"
51c29fa5a6Sopenharmony_ci
52c29fa5a6Sopenharmony_cinamespace OHOS {
53c29fa5a6Sopenharmony_cinamespace MMI {
54c29fa5a6Sopenharmony_cinamespace {
55c29fa5a6Sopenharmony_ciconstexpr uint32_t MAX_PRE_KEY_COUNT { 4 };
56c29fa5a6Sopenharmony_ciconstexpr int32_t REMOVE_OBSERVER { -2 };
57c29fa5a6Sopenharmony_ciconstexpr int32_t UNOBSERVED { -1 };
58c29fa5a6Sopenharmony_ciconstexpr int32_t ACTIVE_EVENT { 2 };
59c29fa5a6Sopenharmony_ci#ifdef CALL_MANAGER_SERVICE_ENABLED
60c29fa5a6Sopenharmony_cistd::shared_ptr<OHOS::Telephony::CallManagerClient> callManagerClientPtr = nullptr;
61c29fa5a6Sopenharmony_ci#endif // CALL_MANAGER_SERVICE_ENABLED
62c29fa5a6Sopenharmony_ciconst std::string CALL_BEHAVIOR_KEY { "incall_power_button_behavior" };
63c29fa5a6Sopenharmony_ciconst std::string SETTINGS_DATA_SYSTEM_URI {
64c29fa5a6Sopenharmony_ci    "datashare:///com.ohos.settingsdata/entry/settingsdata/USER_SETTINGSDATA_100?Proxy=true" };
65c29fa5a6Sopenharmony_ciconst std::string SETTINGS_DATA_EXT_URI {
66c29fa5a6Sopenharmony_ci    "datashare:///com.ohos.USER_SETTINGSDATA_100.DataAbility" };
67c29fa5a6Sopenharmony_ci} // namespace
68c29fa5a6Sopenharmony_ci
69c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
70c29fa5a6Sopenharmony_civoid KeySubscriberHandler::HandleKeyEvent(const std::shared_ptr<KeyEvent> keyEvent)
71c29fa5a6Sopenharmony_ci{
72c29fa5a6Sopenharmony_ci    CHKPV(keyEvent);
73c29fa5a6Sopenharmony_ci    if (OnSubscribeKeyEvent(keyEvent)) {
74c29fa5a6Sopenharmony_ci        if (EventLogHelper::IsBetaVersion() && !keyEvent->HasFlag(InputEvent::EVENT_FLAG_PRIVACY_MODE)) {
75c29fa5a6Sopenharmony_ci            MMI_HILOGD("Subscribe keyEvent filter success. keyCode:%{private}d", keyEvent->GetKeyCode());
76c29fa5a6Sopenharmony_ci        } else {
77c29fa5a6Sopenharmony_ci            MMI_HILOGD("Subscribe keyEvent filter success. keyCode:%{private}d", keyEvent->GetKeyCode());
78c29fa5a6Sopenharmony_ci        }
79c29fa5a6Sopenharmony_ci        BytraceAdapter::StartBytrace(keyEvent, BytraceAdapter::KEY_SUBSCRIBE_EVENT);
80c29fa5a6Sopenharmony_ci        return;
81c29fa5a6Sopenharmony_ci    }
82c29fa5a6Sopenharmony_ci    CHKPV(nextHandler_);
83c29fa5a6Sopenharmony_ci    nextHandler_->HandleKeyEvent(keyEvent);
84c29fa5a6Sopenharmony_ci}
85c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
86c29fa5a6Sopenharmony_ci
87c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_POINTER
88c29fa5a6Sopenharmony_civoid KeySubscriberHandler::HandlePointerEvent(const std::shared_ptr<PointerEvent> pointerEvent)
89c29fa5a6Sopenharmony_ci{
90c29fa5a6Sopenharmony_ci    CHKPV(pointerEvent);
91c29fa5a6Sopenharmony_ci    CHKPV(nextHandler_);
92c29fa5a6Sopenharmony_ci    nextHandler_->HandlePointerEvent(pointerEvent);
93c29fa5a6Sopenharmony_ci}
94c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER
95c29fa5a6Sopenharmony_ci
96c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_TOUCH
97c29fa5a6Sopenharmony_civoid KeySubscriberHandler::HandleTouchEvent(const std::shared_ptr<PointerEvent> pointerEvent)
98c29fa5a6Sopenharmony_ci{
99c29fa5a6Sopenharmony_ci    CHKPV(pointerEvent);
100c29fa5a6Sopenharmony_ci    CHKPV(nextHandler_);
101c29fa5a6Sopenharmony_ci    nextHandler_->HandleTouchEvent(pointerEvent);
102c29fa5a6Sopenharmony_ci}
103c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_TOUCH
104c29fa5a6Sopenharmony_ci
105c29fa5a6Sopenharmony_ciint32_t KeySubscriberHandler::SubscribeKeyEvent(
106c29fa5a6Sopenharmony_ci    SessionPtr sess, int32_t subscribeId, std::shared_ptr<KeyOption> keyOption)
107c29fa5a6Sopenharmony_ci{
108c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
109c29fa5a6Sopenharmony_ci    if (subscribeId < 0) {
110c29fa5a6Sopenharmony_ci        MMI_HILOGE("Invalid subscribe");
111c29fa5a6Sopenharmony_ci        return RET_ERR;
112c29fa5a6Sopenharmony_ci    }
113c29fa5a6Sopenharmony_ci    CHKPR(sess, ERROR_NULL_POINTER);
114c29fa5a6Sopenharmony_ci    CHKPR(keyOption, ERROR_NULL_POINTER);
115c29fa5a6Sopenharmony_ci    uint32_t preKeySize = keyOption->GetPreKeys().size();
116c29fa5a6Sopenharmony_ci    if (preKeySize > MAX_PRE_KEY_COUNT) {
117c29fa5a6Sopenharmony_ci        MMI_HILOGE("Leave, preKeySize:%{public}u", preKeySize);
118c29fa5a6Sopenharmony_ci        return RET_ERR;
119c29fa5a6Sopenharmony_ci    }
120c29fa5a6Sopenharmony_ci
121c29fa5a6Sopenharmony_ci    for (const auto &keyCode : keyOption->GetPreKeys()) {
122c29fa5a6Sopenharmony_ci        MMI_HILOGD("keyOption->prekey:%{private}d", keyCode);
123c29fa5a6Sopenharmony_ci    }
124c29fa5a6Sopenharmony_ci    MMI_HILOGI("SubscribeId:%{public}d, finalKey:%{private}d,"
125c29fa5a6Sopenharmony_ci        "isFinalKeyDown:%{public}s, finalKeyDownDuration:%{public}d, pid:%{public}d",
126c29fa5a6Sopenharmony_ci        subscribeId, keyOption->GetFinalKey(), keyOption->IsFinalKeyDown() ? "true" : "false",
127c29fa5a6Sopenharmony_ci        keyOption->GetFinalKeyDownDuration(), sess->GetPid());
128c29fa5a6Sopenharmony_ci    auto subscriber = std::make_shared<Subscriber>(subscribeId, sess, keyOption);
129c29fa5a6Sopenharmony_ci    if (keyGestureMgr_.ShouldIntercept(keyOption)) {
130c29fa5a6Sopenharmony_ci        auto ret = AddKeyGestureSubscriber(subscriber, keyOption);
131c29fa5a6Sopenharmony_ci        if (ret != RET_OK) {
132c29fa5a6Sopenharmony_ci            MMI_HILOGE("AddKeyGestureSubscriber fail, error:%{public}d", ret);
133c29fa5a6Sopenharmony_ci            return ret;
134c29fa5a6Sopenharmony_ci        }
135c29fa5a6Sopenharmony_ci    } else {
136c29fa5a6Sopenharmony_ci        auto ret = AddSubscriber(subscriber, keyOption, true);
137c29fa5a6Sopenharmony_ci        if (ret != RET_OK) {
138c29fa5a6Sopenharmony_ci            MMI_HILOGE("AddSubscriber fail, error:%{public}d", ret);
139c29fa5a6Sopenharmony_ci            return ret;
140c29fa5a6Sopenharmony_ci        }
141c29fa5a6Sopenharmony_ci    }
142c29fa5a6Sopenharmony_ci    InitSessionDeleteCallback();
143c29fa5a6Sopenharmony_ci    return RET_OK;
144c29fa5a6Sopenharmony_ci}
145c29fa5a6Sopenharmony_ci
146c29fa5a6Sopenharmony_ciint32_t KeySubscriberHandler::UnsubscribeKeyEvent(SessionPtr sess, int32_t subscribeId)
147c29fa5a6Sopenharmony_ci{
148c29fa5a6Sopenharmony_ci    CHKPR(sess, ERROR_NULL_POINTER);
149c29fa5a6Sopenharmony_ci    MMI_HILOGI("SubscribeId:%{public}d, pid:%{public}d", subscribeId, sess->GetPid());
150c29fa5a6Sopenharmony_ci    int32_t ret = RemoveSubscriber(sess, subscribeId, true);
151c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
152c29fa5a6Sopenharmony_ci        ret = RemoveKeyGestureSubscriber(sess, subscribeId);
153c29fa5a6Sopenharmony_ci    }
154c29fa5a6Sopenharmony_ci    return ret;
155c29fa5a6Sopenharmony_ci}
156c29fa5a6Sopenharmony_ci
157c29fa5a6Sopenharmony_ciint32_t KeySubscriberHandler::RemoveSubscriber(SessionPtr sess, int32_t subscribeId, bool isSystem)
158c29fa5a6Sopenharmony_ci{
159c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
160c29fa5a6Sopenharmony_ci    for (auto iter = subscriberMap_.begin(); iter != subscriberMap_.end(); iter++) {
161c29fa5a6Sopenharmony_ci        auto &subscribers = iter->second;
162c29fa5a6Sopenharmony_ci        for (auto it = subscribers.begin(); it != subscribers.end(); it++) {
163c29fa5a6Sopenharmony_ci            if ((*it)->id_ == subscribeId && (*it)->sess_ == sess) {
164c29fa5a6Sopenharmony_ci                ClearTimer(*it);
165c29fa5a6Sopenharmony_ci                auto option = (*it)->keyOption_;
166c29fa5a6Sopenharmony_ci                CHKPR(option, ERROR_NULL_POINTER);
167c29fa5a6Sopenharmony_ci#ifdef SHORTCUT_KEY_MANAGER_ENABLED
168c29fa5a6Sopenharmony_ci                if (isSystem) {
169c29fa5a6Sopenharmony_ci                    KEY_SHORTCUT_MGR->UnregisterSystemKey((*it)->shortcutId_);
170c29fa5a6Sopenharmony_ci                } else {
171c29fa5a6Sopenharmony_ci                    KEY_SHORTCUT_MGR->UnregisterHotKey((*it)->shortcutId_);
172c29fa5a6Sopenharmony_ci                }
173c29fa5a6Sopenharmony_ci#endif // SHORTCUT_KEY_MANAGER_ENABLED
174c29fa5a6Sopenharmony_ci                MMI_HILOGI("SubscribeId:%{public}d, finalKey:%{private}d, isFinalKeyDown:%{public}s,"
175c29fa5a6Sopenharmony_ci                    "finalKeyDownDuration:%{public}d, pid:%{public}d", subscribeId, option->GetFinalKey(),
176c29fa5a6Sopenharmony_ci                    option->IsFinalKeyDown() ? "true" : "false", option->GetFinalKeyDownDuration(), sess->GetPid());
177c29fa5a6Sopenharmony_ci                subscribers.erase(it);
178c29fa5a6Sopenharmony_ci                return RET_OK;
179c29fa5a6Sopenharmony_ci            }
180c29fa5a6Sopenharmony_ci        }
181c29fa5a6Sopenharmony_ci    }
182c29fa5a6Sopenharmony_ci    return RET_ERR;
183c29fa5a6Sopenharmony_ci}
184c29fa5a6Sopenharmony_ci
185c29fa5a6Sopenharmony_ciint32_t KeySubscriberHandler::AddKeyGestureSubscriber(
186c29fa5a6Sopenharmony_ci    std::shared_ptr<Subscriber> subscriber, std::shared_ptr<KeyOption> keyOption)
187c29fa5a6Sopenharmony_ci{
188c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
189c29fa5a6Sopenharmony_ci    CHKPR(subscriber, RET_ERR);
190c29fa5a6Sopenharmony_ci    CHKPR(subscriber->sess_, RET_ERR);
191c29fa5a6Sopenharmony_ci    subscriber->timerId_ = keyGestureMgr_.AddKeyGesture(subscriber->sess_->GetPid(), keyOption,
192c29fa5a6Sopenharmony_ci        [this, subscriber](std::shared_ptr<KeyEvent> keyEvent) {
193c29fa5a6Sopenharmony_ci            NotifySubscriber(keyEvent, subscriber);
194c29fa5a6Sopenharmony_ci        });
195c29fa5a6Sopenharmony_ci    if (subscriber->timerId_ < 0) {
196c29fa5a6Sopenharmony_ci        MMI_HILOGE("AddKeyGesture fail, error:%{public}d", subscriber->timerId_);
197c29fa5a6Sopenharmony_ci        return RET_ERR;
198c29fa5a6Sopenharmony_ci    }
199c29fa5a6Sopenharmony_ci    MMI_HILOGI("Handler(%{public}d) of key gesture was added", subscriber->timerId_);
200c29fa5a6Sopenharmony_ci    PrintKeyOption(keyOption);
201c29fa5a6Sopenharmony_ci    for (auto &iter : keyGestures_) {
202c29fa5a6Sopenharmony_ci        if (IsEqualKeyOption(keyOption, iter.first)) {
203c29fa5a6Sopenharmony_ci            iter.second.push_back(subscriber);
204c29fa5a6Sopenharmony_ci            return RET_OK;
205c29fa5a6Sopenharmony_ci        }
206c29fa5a6Sopenharmony_ci    }
207c29fa5a6Sopenharmony_ci    keyGestures_[keyOption] = { subscriber };
208c29fa5a6Sopenharmony_ci    return RET_OK;
209c29fa5a6Sopenharmony_ci}
210c29fa5a6Sopenharmony_ci
211c29fa5a6Sopenharmony_ciint32_t KeySubscriberHandler::RemoveKeyGestureSubscriber(SessionPtr sess, int32_t subscribeId)
212c29fa5a6Sopenharmony_ci{
213c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
214c29fa5a6Sopenharmony_ci    for (auto iter = keyGestures_.begin(); iter != keyGestures_.end(); ++iter) {
215c29fa5a6Sopenharmony_ci        auto &subscribers = iter->second;
216c29fa5a6Sopenharmony_ci
217c29fa5a6Sopenharmony_ci        for (auto innerIter = subscribers.begin(); innerIter != subscribers.end(); ++innerIter) {
218c29fa5a6Sopenharmony_ci            auto subscriber = *innerIter;
219c29fa5a6Sopenharmony_ci
220c29fa5a6Sopenharmony_ci            if ((subscriber->id_ != subscribeId) || (subscriber->sess_ != sess)) {
221c29fa5a6Sopenharmony_ci                continue;
222c29fa5a6Sopenharmony_ci            }
223c29fa5a6Sopenharmony_ci            MMI_HILOGI("Removing handler(%{public}d) of key gesture", subscriber->timerId_);
224c29fa5a6Sopenharmony_ci            keyGestureMgr_.RemoveKeyGesture(subscriber->timerId_);
225c29fa5a6Sopenharmony_ci            auto option = subscriber->keyOption_;
226c29fa5a6Sopenharmony_ci            MMI_HILOGI("SubscribeId:%{public}d, finalKey:%{private}d, isFinalKeyDown:%{public}s,"
227c29fa5a6Sopenharmony_ci                "finalKeyDownDuration:%{public}d, pid:%{public}d", subscribeId, option->GetFinalKey(),
228c29fa5a6Sopenharmony_ci                option->IsFinalKeyDown() ? "true" : "false", option->GetFinalKeyDownDuration(), sess->GetPid());
229c29fa5a6Sopenharmony_ci            subscribers.erase(innerIter);
230c29fa5a6Sopenharmony_ci            return RET_OK;
231c29fa5a6Sopenharmony_ci        }
232c29fa5a6Sopenharmony_ci    }
233c29fa5a6Sopenharmony_ci    return RET_ERR;
234c29fa5a6Sopenharmony_ci}
235c29fa5a6Sopenharmony_ci
236c29fa5a6Sopenharmony_ci#ifdef SHORTCUT_KEY_MANAGER_ENABLED
237c29fa5a6Sopenharmony_ciint32_t KeySubscriberHandler::RegisterSystemKey(std::shared_ptr<KeyOption> option,
238c29fa5a6Sopenharmony_ci    int32_t session, std::function<void(std::shared_ptr<KeyEvent>)> callback)
239c29fa5a6Sopenharmony_ci{
240c29fa5a6Sopenharmony_ci    KeyShortcutManager::SystemShortcutKey sysKey {
241c29fa5a6Sopenharmony_ci        .modifiers = option->GetPreKeys(),
242c29fa5a6Sopenharmony_ci        .finalKey = option->GetFinalKey(),
243c29fa5a6Sopenharmony_ci        .longPressTime = option->GetFinalKeyDownDuration(),
244c29fa5a6Sopenharmony_ci        .triggerType = (option->IsFinalKeyDown() ? KeyShortcutManager::SHORTCUT_TRIGGER_TYPE_DOWN :
245c29fa5a6Sopenharmony_ci                                                   KeyShortcutManager::SHORTCUT_TRIGGER_TYPE_UP),
246c29fa5a6Sopenharmony_ci        .session = session,
247c29fa5a6Sopenharmony_ci        .callback = callback,
248c29fa5a6Sopenharmony_ci    };
249c29fa5a6Sopenharmony_ci    return KEY_SHORTCUT_MGR->RegisterSystemKey(sysKey);
250c29fa5a6Sopenharmony_ci}
251c29fa5a6Sopenharmony_ci
252c29fa5a6Sopenharmony_ciint32_t KeySubscriberHandler::RegisterHotKey(std::shared_ptr<KeyOption> option,
253c29fa5a6Sopenharmony_ci    int32_t session, std::function<void(std::shared_ptr<KeyEvent>)> callback)
254c29fa5a6Sopenharmony_ci{
255c29fa5a6Sopenharmony_ci    KeyShortcutManager::HotKey hotKey {
256c29fa5a6Sopenharmony_ci        .modifiers = option->GetPreKeys(),
257c29fa5a6Sopenharmony_ci        .finalKey = option->GetFinalKey(),
258c29fa5a6Sopenharmony_ci        .longPressTime = option->GetFinalKeyDownDuration(),
259c29fa5a6Sopenharmony_ci        .session = session,
260c29fa5a6Sopenharmony_ci        .callback = callback,
261c29fa5a6Sopenharmony_ci    };
262c29fa5a6Sopenharmony_ci    return KEY_SHORTCUT_MGR->RegisterHotKey(hotKey);
263c29fa5a6Sopenharmony_ci}
264c29fa5a6Sopenharmony_ci
265c29fa5a6Sopenharmony_civoid KeySubscriberHandler::UnregisterSystemKey(int32_t shortcutId)
266c29fa5a6Sopenharmony_ci{
267c29fa5a6Sopenharmony_ci    KEY_SHORTCUT_MGR->UnregisterSystemKey(shortcutId);
268c29fa5a6Sopenharmony_ci}
269c29fa5a6Sopenharmony_ci
270c29fa5a6Sopenharmony_civoid KeySubscriberHandler::UnregisterHotKey(int32_t shortcutId)
271c29fa5a6Sopenharmony_ci{
272c29fa5a6Sopenharmony_ci    KEY_SHORTCUT_MGR->UnregisterHotKey(shortcutId);
273c29fa5a6Sopenharmony_ci}
274c29fa5a6Sopenharmony_ci
275c29fa5a6Sopenharmony_civoid KeySubscriberHandler::DeleteShortcutId(std::shared_ptr<Subscriber> subscriber)
276c29fa5a6Sopenharmony_ci{
277c29fa5a6Sopenharmony_ci    if (subscriber->isSystem) {
278c29fa5a6Sopenharmony_ci        UnregisterSystemKey(subscriber->shortcutId_);
279c29fa5a6Sopenharmony_ci    } else {
280c29fa5a6Sopenharmony_ci        UnregisterHotKey(subscriber->shortcutId_);
281c29fa5a6Sopenharmony_ci    }
282c29fa5a6Sopenharmony_ci}
283c29fa5a6Sopenharmony_ci#endif // SHORTCUT_KEY_MANAGER_ENABLED
284c29fa5a6Sopenharmony_ci
285c29fa5a6Sopenharmony_ciint32_t KeySubscriberHandler::SubscribeHotkey(
286c29fa5a6Sopenharmony_ci    SessionPtr sess, int32_t subscribeId, std::shared_ptr<KeyOption> keyOption)
287c29fa5a6Sopenharmony_ci{
288c29fa5a6Sopenharmony_ci    CHKPR(sess, ERROR_NULL_POINTER);
289c29fa5a6Sopenharmony_ci    CHKPR(keyOption, ERROR_NULL_POINTER);
290c29fa5a6Sopenharmony_ci    uint32_t preKeySize = keyOption->GetPreKeys().size();
291c29fa5a6Sopenharmony_ci    if (preKeySize > MAX_PRE_KEY_COUNT) {
292c29fa5a6Sopenharmony_ci        MMI_HILOGE("Leave, preKeySize:%{public}u", preKeySize);
293c29fa5a6Sopenharmony_ci        return RET_ERR;
294c29fa5a6Sopenharmony_ci    }
295c29fa5a6Sopenharmony_ci    for (const auto &keyCode : keyOption->GetPreKeys()) {
296c29fa5a6Sopenharmony_ci        MMI_HILOGD("keyOption->prekey:%{private}d", keyCode);
297c29fa5a6Sopenharmony_ci    }
298c29fa5a6Sopenharmony_ci    MMI_HILOGI("SubscribeId:%{public}d, finalKey:%{private}d,"
299c29fa5a6Sopenharmony_ci        "isFinalKeyDown:%{public}s, finalKeyDownDuration:%{public}d, pid:%{public}d",
300c29fa5a6Sopenharmony_ci        subscribeId, keyOption->GetFinalKey(), keyOption->IsFinalKeyDown() ? "true" : "false",
301c29fa5a6Sopenharmony_ci        keyOption->GetFinalKeyDownDuration(), sess->GetPid());
302c29fa5a6Sopenharmony_ci    auto subscriber = std::make_shared<Subscriber>(subscribeId, sess, keyOption);
303c29fa5a6Sopenharmony_ci    auto ret = AddSubscriber(subscriber, keyOption, false);
304c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
305c29fa5a6Sopenharmony_ci        MMI_HILOGE("AddSubscriber fail, error:%{public}d", ret);
306c29fa5a6Sopenharmony_ci        return ret;
307c29fa5a6Sopenharmony_ci    }
308c29fa5a6Sopenharmony_ci    InitSessionDeleteCallback();
309c29fa5a6Sopenharmony_ci    return RET_OK;
310c29fa5a6Sopenharmony_ci}
311c29fa5a6Sopenharmony_ci
312c29fa5a6Sopenharmony_ciint32_t KeySubscriberHandler::UnsubscribeHotkey(SessionPtr sess, int32_t subscribeId)
313c29fa5a6Sopenharmony_ci{
314c29fa5a6Sopenharmony_ci    CHKPR(sess, ERROR_NULL_POINTER);
315c29fa5a6Sopenharmony_ci    MMI_HILOGI("SubscribeId:%{public}d, pid:%{public}d", subscribeId, sess->GetPid());
316c29fa5a6Sopenharmony_ci    int32_t ret = RemoveSubscriber(sess, subscribeId, false);
317c29fa5a6Sopenharmony_ci    if (ret != RET_OK) {
318c29fa5a6Sopenharmony_ci        MMI_HILOGW("No hot key subscription(%{public}d, No.%{public}d)", sess->GetPid(), subscribeId);
319c29fa5a6Sopenharmony_ci    }
320c29fa5a6Sopenharmony_ci    return ret;
321c29fa5a6Sopenharmony_ci}
322c29fa5a6Sopenharmony_ci
323c29fa5a6Sopenharmony_ciint32_t KeySubscriberHandler::AddSubscriber(std::shared_ptr<Subscriber> subscriber,
324c29fa5a6Sopenharmony_ci    std::shared_ptr<KeyOption> option, bool isSystem)
325c29fa5a6Sopenharmony_ci{
326c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
327c29fa5a6Sopenharmony_ci    CHKPR(subscriber, RET_ERR);
328c29fa5a6Sopenharmony_ci    CHKPR(option, RET_ERR);
329c29fa5a6Sopenharmony_ci    PrintKeyOption(option);
330c29fa5a6Sopenharmony_ci#ifdef SHORTCUT_KEY_MANAGER_ENABLED
331c29fa5a6Sopenharmony_ci    CHKPR(subscriber->sess_, RET_ERR);
332c29fa5a6Sopenharmony_ci    if (isSystem) {
333c29fa5a6Sopenharmony_ci        subscriber->isSystem = true;
334c29fa5a6Sopenharmony_ci        subscriber->shortcutId_ = RegisterSystemKey(option, subscriber->sess_->GetPid(),
335c29fa5a6Sopenharmony_ci            [this, subscriber](std::shared_ptr<KeyEvent> keyEvent) {
336c29fa5a6Sopenharmony_ci                NotifySubscriber(keyEvent, subscriber);
337c29fa5a6Sopenharmony_ci            });
338c29fa5a6Sopenharmony_ci    } else {
339c29fa5a6Sopenharmony_ci        subscriber->isSystem = false;
340c29fa5a6Sopenharmony_ci        subscriber->shortcutId_ = RegisterHotKey(option, subscriber->sess_->GetPid(),
341c29fa5a6Sopenharmony_ci            [this, subscriber](std::shared_ptr<KeyEvent> keyEvent) {
342c29fa5a6Sopenharmony_ci                NotifySubscriber(keyEvent, subscriber);
343c29fa5a6Sopenharmony_ci            });
344c29fa5a6Sopenharmony_ci    }
345c29fa5a6Sopenharmony_ci    if (subscriber->shortcutId_ < 0) {
346c29fa5a6Sopenharmony_ci        MMI_HILOGE("Register shortcut fail, error:%{public}d", subscriber->shortcutId_);
347c29fa5a6Sopenharmony_ci        return subscriber->shortcutId_;
348c29fa5a6Sopenharmony_ci    }
349c29fa5a6Sopenharmony_ci#endif // SHORTCUT_KEY_MANAGER_ENABLED
350c29fa5a6Sopenharmony_ci    for (auto &iter : subscriberMap_) {
351c29fa5a6Sopenharmony_ci        if (IsEqualKeyOption(option, iter.first)) {
352c29fa5a6Sopenharmony_ci            MMI_HILOGI("Add subscriber Id:%{public}d", subscriber->id_);
353c29fa5a6Sopenharmony_ci            iter.second.push_back(std::move(subscriber));
354c29fa5a6Sopenharmony_ci            MMI_HILOGI("Subscriber size:%{public}zu", iter.second.size());
355c29fa5a6Sopenharmony_ci            return RET_OK;
356c29fa5a6Sopenharmony_ci        }
357c29fa5a6Sopenharmony_ci    }
358c29fa5a6Sopenharmony_ci    MMI_HILOGI("Add subscriber Id:%{public}d", subscriber->id_);
359c29fa5a6Sopenharmony_ci    subscriberMap_[option] = {subscriber};
360c29fa5a6Sopenharmony_ci    return RET_OK;
361c29fa5a6Sopenharmony_ci}
362c29fa5a6Sopenharmony_ci
363c29fa5a6Sopenharmony_cibool KeySubscriberHandler::IsEqualKeyOption(std::shared_ptr<KeyOption> newOption,
364c29fa5a6Sopenharmony_ci    std::shared_ptr<KeyOption> oldOption)
365c29fa5a6Sopenharmony_ci{
366c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
367c29fa5a6Sopenharmony_ci    CHKPF(newOption);
368c29fa5a6Sopenharmony_ci    CHKPF(oldOption);
369c29fa5a6Sopenharmony_ci    if (!IsEqualPreKeys(newOption->GetPreKeys(), oldOption->GetPreKeys())) {
370c29fa5a6Sopenharmony_ci        MMI_HILOGD("Pre key not match");
371c29fa5a6Sopenharmony_ci        return false;
372c29fa5a6Sopenharmony_ci    }
373c29fa5a6Sopenharmony_ci    if (newOption->GetFinalKey() != oldOption->GetFinalKey()) {
374c29fa5a6Sopenharmony_ci        MMI_HILOGD("Final key not match");
375c29fa5a6Sopenharmony_ci        return false;
376c29fa5a6Sopenharmony_ci    }
377c29fa5a6Sopenharmony_ci    if (newOption->IsFinalKeyDown() != oldOption->IsFinalKeyDown()) {
378c29fa5a6Sopenharmony_ci        MMI_HILOGD("Is final key down not match");
379c29fa5a6Sopenharmony_ci        return false;
380c29fa5a6Sopenharmony_ci    }
381c29fa5a6Sopenharmony_ci    if (newOption->GetFinalKeyDownDuration() != oldOption->GetFinalKeyDownDuration()) {
382c29fa5a6Sopenharmony_ci        MMI_HILOGD("Final key down duration not match");
383c29fa5a6Sopenharmony_ci        return false;
384c29fa5a6Sopenharmony_ci    }
385c29fa5a6Sopenharmony_ci    if (newOption->GetFinalKeyUpDelay() != oldOption->GetFinalKeyUpDelay()) {
386c29fa5a6Sopenharmony_ci        MMI_HILOGD("Is final key up delay not match");
387c29fa5a6Sopenharmony_ci        return false;
388c29fa5a6Sopenharmony_ci    }
389c29fa5a6Sopenharmony_ci    MMI_HILOGD("Key option match");
390c29fa5a6Sopenharmony_ci    return true;
391c29fa5a6Sopenharmony_ci}
392c29fa5a6Sopenharmony_ci
393c29fa5a6Sopenharmony_civoid KeySubscriberHandler::GetForegroundPids(std::set<int32_t> &pids)
394c29fa5a6Sopenharmony_ci{
395c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
396c29fa5a6Sopenharmony_ci    std::vector<AppExecFwk::AppStateData> list = APP_OBSERVER_MGR->GetForegroundAppData();
397c29fa5a6Sopenharmony_ci    for (auto iter = list.begin(); iter != list.end(); iter++) {
398c29fa5a6Sopenharmony_ci        MMI_HILOGD("Foreground process pid:%{public}d", (*iter).pid);
399c29fa5a6Sopenharmony_ci        pids.insert((*iter).pid);
400c29fa5a6Sopenharmony_ci    }
401c29fa5a6Sopenharmony_ci}
402c29fa5a6Sopenharmony_ci
403c29fa5a6Sopenharmony_ciint32_t KeySubscriberHandler::EnableCombineKey(bool enable)
404c29fa5a6Sopenharmony_ci{
405c29fa5a6Sopenharmony_ci    enableCombineKey_ = enable;
406c29fa5a6Sopenharmony_ci    MMI_HILOGI("Enable combineKey is successful in subscribe handler, enable:%{public}d", enable);
407c29fa5a6Sopenharmony_ci    return RET_OK;
408c29fa5a6Sopenharmony_ci}
409c29fa5a6Sopenharmony_ci
410c29fa5a6Sopenharmony_cibool KeySubscriberHandler::IsFunctionKey(const std::shared_ptr<KeyEvent> keyEvent)
411c29fa5a6Sopenharmony_ci{
412c29fa5a6Sopenharmony_ci    MMI_HILOGD("Is Funciton Key In");
413c29fa5a6Sopenharmony_ci    if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_BRIGHTNESS_DOWN
414c29fa5a6Sopenharmony_ci        || keyEvent->GetKeyCode() == KeyEvent::KEYCODE_BRIGHTNESS_UP) {
415c29fa5a6Sopenharmony_ci        return true;
416c29fa5a6Sopenharmony_ci    }
417c29fa5a6Sopenharmony_ci    if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_VOLUME_UP
418c29fa5a6Sopenharmony_ci        || keyEvent->GetKeyCode() == KeyEvent::KEYCODE_VOLUME_DOWN
419c29fa5a6Sopenharmony_ci        || keyEvent->GetKeyCode() == KeyEvent::KEYCODE_VOLUME_MUTE) {
420c29fa5a6Sopenharmony_ci        return true;
421c29fa5a6Sopenharmony_ci    }
422c29fa5a6Sopenharmony_ci    if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_MUTE
423c29fa5a6Sopenharmony_ci        || keyEvent->GetKeyCode() == KeyEvent::KEYCODE_SWITCHVIDEOMODE
424c29fa5a6Sopenharmony_ci        || keyEvent->GetKeyCode() == KeyEvent::KEYCODE_SEARCH
425c29fa5a6Sopenharmony_ci        || keyEvent->GetKeyCode() == KeyEvent::KEYCODE_MEDIA_RECORD) {
426c29fa5a6Sopenharmony_ci        return true;
427c29fa5a6Sopenharmony_ci    }
428c29fa5a6Sopenharmony_ci    return false;
429c29fa5a6Sopenharmony_ci}
430c29fa5a6Sopenharmony_ci
431c29fa5a6Sopenharmony_cibool KeySubscriberHandler::IsEnableCombineKey(const std::shared_ptr<KeyEvent> keyEvent)
432c29fa5a6Sopenharmony_ci{
433c29fa5a6Sopenharmony_ci    CHKPF(keyEvent);
434c29fa5a6Sopenharmony_ci    if (enableCombineKey_) {
435c29fa5a6Sopenharmony_ci        return true;
436c29fa5a6Sopenharmony_ci    }
437c29fa5a6Sopenharmony_ci    if (IsFunctionKey(keyEvent)) {
438c29fa5a6Sopenharmony_ci        auto items = keyEvent->GetKeyItems();
439c29fa5a6Sopenharmony_ci        return items.size() != 1 ? enableCombineKey_ : true;
440c29fa5a6Sopenharmony_ci    }
441c29fa5a6Sopenharmony_ci    if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER) {
442c29fa5a6Sopenharmony_ci        auto items = keyEvent->GetKeyItems();
443c29fa5a6Sopenharmony_ci        if (items.size() != 1) {
444c29fa5a6Sopenharmony_ci            return enableCombineKey_;
445c29fa5a6Sopenharmony_ci        }
446c29fa5a6Sopenharmony_ci        return true;
447c29fa5a6Sopenharmony_ci    }
448c29fa5a6Sopenharmony_ci    if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_DPAD_RIGHT ||
449c29fa5a6Sopenharmony_ci        keyEvent->GetKeyCode() == KeyEvent::KEYCODE_DPAD_LEFT) {
450c29fa5a6Sopenharmony_ci        if (EventLogHelper::IsBetaVersion() && !keyEvent->HasFlag(InputEvent::EVENT_FLAG_PRIVACY_MODE)) {
451c29fa5a6Sopenharmony_ci            MMI_HILOGD("Subscriber mulit swipe keycode is:%{public}d", keyEvent->GetKeyCode());
452c29fa5a6Sopenharmony_ci        } else {
453c29fa5a6Sopenharmony_ci            MMI_HILOGD("Subscriber mulit swipe keycode is:%{private}d", keyEvent->GetKeyCode());
454c29fa5a6Sopenharmony_ci        }
455c29fa5a6Sopenharmony_ci        return IsEnableCombineKeySwipe(keyEvent);
456c29fa5a6Sopenharmony_ci    }
457c29fa5a6Sopenharmony_ci    if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_L) {
458c29fa5a6Sopenharmony_ci        for (const auto &item : keyEvent->GetKeyItems()) {
459c29fa5a6Sopenharmony_ci            int32_t keyCode = item.GetKeyCode();
460c29fa5a6Sopenharmony_ci            if (keyCode != KeyEvent::KEYCODE_L && keyCode != KeyEvent::KEYCODE_META_LEFT &&
461c29fa5a6Sopenharmony_ci                keyCode != KeyEvent::KEYCODE_META_RIGHT) {
462c29fa5a6Sopenharmony_ci                return enableCombineKey_;
463c29fa5a6Sopenharmony_ci            }
464c29fa5a6Sopenharmony_ci        }
465c29fa5a6Sopenharmony_ci        return true;
466c29fa5a6Sopenharmony_ci    }
467c29fa5a6Sopenharmony_ci    return enableCombineKey_;
468c29fa5a6Sopenharmony_ci}
469c29fa5a6Sopenharmony_ci
470c29fa5a6Sopenharmony_cibool KeySubscriberHandler::IsEnableCombineKeySwipe(const std::shared_ptr<KeyEvent> keyEvent)
471c29fa5a6Sopenharmony_ci{
472c29fa5a6Sopenharmony_ci    for (const auto &item : keyEvent->GetKeyItems()) {
473c29fa5a6Sopenharmony_ci        int32_t keyCode = item.GetKeyCode();
474c29fa5a6Sopenharmony_ci        if (keyCode != KeyEvent::KEYCODE_CTRL_LEFT && keyCode != KeyEvent::KEYCODE_META_LEFT &&
475c29fa5a6Sopenharmony_ci            keyCode != KeyEvent::KEYCODE_DPAD_RIGHT && keyCode != KeyEvent::KEYCODE_CTRL_RIGHT &&
476c29fa5a6Sopenharmony_ci            keyCode != KeyEvent::KEYCODE_DPAD_LEFT) {
477c29fa5a6Sopenharmony_ci            return enableCombineKey_;
478c29fa5a6Sopenharmony_ci        }
479c29fa5a6Sopenharmony_ci    }
480c29fa5a6Sopenharmony_ci    return true;
481c29fa5a6Sopenharmony_ci}
482c29fa5a6Sopenharmony_ci
483c29fa5a6Sopenharmony_civoid KeySubscriberHandler::PublishKeyPressCommonEvent(std::shared_ptr<KeyEvent> keyEvent)
484c29fa5a6Sopenharmony_ci{
485c29fa5a6Sopenharmony_ci    OHOS::AAFwk::Want want;
486c29fa5a6Sopenharmony_ci    want.SetAction("multimodal.event.MUTE_KEY_PRESS");
487c29fa5a6Sopenharmony_ci    want.SetParam("keyCode", keyEvent->GetKeyCode());
488c29fa5a6Sopenharmony_ci    EventFwk::CommonEventPublishInfo publishInfo;
489c29fa5a6Sopenharmony_ci    std::vector<std::string> permissionVec {"ohos.permission.NOTIFICATION_CONTROLLER"};
490c29fa5a6Sopenharmony_ci    publishInfo.SetSubscriberPermissions(permissionVec);
491c29fa5a6Sopenharmony_ci    EventFwk::CommonEventData commonData {want};
492c29fa5a6Sopenharmony_ci    EventFwk::CommonEventManager::PublishCommonEvent(commonData, publishInfo);
493c29fa5a6Sopenharmony_ci}
494c29fa5a6Sopenharmony_ci
495c29fa5a6Sopenharmony_cibool KeySubscriberHandler::HandleRingMute(std::shared_ptr<KeyEvent> keyEvent)
496c29fa5a6Sopenharmony_ci{
497c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
498c29fa5a6Sopenharmony_ci    CHKPF(keyEvent);
499c29fa5a6Sopenharmony_ci    if (keyEvent->GetKeyCode() != KeyEvent::KEYCODE_VOLUME_DOWN &&
500c29fa5a6Sopenharmony_ci        keyEvent->GetKeyCode() != KeyEvent::KEYCODE_VOLUME_UP &&
501c29fa5a6Sopenharmony_ci        keyEvent->GetKeyCode() != KeyEvent::KEYCODE_POWER) {
502c29fa5a6Sopenharmony_ci        MMI_HILOGD("There is no need to set mute");
503c29fa5a6Sopenharmony_ci        return false;
504c29fa5a6Sopenharmony_ci    }
505c29fa5a6Sopenharmony_ci#ifdef CALL_MANAGER_SERVICE_ENABLED
506c29fa5a6Sopenharmony_ci    int32_t ret = -1;
507c29fa5a6Sopenharmony_ci    PublishKeyPressCommonEvent(keyEvent);
508c29fa5a6Sopenharmony_ci    if (DEVICE_MONITOR->GetCallState() == StateType::CALL_STATUS_INCOMING ||
509c29fa5a6Sopenharmony_ci        DEVICE_MONITOR->GetCallState() == StateType::CALL_STATUS_WAITING) {
510c29fa5a6Sopenharmony_ci        if (callManagerClientPtr == nullptr) {
511c29fa5a6Sopenharmony_ci            callManagerClientPtr = DelayedSingleton<OHOS::Telephony::CallManagerClient>::GetInstance();
512c29fa5a6Sopenharmony_ci            if (callManagerClientPtr == nullptr) {
513c29fa5a6Sopenharmony_ci                MMI_HILOGE("CallManager init fail");
514c29fa5a6Sopenharmony_ci                return false;
515c29fa5a6Sopenharmony_ci            }
516c29fa5a6Sopenharmony_ci            callManagerClientPtr->Init(OHOS::TELEPHONY_CALL_MANAGER_SYS_ABILITY_ID);
517c29fa5a6Sopenharmony_ci        }
518c29fa5a6Sopenharmony_ci        if (!DEVICE_MONITOR->GetHasHandleRingMute()) {
519c29fa5a6Sopenharmony_ci            ret = callManagerClientPtr->MuteRinger();
520c29fa5a6Sopenharmony_ci            if (ret != ERR_OK) {
521c29fa5a6Sopenharmony_ci                MMI_HILOGE("Set mute fail, ret:%{public}d", ret);
522c29fa5a6Sopenharmony_ci                return false;
523c29fa5a6Sopenharmony_ci            }
524c29fa5a6Sopenharmony_ci            MMI_HILOGI("Set mute success");
525c29fa5a6Sopenharmony_ci            DEVICE_MONITOR->SetHasHandleRingMute(true);
526c29fa5a6Sopenharmony_ci            if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER) {
527c29fa5a6Sopenharmony_ci                needSkipPowerKeyUp_ = true;
528c29fa5a6Sopenharmony_ci            }
529c29fa5a6Sopenharmony_ci            return true;
530c29fa5a6Sopenharmony_ci        } else {
531c29fa5a6Sopenharmony_ci            if (keyEvent->GetKeyCode() != KeyEvent::KEYCODE_POWER) {
532c29fa5a6Sopenharmony_ci                MMI_HILOGD("Set mute success, block volumeKey");
533c29fa5a6Sopenharmony_ci                return true;
534c29fa5a6Sopenharmony_ci            }
535c29fa5a6Sopenharmony_ci        }
536c29fa5a6Sopenharmony_ci    }
537c29fa5a6Sopenharmony_ci    return false;
538c29fa5a6Sopenharmony_ci#else
539c29fa5a6Sopenharmony_ci    MMI_HILOGD("call manager service is not enabled, skip");
540c29fa5a6Sopenharmony_ci    return true;
541c29fa5a6Sopenharmony_ci#endif // CALL_MANAGER_SERVICE_ENABLED
542c29fa5a6Sopenharmony_ci}
543c29fa5a6Sopenharmony_ci
544c29fa5a6Sopenharmony_cibool KeySubscriberHandler::OnSubscribeKeyEvent(std::shared_ptr<KeyEvent> keyEvent)
545c29fa5a6Sopenharmony_ci{
546c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
547c29fa5a6Sopenharmony_ci    CHKPF(keyEvent);
548c29fa5a6Sopenharmony_ci    if (HandleRingMute(keyEvent)) {
549c29fa5a6Sopenharmony_ci        MMI_HILOGI("Mute Ring in subscribe keyEvent");
550c29fa5a6Sopenharmony_ci        RemoveSubscriberTimer(keyEvent);
551c29fa5a6Sopenharmony_ci        return true;
552c29fa5a6Sopenharmony_ci    }
553c29fa5a6Sopenharmony_ci    if (HandleCallEnded(keyEvent)) {
554c29fa5a6Sopenharmony_ci        MMI_HILOGI("Call Ended in subscribe keyEvent");
555c29fa5a6Sopenharmony_ci        return true;
556c29fa5a6Sopenharmony_ci    }
557c29fa5a6Sopenharmony_ci    if (!IsEnableCombineKey(keyEvent)) {
558c29fa5a6Sopenharmony_ci        MMI_HILOGI("Combine key is taken over in subscribe keyEvent");
559c29fa5a6Sopenharmony_ci        return false;
560c29fa5a6Sopenharmony_ci    }
561c29fa5a6Sopenharmony_ci    if (keyGestureMgr_.Intercept(keyEvent)) {
562c29fa5a6Sopenharmony_ci        MMI_HILOGD("Key gesture recognized");
563c29fa5a6Sopenharmony_ci        return true;
564c29fa5a6Sopenharmony_ci    }
565c29fa5a6Sopenharmony_ci    if (IsRepeatedKeyEvent(keyEvent)) {
566c29fa5a6Sopenharmony_ci        MMI_HILOGD("Repeat KeyEvent, skip");
567c29fa5a6Sopenharmony_ci        return true;
568c29fa5a6Sopenharmony_ci    }
569c29fa5a6Sopenharmony_ci    keyEvent_ = KeyEvent::Clone(keyEvent);
570c29fa5a6Sopenharmony_ci    int32_t keyAction = keyEvent->GetKeyAction();
571c29fa5a6Sopenharmony_ci    if (EventLogHelper::IsBetaVersion() && !keyEvent->HasFlag(InputEvent::EVENT_FLAG_PRIVACY_MODE)) {
572c29fa5a6Sopenharmony_ci        MMI_HILOGD("keyCode:%{private}d, keyAction:%{public}s", keyEvent->GetKeyCode(),
573c29fa5a6Sopenharmony_ci            KeyEvent::ActionToString(keyAction));
574c29fa5a6Sopenharmony_ci    } else {
575c29fa5a6Sopenharmony_ci        MMI_HILOGD("keyCode:%{private}d, keyAction:%{public}s",
576c29fa5a6Sopenharmony_ci            keyEvent->GetKeyCode(), KeyEvent::ActionToString(keyAction));
577c29fa5a6Sopenharmony_ci    }
578c29fa5a6Sopenharmony_ci    if (needSkipPowerKeyUp_ && keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER
579c29fa5a6Sopenharmony_ci        && keyAction == KeyEvent::KEY_ACTION_UP) {
580c29fa5a6Sopenharmony_ci        MMI_HILOGD("Skip power key up");
581c29fa5a6Sopenharmony_ci        needSkipPowerKeyUp_ = false;
582c29fa5a6Sopenharmony_ci        return true;
583c29fa5a6Sopenharmony_ci    }
584c29fa5a6Sopenharmony_ci    for (const auto &keyCode : keyEvent->GetPressedKeys()) {
585c29fa5a6Sopenharmony_ci        if (EventLogHelper::IsBetaVersion() && !keyEvent->HasFlag(InputEvent::EVENT_FLAG_PRIVACY_MODE)) {
586c29fa5a6Sopenharmony_ci            MMI_HILOGD("Pressed KeyCode:%{private}d", keyCode);
587c29fa5a6Sopenharmony_ci        } else {
588c29fa5a6Sopenharmony_ci            MMI_HILOGD("Pressed KeyCode:%{private}d", keyCode);
589c29fa5a6Sopenharmony_ci        }
590c29fa5a6Sopenharmony_ci    }
591c29fa5a6Sopenharmony_ci    bool handled = false;
592c29fa5a6Sopenharmony_ci    if (keyAction == KeyEvent::KEY_ACTION_DOWN) {
593c29fa5a6Sopenharmony_ci        handled = HandleKeyDown(keyEvent);
594c29fa5a6Sopenharmony_ci    } else if (keyAction == KeyEvent::KEY_ACTION_UP) {
595c29fa5a6Sopenharmony_ci        hasEventExecuting_ = false;
596c29fa5a6Sopenharmony_ci        handled = HandleKeyUp(keyEvent);
597c29fa5a6Sopenharmony_ci    } else if (keyAction == KeyEvent::KEY_ACTION_CANCEL) {
598c29fa5a6Sopenharmony_ci        hasEventExecuting_ = false;
599c29fa5a6Sopenharmony_ci        handled = HandleKeyCancel(keyEvent);
600c29fa5a6Sopenharmony_ci    } else {
601c29fa5a6Sopenharmony_ci        MMI_HILOGW("keyAction exception");
602c29fa5a6Sopenharmony_ci    }
603c29fa5a6Sopenharmony_ci    return handled;
604c29fa5a6Sopenharmony_ci}
605c29fa5a6Sopenharmony_ci
606c29fa5a6Sopenharmony_civoid KeySubscriberHandler::OnSessionDelete(SessionPtr sess)
607c29fa5a6Sopenharmony_ci{
608c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
609c29fa5a6Sopenharmony_ci    CHKPV(sess);
610c29fa5a6Sopenharmony_ci    for (auto iter = subscriberMap_.begin(); iter != subscriberMap_.end(); iter++) {
611c29fa5a6Sopenharmony_ci        auto &subscribers = iter->second;
612c29fa5a6Sopenharmony_ci        for (auto it = subscribers.begin(); it != subscribers.end();) {
613c29fa5a6Sopenharmony_ci            if ((*it)->sess_ == sess) {
614c29fa5a6Sopenharmony_ci                ClearTimer(*it);
615c29fa5a6Sopenharmony_ci#ifdef SHORTCUT_KEY_MANAGER_ENABLED
616c29fa5a6Sopenharmony_ci                DeleteShortcutId(*it);
617c29fa5a6Sopenharmony_ci#endif // SHORTCUT_KEY_MANAGER_ENABLED
618c29fa5a6Sopenharmony_ci                subscribers.erase(it++);
619c29fa5a6Sopenharmony_ci                continue;
620c29fa5a6Sopenharmony_ci            }
621c29fa5a6Sopenharmony_ci            ++it;
622c29fa5a6Sopenharmony_ci        }
623c29fa5a6Sopenharmony_ci    }
624c29fa5a6Sopenharmony_ci    for (auto iter = keyGestures_.begin(); iter != keyGestures_.end();) {
625c29fa5a6Sopenharmony_ci        auto &subscribers = iter->second;
626c29fa5a6Sopenharmony_ci        for (auto inner = subscribers.begin(); inner != subscribers.end();) {
627c29fa5a6Sopenharmony_ci            auto subscriber = *inner;
628c29fa5a6Sopenharmony_ci            if (subscriber->sess_ == sess) {
629c29fa5a6Sopenharmony_ci                MMI_HILOGI("Removing key-gesture handler(%{public}d) on subscriber(%{public}d) dying",
630c29fa5a6Sopenharmony_ci                    subscriber->timerId_, sess->GetPid());
631c29fa5a6Sopenharmony_ci                keyGestureMgr_.RemoveKeyGesture(subscriber->timerId_);
632c29fa5a6Sopenharmony_ci                auto option = subscriber->keyOption_;
633c29fa5a6Sopenharmony_ci                MMI_HILOGI("SubscribeId:%{public}d, finalKey:%{private}d, isFinalKeyDown:%{public}s,"
634c29fa5a6Sopenharmony_ci                    "finalKeyDownDuration:%{public}d, pid:%{public}d", subscriber->id_, option->GetFinalKey(),
635c29fa5a6Sopenharmony_ci                    option->IsFinalKeyDown() ? "true" : "false", option->GetFinalKeyDownDuration(), sess->GetPid());
636c29fa5a6Sopenharmony_ci                inner = subscribers.erase(inner);
637c29fa5a6Sopenharmony_ci            } else {
638c29fa5a6Sopenharmony_ci                ++inner;
639c29fa5a6Sopenharmony_ci            }
640c29fa5a6Sopenharmony_ci        }
641c29fa5a6Sopenharmony_ci        if (subscribers.empty()) {
642c29fa5a6Sopenharmony_ci            iter = keyGestures_.erase(iter);
643c29fa5a6Sopenharmony_ci        } else {
644c29fa5a6Sopenharmony_ci            ++iter;
645c29fa5a6Sopenharmony_ci        }
646c29fa5a6Sopenharmony_ci    }
647c29fa5a6Sopenharmony_ci}
648c29fa5a6Sopenharmony_ci
649c29fa5a6Sopenharmony_cibool KeySubscriberHandler::IsPreKeysMatch(const std::set<int32_t> &preKeys,
650c29fa5a6Sopenharmony_ci                                          const std::vector<int32_t> &pressedKeys) const
651c29fa5a6Sopenharmony_ci{
652c29fa5a6Sopenharmony_ci    if (preKeys.size() == 0) {
653c29fa5a6Sopenharmony_ci        return true;
654c29fa5a6Sopenharmony_ci    }
655c29fa5a6Sopenharmony_ci
656c29fa5a6Sopenharmony_ci    if (preKeys.size() != pressedKeys.size()) {
657c29fa5a6Sopenharmony_ci        return false;
658c29fa5a6Sopenharmony_ci    }
659c29fa5a6Sopenharmony_ci
660c29fa5a6Sopenharmony_ci    for (const auto &pressedKey : pressedKeys) {
661c29fa5a6Sopenharmony_ci        auto it = std::find(preKeys.begin(), preKeys.end(), pressedKey);
662c29fa5a6Sopenharmony_ci        if (it == preKeys.end()) {
663c29fa5a6Sopenharmony_ci            return false;
664c29fa5a6Sopenharmony_ci        }
665c29fa5a6Sopenharmony_ci    }
666c29fa5a6Sopenharmony_ci
667c29fa5a6Sopenharmony_ci    return true;
668c29fa5a6Sopenharmony_ci}
669c29fa5a6Sopenharmony_ci
670c29fa5a6Sopenharmony_cibool KeySubscriberHandler::IsEqualPreKeys(const std::set<int32_t> &preKeys, const std::set<int32_t> &pressedKeys)
671c29fa5a6Sopenharmony_ci{
672c29fa5a6Sopenharmony_ci    if (preKeys.size() != pressedKeys.size()) {
673c29fa5a6Sopenharmony_ci        MMI_HILOGD("Pre key size not equal");
674c29fa5a6Sopenharmony_ci        return false;
675c29fa5a6Sopenharmony_ci    }
676c29fa5a6Sopenharmony_ci
677c29fa5a6Sopenharmony_ci    for (const auto &pressedKey : pressedKeys) {
678c29fa5a6Sopenharmony_ci        auto it = std::find(preKeys.begin(), preKeys.end(), pressedKey);
679c29fa5a6Sopenharmony_ci        if (it == preKeys.end()) {
680c29fa5a6Sopenharmony_ci            return false;
681c29fa5a6Sopenharmony_ci        }
682c29fa5a6Sopenharmony_ci    }
683c29fa5a6Sopenharmony_ci    MMI_HILOGD("Equal prekeys");
684c29fa5a6Sopenharmony_ci    return true;
685c29fa5a6Sopenharmony_ci}
686c29fa5a6Sopenharmony_ci
687c29fa5a6Sopenharmony_cibool KeySubscriberHandler::IsMatchForegroundPid(std::list<std::shared_ptr<Subscriber>> subs,
688c29fa5a6Sopenharmony_ci    std::set<int32_t> foregroundPids)
689c29fa5a6Sopenharmony_ci{
690c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
691c29fa5a6Sopenharmony_ci    isForegroundExits_ = false;
692c29fa5a6Sopenharmony_ci    foregroundPids_.clear();
693c29fa5a6Sopenharmony_ci    for (const auto &item : subs) {
694c29fa5a6Sopenharmony_ci        CHKPF(item);
695c29fa5a6Sopenharmony_ci        auto sess = item->sess_;
696c29fa5a6Sopenharmony_ci        CHKPF(sess);
697c29fa5a6Sopenharmony_ci        if (foregroundPids.find(sess->GetPid()) != foregroundPids.end()) {
698c29fa5a6Sopenharmony_ci            MMI_HILOGD("Subscriber foregroundPid:%{public}d", sess->GetPid());
699c29fa5a6Sopenharmony_ci            foregroundPids_.insert(sess->GetPid());
700c29fa5a6Sopenharmony_ci            isForegroundExits_ = true;
701c29fa5a6Sopenharmony_ci        }
702c29fa5a6Sopenharmony_ci    }
703c29fa5a6Sopenharmony_ci    MMI_HILOGD("isForegroundExits_:%{public}d, foregroundPids:%{public}zu",
704c29fa5a6Sopenharmony_ci        isForegroundExits_, foregroundPids_.size());
705c29fa5a6Sopenharmony_ci    return isForegroundExits_;
706c29fa5a6Sopenharmony_ci}
707c29fa5a6Sopenharmony_ci
708c29fa5a6Sopenharmony_civoid KeySubscriberHandler::NotifyKeyDownSubscriber(const std::shared_ptr<KeyEvent> &keyEvent,
709c29fa5a6Sopenharmony_ci    std::shared_ptr<KeyOption> keyOption, std::list<std::shared_ptr<Subscriber>> &subscribers, bool &handled)
710c29fa5a6Sopenharmony_ci{
711c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
712c29fa5a6Sopenharmony_ci    CHKPV(keyEvent);
713c29fa5a6Sopenharmony_ci    CHKPV(keyOption);
714c29fa5a6Sopenharmony_ci    MMI_HILOGD("Notify key down subscribers size:%{public}zu", subscribers.size());
715c29fa5a6Sopenharmony_ci    if (keyOption->GetFinalKeyDownDuration() <= 0) {
716c29fa5a6Sopenharmony_ci        NotifyKeyDownRightNow(keyEvent, subscribers, keyOption->IsRepeat(), handled);
717c29fa5a6Sopenharmony_ci    } else {
718c29fa5a6Sopenharmony_ci        NotifyKeyDownDelay(keyEvent, subscribers, handled);
719c29fa5a6Sopenharmony_ci    }
720c29fa5a6Sopenharmony_ci}
721c29fa5a6Sopenharmony_civoid KeySubscriberHandler::NotifyKeyDownRightNow(const std::shared_ptr<KeyEvent> &keyEvent,
722c29fa5a6Sopenharmony_ci    std::list<std::shared_ptr<Subscriber>> &subscribers, bool isRepeat, bool &handled)
723c29fa5a6Sopenharmony_ci{
724c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
725c29fa5a6Sopenharmony_ci    MMI_HILOGD("The subscribe list size is %{public}zu", subscribers.size());
726c29fa5a6Sopenharmony_ci    for (auto &subscriber : subscribers) {
727c29fa5a6Sopenharmony_ci        CHKPC(subscriber);
728c29fa5a6Sopenharmony_ci        auto sess = subscriber->sess_;
729c29fa5a6Sopenharmony_ci        CHKPC(sess);
730c29fa5a6Sopenharmony_ci        if (!isForegroundExits_ || keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER ||
731c29fa5a6Sopenharmony_ci            foregroundPids_.find(sess->GetPid()) != foregroundPids_.end()) {
732c29fa5a6Sopenharmony_ci            MMI_HILOGD("keyOption->GetFinalKeyDownDuration() <= 0");
733c29fa5a6Sopenharmony_ci            if (!isRepeat && keyEvent->GetKeyCode() == KeyRepeat->GetRepeatKeyCode()) {
734c29fa5a6Sopenharmony_ci                MMI_HILOGD("Subscribers do not need to repeat events");
735c29fa5a6Sopenharmony_ci                handled = true;
736c29fa5a6Sopenharmony_ci                continue;
737c29fa5a6Sopenharmony_ci            }
738c29fa5a6Sopenharmony_ci            NotifySubscriber(keyEvent, subscriber);
739c29fa5a6Sopenharmony_ci            handled = true;
740c29fa5a6Sopenharmony_ci        }
741c29fa5a6Sopenharmony_ci    }
742c29fa5a6Sopenharmony_ci}
743c29fa5a6Sopenharmony_ci
744c29fa5a6Sopenharmony_civoid KeySubscriberHandler::NotifyKeyDownDelay(const std::shared_ptr<KeyEvent> &keyEvent,
745c29fa5a6Sopenharmony_ci    std::list<std::shared_ptr<Subscriber>> &subscribers, bool &handled)
746c29fa5a6Sopenharmony_ci{
747c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
748c29fa5a6Sopenharmony_ci    MMI_HILOGD("The subscribe list size is %{public}zu", subscribers.size());
749c29fa5a6Sopenharmony_ci    for (auto &subscriber : subscribers) {
750c29fa5a6Sopenharmony_ci        CHKPC(subscriber);
751c29fa5a6Sopenharmony_ci        auto sess = subscriber->sess_;
752c29fa5a6Sopenharmony_ci        CHKPC(sess);
753c29fa5a6Sopenharmony_ci        if (!isForegroundExits_ || keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER ||
754c29fa5a6Sopenharmony_ci            foregroundPids_.find(sess->GetPid()) != foregroundPids_.end()) {
755c29fa5a6Sopenharmony_ci            MMI_HILOGD("Add timer");
756c29fa5a6Sopenharmony_ci            if (!AddTimer(subscriber, keyEvent)) {
757c29fa5a6Sopenharmony_ci                MMI_HILOGE("Add time failed, subscriberId:%{public}d", subscriber->id_);
758c29fa5a6Sopenharmony_ci                continue;
759c29fa5a6Sopenharmony_ci            }
760c29fa5a6Sopenharmony_ci            handled = true;
761c29fa5a6Sopenharmony_ci        }
762c29fa5a6Sopenharmony_ci    }
763c29fa5a6Sopenharmony_ci}
764c29fa5a6Sopenharmony_ci
765c29fa5a6Sopenharmony_civoid KeySubscriberHandler::NotifyKeyUpSubscriber(const std::shared_ptr<KeyEvent> &keyEvent,
766c29fa5a6Sopenharmony_ci    std::list<std::shared_ptr<Subscriber>> subscribers, bool &handled)
767c29fa5a6Sopenharmony_ci{
768c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
769c29fa5a6Sopenharmony_ci    MMI_HILOGD("Subscribers size:%{public}zu", subscribers.size());
770c29fa5a6Sopenharmony_ci    for (auto &subscriber : subscribers) {
771c29fa5a6Sopenharmony_ci        CHKPC(subscriber);
772c29fa5a6Sopenharmony_ci        auto sess = subscriber->sess_;
773c29fa5a6Sopenharmony_ci        CHKPC(sess);
774c29fa5a6Sopenharmony_ci        if (!isForegroundExits_ || foregroundPids_.find(sess->GetPid()) != foregroundPids_.end()) {
775c29fa5a6Sopenharmony_ci            HandleKeyUpWithDelay(keyEvent, subscriber);
776c29fa5a6Sopenharmony_ci            handled = true;
777c29fa5a6Sopenharmony_ci        }
778c29fa5a6Sopenharmony_ci    }
779c29fa5a6Sopenharmony_ci}
780c29fa5a6Sopenharmony_ci
781c29fa5a6Sopenharmony_civoid KeySubscriberHandler::NotifySubscriber(std::shared_ptr<KeyEvent> keyEvent,
782c29fa5a6Sopenharmony_ci    const std::shared_ptr<Subscriber> &subscriber) __attribute__((no_sanitize("cfi")))
783c29fa5a6Sopenharmony_ci{
784c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
785c29fa5a6Sopenharmony_ci    CHKPV(keyEvent);
786c29fa5a6Sopenharmony_ci    CHKPV(subscriber);
787c29fa5a6Sopenharmony_ci#ifdef SHORTCUT_KEY_RULES_ENABLED
788c29fa5a6Sopenharmony_ci    if (keyEvent->GetKeyCode() != KeyEvent::KEYCODE_POWER) {
789c29fa5a6Sopenharmony_ci        CHKPV(subscriber->keyOption_);
790c29fa5a6Sopenharmony_ci        KEY_SHORTCUT_MGR->MarkShortcutConsumed(*subscriber->keyOption_);
791c29fa5a6Sopenharmony_ci    }
792c29fa5a6Sopenharmony_ci#endif // SHORTCUT_KEY_RULES_ENABLED
793c29fa5a6Sopenharmony_ci    auto udsServerPtr = InputHandler->GetUDSServer();
794c29fa5a6Sopenharmony_ci    CHKPV(udsServerPtr);
795c29fa5a6Sopenharmony_ci    if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER) {
796c29fa5a6Sopenharmony_ci        DfxHisysevent::ReportPowerInfo(keyEvent, OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC);
797c29fa5a6Sopenharmony_ci    }
798c29fa5a6Sopenharmony_ci    SubscriberNotifyNap(subscriber);
799c29fa5a6Sopenharmony_ci    NetPacket pkt(MmiMessageId::ON_SUBSCRIBE_KEY);
800c29fa5a6Sopenharmony_ci    InputEventDataTransformation::KeyEventToNetPacket(keyEvent, pkt);
801c29fa5a6Sopenharmony_ci    auto sess = subscriber->sess_;
802c29fa5a6Sopenharmony_ci    CHKPV(sess);
803c29fa5a6Sopenharmony_ci    int32_t fd = sess->GetFd();
804c29fa5a6Sopenharmony_ci    pkt << fd << subscriber->id_;
805c29fa5a6Sopenharmony_ci    if (!EventLogHelper::IsBetaVersion()) {
806c29fa5a6Sopenharmony_ci        MMI_HILOGI("Notify subscriber id:%{public}d, pid:%{public}d", subscriber->id_, sess->GetPid());
807c29fa5a6Sopenharmony_ci    } else {
808c29fa5a6Sopenharmony_ci        if (EventLogHelper::IsBetaVersion() && !keyEvent->HasFlag(InputEvent::EVENT_FLAG_PRIVACY_MODE)) {
809c29fa5a6Sopenharmony_ci            MMI_HILOGI("Notify subscriber id:%{public}d, keycode:%{private}d, pid:%{public}d",
810c29fa5a6Sopenharmony_ci                subscriber->id_, keyEvent->GetKeyCode(), sess->GetPid());
811c29fa5a6Sopenharmony_ci        } else {
812c29fa5a6Sopenharmony_ci            MMI_HILOGI("Notify subscriber id:%{public}d, keycode:%{private}d, pid:%{public}d",
813c29fa5a6Sopenharmony_ci                subscriber->id_, keyEvent->GetKeyCode(), sess->GetPid());
814c29fa5a6Sopenharmony_ci        }
815c29fa5a6Sopenharmony_ci    }
816c29fa5a6Sopenharmony_ci    if (pkt.ChkRWError()) {
817c29fa5a6Sopenharmony_ci        MMI_HILOGE("Packet write dispatch subscriber failed");
818c29fa5a6Sopenharmony_ci        return;
819c29fa5a6Sopenharmony_ci    }
820c29fa5a6Sopenharmony_ci    if (!udsServerPtr->SendMsg(fd, pkt)) {
821c29fa5a6Sopenharmony_ci        MMI_HILOGE("Leave, server dispatch subscriber failed");
822c29fa5a6Sopenharmony_ci        return;
823c29fa5a6Sopenharmony_ci    }
824c29fa5a6Sopenharmony_ci}
825c29fa5a6Sopenharmony_ci
826c29fa5a6Sopenharmony_cibool KeySubscriberHandler::AddTimer(const std::shared_ptr<Subscriber> &subscriber,
827c29fa5a6Sopenharmony_ci                                    const std::shared_ptr<KeyEvent> &keyEvent)
828c29fa5a6Sopenharmony_ci{
829c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
830c29fa5a6Sopenharmony_ci    CHKPF(keyEvent);
831c29fa5a6Sopenharmony_ci    CHKPF(subscriber);
832c29fa5a6Sopenharmony_ci
833c29fa5a6Sopenharmony_ci    if (subscriber->timerId_ >= 0) {
834c29fa5a6Sopenharmony_ci        MMI_HILOGW("Leave, timer already added, it may have been added by injection");
835c29fa5a6Sopenharmony_ci        return true;
836c29fa5a6Sopenharmony_ci    }
837c29fa5a6Sopenharmony_ci
838c29fa5a6Sopenharmony_ci    auto &keyOption = subscriber->keyOption_;
839c29fa5a6Sopenharmony_ci    bool isKeyDown = keyOption->IsFinalKeyDown();
840c29fa5a6Sopenharmony_ci    int32_t duration = isKeyDown ? keyOption->GetFinalKeyDownDuration() : keyOption->GetFinalKeyUpDelay();
841c29fa5a6Sopenharmony_ci    if (duration <= 0) {
842c29fa5a6Sopenharmony_ci        MMI_HILOGE("Leave, duration <= 0");
843c29fa5a6Sopenharmony_ci        return true;
844c29fa5a6Sopenharmony_ci    }
845c29fa5a6Sopenharmony_ci
846c29fa5a6Sopenharmony_ci    if (!CloneKeyEvent(keyEvent)) {
847c29fa5a6Sopenharmony_ci        MMI_HILOGE("Leave, cloneKeyEvent failed");
848c29fa5a6Sopenharmony_ci        return false;
849c29fa5a6Sopenharmony_ci    }
850c29fa5a6Sopenharmony_ci
851c29fa5a6Sopenharmony_ci    std::weak_ptr<Subscriber> weakSubscriber = subscriber;
852c29fa5a6Sopenharmony_ci    subscriber->timerId_ = TimerMgr->AddTimer(duration, 1, [this, weakSubscriber] () {
853c29fa5a6Sopenharmony_ci        MMI_HILOGD("Timer callback");
854c29fa5a6Sopenharmony_ci        auto subscriber = weakSubscriber.lock();
855c29fa5a6Sopenharmony_ci        CHKPV(subscriber);
856c29fa5a6Sopenharmony_ci        OnTimer(subscriber);
857c29fa5a6Sopenharmony_ci    });
858c29fa5a6Sopenharmony_ci
859c29fa5a6Sopenharmony_ci    if (subscriber->timerId_ < 0) {
860c29fa5a6Sopenharmony_ci        MMI_HILOGE("Leave, addTimer failed");
861c29fa5a6Sopenharmony_ci        return false;
862c29fa5a6Sopenharmony_ci    }
863c29fa5a6Sopenharmony_ci    subscriber->keyEvent_ = keyEvent_;
864c29fa5a6Sopenharmony_ci    hasEventExecuting_ = true;
865c29fa5a6Sopenharmony_ci    MMI_HILOGD("Leave, add timer success, subscribeId:%{public}d,"
866c29fa5a6Sopenharmony_ci        "duration:%{public}d, timerId:%{public}d",
867c29fa5a6Sopenharmony_ci        subscriber->id_, duration, subscriber->timerId_);
868c29fa5a6Sopenharmony_ci    return true;
869c29fa5a6Sopenharmony_ci}
870c29fa5a6Sopenharmony_ci
871c29fa5a6Sopenharmony_civoid KeySubscriberHandler::ClearSubscriberTimer(std::list<std::shared_ptr<Subscriber>> subscribers)
872c29fa5a6Sopenharmony_ci{
873c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
874c29fa5a6Sopenharmony_ci    MMI_HILOGD("Clear subscriber timer size:%{public}zu", subscribers.size());
875c29fa5a6Sopenharmony_ci    for (auto &subscriber : subscribers) {
876c29fa5a6Sopenharmony_ci        CHKPC(subscriber);
877c29fa5a6Sopenharmony_ci        ClearTimer(subscriber);
878c29fa5a6Sopenharmony_ci    }
879c29fa5a6Sopenharmony_ci}
880c29fa5a6Sopenharmony_ci
881c29fa5a6Sopenharmony_civoid KeySubscriberHandler::ClearTimer(const std::shared_ptr<Subscriber> &subscriber)
882c29fa5a6Sopenharmony_ci{
883c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
884c29fa5a6Sopenharmony_ci    CHKPV(subscriber);
885c29fa5a6Sopenharmony_ci
886c29fa5a6Sopenharmony_ci    if (subscriber->timerId_ < 0) {
887c29fa5a6Sopenharmony_ci        MMI_HILOGD("Leave, subscribeId:%{public}d, null timerId < 0", subscriber->id_);
888c29fa5a6Sopenharmony_ci        return;
889c29fa5a6Sopenharmony_ci    }
890c29fa5a6Sopenharmony_ci
891c29fa5a6Sopenharmony_ci    TimerMgr->RemoveTimer(subscriber->timerId_);
892c29fa5a6Sopenharmony_ci    auto timerId = subscriber->timerId_;
893c29fa5a6Sopenharmony_ci    subscriber->keyEvent_.reset();
894c29fa5a6Sopenharmony_ci    subscriber->timerId_ = -1;
895c29fa5a6Sopenharmony_ci    hasEventExecuting_ = false;
896c29fa5a6Sopenharmony_ci    MMI_HILOGD("subscribeId:%{public}d, timerId:%{public}d", subscriber->id_, timerId);
897c29fa5a6Sopenharmony_ci}
898c29fa5a6Sopenharmony_ci
899c29fa5a6Sopenharmony_civoid KeySubscriberHandler::OnTimer(const std::shared_ptr<Subscriber> subscriber)
900c29fa5a6Sopenharmony_ci{
901c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
902c29fa5a6Sopenharmony_ci    CHKPV(subscriber);
903c29fa5a6Sopenharmony_ci    subscriber->timerId_ = -1;
904c29fa5a6Sopenharmony_ci    if (subscriber->keyEvent_ == nullptr) {
905c29fa5a6Sopenharmony_ci        MMI_HILOGE("Leave, subscriber->keyEvent is nullptr, subscribeId:%{public}d", subscriber->id_);
906c29fa5a6Sopenharmony_ci        return;
907c29fa5a6Sopenharmony_ci    }
908c29fa5a6Sopenharmony_ci
909c29fa5a6Sopenharmony_ci    NotifySubscriber(subscriber->keyEvent_, subscriber);
910c29fa5a6Sopenharmony_ci    subscriber->keyEvent_.reset();
911c29fa5a6Sopenharmony_ci    MMI_HILOGD("subscribeId:%{public}d", subscriber->id_);
912c29fa5a6Sopenharmony_ci}
913c29fa5a6Sopenharmony_ci
914c29fa5a6Sopenharmony_cibool KeySubscriberHandler::InitSessionDeleteCallback()
915c29fa5a6Sopenharmony_ci{
916c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
917c29fa5a6Sopenharmony_ci    if (callbackInitialized_) {
918c29fa5a6Sopenharmony_ci        MMI_HILOGD("Session delete callback has already been initialized");
919c29fa5a6Sopenharmony_ci        return true;
920c29fa5a6Sopenharmony_ci    }
921c29fa5a6Sopenharmony_ci    auto udsServerPtr = InputHandler->GetUDSServer();
922c29fa5a6Sopenharmony_ci    CHKPF(udsServerPtr);
923c29fa5a6Sopenharmony_ci    std::function<void(SessionPtr)> callback =
924c29fa5a6Sopenharmony_ci        [this] (SessionPtr sess) { return this->OnSessionDelete(sess); };
925c29fa5a6Sopenharmony_ci    udsServerPtr->AddSessionDeletedCallback(callback);
926c29fa5a6Sopenharmony_ci    callbackInitialized_ = true;
927c29fa5a6Sopenharmony_ci    return true;
928c29fa5a6Sopenharmony_ci}
929c29fa5a6Sopenharmony_ci
930c29fa5a6Sopenharmony_cibool KeySubscriberHandler::HandleKeyDown(const std::shared_ptr<KeyEvent> &keyEvent)
931c29fa5a6Sopenharmony_ci{
932c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
933c29fa5a6Sopenharmony_ci    CHKPF(keyEvent);
934c29fa5a6Sopenharmony_ci#ifdef SHORTCUT_KEY_RULES_ENABLED
935c29fa5a6Sopenharmony_ci    KEY_SHORTCUT_MGR->ResetCheckState();
936c29fa5a6Sopenharmony_ci#endif // SHORTCUT_KEY_RULES_ENABLED
937c29fa5a6Sopenharmony_ci    bool handled = false;
938c29fa5a6Sopenharmony_ci    auto keyCode = keyEvent->GetKeyCode();
939c29fa5a6Sopenharmony_ci    std::vector<int32_t> pressedKeys = keyEvent->GetPressedKeys();
940c29fa5a6Sopenharmony_ci    RemoveKeyCode(keyCode, pressedKeys);
941c29fa5a6Sopenharmony_ci    std::set<int32_t> pids;
942c29fa5a6Sopenharmony_ci    GetForegroundPids(pids);
943c29fa5a6Sopenharmony_ci    MMI_HILOGI("Foreground pid size:%{public}zu", pids.size());
944c29fa5a6Sopenharmony_ci    for (auto &iter : subscriberMap_) {
945c29fa5a6Sopenharmony_ci        auto keyOption = iter.first;
946c29fa5a6Sopenharmony_ci        auto subscribers = iter.second;
947c29fa5a6Sopenharmony_ci        PrintKeyOption(keyOption);
948c29fa5a6Sopenharmony_ci        IsMatchForegroundPid(subscribers, pids);
949c29fa5a6Sopenharmony_ci        if (!keyOption->IsFinalKeyDown()) {
950c29fa5a6Sopenharmony_ci            MMI_HILOGD("!keyOption->IsFinalKeyDown()");
951c29fa5a6Sopenharmony_ci            continue;
952c29fa5a6Sopenharmony_ci        }
953c29fa5a6Sopenharmony_ci        if (keyCode != keyOption->GetFinalKey()) {
954c29fa5a6Sopenharmony_ci            MMI_HILOGD("keyCode != keyOption->GetFinalKey()");
955c29fa5a6Sopenharmony_ci            ClearSubscriberTimer(subscribers);
956c29fa5a6Sopenharmony_ci            continue;
957c29fa5a6Sopenharmony_ci        }
958c29fa5a6Sopenharmony_ci        if (!IsPreKeysMatch(keyOption->GetPreKeys(), pressedKeys)) {
959c29fa5a6Sopenharmony_ci            MMI_HILOGD("preKeysMatch failed");
960c29fa5a6Sopenharmony_ci            ClearSubscriberTimer(subscribers);
961c29fa5a6Sopenharmony_ci            continue;
962c29fa5a6Sopenharmony_ci        }
963c29fa5a6Sopenharmony_ci        NotifyKeyDownSubscriber(keyEvent, keyOption, subscribers, handled);
964c29fa5a6Sopenharmony_ci    }
965c29fa5a6Sopenharmony_ci    MMI_HILOGD("Handle key down:%{public}s", handled ? "true" : "false");
966c29fa5a6Sopenharmony_ci    return handled;
967c29fa5a6Sopenharmony_ci}
968c29fa5a6Sopenharmony_ci
969c29fa5a6Sopenharmony_civoid KeySubscriberHandler::SubscriberNotifyNap(const std::shared_ptr<Subscriber> subscriber)
970c29fa5a6Sopenharmony_ci{
971c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
972c29fa5a6Sopenharmony_ci    CHKPV(subscriber);
973c29fa5a6Sopenharmony_ci    int32_t state = NapProcess::GetInstance()->GetNapClientPid();
974c29fa5a6Sopenharmony_ci    if (state == REMOVE_OBSERVER || state == UNOBSERVED) {
975c29fa5a6Sopenharmony_ci        MMI_HILOGD("Nap client status:%{public}d", state);
976c29fa5a6Sopenharmony_ci        return;
977c29fa5a6Sopenharmony_ci    }
978c29fa5a6Sopenharmony_ci
979c29fa5a6Sopenharmony_ci    auto sess = subscriber->sess_;
980c29fa5a6Sopenharmony_ci    CHKPV(sess);
981c29fa5a6Sopenharmony_ci    OHOS::MMI::NapProcess::NapStatusData napData;
982c29fa5a6Sopenharmony_ci    napData.pid = sess->GetPid();
983c29fa5a6Sopenharmony_ci    napData.uid = sess->GetUid();
984c29fa5a6Sopenharmony_ci    napData.bundleName = sess->GetProgramName();
985c29fa5a6Sopenharmony_ci    if (NapProcess::GetInstance()->IsNeedNotify(napData)) {
986c29fa5a6Sopenharmony_ci        int32_t syncState = ACTIVE_EVENT;
987c29fa5a6Sopenharmony_ci        NapProcess::GetInstance()->AddMmiSubscribedEventData(napData, syncState);
988c29fa5a6Sopenharmony_ci        NapProcess::GetInstance()->NotifyBundleName(napData, syncState);
989c29fa5a6Sopenharmony_ci    }
990c29fa5a6Sopenharmony_ci}
991c29fa5a6Sopenharmony_ci
992c29fa5a6Sopenharmony_cibool KeySubscriberHandler::HandleKeyUp(const std::shared_ptr<KeyEvent> &keyEvent)
993c29fa5a6Sopenharmony_ci{
994c29fa5a6Sopenharmony_ci#ifdef SHORTCUT_KEY_RULES_ENABLED
995c29fa5a6Sopenharmony_ci    if (KEY_SHORTCUT_MGR->HaveShortcutConsumed(keyEvent) || !KEY_SHORTCUT_MGR->IsCheckUpShortcut(keyEvent)) {
996c29fa5a6Sopenharmony_ci        return false;
997c29fa5a6Sopenharmony_ci    }
998c29fa5a6Sopenharmony_ci#endif // SHORTCUT_KEY_RULES_ENABLED
999c29fa5a6Sopenharmony_ci    bool handled = false;
1000c29fa5a6Sopenharmony_ci    auto keyCode = keyEvent->GetKeyCode();
1001c29fa5a6Sopenharmony_ci    std::vector<int32_t> pressedKeys = keyEvent->GetPressedKeys();
1002c29fa5a6Sopenharmony_ci    RemoveKeyCode(keyCode, pressedKeys);
1003c29fa5a6Sopenharmony_ci    std::set<int32_t> pids;
1004c29fa5a6Sopenharmony_ci    GetForegroundPids(pids);
1005c29fa5a6Sopenharmony_ci    for (auto &iter : subscriberMap_) {
1006c29fa5a6Sopenharmony_ci        auto keyOption = iter.first;
1007c29fa5a6Sopenharmony_ci        auto subscribers = iter.second;
1008c29fa5a6Sopenharmony_ci        PrintKeyOption(keyOption);
1009c29fa5a6Sopenharmony_ci        IsMatchForegroundPid(subscribers, pids);
1010c29fa5a6Sopenharmony_ci        if (keyOption->IsFinalKeyDown()) {
1011c29fa5a6Sopenharmony_ci            MMI_HILOGD("keyOption->IsFinalKeyDown()");
1012c29fa5a6Sopenharmony_ci            ClearSubscriberTimer(subscribers);
1013c29fa5a6Sopenharmony_ci            continue;
1014c29fa5a6Sopenharmony_ci        }
1015c29fa5a6Sopenharmony_ci        if (keyCode != keyOption->GetFinalKey()) {
1016c29fa5a6Sopenharmony_ci            MMI_HILOGD("keyCode != keyOption->GetFinalKey()");
1017c29fa5a6Sopenharmony_ci            continue;
1018c29fa5a6Sopenharmony_ci        }
1019c29fa5a6Sopenharmony_ci        if (!IsPreKeysMatch(keyOption->GetPreKeys(), pressedKeys)) {
1020c29fa5a6Sopenharmony_ci            MMI_HILOGD("PreKeysMatch failed");
1021c29fa5a6Sopenharmony_ci            continue;
1022c29fa5a6Sopenharmony_ci        }
1023c29fa5a6Sopenharmony_ci        auto duration = keyOption->GetFinalKeyDownDuration();
1024c29fa5a6Sopenharmony_ci        if (duration <= 0) {
1025c29fa5a6Sopenharmony_ci            NotifyKeyUpSubscriber(keyEvent, subscribers, handled);
1026c29fa5a6Sopenharmony_ci            continue;
1027c29fa5a6Sopenharmony_ci        }
1028c29fa5a6Sopenharmony_ci        std::optional<KeyEvent::KeyItem> keyItem = keyEvent->GetKeyItem();
1029c29fa5a6Sopenharmony_ci        CHK_KEY_ITEM(keyItem);
1030c29fa5a6Sopenharmony_ci        if (keyEvent->GetActionTime() - keyItem->GetDownTime() >= MS2US(duration)) {
1031c29fa5a6Sopenharmony_ci            MMI_HILOGE("upTime - downTime >= duration");
1032c29fa5a6Sopenharmony_ci            continue;
1033c29fa5a6Sopenharmony_ci        }
1034c29fa5a6Sopenharmony_ci        NotifyKeyUpSubscriber(keyEvent, subscribers, handled);
1035c29fa5a6Sopenharmony_ci    }
1036c29fa5a6Sopenharmony_ci    MMI_HILOGD("Handle key up:%{public}s", handled ? "true" : "false");
1037c29fa5a6Sopenharmony_ci    return handled;
1038c29fa5a6Sopenharmony_ci}
1039c29fa5a6Sopenharmony_ci
1040c29fa5a6Sopenharmony_cibool KeySubscriberHandler::HandleKeyCancel(const std::shared_ptr<KeyEvent> &keyEvent)
1041c29fa5a6Sopenharmony_ci{
1042c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1043c29fa5a6Sopenharmony_ci    CHKPF(keyEvent);
1044c29fa5a6Sopenharmony_ci    for (auto &iter : subscriberMap_) {
1045c29fa5a6Sopenharmony_ci        auto keyOption = iter.first;
1046c29fa5a6Sopenharmony_ci        auto subscribers = iter.second;
1047c29fa5a6Sopenharmony_ci        for (auto &subscriber : subscribers) {
1048c29fa5a6Sopenharmony_ci            PrintKeyUpLog(subscriber);
1049c29fa5a6Sopenharmony_ci            ClearTimer(subscriber);
1050c29fa5a6Sopenharmony_ci        }
1051c29fa5a6Sopenharmony_ci    }
1052c29fa5a6Sopenharmony_ci    return false;
1053c29fa5a6Sopenharmony_ci}
1054c29fa5a6Sopenharmony_ci
1055c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
1056c29fa5a6Sopenharmony_cibool KeySubscriberHandler::IsKeyEventSubscribed(int32_t keyCode, int32_t trrigerType)
1057c29fa5a6Sopenharmony_ci{
1058c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1059c29fa5a6Sopenharmony_ci    for (const auto &iter : subscriberMap_) {
1060c29fa5a6Sopenharmony_ci        auto keyOption = iter.first;
1061c29fa5a6Sopenharmony_ci        auto subscribers = iter.second;
1062c29fa5a6Sopenharmony_ci        MMI_HILOGD("keyOption->finalKey:%{private}d, keyOption->isFinalKeyDown:%{public}s, "
1063c29fa5a6Sopenharmony_ci            "keyOption->finalKeyDownDuration:%{public}d",
1064c29fa5a6Sopenharmony_ci            keyOption->GetFinalKey(), keyOption->IsFinalKeyDown() ? "true" : "false",
1065c29fa5a6Sopenharmony_ci            keyOption->GetFinalKeyDownDuration());
1066c29fa5a6Sopenharmony_ci        int32_t keyAction = KeyEvent::KEY_ACTION_UP;
1067c29fa5a6Sopenharmony_ci        if (keyOption->IsFinalKeyDown()) {
1068c29fa5a6Sopenharmony_ci            MMI_HILOGD("keyOption is final key down");
1069c29fa5a6Sopenharmony_ci            keyAction = KeyEvent::KEY_ACTION_DOWN;
1070c29fa5a6Sopenharmony_ci        }
1071c29fa5a6Sopenharmony_ci        if (keyCode == keyOption->GetFinalKey() && trrigerType == keyAction && subscribers.size() > 0) {
1072c29fa5a6Sopenharmony_ci            MMI_HILOGD("Current key event is subscribed");
1073c29fa5a6Sopenharmony_ci            return true;
1074c29fa5a6Sopenharmony_ci        }
1075c29fa5a6Sopenharmony_ci    }
1076c29fa5a6Sopenharmony_ci    return false;
1077c29fa5a6Sopenharmony_ci}
1078c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
1079c29fa5a6Sopenharmony_ci
1080c29fa5a6Sopenharmony_cibool KeySubscriberHandler::CloneKeyEvent(std::shared_ptr<KeyEvent> keyEvent)
1081c29fa5a6Sopenharmony_ci{
1082c29fa5a6Sopenharmony_ci    CHKPF(keyEvent);
1083c29fa5a6Sopenharmony_ci    if (keyEvent_ == nullptr) {
1084c29fa5a6Sopenharmony_ci        MMI_HILOGW("keyEvent_ is nullptr");
1085c29fa5a6Sopenharmony_ci        keyEvent_ = KeyEvent::Clone(keyEvent);
1086c29fa5a6Sopenharmony_ci    }
1087c29fa5a6Sopenharmony_ci    CHKPF(keyEvent_);
1088c29fa5a6Sopenharmony_ci    return true;
1089c29fa5a6Sopenharmony_ci}
1090c29fa5a6Sopenharmony_ci
1091c29fa5a6Sopenharmony_civoid KeySubscriberHandler::RemoveKeyCode(int32_t keyCode, std::vector<int32_t> &keyCodes)
1092c29fa5a6Sopenharmony_ci{
1093c29fa5a6Sopenharmony_ci    for (auto it = keyCodes.begin(); it != keyCodes.end(); ++it) {
1094c29fa5a6Sopenharmony_ci        if (*it == keyCode) {
1095c29fa5a6Sopenharmony_ci            keyCodes.erase(it);
1096c29fa5a6Sopenharmony_ci            return;
1097c29fa5a6Sopenharmony_ci        }
1098c29fa5a6Sopenharmony_ci    }
1099c29fa5a6Sopenharmony_ci}
1100c29fa5a6Sopenharmony_ci
1101c29fa5a6Sopenharmony_cibool KeySubscriberHandler::IsRepeatedKeyEvent(std::shared_ptr<KeyEvent> keyEvent)
1102c29fa5a6Sopenharmony_ci{
1103c29fa5a6Sopenharmony_ci    CHKPF(keyEvent);
1104c29fa5a6Sopenharmony_ci    if (!hasEventExecuting_) {
1105c29fa5a6Sopenharmony_ci        return false;
1106c29fa5a6Sopenharmony_ci    }
1107c29fa5a6Sopenharmony_ci
1108c29fa5a6Sopenharmony_ci    if (keyEvent->GetKeyCode() != keyEvent_->GetKeyCode()) {
1109c29fa5a6Sopenharmony_ci        return false;
1110c29fa5a6Sopenharmony_ci    }
1111c29fa5a6Sopenharmony_ci
1112c29fa5a6Sopenharmony_ci    if (keyEvent->GetKeyAction() != keyEvent_->GetKeyAction()) {
1113c29fa5a6Sopenharmony_ci        return false;
1114c29fa5a6Sopenharmony_ci    }
1115c29fa5a6Sopenharmony_ci
1116c29fa5a6Sopenharmony_ci    if (keyEvent->GetKeyItems().size() != keyEvent_->GetKeyItems().size()) {
1117c29fa5a6Sopenharmony_ci        return false;
1118c29fa5a6Sopenharmony_ci    }
1119c29fa5a6Sopenharmony_ci
1120c29fa5a6Sopenharmony_ci    for (const auto &item : keyEvent->GetKeyItems()) {
1121c29fa5a6Sopenharmony_ci        int32_t keyCode = item.GetKeyCode();
1122c29fa5a6Sopenharmony_ci        bool findResult = false;
1123c29fa5a6Sopenharmony_ci        for (const auto &item1 : keyEvent_->GetKeyItems()) {
1124c29fa5a6Sopenharmony_ci            if (keyCode == item1.GetKeyCode()) {
1125c29fa5a6Sopenharmony_ci                findResult = true;
1126c29fa5a6Sopenharmony_ci                break;
1127c29fa5a6Sopenharmony_ci            }
1128c29fa5a6Sopenharmony_ci        }
1129c29fa5a6Sopenharmony_ci        if (!findResult) {
1130c29fa5a6Sopenharmony_ci            return false;
1131c29fa5a6Sopenharmony_ci        }
1132c29fa5a6Sopenharmony_ci    }
1133c29fa5a6Sopenharmony_ci    return true;
1134c29fa5a6Sopenharmony_ci}
1135c29fa5a6Sopenharmony_ci
1136c29fa5a6Sopenharmony_civoid KeySubscriberHandler::RemoveSubscriberKeyUpTimer(int32_t keyCode)
1137c29fa5a6Sopenharmony_ci{
1138c29fa5a6Sopenharmony_ci    for (auto iter = subscriberMap_.begin(); iter != subscriberMap_.end(); iter++) {
1139c29fa5a6Sopenharmony_ci        auto &subscribers = iter->second;
1140c29fa5a6Sopenharmony_ci        for (auto it = subscribers.begin(); it != subscribers.end(); it++) {
1141c29fa5a6Sopenharmony_ci            if (((*it)->timerId_ >= 0) && ((*it)->keyOption_->GetFinalKey() == keyCode)) {
1142c29fa5a6Sopenharmony_ci                ClearTimer(*it);
1143c29fa5a6Sopenharmony_ci            }
1144c29fa5a6Sopenharmony_ci        }
1145c29fa5a6Sopenharmony_ci    }
1146c29fa5a6Sopenharmony_ci    keyGestureMgr_.ResetAll();
1147c29fa5a6Sopenharmony_ci}
1148c29fa5a6Sopenharmony_ci
1149c29fa5a6Sopenharmony_civoid KeySubscriberHandler::HandleKeyUpWithDelay(std::shared_ptr<KeyEvent> keyEvent,
1150c29fa5a6Sopenharmony_ci    const std::shared_ptr<Subscriber> &subscriber)
1151c29fa5a6Sopenharmony_ci{
1152c29fa5a6Sopenharmony_ci    auto keyUpDelay = subscriber->keyOption_->GetFinalKeyUpDelay();
1153c29fa5a6Sopenharmony_ci    if (keyUpDelay <= 0) {
1154c29fa5a6Sopenharmony_ci        NotifySubscriber(keyEvent, subscriber);
1155c29fa5a6Sopenharmony_ci    } else {
1156c29fa5a6Sopenharmony_ci        if (!AddTimer(subscriber, keyEvent)) {
1157c29fa5a6Sopenharmony_ci            MMI_HILOGE("Leave, add timer failed");
1158c29fa5a6Sopenharmony_ci        }
1159c29fa5a6Sopenharmony_ci    }
1160c29fa5a6Sopenharmony_ci}
1161c29fa5a6Sopenharmony_ci
1162c29fa5a6Sopenharmony_civoid KeySubscriberHandler::PrintKeyOption(const std::shared_ptr<KeyOption> keyOption)
1163c29fa5a6Sopenharmony_ci{
1164c29fa5a6Sopenharmony_ci    CHKPV(keyOption);
1165c29fa5a6Sopenharmony_ci    MMI_HILOGD("keyOption->finalKey:%{private}d,keyOption->isFinalKeyDown:%{public}s, "
1166c29fa5a6Sopenharmony_ci        "keyOption->finalKeyDownDuration:%{public}d, keyOption->isRepeat:%{public}s",
1167c29fa5a6Sopenharmony_ci        keyOption->GetFinalKey(), keyOption->IsFinalKeyDown() ? "true" : "false",
1168c29fa5a6Sopenharmony_ci        keyOption->GetFinalKeyDownDuration(), keyOption->IsRepeat() ? "true" : "false");
1169c29fa5a6Sopenharmony_ci    for (const auto &keyCode : keyOption->GetPreKeys()) {
1170c29fa5a6Sopenharmony_ci        MMI_HILOGD("keyOption->prekey:%{private}d", keyCode);
1171c29fa5a6Sopenharmony_ci    }
1172c29fa5a6Sopenharmony_ci}
1173c29fa5a6Sopenharmony_ci
1174c29fa5a6Sopenharmony_civoid KeySubscriberHandler::PrintKeyUpLog(const std::shared_ptr<Subscriber> &subscriber)
1175c29fa5a6Sopenharmony_ci{
1176c29fa5a6Sopenharmony_ci    CHKPV(subscriber);
1177c29fa5a6Sopenharmony_ci    auto &keyOption = subscriber->keyOption_;
1178c29fa5a6Sopenharmony_ci    MMI_HILOGD("subscribeId:%{public}d, keyOption->finalKey:%{private}d,"
1179c29fa5a6Sopenharmony_ci        "keyOption->isFinalKeyDown:%{public}s, keyOption->finalKeyDownDuration:%{public}d,"
1180c29fa5a6Sopenharmony_ci        "keyOption->finalKeyUpDelay:%{public}d",
1181c29fa5a6Sopenharmony_ci        subscriber->id_, keyOption->GetFinalKey(), keyOption->IsFinalKeyDown() ? "true" : "false",
1182c29fa5a6Sopenharmony_ci        keyOption->GetFinalKeyDownDuration(), keyOption->GetFinalKeyUpDelay());
1183c29fa5a6Sopenharmony_ci    for (const auto &keyCode : keyOption->GetPreKeys()) {
1184c29fa5a6Sopenharmony_ci        MMI_HILOGD("keyOption->prekey:%{private}d", keyCode);
1185c29fa5a6Sopenharmony_ci    }
1186c29fa5a6Sopenharmony_ci}
1187c29fa5a6Sopenharmony_ci
1188c29fa5a6Sopenharmony_civoid KeySubscriberHandler::Dump(int32_t fd, const std::vector<std::string> &args)
1189c29fa5a6Sopenharmony_ci{
1190c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1191c29fa5a6Sopenharmony_ci    mprintf(fd, "Subscriber information:\t");
1192c29fa5a6Sopenharmony_ci    mprintf(fd, "subscribers: count = %zu", CountSubscribers());
1193c29fa5a6Sopenharmony_ci    for (const auto &item : foregroundPids_) {
1194c29fa5a6Sopenharmony_ci        mprintf(fd, "Foreground Pids: %d", item);
1195c29fa5a6Sopenharmony_ci    }
1196c29fa5a6Sopenharmony_ci    mprintf(fd, "enableCombineKey: %s | isForegroundExits: %s | needSkipPowerKeyUp: %s \t",
1197c29fa5a6Sopenharmony_ci            enableCombineKey_ ? "true" : "false", isForegroundExits_ ? "true" : "false",
1198c29fa5a6Sopenharmony_ci            needSkipPowerKeyUp_ ? "true" : "false");
1199c29fa5a6Sopenharmony_ci    DumpSubscribers(fd, subscriberMap_);
1200c29fa5a6Sopenharmony_ci    DumpSubscribers(fd, keyGestures_);
1201c29fa5a6Sopenharmony_ci}
1202c29fa5a6Sopenharmony_ci
1203c29fa5a6Sopenharmony_cisize_t KeySubscriberHandler::CountSubscribers() const
1204c29fa5a6Sopenharmony_ci{
1205c29fa5a6Sopenharmony_ci    size_t total { 0 };
1206c29fa5a6Sopenharmony_ci
1207c29fa5a6Sopenharmony_ci    for (auto &item : subscriberMap_) {
1208c29fa5a6Sopenharmony_ci        total += item.second.size();
1209c29fa5a6Sopenharmony_ci    }
1210c29fa5a6Sopenharmony_ci    for (auto &item : keyGestures_) {
1211c29fa5a6Sopenharmony_ci        total += item.second.size();
1212c29fa5a6Sopenharmony_ci    }
1213c29fa5a6Sopenharmony_ci    return total;
1214c29fa5a6Sopenharmony_ci}
1215c29fa5a6Sopenharmony_ci
1216c29fa5a6Sopenharmony_civoid KeySubscriberHandler::DumpSubscribers(int32_t fd, const SubscriberCollection &collection) const
1217c29fa5a6Sopenharmony_ci{
1218c29fa5a6Sopenharmony_ci    for (auto iter = collection.begin(); iter != collection.end(); ++iter) {
1219c29fa5a6Sopenharmony_ci        auto &subscribers = iter->second;
1220c29fa5a6Sopenharmony_ci        for (auto item = subscribers.begin(); item != subscribers.end(); ++item) {
1221c29fa5a6Sopenharmony_ci            DumpSubscriber(fd, *item);
1222c29fa5a6Sopenharmony_ci        }
1223c29fa5a6Sopenharmony_ci    }
1224c29fa5a6Sopenharmony_ci}
1225c29fa5a6Sopenharmony_ci
1226c29fa5a6Sopenharmony_civoid KeySubscriberHandler::DumpSubscriber(int32_t fd, std::shared_ptr<Subscriber> subscriber) const
1227c29fa5a6Sopenharmony_ci{
1228c29fa5a6Sopenharmony_ci    CHKPV(subscriber);
1229c29fa5a6Sopenharmony_ci    SessionPtr session = subscriber->sess_;
1230c29fa5a6Sopenharmony_ci    CHKPV(session);
1231c29fa5a6Sopenharmony_ci    std::shared_ptr<KeyOption> keyOption = subscriber->keyOption_;
1232c29fa5a6Sopenharmony_ci    CHKPV(keyOption);
1233c29fa5a6Sopenharmony_ci    std::set<int32_t> preKeys = keyOption->GetPreKeys();
1234c29fa5a6Sopenharmony_ci    std::ostringstream sPrekeys;
1235c29fa5a6Sopenharmony_ci    if (auto keyIter = preKeys.cbegin(); keyIter != preKeys.cend()) {
1236c29fa5a6Sopenharmony_ci        sPrekeys << *keyIter;
1237c29fa5a6Sopenharmony_ci        for (++keyIter; keyIter != preKeys.cend(); ++keyIter) {
1238c29fa5a6Sopenharmony_ci            sPrekeys << "," << *keyIter;
1239c29fa5a6Sopenharmony_ci        }
1240c29fa5a6Sopenharmony_ci    }
1241c29fa5a6Sopenharmony_ci    mprintf(fd,
1242c29fa5a6Sopenharmony_ci            "Subscriber ID:%d | Pid:%d | Uid:%d | Fd:%d | Prekeys:[%s] | FinalKey:%d | "
1243c29fa5a6Sopenharmony_ci            "FinalKeyDownDuration:%d | IsFinalKeyDown:%s | IsRepeat:%s | ProgramName:%s",
1244c29fa5a6Sopenharmony_ci            subscriber->id_, session->GetPid(), session->GetUid(), session->GetFd(),
1245c29fa5a6Sopenharmony_ci            sPrekeys.str().c_str(), keyOption->GetFinalKey(), keyOption->GetFinalKeyDownDuration(),
1246c29fa5a6Sopenharmony_ci            keyOption->IsFinalKeyDown() ? "true" : "false", keyOption->IsRepeat() ? "true" : "false",
1247c29fa5a6Sopenharmony_ci            session->GetProgramName().c_str());
1248c29fa5a6Sopenharmony_ci}
1249c29fa5a6Sopenharmony_ci
1250c29fa5a6Sopenharmony_cibool KeySubscriberHandler::HandleCallEnded(std::shared_ptr<KeyEvent> keyEvent)
1251c29fa5a6Sopenharmony_ci{
1252c29fa5a6Sopenharmony_ci    CALL_DEBUG_ENTER;
1253c29fa5a6Sopenharmony_ci    CHKPF(keyEvent);
1254c29fa5a6Sopenharmony_ci    if (!callBahaviorState_) {
1255c29fa5a6Sopenharmony_ci        MMI_HILOGE("CallBehaviorState is false");
1256c29fa5a6Sopenharmony_ci        return false;
1257c29fa5a6Sopenharmony_ci    }
1258c29fa5a6Sopenharmony_ci    if (keyEvent->GetKeyCode() != KeyEvent::KEYCODE_POWER ||
1259c29fa5a6Sopenharmony_ci        keyEvent->GetKeyAction() != KeyEvent::KEY_ACTION_DOWN) {
1260c29fa5a6Sopenharmony_ci        MMI_HILOGE("This key event no need to CallEnded");
1261c29fa5a6Sopenharmony_ci        return false;
1262c29fa5a6Sopenharmony_ci    }
1263c29fa5a6Sopenharmony_ci    std::string screenStatus = DISPLAY_MONITOR->GetScreenStatus();
1264c29fa5a6Sopenharmony_ci    if (screenStatus != EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON) {
1265c29fa5a6Sopenharmony_ci        MMI_HILOGI("The current screen is not on, so not allow end call");
1266c29fa5a6Sopenharmony_ci        return false;
1267c29fa5a6Sopenharmony_ci    }
1268c29fa5a6Sopenharmony_ci    int32_t ret = DEVICE_MONITOR->GetCallState();
1269c29fa5a6Sopenharmony_ci    MMI_HILOGE("Current call state:%{public}d", ret);
1270c29fa5a6Sopenharmony_ci
1271c29fa5a6Sopenharmony_ci    switch (ret) {
1272c29fa5a6Sopenharmony_ci        case StateType::CALL_STATUS_HOLDING:
1273c29fa5a6Sopenharmony_ci        case StateType::CALL_STATUS_ALERTING:
1274c29fa5a6Sopenharmony_ci        case StateType::CALL_STATUS_ANSWERED:
1275c29fa5a6Sopenharmony_ci        case StateType::CALL_STATUS_ACTIVE:
1276c29fa5a6Sopenharmony_ci        case StateType::CALL_STATUS_DIALING: {
1277c29fa5a6Sopenharmony_ci            HangUpCallProcess();
1278c29fa5a6Sopenharmony_ci            needSkipPowerKeyUp_ = true;
1279c29fa5a6Sopenharmony_ci            return true;
1280c29fa5a6Sopenharmony_ci        }
1281c29fa5a6Sopenharmony_ci        case StateType::CALL_STATUS_WAITING:
1282c29fa5a6Sopenharmony_ci        case StateType::CALL_STATUS_INCOMING: {
1283c29fa5a6Sopenharmony_ci            RejectCallProcess();
1284c29fa5a6Sopenharmony_ci            needSkipPowerKeyUp_ = true;
1285c29fa5a6Sopenharmony_ci            return true;
1286c29fa5a6Sopenharmony_ci        }
1287c29fa5a6Sopenharmony_ci        case StateType::CALL_STATUS_IDLE:
1288c29fa5a6Sopenharmony_ci        case StateType::CALL_STATUS_DISCONNECTING:
1289c29fa5a6Sopenharmony_ci        case StateType::CALL_STATUS_DISCONNECTED:
1290c29fa5a6Sopenharmony_ci        default: {
1291c29fa5a6Sopenharmony_ci            MMI_HILOGE("This state no need to CallEnded");
1292c29fa5a6Sopenharmony_ci            return false;
1293c29fa5a6Sopenharmony_ci        }
1294c29fa5a6Sopenharmony_ci    }
1295c29fa5a6Sopenharmony_ci}
1296c29fa5a6Sopenharmony_ci
1297c29fa5a6Sopenharmony_civoid KeySubscriberHandler::HangUpCallProcess()
1298c29fa5a6Sopenharmony_ci{
1299c29fa5a6Sopenharmony_ci    if (callManagerClientPtr == nullptr) {
1300c29fa5a6Sopenharmony_ci        callManagerClientPtr = DelayedSingleton<OHOS::Telephony::CallManagerClient>::GetInstance();
1301c29fa5a6Sopenharmony_ci        if (callManagerClientPtr == nullptr) {
1302c29fa5a6Sopenharmony_ci            MMI_HILOGE("CallManager init fail");
1303c29fa5a6Sopenharmony_ci            return;
1304c29fa5a6Sopenharmony_ci        }
1305c29fa5a6Sopenharmony_ci        callManagerClientPtr->Init(OHOS::TELEPHONY_CALL_MANAGER_SYS_ABILITY_ID);
1306c29fa5a6Sopenharmony_ci    }
1307c29fa5a6Sopenharmony_ci    int32_t ret = -1;
1308c29fa5a6Sopenharmony_ci    ret = callManagerClientPtr->HangUpCall(0);
1309c29fa5a6Sopenharmony_ci    if (ret != ERR_OK) {
1310c29fa5a6Sopenharmony_ci        MMI_HILOGE("HangUpCall fail, ret:%{public}d", ret);
1311c29fa5a6Sopenharmony_ci        return;
1312c29fa5a6Sopenharmony_ci    }
1313c29fa5a6Sopenharmony_ci    MMI_HILOGI("HangUpCall success");
1314c29fa5a6Sopenharmony_ci}
1315c29fa5a6Sopenharmony_ci
1316c29fa5a6Sopenharmony_civoid KeySubscriberHandler::RejectCallProcess()
1317c29fa5a6Sopenharmony_ci{
1318c29fa5a6Sopenharmony_ci    if (callManagerClientPtr == nullptr) {
1319c29fa5a6Sopenharmony_ci        callManagerClientPtr = DelayedSingleton<OHOS::Telephony::CallManagerClient>::GetInstance();
1320c29fa5a6Sopenharmony_ci        if (callManagerClientPtr == nullptr) {
1321c29fa5a6Sopenharmony_ci            MMI_HILOGE("CallManagerClient GetInstance fail");
1322c29fa5a6Sopenharmony_ci            return;
1323c29fa5a6Sopenharmony_ci        }
1324c29fa5a6Sopenharmony_ci        callManagerClientPtr->Init(OHOS::TELEPHONY_CALL_MANAGER_SYS_ABILITY_ID);
1325c29fa5a6Sopenharmony_ci    }
1326c29fa5a6Sopenharmony_ci    int32_t ret = -1;
1327c29fa5a6Sopenharmony_ci    ret = callManagerClientPtr->RejectCall(0, false, u"");
1328c29fa5a6Sopenharmony_ci    if (ret != ERR_OK) {
1329c29fa5a6Sopenharmony_ci        MMI_HILOGE("RejectCall fail, ret:%{public}d", ret);
1330c29fa5a6Sopenharmony_ci        return;
1331c29fa5a6Sopenharmony_ci    }
1332c29fa5a6Sopenharmony_ci    MMI_HILOGI("RejectCall success");
1333c29fa5a6Sopenharmony_ci}
1334c29fa5a6Sopenharmony_ci
1335c29fa5a6Sopenharmony_civoid KeySubscriberHandler::InitDataShareListener()
1336c29fa5a6Sopenharmony_ci{
1337c29fa5a6Sopenharmony_ci    SettingObserver::UpdateFunc func = [&](const std::string& key) {
1338c29fa5a6Sopenharmony_ci        bool statusValue = false;
1339c29fa5a6Sopenharmony_ci        int32_t ret = -1;
1340c29fa5a6Sopenharmony_ci        ret = SettingDataShare::GetInstance(MULTIMODAL_INPUT_SERVICE_ID).GetBoolValue(key, statusValue,
1341c29fa5a6Sopenharmony_ci            SETTINGS_DATA_SYSTEM_URI);
1342c29fa5a6Sopenharmony_ci        if (ret != RET_OK) {
1343c29fa5a6Sopenharmony_ci            MMI_HILOGE("Get incall_power_button_behavior state fail:%{public}d", ret);
1344c29fa5a6Sopenharmony_ci            return;
1345c29fa5a6Sopenharmony_ci        }
1346c29fa5a6Sopenharmony_ci        MMI_HILOGE("Get incall_power_button_behavior state success:%{public}d", statusValue);
1347c29fa5a6Sopenharmony_ci        callBahaviorState_ = statusValue;
1348c29fa5a6Sopenharmony_ci    };
1349c29fa5a6Sopenharmony_ci
1350c29fa5a6Sopenharmony_ci    func(CALL_BEHAVIOR_KEY);
1351c29fa5a6Sopenharmony_ci
1352c29fa5a6Sopenharmony_ci    auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1353c29fa5a6Sopenharmony_ci    CHKPV(saManager);
1354c29fa5a6Sopenharmony_ci    auto remoteObj = saManager->GetSystemAbility(MULTIMODAL_INPUT_SERVICE_ID);
1355c29fa5a6Sopenharmony_ci    CHKPV(remoteObj);
1356c29fa5a6Sopenharmony_ci
1357c29fa5a6Sopenharmony_ci    std::pair<int, std::shared_ptr<DataShare::DataShareHelper>> ret =
1358c29fa5a6Sopenharmony_ci        DataShare::DataShareHelper::Create(remoteObj, SETTINGS_DATA_SYSTEM_URI, SETTINGS_DATA_EXT_URI);
1359c29fa5a6Sopenharmony_ci    MMI_HILOGE("create data_share helper, ret=%{public}d", ret.first);
1360c29fa5a6Sopenharmony_ci
1361c29fa5a6Sopenharmony_ci    if (ret.first == ERR_OK) {
1362c29fa5a6Sopenharmony_ci        std::shared_ptr<DataShare::DataShareHelper> helper = ret.second;
1363c29fa5a6Sopenharmony_ci        auto uri = Uri(SETTINGS_DATA_SYSTEM_URI + "&key=" + CALL_BEHAVIOR_KEY);
1364c29fa5a6Sopenharmony_ci        sptr<SettingObserver> statusObserver = SettingDataShare::GetInstance(MULTIMODAL_INPUT_SERVICE_ID).
1365c29fa5a6Sopenharmony_ci            CreateObserver(CALL_BEHAVIOR_KEY, func);
1366c29fa5a6Sopenharmony_ci        CHKPV(statusObserver);
1367c29fa5a6Sopenharmony_ci        helper->RegisterObserver(uri, statusObserver);
1368c29fa5a6Sopenharmony_ci    }
1369c29fa5a6Sopenharmony_ci}
1370c29fa5a6Sopenharmony_ci
1371c29fa5a6Sopenharmony_civoid KeySubscriberHandler::RemoveSubscriberTimer(std::shared_ptr<KeyEvent> keyEvent)
1372c29fa5a6Sopenharmony_ci{
1373c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
1374c29fa5a6Sopenharmony_ci    CHKPV(keyEvent);
1375c29fa5a6Sopenharmony_ci    auto keyCode = keyEvent->GetKeyCode();
1376c29fa5a6Sopenharmony_ci    std::vector<int32_t> pressedKeys = keyEvent->GetPressedKeys();
1377c29fa5a6Sopenharmony_ci    RemoveKeyCode(keyCode, pressedKeys);
1378c29fa5a6Sopenharmony_ci    std::set<int32_t> pids;
1379c29fa5a6Sopenharmony_ci    GetForegroundPids(pids);
1380c29fa5a6Sopenharmony_ci    MMI_HILOGI("Foreground pid size:%{public}zu", pids.size());
1381c29fa5a6Sopenharmony_ci    for (auto &iter : subscriberMap_) {
1382c29fa5a6Sopenharmony_ci        auto keyOption = iter.first;
1383c29fa5a6Sopenharmony_ci        auto subscribers = iter.second;
1384c29fa5a6Sopenharmony_ci        PrintKeyOption(keyOption);
1385c29fa5a6Sopenharmony_ci        IsMatchForegroundPid(subscribers, pids);
1386c29fa5a6Sopenharmony_ci        ClearSubscriberTimer(subscribers);
1387c29fa5a6Sopenharmony_ci    }
1388c29fa5a6Sopenharmony_ci}
1389c29fa5a6Sopenharmony_ci} // namespace MMI
1390c29fa5a6Sopenharmony_ci} // namespace OHOS
1391