From bb4404439a3bfb49a5a0c031fda98546777d5d6a Mon Sep 17 00:00:00 2001 From: zhangyao Date: Sat, 9 Mar 2024 08:14:48 +0000 Subject: [PATCH] =?UTF-8?q?Description:=20=E4=B8=8A=E7=94=B5=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=9E=B6=E6=9E=84=E6=95=B4=E6=94=B9=20IssueNo:=20http?= =?UTF-8?q?s://gitee.com/openharmony/window=5Fwindow=5Fmanager/issues/I974?= =?UTF-8?q?JO=20Feature=20or=20Bugfix:=20Feature=20Binary=20Source:No=20Si?= =?UTF-8?q?gned-off-by:=20zhangyao=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../include/screen_session_manager.h | 7 ++- .../src/screen_session_manager.cpp | 50 ++++++++----------- .../src/session_display_power_controller.cpp | 1 + 3 files changed, 28 insertions(+), 30 deletions(-) diff --git a/window_scene/session_manager/include/screen_session_manager.h b/window_scene/session_manager/include/screen_session_manager.h index fe29dcacfc..1b42a45188 100644 --- a/window_scene/session_manager/include/screen_session_manager.h +++ b/window_scene/session_manager/include/screen_session_manager.h @@ -18,6 +18,8 @@ #include #include +#include +#include #include "common/include/task_scheduler.h" #include "dm_common.h" @@ -174,6 +176,8 @@ public: DMError HasImmersiveWindow(bool& immersive) override; void SetDisplayBoundary(const sptr screenSession); + void BlockScreenOnByCV(void); + //Fold Screen void SetFoldDisplayMode(const FoldDisplayMode displayMode) override; void SetDisplayNodeScreenId(ScreenId screenId, ScreenId displayNodeScreenId); @@ -322,8 +326,9 @@ private: bool keyguardDrawnDone_ = true; bool needScreenOnWhenKeyguardNotify_ = false; bool blockScreenPowerChange_ = false; - bool isReasonScreenOnSwitch_ = false; + std::mutex screenOnMutex_; + std::condition_variable screenOnCV_; //Fold Screen std::map phyScreenPropMap_; mutable std::recursive_mutex phyScreenPropMapMutex_; diff --git a/window_scene/session_manager/src/screen_session_manager.cpp b/window_scene/session_manager/src/screen_session_manager.cpp index 4287f55e65..3bc2ffe69f 100644 --- a/window_scene/session_manager/src/screen_session_manager.cpp +++ b/window_scene/session_manager/src/screen_session_manager.cpp @@ -51,7 +51,7 @@ const std::string SCREEN_SESSION_MANAGER_THREAD = "OS_ScreenSessionManager"; const std::string SCREEN_SESSION_MANAGER_SCREEN_POWER_THREAD = "OS_ScreenSessionManager_ScreenPower"; const std::string SCREEN_CAPTURE_PERMISSION = "ohos.permission.CAPTURE_SCREEN"; const std::string BOOTEVENT_BOOT_COMPLETED = "bootevent.boot.completed"; -const int SLEEP_US = 48 * 1000; // 48ms +const int CV_WAIT_MS = 300; const std::u16string DEFAULT_USTRING = u"error"; const std::string DEFAULT_STRING = "error"; const std::string ARG_DUMP_HELP = "-h"; @@ -937,6 +937,18 @@ bool ScreenSessionManager::SetDisplayState(DisplayState state) return sessionDisplayPowerController_->SetDisplayState(state); } +void ScreenSessionManager::BlockScreenOnByCV(void) +{ + if (keyguardDrawnDone_ == false) { + WLOGFI("[UL_POWER]screenOnCV_ set"); + needScreenOnWhenKeyguardNotify_ = true; + std::unique_lock lock(screenOnMutex_); + if (screenOnCV_.wait_for(lock, std::chrono::milliseconds(CV_WAIT_MS)) == std::cv_status::timeout) { + WLOGFI("[UL_POWER]wait ScreenOnCV_ timeout"); + } + } +} + void ScreenSessionManager::NotifyDisplayStateChange(DisplayId defaultDisplayId, sptr displayInfo, const std::map>& displayInfoMap, DisplayStateChangeType type) { @@ -989,25 +1001,10 @@ bool ScreenSessionManager::SetScreenPowerForAll(ScreenPowerState state, PowerSta } switch (state) { case ScreenPowerState::POWER_ON: { - if (keyguardDrawnDone_) { - WLOGFI("[UL_POWER]SetScreenPowerForAll keyguardDrawnDone_ is true step 1"); - status = ScreenPowerStatus::POWER_STATUS_ON; - break; - } else { - if (reason == PowerStateChangeReason::STATE_CHANGE_REASON_SWITCH) { - isReasonScreenOnSwitch_ = true; - } - needScreenOnWhenKeyguardNotify_ = true; - auto task = [this, reason]() { - SetScreenPower(ScreenPowerStatus::POWER_STATUS_ON, reason); - isReasonScreenOnSwitch_ = false; - needScreenOnWhenKeyguardNotify_ = false; - keyguardDrawnDone_ = true; - WLOGFI("[UL_POWER]SetScreenPowerForAll keyguardDrawnDone_ is true step 2"); - }; - taskScheduler_->PostTask(task, "screenOnTask", 300); // Retry after 300 ms. - return true; - } + keyguardDrawnDone_ = false; + WLOGFI("[UL_POWER]SetScreenPowerForAll keyguardDrawnDone_ is false"); + status = ScreenPowerStatus::POWER_STATUS_ON; + break; } case ScreenPowerState::POWER_OFF: { keyguardDrawnDone_ = false; @@ -1139,15 +1136,10 @@ void ScreenSessionManager::NotifyDisplayEvent(DisplayEvent event) keyguardDrawnDone_ = true; WLOGFI("[UL_POWER]NotifyDisplayEvent keyguardDrawnDone_ is true"); if (needScreenOnWhenKeyguardNotify_) { - taskScheduler_->RemoveTask("screenOnTask"); - usleep(SLEEP_US); - if (isReasonScreenOnSwitch_ == true) { - SetScreenPower(ScreenPowerStatus::POWER_STATUS_ON, PowerStateChangeReason::STATE_CHANGE_REASON_SWITCH); - isReasonScreenOnSwitch_ = false; - } else { - SetScreenPower(ScreenPowerStatus::POWER_STATUS_ON, PowerStateChangeReason::STATE_CHANGE_REASON_INIT); - } - needScreenOnWhenKeyguardNotify_ = false; + std::unique_lock lock(screenOnMutex_); + screenOnCV_.notify_all(); + WLOGFI("[UL_POWER]screenOnCV_ notify one"); + needScreenOnWhenKeyguardNotify_=false; } } diff --git a/window_scene/session_manager/src/session_display_power_controller.cpp b/window_scene/session_manager/src/session_display_power_controller.cpp index 9d9169e8d1..6bb75bf52b 100644 --- a/window_scene/session_manager/src/session_display_power_controller.cpp +++ b/window_scene/session_manager/src/session_display_power_controller.cpp @@ -51,6 +51,7 @@ bool SessionDisplayPowerController::SetDisplayState(DisplayState state) if (!ScreenSessionManager::GetInstance().IsMultiScreenCollaboration()) { ScreenSessionManager::GetInstance().NotifyDisplayPowerEvent(DisplayPowerEvent::DISPLAY_ON, EventStatus::BEGIN, PowerStateChangeReason::STATE_CHANGE_REASON_INIT); + ScreenSessionManager::GetInstance().BlockScreenOnByCV(); } break; } -- Gitee