1595d5899Sopenharmony_ci/* 2595d5899Sopenharmony_ci * Copyright (c) 2023-2023 Huawei Device Co., Ltd. 3595d5899Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4595d5899Sopenharmony_ci * you may not use this file except in compliance with the License. 5595d5899Sopenharmony_ci * You may obtain a copy of the License at 6595d5899Sopenharmony_ci * 7595d5899Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8595d5899Sopenharmony_ci * 9595d5899Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10595d5899Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11595d5899Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12595d5899Sopenharmony_ci * See the License for the specific language governing permissions and 13595d5899Sopenharmony_ci * limitations under the License. 14595d5899Sopenharmony_ci */ 15595d5899Sopenharmony_ci 16595d5899Sopenharmony_ci#include "brightness_service.h" 17595d5899Sopenharmony_ci 18595d5899Sopenharmony_ci#include <file_ex.h> 19595d5899Sopenharmony_ci#ifdef HAS_HIVIEWDFX_HISYSEVENT_PART 20595d5899Sopenharmony_ci#include <hisysevent.h> 21595d5899Sopenharmony_ci#endif 22595d5899Sopenharmony_ci#include <ipc_skeleton.h> 23595d5899Sopenharmony_ci#include <securec.h> 24595d5899Sopenharmony_ci 25595d5899Sopenharmony_ci#include "brightness_action.h" 26595d5899Sopenharmony_ci#include "brightness_setting_helper.h" 27595d5899Sopenharmony_ci#include "config_parser.h" 28595d5899Sopenharmony_ci#include "delayed_sp_singleton.h" 29595d5899Sopenharmony_ci#include "display_common.h" 30595d5899Sopenharmony_ci#include "display_log.h" 31595d5899Sopenharmony_ci#include "display_manager_lite.h" 32595d5899Sopenharmony_ci#include "dm_common.h" 33595d5899Sopenharmony_ci#include "errors.h" 34595d5899Sopenharmony_ci#include "ffrt_utils.h" 35595d5899Sopenharmony_ci#include "light_lux_manager.h" 36595d5899Sopenharmony_ci#include "new" 37595d5899Sopenharmony_ci#include "permission.h" 38595d5899Sopenharmony_ci#include "refbase.h" 39595d5899Sopenharmony_ci#include "screen_manager_lite.h" 40595d5899Sopenharmony_ci#include "setting_provider.h" 41595d5899Sopenharmony_ci#include "system_ability_definition.h" 42595d5899Sopenharmony_ci 43595d5899Sopenharmony_ci#ifdef ENABLE_SENSOR_PART 44595d5899Sopenharmony_ci#include "sensor_agent.h" 45595d5899Sopenharmony_ci#endif 46595d5899Sopenharmony_ci 47595d5899Sopenharmony_cinamespace OHOS { 48595d5899Sopenharmony_cinamespace DisplayPowerMgr { 49595d5899Sopenharmony_cinamespace { 50595d5899Sopenharmony_ciconstexpr uint32_t MAX_DEFAULT_BRGIHTNESS_LEVEL = 255; 51595d5899Sopenharmony_ciconstexpr uint32_t MIN_DEFAULT_BRGIHTNESS_LEVEL = 1; 52595d5899Sopenharmony_ciconstexpr uint32_t MAX_MAPPING_BRGIHTNESS_LEVEL = 223; 53595d5899Sopenharmony_ciconstexpr uint32_t MIN_MAPPING_BRGIHTNESS_LEVEL = 1; 54595d5899Sopenharmony_ciconstexpr uint32_t MAX_DEFAULT_BRGIHTNESS_NIT = 600; 55595d5899Sopenharmony_ciconstexpr uint32_t MIN_DEFAULT_BRGIHTNESS_NIT = 2; 56595d5899Sopenharmony_ciconstexpr uint32_t MAX_DEFAULT_HIGH_BRGIHTNESS_LEVEL = 10000; 57595d5899Sopenharmony_ciconstexpr uint32_t MIN_DEFAULT_HIGH_BRGIHTNESS_LEVEL = 156; 58595d5899Sopenharmony_ciconstexpr uint32_t DEFAULT_ANIMATING_DURATION = 500; 59595d5899Sopenharmony_ciconstexpr uint32_t DEFAULT_BRIGHTEN_DURATION = 2000; 60595d5899Sopenharmony_ciconstexpr uint32_t DEFAULT_DARKEN_DURATION = 5000; 61595d5899Sopenharmony_ciconstexpr uint32_t DEFAULT_MAX_BRIGHTNESS_DURATION = 3000; 62595d5899Sopenharmony_ciconstexpr uint32_t BRIGHTNESS_TYPE = 0; 63595d5899Sopenharmony_ciconstexpr uint32_t AMBIENT_LIGHT_TYPE = 1; 64595d5899Sopenharmony_ciconstexpr uint32_t APS_LISTEN_PARAMS_LENGHT = 3; 65595d5899Sopenharmony_ciconstexpr time_t CALL_APS_INTERVAL = 2; 66595d5899Sopenharmony_ci 67595d5899Sopenharmony_ciFFRTHandle g_cancelBoostTaskHandle{}; 68595d5899Sopenharmony_ciFFRTHandle g_waitForFirstLuxTaskHandle{}; 69595d5899Sopenharmony_ci} 70595d5899Sopenharmony_ci 71595d5899Sopenharmony_ciconst uint32_t BrightnessService::AMBIENT_LUX_LEVELS[BrightnessService::LUX_LEVEL_LENGTH] = { 1, 3, 5, 10, 20, 50, 200, 72595d5899Sopenharmony_ci 500, 1000, 2000, 3000, 5000, 10000, 20000, 40000, 50000, 60000, 70000, 80000, 90000, 100000, INT_MAX }; 73595d5899Sopenharmony_ci 74595d5899Sopenharmony_ciusing namespace OHOS::PowerMgr; 75595d5899Sopenharmony_ci 76595d5899Sopenharmony_ciuint32_t BrightnessService::brightnessValueMax = MAX_DEFAULT_BRGIHTNESS_LEVEL; 77595d5899Sopenharmony_ciuint32_t BrightnessService::brightnessValueMin = MIN_DEFAULT_BRGIHTNESS_LEVEL; 78595d5899Sopenharmony_ci 79595d5899Sopenharmony_ciBrightnessService::BrightnessService() 80595d5899Sopenharmony_ci{ 81595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService created for displayId=%{public}d", mDisplayId); 82595d5899Sopenharmony_ci mAction = std::make_shared<BrightnessAction>(mDisplayId); 83595d5899Sopenharmony_ci if (mAction == nullptr) { 84595d5899Sopenharmony_ci DISPLAY_HILOGE(FEAT_BRIGHTNESS, "mAction is null"); 85595d5899Sopenharmony_ci return; 86595d5899Sopenharmony_ci } 87595d5899Sopenharmony_ci mState = mAction->GetDisplayState(); 88595d5899Sopenharmony_ci mDimmingCallback = std::make_shared<DimmingCallbackImpl>(mAction, [this](uint32_t brightness) { 89595d5899Sopenharmony_ci SetSettingBrightness(brightness); 90595d5899Sopenharmony_ci }); 91595d5899Sopenharmony_ci if (mDimmingCallback == nullptr) { 92595d5899Sopenharmony_ci DISPLAY_HILOGE(FEAT_BRIGHTNESS, "mDimmingCallback is null"); 93595d5899Sopenharmony_ci } 94595d5899Sopenharmony_ci std::string name = "BrightnessService" + std::to_string(mDisplayId); 95595d5899Sopenharmony_ci mDimming = std::make_shared<BrightnessDimming>(name, mDimmingCallback); 96595d5899Sopenharmony_ci} 97595d5899Sopenharmony_ci 98595d5899Sopenharmony_ciBrightnessService& BrightnessService::Get() 99595d5899Sopenharmony_ci{ 100595d5899Sopenharmony_ci static BrightnessService brightnessManager; 101595d5899Sopenharmony_ci return brightnessManager; 102595d5899Sopenharmony_ci} 103595d5899Sopenharmony_ci 104595d5899Sopenharmony_civoid BrightnessService::Init(uint32_t defaultMax, uint32_t defaultMin) 105595d5899Sopenharmony_ci{ 106595d5899Sopenharmony_ci queue_ = std::make_shared<FFRTQueue> ("brightness_manager"); 107595d5899Sopenharmony_ci if (queue_ == nullptr) { 108595d5899Sopenharmony_ci return; 109595d5899Sopenharmony_ci } 110595d5899Sopenharmony_ci if (!mDimming->Init()) { 111595d5899Sopenharmony_ci return; 112595d5899Sopenharmony_ci } 113595d5899Sopenharmony_ci#ifdef ENABLE_SENSOR_PART 114595d5899Sopenharmony_ci InitSensors(); 115595d5899Sopenharmony_ci mIsFoldDevice = Rosen::DisplayManagerLite::GetInstance().IsFoldable(); 116595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Init mIsFoldDevice=%{public}d", mIsFoldDevice); 117595d5899Sopenharmony_ci#endif 118595d5899Sopenharmony_ci ConfigParse::Get().Initialize(); 119595d5899Sopenharmony_ci mLightLuxManager.InitParameters(); 120595d5899Sopenharmony_ci mBrightnessCalculationManager.InitParameters(); 121595d5899Sopenharmony_ci 122595d5899Sopenharmony_ci bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable(); 123595d5899Sopenharmony_ci brightnessValueMax = defaultMax; 124595d5899Sopenharmony_ci brightnessValueMin = defaultMin; 125595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::init isFoldable=%{public}d, max=%{public}u, min=%{public}u", 126595d5899Sopenharmony_ci isFoldable, brightnessValueMax, brightnessValueMin); 127595d5899Sopenharmony_ci if (isFoldable) { 128595d5899Sopenharmony_ci RegisterFoldStatusListener(); 129595d5899Sopenharmony_ci } 130595d5899Sopenharmony_ci} 131595d5899Sopenharmony_ci 132595d5899Sopenharmony_civoid BrightnessService::DeInit() 133595d5899Sopenharmony_ci{ 134595d5899Sopenharmony_ci bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable(); 135595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::init isFoldable=%{public}d", isFoldable); 136595d5899Sopenharmony_ci if (isFoldable) { 137595d5899Sopenharmony_ci UnRegisterFoldStatusListener(); 138595d5899Sopenharmony_ci } 139595d5899Sopenharmony_ci if (queue_) { 140595d5899Sopenharmony_ci queue_.reset(); 141595d5899Sopenharmony_ci g_cancelBoostTaskHandle = nullptr; 142595d5899Sopenharmony_ci g_waitForFirstLuxTaskHandle = nullptr; 143595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "destruct brightness ffrt queue"); 144595d5899Sopenharmony_ci } 145595d5899Sopenharmony_ci 146595d5899Sopenharmony_ci mDimming->Reset(); 147595d5899Sopenharmony_ci} 148595d5899Sopenharmony_ci 149595d5899Sopenharmony_civoid BrightnessService::FoldStatusLisener::OnFoldStatusChanged(Rosen::FoldStatus foldStatus) 150595d5899Sopenharmony_ci{ 151595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnFoldStatusChanged currenFoldStatus=%{public}d", foldStatus); 152595d5899Sopenharmony_ci if (mLastFoldStatus == foldStatus) { 153595d5899Sopenharmony_ci DISPLAY_HILOGE(FEAT_BRIGHTNESS, "no need set foldStatus"); 154595d5899Sopenharmony_ci return; 155595d5899Sopenharmony_ci } 156595d5899Sopenharmony_ci bool isSensorEnable = BrightnessService::Get().GetIsSupportLightSensor(); 157595d5899Sopenharmony_ci bool isAutoEnable = BrightnessService::Get().GetSettingAutoBrightness(); 158595d5899Sopenharmony_ci bool isScreenOn = BrightnessService::Get().IsScreenOn(); 159595d5899Sopenharmony_ci int displayId = BrightnessService::Get().GetDisplayIdWithFoldstatus(foldStatus); 160595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnFoldStatusChanged isSensorEnable=%{public}d, isAutoEnable=%{public}d"\ 161595d5899Sopenharmony_ci ", isScreenOn=%{public}d, displayid=%{public}d", isSensorEnable, isAutoEnable, isScreenOn, displayId); 162595d5899Sopenharmony_ci uint32_t currentBrightness = BrightnessService::Get().GetBrightness(); 163595d5899Sopenharmony_ci BrightnessService::Get().SetDisplayId(displayId); 164595d5899Sopenharmony_ci 165595d5899Sopenharmony_ci if (Rosen::FoldStatus::FOLDED == foldStatus || Rosen::FoldStatus::EXPAND == foldStatus) { 166595d5899Sopenharmony_ci int sensorId = BrightnessService::Get().GetSensorIdWithFoldstatus(foldStatus); 167595d5899Sopenharmony_ci BrightnessService::Get().SetCurrentSensorId(static_cast<uint32_t>(sensorId)); 168595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnFoldStatusChanged sensorid=%{public}d", sensorId); 169595d5899Sopenharmony_ci if (isSensorEnable && isAutoEnable && isScreenOn) { 170595d5899Sopenharmony_ci if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT) { 171595d5899Sopenharmony_ci BrightnessService::Get().ActivateAmbientSensor(); 172595d5899Sopenharmony_ci } else if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) { 173595d5899Sopenharmony_ci BrightnessService::Get().ActivateAmbientSensor1(); 174595d5899Sopenharmony_ci } 175595d5899Sopenharmony_ci } 176595d5899Sopenharmony_ci } else if (Rosen::FoldStatus::HALF_FOLD == foldStatus) { 177595d5899Sopenharmony_ci uint32_t currentEffectSensorId = BrightnessService::Get().GetCurrentSensorId(); 178595d5899Sopenharmony_ci if (isSensorEnable && isAutoEnable && isScreenOn) { 179595d5899Sopenharmony_ci if (currentEffectSensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT) { 180595d5899Sopenharmony_ci BrightnessService::Get().DeactivateAmbientSensor(); 181595d5899Sopenharmony_ci } else if (currentEffectSensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) { 182595d5899Sopenharmony_ci BrightnessService::Get().DeactivateAmbientSensor1(); 183595d5899Sopenharmony_ci } 184595d5899Sopenharmony_ci } 185595d5899Sopenharmony_ci } 186595d5899Sopenharmony_ci 187595d5899Sopenharmony_ci if (BrightnessService::Get().CanSetBrightness()) { 188595d5899Sopenharmony_ci BrightnessService::Get().UpdateBrightness(currentBrightness, 0, true); 189595d5899Sopenharmony_ci } 190595d5899Sopenharmony_ci mLastFoldStatus = foldStatus; 191595d5899Sopenharmony_ci} 192595d5899Sopenharmony_ci 193595d5899Sopenharmony_civoid BrightnessService::RegisterFoldStatusListener() 194595d5899Sopenharmony_ci{ 195595d5899Sopenharmony_ci mFoldStatusistener = new FoldStatusLisener(); 196595d5899Sopenharmony_ci if (mFoldStatusistener == nullptr) { 197595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::RegisterDisplayModeListener newListener failed"); 198595d5899Sopenharmony_ci return; 199595d5899Sopenharmony_ci } 200595d5899Sopenharmony_ci auto ret = Rosen::DisplayManagerLite::GetInstance().RegisterFoldStatusListener(mFoldStatusistener); 201595d5899Sopenharmony_ci if (ret != Rosen::DMError::DM_OK) { 202595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Rosen::DisplayManagerLite::RegisterDisplayModeListener failed"); 203595d5899Sopenharmony_ci mFoldStatusistener = nullptr; 204595d5899Sopenharmony_ci } else { 205595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::RegisterDisplayModeListener success"); 206595d5899Sopenharmony_ci } 207595d5899Sopenharmony_ci} 208595d5899Sopenharmony_ci 209595d5899Sopenharmony_civoid BrightnessService::UnRegisterFoldStatusListener() 210595d5899Sopenharmony_ci{ 211595d5899Sopenharmony_ci if (mFoldStatusistener == nullptr) { 212595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::UnRegistermFoldStatusistener listener is null"); 213595d5899Sopenharmony_ci return; 214595d5899Sopenharmony_ci } 215595d5899Sopenharmony_ci auto ret = Rosen::DisplayManagerLite::GetInstance().UnregisterFoldStatusListener(mFoldStatusistener); 216595d5899Sopenharmony_ci if (ret != Rosen::DMError::DM_OK) { 217595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::UnRegisterDisplayModeListener failed"); 218595d5899Sopenharmony_ci } 219595d5899Sopenharmony_ci} 220595d5899Sopenharmony_ci 221595d5899Sopenharmony_ciuint32_t BrightnessService::GetDisplayId() 222595d5899Sopenharmony_ci{ 223595d5899Sopenharmony_ci return mDisplayId; 224595d5899Sopenharmony_ci} 225595d5899Sopenharmony_ci 226595d5899Sopenharmony_civoid BrightnessService::NotifyLightChangeToAps(uint32_t type, float value) 227595d5899Sopenharmony_ci{ 228595d5899Sopenharmony_ci // Check whether APS callback interface exists 229595d5899Sopenharmony_ci if (!mApsListenLightChangeCallback) { 230595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "BrightnessService::NotifyLightChangeToAps function is null"); 231595d5899Sopenharmony_ci return; 232595d5899Sopenharmony_ci } 233595d5899Sopenharmony_ci 234595d5899Sopenharmony_ci // Check Whether APS is initialized 235595d5899Sopenharmony_ci if (mLightBrightnessThreshold.size() != APS_LISTEN_PARAMS_LENGHT) { 236595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "BrightnessService::NotifyLightChangeToAps not init yet"); 237595d5899Sopenharmony_ci return; 238595d5899Sopenharmony_ci } 239595d5899Sopenharmony_ci 240595d5899Sopenharmony_ci // brightness 241595d5899Sopenharmony_ci if (type == BRIGHTNESS_TYPE) { 242595d5899Sopenharmony_ci int32_t nitValue = static_cast<int32_t>(GetMappingBrightnessNit(static_cast<uint32_t>(value))); 243595d5899Sopenharmony_ci int32_t brightness = mLightBrightnessThreshold[0]; 244595d5899Sopenharmony_ci if (!mIsBrightnessValidate && nitValue >= brightness) { 245595d5899Sopenharmony_ci mIsBrightnessValidate = true; 246595d5899Sopenharmony_ci mApsListenLightChangeCallback->OnNotifyApsLightBrightnessChange(type, mIsBrightnessValidate); 247595d5899Sopenharmony_ci } else if (mIsBrightnessValidate && nitValue < brightness) { 248595d5899Sopenharmony_ci mIsBrightnessValidate = false; 249595d5899Sopenharmony_ci mApsListenLightChangeCallback->OnNotifyApsLightBrightnessChange(type, mIsBrightnessValidate); 250595d5899Sopenharmony_ci } 251595d5899Sopenharmony_ci return; 252595d5899Sopenharmony_ci } 253595d5899Sopenharmony_ci 254595d5899Sopenharmony_ci // amlient light 255595d5899Sopenharmony_ci if (type == AMBIENT_LIGHT_TYPE) { 256595d5899Sopenharmony_ci // Check the interval for invoking the APS interface 257595d5899Sopenharmony_ci time_t currentTime = time(0); 258595d5899Sopenharmony_ci if (currentTime - mLastCallApsTime < CALL_APS_INTERVAL) { 259595d5899Sopenharmony_ci DISPLAY_HILOGD( 260595d5899Sopenharmony_ci FEAT_BRIGHTNESS, "BrightnessService::NotifyLightChangeToAps interface is invoked frequently"); 261595d5899Sopenharmony_ci return; 262595d5899Sopenharmony_ci } 263595d5899Sopenharmony_ci mLastCallApsTime = currentTime; 264595d5899Sopenharmony_ci 265595d5899Sopenharmony_ci int32_t light = mLightBrightnessThreshold[1]; 266595d5899Sopenharmony_ci int32_t range = mLightBrightnessThreshold[2]; 267595d5899Sopenharmony_ci if (!mIsLightValidate && value >= light) { 268595d5899Sopenharmony_ci mIsLightValidate = true; 269595d5899Sopenharmony_ci mApsListenLightChangeCallback->OnNotifyApsLightBrightnessChange(type, mIsLightValidate); 270595d5899Sopenharmony_ci } else if (mIsLightValidate && value < (light - range)) { 271595d5899Sopenharmony_ci mIsLightValidate = false; 272595d5899Sopenharmony_ci mApsListenLightChangeCallback->OnNotifyApsLightBrightnessChange(type, mIsLightValidate); 273595d5899Sopenharmony_ci } 274595d5899Sopenharmony_ci } 275595d5899Sopenharmony_ci} 276595d5899Sopenharmony_ci 277595d5899Sopenharmony_ciuint32_t BrightnessService::GetCurrentDisplayId(uint32_t defaultId) 278595d5899Sopenharmony_ci{ 279595d5899Sopenharmony_ci uint32_t currentId = defaultId; 280595d5899Sopenharmony_ci bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable(); 281595d5899Sopenharmony_ci if (!isFoldable) { 282595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_STATE, "GetCurrentDisplayId not fold phone return default id=%{public}d", defaultId); 283595d5899Sopenharmony_ci return currentId; 284595d5899Sopenharmony_ci } 285595d5899Sopenharmony_ci std::string identity = IPCSkeleton::ResetCallingIdentity(); 286595d5899Sopenharmony_ci auto foldMode = Rosen::DisplayManagerLite::GetInstance().GetFoldDisplayMode(); 287595d5899Sopenharmony_ci currentId = static_cast<uint32_t>(GetDisplayIdWithDisplayMode(foldMode)); 288595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_STATE, "GetCurrentDisplayId foldMode=%{public}u", foldMode); 289595d5899Sopenharmony_ci IPCSkeleton::SetCallingIdentity(identity); 290595d5899Sopenharmony_ci return static_cast<uint32_t>(currentId); 291595d5899Sopenharmony_ci} 292595d5899Sopenharmony_ci 293595d5899Sopenharmony_civoid BrightnessService::SetDisplayId(uint32_t displayId) 294595d5899Sopenharmony_ci{ 295595d5899Sopenharmony_ci mDisplayId = displayId; 296595d5899Sopenharmony_ci if (mAction == nullptr) { 297595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::SetDisplayId mAction == nullptr"); 298595d5899Sopenharmony_ci return; 299595d5899Sopenharmony_ci } 300595d5899Sopenharmony_ci mAction->SetDisplayId(displayId); 301595d5899Sopenharmony_ci} 302595d5899Sopenharmony_ci 303595d5899Sopenharmony_ciuint32_t BrightnessService::GetCurrentSensorId() 304595d5899Sopenharmony_ci{ 305595d5899Sopenharmony_ci return mCurrentSensorId; 306595d5899Sopenharmony_ci} 307595d5899Sopenharmony_ci 308595d5899Sopenharmony_civoid BrightnessService::SetCurrentSensorId(uint32_t sensorId) 309595d5899Sopenharmony_ci{ 310595d5899Sopenharmony_ci mCurrentSensorId = sensorId; 311595d5899Sopenharmony_ci} 312595d5899Sopenharmony_ci 313595d5899Sopenharmony_ciBrightnessService::DimmingCallbackImpl::DimmingCallbackImpl( 314595d5899Sopenharmony_ci const std::shared_ptr<BrightnessAction>& action, std::function<void(uint32_t)> callback) 315595d5899Sopenharmony_ci : mAction(action), mCallback(callback) 316595d5899Sopenharmony_ci{ 317595d5899Sopenharmony_ci} 318595d5899Sopenharmony_ci 319595d5899Sopenharmony_civoid BrightnessService::DimmingCallbackImpl::OnStart() 320595d5899Sopenharmony_ci{ 321595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "BrightnessDimmingCallback onStart"); 322595d5899Sopenharmony_ci} 323595d5899Sopenharmony_ci 324595d5899Sopenharmony_civoid BrightnessService::DimmingCallbackImpl::OnChanged(uint32_t currentValue) 325595d5899Sopenharmony_ci{ 326595d5899Sopenharmony_ci if (!BrightnessService::Get().IsDimming()) { 327595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnChanged currentValue=%{public}d already stopDimming, return", currentValue); 328595d5899Sopenharmony_ci return; 329595d5899Sopenharmony_ci } 330595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnChanged brightness,mapBrightness=%{public}d", currentValue); 331595d5899Sopenharmony_ci bool isSuccess = mAction->SetBrightness(currentValue); 332595d5899Sopenharmony_ci if (isSuccess) { 333595d5899Sopenharmony_ci BrightnessService::Get().ReportBrightnessBigData(currentValue); 334595d5899Sopenharmony_ci } 335595d5899Sopenharmony_ci if (isSuccess && !BrightnessService::Get().IsSleepStatus()) { 336595d5899Sopenharmony_ci if (!BrightnessService::Get().IsDimming()) { 337595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnChanged already stopDimming , not update setting brightness"); 338595d5899Sopenharmony_ci return; 339595d5899Sopenharmony_ci } 340595d5899Sopenharmony_ci FFRTTask task = [this, currentValue] { 341595d5899Sopenharmony_ci auto tmpVal = BrightnessService::Get().GetOrigBrightnessLevel(currentValue); 342595d5899Sopenharmony_ci this->mCallback(tmpVal); 343595d5899Sopenharmony_ci }; 344595d5899Sopenharmony_ci FFRTUtils::SubmitTask(task); 345595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Update OnChanged,Setting brightness=%{public}d", currentValue); 346595d5899Sopenharmony_ci } else { 347595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Update OnChanged failed, brightness=%{public}d", currentValue); 348595d5899Sopenharmony_ci } 349595d5899Sopenharmony_ci} 350595d5899Sopenharmony_ci 351595d5899Sopenharmony_civoid BrightnessService::DimmingCallbackImpl::OnEnd() 352595d5899Sopenharmony_ci{ 353595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "ScreenAnimatorCallback OnEnd"); 354595d5899Sopenharmony_ci} 355595d5899Sopenharmony_ci 356595d5899Sopenharmony_civoid BrightnessService::DimmingCallbackImpl::DiscountBrightness(double discount) 357595d5899Sopenharmony_ci{ 358595d5899Sopenharmony_ci mDiscount = discount; 359595d5899Sopenharmony_ci} 360595d5899Sopenharmony_ci 361595d5899Sopenharmony_civoid BrightnessService::SetDisplayState(uint32_t id, DisplayState state) 362595d5899Sopenharmony_ci{ 363595d5899Sopenharmony_ci mState = state; 364595d5899Sopenharmony_ci bool isAutoMode = false; 365595d5899Sopenharmony_ci bool isScreenOn = IsScreenOnState(state); // depend on state on 366595d5899Sopenharmony_ci bool isSettingOn = false; 367595d5899Sopenharmony_ci if (isScreenOn) { 368595d5899Sopenharmony_ci isSettingOn = IsAutoAdjustBrightness(); 369595d5899Sopenharmony_ci } 370595d5899Sopenharmony_ci isAutoMode = isScreenOn && isSettingOn; 371595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetDisplayState id=%{public}d, isAutoMode=%{public}d, isScreenOn=%{public}d, "\ 372595d5899Sopenharmony_ci "isSettingOn=%{public}d, state=%{public}d", id, isAutoMode, isScreenOn, isSettingOn, state); 373595d5899Sopenharmony_ci#ifdef ENABLE_SENSOR_PART 374595d5899Sopenharmony_ci bool isModeChange = StateChangedSetAutoBrightness(isAutoMode); 375595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetDisplayState id=%{public}d, isAutoMode=%{public}d, isModeChange=%{public}d", 376595d5899Sopenharmony_ci id, isAutoMode, isModeChange); 377595d5899Sopenharmony_ci#endif 378595d5899Sopenharmony_ci if (state == DisplayState::DISPLAY_OFF) { 379595d5899Sopenharmony_ci if (mIsSleepStatus) { 380595d5899Sopenharmony_ci mIsBrightnessOverridden = false; 381595d5899Sopenharmony_ci mIsSleepStatus = false; 382595d5899Sopenharmony_ci } 383595d5899Sopenharmony_ci mBrightnessTarget.store(0); 384595d5899Sopenharmony_ci if (mDimming->IsDimming()) { 385595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DISPLAY_OFF StopDimming"); 386595d5899Sopenharmony_ci mDimming->StopDimming(); 387595d5899Sopenharmony_ci } 388595d5899Sopenharmony_ci } else if (state == DisplayState::DISPLAY_DIM) { 389595d5899Sopenharmony_ci SetSleepBrightness(); 390595d5899Sopenharmony_ci } else if (state == DisplayState::DISPLAY_ON) { 391595d5899Sopenharmony_ci mIsDisplayOnWhenFirstLuxReport.store(true); 392595d5899Sopenharmony_ci if (mIsSleepStatus) { 393595d5899Sopenharmony_ci RestoreBrightness(0); 394595d5899Sopenharmony_ci mIsSleepStatus = false; 395595d5899Sopenharmony_ci } 396595d5899Sopenharmony_ci } 397595d5899Sopenharmony_ci} 398595d5899Sopenharmony_ci 399595d5899Sopenharmony_ciDisplayState BrightnessService::GetDisplayState() 400595d5899Sopenharmony_ci{ 401595d5899Sopenharmony_ci return mState; 402595d5899Sopenharmony_ci} 403595d5899Sopenharmony_ci 404595d5899Sopenharmony_cibool BrightnessService::IsScreenOnState(DisplayState state) 405595d5899Sopenharmony_ci{ 406595d5899Sopenharmony_ci return state == DisplayState::DISPLAY_ON || state == DisplayState::DISPLAY_DIM; 407595d5899Sopenharmony_ci} 408595d5899Sopenharmony_ci 409595d5899Sopenharmony_cibool BrightnessService::GetSettingAutoBrightness(const std::string& key) 410595d5899Sopenharmony_ci{ 411595d5899Sopenharmony_ci return BrightnessSettingHelper::GetSettingAutoBrightness(key); 412595d5899Sopenharmony_ci} 413595d5899Sopenharmony_ci 414595d5899Sopenharmony_civoid BrightnessService::SetSettingAutoBrightness(bool enable) 415595d5899Sopenharmony_ci{ 416595d5899Sopenharmony_ci BrightnessSettingHelper::SetSettingAutoBrightness(enable); 417595d5899Sopenharmony_ci} 418595d5899Sopenharmony_ci 419595d5899Sopenharmony_ciuint32_t BrightnessService::SetLightBrightnessThreshold( 420595d5899Sopenharmony_ci std::vector<int32_t> threshold, sptr<IDisplayBrightnessCallback> callback) 421595d5899Sopenharmony_ci{ 422595d5899Sopenharmony_ci uint32_t result = 0; 423595d5899Sopenharmony_ci if (threshold.size() != APS_LISTEN_PARAMS_LENGHT || !callback) { 424595d5899Sopenharmony_ci DISPLAY_HILOGW(FEAT_BRIGHTNESS, "BrightnessService::SetLightBrightnessThreshold params verify faild."); 425595d5899Sopenharmony_ci return result; 426595d5899Sopenharmony_ci } 427595d5899Sopenharmony_ci result = 1; 428595d5899Sopenharmony_ci mLightBrightnessThreshold = threshold; 429595d5899Sopenharmony_ci mApsListenLightChangeCallback = callback; 430595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::SetLightBrightnessThreshold set listener success"); 431595d5899Sopenharmony_ci return result; 432595d5899Sopenharmony_ci} 433595d5899Sopenharmony_ci 434595d5899Sopenharmony_ci#ifdef ENABLE_SENSOR_PART 435595d5899Sopenharmony_cibool BrightnessService::AutoAdjustBrightness(bool enable) 436595d5899Sopenharmony_ci{ 437595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable start, enable=%{public}d, isEnabled=%{public}d, "\ 438595d5899Sopenharmony_ci "isSupport=%{public}d", enable, mIsAutoBrightnessEnabled, mIsSupportLightSensor); 439595d5899Sopenharmony_ci if (!mIsSupportLightSensor) { 440595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable not support"); 441595d5899Sopenharmony_ci SetSettingAutoBrightness(false); 442595d5899Sopenharmony_ci return false; 443595d5899Sopenharmony_ci } 444595d5899Sopenharmony_ci if (enable) { 445595d5899Sopenharmony_ci if (mIsAutoBrightnessEnabled) { 446595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable is already enabled"); 447595d5899Sopenharmony_ci return true; 448595d5899Sopenharmony_ci } 449595d5899Sopenharmony_ci mIsAutoBrightnessEnabled = true; 450595d5899Sopenharmony_ci ActivateValidAmbientSensor(); 451595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable enable"); 452595d5899Sopenharmony_ci } else { 453595d5899Sopenharmony_ci if (!mIsAutoBrightnessEnabled) { 454595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable is already disabled"); 455595d5899Sopenharmony_ci return true; 456595d5899Sopenharmony_ci } 457595d5899Sopenharmony_ci DeactivateAllAmbientSensor(); 458595d5899Sopenharmony_ci mIsAutoBrightnessEnabled = false; 459595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable disable"); 460595d5899Sopenharmony_ci } 461595d5899Sopenharmony_ci return true; 462595d5899Sopenharmony_ci} 463595d5899Sopenharmony_ci 464595d5899Sopenharmony_cibool BrightnessService::StateChangedSetAutoBrightness(bool enable) 465595d5899Sopenharmony_ci{ 466595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness start, enable=%{public}d, "\ 467595d5899Sopenharmony_ci "isSensorEnabled=%{public}d, isSupport=%{public}d", enable, mIsLightSensorEnabled, mIsSupportLightSensor); 468595d5899Sopenharmony_ci if (!mIsSupportLightSensor) { 469595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness not support"); 470595d5899Sopenharmony_ci SetSettingAutoBrightness(false); 471595d5899Sopenharmony_ci return false; 472595d5899Sopenharmony_ci } 473595d5899Sopenharmony_ci if (enable) { 474595d5899Sopenharmony_ci if (IsCurrentSensorEnable()) { 475595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness is already enabled"); 476595d5899Sopenharmony_ci return true; 477595d5899Sopenharmony_ci } 478595d5899Sopenharmony_ci ActivateValidAmbientSensor(); 479595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness enable"); 480595d5899Sopenharmony_ci } else { 481595d5899Sopenharmony_ci if (!IsCurrentSensorEnable()) { 482595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness is already disabled"); 483595d5899Sopenharmony_ci return true; 484595d5899Sopenharmony_ci } 485595d5899Sopenharmony_ci DeactivateAllAmbientSensor(); 486595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness disable"); 487595d5899Sopenharmony_ci } 488595d5899Sopenharmony_ci return true; 489595d5899Sopenharmony_ci} 490595d5899Sopenharmony_ci 491595d5899Sopenharmony_civoid BrightnessService::InitSensors() 492595d5899Sopenharmony_ci{ 493595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "InitSensors start"); 494595d5899Sopenharmony_ci SensorInfo* sensorInfo = nullptr; 495595d5899Sopenharmony_ci int32_t count; 496595d5899Sopenharmony_ci int ret = GetAllSensors(&sensorInfo, &count); 497595d5899Sopenharmony_ci if (ret != 0 || sensorInfo == nullptr || count < 0) { 498595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Can't get sensors"); 499595d5899Sopenharmony_ci return; 500595d5899Sopenharmony_ci } 501595d5899Sopenharmony_ci mIsSupportLightSensor = false; 502595d5899Sopenharmony_ci for (int i = 0; i < count; i++) { 503595d5899Sopenharmony_ci if (sensorInfo[i].sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT || 504595d5899Sopenharmony_ci sensorInfo[i].sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) { 505595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "AMBIENT_LIGHT Support"); 506595d5899Sopenharmony_ci mIsSupportLightSensor = true; 507595d5899Sopenharmony_ci break; 508595d5899Sopenharmony_ci } 509595d5899Sopenharmony_ci } 510595d5899Sopenharmony_ci if (!mIsSupportLightSensor) { 511595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "AMBIENT_LIGHT not support"); 512595d5899Sopenharmony_ci } 513595d5899Sopenharmony_ci} 514595d5899Sopenharmony_ci 515595d5899Sopenharmony_civoid BrightnessService::AmbientLightCallback(SensorEvent* event) 516595d5899Sopenharmony_ci{ 517595d5899Sopenharmony_ci if (event == nullptr) { 518595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Sensor event is nullptr"); 519595d5899Sopenharmony_ci return; 520595d5899Sopenharmony_ci } 521595d5899Sopenharmony_ci if (event->sensorTypeId != SENSOR_TYPE_ID_AMBIENT_LIGHT && event->sensorTypeId != SENSOR_TYPE_ID_AMBIENT_LIGHT1) { 522595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Sensor Callback is not AMBIENT_LIGHT id=%{public}d", event->sensorTypeId); 523595d5899Sopenharmony_ci return; 524595d5899Sopenharmony_ci } 525595d5899Sopenharmony_ci AmbientLightData* data = reinterpret_cast<AmbientLightData*>(event->data); 526595d5899Sopenharmony_ci if (data == nullptr) { 527595d5899Sopenharmony_ci DISPLAY_HILOGE(FEAT_BRIGHTNESS, "AmbientLightData is null"); 528595d5899Sopenharmony_ci return; 529595d5899Sopenharmony_ci } 530595d5899Sopenharmony_ci BrightnessService::Get().ProcessLightLux(data->intensity); 531595d5899Sopenharmony_ci} 532595d5899Sopenharmony_ci 533595d5899Sopenharmony_civoid BrightnessService::ActivateAmbientSensor() 534595d5899Sopenharmony_ci{ 535595d5899Sopenharmony_ci if (!mIsAutoBrightnessEnabled) { 536595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "auto brightness is not enabled"); 537595d5899Sopenharmony_ci return; 538595d5899Sopenharmony_ci } 539595d5899Sopenharmony_ci if (mIsLightSensorEnabled) { 540595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Ambient Sensor is already on"); 541595d5899Sopenharmony_ci return; 542595d5899Sopenharmony_ci } 543595d5899Sopenharmony_ci (void)strcpy_s(mSensorUser.name, sizeof(mSensorUser.name), "BrightnessService"); 544595d5899Sopenharmony_ci mSensorUser.userData = nullptr; 545595d5899Sopenharmony_ci mSensorUser.callback = &AmbientLightCallback; 546595d5899Sopenharmony_ci SubscribeSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser); 547595d5899Sopenharmony_ci SetBatch(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser, SAMPLING_RATE, SAMPLING_RATE); 548595d5899Sopenharmony_ci ActivateSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser); 549595d5899Sopenharmony_ci SetMode(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser, SENSOR_ON_CHANGE); 550595d5899Sopenharmony_ci mIsLightSensorEnabled = true; 551595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ActivateAmbientSensor"); 552595d5899Sopenharmony_ci} 553595d5899Sopenharmony_ci 554595d5899Sopenharmony_civoid BrightnessService::DeactivateAmbientSensor() 555595d5899Sopenharmony_ci{ 556595d5899Sopenharmony_ci if (!mIsAutoBrightnessEnabled) { 557595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "auto brightness is not enabled"); 558595d5899Sopenharmony_ci return; 559595d5899Sopenharmony_ci } 560595d5899Sopenharmony_ci if (!mIsLightSensorEnabled) { 561595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Ambient Sensor is already off"); 562595d5899Sopenharmony_ci return; 563595d5899Sopenharmony_ci } 564595d5899Sopenharmony_ci DeactivateSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser); 565595d5899Sopenharmony_ci UnsubscribeSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser); 566595d5899Sopenharmony_ci mIsLightSensorEnabled = false; 567595d5899Sopenharmony_ci mLightLuxManager.ClearLuxData(); 568595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DeactivateAmbientSensor"); 569595d5899Sopenharmony_ci} 570595d5899Sopenharmony_ci 571595d5899Sopenharmony_civoid BrightnessService::ActivateAmbientSensor1() 572595d5899Sopenharmony_ci{ 573595d5899Sopenharmony_ci if (!mIsAutoBrightnessEnabled) { 574595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "auto brightness1 is not enabled"); 575595d5899Sopenharmony_ci return; 576595d5899Sopenharmony_ci } 577595d5899Sopenharmony_ci if (mIsLightSensor1Enabled) { 578595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Ambient Sensor1 is already on"); 579595d5899Sopenharmony_ci return; 580595d5899Sopenharmony_ci } 581595d5899Sopenharmony_ci (void)strcpy_s(mSensorUser1.name, sizeof(mSensorUser1.name), "BrightnessService"); 582595d5899Sopenharmony_ci mSensorUser1.userData = nullptr; 583595d5899Sopenharmony_ci mSensorUser1.callback = &AmbientLightCallback; 584595d5899Sopenharmony_ci SubscribeSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1); 585595d5899Sopenharmony_ci SetBatch(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1, SAMPLING_RATE, SAMPLING_RATE); 586595d5899Sopenharmony_ci ActivateSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1); 587595d5899Sopenharmony_ci SetMode(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1, SENSOR_ON_CHANGE); 588595d5899Sopenharmony_ci mIsLightSensor1Enabled = true; 589595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ActivateAmbientSensor1"); 590595d5899Sopenharmony_ci} 591595d5899Sopenharmony_ci 592595d5899Sopenharmony_civoid BrightnessService::DeactivateAmbientSensor1() 593595d5899Sopenharmony_ci{ 594595d5899Sopenharmony_ci if (!mIsAutoBrightnessEnabled) { 595595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "auto brightness1 is not enabled"); 596595d5899Sopenharmony_ci return; 597595d5899Sopenharmony_ci } 598595d5899Sopenharmony_ci if (!mIsLightSensor1Enabled) { 599595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Ambient Sensor1 is already off"); 600595d5899Sopenharmony_ci return; 601595d5899Sopenharmony_ci } 602595d5899Sopenharmony_ci DeactivateSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1); 603595d5899Sopenharmony_ci UnsubscribeSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1); 604595d5899Sopenharmony_ci mIsLightSensor1Enabled = false; 605595d5899Sopenharmony_ci mLightLuxManager.ClearLuxData(); 606595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DeactivateAmbientSensor1"); 607595d5899Sopenharmony_ci} 608595d5899Sopenharmony_ci 609595d5899Sopenharmony_civoid BrightnessService::ActivateValidAmbientSensor() 610595d5899Sopenharmony_ci{ 611595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ActivateValidAmbientSensor"); 612595d5899Sopenharmony_ci bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable(); 613595d5899Sopenharmony_ci if (!isFoldable) { 614595d5899Sopenharmony_ci ActivateAmbientSensor(); 615595d5899Sopenharmony_ci return; 616595d5899Sopenharmony_ci } 617595d5899Sopenharmony_ci std::string identity = IPCSkeleton::ResetCallingIdentity(); 618595d5899Sopenharmony_ci auto foldMode = Rosen::DisplayManagerLite::GetInstance().GetFoldDisplayMode(); 619595d5899Sopenharmony_ci int sensorId = GetSensorIdWithDisplayMode(foldMode); 620595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ActivateValidAmbientSensor sensorId=%{public}d, mode=%{public}d", 621595d5899Sopenharmony_ci sensorId, foldMode); 622595d5899Sopenharmony_ci if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT) { 623595d5899Sopenharmony_ci ActivateAmbientSensor(); 624595d5899Sopenharmony_ci } else if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) { 625595d5899Sopenharmony_ci ActivateAmbientSensor1(); 626595d5899Sopenharmony_ci } 627595d5899Sopenharmony_ci IPCSkeleton::SetCallingIdentity(identity); 628595d5899Sopenharmony_ci} 629595d5899Sopenharmony_ci 630595d5899Sopenharmony_civoid BrightnessService::DeactivateValidAmbientSensor() 631595d5899Sopenharmony_ci{ 632595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DeactivateValidAmbientSensor"); 633595d5899Sopenharmony_ci bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable(); 634595d5899Sopenharmony_ci if (!isFoldable) { 635595d5899Sopenharmony_ci DeactivateAmbientSensor(); 636595d5899Sopenharmony_ci return; 637595d5899Sopenharmony_ci } 638595d5899Sopenharmony_ci std::string identity = IPCSkeleton::ResetCallingIdentity(); 639595d5899Sopenharmony_ci auto foldMode = Rosen::DisplayManagerLite::GetInstance().GetFoldDisplayMode(); 640595d5899Sopenharmony_ci int sensorId = GetSensorIdWithDisplayMode(foldMode); 641595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DeactivateValidAmbientSensor sensorId=%{public}d, mode=%{public}d", 642595d5899Sopenharmony_ci sensorId, foldMode); 643595d5899Sopenharmony_ci if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT) { 644595d5899Sopenharmony_ci DeactivateAmbientSensor(); 645595d5899Sopenharmony_ci } else if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) { 646595d5899Sopenharmony_ci DeactivateAmbientSensor1(); 647595d5899Sopenharmony_ci } 648595d5899Sopenharmony_ci IPCSkeleton::SetCallingIdentity(identity); 649595d5899Sopenharmony_ci} 650595d5899Sopenharmony_ci 651595d5899Sopenharmony_civoid BrightnessService::DeactivateAllAmbientSensor() 652595d5899Sopenharmony_ci{ 653595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DeactivateAllAmbientSensor"); 654595d5899Sopenharmony_ci bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable(); 655595d5899Sopenharmony_ci if (!isFoldable) { 656595d5899Sopenharmony_ci DeactivateAmbientSensor(); 657595d5899Sopenharmony_ci return; 658595d5899Sopenharmony_ci } 659595d5899Sopenharmony_ci DeactivateAmbientSensor(); 660595d5899Sopenharmony_ci DeactivateAmbientSensor1(); 661595d5899Sopenharmony_ci} 662595d5899Sopenharmony_ci#endif 663595d5899Sopenharmony_ci 664595d5899Sopenharmony_cibool BrightnessService::IsAutoAdjustBrightness() 665595d5899Sopenharmony_ci{ 666595d5899Sopenharmony_ci return mIsAutoBrightnessEnabled; 667595d5899Sopenharmony_ci} 668595d5899Sopenharmony_ci 669595d5899Sopenharmony_civoid BrightnessService::ProcessLightLux(float lux) 670595d5899Sopenharmony_ci{ 671595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "ProcessLightLux, lux=%{public}f, mLightLux=%{public}f", 672595d5899Sopenharmony_ci lux, mLightLuxManager.GetSmoothedLux()); 673595d5899Sopenharmony_ci if (!CanSetBrightness()) { 674595d5899Sopenharmony_ci if (mIsLuxActiveWithLog) { 675595d5899Sopenharmony_ci mIsLuxActiveWithLog = false; 676595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ProcessLightLux:mIsLuxActiveWithLog=false"); 677595d5899Sopenharmony_ci } 678595d5899Sopenharmony_ci return; 679595d5899Sopenharmony_ci } 680595d5899Sopenharmony_ci if (!mIsLuxActiveWithLog) { 681595d5899Sopenharmony_ci mIsLuxActiveWithLog = true; 682595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ProcessLightLux:mIsLuxActiveWithLog=true"); 683595d5899Sopenharmony_ci } 684595d5899Sopenharmony_ci NotifyLightChangeToAps(AMBIENT_LIGHT_TYPE, lux); 685595d5899Sopenharmony_ci if (mLightLuxManager.IsNeedUpdateBrightness(lux)) { 686595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateLightLux, lux=%{public}f, mLightLux=%{public}f, isFirst=%{public}d", 687595d5899Sopenharmony_ci lux, mLightLuxManager.GetSmoothedLux(), mLightLuxManager.GetIsFirstLux()); 688595d5899Sopenharmony_ci UpdateCurrentBrightnessLevel(lux, mLightLuxManager.GetIsFirstLux()); 689595d5899Sopenharmony_ci } 690595d5899Sopenharmony_ci 691595d5899Sopenharmony_ci for (int index = 0; index < LUX_LEVEL_LENGTH; index++) { 692595d5899Sopenharmony_ci if (static_cast<uint32_t>(lux) < AMBIENT_LUX_LEVELS[index]) { 693595d5899Sopenharmony_ci if (index != mLuxLevel || mLightLuxManager.GetIsFirstLux()) { 694595d5899Sopenharmony_ci mLuxLevel = index; 695595d5899Sopenharmony_ci // Notify ambient lux change event to battery statistics 696595d5899Sopenharmony_ci // type:0 auto brightness, 1 manual brightness, 2 window brightness, 3 others 697595d5899Sopenharmony_ci#ifdef HAS_HIVIEWDFX_HISYSEVENT_PART 698595d5899Sopenharmony_ci HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::DISPLAY, "AMBIENT_LIGHT", 699595d5899Sopenharmony_ci HiviewDFX::HiSysEvent::EventType::STATISTIC, "LEVEL", mLuxLevel, "TYPE", 0); 700595d5899Sopenharmony_ci#endif 701595d5899Sopenharmony_ci } 702595d5899Sopenharmony_ci break; 703595d5899Sopenharmony_ci } 704595d5899Sopenharmony_ci } 705595d5899Sopenharmony_ci} 706595d5899Sopenharmony_ci 707595d5899Sopenharmony_civoid BrightnessService::UpdateCurrentBrightnessLevel(float lux, bool isFastDuration) 708595d5899Sopenharmony_ci{ 709595d5899Sopenharmony_ci uint32_t brightnessLevel = GetBrightnessLevel(lux); 710595d5899Sopenharmony_ci if (mBrightnessLevel != brightnessLevel || isFastDuration) { 711595d5899Sopenharmony_ci uint32_t duration = DEFAULT_BRIGHTEN_DURATION; 712595d5899Sopenharmony_ci if (brightnessLevel < mBrightnessLevel) { 713595d5899Sopenharmony_ci duration = DEFAULT_DARKEN_DURATION; 714595d5899Sopenharmony_ci } 715595d5899Sopenharmony_ci if (isFastDuration) { 716595d5899Sopenharmony_ci duration = DEFAULT_ANIMATING_DURATION; 717595d5899Sopenharmony_ci } 718595d5899Sopenharmony_ci if (isFastDuration && mIsDisplayOnWhenFirstLuxReport) { 719595d5899Sopenharmony_ci duration = 0; 720595d5899Sopenharmony_ci mIsDisplayOnWhenFirstLuxReport.store(false); 721595d5899Sopenharmony_ci } 722595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateCurrentBrightnessLevel lux=%{public}f, mBrightnessLevel=%{public}d, "\ 723595d5899Sopenharmony_ci "brightnessLevel=%{public}d, duration=%{public}d", lux, mBrightnessLevel, brightnessLevel, duration); 724595d5899Sopenharmony_ci mBrightnessLevel = brightnessLevel; 725595d5899Sopenharmony_ci mCurrentBrightness.store(brightnessLevel); 726595d5899Sopenharmony_ci if (mWaitForFirstLux) { 727595d5899Sopenharmony_ci FFRTUtils::CancelTask(g_waitForFirstLuxTaskHandle, queue_); 728595d5899Sopenharmony_ci mWaitForFirstLux = false; 729595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateCurrentBrightnessLevel CancelScreenOn waitforFisrtLux Task"); 730595d5899Sopenharmony_ci } 731595d5899Sopenharmony_ci mBrightnessTarget.store(brightnessLevel); 732595d5899Sopenharmony_ci SetBrightnessLevel(brightnessLevel, duration); 733595d5899Sopenharmony_ci } 734595d5899Sopenharmony_ci} 735595d5899Sopenharmony_ci 736595d5899Sopenharmony_civoid BrightnessService::SetBrightnessLevel(uint32_t value, uint32_t duration) 737595d5899Sopenharmony_ci{ 738595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetBrightnessLevel value=%{public}d, duration=%{public}d", 739595d5899Sopenharmony_ci value, duration); 740595d5899Sopenharmony_ci UpdateBrightness(value, duration, true); 741595d5899Sopenharmony_ci} 742595d5899Sopenharmony_ci 743595d5899Sopenharmony_ciuint32_t BrightnessService::GetBrightnessLevel(float lux) 744595d5899Sopenharmony_ci{ 745595d5899Sopenharmony_ci uint32_t brightnessLevel = static_cast<uint32_t>(mBrightnessCalculationManager.GetInterpolatedValue(lux) * 746595d5899Sopenharmony_ci MAX_DEFAULT_BRGIHTNESS_LEVEL); 747595d5899Sopenharmony_ci 748595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "GetBrightnessLevel lux=%{public}f, brightnessLevel=%{public}d", 749595d5899Sopenharmony_ci lux, brightnessLevel); 750595d5899Sopenharmony_ci return brightnessLevel; 751595d5899Sopenharmony_ci} 752595d5899Sopenharmony_ci 753595d5899Sopenharmony_ciuint32_t BrightnessService::GetBrightnessHighLevel(uint32_t level) 754595d5899Sopenharmony_ci{ 755595d5899Sopenharmony_ci return level; 756595d5899Sopenharmony_ci} 757595d5899Sopenharmony_ci 758595d5899Sopenharmony_cibool BrightnessService::SetBrightness(uint32_t value, uint32_t gradualDuration, bool continuous) 759595d5899Sopenharmony_ci{ 760595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "SetBrightness val=%{public}d, duration=%{public}d", value, gradualDuration); 761595d5899Sopenharmony_ci if (!CanSetBrightness()) { 762595d5899Sopenharmony_ci DISPLAY_HILOGW(FEAT_BRIGHTNESS, "Cannot set brightness, ignore the change"); 763595d5899Sopenharmony_ci mCachedSettingBrightness = value; 764595d5899Sopenharmony_ci return false; 765595d5899Sopenharmony_ci } 766595d5899Sopenharmony_ci if (gradualDuration == 0) { 767595d5899Sopenharmony_ci bool isSettingOn = IsAutoAdjustBrightness(); 768595d5899Sopenharmony_ci if (isSettingOn && IsCurrentSensorEnable()) { 769595d5899Sopenharmony_ci mIsUserMode = true; 770595d5899Sopenharmony_ci mBrightnessCalculationManager.UpdateBrightnessOffset(value, mLightLuxManager.GetSmoothedLux()); 771595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateBrightnessOffset level=%{public}d, mLightLux=%{public}f", 772595d5899Sopenharmony_ci value, mLightLuxManager.GetSmoothedLux()); 773595d5899Sopenharmony_ci } 774595d5899Sopenharmony_ci } 775595d5899Sopenharmony_ci mBrightnessTarget.store(value); 776595d5899Sopenharmony_ci mCurrentBrightness.store(value); 777595d5899Sopenharmony_ci NotifyLightChangeToAps(BRIGHTNESS_TYPE, static_cast<float>(value)); 778595d5899Sopenharmony_ci bool isSuccess = UpdateBrightness(value, gradualDuration, !continuous); 779595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "SetBrightness val=%{public}d, isSuccess=%{public}d", value, isSuccess); 780595d5899Sopenharmony_ci mIsUserMode = false; 781595d5899Sopenharmony_ci return isSuccess; 782595d5899Sopenharmony_ci} 783595d5899Sopenharmony_ci 784595d5899Sopenharmony_civoid BrightnessService::SetScreenOnBrightness() 785595d5899Sopenharmony_ci{ 786595d5899Sopenharmony_ci uint32_t screenOnBrightness = GetScreenOnBrightness(true); 787595d5899Sopenharmony_ci if (mWaitForFirstLux) { 788595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetScreenOnBrightness waitForFirstLux"); 789595d5899Sopenharmony_ci FFRTUtils::CancelTask(g_waitForFirstLuxTaskHandle, queue_); 790595d5899Sopenharmony_ci screenOnBrightness = mCachedSettingBrightness; 791595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetScreenOnBrightness waitForFirstLux,GetSettingBrightness=%{public}d", 792595d5899Sopenharmony_ci screenOnBrightness); 793595d5899Sopenharmony_ci FFRTTask setBrightnessTask = [this, screenOnBrightness] { 794595d5899Sopenharmony_ci this->UpdateBrightness(screenOnBrightness, 0, true); 795595d5899Sopenharmony_ci }; 796595d5899Sopenharmony_ci g_waitForFirstLuxTaskHandle = FFRTUtils::SubmitDelayTask(setBrightnessTask, WAIT_FOR_FIRST_LUX_MAX_TIME, 797595d5899Sopenharmony_ci queue_); 798595d5899Sopenharmony_ci return; 799595d5899Sopenharmony_ci } 800595d5899Sopenharmony_ci bool needUpdateBrightness = true; 801595d5899Sopenharmony_ci if (IsBrightnessBoosted() || IsBrightnessOverridden()) { 802595d5899Sopenharmony_ci needUpdateBrightness = false; 803595d5899Sopenharmony_ci } 804595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetScreenOnBrightness screenOnBrightness=%{public}d, needUpdate=%{public}d", 805595d5899Sopenharmony_ci screenOnBrightness, needUpdateBrightness); 806595d5899Sopenharmony_ci UpdateBrightness(screenOnBrightness, 0, needUpdateBrightness); 807595d5899Sopenharmony_ci} 808595d5899Sopenharmony_ci 809595d5899Sopenharmony_civoid BrightnessService::ClearOffset() 810595d5899Sopenharmony_ci{ 811595d5899Sopenharmony_ci if (mDimming->IsDimming()) { 812595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "mode off StopDimming"); 813595d5899Sopenharmony_ci mDimming->StopDimming(); 814595d5899Sopenharmony_ci } 815595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ClearOffset mLightLux=%{public}f", mLightLuxManager.GetSmoothedLux()); 816595d5899Sopenharmony_ci mBrightnessTarget.store(0); 817595d5899Sopenharmony_ci mBrightnessCalculationManager.UpdateBrightnessOffset(0, mLightLuxManager.GetSmoothedLux()); 818595d5899Sopenharmony_ci} 819595d5899Sopenharmony_ci 820595d5899Sopenharmony_ciuint32_t BrightnessService::GetBrightness() 821595d5899Sopenharmony_ci{ 822595d5899Sopenharmony_ci return GetSettingBrightness(); 823595d5899Sopenharmony_ci} 824595d5899Sopenharmony_ci 825595d5899Sopenharmony_ciuint32_t BrightnessService::GetDeviceBrightness() 826595d5899Sopenharmony_ci{ 827595d5899Sopenharmony_ci uint32_t brightness = DEFAULT_BRIGHTNESS; 828595d5899Sopenharmony_ci if (mAction != nullptr) { 829595d5899Sopenharmony_ci brightness = mAction->GetBrightness(); 830595d5899Sopenharmony_ci } 831595d5899Sopenharmony_ci return GetOrigBrightnessLevel(brightness); 832595d5899Sopenharmony_ci} 833595d5899Sopenharmony_ci 834595d5899Sopenharmony_ciuint32_t BrightnessService::GetCachedSettingBrightness() 835595d5899Sopenharmony_ci{ 836595d5899Sopenharmony_ci return mCachedSettingBrightness; 837595d5899Sopenharmony_ci} 838595d5899Sopenharmony_ci 839595d5899Sopenharmony_cibool BrightnessService::DiscountBrightness(double discount, uint32_t gradualDuration) 840595d5899Sopenharmony_ci{ 841595d5899Sopenharmony_ci if (!CanDiscountBrightness()) { 842595d5899Sopenharmony_ci DISPLAY_HILOGW(FEAT_BRIGHTNESS, "Cannot discount brightness, ignore the change"); 843595d5899Sopenharmony_ci return false; 844595d5899Sopenharmony_ci } 845595d5899Sopenharmony_ci auto safeDiscount = discount; 846595d5899Sopenharmony_ci if (safeDiscount > DISCOUNT_MAX) { 847595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "discount value is greater than max, discount=%{public}lf", discount); 848595d5899Sopenharmony_ci safeDiscount = DISCOUNT_MAX; 849595d5899Sopenharmony_ci } 850595d5899Sopenharmony_ci if (safeDiscount < DISCOUNT_MIN) { 851595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "discount value is less than min, discount=%{public}lf", discount); 852595d5899Sopenharmony_ci safeDiscount = DISCOUNT_MIN; 853595d5899Sopenharmony_ci } 854595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Discount brightness, safeDiscount=%{public}lf", safeDiscount); 855595d5899Sopenharmony_ci mDiscount = safeDiscount; 856595d5899Sopenharmony_ci if (mDimmingCallback) { 857595d5899Sopenharmony_ci mDimmingCallback->DiscountBrightness(safeDiscount); 858595d5899Sopenharmony_ci } 859595d5899Sopenharmony_ci uint32_t screenOnBrightness = GetScreenOnBrightness(false); 860595d5899Sopenharmony_ci return UpdateBrightness(screenOnBrightness, gradualDuration); 861595d5899Sopenharmony_ci} 862595d5899Sopenharmony_ci 863595d5899Sopenharmony_civoid BrightnessService::SetSleepBrightness() 864595d5899Sopenharmony_ci{ 865595d5899Sopenharmony_ci uint32_t value = GetSettingBrightness(); 866595d5899Sopenharmony_ci if (value <= MIN_DEFAULT_BRGIHTNESS_LEVEL) { 867595d5899Sopenharmony_ci return; 868595d5899Sopenharmony_ci } 869595d5899Sopenharmony_ci uint32_t sleepBrightness = BrightnessParamHelper::GetSleepBrightness(); 870595d5899Sopenharmony_ci uint32_t sleepMinumumReductionBrightness = BrightnessParamHelper::GetSleepMinumumReductionBrightness(); 871595d5899Sopenharmony_ci if (value < sleepMinumumReductionBrightness) { 872595d5899Sopenharmony_ci value = sleepMinumumReductionBrightness; 873595d5899Sopenharmony_ci } 874595d5899Sopenharmony_ci uint32_t enterSleepBrightness = std::max(std::min(value - sleepMinumumReductionBrightness, sleepBrightness), 875595d5899Sopenharmony_ci MIN_DEFAULT_BRGIHTNESS_LEVEL); 876595d5899Sopenharmony_ci uint32_t sleepDarkenTime = BrightnessParamHelper::GetSleepDarkenTime(); 877595d5899Sopenharmony_ci mIsSleepStatus = true; 878595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetSleepBrightness enterSleepBrightness=%{public}d, sleepDarkenTime=%{public}d", 879595d5899Sopenharmony_ci enterSleepBrightness, sleepDarkenTime); 880595d5899Sopenharmony_ci OverrideBrightness(enterSleepBrightness, sleepDarkenTime); 881595d5899Sopenharmony_ci} 882595d5899Sopenharmony_ci 883595d5899Sopenharmony_cibool BrightnessService::OverrideBrightness(uint32_t value, uint32_t gradualDuration) 884595d5899Sopenharmony_ci{ 885595d5899Sopenharmony_ci if (!CanOverrideBrightness()) { 886595d5899Sopenharmony_ci DISPLAY_HILOGW(FEAT_BRIGHTNESS, "Cannot override brightness, ignore the change"); 887595d5899Sopenharmony_ci return false; 888595d5899Sopenharmony_ci } 889595d5899Sopenharmony_ci if (!mIsBrightnessOverridden) { 890595d5899Sopenharmony_ci mIsBrightnessOverridden = true; 891595d5899Sopenharmony_ci } 892595d5899Sopenharmony_ci mOverriddenBrightness = value; 893595d5899Sopenharmony_ci mBeforeOverriddenBrightness = GetSettingBrightness(); 894595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Override brightness, value=%{public}u, mBeforeOverriddenBrightness=%{public}d", 895595d5899Sopenharmony_ci value, mBeforeOverriddenBrightness); 896595d5899Sopenharmony_ci return UpdateBrightness(value, gradualDuration); 897595d5899Sopenharmony_ci} 898595d5899Sopenharmony_ci 899595d5899Sopenharmony_cibool BrightnessService::RestoreBrightness(uint32_t gradualDuration) 900595d5899Sopenharmony_ci{ 901595d5899Sopenharmony_ci if (!IsBrightnessOverridden()) { 902595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Brightness is not override, no need to restore"); 903595d5899Sopenharmony_ci return false; 904595d5899Sopenharmony_ci } 905595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "restore brightness=%{public}d", mBeforeOverriddenBrightness); 906595d5899Sopenharmony_ci mIsBrightnessOverridden = false; 907595d5899Sopenharmony_ci return UpdateBrightness(mBeforeOverriddenBrightness, gradualDuration, true); 908595d5899Sopenharmony_ci} 909595d5899Sopenharmony_ci 910595d5899Sopenharmony_cibool BrightnessService::IsBrightnessOverridden() 911595d5899Sopenharmony_ci{ 912595d5899Sopenharmony_ci return mIsBrightnessOverridden; 913595d5899Sopenharmony_ci} 914595d5899Sopenharmony_ci 915595d5899Sopenharmony_cibool BrightnessService::BoostBrightness(uint32_t timeoutMs, uint32_t gradualDuration) 916595d5899Sopenharmony_ci{ 917595d5899Sopenharmony_ci if (!CanBoostBrightness()) { 918595d5899Sopenharmony_ci DISPLAY_HILOGW(FEAT_BRIGHTNESS, "Cannot boost brightness, ignore the change"); 919595d5899Sopenharmony_ci return false; 920595d5899Sopenharmony_ci } 921595d5899Sopenharmony_ci bool isSuccess = true; 922595d5899Sopenharmony_ci if (!mIsBrightnessBoosted) { 923595d5899Sopenharmony_ci uint32_t maxBrightness = BrightnessParamHelper::GetMaxBrightness(); 924595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Boost brightness, maxBrightness: %{public}d", maxBrightness); 925595d5899Sopenharmony_ci mIsBrightnessBoosted = true; 926595d5899Sopenharmony_ci isSuccess = UpdateBrightness(maxBrightness, gradualDuration); 927595d5899Sopenharmony_ci } 928595d5899Sopenharmony_ci 929595d5899Sopenharmony_ci // If boost multi-times, we will resend the cancel boost event. 930595d5899Sopenharmony_ci FFRTUtils::CancelTask(g_cancelBoostTaskHandle, queue_); 931595d5899Sopenharmony_ci FFRTTask task = [this, gradualDuration] { this->CancelBoostBrightness(gradualDuration); }; 932595d5899Sopenharmony_ci g_cancelBoostTaskHandle = FFRTUtils::SubmitDelayTask(task, timeoutMs, queue_); 933595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BoostBrightness update timeout=%{public}u, isSuccess=%{public}d", timeoutMs, 934595d5899Sopenharmony_ci isSuccess); 935595d5899Sopenharmony_ci return isSuccess; 936595d5899Sopenharmony_ci} 937595d5899Sopenharmony_ci 938595d5899Sopenharmony_cibool BrightnessService::CancelBoostBrightness(uint32_t gradualDuration) 939595d5899Sopenharmony_ci{ 940595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Cancel boost brightness"); 941595d5899Sopenharmony_ci if (!IsBrightnessBoosted()) { 942595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Brightness is not boost, no need to restore"); 943595d5899Sopenharmony_ci return false; 944595d5899Sopenharmony_ci } 945595d5899Sopenharmony_ci FFRTUtils::CancelTask(g_cancelBoostTaskHandle, queue_); 946595d5899Sopenharmony_ci mIsBrightnessBoosted = false; 947595d5899Sopenharmony_ci return UpdateBrightness(mCachedSettingBrightness, gradualDuration, true); 948595d5899Sopenharmony_ci} 949595d5899Sopenharmony_ci 950595d5899Sopenharmony_cibool BrightnessService::IsBrightnessBoosted() 951595d5899Sopenharmony_ci{ 952595d5899Sopenharmony_ci return mIsBrightnessBoosted; 953595d5899Sopenharmony_ci} 954595d5899Sopenharmony_ci 955595d5899Sopenharmony_cibool BrightnessService::IsScreenOn() 956595d5899Sopenharmony_ci{ 957595d5899Sopenharmony_ci return (mState == DisplayState::DISPLAY_ON || mState == DisplayState::DISPLAY_DIM); 958595d5899Sopenharmony_ci} 959595d5899Sopenharmony_ci 960595d5899Sopenharmony_cibool BrightnessService::CanSetBrightness() 961595d5899Sopenharmony_ci{ 962595d5899Sopenharmony_ci bool isScreenOn = IsScreenOn(); 963595d5899Sopenharmony_ci bool isOverridden = IsBrightnessOverridden(); 964595d5899Sopenharmony_ci bool isBoosted = IsBrightnessBoosted(); 965595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "isScreenOn: %{public}d, isOverridden: %{public}d, isBoosted: %{public}d", 966595d5899Sopenharmony_ci isScreenOn, isOverridden, isBoosted); 967595d5899Sopenharmony_ci return isScreenOn && !isOverridden && !isBoosted; 968595d5899Sopenharmony_ci} 969595d5899Sopenharmony_ci 970595d5899Sopenharmony_cibool BrightnessService::CanDiscountBrightness() 971595d5899Sopenharmony_ci{ 972595d5899Sopenharmony_ci return IsScreenOn(); 973595d5899Sopenharmony_ci} 974595d5899Sopenharmony_ci 975595d5899Sopenharmony_cibool BrightnessService::CanOverrideBrightness() 976595d5899Sopenharmony_ci{ 977595d5899Sopenharmony_ci return IsScreenOn() && !IsBrightnessBoosted(); 978595d5899Sopenharmony_ci} 979595d5899Sopenharmony_ci 980595d5899Sopenharmony_cibool BrightnessService::CanBoostBrightness() 981595d5899Sopenharmony_ci{ 982595d5899Sopenharmony_ci return IsScreenOn() && !IsBrightnessOverridden(); 983595d5899Sopenharmony_ci} 984595d5899Sopenharmony_ci 985595d5899Sopenharmony_cibool BrightnessService::UpdateBrightness(uint32_t value, uint32_t gradualDuration, bool updateSetting) 986595d5899Sopenharmony_ci{ 987595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "UpdateBrightness, value=%{public}u, discount=%{public}f,"\ 988595d5899Sopenharmony_ci "duration=%{public}u, updateSetting=%{public}d", value, mDiscount, gradualDuration, updateSetting); 989595d5899Sopenharmony_ci mWaitForFirstLux = false; 990595d5899Sopenharmony_ci auto safeBrightness = GetSafeBrightness(value); 991595d5899Sopenharmony_ci if (mDimming->IsDimming()) { 992595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateBrightness StopDimming"); 993595d5899Sopenharmony_ci mDimming->StopDimming(); 994595d5899Sopenharmony_ci } 995595d5899Sopenharmony_ci auto brightness = static_cast<uint32_t>(safeBrightness * mDiscount); 996595d5899Sopenharmony_ci brightness = GetMappingBrightnessLevel(brightness); 997595d5899Sopenharmony_ci if (gradualDuration > 0) { 998595d5899Sopenharmony_ci mDimming->StartDimming(GetSettingBrightness(), brightness, gradualDuration); 999595d5899Sopenharmony_ci return true; 1000595d5899Sopenharmony_ci } 1001595d5899Sopenharmony_ci bool isSuccess = mAction->SetBrightness(brightness); 1002595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "UpdateBrightness is %{public}s, brightness: %{public}u", 1003595d5899Sopenharmony_ci isSuccess ? "succ" : "failed", brightness); 1004595d5899Sopenharmony_ci if (isSuccess && updateSetting) { 1005595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateBrightness, settings, value=%{public}u", safeBrightness); 1006595d5899Sopenharmony_ci FFRTUtils::SubmitTask([this, safeBrightness] { this->SetSettingBrightness(safeBrightness); }); 1007595d5899Sopenharmony_ci } 1008595d5899Sopenharmony_ci if (isSuccess) { 1009595d5899Sopenharmony_ci ReportBrightnessBigData(brightness); 1010595d5899Sopenharmony_ci } 1011595d5899Sopenharmony_ci return isSuccess; 1012595d5899Sopenharmony_ci} 1013595d5899Sopenharmony_ci 1014595d5899Sopenharmony_ciuint32_t BrightnessService::GetSettingBrightness(const std::string& key) 1015595d5899Sopenharmony_ci{ 1016595d5899Sopenharmony_ci uint32_t settingBrightness = DEFAULT_BRIGHTNESS; 1017595d5899Sopenharmony_ci auto isSuccess = BrightnessSettingHelper::GetSettingBrightness(settingBrightness, key); 1018595d5899Sopenharmony_ci if (isSuccess != ERR_OK) { 1019595d5899Sopenharmony_ci DISPLAY_HILOGW(FEAT_BRIGHTNESS, 1020595d5899Sopenharmony_ci "get setting brightness failed, return default=%{public}d, key=%{public}s, ret=%{public}d", 1021595d5899Sopenharmony_ci settingBrightness, key.c_str(), isSuccess); 1022595d5899Sopenharmony_ci } 1023595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "GetSettingBrightness=%{public}d", settingBrightness); 1024595d5899Sopenharmony_ci return settingBrightness; 1025595d5899Sopenharmony_ci} 1026595d5899Sopenharmony_ci 1027595d5899Sopenharmony_civoid BrightnessService::SetSettingBrightness(uint32_t value) 1028595d5899Sopenharmony_ci{ 1029595d5899Sopenharmony_ci BrightnessSettingHelper::SetSettingBrightness(value); 1030595d5899Sopenharmony_ci mBrightnessLevel = value; 1031595d5899Sopenharmony_ci mCachedSettingBrightness = value; 1032595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetSettingBrightness brightness=%{public}u", value); 1033595d5899Sopenharmony_ci} 1034595d5899Sopenharmony_ci 1035595d5899Sopenharmony_ciuint32_t BrightnessService::GetScreenOnBrightness(bool isUpdateTarget) 1036595d5899Sopenharmony_ci{ 1037595d5899Sopenharmony_ci uint32_t screenOnbrightness; 1038595d5899Sopenharmony_ci if (IsBrightnessBoosted()) { 1039595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Brightness is boosted, return max brightness"); 1040595d5899Sopenharmony_ci screenOnbrightness = BrightnessParamHelper::GetMaxBrightness(); 1041595d5899Sopenharmony_ci } else if (IsBrightnessOverridden()) { 1042595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Brightness is overridden, return overridden brightness=%{public}u", 1043595d5899Sopenharmony_ci mOverriddenBrightness); 1044595d5899Sopenharmony_ci screenOnbrightness = mOverriddenBrightness; 1045595d5899Sopenharmony_ci } else if (isUpdateTarget && mIsAutoBrightnessEnabled) { 1046595d5899Sopenharmony_ci if (mBrightnessTarget.load() > 0) { 1047595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "update, return mBrightnessTarget=%{public}d", mBrightnessTarget.load()); 1048595d5899Sopenharmony_ci screenOnbrightness = mBrightnessTarget.load(); 1049595d5899Sopenharmony_ci } else { 1050595d5899Sopenharmony_ci screenOnbrightness = 0; 1051595d5899Sopenharmony_ci mWaitForFirstLux = true; 1052595d5899Sopenharmony_ci } 1053595d5899Sopenharmony_ci } else { 1054595d5899Sopenharmony_ci screenOnbrightness = GetSettingBrightness(); 1055595d5899Sopenharmony_ci } 1056595d5899Sopenharmony_ci return screenOnbrightness; 1057595d5899Sopenharmony_ci} 1058595d5899Sopenharmony_ci 1059595d5899Sopenharmony_civoid BrightnessService::RegisterSettingBrightnessObserver() 1060595d5899Sopenharmony_ci{ 1061595d5899Sopenharmony_ci} 1062595d5899Sopenharmony_ci 1063595d5899Sopenharmony_civoid BrightnessService::UpdateBrightnessSettingFunc(const std::string& key) 1064595d5899Sopenharmony_ci{ 1065595d5899Sopenharmony_ci} 1066595d5899Sopenharmony_ci 1067595d5899Sopenharmony_civoid BrightnessService::UnregisterSettingBrightnessObserver() 1068595d5899Sopenharmony_ci{ 1069595d5899Sopenharmony_ci BrightnessSettingHelper::UnregisterSettingBrightnessObserver(); 1070595d5899Sopenharmony_ci} 1071595d5899Sopenharmony_ci 1072595d5899Sopenharmony_cidouble BrightnessService::GetDiscount() const 1073595d5899Sopenharmony_ci{ 1074595d5899Sopenharmony_ci return mDiscount; 1075595d5899Sopenharmony_ci} 1076595d5899Sopenharmony_ci 1077595d5899Sopenharmony_ciuint32_t BrightnessService::GetDimmingUpdateTime() const 1078595d5899Sopenharmony_ci{ 1079595d5899Sopenharmony_ci return mDimming->GetDimmingUpdateTime(); 1080595d5899Sopenharmony_ci} 1081595d5899Sopenharmony_ci 1082595d5899Sopenharmony_ciuint32_t BrightnessService::GetMappingBrightnessLevel(uint32_t level) 1083595d5899Sopenharmony_ci{ 1084595d5899Sopenharmony_ci if (level < MIN_DEFAULT_BRGIHTNESS_LEVEL) { 1085595d5899Sopenharmony_ci level = MIN_DEFAULT_BRGIHTNESS_LEVEL; 1086595d5899Sopenharmony_ci } 1087595d5899Sopenharmony_ci if (level > MAX_DEFAULT_BRGIHTNESS_LEVEL) { 1088595d5899Sopenharmony_ci level = MAX_DEFAULT_BRGIHTNESS_LEVEL; 1089595d5899Sopenharmony_ci } 1090595d5899Sopenharmony_ci float levelOut = static_cast<float>(1.0f * (level - MIN_DEFAULT_BRGIHTNESS_LEVEL) 1091595d5899Sopenharmony_ci * (MAX_MAPPING_BRGIHTNESS_LEVEL - MIN_MAPPING_BRGIHTNESS_LEVEL) 1092595d5899Sopenharmony_ci / (MAX_DEFAULT_BRGIHTNESS_LEVEL - MIN_DEFAULT_BRGIHTNESS_LEVEL)) + MIN_MAPPING_BRGIHTNESS_LEVEL + 0.5f; 1093595d5899Sopenharmony_ci if (static_cast<uint32_t>(levelOut) < BrightnessParamHelper::GetMinBrightness()) { 1094595d5899Sopenharmony_ci return BrightnessParamHelper::GetMinBrightness(); 1095595d5899Sopenharmony_ci } 1096595d5899Sopenharmony_ci return static_cast<uint32_t>(levelOut); 1097595d5899Sopenharmony_ci} 1098595d5899Sopenharmony_ci 1099595d5899Sopenharmony_ciuint32_t BrightnessService::GetOrigBrightnessLevel(uint32_t level) 1100595d5899Sopenharmony_ci{ 1101595d5899Sopenharmony_ci if (level < MIN_MAPPING_BRGIHTNESS_LEVEL) { 1102595d5899Sopenharmony_ci level = MIN_MAPPING_BRGIHTNESS_LEVEL; 1103595d5899Sopenharmony_ci } 1104595d5899Sopenharmony_ci if (level > MAX_MAPPING_BRGIHTNESS_LEVEL) { 1105595d5899Sopenharmony_ci level = MAX_MAPPING_BRGIHTNESS_LEVEL; 1106595d5899Sopenharmony_ci } 1107595d5899Sopenharmony_ci float levelOut = static_cast<float>(1.0f * (level - MIN_MAPPING_BRGIHTNESS_LEVEL) 1108595d5899Sopenharmony_ci * (MAX_DEFAULT_BRGIHTNESS_LEVEL - MIN_DEFAULT_BRGIHTNESS_LEVEL) 1109595d5899Sopenharmony_ci / (MAX_MAPPING_BRGIHTNESS_LEVEL - MIN_MAPPING_BRGIHTNESS_LEVEL) + MIN_MAPPING_BRGIHTNESS_LEVEL + 0.5f); 1110595d5899Sopenharmony_ci return static_cast<int>(levelOut); 1111595d5899Sopenharmony_ci} 1112595d5899Sopenharmony_ci 1113595d5899Sopenharmony_ciuint32_t BrightnessService::GetMappingBrightnessNit(uint32_t level) 1114595d5899Sopenharmony_ci{ 1115595d5899Sopenharmony_ci uint32_t levelIn = level; 1116595d5899Sopenharmony_ci if (levelIn < MIN_MAPPING_BRGIHTNESS_LEVEL) { 1117595d5899Sopenharmony_ci levelIn = MIN_MAPPING_BRGIHTNESS_LEVEL; 1118595d5899Sopenharmony_ci } 1119595d5899Sopenharmony_ci if (levelIn > MAX_MAPPING_BRGIHTNESS_LEVEL) { 1120595d5899Sopenharmony_ci levelIn = MAX_MAPPING_BRGIHTNESS_LEVEL; 1121595d5899Sopenharmony_ci } 1122595d5899Sopenharmony_ci double nitOut = (double)(levelIn - MIN_MAPPING_BRGIHTNESS_LEVEL) 1123595d5899Sopenharmony_ci * (MAX_DEFAULT_BRGIHTNESS_NIT - MIN_DEFAULT_BRGIHTNESS_NIT) 1124595d5899Sopenharmony_ci / (MAX_MAPPING_BRGIHTNESS_LEVEL - MIN_MAPPING_BRGIHTNESS_LEVEL) + MIN_DEFAULT_BRGIHTNESS_NIT; 1125595d5899Sopenharmony_ci return round(nitOut); 1126595d5899Sopenharmony_ci} 1127595d5899Sopenharmony_ci 1128595d5899Sopenharmony_ciuint32_t BrightnessService::GetBrightnessLevelFromNit(uint32_t nit) 1129595d5899Sopenharmony_ci{ 1130595d5899Sopenharmony_ci uint32_t nitIn = nit; 1131595d5899Sopenharmony_ci if (nitIn < MIN_DEFAULT_BRGIHTNESS_NIT) { 1132595d5899Sopenharmony_ci nitIn = MIN_DEFAULT_BRGIHTNESS_NIT; 1133595d5899Sopenharmony_ci } 1134595d5899Sopenharmony_ci if (nitIn > MAX_DEFAULT_BRGIHTNESS_NIT) { 1135595d5899Sopenharmony_ci nitIn = MAX_DEFAULT_BRGIHTNESS_NIT; 1136595d5899Sopenharmony_ci } 1137595d5899Sopenharmony_ci double levelOut = (double)(nitIn - MIN_DEFAULT_BRGIHTNESS_NIT) 1138595d5899Sopenharmony_ci * (MAX_DEFAULT_BRGIHTNESS_LEVEL - MIN_DEFAULT_BRGIHTNESS_LEVEL) 1139595d5899Sopenharmony_ci / (MAX_DEFAULT_BRGIHTNESS_NIT - MIN_DEFAULT_BRGIHTNESS_NIT) + MIN_DEFAULT_BRGIHTNESS_LEVEL; 1140595d5899Sopenharmony_ci return round(levelOut); 1141595d5899Sopenharmony_ci} 1142595d5899Sopenharmony_ci 1143595d5899Sopenharmony_ciuint32_t BrightnessService::GetMappingHighBrightnessLevel(uint32_t level) 1144595d5899Sopenharmony_ci{ 1145595d5899Sopenharmony_ci uint32_t levelIn = level; 1146595d5899Sopenharmony_ci if (levelIn < MIN_DEFAULT_BRGIHTNESS_LEVEL) { 1147595d5899Sopenharmony_ci levelIn = MIN_DEFAULT_BRGIHTNESS_LEVEL; 1148595d5899Sopenharmony_ci } 1149595d5899Sopenharmony_ci if (levelIn > MAX_DEFAULT_BRGIHTNESS_LEVEL) { 1150595d5899Sopenharmony_ci levelIn = MAX_DEFAULT_BRGIHTNESS_LEVEL; 1151595d5899Sopenharmony_ci } 1152595d5899Sopenharmony_ci uint32_t levelOut = (levelIn - MIN_DEFAULT_BRGIHTNESS_LEVEL) 1153595d5899Sopenharmony_ci * (MAX_DEFAULT_HIGH_BRGIHTNESS_LEVEL - MIN_DEFAULT_HIGH_BRGIHTNESS_LEVEL) 1154595d5899Sopenharmony_ci / (MAX_DEFAULT_BRGIHTNESS_LEVEL - MIN_DEFAULT_BRGIHTNESS_LEVEL) + MIN_DEFAULT_HIGH_BRGIHTNESS_LEVEL; 1155595d5899Sopenharmony_ci return levelOut; 1156595d5899Sopenharmony_ci} 1157595d5899Sopenharmony_ci 1158595d5899Sopenharmony_civoid BrightnessService::UpdateBrightnessSceneMode(BrightnessSceneMode mode) 1159595d5899Sopenharmony_ci{ 1160595d5899Sopenharmony_ci} 1161595d5899Sopenharmony_ci 1162595d5899Sopenharmony_cibool BrightnessService::IsDimming() 1163595d5899Sopenharmony_ci{ 1164595d5899Sopenharmony_ci if (mDimming == nullptr) { 1165595d5899Sopenharmony_ci return false; 1166595d5899Sopenharmony_ci } 1167595d5899Sopenharmony_ci return mDimming->IsDimming(); 1168595d5899Sopenharmony_ci} 1169595d5899Sopenharmony_ci 1170595d5899Sopenharmony_cistd::string BrightnessService::GetReason() 1171595d5899Sopenharmony_ci{ 1172595d5899Sopenharmony_ci if (mIsBrightnessOverridden) { 1173595d5899Sopenharmony_ci return "APP"; 1174595d5899Sopenharmony_ci } 1175595d5899Sopenharmony_ci if (mIsUserMode) { 1176595d5899Sopenharmony_ci return "USER"; 1177595d5899Sopenharmony_ci } 1178595d5899Sopenharmony_ci if (mIsAutoBrightnessEnabled) { 1179595d5899Sopenharmony_ci return "AUTO"; 1180595d5899Sopenharmony_ci } 1181595d5899Sopenharmony_ci return "MANUAL"; 1182595d5899Sopenharmony_ci} 1183595d5899Sopenharmony_ci 1184595d5899Sopenharmony_civoid BrightnessService::ReportBrightnessBigData(uint32_t brightness) 1185595d5899Sopenharmony_ci{ 1186595d5899Sopenharmony_ci std::string reason = GetReason(); 1187595d5899Sopenharmony_ci uint32_t nit = GetMappingBrightnessNit(brightness); 1188595d5899Sopenharmony_ci // Notify screen brightness change event to battery statistics 1189595d5899Sopenharmony_ci#ifdef HAS_HIVIEWDFX_HISYSEVENT_PART 1190595d5899Sopenharmony_ci HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::DISPLAY, "BRIGHTNESS_NIT", 1191595d5899Sopenharmony_ci HiviewDFX::HiSysEvent::EventType::STATISTIC, "BRIGHTNESS", brightness, "REASON", reason, "NIT", nit); 1192595d5899Sopenharmony_ci#endif 1193595d5899Sopenharmony_ci DISPLAY_HILOGD(FEAT_BRIGHTNESS, "BigData brightness=%{public}d,reason=%{public}s,nit=%{public}d", 1194595d5899Sopenharmony_ci brightness, reason.c_str(), nit); 1195595d5899Sopenharmony_ci} 1196595d5899Sopenharmony_ci 1197595d5899Sopenharmony_cibool BrightnessService::IsSleepStatus() 1198595d5899Sopenharmony_ci{ 1199595d5899Sopenharmony_ci return mIsSleepStatus; 1200595d5899Sopenharmony_ci} 1201595d5899Sopenharmony_ci 1202595d5899Sopenharmony_cibool BrightnessService::GetIsSupportLightSensor() 1203595d5899Sopenharmony_ci{ 1204595d5899Sopenharmony_ci return mIsSupportLightSensor; 1205595d5899Sopenharmony_ci} 1206595d5899Sopenharmony_ci 1207595d5899Sopenharmony_cibool BrightnessService::IsCurrentSensorEnable() 1208595d5899Sopenharmony_ci{ 1209595d5899Sopenharmony_ci bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable(); 1210595d5899Sopenharmony_ci if (!isFoldable) { 1211595d5899Sopenharmony_ci return mIsLightSensorEnabled; 1212595d5899Sopenharmony_ci } 1213595d5899Sopenharmony_ci bool result = false; 1214595d5899Sopenharmony_ci std::string identity = IPCSkeleton::ResetCallingIdentity(); 1215595d5899Sopenharmony_ci auto foldMode = Rosen::DisplayManagerLite::GetInstance().GetFoldDisplayMode(); 1216595d5899Sopenharmony_ci int sensorId = GetSensorIdWithDisplayMode(foldMode); 1217595d5899Sopenharmony_ci if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT) { 1218595d5899Sopenharmony_ci result = mIsLightSensorEnabled; 1219595d5899Sopenharmony_ci } else if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) { 1220595d5899Sopenharmony_ci result = mIsLightSensor1Enabled; 1221595d5899Sopenharmony_ci } 1222595d5899Sopenharmony_ci IPCSkeleton::SetCallingIdentity(identity); 1223595d5899Sopenharmony_ci return result; 1224595d5899Sopenharmony_ci} 1225595d5899Sopenharmony_ci 1226595d5899Sopenharmony_ciint BrightnessService::GetDisplayIdWithFoldstatus(Rosen::FoldStatus foldStatus) 1227595d5899Sopenharmony_ci{ 1228595d5899Sopenharmony_ci return mBrightnessCalculationManager.GetDisplayIdWithFoldstatus(static_cast<int>(foldStatus)); 1229595d5899Sopenharmony_ci} 1230595d5899Sopenharmony_ci 1231595d5899Sopenharmony_ciint BrightnessService::GetSensorIdWithFoldstatus(Rosen::FoldStatus foldStatus) 1232595d5899Sopenharmony_ci{ 1233595d5899Sopenharmony_ci return mBrightnessCalculationManager.GetSensorIdWithFoldstatus(static_cast<int>(foldStatus)); 1234595d5899Sopenharmony_ci} 1235595d5899Sopenharmony_ci 1236595d5899Sopenharmony_ciint BrightnessService::GetDisplayIdWithDisplayMode(Rosen::FoldDisplayMode mode) 1237595d5899Sopenharmony_ci{ 1238595d5899Sopenharmony_ci return mBrightnessCalculationManager.GetDisplayIdWithDisplayMode(static_cast<int>(mode)); 1239595d5899Sopenharmony_ci} 1240595d5899Sopenharmony_ci 1241595d5899Sopenharmony_ciint BrightnessService::GetSensorIdWithDisplayMode(Rosen::FoldDisplayMode mode) 1242595d5899Sopenharmony_ci{ 1243595d5899Sopenharmony_ci return mBrightnessCalculationManager.GetSensorIdWithDisplayMode(static_cast<int>(mode)); 1244595d5899Sopenharmony_ci} 1245595d5899Sopenharmony_ci 1246595d5899Sopenharmony_cibool BrightnessService::SetMaxBrightness(double value) 1247595d5899Sopenharmony_ci{ 1248595d5899Sopenharmony_ci int32_t intMaxValue = round(value * MAX_DEFAULT_BRGIHTNESS_LEVEL); 1249595d5899Sopenharmony_ci if (intMaxValue <= 0) { 1250595d5899Sopenharmony_ci intMaxValue = brightnessValueMin; 1251595d5899Sopenharmony_ci } 1252595d5899Sopenharmony_ci if (intMaxValue == brightnessValueMax) { 1253595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightness value=oldMax"); 1254595d5899Sopenharmony_ci return true; 1255595d5899Sopenharmony_ci } 1256595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightness value=%{public}u, oldMax=%{public}u", 1257595d5899Sopenharmony_ci intMaxValue, brightnessValueMax); 1258595d5899Sopenharmony_ci brightnessValueMax = 1259595d5899Sopenharmony_ci (intMaxValue > MAX_DEFAULT_BRGIHTNESS_LEVEL ? MAX_DEFAULT_BRGIHTNESS_LEVEL : intMaxValue); 1260595d5899Sopenharmony_ci uint32_t currentBrightness = GetSettingBrightness(); 1261595d5899Sopenharmony_ci if (brightnessValueMax < currentBrightness) { 1262595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightness currentBrightness=%{public}u", currentBrightness); 1263595d5899Sopenharmony_ci return UpdateBrightness(brightnessValueMax, DEFAULT_MAX_BRIGHTNESS_DURATION, true); 1264595d5899Sopenharmony_ci } 1265595d5899Sopenharmony_ci if (mCurrentBrightness.load() == 0) { 1266595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "No need to update brightne during init"); 1267595d5899Sopenharmony_ci return true; 1268595d5899Sopenharmony_ci } 1269595d5899Sopenharmony_ci return UpdateBrightness(mCurrentBrightness.load(), DEFAULT_MAX_BRIGHTNESS_DURATION, true); 1270595d5899Sopenharmony_ci} 1271595d5899Sopenharmony_ci 1272595d5899Sopenharmony_cibool BrightnessService::SetMaxBrightnessNit(uint32_t maxNit) 1273595d5899Sopenharmony_ci{ 1274595d5899Sopenharmony_ci uint32_t max_value = GetBrightnessLevelFromNit(maxNit); 1275595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightnessNit nitIn=%{public}u, levelOut=%{public}u", 1276595d5899Sopenharmony_ci maxNit, max_value); 1277595d5899Sopenharmony_ci if (max_value == brightnessValueMax) { 1278595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightness value=oldMax"); 1279595d5899Sopenharmony_ci return true; 1280595d5899Sopenharmony_ci } 1281595d5899Sopenharmony_ci brightnessValueMax = 1282595d5899Sopenharmony_ci (max_value > MAX_DEFAULT_BRGIHTNESS_LEVEL ? MAX_DEFAULT_BRGIHTNESS_LEVEL : max_value); 1283595d5899Sopenharmony_ci uint32_t currentBrightness = GetSettingBrightness(); 1284595d5899Sopenharmony_ci if (brightnessValueMax < currentBrightness) { 1285595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightnessNit currentBrightness=%{public}u", currentBrightness); 1286595d5899Sopenharmony_ci return UpdateBrightness(brightnessValueMax, DEFAULT_MAX_BRIGHTNESS_DURATION, true); 1287595d5899Sopenharmony_ci } 1288595d5899Sopenharmony_ci if (mCurrentBrightness.load() == 0) { 1289595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "No need to update brightne during init"); 1290595d5899Sopenharmony_ci return true; 1291595d5899Sopenharmony_ci } 1292595d5899Sopenharmony_ci return UpdateBrightness(mCurrentBrightness.load(), DEFAULT_MAX_BRIGHTNESS_DURATION, true); 1293595d5899Sopenharmony_ci} 1294595d5899Sopenharmony_ci 1295595d5899Sopenharmony_ciuint32_t BrightnessService::GetSafeBrightness(uint32_t value) 1296595d5899Sopenharmony_ci{ 1297595d5899Sopenharmony_ci auto brightnessValue = value; 1298595d5899Sopenharmony_ci if (brightnessValue > brightnessValueMax) { 1299595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "value is bigger than max=%{public}u, value=%{public}u", 1300595d5899Sopenharmony_ci brightnessValueMax, value); 1301595d5899Sopenharmony_ci brightnessValue = brightnessValueMax; 1302595d5899Sopenharmony_ci } 1303595d5899Sopenharmony_ci if (brightnessValue < brightnessValueMin) { 1304595d5899Sopenharmony_ci DISPLAY_HILOGI(FEAT_BRIGHTNESS, "brightness value is less than min, value=%{public}u", value); 1305595d5899Sopenharmony_ci brightnessValue = brightnessValueMin; 1306595d5899Sopenharmony_ci } 1307595d5899Sopenharmony_ci return brightnessValue; 1308595d5899Sopenharmony_ci} 1309595d5899Sopenharmony_ci} // namespace DisplayPowerMgr 1310595d5899Sopenharmony_ci} // namespace OHOS 1311