From e29cd171068cbc512116f80c8362de7e33444bfb Mon Sep 17 00:00:00 2001 From: yanxuejun12 Date: Tue, 2 Sep 2025 10:36:11 +0800 Subject: [PATCH] fix: disable lid mode in the expanded state Signed-off-by: yanxuejun12 --- bundle.json | 3 +- powermgr.gni | 1 + services/BUILD.gn | 4 ++ services/native/include/power_mgr_service.h | 1 + services/native/src/power_mgr_service.cpp | 19 ++++++++- test/unittest/BUILD.gn | 4 ++ .../src/native_power_state_machine_test.cpp | 42 +++++++++++++++++++ 7 files changed, 72 insertions(+), 2 deletions(-) diff --git a/bundle.json b/bundle.json index 41c9ffe9..c21f8128 100644 --- a/bundle.json +++ b/bundle.json @@ -48,7 +48,8 @@ "power_manager_feature_watch_limit_screen_common_event_publish", "power_manager_feature_watch_update_adapt", "power_manager_feature_surport_takeover_suspend", - "power_manager_feature_enable_lid_check" + "power_manager_feature_enable_lid_check", + "power_manager_feature_lid_fold" ], "adapted_system_type": [ "standard" diff --git a/powermgr.gni b/powermgr.gni index 08238f37..fbaa1dd7 100644 --- a/powermgr.gni +++ b/powermgr.gni @@ -44,6 +44,7 @@ declare_args() { power_manager_feature_surport_takeover_suspend = false power_manager_feature_init_proximity_controller = false power_manager_feature_enable_lid_check = false + power_manager_feature_lid_fold = false } defines = [] diff --git a/services/BUILD.gn b/services/BUILD.gn index 5c84fb38..c5a187cc 100644 --- a/services/BUILD.gn +++ b/services/BUILD.gn @@ -151,6 +151,10 @@ ohos_shared_library("powermgrservice") { defines += [ "MSDP_MOVEMENT_ENABLE" ] } + if (power_manager_feature_lid_fold) { + defines += [ "POWER_LID_FOLD_ENABLE" ] + } + if (use_libfuzzer) { defines += [ "FUZZ_TEST" ] } diff --git a/services/native/include/power_mgr_service.h b/services/native/include/power_mgr_service.h index a0e13df7..e584241b 100644 --- a/services/native/include/power_mgr_service.h +++ b/services/native/include/power_mgr_service.h @@ -377,6 +377,7 @@ private: bool ready_ {false}; bool isDuringCallStateEnable_ {false}; + static std::atomic_bool foldScreenFlag_; std::mutex wakeupMutex_; std::mutex suspendMutex_; #ifdef POWER_MANAGER_POWER_ENABLE_S4 diff --git a/services/native/src/power_mgr_service.cpp b/services/native/src/power_mgr_service.cpp index dcd4135e..26f4805b 100644 --- a/services/native/src/power_mgr_service.cpp +++ b/services/native/src/power_mgr_service.cpp @@ -50,6 +50,9 @@ #include "xcollie/watchdog.h" #include "errors.h" #include "parameters.h" +#ifdef POWER_LID_FOLD_ENABLE +#include "display_manager_lite.h" +#endif #ifdef HAS_DEVICE_STANDBY_PART #include "standby_service_client.h" #endif @@ -98,7 +101,10 @@ std::atomic_bool PowerMgrService::isBootCompleted_ = false; std::atomic_bool PowerMgrService::isNeedReInit_ = false; std::atomic_bool PowerMgrService::displayManagerServiceCrash_ = false; #ifdef HAS_SENSORS_SENSOR_PART - std::atomic_bool PowerMgrService::isInLidMode_ = false; +std::atomic_bool PowerMgrService::isInLidMode_ = false; +#endif +#ifdef POWER_LID_FOLD_ENABLE +std::atomic_bool PowerMgrService::foldScreenFlag_ = false; #endif using namespace MMI; @@ -169,6 +175,9 @@ bool PowerMgrService::Init() screenOffPreController_->Init(); } isDuringCallStateEnable_ = system::GetBoolParameter("const.power.during_call_state_enable", false); +#ifdef POWER_LID_FOLD_ENABLE + foldScreenFlag_ = system::GetParameter("const.window.foldscreen.type", "") != ""; +#endif POWER_HILOGI(COMP_SVC, "powermgr service init success %{public}d", isDuringCallStateEnable_); return true; } @@ -503,6 +512,14 @@ void PowerMgrService::HallSensorCallback(SensorEvent* event) auto data = reinterpret_cast(event->data); auto status = static_cast(data->status); +#ifdef POWER_LID_FOLD_ENABLE + Rosen::FoldDisplayMode mode = Rosen::DisplayManagerLite::GetInstance().GetFoldDisplayMode(); + if (foldScreenFlag_ && (mode != Rosen::FoldDisplayMode::MAIN)) { + POWER_HILOGI(FEATURE_SUSPEND, "[UL_POWER] disable Lid mode in the expanded state"); + isInLidMode_ = false; + return; + } +#endif if (status & LID_CLOSED_HALL_FLAG) { if (isInLidMode_) { POWER_HILOGI(FEATURE_SUSPEND, "[UL_POWER] Lid close event received again"); diff --git a/test/unittest/BUILD.gn b/test/unittest/BUILD.gn index 6835480c..efca209d 100644 --- a/test/unittest/BUILD.gn +++ b/test/unittest/BUILD.gn @@ -842,6 +842,10 @@ ohos_unittest("power_state_machine_native_test") { ] external_deps = deps_ex + + if (power_manager_feature_lid_fold) { + defines += [ "POWER_LID_FOLD_ENABLE" ] + } } ohos_unittest("test_running_lock_native") { diff --git a/test/unittest/src/native_power_state_machine_test.cpp b/test/unittest/src/native_power_state_machine_test.cpp index 65e1e3a6..27337e41 100644 --- a/test/unittest/src/native_power_state_machine_test.cpp +++ b/test/unittest/src/native_power_state_machine_test.cpp @@ -507,4 +507,46 @@ HWTEST_F(NativePowerStateMachineTest, NativePowerStateMachine011, TestSize.Level POWER_HILOGI(LABEL_TEST, "NativePowerStateMachine011 function end!"); } #endif + +/** + * @tc.name: NativePowerStateMachine013 + * @tc.desc: test Lid Fold + * @tc.type: FUNC + */ +#ifdef HAS_SENSORS_SENSOR_PART +#ifdef POWER_LID_FOLD_ENABLE +HWTEST_F(NativePowerStateMachineTest, NativePowerStateMachine013, TestSize.Level0) +{ + POWER_HILOGI(LABEL_TEST, "NativePowerStateMachine013 function start!"); + auto pmsTest = DelayedSpSingleton::GetInstance(); + pmsTest->OnStart(); + pmsTest->SuspendControllerInit(); + pmsTest->WakeupControllerInit(); + SensorEvent event; + HallData data; + event.data = reinterpret_cast(&data); + event.sensorTypeId = SENSOR_TYPE_ID_HALL; + data.status = 0; + bool foldScreenFlag = PowerMgrService::foldScreenFlag_; + PowerMgrService::foldScreenFlag_ = true; + Rosen::FoldDisplayMode mode = Rosen::FoldDisplayMode::MAIN; + Rosen::DisplayManagerLite::GetInstance().SetFoldDisplayMode(mode); + pmsTest->HallSensorCallback(&event); + mode = Rosen::FoldDisplayMode::FULL; + Rosen::DisplayManagerLite::GetInstance().SetFoldDisplayMode(mode); + pmsTest->HallSensorCallback(&event); + PowerMgrService::foldScreenFlag_ = false; + mode = Rosen::FoldDisplayMode::MAIN; + Rosen::DisplayManagerLite::GetInstance().SetFoldDisplayMode(mode); + pmsTest->HallSensorCallback(&event); + mode = Rosen::FoldDisplayMode::FULL; + Rosen::DisplayManagerLite::GetInstance().SetFoldDisplayMode(mode); + pmsTest->HallSensorCallback(&event); + EXPECT_FALSE(PowerMgrService::isInLidMode_); + PowerMgrService::foldScreenFlag_ = foldScreenFlag; + event.data = nullptr; + POWER_HILOGI(LABEL_TEST, "NativePowerStateMachine013 function end!"); +} +#endif +#endif } // namespace -- Gitee