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