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