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