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