diff --git a/interfaces/inner_api/native/include/power_state_machine_info.h b/interfaces/inner_api/native/include/power_state_machine_info.h index 00924d3fdc0ec143be59777dd2f7d91008a43666..294b466615c0b0fdc0aca3d76eb0a67006c7963e 100644 --- a/interfaces/inner_api/native/include/power_state_machine_info.h +++ b/interfaces/inner_api/native/include/power_state_machine_info.h @@ -167,6 +167,7 @@ enum class WakeupDeviceType : uint32_t { WAKEUP_DEVICE_PLUG_CHANGE = 31, WAKEUP_DEVICE_TENT_MODE_CHANGE = 32, WAKEUP_DEVICE_END_DREAM = 33, + WAKEUP_DEVICE_BLUETOOTH_INCOMING_CALL = 34, WAKEUP_DEVICE_MAX }; @@ -246,6 +247,7 @@ enum class StateChangeReason : uint32_t { STATE_CHANGE_REASON_TENT_MODE = 49, STATE_CHANGE_REASON_START_DREAM = 50, STATE_CHANGE_REASON_END_DREAM = 51, + STATE_CHANGE_REASON_BLUETOOTH_INCOMING_CALL = 52, STATE_CHANGE_REASON_REMOTE = 100, STATE_CHANGE_REASON_TIMEOUT_NO_SCREEN_LOCK = 101, STATE_CHANGE_REASON_EXIT_SYSTEM_STR = 102, diff --git a/services/native/src/power_state_machine.cpp b/services/native/src/power_state_machine.cpp index c09fb3b9ef2865782739995601f333275207c5b7..63716f0491e38a8d9d353978779bbd4de2ddf240 100644 --- a/services/native/src/power_state_machine.cpp +++ b/services/native/src/power_state_machine.cpp @@ -70,6 +70,18 @@ std::atomic_bool g_prepareResult = true; pid_t g_callSetForceTimingOutPid = 0; pid_t g_callSetForceTimingOutUid = 0; const std::string LID_STATUS_SCENE_NAME = "lid_status"; +#ifdef POWER_MANAGER_ENABLE_WATCH_CUSTOMIZED_SCREEN_COMMON_EVENT_RULES +const std::vector WATCH_CUSTOMIZED_STATE_CHANGE_REASONS{ + StateChangeReason::STATE_CHANGE_REASON_PICKUP, + StateChangeReason::STATE_CHANGE_REASON_INCOMING_CALL, + StateChangeReason::STATE_CHANGE_REASON_BLUETOOTH_INCOMING_CALL +}; +const std::vector WATCH_CUSTOMIZED_WAKEUP_DEVICE_TYPES{ + WakeupDeviceType::WAKEUP_DEVICE_PICKUP, + WakeupDeviceType::WAKEUP_DEVICE_INCOMING_CALL, + WakeupDeviceType::WAKEUP_DEVICE_BLUETOOTH_INCOMING_CALL +}; +#endif } PowerStateMachine::PowerStateMachine(const wptr& pms, const std::shared_ptr& ffrtTimer) : pms_(pms), ffrtTimer_(ffrtTimer), currentState_(PowerState::UNKNOWN) @@ -656,8 +668,12 @@ void PowerStateMachine::WakeupDeviceInner( // Call legacy wakeup, Check the screen state auto pms = DelayedSpSingleton::GetInstance(); #ifdef POWER_MANAGER_ENABLE_WATCH_CUSTOMIZED_SCREEN_COMMON_EVENT_RULES - if (!pms->IsScreenOn() && GetReasonByWakeType(type) == StateChangeReason::STATE_CHANGE_REASON_PICKUP) { - DelayedSingleton::GetInstance()->SetScreenOnEventRules(GetReasonByWakeType(type)); + if (!pms->IsScreenOn() && !WATCH_CUSTOMIZED_STATE_CHANGE_REASONS.empty() && + std::find(WATCH_CUSTOMIZED_STATE_CHANGE_REASONS.begin(), + WATCH_CUSTOMIZED_STATE_CHANGE_REASONS.end(), + GetReasonByWakeType(type)) != WATCH_CUSTOMIZED_STATE_CHANGE_REASONS.end()) { + DelayedSingleton::GetInstance()->SetScreenOnEventRules( + GetReasonByWakeType(type), WATCH_CUSTOMIZED_STATE_CHANGE_REASONS, WATCH_CUSTOMIZED_WAKEUP_DEVICE_TYPES); } #endif @@ -2156,6 +2172,9 @@ StateChangeReason PowerStateMachine::GetReasonByWakeType(WakeupDeviceType type) case WakeupDeviceType::WAKEUP_DEVICE_END_DREAM: ret = StateChangeReason::STATE_CHANGE_REASON_END_DREAM; break; + case WakeupDeviceType::WAKEUP_DEVICE_BLUETOOTH_INCOMING_CALL: + ret = StateChangeReason::STATE_CHANGE_REASON_BLUETOOTH_INCOMING_CALL; + break; case WakeupDeviceType::WAKEUP_DEVICE_UNKNOWN: // fall through default: break; diff --git a/services/native/src/watch_customized_screen_common_event/customized_screen_event_rules.cpp b/services/native/src/watch_customized_screen_common_event/customized_screen_event_rules.cpp index 15b28b767cee35f86f2e831154c520bc3e8827da..d90b9507c9a5190d4ddd4209a5c08c64e21d09e8 100644 --- a/services/native/src/watch_customized_screen_common_event/customized_screen_event_rules.cpp +++ b/services/native/src/watch_customized_screen_common_event/customized_screen_event_rules.cpp @@ -24,7 +24,7 @@ namespace PowerMgr { #ifdef POWER_MANAGER_ENABLE_WATCH_CUSTOMIZED_SCREEN_COMMON_EVENT_RULES static std::vector bundleNames{}; static StateChangeReason defaultReason = StateChangeReason::STATE_CHANGE_REASON_POWER_KEY; - +static std::vector g_watchCurrentScreenStateChangeReason; std::vector CustomizedScreenEventRules::GetForegroundBundleNames() { @@ -42,15 +42,20 @@ std::vector CustomizedScreenEventRules::GetForegroundBundleNames() return bundleNames; } -void CustomizedScreenEventRules::SetScreenOnEventRules(StateChangeReason reason) +void CustomizedScreenEventRules::SetScreenOnEventRules(StateChangeReason reason, + const std::vector &stateChangeReason, const std::vector &wakeupDeviceTypes) { defaultReason = reason; - PowerExtIntfWrapper::Instance().SetScreenOnEventRules(reason); + g_watchCurrentScreenStateChangeReason = stateChangeReason; + PowerExtIntfWrapper::Instance().SetScreenOnEventRules(reason, stateChangeReason, wakeupDeviceTypes); } void CustomizedScreenEventRules::PublishCustomizedScreenEvent(PowerState state) { - if (defaultReason == StateChangeReason::STATE_CHANGE_REASON_PICKUP) { + if (!g_watchCurrentScreenStateChangeReason.empty() && + std::find(g_watchCurrentScreenStateChangeReason.begin(), + g_watchCurrentScreenStateChangeReason.end(), + defaultReason) != g_watchCurrentScreenStateChangeReason.end()) { PowerExtIntfWrapper::Instance().PublishCustomizedScreenEvent(state, GetForegroundBundleNames()); } else { PowerExtIntfWrapper::Instance().PublishCustomizedScreenEvent(state, bundleNames); diff --git a/services/native/src/watch_customized_screen_common_event/customized_screen_event_rules.h b/services/native/src/watch_customized_screen_common_event/customized_screen_event_rules.h index 19185e941dff9ed27a8d2cba392960182e38eb95..f7b9349f3b072abad624f59cf78dab0048eb5e1f 100644 --- a/services/native/src/watch_customized_screen_common_event/customized_screen_event_rules.h +++ b/services/native/src/watch_customized_screen_common_event/customized_screen_event_rules.h @@ -34,7 +34,8 @@ class CustomizedScreenEventRules : public DelayedSingleton &stateChangeReason, + const std::vector &wakeupDeviceTypes); static void PublishCustomizedScreenEvent(PowerState state); static bool NotifyScreenOnEventAgain(WakeupDeviceType reason); static void NotifyOperateEventAfterScreenOn(); diff --git a/test/unittest/src/interface_test/power_mgr_service_test.cpp b/test/unittest/src/interface_test/power_mgr_service_test.cpp index d7f38306857afb1d9cf7b4806424de67ed49d5ba..3a4ba47c9b9c7de817615d91631b617854cd502f 100644 --- a/test/unittest/src/interface_test/power_mgr_service_test.cpp +++ b/test/unittest/src/interface_test/power_mgr_service_test.cpp @@ -631,6 +631,10 @@ HWTEST_F(PowerMgrServiceTest, PowerMgrService025, TestSize.Level2) StateChangeReason::STATE_CHANGE_REASON_INCOMING_CALL); EXPECT_EQ(stateMaschine_->GetReasonByWakeType(WakeupDeviceType::WAKEUP_DEVICE_SHELL), StateChangeReason::STATE_CHANGE_REASON_SHELL); + EXPECT_EQ(stateMaschine_->GetReasonByWakeType(WakeupDeviceType::WAKEUP_DEVICE_BLUETOOTH_INCOMING_CALL), + StateChangeReason::STATE_CHANGE_REASON_BLUETOOTH_INCOMING_CALL); + EXPECT_EQ(stateMaschine_->GetReasonByWakeType(WakeupDeviceType::WAKEUP_DEVICE_PICKUP), + StateChangeReason::STATE_CHANGE_REASON_PICKUP); pmsTest_->OnStop(); POWER_HILOGI(LABEL_TEST, "PowerMgrServiceTest::PowerMgrService025 function end!"); } @@ -657,6 +661,8 @@ HWTEST_F(PowerMgrServiceTest, PowerMgrService026, TestSize.Level2) WakeupDeviceType::WAKEUP_DEVICE_PRE_BRIGHT_AUTH_FAIL_SCREEN_ON); EXPECT_EQ(PowerUtils::ParseWakeupDeviceType("pre_bright_auth_fail_screen_off"), WakeupDeviceType::WAKEUP_DEVICE_PRE_BRIGHT_AUTH_FAIL_SCREEN_OFF); + EXPECT_EQ(PowerUtils::ParseWakeupDeviceType("wake up screen:receive bluetooth call"), + WakeupDeviceType::WAKEUP_DEVICE_BLUETOOTH_INCOMING_CALL); pmsTest_->OnStop(); POWER_HILOGI(LABEL_TEST, "PowerMgrServiceTest::PowerMgrService026 function end!"); diff --git a/test/unittest/src/native_power_state_machine_test.cpp b/test/unittest/src/native_power_state_machine_test.cpp index 0ed16e718f48288da658f9323f988af65814ce0f..452b36cdb47a549653d8aec7105e4c148531529e 100644 --- a/test/unittest/src/native_power_state_machine_test.cpp +++ b/test/unittest/src/native_power_state_machine_test.cpp @@ -233,6 +233,10 @@ HWTEST_F(NativePowerStateMachineTest, NativePowerStateMachine004, TestSize.Level stateMachine->WakeupDeviceInner(PID, CALLTIMEMS, type, "7", "7"); type = WakeupDeviceType::WAKEUP_DEVICE_MOUSE; stateMachine->WakeupDeviceInner(PID, CALLTIMEMS, type, "7", "7"); + type = WakeupDeviceType::WAKEUP_DEVICE_BLUETOOTH_INCOMING_CALL; + stateMachine->WakeupDeviceInner(PID, CALLTIMEMS, type, "7", "7"); + type = WakeupDeviceType::WAKEUP_DEVICE_PICKUP; + stateMachine->WakeupDeviceInner(PID, CALLTIMEMS, type, "7", "7"); type = WakeupDeviceType::WAKEUP_DEVICE_UNKNOWN; stateMachine->WakeupDeviceInner(PID, CALLTIMEMS, type, "7", "7"); stateMachine->WakeupDeviceInner(PID, CALLTIMEMS, static_cast(MAXTYPE), "7", "7"); diff --git a/test/unittest/src/power_ext_intf_wrapper_test.cpp b/test/unittest/src/power_ext_intf_wrapper_test.cpp index 3037bf6cbfb055040109637c6eb5fad4ba1a68a8..e5fa1361f89d26924a88764530bb0ad6b5b069a0 100644 --- a/test/unittest/src/power_ext_intf_wrapper_test.cpp +++ b/test/unittest/src/power_ext_intf_wrapper_test.cpp @@ -16,6 +16,9 @@ #include "power_ext_intf_wrapper_test.h" #include "power_ext_intf_wrapper.h" #include "power_log.h" +#ifdef POWER_MANAGER_ENABLE_WATCH_CUSTOMIZED_SCREEN_COMMON_EVENT_RULES +#include "power_state_machine_info.h" +#endif namespace OHOS { namespace PowerMgr { @@ -68,5 +71,28 @@ HWTEST_F(PowerExtIntfWrapperTest, BlockHibernateUntilScrLckReadyTest, TestSize.L EXPECT_TRUE(code == PowerExtIntfWrapper::ErrCode::ERR_NOT_FOUND || code == PowerExtIntfWrapper::ErrCode::ERR_OK); POWER_HILOGI(LABEL_TEST, "BlockHibernateUntilScrLckReadyTest function end!"); } + +/** + * @tc.name: SetScreenOnEventRulesTest + * @tc.desc: test SetScreenOnEventRules + * @tc.type: FUNC + */ +#ifdef POWER_MANAGER_ENABLE_WATCH_CUSTOMIZED_SCREEN_COMMON_EVENT_RULES +HWTEST_F(PowerExtIntfWrapperTest, SetScreenOnEventRulesTest, TestSize.Level0) +{ + POWER_HILOGI(LABEL_TEST, "SetScreenOnEventRulesTest function start!"); + StateChangeReason reason = StateChangeReason::STATE_CHANGE_REASON_PICKUP; + std::vector WATCH_CUSTOMIZED_STATE_CHANGE_REASONS{StateChangeReason::STATE_CHANGE_REASON_PICKUP, + StateChangeReason::STATE_CHANGE_REASON_INCOMING_CALL, + StateChangeReason::STATE_CHANGE_REASON_BLUETOOTH_INCOMING_CALL}; + std::vector WATCH_CUSTOMIZED_WAKEUP_DEVICE_TYPES{WakeupDeviceType::WAKEUP_DEVICE_PICKUP, + WakeupDeviceType::WAKEUP_DEVICE_INCOMING_CALL, + WakeupDeviceType::WAKEUP_DEVICE_BLUETOOTH_INCOMING_CALL}; + PowerExtIntfWrapper::ErrCode code = PowerExtIntfWrapper::Instance().SetScreenOnEventRules( + reason, WATCH_CUSTOMIZED_STATE_CHANGE_REASONS, WATCH_CUSTOMIZED_WAKEUP_DEVICE_TYPES); + EXPECT_TRUE(code == PowerExtIntfWrapper::ErrCode::ERR_NOT_FOUND || code == PowerExtIntfWrapper::ErrCode::ERR_OK); + POWER_HILOGI(LABEL_TEST, "SetScreenOnEventRulesTest function end!"); +} +#endif } // PowerMgr } // OHOS \ No newline at end of file diff --git a/utils/intf_wrapper/include/power_ext_intf_wrapper.h b/utils/intf_wrapper/include/power_ext_intf_wrapper.h index d2e6c3ba34c626799d19b6eeb9af1c2fb592ca34..a1629daf146831aeb6a836d5cefcdd4ae730c597 100644 --- a/utils/intf_wrapper/include/power_ext_intf_wrapper.h +++ b/utils/intf_wrapper/include/power_ext_intf_wrapper.h @@ -54,7 +54,8 @@ public: ErrCode BlockHibernateUntilScrLckReady() const; void OnHibernateEnd(bool hibernateResult); #ifdef POWER_MANAGER_ENABLE_WATCH_CUSTOMIZED_SCREEN_COMMON_EVENT_RULES - void SetScreenOnEventRules(StateChangeReason reason); + ErrCode SetScreenOnEventRules(StateChangeReason reason, const std::vector &stateChangeReason, + const std::vector &wakeupDeviceTypes); void PublishCustomizedScreenEvent(PowerState state, std::vector bundleNames); bool NotifyScreenOnEventAgain(WakeupDeviceType reason, std::vector bundleNames); void NotifyOperateEventAfterScreenOn(std::vector bundleNames); diff --git a/utils/intf_wrapper/src/power_ext_intf_wrapper.cpp b/utils/intf_wrapper/src/power_ext_intf_wrapper.cpp index e7b0b0612ce0bc2537b94456d67a7d0868afc48a..75165d2befdc3aa1c0986618d278df2b1c71abdf 100644 --- a/utils/intf_wrapper/src/power_ext_intf_wrapper.cpp +++ b/utils/intf_wrapper/src/power_ext_intf_wrapper.cpp @@ -102,14 +102,16 @@ void PowerExtIntfWrapper::OnHibernateEnd(bool hibernateResult) } #ifdef POWER_MANAGER_ENABLE_WATCH_CUSTOMIZED_SCREEN_COMMON_EVENT_RULES -void PowerExtIntfWrapper::SetScreenOnEventRules(StateChangeReason reason) +PowerExtIntfWrapper::ErrCode PowerExtIntfWrapper::SetScreenOnEventRules(StateChangeReason reason, + const std::vector &stateChangeReason, const std::vector &wakeupDeviceTypes) { void *funcPtr = intfLoader_.QueryInterface("SetScreenOnEventRules"); if (funcPtr == nullptr) { - return; + return PowerExtIntfWrapper::ErrCode::ERR_NOT_FOUND; } - auto setScreenOnEventRulesFunc = reinterpret_cast(funcPtr); - setScreenOnEventRulesFunc(reason); + auto setScreenOnEventRulesFunc = reinterpret_cast &, const std::vector &)>(funcPtr); + setScreenOnEventRulesFunc(reason, stateChangeReason, wakeupDeviceTypes); } void PowerExtIntfWrapper::PublishCustomizedScreenEvent(PowerState state, std::vector bundleNames) diff --git a/utils/native/src/power_utils.cpp b/utils/native/src/power_utils.cpp index 1d0cb916643020e06284b7d0bc0bfc5aeb7286f5..b80b5ac6750f416b176e6d2f4e52e25c0ade1678 100644 --- a/utils/native/src/power_utils.cpp +++ b/utils/native/src/power_utils.cpp @@ -111,6 +111,8 @@ const std::string PowerUtils::GetReasonTypeString(StateChangeReason type) return std::string("ROLLBACK_HIBERNATE"); case StateChangeReason::STATE_CHANGE_REASON_PLUG_CHANGE: return std::string("PLUG_CHANGE"); + case StateChangeReason::STATE_CHANGE_REASON_BLUETOOTH_INCOMING_CALL: + return std::string("BLUETOOTH_INCOMING_CALL"); case StateChangeReason::STATE_CHANGE_REASON_UNKNOWN: return std::string("UNKNOWN"); default: @@ -302,6 +304,8 @@ WakeupDeviceType PowerUtils::ParseWakeupDeviceType(const std::string& details) parsedType = WakeupDeviceType::WAKEUP_DEVICE_SHELL; } else if (strcmp(details.c_str(), "end_dream") == 0) { parsedType = WakeupDeviceType::WAKEUP_DEVICE_END_DREAM; + } else if (strcmp(details.c_str(), "wake up screen:receive bluetooth call") == 0) { + parsedType = WakeupDeviceType::WAKEUP_DEVICE_BLUETOOTH_INCOMING_CALL; } if (parsedType != WakeupDeviceType::WAKEUP_DEVICE_APPLICATION) {