• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "brightness_service.h"
17 
18 #include <file_ex.h>
19 #include <hisysevent.h>
20 #include <ipc_skeleton.h>
21 #include <securec.h>
22 
23 #include "brightness_action.h"
24 #include "brightness_setting_helper.h"
25 #include "config_parser.h"
26 #include "delayed_sp_singleton.h"
27 #include "display_common.h"
28 #include "display_log.h"
29 #include "display_manager_lite.h"
30 #include "dm_common.h"
31 #include "errors.h"
32 #include "ffrt_utils.h"
33 #include "light_lux_manager.h"
34 #include "new"
35 #include "permission.h"
36 #include "refbase.h"
37 #include "screen_manager_lite.h"
38 #include "setting_provider.h"
39 #include "system_ability_definition.h"
40 
41 #ifdef ENABLE_SENSOR_PART
42 #include "sensor_agent.h"
43 #endif
44 
45 namespace OHOS {
46 namespace DisplayPowerMgr {
47 namespace {
48 constexpr uint32_t MAX_DEFAULT_BRGIHTNESS_LEVEL = 255;
49 constexpr uint32_t MIN_DEFAULT_BRGIHTNESS_LEVEL = 1;
50 constexpr uint32_t MAX_MAPPING_BRGIHTNESS_LEVEL = 223;
51 constexpr uint32_t MIN_MAPPING_BRGIHTNESS_LEVEL = 1;
52 constexpr uint32_t MAX_HBM_BRGIHTNESS_NIT = 1000;
53 constexpr uint32_t MAX_DEFAULT_BRGIHTNESS_NIT = 600;
54 constexpr uint32_t MIN_DEFAULT_BRGIHTNESS_NIT = 2;
55 constexpr uint32_t MAX_DEFAULT_HIGH_BRGIHTNESS_LEVEL = 10000;
56 constexpr uint32_t MIN_DEFAULT_HIGH_BRGIHTNESS_LEVEL = 156;
57 constexpr uint32_t DEFAULT_ANIMATING_DURATION = 500;
58 constexpr uint32_t DEFAULT_BRIGHTEN_DURATION = 2000;
59 constexpr uint32_t DEFAULT_DARKEN_DURATION = 5000;
60 constexpr uint32_t DEFAULT_MAX_BRIGHTNESS_DURATION = 3000;
61 constexpr uint32_t BRIGHTNESS_TYPE = 0;
62 constexpr uint32_t AMBIENT_LIGHT_TYPE = 1;
63 constexpr uint32_t APS_LISTEN_PARAMS_LENGHT = 3;
64 constexpr time_t CALL_APS_INTERVAL = 2;
65 
66 FFRTHandle g_cancelBoostTaskHandle{};
67 FFRTHandle g_waitForFirstLuxTaskHandle{};
68 }
69 
70 const uint32_t BrightnessService::AMBIENT_LUX_LEVELS[BrightnessService::LUX_LEVEL_LENGTH] = { 1, 3, 5, 10, 20, 50, 200,
71     500, 1000, 2000, 3000, 5000, 10000, 20000, 40000, 50000, 60000, 70000, 80000, 90000, 100000, INT_MAX };
72 
73 using namespace OHOS::PowerMgr;
74 
75 uint32_t BrightnessService::brightnessValueMax = MAX_DEFAULT_BRGIHTNESS_LEVEL;
76 uint32_t BrightnessService::brightnessValueMin = MIN_DEFAULT_BRGIHTNESS_LEVEL;
77 
BrightnessService()78 BrightnessService::BrightnessService()
79 {
80     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService created for displayId=%{public}d", mDisplayId);
81     mAction = std::make_shared<BrightnessAction>(mDisplayId);
82     if (mAction == nullptr) {
83         DISPLAY_HILOGE(FEAT_BRIGHTNESS, "mAction is null");
84         return;
85     }
86     mState = mAction->GetDisplayState();
87     mDimmingCallback = std::make_shared<DimmingCallbackImpl>(mAction, [this](uint32_t brightness) {
88         SetSettingBrightness(brightness);
89     });
90     if (mDimmingCallback == nullptr) {
91         DISPLAY_HILOGE(FEAT_BRIGHTNESS, "mDimmingCallback is null");
92     }
93     std::string name = "BrightnessService" + std::to_string(mDisplayId);
94     mDimming = std::make_shared<BrightnessDimming>(name, mDimmingCallback);
95 }
96 
Get()97 BrightnessService& BrightnessService::Get()
98 {
99     static BrightnessService brightnessManager;
100     return brightnessManager;
101 }
102 
Init(uint32_t defaultMax,uint32_t defaultMin)103 void BrightnessService::Init(uint32_t defaultMax, uint32_t defaultMin)
104 {
105     std::call_once(mInitCallFlag, [defaultMax, defaultMin, this] {
106         queue_ = std::make_shared<FFRTQueue> ("brightness_manager");
107         if (queue_ == nullptr) {
108             return;
109         }
110         if (!mDimming->Init()) {
111             return;
112         }
113 #ifdef ENABLE_SENSOR_PART
114         InitSensors();
115         mIsFoldDevice = Rosen::DisplayManagerLite::GetInstance().IsFoldable();
116         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Init mIsFoldDevice=%{public}d", mIsFoldDevice);
117 #endif
118         ConfigParse::Get().Initialize();
119         mLightLuxManager.InitParameters();
120         mBrightnessCalculationManager.InitParameters();
121 
122         bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable();
123         brightnessValueMax = defaultMax;
124         brightnessValueMin = defaultMin;
125         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::init isFoldable=%{public}d, max=%{public}u, min=%{public}u",
126             isFoldable, brightnessValueMax, brightnessValueMin);
127         if (isFoldable) {
128             RegisterFoldStatusListener();
129         }
130     });
131 }
132 
DeInit()133 void BrightnessService::DeInit()
134 {
135     bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable();
136     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::init isFoldable=%{public}d", isFoldable);
137     if (isFoldable) {
138         UnRegisterFoldStatusListener();
139     }
140     if (queue_) {
141         queue_.reset();
142         g_cancelBoostTaskHandle = nullptr;
143         g_waitForFirstLuxTaskHandle = nullptr;
144         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "destruct brightness ffrt queue");
145     }
146 
147     mDimming->Reset();
148 }
149 
OnFoldStatusChanged(Rosen::FoldStatus foldStatus)150 void BrightnessService::FoldStatusLisener::OnFoldStatusChanged(Rosen::FoldStatus foldStatus)
151 {
152     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnFoldStatusChanged currenFoldStatus=%{public}d", foldStatus);
153     if (mLastFoldStatus == foldStatus) {
154         DISPLAY_HILOGE(FEAT_BRIGHTNESS, "no need set foldStatus");
155         return;
156     }
157     bool isSensorEnable = BrightnessService::Get().GetIsSupportLightSensor();
158     bool isAutoEnable = BrightnessService::Get().GetSettingAutoBrightness();
159     bool isScreenOn = BrightnessService::Get().IsScreenOn();
160     int displayId = BrightnessService::Get().GetDisplayIdWithFoldstatus(foldStatus);
161     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnFoldStatusChanged isSensorEnable=%{public}d, isAutoEnable=%{public}d"\
162         ", isScreenOn=%{public}d, displayid=%{public}d", isSensorEnable, isAutoEnable, isScreenOn, displayId);
163     uint32_t currentBrightness = BrightnessService::Get().GetBrightness();
164     BrightnessService::Get().SetDisplayId(displayId);
165 
166     if (Rosen::FoldStatus::FOLDED == foldStatus || Rosen::FoldStatus::EXPAND == foldStatus) {
167         int sensorId = BrightnessService::Get().GetSensorIdWithFoldstatus(foldStatus);
168         BrightnessService::Get().SetCurrentSensorId(static_cast<uint32_t>(sensorId));
169         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnFoldStatusChanged sensorid=%{public}d", sensorId);
170         if (isSensorEnable && isAutoEnable && isScreenOn) {
171             if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT) {
172                 BrightnessService::Get().ActivateAmbientSensor();
173             } else if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) {
174                 BrightnessService::Get().ActivateAmbientSensor1();
175             }
176         }
177     } else if (Rosen::FoldStatus::HALF_FOLD == foldStatus) {
178         uint32_t currentEffectSensorId = BrightnessService::Get().GetCurrentSensorId();
179         if (isSensorEnable && isAutoEnable && isScreenOn) {
180             if (currentEffectSensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT) {
181                 BrightnessService::Get().DeactivateAmbientSensor();
182             } else if (currentEffectSensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) {
183                 BrightnessService::Get().DeactivateAmbientSensor1();
184             }
185         }
186     }
187 
188     if (BrightnessService::Get().CanSetBrightness()) {
189         BrightnessService::Get().UpdateBrightness(currentBrightness, 0, true);
190     }
191     mLastFoldStatus = foldStatus;
192 }
193 
RegisterFoldStatusListener()194 void BrightnessService::RegisterFoldStatusListener()
195 {
196     mFoldStatusistener = new FoldStatusLisener();
197     if (mFoldStatusistener == nullptr) {
198         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::RegisterDisplayModeListener newListener failed");
199         return;
200     }
201     auto ret = Rosen::DisplayManagerLite::GetInstance().RegisterFoldStatusListener(mFoldStatusistener);
202     if (ret != Rosen::DMError::DM_OK) {
203         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Rosen::DisplayManagerLite::RegisterDisplayModeListener failed");
204         mFoldStatusistener = nullptr;
205     } else {
206         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::RegisterDisplayModeListener success");
207     }
208 }
209 
UnRegisterFoldStatusListener()210 void BrightnessService::UnRegisterFoldStatusListener()
211 {
212     if (mFoldStatusistener == nullptr) {
213         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::UnRegistermFoldStatusistener listener is null");
214         return;
215     }
216     auto ret = Rosen::DisplayManagerLite::GetInstance().UnregisterFoldStatusListener(mFoldStatusistener);
217     if (ret != Rosen::DMError::DM_OK) {
218         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::UnRegisterDisplayModeListener  failed");
219     }
220 }
221 
GetDisplayId()222 uint32_t BrightnessService::GetDisplayId()
223 {
224     return mDisplayId;
225 }
226 
NotifyLightChangeToAps(uint32_t type,float value)227 void BrightnessService::NotifyLightChangeToAps(uint32_t type, float value)
228 {
229     // Check whether APS callback interface exists
230     if (!mApsListenLightChangeCallback) {
231         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "BrightnessService::NotifyLightChangeToAps function is null");
232         return;
233     }
234 
235     // Check Whether APS is initialized
236     if (mLightBrightnessThreshold.size() != APS_LISTEN_PARAMS_LENGHT) {
237         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "BrightnessService::NotifyLightChangeToAps not init yet");
238         return;
239     }
240 
241     // brightness
242     if (type == BRIGHTNESS_TYPE) {
243         int32_t nitValue = static_cast<int32_t>(GetMappingBrightnessNit(static_cast<uint32_t>(value)));
244         int32_t brightness = mLightBrightnessThreshold[0];
245         if (!mIsBrightnessValidate && nitValue >= brightness) {
246             mIsBrightnessValidate = true;
247             mApsListenLightChangeCallback->OnNotifyApsLightBrightnessChange(type, mIsBrightnessValidate);
248         } else if (mIsBrightnessValidate && nitValue < brightness) {
249             mIsBrightnessValidate = false;
250             mApsListenLightChangeCallback->OnNotifyApsLightBrightnessChange(type, mIsBrightnessValidate);
251         }
252         return;
253     }
254 
255     // amlient light
256     if (type == AMBIENT_LIGHT_TYPE) {
257         // Check the interval for invoking the APS interface
258         time_t currentTime = time(0);
259         if (currentTime - mLastCallApsTime < CALL_APS_INTERVAL) {
260             DISPLAY_HILOGD(
261                 FEAT_BRIGHTNESS, "BrightnessService::NotifyLightChangeToAps interface is invoked frequently");
262             return;
263         }
264         mLastCallApsTime = currentTime;
265 
266         int32_t light = mLightBrightnessThreshold[1];
267         int32_t range = mLightBrightnessThreshold[2];
268         if (!mIsLightValidate && value >= light) {
269             mIsLightValidate = true;
270             mApsListenLightChangeCallback->OnNotifyApsLightBrightnessChange(type, mIsLightValidate);
271         } else if (mIsLightValidate && value < (light - range)) {
272             mIsLightValidate = false;
273             mApsListenLightChangeCallback->OnNotifyApsLightBrightnessChange(type, mIsLightValidate);
274         }
275     }
276 }
277 
GetCurrentDisplayId(uint32_t defaultId)278 uint32_t BrightnessService::GetCurrentDisplayId(uint32_t defaultId)
279 {
280     uint32_t currentId = defaultId;
281     bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable();
282     if (!isFoldable) {
283         DISPLAY_HILOGI(FEAT_STATE, "GetCurrentDisplayId not fold phone return default id=%{public}d", defaultId);
284         return currentId;
285     }
286     std::string identity = IPCSkeleton::ResetCallingIdentity();
287     auto foldMode = Rosen::DisplayManagerLite::GetInstance().GetFoldDisplayMode();
288     currentId = static_cast<uint32_t>(GetDisplayIdWithDisplayMode(foldMode));
289     DISPLAY_HILOGI(FEAT_STATE, "GetCurrentDisplayId foldMode=%{public}u", foldMode);
290     IPCSkeleton::SetCallingIdentity(identity);
291     return static_cast<uint32_t>(currentId);
292 }
293 
SetDisplayId(uint32_t displayId)294 void BrightnessService::SetDisplayId(uint32_t displayId)
295 {
296     mDisplayId = displayId;
297     if (mAction == nullptr) {
298         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::SetDisplayId mAction == nullptr");
299         return;
300     }
301     mAction->SetDisplayId(displayId);
302 }
303 
GetCurrentSensorId()304 uint32_t BrightnessService::GetCurrentSensorId()
305 {
306     return mCurrentSensorId;
307 }
308 
SetCurrentSensorId(uint32_t sensorId)309 void BrightnessService::SetCurrentSensorId(uint32_t sensorId)
310 {
311     mCurrentSensorId = sensorId;
312 }
313 
DimmingCallbackImpl(const std::shared_ptr<BrightnessAction> & action,std::function<void (uint32_t)> callback)314 BrightnessService::DimmingCallbackImpl::DimmingCallbackImpl(
315     const std::shared_ptr<BrightnessAction>& action, std::function<void(uint32_t)> callback)
316     : mAction(action), mCallback(callback)
317 {
318 }
319 
OnStart()320 void BrightnessService::DimmingCallbackImpl::OnStart()
321 {
322     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "BrightnessDimmingCallback onStart");
323 }
324 
OnChanged(uint32_t currentValue)325 void BrightnessService::DimmingCallbackImpl::OnChanged(uint32_t currentValue)
326 {
327     if (!BrightnessService::Get().IsDimming()) {
328         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnChanged currentValue=%{public}d already stopDimming, return", currentValue);
329         return;
330     }
331     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnChanged brightness,mapBrightness=%{public}d", currentValue);
332     bool isSuccess = mAction->SetBrightness(currentValue);
333     if (isSuccess) {
334         BrightnessService::Get().ReportBrightnessBigData(currentValue);
335     }
336     if (isSuccess && !BrightnessService::Get().IsSleepStatus()) {
337         if (!BrightnessService::Get().IsDimming()) {
338             DISPLAY_HILOGI(FEAT_BRIGHTNESS, "OnChanged already stopDimming , not update setting brightness");
339             return;
340         }
341         FFRTTask task = [this, currentValue] {
342             auto tmpVal = BrightnessService::Get().GetOrigBrightnessLevel(currentValue);
343             this->mCallback(tmpVal);
344         };
345         FFRTUtils::SubmitTask(task);
346         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Update OnChanged,Setting brightness=%{public}d", currentValue);
347     } else {
348         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Update OnChanged failed, brightness=%{public}d", currentValue);
349     }
350 }
351 
OnEnd()352 void BrightnessService::DimmingCallbackImpl::OnEnd()
353 {
354     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "ScreenAnimatorCallback OnEnd");
355 }
356 
DiscountBrightness(double discount)357 void BrightnessService::DimmingCallbackImpl::DiscountBrightness(double discount)
358 {
359     mDiscount = discount;
360 }
361 
SetDisplayState(uint32_t id,DisplayState state)362 void BrightnessService::SetDisplayState(uint32_t id, DisplayState state)
363 {
364     mState = state;
365     bool isAutoMode = false;
366     bool isScreenOn = IsScreenOnState(state); // depend on state on
367     bool isSettingOn = false;
368     if (isScreenOn) {
369         isSettingOn = IsAutoAdjustBrightness();
370     }
371     isAutoMode = isScreenOn && isSettingOn;
372     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetDisplayState id=%{public}d, isAutoMode=%{public}d, isScreenOn=%{public}d, "\
373         "isSettingOn=%{public}d, state=%{public}d", id, isAutoMode, isScreenOn, isSettingOn, state);
374 #ifdef ENABLE_SENSOR_PART
375     bool isModeChange = StateChangedSetAutoBrightness(isAutoMode);
376     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetDisplayState id=%{public}d, isAutoMode=%{public}d, isModeChange=%{public}d",
377         id, isAutoMode, isModeChange);
378 #endif
379     if (state == DisplayState::DISPLAY_OFF) {
380         if (mIsSleepStatus) {
381             mIsBrightnessOverridden = false;
382             mIsSleepStatus = false;
383         }
384         mBrightnessTarget.store(0);
385         if (mDimming->IsDimming()) {
386             DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DISPLAY_OFF StopDimming");
387             mDimming->StopDimming();
388         }
389     } else if (state == DisplayState::DISPLAY_DIM) {
390         SetSleepBrightness();
391     } else if (state == DisplayState::DISPLAY_ON) {
392         mIsDisplayOnWhenFirstLuxReport.store(true);
393         if (mIsSleepStatus) {
394             RestoreBrightness(0);
395             mIsSleepStatus = false;
396         }
397     }
398 }
399 
GetDisplayState()400 DisplayState BrightnessService::GetDisplayState()
401 {
402     return mState;
403 }
404 
IsScreenOnState(DisplayState state)405 bool BrightnessService::IsScreenOnState(DisplayState state)
406 {
407     return state == DisplayState::DISPLAY_ON || state == DisplayState::DISPLAY_DIM;
408 }
409 
GetSettingAutoBrightness(const std::string & key)410 bool BrightnessService::GetSettingAutoBrightness(const std::string& key)
411 {
412     return BrightnessSettingHelper::GetSettingAutoBrightness(key);
413 }
414 
SetSettingAutoBrightness(bool enable)415 void BrightnessService::SetSettingAutoBrightness(bool enable)
416 {
417     BrightnessSettingHelper::SetSettingAutoBrightness(enable);
418 }
419 
SetLightBrightnessThreshold(std::vector<int32_t> threshold,sptr<IDisplayBrightnessCallback> callback)420 uint32_t BrightnessService::SetLightBrightnessThreshold(
421     std::vector<int32_t> threshold, sptr<IDisplayBrightnessCallback> callback)
422 {
423     uint32_t result = 0;
424     if (threshold.size() != APS_LISTEN_PARAMS_LENGHT || !callback) {
425         DISPLAY_HILOGW(FEAT_BRIGHTNESS, "BrightnessService::SetLightBrightnessThreshold params verify faild.");
426         return result;
427     }
428     result = 1;
429     mLightBrightnessThreshold = threshold;
430     mApsListenLightChangeCallback = callback;
431     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BrightnessService::SetLightBrightnessThreshold set listener success");
432     return result;
433 }
434 
435 #ifdef ENABLE_SENSOR_PART
AutoAdjustBrightness(bool enable)436 bool BrightnessService::AutoAdjustBrightness(bool enable)
437 {
438     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable start, enable=%{public}d, isEnabled=%{public}d, "\
439         "isSupport=%{public}d", enable, mIsAutoBrightnessEnabled, mIsSupportLightSensor);
440     if (!mIsSupportLightSensor) {
441         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable not support");
442         SetSettingAutoBrightness(false);
443         return false;
444     }
445     if (enable) {
446         if (mIsAutoBrightnessEnabled) {
447             DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable is already enabled");
448             return true;
449         }
450         mIsAutoBrightnessEnabled = true;
451         ActivateValidAmbientSensor();
452         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable enable");
453     } else {
454         if (!mIsAutoBrightnessEnabled) {
455             DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable is already disabled");
456             return true;
457         }
458         DeactivateAllAmbientSensor();
459         mIsAutoBrightnessEnabled = false;
460         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetAutoBrightnessEnable disable");
461     }
462     return true;
463 }
464 
StateChangedSetAutoBrightness(bool enable)465 bool BrightnessService::StateChangedSetAutoBrightness(bool enable)
466 {
467     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness start, enable=%{public}d, "\
468         "isSensorEnabled=%{public}d, isSupport=%{public}d", enable, mIsLightSensorEnabled, mIsSupportLightSensor);
469     if (!mIsSupportLightSensor) {
470         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness not support");
471         SetSettingAutoBrightness(false);
472         return false;
473     }
474     if (enable) {
475         if (IsCurrentSensorEnable()) {
476             DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness is already enabled");
477             return true;
478         }
479         ActivateValidAmbientSensor();
480         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness enable");
481     } else {
482         if (!IsCurrentSensorEnable()) {
483             DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness is already disabled");
484             return true;
485         }
486         DeactivateAllAmbientSensor();
487         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "StateChangedSetAutoBrightness disable");
488     }
489     return true;
490 }
491 
InitSensors()492 void BrightnessService::InitSensors()
493 {
494     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "InitSensors start");
495     SensorInfo* sensorInfo = nullptr;
496     int32_t count;
497     int ret = GetAllSensors(&sensorInfo, &count);
498     if (ret != 0 || sensorInfo == nullptr || count < 0) {
499         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Can't get sensors");
500         return;
501     }
502     mIsSupportLightSensor = false;
503     for (int i = 0; i < count; i++) {
504         if (sensorInfo[i].sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT ||
505             sensorInfo[i].sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) {
506             DISPLAY_HILOGI(FEAT_BRIGHTNESS, "AMBIENT_LIGHT Support");
507             mIsSupportLightSensor = true;
508             break;
509         }
510     }
511     if (!mIsSupportLightSensor) {
512         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "AMBIENT_LIGHT not support");
513     }
514 }
515 
AmbientLightCallback(SensorEvent * event)516 void BrightnessService::AmbientLightCallback(SensorEvent* event)
517 {
518     if (event == nullptr) {
519         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Sensor event is nullptr");
520         return;
521     }
522     if (event->sensorTypeId != SENSOR_TYPE_ID_AMBIENT_LIGHT && event->sensorTypeId != SENSOR_TYPE_ID_AMBIENT_LIGHT1) {
523         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Sensor Callback is not AMBIENT_LIGHT id=%{public}d", event->sensorTypeId);
524         return;
525     }
526     AmbientLightData* data = reinterpret_cast<AmbientLightData*>(event->data);
527     if (data == nullptr) {
528         DISPLAY_HILOGE(FEAT_BRIGHTNESS, "AmbientLightData is null");
529         return;
530     }
531     BrightnessService::Get().ProcessLightLux(data->intensity);
532 }
533 
ActivateAmbientSensor()534 void BrightnessService::ActivateAmbientSensor()
535 {
536     if (!mIsAutoBrightnessEnabled) {
537         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "auto brightness is not enabled");
538         return;
539     }
540     if (mIsLightSensorEnabled) {
541         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Ambient Sensor is already on");
542         return;
543     }
544     (void)strcpy_s(mSensorUser.name, sizeof(mSensorUser.name), "BrightnessService");
545     mSensorUser.userData = nullptr;
546     mSensorUser.callback = &AmbientLightCallback;
547     SubscribeSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser);
548     SetBatch(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser, SAMPLING_RATE, SAMPLING_RATE);
549     ActivateSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser);
550     SetMode(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser, SENSOR_ON_CHANGE);
551     mIsLightSensorEnabled = true;
552     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ActivateAmbientSensor");
553 }
554 
DeactivateAmbientSensor()555 void BrightnessService::DeactivateAmbientSensor()
556 {
557     if (!mIsAutoBrightnessEnabled) {
558         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "auto brightness is not enabled");
559         return;
560     }
561     if (!mIsLightSensorEnabled) {
562         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Ambient Sensor is already off");
563         return;
564     }
565     DeactivateSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser);
566     UnsubscribeSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT, &mSensorUser);
567     mIsLightSensorEnabled = false;
568     mLightLuxManager.ClearLuxData();
569     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DeactivateAmbientSensor");
570 }
571 
ActivateAmbientSensor1()572 void BrightnessService::ActivateAmbientSensor1()
573 {
574     if (!mIsAutoBrightnessEnabled) {
575         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "auto brightness1 is not enabled");
576         return;
577     }
578     if (mIsLightSensor1Enabled) {
579         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Ambient Sensor1 is already on");
580         return;
581     }
582     (void)strcpy_s(mSensorUser1.name, sizeof(mSensorUser1.name), "BrightnessService");
583     mSensorUser1.userData = nullptr;
584     mSensorUser1.callback = &AmbientLightCallback;
585     SubscribeSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1);
586     SetBatch(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1, SAMPLING_RATE, SAMPLING_RATE);
587     ActivateSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1);
588     SetMode(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1, SENSOR_ON_CHANGE);
589     mIsLightSensor1Enabled = true;
590     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ActivateAmbientSensor1");
591 }
592 
DeactivateAmbientSensor1()593 void BrightnessService::DeactivateAmbientSensor1()
594 {
595     if (!mIsAutoBrightnessEnabled) {
596         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "auto brightness1 is not enabled");
597         return;
598     }
599     if (!mIsLightSensor1Enabled) {
600         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Ambient Sensor1 is already off");
601         return;
602     }
603     DeactivateSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1);
604     UnsubscribeSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT1, &mSensorUser1);
605     mIsLightSensor1Enabled = false;
606     mLightLuxManager.ClearLuxData();
607     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DeactivateAmbientSensor1");
608 }
609 
ActivateValidAmbientSensor()610 void BrightnessService::ActivateValidAmbientSensor()
611 {
612     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ActivateValidAmbientSensor");
613     bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable();
614     if (!isFoldable) {
615         ActivateAmbientSensor();
616         return;
617     }
618     std::string identity = IPCSkeleton::ResetCallingIdentity();
619     auto foldMode = Rosen::DisplayManagerLite::GetInstance().GetFoldDisplayMode();
620     int sensorId = GetSensorIdWithDisplayMode(foldMode);
621     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ActivateValidAmbientSensor sensorId=%{public}d, mode=%{public}d",
622         sensorId, foldMode);
623     if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT) {
624         ActivateAmbientSensor();
625     } else if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) {
626         ActivateAmbientSensor1();
627     }
628     IPCSkeleton::SetCallingIdentity(identity);
629 }
630 
DeactivateValidAmbientSensor()631 void BrightnessService::DeactivateValidAmbientSensor()
632 {
633     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DeactivateValidAmbientSensor");
634     bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable();
635     if (!isFoldable) {
636         DeactivateAmbientSensor();
637         return;
638     }
639     std::string identity = IPCSkeleton::ResetCallingIdentity();
640     auto foldMode = Rosen::DisplayManagerLite::GetInstance().GetFoldDisplayMode();
641     int sensorId = GetSensorIdWithDisplayMode(foldMode);
642     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DeactivateValidAmbientSensor sensorId=%{public}d, mode=%{public}d",
643         sensorId, foldMode);
644     if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT) {
645         DeactivateAmbientSensor();
646     } else if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) {
647         DeactivateAmbientSensor1();
648     }
649     IPCSkeleton::SetCallingIdentity(identity);
650 }
651 
DeactivateAllAmbientSensor()652 void BrightnessService::DeactivateAllAmbientSensor()
653 {
654     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DeactivateAllAmbientSensor");
655     bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable();
656     if (!isFoldable) {
657         DeactivateAmbientSensor();
658         return;
659     }
660     DeactivateAmbientSensor();
661     DeactivateAmbientSensor1();
662 }
663 #endif
664 
IsAutoAdjustBrightness()665 bool BrightnessService::IsAutoAdjustBrightness()
666 {
667     return mIsAutoBrightnessEnabled;
668 }
669 
ProcessLightLux(float lux)670 void BrightnessService::ProcessLightLux(float lux)
671 {
672     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "ProcessLightLux, lux=%{public}f, mLightLux=%{public}f",
673         lux, mLightLuxManager.GetSmoothedLux());
674     if (!CanSetBrightness()) {
675         if (mIsLuxActiveWithLog) {
676             mIsLuxActiveWithLog = false;
677             DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ProcessLightLux:mIsLuxActiveWithLog=false");
678         }
679         return;
680     }
681     if (!mIsLuxActiveWithLog) {
682         mIsLuxActiveWithLog = true;
683         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ProcessLightLux:mIsLuxActiveWithLog=true");
684     }
685     NotifyLightChangeToAps(AMBIENT_LIGHT_TYPE, lux);
686     if (mLightLuxManager.IsNeedUpdateBrightness(lux)) {
687         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateLightLux, lux=%{public}f, mLightLux=%{public}f, isFirst=%{public}d",
688             lux, mLightLuxManager.GetSmoothedLux(), mLightLuxManager.GetIsFirstLux());
689         UpdateCurrentBrightnessLevel(lux, mLightLuxManager.GetIsFirstLux());
690     }
691 
692     for (int index = 0; index < LUX_LEVEL_LENGTH; index++) {
693         if (static_cast<uint32_t>(lux) < AMBIENT_LUX_LEVELS[index]) {
694             if (index != mLuxLevel || mLightLuxManager.GetIsFirstLux()) {
695                 mLuxLevel = index;
696                 // Notify ambient lux change event to battery statistics
697                 // type:0 auto brightness, 1 manual brightness, 2 window brightness, 3 others
698                 HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::DISPLAY, "AMBIENT_LIGHT",
699                     HiviewDFX::HiSysEvent::EventType::STATISTIC, "LEVEL", mLuxLevel, "TYPE", 0);
700             }
701             break;
702         }
703     }
704 }
705 
UpdateCurrentBrightnessLevel(float lux,bool isFastDuration)706 void BrightnessService::UpdateCurrentBrightnessLevel(float lux, bool isFastDuration)
707 {
708     uint32_t brightnessLevel = GetBrightnessLevel(lux);
709     if (mBrightnessLevel != brightnessLevel || isFastDuration) {
710         uint32_t duration = DEFAULT_BRIGHTEN_DURATION;
711         if (brightnessLevel < mBrightnessLevel) {
712             duration = DEFAULT_DARKEN_DURATION;
713         }
714         if (isFastDuration) {
715             duration = DEFAULT_ANIMATING_DURATION;
716         }
717         if (isFastDuration && mIsDisplayOnWhenFirstLuxReport) {
718             duration = 0;
719             mIsDisplayOnWhenFirstLuxReport.store(false);
720         }
721         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateCurrentBrightnessLevel lux=%{public}f, mBrightnessLevel=%{public}d, "\
722             "brightnessLevel=%{public}d, duration=%{public}d", lux, mBrightnessLevel, brightnessLevel, duration);
723         mBrightnessLevel = brightnessLevel;
724         mCurrentBrightness.store(brightnessLevel);
725         if (mWaitForFirstLux) {
726             std::lock_guard<std::mutex> lock(mFirstLuxHandleLock);
727             FFRT_CANCEL(g_waitForFirstLuxTaskHandle, queue_);
728             mWaitForFirstLux = false;
729             DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateCurrentBrightnessLevel CancelScreenOn waitforFisrtLux Task");
730         }
731         mBrightnessTarget.store(brightnessLevel);
732         SetBrightnessLevel(brightnessLevel, duration);
733     }
734 }
735 
SetBrightnessLevel(uint32_t value,uint32_t duration)736 void BrightnessService::SetBrightnessLevel(uint32_t value, uint32_t duration)
737 {
738     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetBrightnessLevel value=%{public}d, duration=%{public}d",
739         value, duration);
740     UpdateBrightness(value, duration, true);
741 }
742 
GetBrightnessLevel(float lux)743 uint32_t BrightnessService::GetBrightnessLevel(float lux)
744 {
745     uint32_t brightnessLevel = static_cast<uint32_t>(mBrightnessCalculationManager.GetInterpolatedValue(lux) *
746         MAX_DEFAULT_BRGIHTNESS_LEVEL);
747 
748     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "GetBrightnessLevel lux=%{public}f, brightnessLevel=%{public}d",
749         lux, brightnessLevel);
750     return brightnessLevel;
751 }
752 
GetBrightnessHighLevel(uint32_t level)753 uint32_t BrightnessService::GetBrightnessHighLevel(uint32_t level)
754 {
755     uint32_t brightnessHighLevel = level;
756     return level;
757 }
758 
SetBrightness(uint32_t value,uint32_t gradualDuration,bool continuous)759 bool BrightnessService::SetBrightness(uint32_t value, uint32_t gradualDuration, bool continuous)
760 {
761     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "SetBrightness val=%{public}d, duration=%{public}d", value, gradualDuration);
762     if (!CanSetBrightness()) {
763         DISPLAY_HILOGW(FEAT_BRIGHTNESS, "Cannot set brightness, ignore the change");
764         mCachedSettingBrightness = value;
765         return false;
766     }
767     if (gradualDuration == 0) {
768         bool isSettingOn = IsAutoAdjustBrightness();
769         if (isSettingOn && IsCurrentSensorEnable()) {
770             mIsUserMode = true;
771             mBrightnessCalculationManager.UpdateBrightnessOffset(value, mLightLuxManager.GetSmoothedLux());
772             DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateBrightnessOffset level=%{public}d, mLightLux=%{public}f",
773                 value, mLightLuxManager.GetSmoothedLux());
774         }
775     }
776     mBrightnessTarget.store(value);
777     mCurrentBrightness.store(value);
778     NotifyLightChangeToAps(BRIGHTNESS_TYPE, static_cast<float>(value));
779     bool isSuccess = UpdateBrightness(value, gradualDuration, !continuous);
780     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "SetBrightness val=%{public}d, isSuccess=%{public}d", value, isSuccess);
781     mIsUserMode = false;
782     return isSuccess;
783 }
784 
SetScreenOnBrightness()785 void BrightnessService::SetScreenOnBrightness()
786 {
787     uint32_t screenOnBrightness = GetScreenOnBrightness(true);
788     if (mWaitForFirstLux) {
789         std::lock_guard<std::mutex> lock(mFirstLuxHandleLock);
790         if (queue_ == nullptr) {
791             DISPLAY_HILOGW(FEAT_BRIGHTNESS, "SetScreenOnBrightness, queue is null");
792         } else {
793             DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetScreenOnBrightness waitForFirstLux");
794             FFRT_CANCEL(g_waitForFirstLuxTaskHandle, queue_);
795             screenOnBrightness = mCachedSettingBrightness;
796             DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetScreenOnBrightness waitForFirstLux,GetSettingBrightness=%{public}d",
797                 screenOnBrightness);
798             FFRTTask setBrightnessTask = [this, screenOnBrightness] {
799                 this->UpdateBrightness(screenOnBrightness, 0, true);
800             };
801             g_waitForFirstLuxTaskHandle = FFRTUtils::SubmitDelayTask(setBrightnessTask, WAIT_FOR_FIRST_LUX_MAX_TIME,
802                 queue_);
803         }
804         return;
805     }
806     bool needUpdateBrightness = true;
807     if (IsBrightnessBoosted() || IsBrightnessOverridden()) {
808         needUpdateBrightness = false;
809     }
810     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetScreenOnBrightness screenOnBrightness=%{public}d, needUpdate=%{public}d",
811         screenOnBrightness, needUpdateBrightness);
812     UpdateBrightness(screenOnBrightness, 0, needUpdateBrightness);
813 }
814 
ClearOffset()815 void BrightnessService::ClearOffset()
816 {
817     if (mDimming->IsDimming()) {
818         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "mode off StopDimming");
819         mDimming->StopDimming();
820     }
821     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ClearOffset mLightLux=%{public}f", mLightLuxManager.GetSmoothedLux());
822     mBrightnessTarget.store(0);
823     mBrightnessCalculationManager.UpdateBrightnessOffset(0, mLightLuxManager.GetSmoothedLux());
824 }
825 
GetBrightness()826 uint32_t BrightnessService::GetBrightness()
827 {
828     return GetSettingBrightness();
829 }
830 
GetDeviceBrightness()831 uint32_t BrightnessService::GetDeviceBrightness()
832 {
833     uint32_t brightness = DEFAULT_BRIGHTNESS;
834     if (mAction != nullptr) {
835         brightness = mAction->GetBrightness();
836     }
837     return GetOrigBrightnessLevel(brightness);
838 }
839 
GetCachedSettingBrightness()840 uint32_t BrightnessService::GetCachedSettingBrightness()
841 {
842     return mCachedSettingBrightness;
843 }
844 
DiscountBrightness(double discount,uint32_t gradualDuration)845 bool BrightnessService::DiscountBrightness(double discount, uint32_t gradualDuration)
846 {
847     if (!CanDiscountBrightness()) {
848         DISPLAY_HILOGW(FEAT_BRIGHTNESS, "Cannot discount brightness, ignore the change");
849         return false;
850     }
851     auto safeDiscount = discount;
852     if (safeDiscount > DISCOUNT_MAX) {
853         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "discount value is greater than max, discount=%{public}lf", discount);
854         safeDiscount = DISCOUNT_MAX;
855     }
856     if (safeDiscount < DISCOUNT_MIN) {
857         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "discount value is less than min, discount=%{public}lf", discount);
858         safeDiscount = DISCOUNT_MIN;
859     }
860     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Discount brightness, safeDiscount=%{public}lf", safeDiscount);
861     mDiscount = safeDiscount;
862     if (mDimmingCallback) {
863         mDimmingCallback->DiscountBrightness(safeDiscount);
864     }
865     uint32_t screenOnBrightness = GetScreenOnBrightness(false);
866     return UpdateBrightness(screenOnBrightness, gradualDuration);
867 }
868 
SetSleepBrightness()869 void BrightnessService::SetSleepBrightness()
870 {
871     uint32_t value = GetSettingBrightness();
872     if (value <= MIN_DEFAULT_BRGIHTNESS_LEVEL) {
873         return;
874     }
875     uint32_t sleepBrightness = BrightnessParamHelper::GetSleepBrightness();
876     uint32_t sleepMinumumReductionBrightness = BrightnessParamHelper::GetSleepMinumumReductionBrightness();
877     if (value < sleepMinumumReductionBrightness) {
878         value = sleepMinumumReductionBrightness;
879     }
880     uint32_t enterSleepBrightness = std::max(std::min(value - sleepMinumumReductionBrightness, sleepBrightness),
881         MIN_DEFAULT_BRGIHTNESS_LEVEL);
882     uint32_t sleepDarkenTime = BrightnessParamHelper::GetSleepDarkenTime();
883     mIsSleepStatus = true;
884     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetSleepBrightness enterSleepBrightness=%{pulblic}d, sleepDarkenTime=%{public}d",
885         enterSleepBrightness, sleepDarkenTime);
886     OverrideBrightness(enterSleepBrightness, sleepDarkenTime);
887 }
888 
OverrideBrightness(uint32_t value,uint32_t gradualDuration)889 bool BrightnessService::OverrideBrightness(uint32_t value, uint32_t gradualDuration)
890 {
891     if (!CanOverrideBrightness()) {
892         DISPLAY_HILOGW(FEAT_BRIGHTNESS, "Cannot override brightness, ignore the change");
893         return false;
894     }
895     if (!mIsBrightnessOverridden) {
896         mIsBrightnessOverridden = true;
897     }
898     mOverriddenBrightness = value;
899     mBeforeOverriddenBrightness = GetSettingBrightness();
900     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Override brightness, value=%{public}u, mBeforeOverriddenBrightness=%{public}d",
901         value, mBeforeOverriddenBrightness);
902     return UpdateBrightness(value, gradualDuration);
903 }
904 
RestoreBrightness(uint32_t gradualDuration)905 bool BrightnessService::RestoreBrightness(uint32_t gradualDuration)
906 {
907     if (!IsBrightnessOverridden()) {
908         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Brightness is not override, no need to restore");
909         return false;
910     }
911     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "restore brightness=%{public}d", mBeforeOverriddenBrightness);
912     mIsBrightnessOverridden = false;
913     return UpdateBrightness(mBeforeOverriddenBrightness, gradualDuration, true);
914 }
915 
IsBrightnessOverridden()916 bool BrightnessService::IsBrightnessOverridden()
917 {
918     return mIsBrightnessOverridden;
919 }
920 
BoostBrightness(uint32_t timeoutMs,uint32_t gradualDuration)921 bool BrightnessService::BoostBrightness(uint32_t timeoutMs, uint32_t gradualDuration)
922 {
923     if (!CanBoostBrightness()) {
924         DISPLAY_HILOGW(FEAT_BRIGHTNESS, "Cannot boost brightness, ignore the change");
925         return false;
926     }
927     bool isSuccess = true;
928     if (!mIsBrightnessBoosted) {
929         uint32_t maxBrightness = BrightnessParamHelper::GetMaxBrightness();
930         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Boost brightness, maxBrightness: %{public}d", maxBrightness);
931         mIsBrightnessBoosted = true;
932         isSuccess = UpdateBrightness(maxBrightness, gradualDuration);
933     }
934 
935     // If boost multi-times, we will resend the cancel boost event.
936     FFRT_CANCEL(g_cancelBoostTaskHandle, queue_);
937     FFRTTask task = [this, gradualDuration] { this->CancelBoostBrightness(gradualDuration); };
938     g_cancelBoostTaskHandle = FFRTUtils::SubmitDelayTask(task, timeoutMs, queue_);
939     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "BoostBrightness update timeout=%{public}u, isSuccess=%{public}d", timeoutMs,
940         isSuccess);
941     return isSuccess;
942 }
943 
CancelBoostBrightness(uint32_t gradualDuration)944 bool BrightnessService::CancelBoostBrightness(uint32_t gradualDuration)
945 {
946     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Cancel boost brightness");
947     if (!IsBrightnessBoosted()) {
948         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Brightness is not boost, no need to restore");
949         return false;
950     }
951     mBoostHandleLock.lock();
952     FFRT_CANCEL(g_cancelBoostTaskHandle, queue_);
953     mBoostHandleLock.unlock();
954     mIsBrightnessBoosted = false;
955     return UpdateBrightness(mCachedSettingBrightness, gradualDuration, true);
956 }
957 
IsBrightnessBoosted()958 bool BrightnessService::IsBrightnessBoosted()
959 {
960     return mIsBrightnessBoosted;
961 }
962 
IsScreenOn()963 bool BrightnessService::IsScreenOn()
964 {
965     return (mState == DisplayState::DISPLAY_ON || mState == DisplayState::DISPLAY_DIM);
966 }
967 
CanSetBrightness()968 bool BrightnessService::CanSetBrightness()
969 {
970     bool isScreenOn = IsScreenOn();
971     bool isOverridden = IsBrightnessOverridden();
972     bool isBoosted = IsBrightnessBoosted();
973     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "isScreenOn: %{public}d, isOverridden: %{public}d, isBoosted: %{public}d",
974         isScreenOn, isOverridden, isBoosted);
975     return isScreenOn && !isOverridden && !isBoosted;
976 }
977 
CanDiscountBrightness()978 bool BrightnessService::CanDiscountBrightness()
979 {
980     return IsScreenOn();
981 }
982 
CanOverrideBrightness()983 bool BrightnessService::CanOverrideBrightness()
984 {
985     return IsScreenOn() && !IsBrightnessBoosted();
986 }
987 
CanBoostBrightness()988 bool BrightnessService::CanBoostBrightness()
989 {
990     return IsScreenOn() && !IsBrightnessOverridden();
991 }
992 
UpdateBrightness(uint32_t value,uint32_t gradualDuration,bool updateSetting)993 bool BrightnessService::UpdateBrightness(uint32_t value, uint32_t gradualDuration, bool updateSetting)
994 {
995     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "UpdateBrightness, value=%{public}u, discount=%{public}f,"\
996         "duration=%{public}u, updateSetting=%{public}d", value, mDiscount, gradualDuration, updateSetting);
997     mWaitForFirstLux = false;
998     auto safeBrightness = GetSafeBrightness(value);
999     if (mDimming->IsDimming()) {
1000         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateBrightness StopDimming");
1001         mDimming->StopDimming();
1002     }
1003     auto brightness = static_cast<uint32_t>(safeBrightness * mDiscount);
1004     brightness = GetMappingBrightnessLevel(brightness);
1005     if (gradualDuration > 0) {
1006         mDimming->StartDimming(GetSettingBrightness(), brightness, gradualDuration);
1007         return true;
1008     }
1009     bool isSuccess = mAction->SetBrightness(brightness);
1010     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "UpdateBrightness is %{public}s, brightness: %{public}u",
1011         isSuccess ? "succ" : "failed", brightness);
1012     if (isSuccess && updateSetting) {
1013         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateBrightness, settings, value=%{public}u", safeBrightness);
1014         FFRTUtils::SubmitTask([this, safeBrightness] { this->SetSettingBrightness(safeBrightness); });
1015     }
1016     if (isSuccess) {
1017         ReportBrightnessBigData(brightness);
1018     }
1019     return isSuccess;
1020 }
1021 
GetSettingBrightness(const std::string & key)1022 uint32_t BrightnessService::GetSettingBrightness(const std::string& key)
1023 {
1024     uint32_t settingBrightness = DEFAULT_BRIGHTNESS;
1025     auto isSuccess = BrightnessSettingHelper::GetSettingBrightness(settingBrightness, key);
1026     if (isSuccess != ERR_OK) {
1027         DISPLAY_HILOGW(FEAT_BRIGHTNESS,
1028             "get setting brightness failed, return default=%{public}d, key=%{public}s, ret=%{public}d",
1029             settingBrightness, key.c_str(), isSuccess);
1030     }
1031     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "GetSettingBrightness=%{public}d", settingBrightness);
1032     return settingBrightness;
1033 }
1034 
SetSettingBrightness(uint32_t value)1035 void BrightnessService::SetSettingBrightness(uint32_t value)
1036 {
1037     BrightnessSettingHelper::SetSettingBrightness(value);
1038     mBrightnessLevel = value;
1039     mCachedSettingBrightness = value;
1040     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetSettingBrightness brightness=%{public}u", value);
1041 }
1042 
GetScreenOnBrightness(bool isUpdateTarget)1043 uint32_t BrightnessService::GetScreenOnBrightness(bool isUpdateTarget)
1044 {
1045     uint32_t screenOnbrightness;
1046     if (IsBrightnessBoosted()) {
1047         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Brightness is boosted, return max brightness");
1048         screenOnbrightness = BrightnessParamHelper::GetMaxBrightness();
1049     } else if (IsBrightnessOverridden()) {
1050         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Brightness is overridden, return overridden brightness=%{public}u",
1051             mOverriddenBrightness);
1052         screenOnbrightness = mOverriddenBrightness;
1053     } else if (isUpdateTarget && mIsAutoBrightnessEnabled) {
1054         if (mBrightnessTarget.load() > 0) {
1055             DISPLAY_HILOGI(FEAT_BRIGHTNESS, "update, return mBrightnessTarget=%{public}d", mBrightnessTarget.load());
1056             screenOnbrightness = mBrightnessTarget.load();
1057         } else {
1058             screenOnbrightness = 0;
1059             mWaitForFirstLux = true;
1060         }
1061     } else {
1062         screenOnbrightness = GetSettingBrightness();
1063     }
1064     return screenOnbrightness;
1065 }
1066 
RegisterSettingBrightnessObserver()1067 void BrightnessService::RegisterSettingBrightnessObserver()
1068 {
1069 }
1070 
UpdateBrightnessSettingFunc(const std::string & key)1071 void BrightnessService::UpdateBrightnessSettingFunc(const std::string& key)
1072 {
1073 }
1074 
UnregisterSettingBrightnessObserver()1075 void BrightnessService::UnregisterSettingBrightnessObserver()
1076 {
1077     BrightnessSettingHelper::UnregisterSettingBrightnessObserver();
1078 }
1079 
GetDiscount() const1080 double BrightnessService::GetDiscount() const
1081 {
1082     return mDiscount;
1083 }
1084 
GetDimmingUpdateTime() const1085 uint32_t BrightnessService::GetDimmingUpdateTime() const
1086 {
1087     return mDimming->GetDimmingUpdateTime();
1088 }
1089 
GetMappingBrightnessLevel(uint32_t level)1090 uint32_t BrightnessService::GetMappingBrightnessLevel(uint32_t level)
1091 {
1092     if (level < MIN_DEFAULT_BRGIHTNESS_LEVEL) {
1093         level = MIN_DEFAULT_BRGIHTNESS_LEVEL;
1094     }
1095     if (level > MAX_DEFAULT_BRGIHTNESS_LEVEL) {
1096         level = MAX_DEFAULT_BRGIHTNESS_LEVEL;
1097     }
1098     float levelOut = static_cast<float>(1.0f * (level - MIN_DEFAULT_BRGIHTNESS_LEVEL)
1099          * (MAX_MAPPING_BRGIHTNESS_LEVEL - MIN_MAPPING_BRGIHTNESS_LEVEL)
1100          / (MAX_DEFAULT_BRGIHTNESS_LEVEL - MIN_DEFAULT_BRGIHTNESS_LEVEL)) + MIN_MAPPING_BRGIHTNESS_LEVEL + 0.5f;
1101     if (static_cast<uint32_t>(levelOut) < BrightnessParamHelper::GetMinBrightness()) {
1102         return BrightnessParamHelper::GetMinBrightness();
1103     }
1104     return static_cast<uint32_t>(levelOut);
1105 }
1106 
GetOrigBrightnessLevel(uint32_t level)1107 uint32_t BrightnessService::GetOrigBrightnessLevel(uint32_t level)
1108 {
1109     if (level < MIN_MAPPING_BRGIHTNESS_LEVEL) {
1110         level = MIN_MAPPING_BRGIHTNESS_LEVEL;
1111     }
1112     if (level > MAX_MAPPING_BRGIHTNESS_LEVEL) {
1113         level = MAX_MAPPING_BRGIHTNESS_LEVEL;
1114     }
1115     float levelOut = static_cast<float>(1.0f * (level - MIN_MAPPING_BRGIHTNESS_LEVEL)
1116         * (MAX_DEFAULT_BRGIHTNESS_LEVEL - MIN_DEFAULT_BRGIHTNESS_LEVEL)
1117          / (MAX_MAPPING_BRGIHTNESS_LEVEL - MIN_MAPPING_BRGIHTNESS_LEVEL) + MIN_MAPPING_BRGIHTNESS_LEVEL + 0.5f);
1118     return static_cast<int>(levelOut);
1119 }
1120 
GetMappingBrightnessNit(uint32_t level)1121 uint32_t BrightnessService::GetMappingBrightnessNit(uint32_t level)
1122 {
1123     uint32_t levelIn = level;
1124     if (levelIn < MIN_MAPPING_BRGIHTNESS_LEVEL) {
1125         levelIn = MIN_MAPPING_BRGIHTNESS_LEVEL;
1126     }
1127     if (levelIn > MAX_MAPPING_BRGIHTNESS_LEVEL) {
1128         levelIn = MAX_MAPPING_BRGIHTNESS_LEVEL;
1129     }
1130     double nitOut = (double)(levelIn - MIN_MAPPING_BRGIHTNESS_LEVEL)
1131         * (MAX_DEFAULT_BRGIHTNESS_NIT - MIN_DEFAULT_BRGIHTNESS_NIT)
1132          / (MAX_MAPPING_BRGIHTNESS_LEVEL - MIN_MAPPING_BRGIHTNESS_LEVEL) + MIN_DEFAULT_BRGIHTNESS_NIT;
1133     return round(nitOut);
1134 }
1135 
GetBrightnessLevelFromNit(uint32_t nit)1136 uint32_t BrightnessService::GetBrightnessLevelFromNit(uint32_t nit)
1137 {
1138     uint32_t nitIn = nit;
1139     if (nitIn < MIN_DEFAULT_BRGIHTNESS_NIT) {
1140         nitIn = MIN_DEFAULT_BRGIHTNESS_NIT;
1141     }
1142     if (nitIn > MAX_DEFAULT_BRGIHTNESS_NIT) {
1143         nitIn = MAX_DEFAULT_BRGIHTNESS_NIT;
1144     }
1145     double levelOut = (double)(nitIn - MIN_DEFAULT_BRGIHTNESS_NIT)
1146         * (MAX_DEFAULT_BRGIHTNESS_LEVEL - MIN_DEFAULT_BRGIHTNESS_LEVEL)
1147          / (MAX_DEFAULT_BRGIHTNESS_NIT - MIN_DEFAULT_BRGIHTNESS_NIT) + MIN_DEFAULT_BRGIHTNESS_LEVEL;
1148     return round(levelOut);
1149 }
1150 
GetMappingHighBrightnessLevel(uint32_t level)1151 uint32_t BrightnessService::GetMappingHighBrightnessLevel(uint32_t level)
1152 {
1153     uint32_t levelIn = level;
1154     if (levelIn < MIN_DEFAULT_BRGIHTNESS_LEVEL) {
1155         levelIn = MIN_DEFAULT_BRGIHTNESS_LEVEL;
1156     }
1157     if (levelIn > MAX_DEFAULT_BRGIHTNESS_LEVEL) {
1158         levelIn = MAX_DEFAULT_BRGIHTNESS_LEVEL;
1159     }
1160     uint32_t levelOut = (levelIn - MIN_DEFAULT_BRGIHTNESS_LEVEL)
1161          * (MAX_DEFAULT_HIGH_BRGIHTNESS_LEVEL - MIN_DEFAULT_HIGH_BRGIHTNESS_LEVEL)
1162          / (MAX_DEFAULT_BRGIHTNESS_LEVEL - MIN_DEFAULT_BRGIHTNESS_LEVEL) + MIN_DEFAULT_HIGH_BRGIHTNESS_LEVEL;
1163     return levelOut;
1164 }
1165 
UpdateBrightnessSceneMode(BrightnessSceneMode mode)1166 void BrightnessService::UpdateBrightnessSceneMode(BrightnessSceneMode mode)
1167 {
1168 }
1169 
IsDimming()1170 bool BrightnessService::IsDimming()
1171 {
1172     if (mDimming == nullptr) {
1173         return false;
1174     }
1175     return mDimming->IsDimming();
1176 }
1177 
GetReason()1178 std::string BrightnessService::GetReason()
1179 {
1180     if (mIsBrightnessOverridden) {
1181         return "APP";
1182     }
1183     if (mIsUserMode) {
1184         return "USER";
1185     }
1186     if (mIsAutoBrightnessEnabled) {
1187         return "AUTO";
1188     }
1189     return "MANUAL";
1190 }
1191 
ReportBrightnessBigData(uint32_t brightness)1192 void BrightnessService::ReportBrightnessBigData(uint32_t brightness)
1193 {
1194     std::string reason = GetReason();
1195     uint32_t nit = GetMappingBrightnessNit(brightness);
1196     // Notify screen brightness change event to battery statistics
1197     HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::DISPLAY, "BRIGHTNESS_NIT",
1198         HiviewDFX::HiSysEvent::EventType::STATISTIC, "BRIGHTNESS", brightness, "REASON", reason, "NIT", nit);
1199     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "BigData brightness=%{public}d,reason=%{public}s,nit=%{public}d",
1200         brightness, reason.c_str(), nit);
1201 }
1202 
IsSleepStatus()1203 bool BrightnessService::IsSleepStatus()
1204 {
1205     return mIsSleepStatus;
1206 }
1207 
GetIsSupportLightSensor()1208 bool BrightnessService::GetIsSupportLightSensor()
1209 {
1210     return mIsSupportLightSensor;
1211 }
1212 
IsCurrentSensorEnable()1213 bool BrightnessService::IsCurrentSensorEnable()
1214 {
1215     bool isFoldable = Rosen::DisplayManagerLite::GetInstance().IsFoldable();
1216     if (!isFoldable) {
1217         return mIsLightSensorEnabled;
1218     }
1219     bool result = false;
1220     std::string identity = IPCSkeleton::ResetCallingIdentity();
1221     auto foldMode = Rosen::DisplayManagerLite::GetInstance().GetFoldDisplayMode();
1222     int sensorId = GetSensorIdWithDisplayMode(foldMode);
1223     if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT) {
1224         result = mIsLightSensorEnabled;
1225     } else if (sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT1) {
1226         result = mIsLightSensor1Enabled;
1227     }
1228     IPCSkeleton::SetCallingIdentity(identity);
1229     return result;
1230 }
1231 
GetDisplayIdWithFoldstatus(Rosen::FoldStatus foldStatus)1232 int BrightnessService::GetDisplayIdWithFoldstatus(Rosen::FoldStatus foldStatus)
1233 {
1234     return mBrightnessCalculationManager.GetDisplayIdWithFoldstatus(static_cast<int>(foldStatus));
1235 }
1236 
GetSensorIdWithFoldstatus(Rosen::FoldStatus foldStatus)1237 int BrightnessService::GetSensorIdWithFoldstatus(Rosen::FoldStatus foldStatus)
1238 {
1239     return mBrightnessCalculationManager.GetSensorIdWithFoldstatus(static_cast<int>(foldStatus));
1240 }
1241 
GetDisplayIdWithDisplayMode(Rosen::FoldDisplayMode mode)1242 int BrightnessService::GetDisplayIdWithDisplayMode(Rosen::FoldDisplayMode mode)
1243 {
1244     return mBrightnessCalculationManager.GetDisplayIdWithDisplayMode(static_cast<int>(mode));
1245 }
1246 
GetSensorIdWithDisplayMode(Rosen::FoldDisplayMode mode)1247 int BrightnessService::GetSensorIdWithDisplayMode(Rosen::FoldDisplayMode mode)
1248 {
1249     return mBrightnessCalculationManager.GetSensorIdWithDisplayMode(static_cast<int>(mode));
1250 }
1251 
SetMaxBrightness(double value)1252 bool BrightnessService::SetMaxBrightness(double value)
1253 {
1254     int32_t intMaxValue = round(value * MAX_DEFAULT_BRGIHTNESS_LEVEL);
1255     if (intMaxValue <= 0) {
1256         intMaxValue = brightnessValueMin;
1257     }
1258     if (intMaxValue == brightnessValueMax) {
1259         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightness value=oldMax");
1260         return true;
1261     }
1262     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightness value=%{public}u, oldMax=%{public}u",
1263         intMaxValue, brightnessValueMax);
1264     brightnessValueMax =
1265         (intMaxValue > MAX_DEFAULT_BRGIHTNESS_LEVEL ? MAX_DEFAULT_BRGIHTNESS_LEVEL : intMaxValue);
1266     uint32_t currentBrightness = GetSettingBrightness();
1267     if (brightnessValueMax < currentBrightness) {
1268         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightness currentBrightness=%{public}u", currentBrightness);
1269         return UpdateBrightness(brightnessValueMax, DEFAULT_MAX_BRIGHTNESS_DURATION, true);
1270     }
1271     if (mCurrentBrightness.load() == 0) {
1272         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "No need to update brightne during init");
1273         return true;
1274     }
1275     return UpdateBrightness(mCurrentBrightness.load(), DEFAULT_MAX_BRIGHTNESS_DURATION, true);
1276 }
1277 
SetMaxBrightnessNit(uint32_t maxNit)1278 bool BrightnessService::SetMaxBrightnessNit(uint32_t maxNit)
1279 {
1280     uint32_t max_value = GetBrightnessLevelFromNit(maxNit);
1281     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightnessNit nitIn=%{public}u, levelOut=%{public}u",
1282         maxNit, max_value);
1283     if (max_value == brightnessValueMax) {
1284         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightness value=oldMax");
1285         return true;
1286     }
1287     brightnessValueMax =
1288         (max_value > MAX_DEFAULT_BRGIHTNESS_LEVEL ? MAX_DEFAULT_BRGIHTNESS_LEVEL : max_value);
1289     uint32_t currentBrightness = GetSettingBrightness();
1290     if (brightnessValueMax < currentBrightness) {
1291         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetMaxBrightnessNit currentBrightness=%{public}u", currentBrightness);
1292         return UpdateBrightness(brightnessValueMax, DEFAULT_MAX_BRIGHTNESS_DURATION, true);
1293     }
1294     if (mCurrentBrightness.load() == 0) {
1295         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "No need to update brightne during init");
1296         return true;
1297     }
1298     return UpdateBrightness(mCurrentBrightness.load(), DEFAULT_MAX_BRIGHTNESS_DURATION, true);
1299 }
1300 
GetSafeBrightness(uint32_t value)1301 uint32_t BrightnessService::GetSafeBrightness(uint32_t value)
1302 {
1303     auto brightnessValue = value;
1304     if (brightnessValue > brightnessValueMax) {
1305         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "value is bigger than max=%{public}u, value=%{public}u",
1306             brightnessValueMax, value);
1307         brightnessValue = brightnessValueMax;
1308     }
1309     if (brightnessValue < brightnessValueMin) {
1310         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "brightness value is less than min, value=%{public}u", value);
1311         brightnessValue = brightnessValueMin;
1312     }
1313     return brightnessValue;
1314 }
1315 } // namespace DisplayPowerMgr
1316 } // namespace OHOS
1317