From c439ec109a5a42ddd12212e349b54aa4b03642f4 Mon Sep 17 00:00:00 2001 From: wuliangdong Date: Tue, 29 Apr 2025 20:40:11 +0800 Subject: [PATCH] Fix Issue:Unexpected Reboot Page Shown When Click Power-Key, After Hang Up Phone. Deterministic Bug: 1. Double Click Power-Key When Ringing, Then Hang Up The Phone; 2. Click Power Key, Reboot-Page Will Shown Unexpectedly. Solution:Reset Flag When Hang Up To Ensure It's Value Is Right. Signed-off-by: wuliangdong Change-Id: I2e55d6a3e7287385faa30314643e06ad228d7f77 Change-Id: I949b237c67172fbec65e3e81c88938165b1e2902 --- .../src/device_event_monitor.cpp | 5 +++++ service/key_command/src/key_command_handler.cpp | 8 ++++++++ .../subscriber/include/key_subscriber_handler.h | 3 ++- .../subscriber/src/key_subscriber_handler.cpp | 16 +++++++++++++++- 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/service/device_state_manager/src/device_event_monitor.cpp b/service/device_state_manager/src/device_event_monitor.cpp index d1092cd2ac..c9a82f8b5d 100644 --- a/service/device_state_manager/src/device_event_monitor.cpp +++ b/service/device_state_manager/src/device_event_monitor.cpp @@ -104,6 +104,11 @@ void DeviceEventMonitor::SetCallState(const EventFwk::CommonEventData &eventData hasHandleRingMute_ = false; } callState_ = callState; + if (callState_ == StateType::CALL_STATUS_DISCONNECTED) { + auto subscriberHandler = InputHandler->GetSubscriberHandler(); + CHKPV(subscriberHandler); + subscriberHandler->ResetSkipPowerKeyUpFlag(); + } } int32_t DeviceEventMonitor::GetCallState() diff --git a/service/key_command/src/key_command_handler.cpp b/service/key_command/src/key_command_handler.cpp index 1abae1db01..94a04e229f 100644 --- a/service/key_command/src/key_command_handler.cpp +++ b/service/key_command/src/key_command_handler.cpp @@ -1679,6 +1679,11 @@ void KeyCommandHandler::HandleRepeatKeyOwnCount(const RepeatKey &item) bool KeyCommandHandler::HandleRepeatKey(const RepeatKey &item, const std::shared_ptr keyEvent) { CALL_DEBUG_ENTER; + auto powerKeyLogger = [keyEvent, &item] () { + if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER) { + MMI_HILOGI("Add ability, bundleName:%{public}s", item.ability.bundleName.c_str()); + } + }; CHKPF(keyEvent); if (keyEvent->GetKeyCode() != item.keyCode) { return false; @@ -1700,6 +1705,7 @@ bool KeyCommandHandler::HandleRepeatKey(const RepeatKey &item, const std::shared if (item.ability.bundleName != SOS_BUNDLE_NAME || downActionTime_ - lastVolumeDownActionTime_ > SOS_INTERVAL_TIMES) { repeatKeyCountMap_.emplace(item.ability.bundleName, 1); + powerKeyLogger(); return true; } return false; @@ -1707,6 +1713,7 @@ bool KeyCommandHandler::HandleRepeatKey(const RepeatKey &item, const std::shared HandleRepeatKeyOwnCount(item); lastDownActionTime_ = downActionTime_; if (repeatKeyCountMap_[item.ability.bundleName] == item.times) { + powerKeyLogger(); if (!item.statusConfig.empty()) { bool statusValue = true; auto ret = SettingDataShare::GetInstance(MULTIMODAL_INPUT_SERVICE_ID) @@ -1735,6 +1742,7 @@ bool KeyCommandHandler::HandleRepeatKey(const RepeatKey &item, const std::shared if (count_ < repeatKeyMaxTimes_[item.keyCode] && repeatKeyTimerIds_[item.ability.bundleName] >= 0) { TimerMgr->RemoveTimer(repeatKeyTimerIds_[item.ability.bundleName]); repeatKeyTimerIds_.erase(item.ability.bundleName); + powerKeyLogger(); return true; } } diff --git a/service/subscriber/include/key_subscriber_handler.h b/service/subscriber/include/key_subscriber_handler.h index 9d18e3f148..51dc2157f0 100644 --- a/service/subscriber/include/key_subscriber_handler.h +++ b/service/subscriber/include/key_subscriber_handler.h @@ -44,6 +44,7 @@ public: int32_t UnsubscribeHotkey(SessionPtr sess, int32_t subscribeId); void RemoveSubscriberKeyUpTimer(int32_t keyCode); int32_t EnableCombineKey(bool enable); + void ResetSkipPowerKeyUpFlag(); void Dump(int32_t fd, const std::vector &args); private: @@ -138,7 +139,7 @@ private: bool enableCombineKey_ { true }; std::set foregroundPids_ {}; bool isForegroundExits_ { false }; - bool needSkipPowerKeyUp_ { false }; + std::atomic_bool needSkipPowerKeyUp_ { false }; bool callBahaviorState_ { false }; std::set pendingKeys_; }; diff --git a/service/subscriber/src/key_subscriber_handler.cpp b/service/subscriber/src/key_subscriber_handler.cpp index 22c6ff1a32..4cc5bf0b1f 100644 --- a/service/subscriber/src/key_subscriber_handler.cpp +++ b/service/subscriber/src/key_subscriber_handler.cpp @@ -446,6 +446,12 @@ int32_t KeySubscriberHandler::EnableCombineKey(bool enable) return RET_OK; } +void KeySubscriberHandler::ResetSkipPowerKeyUpFlag() +{ + MMI_HILOGI("Reset needSkipPowerKeyUp when hang up."); + needSkipPowerKeyUp_ = false; +} + bool KeySubscriberHandler::IsFunctionKey(const std::shared_ptr keyEvent) { MMI_HILOGD("Is Funciton Key In"); @@ -635,6 +641,11 @@ bool KeySubscriberHandler::HandleRingMute(std::shared_ptr keyEvent) bool KeySubscriberHandler::OnSubscribeKeyEvent(std::shared_ptr keyEvent) { CALL_DEBUG_ENTER; + auto powerKeyLogger = [keyEvent] (const std::string &log) { + if (keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER) { + MMI_HILOGI("Power key, action:%{public}d; %{public}s", keyEvent->GetKeyAction(), log.c_str()); + } + }; CHKPF(keyEvent); if (HandleRingMute(keyEvent)) { MMI_HILOGI("Mute Ring in subscribe keyEvent"); @@ -651,17 +662,20 @@ bool KeySubscriberHandler::OnSubscribeKeyEvent(std::shared_ptr keyEven } if (keyGestureMgr_.Intercept(keyEvent)) { MMI_HILOGD("Key gesture recognized"); + powerKeyLogger("keyGestureMgr::Intercept"); return true; } #ifdef OHOS_BUILD_ENABLE_KEY_PRESSED_HANDLER if (KEY_MONITOR_MGR->Intercept(keyEvent)) { MMI_HILOGD("Key monitor intercept (KC:%{private}d, KA:%{public}d)", keyEvent->GetKeyCode(), keyEvent->GetKeyAction()); + powerKeyLogger("KEY_MONITOR_MGR::Intercept"); return true; } #endif // #ifdef OHOS_BUILD_ENABLE_KEY_PRESSED_HANDLER if (IsRepeatedKeyEvent(keyEvent)) { MMI_HILOGD("Repeat KeyEvent, skip"); + powerKeyLogger("IsRepeatedKeyEvent"); return true; } return ProcessKeyEvent(keyEvent); @@ -679,7 +693,7 @@ bool KeySubscriberHandler::ProcessKeyEvent(std::shared_ptr keyEvent) } if (needSkipPowerKeyUp_ && keyEvent->GetKeyCode() == KeyEvent::KEYCODE_POWER && keyAction == KeyEvent::KEY_ACTION_UP) { - MMI_HILOGD("Skip power key up"); + MMI_HILOGI("Skip power key up"); needSkipPowerKeyUp_ = false; return true; } -- Gitee