diff --git a/services/native/include/power_mgr_service.h b/services/native/include/power_mgr_service.h index 0741f57d33f22ef0d39160d81a186be76f7defde..f091a58371cc815114eefdf8d64ab4e8d3028f0e 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 656781464f11ed797eafc78b1dc5285d8d6d0e1a..a385ef931350402144fdc1822322da9abdcb241b 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 2935287b42e9fec9cdd235a01b5b7b8785266535..7ba599ceaa4701bdea66d8163d3993813c579a66 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 4cf06fb96d2931ae1cf57dc0113aa1449739cfe8..2438bd8d00b99ab25efaecbff0e2ff2ca73a2a59 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 91cf0588527bcd3c3039b8d371ae83e9b8012034..aaa91e0bcf2f0639e18d5dd53244ac3888a0c551 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 8673df65e3fa69ce7177c8bd3c29dd1ec1ad7431..872f68d5843604df6e5ae3ff59f14c3e6ce7dfc0 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