• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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 "display_power_mgr_service.h"
17 
18 #include <hisysevent.h>
19 #include <file_ex.h>
20 #include <securec.h>
21 #include <system_ability_definition.h>
22 #include "errors.h"
23 #include "new"
24 #include "screen_action.h"
25 #ifdef ENABLE_SENSOR_PART
26 #include "sensor_agent.h"
27 #endif
28 #include "xcollie/watchdog.h"
29 #include "display_log.h"
30 #include "display_auto_brightness.h"
31 #include "display_setting_helper.h"
32 #include "display_param_helper.h"
33 #include "permission.h"
34 #include "setting_provider.h"
35 #include "ffrt_utils.h"
36 
37 namespace OHOS {
38 namespace DisplayPowerMgr {
39 using namespace OHOS::PowerMgr;
40 namespace {
41 DisplayParamHelper::BootCompletedCallback g_bootCompletedCallback;
42 FFRTHandle g_screenOffDelayTaskHandle;
43 const uint32_t GET_DISPLAY_ID_DELAY_MS = 50;
44 const uint32_t GET_DISPLAY_ID_RETRY_COUNT = 3;
45 const uint32_t DEFALUT_DISPLAY_ID = 0;
46 uint32_t g_getDisplayIdRetryCount = 0;
47 }
48 
49 const uint32_t DisplayPowerMgrService::BRIGHTNESS_MIN = DisplayParamHelper::GetMinBrightness();
50 const uint32_t DisplayPowerMgrService::BRIGHTNESS_DEFAULT = DisplayParamHelper::GetDefaultBrightness();
51 const uint32_t DisplayPowerMgrService::BRIGHTNESS_MAX = DisplayParamHelper::GetMaxBrightness();
52 std::atomic_bool DisplayPowerMgrService::isBootCompleted_ = false;
53 DisplayPowerMgrService::DisplayPowerMgrService() = default;
54 
Init()55 void DisplayPowerMgrService::Init()
56 {
57     queue_ = std::make_shared<FFRTQueue> ("display_power_mgr_service");
58     if (queue_ == nullptr) {
59         return;
60     }
61     DISPLAY_HILOGI(COMP_SVC, "DisplayPowerMgrService Create");
62     std::vector<uint32_t> displayIds = ScreenAction::GetAllDisplayId();
63     uint32_t retryCount = GET_DISPLAY_ID_RETRY_COUNT;
64     if (displayIds.empty()) {
65         if (g_getDisplayIdRetryCount < GET_DISPLAY_ID_RETRY_COUNT) {
66             DISPLAY_HILOGI(COMP_SVC, "cannot find any display id, retry!");
67             g_getDisplayIdRetryCount++;
68             FFRTTask task = [this]() { Init(); };
69             FFRTUtils::SubmitDelayTask(task, GET_DISPLAY_ID_DELAY_MS, queue_);
70             return;
71         }
72     }
73     for (const auto& id: displayIds) {
74         DISPLAY_HILOGI(COMP_SVC, "find display, id=%{public}u", id);
75         controllerMap_.emplace(id, std::make_shared<ScreenController>(id));
76     }
77 
78     callback_ = nullptr;
79     cbDeathRecipient_ = nullptr;
80 #ifdef ENABLE_SENSOR_PART
81     InitSensors();
82 #endif
83     BrightnessManager::Get().Init();
84     RegisterBootCompletedCallback();
85 }
RegisterBootCompletedCallback()86 void DisplayPowerMgrService::RegisterBootCompletedCallback()
87 {
88     g_bootCompletedCallback = []() {
89         SetBootCompletedBrightness();
90         SetBootCompletedAutoBrightness();
91         RegisterSettingObservers();
92         isBootCompleted_ = true;
93     };
94     DisplayParamHelper::RegisterBootCompletedCallback(g_bootCompletedCallback);
95 }
96 
Deinit()97 void DisplayPowerMgrService::Deinit()
98 {
99     UnregisterSettingObservers();
100     BrightnessManager::Get().DeInit();
101     isBootCompleted_ = false;
102 }
103 
Reset()104 void DisplayPowerMgrService::Reset()
105 {
106     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "reset begin");
107     if (queue_) {
108         queue_.reset();
109         g_screenOffDelayTaskHandle = nullptr;
110         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "destruct display_power_queue");
111     }
112     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "reset end");
113 }
114 
SetBootCompletedBrightness()115 void DisplayPowerMgrService::SetBootCompletedBrightness()
116 {
117     uint32_t mainDisplayId = DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->GetMainDisplayId();
118     uint32_t brightness = DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->GetBrightness(mainDisplayId);
119     uint32_t currentDisplayId = BrightnessManager::Get().GetCurrentDisplayId();
120     BrightnessManager::Get().SetDisplayId(currentDisplayId);
121     DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->SetBrightness(brightness, mainDisplayId);
122     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetBootCompletedBrightness currentDisplayId=%{public}d", currentDisplayId);
123 }
124 
SetBootCompletedAutoBrightness()125 void DisplayPowerMgrService::SetBootCompletedAutoBrightness()
126 {
127     bool enable = GetSettingAutoBrightness();
128     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetBootCompletedAutoBrightness enable=%{public}d", enable);
129     DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->AutoAdjustBrightness(enable);
130     BrightnessManager::Get().AutoAdjustBrightness(enable);
131 }
132 
RegisterSettingObservers()133 void DisplayPowerMgrService::RegisterSettingObservers()
134 {
135     uint32_t mainDisplayId = DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->GetMainDisplayId();
136     auto controllerMap = DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->controllerMap_;
137     auto iter = controllerMap.find(mainDisplayId);
138     if (iter != controllerMap.end()) {
139         iter->second->RegisterSettingBrightnessObserver();
140     }
141     RegisterSettingAutoBrightnessObserver();
142 }
143 
UnregisterSettingObservers()144 void DisplayPowerMgrService::UnregisterSettingObservers()
145 {
146     uint32_t mainDisplayId = DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->GetMainDisplayId();
147     auto controllerMap = DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->controllerMap_;
148     auto iter = controllerMap.find(mainDisplayId);
149     if (iter != controllerMap.end()) {
150         iter->second->UnregisterSettingBrightnessObserver();
151     }
152     UnregisterSettingAutoBrightnessObserver();
153 }
154 
RegisterSettingAutoBrightnessObserver()155 void DisplayPowerMgrService::RegisterSettingAutoBrightnessObserver()
156 {
157     SettingObserver::UpdateFunc updateFunc = [&](const std::string& key) { AutoBrightnessSettingUpdateFunc(key); };
158     DisplaySettingHelper::RegisterSettingAutoBrightnessObserver(updateFunc);
159 }
160 
AutoBrightnessSettingUpdateFunc(const std::string & key)161 void DisplayPowerMgrService::AutoBrightnessSettingUpdateFunc(const std::string& key)
162 {
163     bool isSettingEnable = GetSettingAutoBrightness(key);
164     bool isSystemEnable = DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->IsAutoAdjustBrightness();
165     if (isSettingEnable == isSystemEnable) {
166         return;
167     }
168     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "AutoBrightnessSettingUpdateFunc isSettingEnable=%{public}d", isSettingEnable);
169     BrightnessManager::Get().AutoAdjustBrightness(isSettingEnable);
170     DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->AutoAdjustBrightness(isSettingEnable);
171     if (!isSettingEnable) {
172         DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->ClearOffset();
173     }
174 }
175 
SetScreenOnBrightness()176 void DisplayPowerMgrService::SetScreenOnBrightness()
177 {
178     BrightnessManager::Get().SetScreenOnBrightness();
179 }
180 
ClearOffset()181 void DisplayPowerMgrService::ClearOffset()
182 {
183     BrightnessManager::Get().ClearOffset();
184 }
185 
SetSettingAutoBrightness(bool enable)186 void DisplayPowerMgrService::SetSettingAutoBrightness(bool enable)
187 {
188     DisplaySettingHelper::SetSettingAutoBrightness(enable);
189 }
190 
GetSettingAutoBrightness(const std::string & key)191 bool DisplayPowerMgrService::GetSettingAutoBrightness(const std::string& key)
192 {
193     return DisplaySettingHelper::GetSettingAutoBrightness(key);
194 }
ScreenOffDelay(uint32_t id,DisplayState state,uint32_t reason)195 void DisplayPowerMgrService::ScreenOffDelay(uint32_t id, DisplayState state, uint32_t reason)
196 {
197     isDisplayDelayOff_ = false;
198     DISPLAY_HILOGI(COMP_SVC, "ScreenOffDelay %{public}d, %{public}d,  %{public}d", id, state, reason);
199     auto iterator = controllerMap_.find(id);
200     if (iterator == controllerMap_.end()) {
201         return;
202     }
203     setDisplayStateRet_ = iterator->second->UpdateState(state, reason);
204 }
205 
UnregisterSettingAutoBrightnessObserver()206 void DisplayPowerMgrService::UnregisterSettingAutoBrightnessObserver()
207 {
208     DisplaySettingHelper::UnregisterSettingAutoBrightnessObserver();
209 }
210 
SetDisplayState(uint32_t id,DisplayState state,uint32_t reason)211 bool DisplayPowerMgrService::SetDisplayState(uint32_t id, DisplayState state, uint32_t reason)
212 {
213     if (!Permission::IsSystem()) {
214         return false;
215     }
216     DISPLAY_HILOGI(COMP_SVC, "SetDisplayState %{public}d, %{public}d", id, state);
217     auto iterator = controllerMap_.find(id);
218     if (iterator == controllerMap_.end()) {
219         if (id != DEFALUT_DISPLAY_ID) {
220             return false;
221         }
222         id = GetMainDisplayId();
223         iterator = controllerMap_.find(id);
224         if (iterator == controllerMap_.end()) {
225             return false;
226         }
227     }
228 
229     if (id == GetMainDisplayId()) {
230         BrightnessManager::Get().SetDisplayState(id, state);
231     }
232 
233     if (state == DisplayState::DISPLAY_OFF) {
234         if (!isDisplayDelayOff_) {
235             DISPLAY_HILOGI(COMP_SVC, "screen off immediately");
236             return iterator->second->UpdateState(state, reason);
237         }
238         displayId_ = id;
239         displayState_ = state;
240         displayReason_ = reason;
241         FFRTTask task = [this]() { ScreenOffDelay(displayId_, displayState_, displayReason_); };
242         g_screenOffDelayTaskHandle = FFRTUtils::SubmitDelayTask(task, displayOffDelayMs_, queue_);
243         tempState_ = iterator->second->SetDelayOffState();
244         return true;
245     } else if (state == DisplayState::DISPLAY_ON) {
246         if (isDisplayDelayOff_) {
247             DISPLAY_HILOGI(COMP_SVC, "need remove delay task");
248             FFRTUtils::CancelTask(g_screenOffDelayTaskHandle, queue_);
249             isDisplayDelayOff_ = false;
250             tempState_ = iterator->second->SetOnState();
251             return true;
252         }
253     }
254     return iterator->second->UpdateState(state, reason);
255 }
256 
GetDisplayState(uint32_t id)257 DisplayState DisplayPowerMgrService::GetDisplayState(uint32_t id)
258 {
259     DISPLAY_HILOGD(COMP_SVC, "GetDisplayState %{public}d", id);
260     auto iterator = controllerMap_.find(id);
261     if (iterator == controllerMap_.end()) {
262         if (id != DEFALUT_DISPLAY_ID) {
263             return DisplayState::DISPLAY_UNKNOWN;
264         }
265         id = GetMainDisplayId();
266         iterator = controllerMap_.find(id);
267         if (iterator == controllerMap_.end()) {
268             return DisplayState::DISPLAY_UNKNOWN;
269         }
270     }
271     return iterator->second->GetState();
272 }
273 
GetDisplayIds()274 std::vector<uint32_t> DisplayPowerMgrService::GetDisplayIds()
275 {
276     std::vector<uint32_t> ids;
277     for (auto& iter: controllerMap_) {
278         ids.push_back(iter.first);
279     }
280     return ids;
281 }
282 
GetMainDisplayId()283 uint32_t DisplayPowerMgrService::GetMainDisplayId()
284 {
285     uint32_t id = ScreenAction::GetDefaultDisplayId();
286     DISPLAY_HILOGD(COMP_SVC, "GetMainDisplayId %{public}d", id);
287     return id;
288 }
289 
SetBrightness(uint32_t value,uint32_t displayId,bool continuous)290 bool DisplayPowerMgrService::SetBrightness(uint32_t value, uint32_t displayId, bool continuous)
291 {
292     if (!Permission::IsSystem()) {
293         lastError_ = DisplayErrors::ERR_SYSTEM_API_DENIED;
294         return false;
295     }
296 
297     auto brightness = GetSafeBrightness(value);
298     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetBrightness displayId=%{public}u, value=%{public}u, continuous=%{public}d",
299         displayId, brightness, continuous);
300     auto iter = controllerMap_.find(displayId);
301     if (iter == controllerMap_.end()) {
302         return false;
303     }
304     return BrightnessManager::Get().SetBrightness(brightness, 0, continuous);
305 }
306 
DiscountBrightness(double discount,uint32_t displayId)307 bool DisplayPowerMgrService::DiscountBrightness(double discount, uint32_t displayId)
308 {
309     if (!Permission::IsSystem()) {
310         return false;
311     }
312     auto iter = controllerMap_.find(displayId);
313     if (iter == controllerMap_.end()) {
314         return false;
315     }
316     bool ret = BrightnessManager::Get().DiscountBrightness(discount);
317     if (ret) {
318         return true;
319     }
320     auto brightness = iter->second->GetBrightness();
321     auto safeDiscount = GetSafeDiscount(discount, brightness);
322     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "DiscountBrightness displayId=%{public}u, discount-%{public}lf",
323                    displayId, safeDiscount);
324     HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::DISPLAY, "BACKLIGHT_DISCOUNT",
325         HiviewDFX::HiSysEvent::EventType::STATISTIC, "RATIO", safeDiscount);
326     return iter->second->DiscountBrightness(safeDiscount);
327 }
328 
OverrideBrightness(uint32_t value,uint32_t displayId)329 bool DisplayPowerMgrService::OverrideBrightness(uint32_t value, uint32_t displayId)
330 {
331     if (!Permission::IsSystem()) {
332         return false;
333     }
334     auto brightness = GetSafeBrightness(value);
335     DISPLAY_HILOGI(COMP_SVC, "OverrideBrightness displayId=%{public}u, value=%{public}u", displayId, brightness);
336     auto iter = controllerMap_.find(displayId);
337     if (iter == controllerMap_.end()) {
338         return false;
339     }
340     return BrightnessManager::Get().OverrideBrightness(brightness);
341 }
342 
OverrideDisplayOffDelay(uint32_t delayMs)343 bool DisplayPowerMgrService::OverrideDisplayOffDelay(uint32_t delayMs)
344 {
345     if (!Permission::IsSystem()) {
346         return false;
347     }
348     if (GetDisplayState(GetMainDisplayId()) != DisplayState::DISPLAY_ON || delayMs == DELAY_TIME_UNSET) {
349         isDisplayDelayOff_ = false;
350         return isDisplayDelayOff_;
351     }
352     DISPLAY_HILOGI(COMP_SVC, "OverrideDisplayOffDelay delayMs=%{public}u", delayMs);
353     isDisplayDelayOff_ = true;
354     displayOffDelayMs_ = delayMs;
355 
356     return isDisplayDelayOff_;
357 }
358 
RestoreBrightness(uint32_t displayId)359 bool DisplayPowerMgrService::RestoreBrightness(uint32_t displayId)
360 {
361     if (!Permission::IsSystem()) {
362         return false;
363     }
364     DISPLAY_HILOGI(COMP_SVC, "RestoreBrightness displayId=%{public}u", displayId);
365     auto iter = controllerMap_.find(displayId);
366     if (iter == controllerMap_.end()) {
367         return false;
368     }
369     bool ret = BrightnessManager::Get().RestoreBrightness();
370     if (ret) {
371         return true;
372     }
373     return iter->second->RestoreBrightness();
374 }
375 
GetBrightness(uint32_t displayId)376 uint32_t DisplayPowerMgrService::GetBrightness(uint32_t displayId)
377 {
378     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "GetBrightness displayId=%{public}u", displayId);
379     auto iter = controllerMap_.find(displayId);
380     if (iter == controllerMap_.end()) {
381         return BRIGHTNESS_OFF;
382     }
383     return BrightnessManager::Get().GetBrightness();
384 }
385 
GetDefaultBrightness()386 uint32_t DisplayPowerMgrService::GetDefaultBrightness()
387 {
388     return BRIGHTNESS_DEFAULT;
389 }
390 
GetMaxBrightness()391 uint32_t DisplayPowerMgrService::GetMaxBrightness()
392 {
393     return BRIGHTNESS_MAX;
394 }
395 
GetMinBrightness()396 uint32_t DisplayPowerMgrService::GetMinBrightness()
397 {
398     return BRIGHTNESS_MIN;
399 }
400 
AdjustBrightness(uint32_t id,int32_t value,uint32_t duration)401 bool DisplayPowerMgrService::AdjustBrightness(uint32_t id, int32_t value, uint32_t duration)
402 {
403     if (!Permission::IsSystem()) {
404         return false;
405     }
406     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "AdjustBrightness %{public}d, %{public}d, %{public}d",
407                    id, value, duration);
408     auto iterator = controllerMap_.find(id);
409     if (iterator == controllerMap_.end()) {
410         return false;
411     }
412     bool ret = BrightnessManager::Get().SetBrightness(value, duration);
413     if (ret) {
414         return true;
415     }
416     return iterator->second->SetBrightness(value, duration);
417 }
418 
AutoAdjustBrightness(bool enable)419 bool DisplayPowerMgrService::AutoAdjustBrightness(bool enable)
420 {
421     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "AutoAdjustBrightness start");
422     if (!supportLightSensor_) {
423         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "AutoAdjustBrightness not support");
424         SetSettingAutoBrightness(false);
425         return false;
426     }
427     if (enable) {
428         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "AutoAdjustBrightness enable");
429         if (autoBrightness_) {
430             DISPLAY_HILOGD(FEAT_BRIGHTNESS, "AutoAdjustBrightness is already enabled");
431             return true;
432         }
433         autoBrightness_ = true;
434     } else {
435         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "AutoAdjustBrightness disable");
436         if (!autoBrightness_) {
437             DISPLAY_HILOGD(FEAT_BRIGHTNESS, "AutoAdjustBrightness is already disabled");
438             return true;
439         }
440         autoBrightness_ = false;
441     }
442     SetSettingAutoBrightness(enable);
443     return true;
444 }
445 
446 #ifdef ENABLE_SENSOR_PART
ActivateAmbientSensor()447 void DisplayPowerMgrService::ActivateAmbientSensor()
448 {
449     if (!autoBrightness_) {
450         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "auto brightness is not enabled");
451         return;
452     }
453     if (ambientSensorEnabled_) {
454         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Ambient Sensor is already on");
455         return;
456     }
457     (void) strcpy_s(sensorUser_.name, sizeof(sensorUser_.name), "DisplayPowerMgrService");
458     sensorUser_.userData = nullptr;
459     sensorUser_.callback = &AmbientLightCallback;
460     SubscribeSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT, &sensorUser_);
461     SetBatch(SENSOR_TYPE_ID_AMBIENT_LIGHT, &sensorUser_, SAMPLING_RATE, SAMPLING_RATE);
462     ActivateSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT, &sensorUser_);
463     SetMode(SENSOR_TYPE_ID_AMBIENT_LIGHT, &sensorUser_, SENSOR_ON_CHANGE);
464     ambientSensorEnabled_ = true;
465 }
466 
DeactivateAmbientSensor()467 void DisplayPowerMgrService::DeactivateAmbientSensor()
468 {
469     if (!autoBrightness_) {
470         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "auto brightness is not enabled");
471         return;
472     }
473     if (!ambientSensorEnabled_) {
474         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Ambient Sensor is already off");
475         return;
476     }
477     DeactivateSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT, &sensorUser_);
478     UnsubscribeSensor(SENSOR_TYPE_ID_AMBIENT_LIGHT, &sensorUser_);
479     ambientSensorEnabled_ = false;
480 }
481 #endif
482 
IsAutoAdjustBrightness()483 bool DisplayPowerMgrService::IsAutoAdjustBrightness()
484 {
485     return autoBrightness_;
486 }
487 
RegisterCallback(sptr<IDisplayPowerCallback> callback)488 bool DisplayPowerMgrService::RegisterCallback(sptr<IDisplayPowerCallback> callback)
489 {
490     if (!Permission::IsSystem()) {
491         return false;
492     }
493     std::lock_guard lock(mutex_);
494     DISPLAY_HILOGI(COMP_SVC, "RegisterCallback");
495     if (callback_ != nullptr) {
496         DISPLAY_HILOGI(COMP_SVC, "Callback function exist");
497         return false;
498     }
499     callback_ = callback;
500     sptr<IRemoteObject> remote = callback_->AsObject();
501     if (!remote->IsProxyObject()) {
502         DISPLAY_HILOGE(COMP_FWK, "Callback is not proxy");
503         return false;
504     }
505     if (cbDeathRecipient_ == nullptr) {
506         cbDeathRecipient_ = new CallbackDeathRecipient();
507     }
508     remote->AddDeathRecipient(cbDeathRecipient_);
509     return true;
510 }
511 
BoostBrightness(int32_t timeoutMs,uint32_t displayId)512 bool DisplayPowerMgrService::BoostBrightness(int32_t timeoutMs, uint32_t displayId)
513 {
514     if (!Permission::IsSystem()) {
515         return false;
516     }
517     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Timing boost brightness: %{public}d, id: %{public}d", timeoutMs, displayId);
518     RETURN_IF_WITH_RET(timeoutMs <= 0, false);
519     auto iter = controllerMap_.find(displayId);
520     RETURN_IF_WITH_RET(iter == controllerMap_.end(), false);
521     return BrightnessManager::Get().BoostBrightness(timeoutMs);
522 }
523 
CancelBoostBrightness(uint32_t displayId)524 bool DisplayPowerMgrService::CancelBoostBrightness(uint32_t displayId)
525 {
526     if (!Permission::IsSystem()) {
527         return false;
528     }
529     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Cancel boost brightness, id: %{public}d", displayId);
530     auto iter = controllerMap_.find(displayId);
531     RETURN_IF_WITH_RET(iter == controllerMap_.end(), false);
532     bool ret = BrightnessManager::Get().CancelBoostBrightness();
533     if (ret) {
534         return true;
535     }
536     return iter->second->CancelBoostBrightness();
537 }
538 
GetDeviceBrightness(uint32_t displayId)539 uint32_t DisplayPowerMgrService::GetDeviceBrightness(uint32_t displayId)
540 {
541     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "GetDeviceBrightness displayId=%{public}u", displayId);
542     auto iter = controllerMap_.find(displayId);
543     if (iter == controllerMap_.end()) {
544         return BRIGHTNESS_OFF;
545     }
546     return BrightnessManager::Get().GetDeviceBrightness();
547 }
548 
SetCoordinated(bool coordinated,uint32_t displayId)549 bool DisplayPowerMgrService::SetCoordinated(bool coordinated, uint32_t displayId)
550 {
551     if (!Permission::IsSystem()) {
552         return false;
553     }
554     DISPLAY_HILOGD(FEAT_STATE, "Set coordinated=%{public}d, displayId=%{public}u", coordinated, displayId);
555     auto iter = controllerMap_.find(displayId);
556     RETURN_IF_WITH_RET(iter == controllerMap_.end(), false);
557     iter->second->SetCoordinated(coordinated);
558     return true;
559 }
560 
NotifyStateChangeCallback(uint32_t displayId,DisplayState state,uint32_t reason)561 void DisplayPowerMgrService::NotifyStateChangeCallback(uint32_t displayId, DisplayState state, uint32_t reason)
562 {
563     std::lock_guard lock(mutex_);
564     if (callback_ != nullptr) {
565         callback_->OnDisplayStateChanged(displayId, state, reason);
566     }
567 }
568 
DumpDisplayInfo(std::string & result)569 void DisplayPowerMgrService::DumpDisplayInfo(std::string& result)
570 {
571     for (auto& iter: controllerMap_) {
572         auto control = iter.second;
573         result.append("Display Id=").append(std::to_string(iter.first));
574         result.append(" State=").append(std::to_string(static_cast<uint32_t>(BrightnessManager::Get().GetState())));
575         result.append(" Discount=").append(std::to_string(BrightnessManager::Get().GetDiscount()));
576         result.append(" Brightness=").append(std::to_string(BrightnessManager::Get().GetBrightness()));
577         if (BrightnessManager::Get().IsBrightnessOverridden()) {
578             result.append(" OverrideBrightness=")
579                 .append(std::to_string(BrightnessManager::Get().GetScreenOnBrightness()));
580         }
581         if (BrightnessManager::Get().IsBrightnessBoosted()) {
582             result.append(" BoostBrightness=")
583                 .append(std::to_string(BrightnessManager::Get().GetScreenOnBrightness()));
584         }
585         result.append("\n");
586         result.append("DeviceBrightness=");
587         result.append(std::to_string(BrightnessManager::Get().GetDeviceBrightness())).append("\n");
588     }
589 }
590 
Dump(int32_t fd,const std::vector<std::u16string> & args)591 int32_t DisplayPowerMgrService::Dump(int32_t fd, const std::vector<std::u16string>& args)
592 {
593     if (!isBootCompleted_) {
594         return ERR_NO_INIT;
595     }
596     if (!Permission::IsSystem()) {
597         return ERR_PERMISSION_DENIED;
598     }
599     std::string result("DISPLAY POWER MANAGER DUMP:\n");
600     DumpDisplayInfo(result);
601 #ifdef ENABLE_SENSOR_PART
602     result.append("Support Ambient Light: ");
603     if (supportLightSensor_) {
604         result.append("TRUE");
605     } else {
606         result.append("FALSE");
607     }
608     result.append("\n");
609 
610     result.append("Auto Adjust Brightness: ");
611     if (autoBrightness_) {
612         result.append("ON");
613     } else {
614         result.append("OFF");
615     }
616     result.append("\n");
617 #endif
618 
619     result.append("Brightness Limits: ").append("Max=" + std::to_string(GetMaxBrightness()) + " ");
620     result.append("Min=" + std::to_string(GetMinBrightness()) + " ");
621     result.append("Default=" + std::to_string(GetDefaultBrightness())).append("\n");
622 
623     if (!SaveStringToFd(fd, result)) {
624         DISPLAY_HILOGE(COMP_SVC, "Failed to save dump info to fd");
625     }
626     return ERR_OK;
627 }
628 
629 #ifdef ENABLE_SENSOR_PART
InitSensors()630 void DisplayPowerMgrService::InitSensors()
631 {
632     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "InitSensors start");
633     SensorInfo* sensorInfo = nullptr;
634     int32_t count;
635     int ret = GetAllSensors(&sensorInfo, &count);
636     if (ret != 0 || sensorInfo == nullptr) {
637         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Can't get sensors");
638         return;
639     }
640     supportLightSensor_ = false;
641     for (int i = 0; i < count; i++) {
642         if (sensorInfo[i].sensorId == SENSOR_TYPE_ID_AMBIENT_LIGHT) {
643             DISPLAY_HILOGI(FEAT_BRIGHTNESS, "AMBIENT_LIGHT Support");
644             supportLightSensor_ = true;
645             break;
646         }
647     }
648 
649     if (!supportLightSensor_) {
650         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "AMBIENT_LIGHT not support");
651     }
652 }
653 
AmbientLightCallback(SensorEvent * event)654 void DisplayPowerMgrService::AmbientLightCallback(SensorEvent* event)
655 {
656     if (event->sensorTypeId != SENSOR_TYPE_ID_AMBIENT_LIGHT) {
657         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Sensor Callback is not AMBIENT_LIGHT");
658         return;
659     }
660     auto pms = DelayedSpSingleton<DisplayPowerMgrService>::GetInstance();
661     if (pms == nullptr) {
662         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "Sensor Callback no service");
663         return;
664     }
665     uint32_t mainDispId = pms->GetMainDisplayId();
666     auto mainDisp = pms->controllerMap_.find(mainDispId);
667     if (mainDisp == pms->controllerMap_.end()) {
668         return;
669     }
670     if (mainDisp->second->IsBrightnessOverridden() || mainDisp->second->IsBrightnessBoosted()) {
671         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Overwrite or boost brightness scene, auto brightness is invalid");
672         return;
673     }
674     AmbientLightData* data = (AmbientLightData*) event->data;
675     int32_t brightness = static_cast<int32_t>(mainDisp->second->GetCachedSettingBrightness());
676     uint32_t animationUpdateTime = mainDisp->second->GetAnimationUpdateTime();
677     int32_t changeBrightness = 0;
678     if (pms->CalculateBrightness(data->intensity, brightness, changeBrightness)) {
679         double discountStride = static_cast<double>(AUTO_ADJUST_BRIGHTNESS_STRIDE / mainDisp->second->GetDiscount());
680         uint32_t gradualDuration = floor(changeBrightness / discountStride) * animationUpdateTime;
681         pms->AdjustBrightness(mainDispId, brightness, gradualDuration);
682     }
683     // Notify ambient brightness change event to battery statistics
684     HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::DISPLAY, "AMBIENT_LIGHT",
685         HiviewDFX::HiSysEvent::EventType::STATISTIC, "LEVEL", brightness);
686 }
687 
IsChangedLux(float scalar)688 bool DisplayPowerMgrService::IsChangedLux(float scalar)
689 {
690     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "changed: %{public}d, %{public}f vs %{public}f",
691                    luxChanged_, lastLux_, scalar);
692     if (lastLuxTime_ <= 0) {
693         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "receive lux at first time");
694         lastLuxTime_ = time(0);
695         lastLux_ = scalar;
696         luxChanged_ = true;
697         return false;
698     }
699 
700     if (!luxChanged_) {
701         float luxChangeMin = (lastLux_ / LUX_CHANGE_RATE_THRESHOLD) + 1;
702         if (abs(scalar - lastLux_) < luxChangeMin) {
703             DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Too little change");
704             return false;
705         } else {
706             DISPLAY_HILOGI(FEAT_BRIGHTNESS, "First time to change, wait for stable");
707             luxChanged_ = true;
708             return false;
709         }
710     } else {
711         float luxChangeMin = (lastLux_ / LUX_CHANGE_RATE_THRESHOLD) + 1;
712         if (luxChangeMin < LUX_CHANGE_STABLE_MIN) {
713             luxChangeMin = LUX_CHANGE_STABLE_MIN;
714         }
715         if (abs(scalar - lastLux_) >= luxChangeMin) {
716             time_t currentTime = time(0);
717             time_t sub = currentTime - lastLuxTime_;
718             DISPLAY_HILOGD(FEAT_BRIGHTNESS, "stable lux");
719             if (sub >= LUX_STABLE_TIME) {
720                 DISPLAY_HILOGI(FEAT_BRIGHTNESS, "stable enought to change");
721                 lastLuxTime_ = time(0);
722                 lastLux_ = scalar;
723                 luxChanged_ = false;
724                 return true;
725             }
726         } else {
727             DISPLAY_HILOGD(FEAT_BRIGHTNESS, "unstable lux, wait for stable");
728             luxChanged_ = true;
729             return false;
730         }
731     }
732     return false;
733 }
734 #endif
735 
GetSafeBrightness(uint32_t value)736 uint32_t DisplayPowerMgrService::GetSafeBrightness(uint32_t value)
737 {
738     auto brightnessValue = value;
739     if (brightnessValue > BRIGHTNESS_MAX) {
740         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "brightness value is greater than max, value=%{public}u", value);
741         brightnessValue = BRIGHTNESS_MAX;
742     }
743     if (brightnessValue < BRIGHTNESS_MIN) {
744         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "brightness value is less than min, value=%{public}u", value);
745         brightnessValue = BRIGHTNESS_MIN;
746     }
747     return brightnessValue;
748 }
749 
GetSafeDiscount(double discount,uint32_t brightness)750 double DisplayPowerMgrService::GetSafeDiscount(double discount, uint32_t brightness)
751 {
752     auto safeDiscount = discount;
753     if (safeDiscount > DISCOUNT_MAX) {
754         DISPLAY_HILOGD(COMP_SVC, "discount value is greater than max, discount=%{public}lf", discount);
755         safeDiscount = DISCOUNT_MAX;
756     }
757     if (safeDiscount < DISCOUNT_MIN) {
758         DISPLAY_HILOGD(COMP_SVC, "discount value is less than min, discount=%{public}lf", discount);
759         safeDiscount = DISCOUNT_MIN;
760     }
761     if (static_cast<uint32_t>(BRIGHTNESS_MIN / safeDiscount) > BRIGHTNESS_MAX) {
762         DISPLAY_HILOGD(COMP_SVC, "brightness than max, brightness=%{public}u, discount=%{public}lf",
763                        static_cast<uint32_t>(BRIGHTNESS_MIN / safeDiscount), discount);
764         safeDiscount = static_cast<double>(BRIGHTNESS_MIN / static_cast<double>(brightness));
765     }
766 
767     return safeDiscount;
768 }
769 
CalculateBrightness(float scalar,int32_t & brightness,int32_t & change)770 bool DisplayPowerMgrService::CalculateBrightness(float scalar, int32_t& brightness, int32_t& change)
771 {
772     const float lastLux = lastLux_;
773 #ifdef ENABLE_SENSOR_PART
774     if (!IsChangedLux(scalar)) {
775         return false;
776     }
777 #endif
778     int32_t calcBrightness = GetBrightnessFromLightScalar(scalar);
779     int32_t difference = abs(calcBrightness - brightness);
780     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "lux: %{public}f -> %{public}f, screen: %{public}d -> %{public}d",
781                    lastLux, scalar, brightness, calcBrightness);
782     if (difference < BRIGHTNESS_CHANGE_MIN
783         || (scalar > lastLux && calcBrightness < brightness)
784         || (scalar < lastLux && calcBrightness > brightness)) {
785         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "screen is too light/dark when calculated change");
786         return false;
787     }
788     brightness = calcBrightness;
789     change = difference;
790     return true;
791 }
792 
GetBrightnessFromLightScalar(float scalar)793 int32_t DisplayPowerMgrService::GetBrightnessFromLightScalar(float scalar)
794 {
795     uint32_t brightness = DisplayAutoBrightness::CalculateAutoBrightness(scalar);
796     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "scalar: %{public}f, brightness: %{public}d", scalar, brightness);
797     if (brightness > BRIGHTNESS_MAX) {
798         brightness = BRIGHTNESS_MAX;
799     } else if (brightness < BRIGHTNESS_MIN) {
800         brightness = BRIGHTNESS_MIN;
801     }
802     return static_cast<int32_t>(brightness);
803 }
804 
GetError()805 DisplayErrors DisplayPowerMgrService::GetError()
806 {
807     DisplayErrors tmpError = lastError_;
808     lastError_ = DisplayErrors::ERR_OK;
809     return tmpError;
810 }
811 
OnRemoteDied(const wptr<IRemoteObject> & remote)812 void DisplayPowerMgrService::CallbackDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& remote)
813 {
814     DISPLAY_HILOGI(COMP_SVC, "CallbackDeathRecipient OnRemoteDied");
815     auto pms = DelayedSpSingleton<DisplayPowerMgrService>::GetInstance();
816     if (pms == nullptr) {
817         DISPLAY_HILOGI(COMP_SVC, "OnRemoteDied no service");
818         return;
819     }
820 
821     std::lock_guard lock(callbackMutex_);
822     pms->callback_ = nullptr;
823 }
824 } // namespace DisplayPowerMgr
825 } // namespace OHOS
826