1 /*
2 * Copyright (c) 2021-2023 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 "common_event_support.h"
21
22 #include "app_state_observer.h"
23 #include "bytrace_adapter.h"
24 #include "call_manager_client.h"
25 #include "common_event_data.h"
26 #include "common_event_manager.h"
27 #include "define_multimodal.h"
28 #include "device_event_monitor.h"
29 #include "dfx_hisysevent.h"
30 #include "display_event_monitor.h"
31 #include "error_multimodal.h"
32 #include "event_log_helper.h"
33 #include "input_event_data_transformation.h"
34 #include "input_event_handler.h"
35 #include "net_packet.h"
36 #include "proto.h"
37 #include "timer_manager.h"
38 #include "util_ex.h"
39 #include "want.h"
40
41 #undef MMI_LOG_DOMAIN
42 #define MMI_LOG_DOMAIN MMI_LOG_HANDLER
43 #undef MMI_LOG_TAG
44 #define MMI_LOG_TAG "KeySubscriberHandler"
45
46 namespace OHOS {
47 namespace MMI {
48 namespace {
49 constexpr uint32_t MAX_PRE_KEY_COUNT { 4 };
50 constexpr int32_t REMOVE_OBSERVER { -2 };
51 constexpr int32_t UNOBSERVED { -1 };
52 constexpr int32_t ACTIVE_EVENT { 2 };
53 std::shared_ptr<OHOS::Telephony::CallManagerClient> callManagerClientPtr = nullptr;
54 } // namespace
55
56 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
HandleKeyEvent(const std::shared_ptr<KeyEvent> keyEvent)57 void KeySubscriberHandler::HandleKeyEvent(const std::shared_ptr<KeyEvent> keyEvent)
58 {
59 CHKPV(keyEvent);
60 if (OnSubscribeKeyEvent(keyEvent)) {
61 if (DISPLAY_MONITOR->GetScreenStatus() == EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_OFF) {
62 auto monitorHandler = InputHandler->GetMonitorHandler();
63 CHKPV(monitorHandler);
64 keyEvent->SetFourceMonitorFlag(true);
65 #ifndef OHOS_BUILD_EMULATOR
66 monitorHandler->OnHandleEvent(keyEvent);
67 #endif // OHOS_BUILD_EMULATOR
68 keyEvent->SetFourceMonitorFlag(false);
69 }
70 if (EventLogHelper::IsBetaVersion() && !keyEvent->HasFlag(InputEvent::EVENT_FLAG_PRIVACY_MODE)) {
71 MMI_HILOGD("Subscribe keyEvent filter success. keyCode:%d", keyEvent->GetKeyCode());
72 } else {
73 MMI_HILOGD("Subscribe keyEvent filter success. keyCode:%d", keyEvent->GetKeyCode());
74 }
75 BytraceAdapter::StartBytrace(keyEvent, BytraceAdapter::KEY_SUBSCRIBE_EVENT);
76 return;
77 }
78 CHKPV(nextHandler_);
79 nextHandler_->HandleKeyEvent(keyEvent);
80 }
81 #endif // OHOS_BUILD_ENABLE_KEYBOARD
82
83 #ifdef OHOS_BUILD_ENABLE_POINTER
HandlePointerEvent(const std::shared_ptr<PointerEvent> pointerEvent)84 void KeySubscriberHandler::HandlePointerEvent(const std::shared_ptr<PointerEvent> pointerEvent)
85 {
86 CHKPV(pointerEvent);
87 CHKPV(nextHandler_);
88 nextHandler_->HandlePointerEvent(pointerEvent);
89 }
90 #endif // OHOS_BUILD_ENABLE_POINTER
91
92 #ifdef OHOS_BUILD_ENABLE_TOUCH
HandleTouchEvent(const std::shared_ptr<PointerEvent> pointerEvent)93 void KeySubscriberHandler::HandleTouchEvent(const std::shared_ptr<PointerEvent> pointerEvent)
94 {
95 CHKPV(pointerEvent);
96 CHKPV(nextHandler_);
97 nextHandler_->HandleTouchEvent(pointerEvent);
98 }
99 #endif // OHOS_BUILD_ENABLE_TOUCH
100
SubscribeKeyEvent(SessionPtr sess,int32_t subscribeId,std::shared_ptr<KeyOption> keyOption)101 int32_t KeySubscriberHandler::SubscribeKeyEvent(
102 SessionPtr sess, int32_t subscribeId, std::shared_ptr<KeyOption> keyOption)
103 {
104 CALL_DEBUG_ENTER;
105 if (subscribeId < 0) {
106 MMI_HILOGE("Invalid subscribe");
107 return RET_ERR;
108 }
109 CHKPR(sess, ERROR_NULL_POINTER);
110 CHKPR(keyOption, ERROR_NULL_POINTER);
111 uint32_t preKeySize = keyOption->GetPreKeys().size();
112 if (preKeySize > MAX_PRE_KEY_COUNT) {
113 MMI_HILOGE("Leave, preKeySize:%{public}u", preKeySize);
114 return RET_ERR;
115 }
116
117 for (const auto &keyCode : keyOption->GetPreKeys()) {
118 MMI_HILOGD("keyOption->prekey:%d", keyCode);
119 }
120 MMI_HILOGI("SubscribeId:%{public}d, finalKey:%{private}d,"
121 "isFinalKeyDown:%{public}s, finalKeyDownDuration:%{public}d, pid:%{public}d",
122 subscribeId, keyOption->GetFinalKey(), keyOption->IsFinalKeyDown() ? "true" : "false",
123 keyOption->GetFinalKeyDownDuration(), sess->GetPid());
124 DfxHisysevent::ReportSubscribeKeyEvent(subscribeId, keyOption->GetFinalKey(),
125 sess->GetProgramName(), sess->GetPid());
126
127 auto subscriber = std::make_shared<Subscriber>(subscribeId, sess, keyOption);
128 if (keyGestureMgr_.ShouldIntercept(keyOption)) {
129 AddKeyGestureSubscriber(subscriber, keyOption);
130 } else {
131 AddSubscriber(subscriber, keyOption);
132 }
133 InitSessionDeleteCallback();
134 return RET_OK;
135 }
136
UnsubscribeKeyEvent(SessionPtr sess,int32_t subscribeId)137 int32_t KeySubscriberHandler::UnsubscribeKeyEvent(SessionPtr sess, int32_t subscribeId)
138 {
139 CHKPR(sess, ERROR_NULL_POINTER);
140 MMI_HILOGI("SubscribeId:%{public}d, pid:%{public}d", subscribeId, sess->GetPid());
141 int32_t ret = RemoveSubscriber(sess, subscribeId);
142 if (ret != RET_OK) {
143 ret = RemoveKeyGestureSubscriber(sess, subscribeId);
144 }
145 return ret;
146 }
147
RemoveSubscriber(SessionPtr sess,int32_t subscribeId)148 int32_t KeySubscriberHandler::RemoveSubscriber(SessionPtr sess, int32_t subscribeId)
149 {
150 CALL_DEBUG_ENTER;
151 for (auto iter = subscriberMap_.begin(); iter != subscriberMap_.end(); iter++) {
152 auto &subscribers = iter->second;
153 for (auto it = subscribers.begin(); it != subscribers.end(); it++) {
154 if ((*it)->id_ == subscribeId && (*it)->sess_ == sess) {
155 ClearTimer(*it);
156 auto option = (*it)->keyOption_;
157 CHKPR(option, ERROR_NULL_POINTER);
158 MMI_HILOGI("SubscribeId:%{public}d, finalKey:%{private}d, isFinalKeyDown:%{public}s,"
159 "finalKeyDownDuration:%{public}d, pid:%{public}d", subscribeId, option->GetFinalKey(),
160 option->IsFinalKeyDown() ? "true" : "false", option->GetFinalKeyDownDuration(), sess->GetPid());
161 subscribers.erase(it);
162 DfxHisysevent::ReportUnSubscribeKeyEvent(subscribeId, option->GetFinalKey(),
163 sess->GetProgramName(), sess->GetPid());
164 return RET_OK;
165 }
166 }
167 }
168 return RET_ERR;
169 }
170
AddKeyGestureSubscriber(std::shared_ptr<Subscriber> subscriber,std::shared_ptr<KeyOption> keyOption)171 void KeySubscriberHandler::AddKeyGestureSubscriber(
172 std::shared_ptr<Subscriber> subscriber, std::shared_ptr<KeyOption> keyOption)
173 {
174 CALL_INFO_TRACE;
175 CHKPV(subscriber);
176 CHKPV(subscriber->sess_);
177 subscriber->timerId_ = keyGestureMgr_.AddKeyGesture(subscriber->sess_->GetPid(), keyOption,
178 [this, subscriber](std::shared_ptr<KeyEvent> keyEvent) {
179 NotifySubscriber(keyEvent, subscriber);
180 });
181 MMI_HILOGI("Handler(%{public}d) of key gesture was added", subscriber->timerId_);
182 PrintKeyOption(keyOption);
183 for (auto &iter : keyGestures_) {
184 if (IsEqualKeyOption(keyOption, iter.first)) {
185 iter.second.push_back(subscriber);
186 return;
187 }
188 }
189 keyGestures_[keyOption] = { subscriber };
190 }
191
RemoveKeyGestureSubscriber(SessionPtr sess,int32_t subscribeId)192 int32_t KeySubscriberHandler::RemoveKeyGestureSubscriber(SessionPtr sess, int32_t subscribeId)
193 {
194 CALL_INFO_TRACE;
195 for (auto iter = keyGestures_.begin(); iter != keyGestures_.end(); ++iter) {
196 auto &subscribers = iter->second;
197
198 for (auto innerIter = subscribers.begin(); innerIter != subscribers.end(); ++innerIter) {
199 auto subscriber = *innerIter;
200
201 if ((subscriber->id_ != subscribeId) || (subscriber->sess_ != sess)) {
202 continue;
203 }
204 MMI_HILOGI("Removing handler(%{public}d) of key gesture", subscriber->timerId_);
205 keyGestureMgr_.RemoveKeyGesture(subscriber->timerId_);
206 auto option = subscriber->keyOption_;
207 MMI_HILOGI("SubscribeId:%{public}d, finalKey:%{private}d, isFinalKeyDown:%{public}s,"
208 "finalKeyDownDuration:%{public}d, pid:%{public}d", subscribeId, option->GetFinalKey(),
209 option->IsFinalKeyDown() ? "true" : "false", option->GetFinalKeyDownDuration(), sess->GetPid());
210 subscribers.erase(innerIter);
211 return RET_OK;
212 }
213 }
214 return RET_ERR;
215 }
216
AddSubscriber(std::shared_ptr<Subscriber> subscriber,std::shared_ptr<KeyOption> option)217 void KeySubscriberHandler::AddSubscriber(std::shared_ptr<Subscriber> subscriber,
218 std::shared_ptr<KeyOption> option)
219 {
220 CALL_DEBUG_ENTER;
221 CHKPV(subscriber);
222 CHKPV(option);
223 PrintKeyOption(option);
224 for (auto &iter : subscriberMap_) {
225 if (IsEqualKeyOption(option, iter.first)) {
226 MMI_HILOGI("Add subscriber Id:%{public}d", subscriber->id_);
227 iter.second.push_back(std::move(subscriber));
228 MMI_HILOGI("Subscriber size:%{public}zu", iter.second.size());
229 return;
230 }
231 }
232 MMI_HILOGI("Add subscriber Id:%{public}d", subscriber->id_);
233 subscriberMap_[option] = {subscriber};
234 }
235
IsEqualKeyOption(std::shared_ptr<KeyOption> newOption,std::shared_ptr<KeyOption> oldOption)236 bool KeySubscriberHandler::IsEqualKeyOption(std::shared_ptr<KeyOption> newOption,
237 std::shared_ptr<KeyOption> oldOption)
238 {
239 CALL_DEBUG_ENTER;
240 CHKPF(newOption);
241 CHKPF(oldOption);
242 if (!IsEqualPreKeys(newOption->GetPreKeys(), oldOption->GetPreKeys())) {
243 MMI_HILOGD("Pre key not match");
244 return false;
245 }
246 if (newOption->GetFinalKey() != oldOption->GetFinalKey()) {
247 MMI_HILOGD("Final key not match");
248 return false;
249 }
250 if (newOption->IsFinalKeyDown() != oldOption->IsFinalKeyDown()) {
251 MMI_HILOGD("Is final key down not match");
252 return false;
253 }
254 if (newOption->GetFinalKeyDownDuration() != oldOption->GetFinalKeyDownDuration()) {
255 MMI_HILOGD("Final key down duration not match");
256 return false;
257 }
258 if (newOption->GetFinalKeyUpDelay() != oldOption->GetFinalKeyUpDelay()) {
259 MMI_HILOGD("Is final key up delay not match");
260 return false;
261 }
262 MMI_HILOGD("Key option match");
263 return true;
264 }
265
GetForegroundPids(std::set<int32_t> & pids)266 void KeySubscriberHandler::GetForegroundPids(std::set<int32_t> &pids)
267 {
268 CALL_DEBUG_ENTER;
269 std::vector<AppExecFwk::AppStateData> list = APP_OBSERVER_MGR->GetForegroundAppData();
270 for (auto iter = list.begin(); iter != list.end(); iter++) {
271 MMI_HILOGD("Foreground process pid:%{public}d", (*iter).pid);
272 pids.insert((*iter).pid);
273 }
274 }
275
EnableCombineKey(bool enable)276 int32_t KeySubscriberHandler::EnableCombineKey(bool enable)
277 {
278 enableCombineKey_ = enable;
279 MMI_HILOGI("Enable combineKey is successful in subscribe handler, enable:%{public}d", enable);
280 return RET_OK;
281 }
282
IsFunctionKey(const std::shared_ptr<KeyEvent> keyEvent)283 bool KeySubscriberHandler::IsFunctionKey(const std::shared_ptr<KeyEvent> keyEvent)
284 {
285 MMI_HILOGD("Is Funciton Key In");
286 if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_BRIGHTNESS_DOWN
287 || keyEvent->GetKeyCode() == KeyEvent::KEYCODE_BRIGHTNESS_UP) {
288 return true;
289 }
290 if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_VOLUME_UP
291 || keyEvent->GetKeyCode() == KeyEvent::KEYCODE_VOLUME_DOWN
292 || keyEvent->GetKeyCode() == KeyEvent::KEYCODE_VOLUME_MUTE) {
293 return true;
294 }
295 if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_MUTE
296 || keyEvent->GetKeyCode() == KeyEvent::KEYCODE_SWITCHVIDEOMODE
297 || keyEvent->GetKeyCode() == KeyEvent::KEYCODE_SEARCH
298 || keyEvent->GetKeyCode() == KeyEvent::KEYCODE_MEDIA_RECORD) {
299 return true;
300 }
301 return false;
302 }
303
IsEnableCombineKey(const std::shared_ptr<KeyEvent> keyEvent)304 bool KeySubscriberHandler::IsEnableCombineKey(const std::shared_ptr<KeyEvent> keyEvent)
305 {
306 CHKPF(keyEvent);
307 if (enableCombineKey_) {
308 return true;
309 }
310 if (IsFunctionKey(keyEvent)) {
311 auto items = keyEvent->GetKeyItems();
312 return items.size() != 1 ? enableCombineKey_ : true;
313 }
314 if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER && keyEvent->GetKeyAction() == KeyEvent::KEY_ACTION_UP) {
315 auto items = keyEvent->GetKeyItems();
316 if (items.size() != 1) {
317 return enableCombineKey_;
318 }
319 return true;
320 }
321 if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_DPAD_RIGHT ||
322 keyEvent->GetKeyCode() == KeyEvent::KEYCODE_DPAD_LEFT) {
323 if (EventLogHelper::IsBetaVersion() && !keyEvent->HasFlag(InputEvent::EVENT_FLAG_PRIVACY_MODE)) {
324 MMI_HILOGD("Subscriber mulit swipe keycode is:%d", keyEvent->GetKeyCode());
325 } else {
326 MMI_HILOGD("Subscriber mulit swipe keycode is:%d", keyEvent->GetKeyCode());
327 }
328 return IsEnableCombineKeySwipe(keyEvent);
329 }
330 if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_L) {
331 for (const auto &item : keyEvent->GetKeyItems()) {
332 int32_t keyCode = item.GetKeyCode();
333 if (keyCode != KeyEvent::KEYCODE_L && keyCode != KeyEvent::KEYCODE_META_LEFT &&
334 keyCode != KeyEvent::KEYCODE_META_RIGHT) {
335 return enableCombineKey_;
336 }
337 }
338 return true;
339 }
340 return enableCombineKey_;
341 }
342
IsEnableCombineKeySwipe(const std::shared_ptr<KeyEvent> keyEvent)343 bool KeySubscriberHandler::IsEnableCombineKeySwipe(const std::shared_ptr<KeyEvent> keyEvent)
344 {
345 for (const auto &item : keyEvent->GetKeyItems()) {
346 int32_t keyCode = item.GetKeyCode();
347 if (keyCode != KeyEvent::KEYCODE_CTRL_LEFT && keyCode != KeyEvent::KEYCODE_META_LEFT &&
348 keyCode != KeyEvent::KEYCODE_DPAD_RIGHT && keyCode != KeyEvent::KEYCODE_CTRL_RIGHT &&
349 keyCode != KeyEvent::KEYCODE_DPAD_LEFT) {
350 return enableCombineKey_;
351 }
352 }
353 return true;
354 }
355
PublishKeyPressCommonEvent(std::shared_ptr<KeyEvent> keyEvent)356 void KeySubscriberHandler::PublishKeyPressCommonEvent(std::shared_ptr<KeyEvent> keyEvent)
357 {
358 OHOS::AAFwk::Want want;
359 want.SetAction("multimodal.event.MUTE_KEY_PRESS");
360 want.SetParam("keyCode", keyEvent->GetKeyCode());
361 EventFwk::CommonEventPublishInfo publishInfo;
362 std::vector<std::string> permissionVec {"ohos.permission.NOTIFICATION_CONTROLLER"};
363 publishInfo.SetSubscriberPermissions(permissionVec);
364 EventFwk::CommonEventData commonData {want};
365 EventFwk::CommonEventManager::PublishCommonEvent(commonData, publishInfo);
366 }
367
HandleRingMute(std::shared_ptr<KeyEvent> keyEvent)368 bool KeySubscriberHandler::HandleRingMute(std::shared_ptr<KeyEvent> keyEvent)
369 {
370 CALL_DEBUG_ENTER;
371 CHKPF(keyEvent);
372 if (keyEvent->GetKeyCode() != KeyEvent::KEYCODE_VOLUME_DOWN &&
373 keyEvent->GetKeyCode() != KeyEvent::KEYCODE_VOLUME_UP &&
374 keyEvent->GetKeyCode() != KeyEvent::KEYCODE_POWER) {
375 MMI_HILOGD("There is no need to set mute");
376 return false;
377 }
378 int32_t ret = -1;
379 PublishKeyPressCommonEvent(keyEvent);
380 if (DEVICE_MONITOR->GetCallState() == StateType::CALL_STATUS_INCOMING ||
381 DEVICE_MONITOR->GetCallState() == StateType::CALL_STATUS_WAITING) {
382 if (callManagerClientPtr == nullptr) {
383 callManagerClientPtr = DelayedSingleton<OHOS::Telephony::CallManagerClient>::GetInstance();
384 if (callManagerClientPtr == nullptr) {
385 MMI_HILOGE("CallManager init fail");
386 return false;
387 }
388 callManagerClientPtr->Init(OHOS::TELEPHONY_CALL_MANAGER_SYS_ABILITY_ID);
389 }
390 if (!DEVICE_MONITOR->GetHasHandleRingMute()) {
391 ret = callManagerClientPtr->MuteRinger();
392 if (ret != ERR_OK) {
393 MMI_HILOGE("Set mute fail, ret:%{public}d", ret);
394 return false;
395 }
396 MMI_HILOGI("Set mute success");
397 DEVICE_MONITOR->SetHasHandleRingMute(true);
398 if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER) {
399 needSkipPowerKeyUp_ = true;
400 }
401 return true;
402 } else {
403 if (keyEvent->GetKeyCode() != KeyEvent::KEYCODE_POWER) {
404 MMI_HILOGD("Set mute success, block volumeKey");
405 return true;
406 }
407 }
408 }
409 return false;
410 }
411
OnSubscribeKeyEvent(std::shared_ptr<KeyEvent> keyEvent)412 bool KeySubscriberHandler::OnSubscribeKeyEvent(std::shared_ptr<KeyEvent> keyEvent)
413 {
414 CALL_DEBUG_ENTER;
415 CHKPF(keyEvent);
416 if (HandleRingMute(keyEvent)) {
417 MMI_HILOGI("Mute Ring in subscribe keyEvent");
418 RemoveSubscriberTimer(keyEvent);
419 return true;
420 }
421 if (!IsEnableCombineKey(keyEvent)) {
422 MMI_HILOGI("Combine key is taken over in subscribe keyEvent");
423 return false;
424 }
425 if (keyGestureMgr_.Intercept(keyEvent)) {
426 MMI_HILOGD("Key gesture recognized");
427 return true;
428 }
429 if (IsRepeatedKeyEvent(keyEvent)) {
430 MMI_HILOGD("Repeat KeyEvent, skip");
431 return true;
432 }
433 keyEvent_ = KeyEvent::Clone(keyEvent);
434 int32_t keyAction = keyEvent->GetKeyAction();
435 if (EventLogHelper::IsBetaVersion() && !keyEvent->HasFlag(InputEvent::EVENT_FLAG_PRIVACY_MODE)) {
436 MMI_HILOGD("keyCode:%d, keyAction:%{public}s", keyEvent->GetKeyCode(), KeyEvent::ActionToString(keyAction));
437 } else {
438 MMI_HILOGD("keyCode:%d, keyAction:%{public}s", keyEvent->GetKeyCode(), KeyEvent::ActionToString(keyAction));
439 }
440 if (needSkipPowerKeyUp_ && keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER
441 && keyAction == KeyEvent::KEY_ACTION_UP) {
442 MMI_HILOGD("Skip power key up");
443 needSkipPowerKeyUp_ = false;
444 return true;
445 }
446 for (const auto &keyCode : keyEvent->GetPressedKeys()) {
447 if (EventLogHelper::IsBetaVersion() && !keyEvent->HasFlag(InputEvent::EVENT_FLAG_PRIVACY_MODE)) {
448 MMI_HILOGD("Pressed KeyCode:%d", keyCode);
449 } else {
450 MMI_HILOGD("Pressed KeyCode:%d", keyCode);
451 }
452 }
453 bool handled = false;
454 if (keyAction == KeyEvent::KEY_ACTION_DOWN) {
455 handled = HandleKeyDown(keyEvent);
456 } else if (keyAction == KeyEvent::KEY_ACTION_UP) {
457 hasEventExecuting_ = false;
458 handled = HandleKeyUp(keyEvent);
459 } else if (keyAction == KeyEvent::KEY_ACTION_CANCEL) {
460 hasEventExecuting_ = false;
461 handled = HandleKeyCancel(keyEvent);
462 } else {
463 MMI_HILOGW("keyAction exception");
464 }
465 return handled;
466 }
467
OnSessionDelete(SessionPtr sess)468 void KeySubscriberHandler::OnSessionDelete(SessionPtr sess)
469 {
470 CALL_DEBUG_ENTER;
471 CHKPV(sess);
472 for (auto iter = subscriberMap_.begin(); iter != subscriberMap_.end(); iter++) {
473 auto &subscribers = iter->second;
474 for (auto it = subscribers.begin(); it != subscribers.end();) {
475 if ((*it)->sess_ == sess) {
476 ClearTimer(*it);
477 subscribers.erase(it++);
478 continue;
479 }
480 ++it;
481 }
482 }
483 for (auto iter = keyGestures_.begin(); iter != keyGestures_.end();) {
484 auto &subscribers = iter->second;
485 for (auto inner = subscribers.begin(); inner != subscribers.end();) {
486 auto subscriber = *inner;
487 if (subscriber->sess_ == sess) {
488 MMI_HILOGI("Removing key-gesture handler(%{public}d) on subscriber(%{public}d) dying",
489 subscriber->timerId_, sess->GetPid());
490 keyGestureMgr_.RemoveKeyGesture(subscriber->timerId_);
491 auto option = subscriber->keyOption_;
492 MMI_HILOGI("SubscribeId:%{public}d, finalKey:%{private}d, isFinalKeyDown:%{public}s,"
493 "finalKeyDownDuration:%{public}d, pid:%{public}d", subscriber->id_, option->GetFinalKey(),
494 option->IsFinalKeyDown() ? "true" : "false", option->GetFinalKeyDownDuration(), sess->GetPid());
495 inner = subscribers.erase(inner);
496 } else {
497 ++inner;
498 }
499 }
500 if (subscribers.empty()) {
501 iter = keyGestures_.erase(iter);
502 } else {
503 ++iter;
504 }
505 }
506 }
507
IsPreKeysMatch(const std::set<int32_t> & preKeys,const std::vector<int32_t> & pressedKeys) const508 bool KeySubscriberHandler::IsPreKeysMatch(const std::set<int32_t> &preKeys,
509 const std::vector<int32_t> &pressedKeys) const
510 {
511 if (preKeys.size() == 0) {
512 MMI_HILOGD("The preKeys is empty");
513 return true;
514 }
515
516 if (preKeys.size() != pressedKeys.size()) {
517 MMI_HILOGE("The size of preKeys is not match");
518 return false;
519 }
520
521 for (const auto &pressedKey : pressedKeys) {
522 auto it = std::find(preKeys.begin(), preKeys.end(), pressedKey);
523 if (it == preKeys.end()) {
524 MMI_HILOGE("Cant't find the pressedKey");
525 return false;
526 }
527 }
528
529 return true;
530 }
531
IsEqualPreKeys(const std::set<int32_t> & preKeys,const std::set<int32_t> & pressedKeys)532 bool KeySubscriberHandler::IsEqualPreKeys(const std::set<int32_t> &preKeys, const std::set<int32_t> &pressedKeys)
533 {
534 if (preKeys.size() != pressedKeys.size()) {
535 MMI_HILOGD("Pre key size not equal");
536 return false;
537 }
538
539 for (const auto &pressedKey : pressedKeys) {
540 auto it = std::find(preKeys.begin(), preKeys.end(), pressedKey);
541 if (it == preKeys.end()) {
542 return false;
543 }
544 }
545 MMI_HILOGD("Equal prekeys");
546 return true;
547 }
548
IsMatchForegroundPid(std::list<std::shared_ptr<Subscriber>> subs,std::set<int32_t> foregroundPids)549 bool KeySubscriberHandler::IsMatchForegroundPid(std::list<std::shared_ptr<Subscriber>> subs,
550 std::set<int32_t> foregroundPids)
551 {
552 CALL_DEBUG_ENTER;
553 isForegroundExits_ = false;
554 foregroundPids_.clear();
555 for (const auto &item : subs) {
556 CHKPF(item);
557 auto sess = item->sess_;
558 CHKPF(sess);
559 if (foregroundPids.find(sess->GetPid()) != foregroundPids.end()) {
560 MMI_HILOGD("Subscriber foregroundPid:%{public}d", sess->GetPid());
561 foregroundPids_.insert(sess->GetPid());
562 isForegroundExits_ = true;
563 }
564 }
565 MMI_HILOGD("isForegroundExits_:%{public}d, foregroundPids:%{public}zu",
566 isForegroundExits_, foregroundPids_.size());
567 return isForegroundExits_;
568 }
569
NotifyKeyDownSubscriber(const std::shared_ptr<KeyEvent> & keyEvent,std::shared_ptr<KeyOption> keyOption,std::list<std::shared_ptr<Subscriber>> & subscribers,bool & handled)570 void KeySubscriberHandler::NotifyKeyDownSubscriber(const std::shared_ptr<KeyEvent> &keyEvent,
571 std::shared_ptr<KeyOption> keyOption, std::list<std::shared_ptr<Subscriber>> &subscribers, bool &handled)
572 {
573 CALL_DEBUG_ENTER;
574 CHKPV(keyEvent);
575 CHKPV(keyOption);
576 MMI_HILOGD("Notify key down subscribers size:%{public}zu", subscribers.size());
577 if (keyOption->GetFinalKeyDownDuration() <= 0) {
578 NotifyKeyDownRightNow(keyEvent, subscribers, handled);
579 } else {
580 NotifyKeyDownDelay(keyEvent, subscribers, handled);
581 }
582 }
NotifyKeyDownRightNow(const std::shared_ptr<KeyEvent> & keyEvent,std::list<std::shared_ptr<Subscriber>> & subscribers,bool & handled)583 void KeySubscriberHandler::NotifyKeyDownRightNow(const std::shared_ptr<KeyEvent> &keyEvent,
584 std::list<std::shared_ptr<Subscriber>> &subscribers, bool &handled)
585 {
586 CALL_DEBUG_ENTER;
587 MMI_HILOGD("The subscribe list size is %{public}zu", subscribers.size());
588 for (auto &subscriber : subscribers) {
589 CHKPC(subscriber);
590 auto sess = subscriber->sess_;
591 CHKPC(sess);
592 if (!isForegroundExits_ || keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER ||
593 foregroundPids_.find(sess->GetPid()) != foregroundPids_.end()) {
594 MMI_HILOGD("keyOption->GetFinalKeyDownDuration() <= 0");
595 NotifySubscriber(keyEvent, subscriber);
596 handled = true;
597 }
598 }
599 }
600
NotifyKeyDownDelay(const std::shared_ptr<KeyEvent> & keyEvent,std::list<std::shared_ptr<Subscriber>> & subscribers,bool & handled)601 void KeySubscriberHandler::NotifyKeyDownDelay(const std::shared_ptr<KeyEvent> &keyEvent,
602 std::list<std::shared_ptr<Subscriber>> &subscribers, bool &handled)
603 {
604 CALL_DEBUG_ENTER;
605 MMI_HILOGD("The subscribe list size is %{public}zu", subscribers.size());
606 for (auto &subscriber : subscribers) {
607 CHKPC(subscriber);
608 auto sess = subscriber->sess_;
609 CHKPC(sess);
610 if (!isForegroundExits_ || keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER ||
611 foregroundPids_.find(sess->GetPid()) != foregroundPids_.end()) {
612 MMI_HILOGD("Add timer");
613 if (!AddTimer(subscriber, keyEvent)) {
614 MMI_HILOGE("Add time failed, subscriberId:%{public}d", subscriber->id_);
615 continue;
616 }
617 handled = true;
618 }
619 }
620 }
621
NotifyKeyUpSubscriber(const std::shared_ptr<KeyEvent> & keyEvent,std::list<std::shared_ptr<Subscriber>> subscribers,bool & handled)622 void KeySubscriberHandler::NotifyKeyUpSubscriber(const std::shared_ptr<KeyEvent> &keyEvent,
623 std::list<std::shared_ptr<Subscriber>> subscribers, bool &handled)
624 {
625 CALL_DEBUG_ENTER;
626 MMI_HILOGD("Subscribers size:%{public}zu", subscribers.size());
627 for (auto &subscriber : subscribers) {
628 CHKPC(subscriber);
629 auto sess = subscriber->sess_;
630 CHKPC(sess);
631 if (!isForegroundExits_ || foregroundPids_.find(sess->GetPid()) != foregroundPids_.end()) {
632 HandleKeyUpWithDelay(keyEvent, subscriber);
633 handled = true;
634 }
635 }
636 }
637
NotifySubscriber(std::shared_ptr<KeyEvent> keyEvent,const std::shared_ptr<Subscriber> & subscriber)638 void KeySubscriberHandler::NotifySubscriber(std::shared_ptr<KeyEvent> keyEvent,
639 const std::shared_ptr<Subscriber> &subscriber) __attribute__((no_sanitize("cfi")))
640 {
641 CALL_DEBUG_ENTER;
642 CHKPV(keyEvent);
643 CHKPV(subscriber);
644 auto udsServerPtr = InputHandler->GetUDSServer();
645 CHKPV(udsServerPtr);
646 if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER) {
647 DfxHisysevent::ReportPowerInfo(keyEvent, OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC);
648 }
649 SubscriberNotifyNap(subscriber);
650 NetPacket pkt(MmiMessageId::ON_SUBSCRIBE_KEY);
651 InputEventDataTransformation::KeyEventToNetPacket(keyEvent, pkt);
652 auto sess = subscriber->sess_;
653 CHKPV(sess);
654 int32_t fd = sess->GetFd();
655 pkt << fd << subscriber->id_;
656 if (!EventLogHelper::IsBetaVersion()) {
657 MMI_HILOGI("Notify subscriber id:%{public}d, pid:%{public}d", subscriber->id_, sess->GetPid());
658 } else {
659 if (EventLogHelper::IsBetaVersion() && !keyEvent->HasFlag(InputEvent::EVENT_FLAG_PRIVACY_MODE)) {
660 MMI_HILOGI("Notify subscriber id:%{public}d, keycode:%d, pid:%{public}d",
661 subscriber->id_, keyEvent->GetKeyCode(), sess->GetPid());
662 } else {
663 MMI_HILOGI("Notify subscriber id:%{public}d, keycode:%d, pid:%{public}d",
664 subscriber->id_, keyEvent->GetKeyCode(), sess->GetPid());
665 }
666 }
667 if (pkt.ChkRWError()) {
668 MMI_HILOGE("Packet write dispatch subscriber failed");
669 return;
670 }
671 if (!udsServerPtr->SendMsg(fd, pkt)) {
672 MMI_HILOGE("Leave, server dispatch subscriber failed");
673 return;
674 }
675 }
676
AddTimer(const std::shared_ptr<Subscriber> & subscriber,const std::shared_ptr<KeyEvent> & keyEvent)677 bool KeySubscriberHandler::AddTimer(const std::shared_ptr<Subscriber> &subscriber,
678 const std::shared_ptr<KeyEvent> &keyEvent)
679 {
680 CALL_DEBUG_ENTER;
681 CHKPF(keyEvent);
682 CHKPF(subscriber);
683
684 if (subscriber->timerId_ >= 0) {
685 MMI_HILOGW("Leave, timer already added, it may have been added by injection");
686 return true;
687 }
688
689 auto &keyOption = subscriber->keyOption_;
690 bool isKeyDown = keyOption->IsFinalKeyDown();
691 int32_t duration = isKeyDown ? keyOption->GetFinalKeyDownDuration() : keyOption->GetFinalKeyUpDelay();
692 if (duration <= 0) {
693 MMI_HILOGE("Leave, duration <= 0");
694 return true;
695 }
696
697 if (!CloneKeyEvent(keyEvent)) {
698 MMI_HILOGE("Leave, cloneKeyEvent failed");
699 return false;
700 }
701
702 std::weak_ptr<Subscriber> weakSubscriber = subscriber;
703 subscriber->timerId_ = TimerMgr->AddTimer(duration, 1, [this, weakSubscriber] () {
704 MMI_HILOGD("Timer callback");
705 auto subscriber = weakSubscriber.lock();
706 CHKPV(subscriber);
707 subscriber->timerId_ = -1;
708 OnTimer(subscriber);
709 });
710
711 if (subscriber->timerId_ < 0) {
712 MMI_HILOGE("Leave, addTimer failed");
713 return false;
714 }
715 subscriber->keyEvent_ = keyEvent_;
716 hasEventExecuting_ = true;
717 MMI_HILOGD("Leave, add timer success, subscribeId:%{public}d,"
718 "duration:%{public}d, timerId:%{public}d",
719 subscriber->id_, duration, subscriber->timerId_);
720 return true;
721 }
722
ClearSubscriberTimer(std::list<std::shared_ptr<Subscriber>> subscribers)723 void KeySubscriberHandler::ClearSubscriberTimer(std::list<std::shared_ptr<Subscriber>> subscribers)
724 {
725 CALL_DEBUG_ENTER;
726 MMI_HILOGD("Clear subscriber timer size:%{public}zu", subscribers.size());
727 for (auto &subscriber : subscribers) {
728 CHKPC(subscriber);
729 ClearTimer(subscriber);
730 }
731 }
732
ClearTimer(const std::shared_ptr<Subscriber> & subscriber)733 void KeySubscriberHandler::ClearTimer(const std::shared_ptr<Subscriber> &subscriber)
734 {
735 CALL_DEBUG_ENTER;
736 CHKPV(subscriber);
737
738 if (subscriber->timerId_ < 0) {
739 MMI_HILOGD("Leave, subscribeId:%{public}d, null timerId < 0", subscriber->id_);
740 return;
741 }
742
743 TimerMgr->RemoveTimer(subscriber->timerId_);
744 auto timerId = subscriber->timerId_;
745 subscriber->keyEvent_.reset();
746 subscriber->timerId_ = -1;
747 hasEventExecuting_ = false;
748 MMI_HILOGD("subscribeId:%{public}d, timerId:%{public}d", subscriber->id_, timerId);
749 }
750
OnTimer(const std::shared_ptr<Subscriber> subscriber)751 void KeySubscriberHandler::OnTimer(const std::shared_ptr<Subscriber> subscriber)
752 {
753 CALL_DEBUG_ENTER;
754 CHKPV(subscriber);
755 subscriber->timerId_ = -1;
756 if (subscriber->keyEvent_ == nullptr) {
757 MMI_HILOGE("Leave, subscriber->keyEvent is nullptr, subscribeId:%{public}d", subscriber->id_);
758 return;
759 }
760
761 NotifySubscriber(subscriber->keyEvent_, subscriber);
762 subscriber->keyEvent_.reset();
763 MMI_HILOGD("subscribeId:%{public}d", subscriber->id_);
764 }
765
InitSessionDeleteCallback()766 bool KeySubscriberHandler::InitSessionDeleteCallback()
767 {
768 CALL_DEBUG_ENTER;
769 if (callbackInitialized_) {
770 MMI_HILOGD("Session delete callback has already been initialized");
771 return true;
772 }
773 auto udsServerPtr = InputHandler->GetUDSServer();
774 CHKPF(udsServerPtr);
775 std::function<void(SessionPtr)> callback =
776 [this] (SessionPtr sess) { return this->OnSessionDelete(sess); };
777 udsServerPtr->AddSessionDeletedCallback(callback);
778 callbackInitialized_ = true;
779 return true;
780 }
781
HandleKeyDown(const std::shared_ptr<KeyEvent> & keyEvent)782 bool KeySubscriberHandler::HandleKeyDown(const std::shared_ptr<KeyEvent> &keyEvent)
783 {
784 CALL_DEBUG_ENTER;
785 CHKPF(keyEvent);
786 bool handled = false;
787 auto keyCode = keyEvent->GetKeyCode();
788 std::vector<int32_t> pressedKeys = keyEvent->GetPressedKeys();
789 RemoveKeyCode(keyCode, pressedKeys);
790 std::set<int32_t> pids;
791 GetForegroundPids(pids);
792 MMI_HILOGI("Foreground pid size:%{public}zu", pids.size());
793 for (auto &iter : subscriberMap_) {
794 auto keyOption = iter.first;
795 auto subscribers = iter.second;
796 PrintKeyOption(keyOption);
797 IsMatchForegroundPid(subscribers, pids);
798 if (!keyOption->IsFinalKeyDown()) {
799 MMI_HILOGD("!keyOption->IsFinalKeyDown()");
800 continue;
801 }
802 if (keyCode != keyOption->GetFinalKey()) {
803 MMI_HILOGD("keyCode != keyOption->GetFinalKey()");
804 ClearSubscriberTimer(subscribers);
805 continue;
806 }
807 if (!IsPreKeysMatch(keyOption->GetPreKeys(), pressedKeys)) {
808 MMI_HILOGD("preKeysMatch failed");
809 ClearSubscriberTimer(subscribers);
810 continue;
811 }
812 NotifyKeyDownSubscriber(keyEvent, keyOption, subscribers, handled);
813 }
814 MMI_HILOGD("Handle key down:%{public}s", handled ? "true" : "false");
815 return handled;
816 }
817
SubscriberNotifyNap(const std::shared_ptr<Subscriber> subscriber)818 void KeySubscriberHandler::SubscriberNotifyNap(const std::shared_ptr<Subscriber> subscriber)
819 {
820 CALL_DEBUG_ENTER;
821 CHKPV(subscriber);
822 int32_t state = NapProcess::GetInstance()->GetNapClientPid();
823 if (state == REMOVE_OBSERVER || state == UNOBSERVED) {
824 MMI_HILOGD("Nap client status:%{public}d", state);
825 return;
826 }
827
828 auto sess = subscriber->sess_;
829 CHKPV(sess);
830 OHOS::MMI::NapProcess::NapStatusData napData;
831 napData.pid = sess->GetPid();
832 napData.uid = sess->GetUid();
833 napData.bundleName = sess->GetProgramName();
834 if (NapProcess::GetInstance()->IsNeedNotify(napData)) {
835 int32_t syncState = ACTIVE_EVENT;
836 NapProcess::GetInstance()->AddMmiSubscribedEventData(napData, syncState);
837 NapProcess::GetInstance()->NotifyBundleName(napData, syncState);
838 }
839 }
840
HandleKeyUp(const std::shared_ptr<KeyEvent> & keyEvent)841 bool KeySubscriberHandler::HandleKeyUp(const std::shared_ptr<KeyEvent> &keyEvent)
842 {
843 CALL_DEBUG_ENTER;
844 CHKPF(keyEvent);
845 bool handled = false;
846 auto keyCode = keyEvent->GetKeyCode();
847 std::vector<int32_t> pressedKeys = keyEvent->GetPressedKeys();
848 RemoveKeyCode(keyCode, pressedKeys);
849 std::set<int32_t> pids;
850 GetForegroundPids(pids);
851 for (auto &iter : subscriberMap_) {
852 auto keyOption = iter.first;
853 auto subscribers = iter.second;
854 PrintKeyOption(keyOption);
855 IsMatchForegroundPid(subscribers, pids);
856 if (keyOption->IsFinalKeyDown()) {
857 MMI_HILOGD("keyOption->IsFinalKeyDown()");
858 ClearSubscriberTimer(subscribers);
859 continue;
860 }
861 if (keyCode != keyOption->GetFinalKey()) {
862 MMI_HILOGD("keyCode != keyOption->GetFinalKey()");
863 continue;
864 }
865 if (!IsPreKeysMatch(keyOption->GetPreKeys(), pressedKeys)) {
866 MMI_HILOGD("PreKeysMatch failed");
867 continue;
868 }
869 auto duration = keyOption->GetFinalKeyDownDuration();
870 if (duration <= 0) {
871 NotifyKeyUpSubscriber(keyEvent, subscribers, handled);
872 continue;
873 }
874 std::optional<KeyEvent::KeyItem> keyItem = keyEvent->GetKeyItem();
875 CHK_KEY_ITEM(keyItem);
876 auto upTime = keyEvent->GetActionTime();
877 auto downTime = keyItem->GetDownTime();
878 if (upTime - downTime >= (static_cast<int64_t>(duration) * 1000)) {
879 MMI_HILOGE("upTime - downTime >= duration");
880 continue;
881 }
882 NotifyKeyUpSubscriber(keyEvent, subscribers, handled);
883 }
884 MMI_HILOGD("Handle key up:%{public}s", handled ? "true" : "false");
885 return handled;
886 }
887
HandleKeyCancel(const std::shared_ptr<KeyEvent> & keyEvent)888 bool KeySubscriberHandler::HandleKeyCancel(const std::shared_ptr<KeyEvent> &keyEvent)
889 {
890 CALL_DEBUG_ENTER;
891 CHKPF(keyEvent);
892 for (auto &iter : subscriberMap_) {
893 auto keyOption = iter.first;
894 auto subscribers = iter.second;
895 for (auto &subscriber : subscribers) {
896 PrintKeyUpLog(subscriber);
897 ClearTimer(subscriber);
898 }
899 }
900 return false;
901 }
902
903 #ifdef OHOS_BUILD_ENABLE_KEYBOARD
IsKeyEventSubscribed(int32_t keyCode,int32_t trrigerType)904 bool KeySubscriberHandler::IsKeyEventSubscribed(int32_t keyCode, int32_t trrigerType)
905 {
906 CALL_DEBUG_ENTER;
907 for (const auto &iter : subscriberMap_) {
908 auto keyOption = iter.first;
909 auto subscribers = iter.second;
910 MMI_HILOGD("keyOption->finalKey:%{private}d, keyOption->isFinalKeyDown:%{public}s, "
911 "keyOption->finalKeyDownDuration:%{public}d",
912 keyOption->GetFinalKey(), keyOption->IsFinalKeyDown() ? "true" : "false",
913 keyOption->GetFinalKeyDownDuration());
914 int32_t keyAction = KeyEvent::KEY_ACTION_UP;
915 if (keyOption->IsFinalKeyDown()) {
916 MMI_HILOGD("keyOption is final key down");
917 keyAction = KeyEvent::KEY_ACTION_DOWN;
918 }
919 if (keyCode == keyOption->GetFinalKey() && trrigerType == keyAction && subscribers.size() > 0) {
920 MMI_HILOGD("Current key event is subscribed");
921 return true;
922 }
923 }
924 return false;
925 }
926 #endif // OHOS_BUILD_ENABLE_KEYBOARD
927
CloneKeyEvent(std::shared_ptr<KeyEvent> keyEvent)928 bool KeySubscriberHandler::CloneKeyEvent(std::shared_ptr<KeyEvent> keyEvent)
929 {
930 CHKPF(keyEvent);
931 if (keyEvent_ == nullptr) {
932 MMI_HILOGW("keyEvent_ is nullptr");
933 keyEvent_ = KeyEvent::Clone(keyEvent);
934 }
935 CHKPF(keyEvent_);
936 return true;
937 }
938
RemoveKeyCode(int32_t keyCode,std::vector<int32_t> & keyCodes)939 void KeySubscriberHandler::RemoveKeyCode(int32_t keyCode, std::vector<int32_t> &keyCodes)
940 {
941 for (auto it = keyCodes.begin(); it != keyCodes.end(); ++it) {
942 if (*it == keyCode) {
943 keyCodes.erase(it);
944 return;
945 }
946 }
947 }
948
IsRepeatedKeyEvent(std::shared_ptr<KeyEvent> keyEvent)949 bool KeySubscriberHandler::IsRepeatedKeyEvent(std::shared_ptr<KeyEvent> keyEvent)
950 {
951 CHKPF(keyEvent);
952 if (!hasEventExecuting_) {
953 return false;
954 }
955
956 if (keyEvent->GetKeyCode() != keyEvent_->GetKeyCode()) {
957 return false;
958 }
959
960 if (keyEvent->GetKeyAction() != keyEvent_->GetKeyAction()) {
961 return false;
962 }
963
964 if (keyEvent->GetKeyItems().size() != keyEvent_->GetKeyItems().size()) {
965 return false;
966 }
967
968 for (const auto &item : keyEvent->GetKeyItems()) {
969 int32_t keyCode = item.GetKeyCode();
970 bool findResult = false;
971 for (const auto &item1 : keyEvent_->GetKeyItems()) {
972 if (keyCode == item1.GetKeyCode()) {
973 findResult = true;
974 break;
975 }
976 }
977 if (!findResult) {
978 return false;
979 }
980 }
981 return true;
982 }
983
RemoveSubscriberKeyUpTimer(int32_t keyCode)984 void KeySubscriberHandler::RemoveSubscriberKeyUpTimer(int32_t keyCode)
985 {
986 for (auto iter = subscriberMap_.begin(); iter != subscriberMap_.end(); iter++) {
987 auto &subscribers = iter->second;
988 for (auto it = subscribers.begin(); it != subscribers.end(); it++) {
989 if (((*it)->timerId_ >= 0) && ((*it)->keyOption_->GetFinalKey() == keyCode)) {
990 ClearTimer(*it);
991 }
992 }
993 }
994 keyGestureMgr_.ResetAll();
995 }
996
HandleKeyUpWithDelay(std::shared_ptr<KeyEvent> keyEvent,const std::shared_ptr<Subscriber> & subscriber)997 void KeySubscriberHandler::HandleKeyUpWithDelay(std::shared_ptr<KeyEvent> keyEvent,
998 const std::shared_ptr<Subscriber> &subscriber)
999 {
1000 auto keyUpDelay = subscriber->keyOption_->GetFinalKeyUpDelay();
1001 if (keyUpDelay <= 0) {
1002 NotifySubscriber(keyEvent, subscriber);
1003 } else {
1004 if (!AddTimer(subscriber, keyEvent)) {
1005 MMI_HILOGE("Leave, add timer failed");
1006 }
1007 }
1008 }
1009
PrintKeyOption(const std::shared_ptr<KeyOption> keyOption)1010 void KeySubscriberHandler::PrintKeyOption(const std::shared_ptr<KeyOption> keyOption)
1011 {
1012 CHKPV(keyOption);
1013 MMI_HILOGD("keyOption->finalKey:%{private}d,keyOption->isFinalKeyDown:%{public}s, "
1014 "keyOption->finalKeyDownDuration:%{public}d",
1015 keyOption->GetFinalKey(), keyOption->IsFinalKeyDown() ? "true" : "false",
1016 keyOption->GetFinalKeyDownDuration());
1017 for (const auto &keyCode : keyOption->GetPreKeys()) {
1018 MMI_HILOGD("keyOption->prekey:%d", keyCode);
1019 }
1020 }
1021
PrintKeyUpLog(const std::shared_ptr<Subscriber> & subscriber)1022 void KeySubscriberHandler::PrintKeyUpLog(const std::shared_ptr<Subscriber> &subscriber)
1023 {
1024 CHKPV(subscriber);
1025 auto &keyOption = subscriber->keyOption_;
1026 MMI_HILOGD("subscribeId:%{public}d, keyOption->finalKey:%{private}d,"
1027 "keyOption->isFinalKeyDown:%{public}s, keyOption->finalKeyDownDuration:%{public}d,"
1028 "keyOption->finalKeyUpDelay:%{public}d",
1029 subscriber->id_, keyOption->GetFinalKey(), keyOption->IsFinalKeyDown() ? "true" : "false",
1030 keyOption->GetFinalKeyDownDuration(), keyOption->GetFinalKeyUpDelay());
1031 for (const auto &keyCode : keyOption->GetPreKeys()) {
1032 MMI_HILOGD("keyOption->prekey:%d", keyCode);
1033 }
1034 }
1035
Dump(int32_t fd,const std::vector<std::string> & args)1036 void KeySubscriberHandler::Dump(int32_t fd, const std::vector<std::string> &args)
1037 {
1038 CALL_DEBUG_ENTER;
1039 mprintf(fd, "Subscriber information:\t");
1040 mprintf(fd, "subscribers: count = %zu", CountSubscribers());
1041 for (const auto &item : foregroundPids_) {
1042 mprintf(fd, "Foreground Pids: %d", item);
1043 }
1044 mprintf(fd, "enableCombineKey: %s | isForegroundExits: %s | needSkipPowerKeyUp: %s \t",
1045 enableCombineKey_ ? "true" : "false", isForegroundExits_ ? "true" : "false",
1046 needSkipPowerKeyUp_ ? "true" : "false");
1047 DumpSubscribers(fd, subscriberMap_);
1048 DumpSubscribers(fd, keyGestures_);
1049 }
1050
CountSubscribers() const1051 size_t KeySubscriberHandler::CountSubscribers() const
1052 {
1053 size_t total { 0 };
1054
1055 for (auto &item : subscriberMap_) {
1056 total += item.second.size();
1057 }
1058 for (auto &item : keyGestures_) {
1059 total += item.second.size();
1060 }
1061 return total;
1062 }
1063
DumpSubscribers(int32_t fd,const SubscriberCollection & collection) const1064 void KeySubscriberHandler::DumpSubscribers(int32_t fd, const SubscriberCollection &collection) const
1065 {
1066 for (auto iter = collection.begin(); iter != collection.end(); ++iter) {
1067 auto &subscribers = iter->second;
1068 for (auto item = subscribers.begin(); item != subscribers.end(); ++item) {
1069 DumpSubscriber(fd, *item);
1070 }
1071 }
1072 }
1073
DumpSubscriber(int32_t fd,std::shared_ptr<Subscriber> subscriber) const1074 void KeySubscriberHandler::DumpSubscriber(int32_t fd, std::shared_ptr<Subscriber> subscriber) const
1075 {
1076 CHKPV(subscriber);
1077 SessionPtr session = subscriber->sess_;
1078 CHKPV(session);
1079 std::shared_ptr<KeyOption> keyOption = subscriber->keyOption_;
1080 CHKPV(keyOption);
1081 std::set<int32_t> preKeys = keyOption->GetPreKeys();
1082 std::ostringstream sPrekeys;
1083 if (auto keyIter = preKeys.cbegin(); keyIter != preKeys.cend()) {
1084 sPrekeys << *keyIter;
1085 for (++keyIter; keyIter != preKeys.cend(); ++keyIter) {
1086 sPrekeys << "," << *keyIter;
1087 }
1088 }
1089 mprintf(fd,
1090 "Subscriber ID:%d | Pid:%d | Uid:%d | Fd:%d | Prekeys:[%s] | FinalKey:%d | "
1091 "FinalKeyDownDuration:%d | IsFinalKeyDown:%s | ProgramName:%s",
1092 subscriber->id_, session->GetPid(), session->GetUid(), session->GetFd(),
1093 sPrekeys.str().c_str(), keyOption->GetFinalKey(), keyOption->GetFinalKeyDownDuration(),
1094 keyOption->IsFinalKeyDown() ? "true" : "false",
1095 session->GetProgramName().c_str());
1096 }
1097
RemoveSubscriberTimer(std::shared_ptr<KeyEvent> keyEvent)1098 void KeySubscriberHandler::RemoveSubscriberTimer(std::shared_ptr<KeyEvent> keyEvent)
1099 {
1100 CALL_INFO_TRACE;
1101 CHKPV(keyEvent);
1102 auto keyCode = keyEvent->GetKeyCode();
1103 std::vector<int32_t> pressedKeys = keyEvent->GetPressedKeys();
1104 RemoveKeyCode(keyCode, pressedKeys);
1105 std::set<int32_t> pids;
1106 GetForegroundPids(pids);
1107 MMI_HILOGI("Foreground pid size:%{public}zu", pids.size());
1108 for (auto &iter : subscriberMap_) {
1109 auto keyOption = iter.first;
1110 auto subscribers = iter.second;
1111 PrintKeyOption(keyOption);
1112 IsMatchForegroundPid(subscribers, pids);
1113 ClearSubscriberTimer(subscribers);
1114 }
1115 }
1116 } // namespace MMI
1117 } // namespace OHOS
1118