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