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