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