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