• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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