From 1aa0446ff97558e93970c7d34e95651f4f29e95a Mon Sep 17 00:00:00 2001 From: yanghang Date: Tue, 3 Jun 2025 15:59:05 +0800 Subject: [PATCH] fix: It remains locked when the screen is on Signed-off-by: yanghang --- .../native/src/suspend/suspend_controller.cpp | 34 ++++++++++++++++--- .../native/src/suspend/suspend_controller.h | 3 ++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/services/native/src/suspend/suspend_controller.cpp b/services/native/src/suspend/suspend_controller.cpp index da285dba..753b97a9 100644 --- a/services/native/src/suspend/suspend_controller.cpp +++ b/services/native/src/suspend/suspend_controller.cpp @@ -60,6 +60,19 @@ SuspendController::SuspendController(const std::shared_ptr& shutdownController_ = shutdownController; stateMachine_ = stateMachine; ffrtTimer_ = ffrtTimer; + token_ = new (std::nothrow) RunningLockTokenStub(); + if (token_ == nullptr) { + POWER_HILOGE(COMP_SVC, "create runninglock token failed"); + return; + } + RunningLockInfo info = {"PmsRunningLock", OHOS::PowerMgr::RunningLockType::RUNNINGLOCK_BACKGROUND}; + if (pms_ == nullptr) { + pms_ = DelayedSpSingleton::GetInstance(); + } + PowerErrors ret = pms_->CreateRunningLock(token_, info); + if (ret != PowerErrors::ERR_OK) { + POWER_HILOGI(COMP_SVC, "create runninglock failed"); + } } SuspendController::~SuspendController() @@ -131,10 +144,7 @@ public: POWER_HILOGI(FEATURE_SUSPEND, "OnPowerStateChanged: No controller"); return; } - if (state == PowerState::AWAKE) { - POWER_HILOGI(FEATURE_SUSPEND, "Turn awake, stop sleep timer"); - controller->StopSleep(); - } + controller->SetRunningLock(state); } private: @@ -319,6 +329,22 @@ void SuspendController::StopSleep() ffrtMutexMap_.Unlock(TIMER_ID_SLEEP); } +void SuspendController::SetRunningLock(PowerState state) +{ + if (pms_ == nullptr) { + POWER_HILOGE(COMP_SVC, "pms_ in SuspendController is nullptr."); + return; + } + if (state == PowerState::AWAKE) { + POWER_HILOGI(COMP_SVC, "Power state is transited to AWAKE, try to hold running lock."); + pms_->Lock(token_); + } + if (state == PowerState::INACTIVE) { + POWER_HILOGI(COMP_SVC, "Power state is transited to INACTIVE, try to release running lock."); + pms_->UnLock(token_); + } +} + void SuspendController::HandleEvent(int64_t delayTime) { FFRTTask task = [&]() { diff --git a/services/native/src/suspend/suspend_controller.h b/services/native/src/suspend/suspend_controller.h index 5c406612..4da77cb3 100644 --- a/services/native/src/suspend/suspend_controller.h +++ b/services/native/src/suspend/suspend_controller.h @@ -52,6 +52,7 @@ public: void Execute(); void Cancel(); void StopSleep(); + void SetRunningLock(PowerState state); void HandleEvent(int64_t delayTime); void CancelEvent(); void HandleAction(SuspendDeviceType reason, uint32_t action); @@ -127,6 +128,8 @@ private: std::mutex sleepCbMutex_; std::shared_ptr ffrtTimer_; FFRTMutexMap ffrtMutexMap_; + sptr token_ {nullptr}; + sptr pms_ {nullptr}; #ifdef POWER_MANAGER_ENABLE_FORCE_SLEEP_BROADCAST std::atomic forceSleeping_ {false}; #endif -- Gitee