From d9b6d406fd2716670fc5f85b5d42209ef70dc2b8 Mon Sep 17 00:00:00 2001 From: chenjunwu Date: Wed, 21 May 2025 19:39:30 +0800 Subject: [PATCH] fix: add during call feature Signed-off-by: chenjunwu --- services/native/include/power_mgr_service.h | 2 ++ services/native/include/power_state_machine.h | 6 ++++ services/native/src/power_mgr_service.cpp | 15 ++++++++ services/native/src/power_state_machine.cpp | 18 ++++++++++ .../native/src/setting/setting_helper.cpp | 34 +++++++++++++++++++ services/native/src/setting/setting_helper.h | 5 +++ 6 files changed, 80 insertions(+) diff --git a/services/native/include/power_mgr_service.h b/services/native/include/power_mgr_service.h index 0741f57d..f091a583 100644 --- a/services/native/include/power_mgr_service.h +++ b/services/native/include/power_mgr_service.h @@ -67,6 +67,8 @@ public: static void PowerModeSettingUpdateFunc(const std::string& key); static void RegisterSettingWakeUpLidObserver(); static void WakeupLidSettingUpdateFunc(const std::string& key); + static void RegisterSettingDuringCallObservers(); + static void DuringCallSettingUpdateFunc(const std::string& key); virtual void OnStart() override; virtual void OnStop() override; diff --git a/services/native/include/power_state_machine.h b/services/native/include/power_state_machine.h index 65678146..a385ef93 100644 --- a/services/native/include/power_state_machine.h +++ b/services/native/include/power_state_machine.h @@ -214,6 +214,10 @@ public: { return mDeviceState_.screenState.lastOnTime; } + void SetDuringCallState(bool state) + { + isDuringCallState_ = state; + } void DumpInfo(std::string& result); void EnableMock(IDeviceStateAction* mockAction); @@ -353,6 +357,7 @@ private: void ShowCurrentScreenLocks(); void HandleProximityScreenOffTimer(PowerState state, StateChangeReason reason); bool HandlePreBrightState(PowerState targetState, StateChangeReason reason); + bool HandleDuringCallState(PowerState state); bool IsPreBrightAuthReason(StateChangeReason reason); bool IsPreBrightWakeUp(WakeupDeviceType type); bool NeedShowScreenLocks(PowerState state); @@ -410,6 +415,7 @@ private: std::atomic externalScreenNumber_ {0}; #endif ProximityNormalController proximityNormalController_; + bool isDuringCallState_ {false}; bool SetDreamingState(StateChangeReason reason); }; } // namespace PowerMgr diff --git a/services/native/src/power_mgr_service.cpp b/services/native/src/power_mgr_service.cpp index 2935287b..7ba599ce 100644 --- a/services/native/src/power_mgr_service.cpp +++ b/services/native/src/power_mgr_service.cpp @@ -242,6 +242,7 @@ void PowerMgrService::PowerExternalAbilityInit() POWER_HILOGI(COMP_SVC, "Not allow subscribe Hall sensor"); #endif power->RegisterSettingPowerModeObservers(); + power->RegisterSettingDuringCallObservers(); power->RegisterExternalCallback(); } @@ -263,6 +264,20 @@ void PowerMgrService::PowerModeSettingUpdateFunc(const std::string &key) power->SetDeviceMode(static_cast(saveMode)); } +void PowerMgrService::RegisterSettingDuringCallObservers() +{ + SettingObserver::UpdateFunc updateFunc = [&](const std::string &key) { DuringCallSettingUpdateFunc(key); }; + SettingHelper::RegisterSettingDuringCallObserver(updateFunc); +} + +void PowerMgrService::DuringCallSettingUpdateFunc(const std::string &key) +{ + auto power = DelayedSpSingleton::GetInstance(); + bool duringCallState = SettingHelper::GetDuringCallState(key); + POWER_HILOGI(COMP_SVC, "DuringCallState is %{public}d", duringCallState); + powerStateMachine_->SetDuringCallState(duringCallState); +} + bool PowerMgrService::IsDeveloperMode() { return OHOS::system::GetBoolParameter("const.security.developermode.state", true); diff --git a/services/native/src/power_state_machine.cpp b/services/native/src/power_state_machine.cpp index 4cf06fb9..2438bd8d 100644 --- a/services/native/src/power_state_machine.cpp +++ b/services/native/src/power_state_machine.cpp @@ -1935,6 +1935,11 @@ bool PowerStateMachine::SetState(PowerState state, StateChangeReason reason, boo POWER_HILOGD(FEATURE_POWER_STATE, "state=%{public}s, reason=%{public}s, force=%{public}d", PowerUtils::GetPowerStateString(state).c_str(), PowerUtils::GetReasonTypeString(reason).c_str(), force); std::lock_guard lock(stateMutex_); + if (HandleDuringCallState(state)) { + POWER_HILOGI(FEATURE_POWER_STATE, "During call action trigger, state=%{public}s", + PowerUtils::GetPowerStateString(state).c_str()); + return true; + } if (!CheckFFRTTaskAvailability(state, reason)) { POWER_HILOGI(FEATURE_POWER_STATE, "this timeout task is invalidated, directly return"); return false; @@ -2475,6 +2480,19 @@ bool PowerStateMachine::StateController::IsReallyFailed(StateChangeReason reason return true; } +bool PowerStateMachine::HandleDuringCallState(PowerState state) +{ + if (isDuringCallState_) { + if (state == PowerState::AWAKE) { + Rosen::DisplayManagerLite::GetInstance().SetFoldDisplayMode(Rosen::FoldDisplayMode::Main); + } else if (state == PowerState::INACTIVE) { + Rosen::DisplayManagerLite::GetInstance().SetFoldDisplayMode(Rosen::FoldDisplayMode::SUB); + } + return true; + } + return false; +} + bool PowerStateMachine::IsSwitchOpenByPath() { std::string value = ""; diff --git a/services/native/src/setting/setting_helper.cpp b/services/native/src/setting/setting_helper.cpp index 91cf0588..aaa91e0b 100644 --- a/services/native/src/setting/setting_helper.cpp +++ b/services/native/src/setting/setting_helper.cpp @@ -32,6 +32,7 @@ sptr SettingHelper::doubleClickObserver_ = nullptr; sptr SettingHelper::pickUpObserver_ = nullptr; sptr SettingHelper::powerModeObserver_ = nullptr; sptr SettingHelper::lidObserver_ = nullptr; +sptr SettingHelper::duringCallObserver_ = nullptr void SettingHelper::RegisterAodSwitchObserver() { @@ -542,6 +543,39 @@ void SettingHelper::UnRegisterSettingPowerModeObserver() powerModeObserver_ = nullptr; } +void SettingHelper::RegisterSettingDuringCallObservers(SettingObserver::UpdateFunc& func) +{ + if (duringCallObserver_) { + POWER_HILOGI(COMP_UTILS, "setting during call observer is already registered"); + return; + } + duringCallObserver_ = RegisterSettingKeyObserver(SETTING_DURING_CALL_STATE_KEY, func); +} + +void SettingHelper::UnRegisterSettingDuringCallObserver() +{ + if (!duringCallObserver_) { + POWER_HILOGI(COMP_UTILS, "duringCallObserver_ is nullptr, no need to unregister"); + return; + } + auto ret = SettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID).UnregisterObserver(duringCallObserver_); + if (ret != ERR_OK) { + POWER_HILOGE(COMP_UTILS, "unregister setting during call observer failed, ret=%{public}d", ret); + } + duringCallObserver_ = nullptr; +} + +bool GetDuringCallState(const std::string& key) +{ + SettingProvider& settingProvider = SettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID); + bool value = false; + ErrCode ret = settingProvider.GetBoolValue(key, value); + if (ret != ERR_OK) { + POWER_HILOGE(COMP_UTILS, "get setting during call state key failed, ret=%{public}d", ret); + } + return value; +} + const std::string SettingHelper::ReadPowerModeRecoverMap() { return GetSettingStringValue(SETTING_POWER_MODE_BACKUP_KEY); diff --git a/services/native/src/setting/setting_helper.h b/services/native/src/setting/setting_helper.h index 8673df65..872f68d5 100644 --- a/services/native/src/setting/setting_helper.h +++ b/services/native/src/setting/setting_helper.h @@ -107,6 +107,9 @@ public: static bool GetSettingWakeupLid(const std::string& key = SETTING_POWER_WAKEUP_LID_KEY); static void SetSettingWakeupLid(bool enable); static bool IsWakeupLidSettingValid(); + static void RegisterSettingDuringCallObservers(SettingObserver::UpdateFunc& func); + static void UnRegisterSettingDuringCallObserver(); + static bool GetDuringCallState(const std::string& key = SETTING_DURING_CALL_STATE_KEY); #ifdef POWER_MANAGER_ENABLE_BLOCK_LONG_PRESS static const std::string GetBlockLongPress(); #endif @@ -147,10 +150,12 @@ private: static constexpr const char* SETTING_POWER_MODE_KEY {"settings.power.smart_mode_status"}; static constexpr const char* SETTING_POWER_MODE_BACKUP_KEY {"settings.power.smart_mode_status.backup"}; static constexpr const char* SETTING_POWER_WAKEUP_LID_KEY {"settings.power.wakeup_lid"}; + static constexpr const char* SETTING_DURING_CALL_STATE_KEY {"during_call_state"}; static sptr doubleClickObserver_; static sptr pickUpObserver_; static sptr powerModeObserver_; static sptr lidObserver_; + static sptr powerModeObserver_; }; } // namespace PowerMgr } // namespace OHOS -- Gitee