diff --git a/bundle.json b/bundle.json index 41c9ffe9367c37699e953a89ecdbfa02fecacb92..c21f81286fc6153582165a900e217e62d005256b 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 08238f377bb00a35d02d04f6fe7992bac582f105..fbaa1dd7669b13802b9957b2cfc00dfd1c6597f1 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 5c84fb3885a1ceadf1c8225524a6d87016c559b2..c5a187cccc09933454edc784abb83a941f850fa6 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 a0e13df7b12c5710bb894785598605f13d49c286..e584241b17ee90c02f5cd069669946e9223d0097 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 dcd4135e2fcf45f08ecd45455c1b137371f304cc..26f4805bd2cfaa506469fca38aab6b7c8bf01b0b 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 6835480cf04772b1aa77bce5bb5bbce1bcfeecce..efca209dafadba8ccea20923ca6a1a1878a44514 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 65e1e3a6bae88b4117bb855ab9b7368b5a9bd49a..27337e4193e61dc9633be979910490fe8564ce3a 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