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