diff --git a/etc/init/powermgr.cfg b/etc/init/powermgr.cfg index ff22494d20f13c068b821ba99bc5349480403b73..c8ea987897fe5c73f43e3971353602151d2ee5e4 100644 --- a/etc/init/powermgr.cfg +++ b/etc/init/powermgr.cfg @@ -23,6 +23,7 @@ "uid" : "powermgr", "apl" : "system_core", "permission" : [ + "ohos.permission.ACTIVITY_MOTION", "ohos.permission.INPUT_MONITORING", "ohos.permission.PERMISSION_USED_STATS", "ohos.permission.DISTRIBUTED_SOFTBUS_CENTER", diff --git a/powermgr.gni b/powermgr.gni index 07a1c1e13aae2e1e2ec28645df4898fe85cf3e77..197fe6e3fe8e7fdb232693746fb25d0f88fce141 100644 --- a/powermgr.gni +++ b/powermgr.gni @@ -46,6 +46,12 @@ if (!defined(global_parts_info) || has_device_standby_part = false } +if (!defined(global_parts_info) || defined(global_parts_info.msdp_movement)) { + has_msdp_movement_part = true +} else { + has_msdp_movement_part = false +} + if (!defined(global_parts_info) || defined(global_parts_info.sensors_sensor)) { has_sensors_sensor_part = true cflags_cc += [ "-DHAS_SENSORS_SENSOR_PART" ] diff --git a/services/BUILD.gn b/services/BUILD.gn index 562c193408af874f89ffc7cb5c3e43afbd7ebc6b..dcb1e6eb2f7db47fe60c6ce9ffb759e69f1c2b19 100644 --- a/services/BUILD.gn +++ b/services/BUILD.gn @@ -156,6 +156,10 @@ ohos_shared_library("powermgrservice") { external_deps += [ "input:libmmi-client" ] } + if (has_msdp_movement_part) { + defines += [ "MSDP_MOVEMENT_ENABLE" ] + } + if (has_sensors_sensor_part) { external_deps += [ "sensor:sensor_interface_native" ] } diff --git a/services/native/include/power_mgr_service.h b/services/native/include/power_mgr_service.h index 127541c5d57bf94fc781ce3dfb89688c65c0d447..40686570becbe201194facb7e3cc2ac902ba929d 100644 --- a/services/native/include/power_mgr_service.h +++ b/services/native/include/power_mgr_service.h @@ -308,6 +308,11 @@ private: int32_t timeOutMS = -1); static void RegisterBootCompletedCallback(); static bool IsDeveloperMode(); +#ifdef MSDP_MOVEMENT_ENABLE + void RegisterMovementCallback(); + void UnRegisterMovementCallback(); + void ResetMovementState(); +#endif inline PowerModeModule& GetPowerModeModule() { diff --git a/services/native/include/power_state_machine.h b/services/native/include/power_state_machine.h index 430290be8542f3abf8f45859bc1bce0eaab1359e..ccd1654e0a9340ec2cc5cbb6675c5489b3678277 100644 --- a/services/native/include/power_state_machine.h +++ b/services/native/include/power_state_machine.h @@ -100,6 +100,9 @@ public: bool IsCollaborationScreenOn(); void Reset(); int64_t GetSleepTime(); +#ifdef MSDP_MOVEMENT_ENABLE + bool IsMovementStateOn(); +#endif PowerState GetState() { diff --git a/services/native/src/power_mgr_service.cpp b/services/native/src/power_mgr_service.cpp index 3adf405faab85eb4057992ab68f74e49b2b5a111..8eca6cd3e60959ba876ef5e11241835432412f1d 100644 --- a/services/native/src/power_mgr_service.cpp +++ b/services/native/src/power_mgr_service.cpp @@ -51,6 +51,9 @@ #ifdef POWER_MANAGER_ENABLE_CHARGING_TYPE_SETTING #include "battery_srv_client.h" #endif +#ifdef MSDP_MOVEMENT_ENABLE +#include +#endif using namespace OHOS::AppExecFwk; using namespace OHOS::AAFwk; @@ -92,6 +95,9 @@ void PowerMgrService::OnStart() AddSystemAbilityListener(DEVICE_STANDBY_SERVICE_SYSTEM_ABILITY_ID); AddSystemAbilityListener(DISPLAY_MANAGER_SERVICE_ID); AddSystemAbilityListener(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID); +#ifdef MSDP_MOVEMENT_ENABLE + AddSystemAbilityListener(MSDP_MOVEMENT_SERVICE_ID); +#endif SystemSuspendController::GetInstance().RegisterHdiStatusListener(); if (!Publish(DelayedSpSingleton::GetInstance())) { POWER_HILOGE(COMP_SVC, "Register to system ability manager failed"); @@ -576,6 +582,9 @@ void PowerMgrService::OnStop() RemoveSystemAbilityListener(SUSPEND_MANAGER_SYSTEM_ABILITY_ID); RemoveSystemAbilityListener(DEVICE_STANDBY_SERVICE_SYSTEM_ABILITY_ID); RemoveSystemAbilityListener(DISPLAY_MANAGER_SERVICE_ID); +#ifdef MSDP_MOVEMENT_ENABLE + RemoveSystemAbilityListener(MSDP_MOVEMENT_SERVICE_ID); +#endif #ifdef POWER_WAKEUPDOUBLE_OR_PICKUP_ENABLE SettingHelper::UnregisterSettingWakeupDoubleObserver(); SettingHelper::UnregisterSettingWakeupPickupObserver(); @@ -585,6 +594,9 @@ void PowerMgrService::OnStop() if (!OHOS::EventFwk::CommonEventManager::UnSubscribeCommonEvent(subscriberPtr_)) { POWER_HILOGE(COMP_SVC, "Power Onstop unregister to commonevent manager failed!"); } +#ifdef MSDP_MOVEMENT_ENABLE + UnRegisterMovementCallback(); +#endif } void PowerMgrService::Reset() @@ -609,6 +621,16 @@ void PowerMgrService::OnRemoveSystemAbility(int32_t systemAbilityId, const std:: std::lock_guard lock(lockMutex_); runningLockMgr_->ResetRunningLocks(); } +#ifdef MSDP_MOVEMENT_ENABLE + if (systemAbilityId == MSDP_MOVEMENT_SERVICE_ID) { + auto power = DelayedSpSingleton::GetInstance(); + if (power == nullptr) { + POWER_HILOGI(COMP_SVC, "get PowerMgrService fail"); + return; + } + power->ResetMovementState(); + } +#endif } void PowerMgrService::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId) @@ -623,8 +645,101 @@ void PowerMgrService::OnAddSystemAbility(int32_t systemAbilityId, const std::str if (systemAbilityId == DISPLAY_MANAGER_SERVICE_ID) { RegisterBootCompletedCallback(); } +#ifdef MSDP_MOVEMENT_ENABLE + if (systemAbilityId == MSDP_MOVEMENT_SERVICE_ID) { + auto power = DelayedSpSingleton::GetInstance(); + if (power == nullptr) { + POWER_HILOGI(COMP_SVC, "get PowerMgrService fail"); + return; + } + power->UnRegisterMovementCallback(); + power->RegisterMovementCallback(); + } +#endif } +#ifdef MSDP_MOVEMENT_ENABLE +static const char* MOVEMENT_SUBSCRIBER_CONFIG = "RegisterMovementCallback"; +static const char* MOVEMENT_UNSUBSCRIBER_CONFIG = "UnRegisterMovementCallback"; +static const char* RESET_MOVEMENT_STATE_CONFIG = "ResetMovementState"; +static const char* POWER_MANAGER_EXT_PATH = "/system/lib64/libpower_manager_ext.z.so"; +typedef void(*FuncMovementSubscriber)(); +typedef void(*FuncMovementUnsubscriber)(); +typedef void(*FuncResetMovementState)(); + +void PowerMgrService::RegisterMovementCallback() +{ + POWER_HILOGI(COMP_SVC, "Start to RegisterMovementCallback"); + void *subscriberHandler = dlopen(POWER_MANAGER_EXT_PATH, RTLD_LAZY | RTLD_NODELETE); + if (subscriberHandler == nullptr) { + POWER_HILOGE(COMP_SVC, "Dlopen RegisterMovementCallback failed, reason : %{public}s", dlerror()); + return; + } + + FuncMovementSubscriber MovementSubscriberFlag = + reinterpret_cast(dlsym(subscriberHandler, MOVEMENT_SUBSCRIBER_CONFIG)); + if (MovementSubscriberFlag == nullptr) { + POWER_HILOGE(COMP_SVC, "RegisterMovementCallback is null, reason : %{public}s", dlerror()); + dlclose(subscriberHandler); + subscriberHandler = nullptr; + return; + } + MovementSubscriberFlag(); + POWER_HILOGI(COMP_SVC, "RegisterMovementCallback Success"); + dlclose(subscriberHandler); + subscriberHandler = nullptr; + return; +} + +void PowerMgrService::UnRegisterMovementCallback() +{ + POWER_HILOGI(COMP_SVC, "Start to UnRegisterMovementCallback"); + void *unSubscriberHandler = dlopen(POWER_MANAGER_EXT_PATH, RTLD_LAZY | RTLD_NODELETE); + if (unSubscriberHandler == nullptr) { + POWER_HILOGE(COMP_SVC, "Dlopen UnRegisterMovementCallback failed, reason : %{public}s", dlerror()); + return; + } + + FuncMovementUnsubscriber MovementUnsubscriberFlag = + reinterpret_cast(dlsym(unSubscriberHandler, MOVEMENT_UNSUBSCRIBER_CONFIG)); + if (MovementUnsubscriberFlag == nullptr) { + POWER_HILOGE(COMP_SVC, "UnRegisterMovementCallback is null, reason : %{public}s", dlerror()); + dlclose(unSubscriberHandler); + unSubscriberHandler = nullptr; + return; + } + MovementUnsubscriberFlag(); + POWER_HILOGI(COMP_SVC, "UnRegisterMovementCallback Success"); + dlclose(unSubscriberHandler); + unSubscriberHandler = nullptr; + return; +} + +void PowerMgrService::ResetMovementState() +{ + POWER_HILOGI(COMP_SVC, "Start to ResetMovementState"); + void *resetMovementStateHandler = dlopen(POWER_MANAGER_EXT_PATH, RTLD_LAZY | RTLD_NODELETE); + if (resetMovementStateHandler == nullptr) { + POWER_HILOGE(COMP_SVC, "Dlopen ResetMovementState failed, reason : %{public}s", dlerror()); + return; + } + + FuncResetMovementState ResetMovementStateFlag = + reinterpret_cast(dlsym(resetMovementStateHandler, RESET_MOVEMENT_STATE_CONFIG)); + if (ResetMovementStateFlag == nullptr) { + POWER_HILOGE(COMP_SVC, "ResetMovementState is null, reason : %{public}s", dlerror()); + dlclose(resetMovementStateHandler); + resetMovementStateHandler = nullptr; + return; + } + ResetMovementStateFlag(); + POWER_HILOGI(COMP_SVC, "ResetMovementState Success"); + dlclose(resetMovementStateHandler); + resetMovementStateHandler = nullptr; + return; +} +#endif + int32_t PowerMgrService::Dump(int32_t fd, const std::vector& args) { if (!isBootCompleted_) { diff --git a/services/native/src/power_state_machine.cpp b/services/native/src/power_state_machine.cpp index 4a9529483e6909fc9e81a8806124194c77eb80d2..dd8fe608ad34597e5a0f1eabd04434a392e38b72 100644 --- a/services/native/src/power_state_machine.cpp +++ b/services/native/src/power_state_machine.cpp @@ -32,6 +32,9 @@ #include "os_account_manager.h" #include "parameters.h" #endif +#ifdef MSDP_MOVEMENT_ENABLE +#include +#endif namespace OHOS { namespace PowerMgr { @@ -146,22 +149,60 @@ void PowerStateMachine::InitTransitMap() }); } +#ifdef MSDP_MOVEMENT_ENABLE +static const char* MOVEMENT_STATE_CONFIG = "GetMovementState"; +static const char* POWER_MANAGER_EXT_PATH = "/system/lib64/libpower_manager_ext.z.so"; +typedef bool(*FuncMovementState)(); + +bool PowerStateMachine::IsMovementStateOn() +{ + POWER_HILOGD(FEATURE_POWER_STATE, "Start to GetMovementState"); + void *stateHandler = dlopen(POWER_MANAGER_EXT_PATH, RTLD_LAZY | RTLD_NODELETE); + if (stateHandler == nullptr) { + POWER_HILOGE(FEATURE_POWER_STATE, "Dlopen GetMovementState failed, reason : %{public}s", dlerror()); + return false; + } + + FuncMovementState MovementStateFlag = reinterpret_cast(dlsym(stateHandler, + MOVEMENT_STATE_CONFIG)); + if (MovementStateFlag == nullptr) { + POWER_HILOGE(FEATURE_POWER_STATE, "GetMovementState is null, reason : %{public}s", dlerror()); + dlclose(stateHandler); + stateHandler = nullptr; + return false; + } + bool ret = MovementStateFlag(); + dlclose(stateHandler); + stateHandler = nullptr; + return ret; +} +#endif + bool PowerStateMachine::CanTransitTo(PowerState to, StateChangeReason reason) { bool isForbidden = forbidMap_.count(currentState_) && forbidMap_[currentState_].count(to); if (isForbidden) { return false; } -#ifdef HAS_SENSORS_SENSOR_PART - // prevent the double click and pickup to light up the screen when calling + // prevent the double click and pickup to light up the screen when calling or sporting if ((reason == StateChangeReason::STATE_CHANGE_REASON_DOUBLE_CLICK || - reason == StateChangeReason::STATE_CHANGE_REASON_PICKUP) && - IsProximityClose() && to == PowerState::AWAKE) { - POWER_HILOGI( - FEATURE_POWER_STATE, "Double-click or pickup isn't allowed to wakeup device when proximity is close."); - return false; - } + reason == StateChangeReason::STATE_CHANGE_REASON_PICKUP) && to == PowerState::AWAKE) { +#ifdef HAS_SENSORS_SENSOR_PART + if (IsProximityClose()) { + POWER_HILOGI(FEATURE_POWER_STATE, + "Double-click or pickup isn't allowed to wakeup device when proximity is close."); + return false; + } +#endif +#ifdef MSDP_MOVEMENT_ENABLE + if (IsMovementStateOn()) { + POWER_HILOGI(FEATURE_POWER_STATE, + "Double-click or pickup isn't allowed to wakeup device when movement state is on."); + return false; + } #endif + } + bool isAllowed = (!allowMapByReason_.count(reason) || (allowMapByReason_[reason].count(currentState_) && allowMapByReason_[reason][currentState_].count(to))); return isAllowed; diff --git a/test/unittest/src/power_mgr_service_native_test.cpp b/test/unittest/src/power_mgr_service_native_test.cpp index bf80d38cc89e59bd9872c0eff53a5c2d388039c8..230e9df52d4ccd17c0d2de561488408a8e8ecc03 100644 --- a/test/unittest/src/power_mgr_service_native_test.cpp +++ b/test/unittest/src/power_mgr_service_native_test.cpp @@ -282,4 +282,23 @@ HWTEST_F(PowerMgrServiceNativeTest, PowerMgrServiceNative011, TestSize.Level0) POWER_HILOGI(LABEL_TEST, "PowerMgrServiceNative011 end."); } +#ifdef MSDP_MOVEMENT_ENABLE +/** + * @tc.name: PowerMgrServiceNative012 + * @tc.desc: test RegisterMovementCallback + * @tc.type: FUNC + */ +HWTEST_F(PowerMgrServiceNativeTest, PowerMgrServiceNative012, TestSize.Level0) +{ + POWER_HILOGI(LABEL_TEST, "PowerMgrServiceNative012 begin."); + auto stateMachine = std::make_shared(g_pmsTest); + g_pmsTest->RegisterMovementCallback(); + g_pmsTest->UnRegisterMovementCallback(); + g_pmsTest->ResetMovementState(); + bool ret = stateMachine->GetMovementState(); + EXPECT_TRUE(ret == false); + POWER_HILOGI(LABEL_TEST, "PowerMgrServiceNative012 end."); +} +#endif + } // namespace