• 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 #ifdef HAS_HIVIEWDFX_HISYSEVENT_PART
18 #include <hisysevent.h>
19 #endif
20 #include <file_ex.h>
21 #include <securec.h>
22 #include <system_ability_definition.h>
23 #include "errors.h"
24 #include "new"
25 #include "screen_action.h"
26 #ifdef ENABLE_SENSOR_PART
27 #include "sensor_agent.h"
28 #endif
29 #include "xcollie/watchdog.h"
30 #include "display_log.h"
31 #include "display_auto_brightness.h"
32 #include "display_setting_helper.h"
33 #include "display_param_helper.h"
34 #include "permission.h"
35 #include "power_state_machine_info.h"
36 #include "setting_provider.h"
37 #include "ffrt_utils.h"
38 
39 namespace OHOS {
40 namespace DisplayPowerMgr {
41 using namespace OHOS::PowerMgr;
42 namespace {
43 DisplayParamHelper::BootCompletedCallback g_bootCompletedCallback;
44 FFRTHandle g_screenOffDelayTaskHandle;
45 const uint32_t GET_DISPLAY_ID_DELAY_MS = 50;
46 const uint32_t US_PER_MS = 1000;
47 const uint32_t GET_DISPLAY_ID_RETRY_COUNT = 3;
48 const uint32_t DEFALUT_DISPLAY_ID = 0;
49 const uint32_t TEST_MODE = 1;
50 const uint32_t NORMAL_MODE = 2;
51 const uint32_t BOOTED_COMPLETE_DELAY_TIME = 2000;
52 const int32_t ERR_OK = 0;
53 }
54 
55 const uint32_t DisplayPowerMgrService::BRIGHTNESS_MIN = DisplayParamHelper::GetMinBrightness();
56 const uint32_t DisplayPowerMgrService::BRIGHTNESS_DEFAULT = DisplayParamHelper::GetDefaultBrightness();
57 const uint32_t DisplayPowerMgrService::BRIGHTNESS_MAX = DisplayParamHelper::GetMaxBrightness();
58 std::atomic_bool DisplayPowerMgrService::isBootCompleted_ = false;
59 DisplayPowerMgrService::DisplayPowerMgrService() = default;
60 
Init()61 void DisplayPowerMgrService::Init()
62 {
63     queue_ = std::make_shared<FFRTQueue> ("display_power_mgr_service");
64     DISPLAY_HILOGI(COMP_SVC, "DisplayPowerMgrService Create");
65     std::vector<uint32_t> displayIds;
66     for (uint32_t tryCount = 0; tryCount <= GET_DISPLAY_ID_RETRY_COUNT; tryCount++) {
67         displayIds = ScreenAction::GetAllDisplayId();
68         if (!displayIds.empty()) {
69             break;
70         }
71         if (tryCount < GET_DISPLAY_ID_RETRY_COUNT) {
72             usleep(GET_DISPLAY_ID_DELAY_MS * US_PER_MS);
73             DISPLAY_HILOGI(COMP_SVC, "cannot find any display id, retry! count: %{public}u", tryCount + 1);
74         } else {
75             displayIds.emplace_back(DEFALUT_DISPLAY_ID);
76             DISPLAY_HILOGE(COMP_SVC, "cannot find any display id after max retry, fill with 0");
77         }
78     }
79 #ifndef FUZZ_COV_TEST
80     BrightnessManager::Get().Init(BRIGHTNESS_MAX, BRIGHTNESS_MIN);
81 #endif
82     for (const auto& id: displayIds) {
83         DISPLAY_HILOGI(COMP_SVC, "find display, id=%{public}u", id);
84         controllerMap_.emplace(id, std::make_shared<ScreenController>(id));
85         BrightnessManager::Get().SetDisplayId(id);
86     }
87 
88     callback_ = nullptr;
89     cbDeathRecipient_ = nullptr;
90     RegisterBootCompletedCallback();
91 }
92 
RegisterBootCompletedCallback()93 void DisplayPowerMgrService::RegisterBootCompletedCallback()
94 {
95     g_bootCompletedCallback = []() {
96         isBootCompleted_ = true;
97     };
98     DisplayParamHelper::RegisterBootCompletedCallback(g_bootCompletedCallback);
99 }
100 
Deinit()101 void DisplayPowerMgrService::Deinit()
102 {
103     UnregisterSettingObservers();
104     BrightnessManager::Get().DeInit();
105     isBootCompleted_ = false;
106 }
107 
Reset()108 void DisplayPowerMgrService::Reset()
109 {
110     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "reset begin");
111     if (queue_) {
112         queue_.reset();
113         g_screenOffDelayTaskHandle = nullptr;
114         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "destruct display_power_queue");
115     }
116     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "reset end");
117 }
118 
HandleBootBrightness()119 void DisplayPowerMgrService::HandleBootBrightness()
120 {
121     BrightnessManager::Get().Init(BRIGHTNESS_MAX, BRIGHTNESS_MIN);
122     std::call_once(initFlag_, [] {
123         SetBootCompletedBrightness();
124         SetBootCompletedAutoBrightness();
125     });
126     RegisterSettingObservers();
127 }
128 
SetBootCompletedBrightness()129 void DisplayPowerMgrService::SetBootCompletedBrightness()
130 {
131     uint32_t mainDisplayId = 0;
132     DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->GetMainDisplayId(mainDisplayId);
133     uint32_t brightness = BRIGHTNESS_OFF;
134     DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->GetBrightness(mainDisplayId, brightness);
135     uint32_t currentDisplayId = BrightnessManager::Get().GetCurrentDisplayId(mainDisplayId);
136     int32_t state = static_cast<int32_t>(DisplayState::DISPLAY_UNKNOWN);
137     DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->GetDisplayState(mainDisplayId, state);
138     BrightnessManager::Get().SetDisplayId(currentDisplayId);
139     BrightnessManager::Get().SetDisplayState(currentDisplayId, static_cast<DisplayState>(state), 0);
140     bool result = false;
141     int32_t errCode = 0;
142     DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->SetBrightness(brightness, mainDisplayId, false,
143         result, errCode);
144     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetBootCompletedBrightness currentDisplayId=%{public}d", currentDisplayId);
145 }
146 
SetBootCompletedAutoBrightness()147 void DisplayPowerMgrService::SetBootCompletedAutoBrightness()
148 {
149     bool enable = GetSettingAutoBrightness();
150     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetBootCompletedAutoBrightness enable=%{public}d", enable);
151     bool result = false;
152     DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->AutoAdjustBrightness(enable, result);
153     BrightnessManager::Get().AutoAdjustBrightness(enable);
154 }
155 
RegisterSettingObservers()156 void DisplayPowerMgrService::RegisterSettingObservers()
157 {
158     uint32_t mainDisplayId = 0;
159     DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->GetMainDisplayId(mainDisplayId);
160     auto controllerMap = DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->controllerMap_;
161     auto iter = controllerMap.find(mainDisplayId);
162     if (iter != controllerMap.end()) {
163         iter->second->RegisterSettingBrightnessObserver();
164     }
165     RegisterSettingAutoBrightnessObserver();
166 }
167 
UnregisterSettingObservers()168 void DisplayPowerMgrService::UnregisterSettingObservers()
169 {
170     uint32_t mainDisplayId = 0;
171     DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->GetMainDisplayId(mainDisplayId);
172     auto controllerMap = DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->controllerMap_;
173     auto iter = controllerMap.find(mainDisplayId);
174     if (iter != controllerMap.end()) {
175         iter->second->UnregisterSettingBrightnessObserver();
176     }
177     UnregisterSettingAutoBrightnessObserver();
178 }
179 
RegisterSettingAutoBrightnessObserver()180 void DisplayPowerMgrService::RegisterSettingAutoBrightnessObserver()
181 {
182     SettingObserver::UpdateFunc updateFunc = [&](const std::string& key) { AutoBrightnessSettingUpdateFunc(key); };
183     DisplaySettingHelper::RegisterSettingAutoBrightnessObserver(updateFunc);
184 }
185 
AutoBrightnessSettingUpdateFunc(const std::string & key)186 void DisplayPowerMgrService::AutoBrightnessSettingUpdateFunc(const std::string& key)
187 {
188     bool isSettingEnable = GetSettingAutoBrightness(key);
189     bool isSystemEnable = false;
190     DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->IsAutoAdjustBrightness(isSystemEnable);
191     if (isSettingEnable == isSystemEnable) {
192         DISPLAY_HILOGI(FEAT_BRIGHTNESS, "no need change autoAdjustSwitch");
193         return;
194     }
195     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "AutoBrightnessSettingUpdateFunc isSettingEnable=%{public}d", isSettingEnable);
196     BrightnessManager::Get().AutoAdjustBrightness(isSettingEnable);
197     bool result = false;
198     DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->AutoAdjustBrightness(isSettingEnable, result);
199     if (!isSettingEnable) {
200         DelayedSpSingleton<DisplayPowerMgrService>::GetInstance()->ClearOffset();
201     }
202 }
203 
SetScreenOnBrightnessInner()204 bool DisplayPowerMgrService::SetScreenOnBrightnessInner()
205 {
206     if (!Permission::IsSystem()) {
207         return false;
208     }
209     BrightnessManager::Get().SetScreenOnBrightness();
210     return true;
211 }
212 
ClearOffset()213 void DisplayPowerMgrService::ClearOffset()
214 {
215     BrightnessManager::Get().ClearOffset();
216 }
217 
GetSettingAutoBrightness(const std::string & key)218 bool DisplayPowerMgrService::GetSettingAutoBrightness(const std::string& key)
219 {
220     return DisplaySettingHelper::GetSettingAutoBrightness(key);
221 }
222 
ScreenOffDelay(uint32_t id,DisplayState state,uint32_t reason)223 void DisplayPowerMgrService::ScreenOffDelay(uint32_t id, DisplayState state, uint32_t reason)
224 {
225     isDisplayDelayOff_ = false;
226     DISPLAY_HILOGI(COMP_SVC, "ScreenOffDelay %{public}d, %{public}d,  %{public}d", id, state, reason);
227     auto iterator = controllerMap_.find(id);
228     if (iterator == controllerMap_.end()) {
229         return;
230     }
231     iterator->second->UpdateState(state, reason);
232 }
233 
UnregisterSettingAutoBrightnessObserver()234 void DisplayPowerMgrService::UnregisterSettingAutoBrightnessObserver()
235 {
236     DisplaySettingHelper::UnregisterSettingAutoBrightnessObserver();
237 }
238 
SetDisplayStateInner(uint32_t id,DisplayState state,uint32_t reason)239 bool DisplayPowerMgrService::SetDisplayStateInner(uint32_t id, DisplayState state, uint32_t reason)
240 {
241     if (!Permission::IsSystem()) {
242         return false;
243     }
244     DISPLAY_HILOGI(COMP_SVC, "[UL_POWER] SetDisplayState %{public}d, %{public}d, %{public}u", id, state, reason);
245     auto iterator = controllerMap_.find(id);
246     if (iterator == controllerMap_.end()) {
247         if (id != DEFALUT_DISPLAY_ID) {
248             return false;
249         }
250         id = GetMainDisplayIdInner();
251         iterator = controllerMap_.find(id);
252         if (iterator == controllerMap_.end()) {
253             return false;
254         }
255     }
256     BrightnessManager::Get().SetDisplayState(id, state, reason);
257 
258     if (state == DisplayState::DISPLAY_OFF || state == DisplayState::DISPLAY_DOZE) {
259         if (!isDisplayDelayOff_) {
260             DISPLAY_HILOGI(COMP_SVC, "screen off immediately");
261             bool ret = iterator->second->UpdateState(state, reason);
262             if (!ret) {
263                 DISPLAY_HILOGI(COMP_SVC, "[UL_POWER]undo brightness SetDisplayState");
264                 BrightnessManager::Get().SetDisplayState(id, iterator->second->GetState(), reason);
265             }
266             return ret;
267         }
268         displayId_ = id;
269         displayState_ = state;
270         displayReason_ = reason;
271         FFRTTask task = [this]() { ScreenOffDelay(displayId_, displayState_, displayReason_); };
272         g_screenOffDelayTaskHandle = FFRTUtils::SubmitDelayTask(task, displayOffDelayMs_, queue_);
273         iterator->second->SetDelayOffState();
274         return true;
275     } else if (state == DisplayState::DISPLAY_ON) {
276         if (isDisplayDelayOff_) {
277             DISPLAY_HILOGI(COMP_SVC, "need remove delay task");
278             FFRTUtils::CancelTask(g_screenOffDelayTaskHandle, queue_);
279             isDisplayDelayOff_ = false;
280             iterator->second->SetOnState();
281             return true;
282         }
283     }
284     return iterator->second->UpdateState(state, reason);
285 }
286 
GetDisplayStateInner(uint32_t id)287 DisplayState DisplayPowerMgrService::GetDisplayStateInner(uint32_t id)
288 {
289     DISPLAY_HILOGD(COMP_SVC, "GetDisplayState %{public}d", id);
290     auto iterator = controllerMap_.find(id);
291     if (iterator == controllerMap_.end()) {
292         if (id != DEFALUT_DISPLAY_ID) {
293             return DisplayState::DISPLAY_UNKNOWN;
294         }
295         id = GetMainDisplayIdInner();
296         iterator = controllerMap_.find(id);
297         if (iterator == controllerMap_.end()) {
298             return DisplayState::DISPLAY_UNKNOWN;
299         }
300     }
301     return iterator->second->GetState();
302 }
303 
GetDisplayIdsInner()304 std::vector<uint32_t> DisplayPowerMgrService::GetDisplayIdsInner()
305 {
306     std::vector<uint32_t> ids;
307     for (auto& iter: controllerMap_) {
308         ids.push_back(iter.first);
309     }
310     return ids;
311 }
312 
GetMainDisplayIdInner()313 uint32_t DisplayPowerMgrService::GetMainDisplayIdInner()
314 {
315     uint32_t id = ScreenAction::GetDefaultDisplayId();
316     DISPLAY_HILOGD(COMP_SVC, "GetMainDisplayId %{public}d", id);
317     return id;
318 }
319 
SetBrightnessInner(uint32_t value,uint32_t displayId,bool continuous)320 bool DisplayPowerMgrService::SetBrightnessInner(uint32_t value, uint32_t displayId, bool continuous)
321 {
322     if (!Permission::IsSystem()) {
323         lastError_ = DisplayErrors::ERR_SYSTEM_API_DENIED;
324         return false;
325     }
326 
327     auto brightness = GetSafeBrightness(value);
328     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "SetBrightness displayId=%{public}u, value=%{public}u, continuous=%{public}d",
329         displayId, brightness, continuous);
330     return BrightnessManager::Get().SetBrightness(brightness, 0, continuous);
331 }
332 
DiscountBrightnessInner(double discount,uint32_t displayId)333 bool DisplayPowerMgrService::DiscountBrightnessInner(double discount, uint32_t displayId)
334 {
335     if (!Permission::IsSystem()) {
336         return false;
337     }
338     auto iter = controllerMap_.find(displayId);
339     if (iter == controllerMap_.end()) {
340         return false;
341     }
342     return BrightnessManager::Get().DiscountBrightness(discount);
343 }
344 
OverrideBrightnessInner(uint32_t brightness,uint32_t displayId,uint32_t duration)345 bool DisplayPowerMgrService::OverrideBrightnessInner(uint32_t brightness, uint32_t displayId, uint32_t duration)
346 {
347     if (!Permission::IsSystem()) {
348         return false;
349     }
350     DISPLAY_HILOGI(COMP_SVC, "OverrideBrightness displayId=%{public}u, value=%{public}u, duration=%{public}d",
351         displayId, brightness, duration);
352     auto iter = controllerMap_.find(displayId);
353     if (iter == controllerMap_.end()) {
354         return false;
355     }
356     return BrightnessManager::Get().OverrideBrightness(brightness, duration);
357 }
358 
OverrideDisplayOffDelayInner(uint32_t delayMs)359 bool DisplayPowerMgrService::OverrideDisplayOffDelayInner(uint32_t delayMs)
360 {
361     if (!Permission::IsSystem()) {
362         return false;
363     }
364     if (GetDisplayStateInner(GetMainDisplayIdInner()) != DisplayState::DISPLAY_ON || delayMs == DELAY_TIME_UNSET) {
365         isDisplayDelayOff_ = false;
366         return isDisplayDelayOff_;
367     }
368     DISPLAY_HILOGI(COMP_SVC, "OverrideDisplayOffDelay delayMs=%{public}u", delayMs);
369     isDisplayDelayOff_ = true;
370     displayOffDelayMs_ = delayMs;
371 
372     return isDisplayDelayOff_;
373 }
374 
RestoreBrightnessInner(uint32_t displayId,uint32_t duration)375 bool DisplayPowerMgrService::RestoreBrightnessInner(uint32_t displayId, uint32_t duration)
376 {
377     if (!Permission::IsSystem()) {
378         return false;
379     }
380     DISPLAY_HILOGI(COMP_SVC, "RestoreBrightness displayId=%{public}u, duration=%{public}d",
381         displayId, duration);
382     auto iter = controllerMap_.find(displayId);
383     if (iter == controllerMap_.end()) {
384         return false;
385     }
386     bool ret = BrightnessManager::Get().RestoreBrightness(duration);
387     if (ret) {
388         return true;
389     }
390     return iter->second->RestoreBrightness();
391 }
392 
GetBrightnessInner(uint32_t displayId)393 uint32_t DisplayPowerMgrService::GetBrightnessInner(uint32_t displayId)
394 {
395     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "GetBrightness displayId=%{public}u", displayId);
396     auto iter = controllerMap_.find(displayId);
397     if (iter == controllerMap_.end()) {
398         return BRIGHTNESS_OFF;
399     }
400     return BrightnessManager::Get().GetBrightness();
401 }
402 
GetDefaultBrightnessInner()403 uint32_t DisplayPowerMgrService::GetDefaultBrightnessInner()
404 {
405     return BRIGHTNESS_DEFAULT;
406 }
407 
GetMaxBrightnessInner()408 uint32_t DisplayPowerMgrService::GetMaxBrightnessInner()
409 {
410     return BRIGHTNESS_MAX;
411 }
412 
GetMinBrightnessInner()413 uint32_t DisplayPowerMgrService::GetMinBrightnessInner()
414 {
415     return BRIGHTNESS_MIN;
416 }
417 
AdjustBrightnessInner(uint32_t id,int32_t value,uint32_t duration)418 bool DisplayPowerMgrService::AdjustBrightnessInner(uint32_t id, int32_t value, uint32_t duration)
419 {
420     if (!Permission::IsSystem()) {
421         return false;
422     }
423     DISPLAY_HILOGI(FEAT_BRIGHTNESS, "AdjustBrightness %{public}d, %{public}d, %{public}d",
424                    id, value, duration);
425     auto iterator = controllerMap_.find(id);
426     if (iterator == controllerMap_.end()) {
427         return false;
428     }
429     bool ret = BrightnessManager::Get().SetBrightness(value, duration);
430     if (ret) {
431         return true;
432     }
433     return iterator->second->SetBrightness(value, duration);
434 }
435 
IsSupportLightSensor(void)436 bool DisplayPowerMgrService::IsSupportLightSensor(void)
437 {
438     return BrightnessManager::Get().IsSupportLightSensor();
439 }
440 
IsAutoAdjustBrightnessInner(void)441 bool DisplayPowerMgrService::IsAutoAdjustBrightnessInner(void)
442 {
443     return BrightnessManager::Get().IsAutoAdjustBrightness();
444 }
445 
AutoAdjustBrightnessInner(bool enable)446 bool DisplayPowerMgrService::AutoAdjustBrightnessInner(bool enable)
447 {
448     if (!Permission::IsSystem()) {
449         return false;
450     }
451     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "AutoAdjustBrightness start");
452     return BrightnessManager::Get().AutoAdjustBrightness(enable);
453 }
454 
RegisterCallbackInner(sptr<IDisplayPowerCallback> callback)455 bool DisplayPowerMgrService::RegisterCallbackInner(sptr<IDisplayPowerCallback> callback)
456 {
457     if (!Permission::IsSystem()) {
458         return false;
459     }
460     std::lock_guard lock(mutex_);
461     DISPLAY_HILOGI(COMP_SVC, "RegisterCallback");
462     if (callback_ != nullptr) {
463         DISPLAY_HILOGI(COMP_SVC, "Callback function exist");
464         return false;
465     }
466     callback_ = callback;
467     sptr<IRemoteObject> remote = callback_->AsObject();
468     if (!remote->IsProxyObject()) {
469         DISPLAY_HILOGE(COMP_FWK, "Callback is not proxy");
470         return false;
471     }
472     if (cbDeathRecipient_ == nullptr) {
473         cbDeathRecipient_ = new CallbackDeathRecipient();
474     }
475     remote->AddDeathRecipient(cbDeathRecipient_);
476     return true;
477 }
478 
BoostBrightnessInner(int32_t timeoutMs,uint32_t displayId)479 bool DisplayPowerMgrService::BoostBrightnessInner(int32_t timeoutMs, uint32_t displayId)
480 {
481     if (!Permission::IsSystem()) {
482         return false;
483     }
484     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Timing boost brightness: %{public}d, id: %{public}d", timeoutMs, displayId);
485     RETURN_IF_WITH_RET(timeoutMs <= 0, false);
486     auto iter = controllerMap_.find(displayId);
487     RETURN_IF_WITH_RET(iter == controllerMap_.end(), false);
488     return BrightnessManager::Get().BoostBrightness(timeoutMs);
489 }
490 
CancelBoostBrightnessInner(uint32_t displayId)491 bool DisplayPowerMgrService::CancelBoostBrightnessInner(uint32_t displayId)
492 {
493     if (!Permission::IsSystem()) {
494         return false;
495     }
496     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "Cancel boost brightness, id: %{public}d", displayId);
497     auto iter = controllerMap_.find(displayId);
498     RETURN_IF_WITH_RET(iter == controllerMap_.end(), false);
499     bool ret = BrightnessManager::Get().CancelBoostBrightness();
500     if (ret) {
501         return true;
502     }
503     return iter->second->CancelBoostBrightness();
504 }
505 
GetDeviceBrightnessInner(uint32_t displayId)506 uint32_t DisplayPowerMgrService::GetDeviceBrightnessInner(uint32_t displayId)
507 {
508     DISPLAY_HILOGD(FEAT_BRIGHTNESS, "GetDeviceBrightness displayId=%{public}u", displayId);
509     auto iter = controllerMap_.find(displayId);
510     if (iter == controllerMap_.end()) {
511         return BRIGHTNESS_OFF;
512     }
513     return BrightnessManager::Get().GetDeviceBrightness();
514 }
515 
SetCoordinatedInner(bool coordinated,uint32_t displayId)516 bool DisplayPowerMgrService::SetCoordinatedInner(bool coordinated, uint32_t displayId)
517 {
518     if (!Permission::IsSystem()) {
519         return false;
520     }
521     DISPLAY_HILOGD(FEAT_STATE, "Set coordinated=%{public}d, displayId=%{public}u", coordinated, displayId);
522     auto iter = controllerMap_.find(displayId);
523     RETURN_IF_WITH_RET(iter == controllerMap_.end(), false);
524     iter->second->SetCoordinated(coordinated);
525     return true;
526 }
527 
SetLightBrightnessThresholdInner(std::vector<int32_t> threshold,sptr<IDisplayBrightnessCallback> callback)528 uint32_t DisplayPowerMgrService::SetLightBrightnessThresholdInner(
529     std::vector<int32_t> threshold, sptr<IDisplayBrightnessCallback> callback)
530 {
531     if (!Permission::IsSystem()) {
532         return static_cast<uint32_t>(ERR_PERMISSION_DENIED);
533     }
534     return BrightnessManager::Get().SetLightBrightnessThreshold(threshold, callback);
535 }
536 
NotifyStateChangeCallback(uint32_t displayId,DisplayState state,uint32_t reason)537 void DisplayPowerMgrService::NotifyStateChangeCallback(uint32_t displayId, DisplayState state, uint32_t reason)
538 {
539     std::lock_guard lock(mutex_);
540     if (callback_ != nullptr) {
541         callback_->OnDisplayStateChanged(displayId, state, reason);
542     }
543 }
544 
DumpDisplayInfo(std::string & result)545 void DisplayPowerMgrService::DumpDisplayInfo(std::string& result)
546 {
547     for (auto& iter: controllerMap_) {
548         auto control = iter.second;
549         result.append("Display Id=").append(std::to_string(iter.first));
550         result.append(" State=").append(std::to_string(static_cast<uint32_t>(BrightnessManager::Get().GetState())));
551         result.append(" Discount=").append(std::to_string(BrightnessManager::Get().GetDiscount()));
552         result.append(" Brightness=").append(std::to_string(BrightnessManager::Get().GetBrightness()));
553         if (BrightnessManager::Get().IsBrightnessOverridden()) {
554             result.append(" OverrideBrightness=")
555                 .append(std::to_string(BrightnessManager::Get().GetScreenOnBrightness()));
556         }
557         if (BrightnessManager::Get().IsBrightnessBoosted()) {
558             result.append(" BoostBrightness=")
559                 .append(std::to_string(BrightnessManager::Get().GetScreenOnBrightness()));
560         }
561         result.append("\n");
562         result.append("DeviceBrightness=");
563         result.append(std::to_string(BrightnessManager::Get().GetDeviceBrightness())).append("\n");
564     }
565 }
566 
Dump(int32_t fd,const std::vector<std::u16string> & args)567 int32_t DisplayPowerMgrService::Dump(int32_t fd, const std::vector<std::u16string>& args)
568 {
569     if (!isBootCompleted_) {
570         return ERR_NO_INIT;
571     }
572     if (!Permission::IsSystem()) {
573         return ERR_PERMISSION_DENIED;
574     }
575     std::string result("DISPLAY POWER MANAGER DUMP:\n");
576     DumpDisplayInfo(result);
577 #ifdef ENABLE_SENSOR_PART
578     result.append("Support Ambient Light: ");
579     result.append(IsSupportLightSensor() ? "TRUE" : "FALSE");
580     result.append("\n");
581 
582     result.append("Auto Adjust Brightness: ");
583     result.append(IsAutoAdjustBrightnessInner() ? "ON" : "OFF");
584     result.append("\n");
585 #endif
586 
587     result.append("Brightness Limits: ").append("Max=" + std::to_string(GetMaxBrightnessInner()) + " ");
588     result.append("Min=" + std::to_string(GetMinBrightnessInner()) + " ");
589     result.append("Default=" + std::to_string(GetDefaultBrightnessInner())).append("\n");
590 
591     if (!SaveStringToFd(fd, result)) {
592         DISPLAY_HILOGE(COMP_SVC, "Failed to save dump info to fd");
593     }
594     return ERR_OK;
595 }
596 
GetSafeBrightness(uint32_t value)597 uint32_t DisplayPowerMgrService::GetSafeBrightness(uint32_t value)
598 {
599     auto brightnessValue = value;
600     if (brightnessValue > BRIGHTNESS_MAX) {
601         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "brightness value is greater than max, value=%{public}u", value);
602         brightnessValue = BRIGHTNESS_MAX;
603     }
604     if (brightnessValue < BRIGHTNESS_MIN) {
605         DISPLAY_HILOGD(FEAT_BRIGHTNESS, "brightness value is less than min, value=%{public}u", value);
606         brightnessValue = BRIGHTNESS_MIN;
607     }
608     return brightnessValue;
609 }
610 
GetSafeDiscount(double discount,uint32_t brightness)611 double DisplayPowerMgrService::GetSafeDiscount(double discount, uint32_t brightness)
612 {
613     auto safeDiscount = discount;
614     if (safeDiscount > DISCOUNT_MAX) {
615         DISPLAY_HILOGD(COMP_SVC, "discount value is greater than max, discount=%{public}lf", discount);
616         safeDiscount = DISCOUNT_MAX;
617     }
618     if (safeDiscount < DISCOUNT_MIN) {
619         DISPLAY_HILOGD(COMP_SVC, "discount value is less than min, discount=%{public}lf", discount);
620         safeDiscount = DISCOUNT_MIN;
621     }
622     if (static_cast<uint32_t>(BRIGHTNESS_MIN / safeDiscount) > BRIGHTNESS_MAX) {
623         DISPLAY_HILOGD(COMP_SVC, "brightness than max, brightness=%{public}u, discount=%{public}lf",
624                        static_cast<uint32_t>(BRIGHTNESS_MIN / safeDiscount), discount);
625         safeDiscount = static_cast<double>(BRIGHTNESS_MIN / static_cast<double>(brightness));
626     }
627 
628     return safeDiscount;
629 }
630 
GetError()631 DisplayErrors DisplayPowerMgrService::GetError()
632 {
633     DisplayErrors tmpError = lastError_;
634     lastError_ = DisplayErrors::ERR_OK;
635     return tmpError;
636 }
637 
OnRemoteDied(const wptr<IRemoteObject> & remote)638 void DisplayPowerMgrService::CallbackDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& remote)
639 {
640     DISPLAY_HILOGI(COMP_SVC, "CallbackDeathRecipient OnRemoteDied");
641     auto pms = DelayedSpSingleton<DisplayPowerMgrService>::GetInstance();
642     if (pms == nullptr) {
643         DISPLAY_HILOGI(COMP_SVC, "OnRemoteDied no service");
644         return;
645     }
646 
647     std::lock_guard lock(callbackMutex_);
648     pms->callback_ = nullptr;
649 }
650 
651 /**
652 * @brief Function to limit maximum screen brightness
653 * @param value  The max brightness level that needs to be restricted
654 * @param mode  0 = default mode, set param value as maxBrightness;
655 *               1 = enter testMode, when running unittest set maxBrightness to default value;
656 *               2 = exit testMode
657 * @return false = set failed; true = set Sucess
658 */
SetMaxBrightnessInner(double value,uint32_t mode)659 bool DisplayPowerMgrService::SetMaxBrightnessInner(double value, uint32_t mode)
660 {
661     if (!Permission::IsSystem()) {
662         lastError_ = DisplayErrors::ERR_SYSTEM_API_DENIED;
663         DISPLAY_HILOGE(COMP_SVC, "SetMaxBrightness Permission Error!");
664         return false;
665     }
666     if (mode == TEST_MODE) {
667         isInTestMode_ = true;
668         DISPLAY_HILOGI(COMP_SVC, "SetMaxBrightness enter TestMode");
669     }
670     if (mode == NORMAL_MODE) {
671         isInTestMode_ = false;
672         DISPLAY_HILOGI(COMP_SVC, "SetMaxBrightness cancel TestMode");
673     }
674     if (isInTestMode_) {
675         DISPLAY_HILOGI(COMP_SVC, "in the TestMode SetMaxBrightness to Default Value!");
676         double maxBrightness = 1.0;
677         return BrightnessManager::Get().SetMaxBrightness(maxBrightness);
678     }
679     return BrightnessManager::Get().SetMaxBrightness(value);
680 }
681 
682 /**
683 * @brief Function to limit maximum screen brightness
684 * @param maxNit  The max brightness Nit that needs to be restricted
685 * @param mode  0 = default mode, set param value as maxBrightness;
686 *               1 = enter testMode, when running unittest set maxBrightness to default value;
687 *               2 = exit testMode
688 * @return false = set failed; true = set Sucess
689 */
SetMaxBrightnessNitInner(uint32_t maxNit,uint32_t mode)690 bool DisplayPowerMgrService::SetMaxBrightnessNitInner(uint32_t maxNit, uint32_t mode)
691 {
692     if (!Permission::IsSystem()) {
693         lastError_ = DisplayErrors::ERR_SYSTEM_API_DENIED;
694         DISPLAY_HILOGE(COMP_SVC, "SetMaxBrightness Permission Error!");
695         return false;
696     }
697     if (mode == TEST_MODE) {
698         isInTestMode_ = true;
699         DISPLAY_HILOGI(COMP_SVC, "SetMaxBrightness enter TestMode");
700     }
701     if (mode == NORMAL_MODE) {
702         isInTestMode_ = false;
703         DISPLAY_HILOGI(COMP_SVC, "SetMaxBrightness cancel TestMode");
704     }
705     if (isInTestMode_) {
706         DISPLAY_HILOGI(COMP_SVC, "in the TestMode SetMaxBrightness to Default Value!");
707         uint32_t default_max_nit = 600;
708         return BrightnessManager::Get().SetMaxBrightnessNit(default_max_nit);
709     }
710     return BrightnessManager::Get().SetMaxBrightnessNit(maxNit);
711 }
712 
NotifyScreenPowerStatusInner(uint32_t displayId,uint32_t displayPowerStatus)713 int DisplayPowerMgrService::NotifyScreenPowerStatusInner(uint32_t displayId, uint32_t displayPowerStatus)
714 {
715     if (!Permission::IsSystem()) {
716         lastError_ = DisplayErrors::ERR_SYSTEM_API_DENIED;
717         return -1; // -1 means failed
718     }
719     DISPLAY_HILOGI(COMP_SVC, "[UL_POWER]NotifyScreenPowerStatus displayId=%{public}u, Status=%{public}u", displayId,
720         displayPowerStatus);
721     return BrightnessManager::Get().NotifyScreenPowerStatus(displayId, displayPowerStatus);
722 }
723 
SetDisplayState(uint32_t id,uint32_t state,uint32_t reason,bool & result)724 int32_t DisplayPowerMgrService::SetDisplayState(uint32_t id, uint32_t state, uint32_t reason, bool& result)
725 {
726     DisplayXCollie displayXCollie("DisplayPowerMgrService::SetDisplayState");
727     result = SetDisplayStateInner(id, static_cast<DisplayState>(state), reason);
728     return ERR_OK;
729 }
730 
GetDisplayState(uint32_t id,int32_t & displayState)731 int32_t DisplayPowerMgrService::GetDisplayState(uint32_t id, int32_t& displayState)
732 {
733     DisplayXCollie displayXCollie("DisplayPowerMgrService::GetDisplayState");
734     displayState = static_cast<int32_t>(GetDisplayStateInner(id));
735     return ERR_OK;
736 }
737 
GetDisplayIds(std::vector<uint32_t> & ids)738 int32_t DisplayPowerMgrService::GetDisplayIds(std::vector<uint32_t>& ids)
739 {
740     DisplayXCollie displayXCollie("DisplayPowerMgrService::GetDisplayIds");
741     auto idsTemp = GetDisplayIdsInner();
742     ids = std::move(idsTemp);
743     return ERR_OK;
744 }
745 
GetMainDisplayId(uint32_t & id)746 int32_t DisplayPowerMgrService::GetMainDisplayId(uint32_t& id)
747 {
748     DisplayXCollie displayXCollie("DisplayPowerMgrService::GetMainDisplayId");
749     id = GetMainDisplayIdInner();
750     return ERR_OK;
751 }
752 
SetBrightness(uint32_t value,uint32_t displayId,bool continuous,bool & result,int32_t & displayError)753 int32_t DisplayPowerMgrService::SetBrightness(uint32_t value, uint32_t displayId, bool continuous, bool& result,
754     int32_t& displayError)
755 {
756     DisplayXCollie displayXCollie("DisplayPowerMgrService::SetBrightness");
757     result = SetBrightnessInner(value, displayId, continuous);
758     displayError = static_cast<int32_t>(GetError());
759     return ERR_OK;
760 }
761 
DiscountBrightness(double discount,uint32_t displayId,bool & result)762 int32_t DisplayPowerMgrService::DiscountBrightness(double discount, uint32_t displayId, bool& result)
763 {
764     DisplayXCollie displayXCollie("DisplayPowerMgrService::DiscountBrightness");
765     result = DiscountBrightnessInner(discount, displayId);
766     return ERR_OK;
767 }
768 
OverrideBrightness(uint32_t brightness,uint32_t displayId,uint32_t duration,bool & result)769 int32_t DisplayPowerMgrService::OverrideBrightness(uint32_t brightness, uint32_t displayId, uint32_t duration,
770     bool& result)
771 {
772     DisplayXCollie displayXCollie("DisplayPowerMgrService::OverrideBrightness");
773     result = OverrideBrightnessInner(brightness, displayId, duration);
774     return ERR_OK;
775 }
776 
OverrideDisplayOffDelay(uint32_t delayMs,bool & result)777 int32_t DisplayPowerMgrService::OverrideDisplayOffDelay(uint32_t delayMs, bool& result)
778 {
779     DisplayXCollie displayXCollie("DisplayPowerMgrService::OverrideDisplayOffDelay");
780     result = OverrideDisplayOffDelayInner(delayMs);
781     return ERR_OK;
782 }
783 
RestoreBrightness(uint32_t displayId,uint32_t duration,bool & result)784 int32_t DisplayPowerMgrService::RestoreBrightness(uint32_t displayId, uint32_t duration, bool& result)
785 {
786     DisplayXCollie displayXCollie("DisplayPowerMgrService::GetBrightness");
787     result = RestoreBrightnessInner(displayId, duration);
788     return ERR_OK;
789 }
790 
GetBrightness(uint32_t displayId,uint32_t & brightness)791 int32_t DisplayPowerMgrService::GetBrightness(uint32_t displayId, uint32_t& brightness)
792 {
793     DisplayXCollie displayXCollie("DisplayPowerMgrService::GetBrightness");
794     brightness = GetBrightnessInner(displayId);
795     return ERR_OK;
796 }
797 
GetDefaultBrightness(uint32_t & defaultBrightness)798 int32_t DisplayPowerMgrService::GetDefaultBrightness(uint32_t& defaultBrightness)
799 {
800     DisplayXCollie displayXCollie("DisplayPowerMgrService::GetDefaultBrightness");
801     defaultBrightness = GetDefaultBrightnessInner();
802     return ERR_OK;
803 }
804 
GetMaxBrightness(uint32_t & maxBrightness)805 int32_t DisplayPowerMgrService::GetMaxBrightness(uint32_t& maxBrightness)
806 {
807     DisplayXCollie displayXCollie("DisplayPowerMgrService::GetMaxBrightness");
808     maxBrightness = GetMaxBrightnessInner();
809     return ERR_OK;
810 }
811 
GetMinBrightness(uint32_t & minBrightness)812 int32_t DisplayPowerMgrService::GetMinBrightness(uint32_t& minBrightness)
813 {
814     DisplayXCollie displayXCollie("DisplayPowerMgrService::GetMinBrightness");
815     minBrightness = GetMinBrightnessInner();
816     return ERR_OK;
817 }
818 
AdjustBrightness(uint32_t id,int32_t value,uint32_t duration,bool & result)819 int32_t DisplayPowerMgrService::AdjustBrightness(uint32_t id, int32_t value, uint32_t duration, bool& result)
820 {
821     DisplayXCollie displayXCollie("DisplayPowerMgrService::AdjustBrightness");
822     result = AdjustBrightnessInner(id, value, duration);
823     return ERR_OK;
824 }
825 
AutoAdjustBrightness(bool enable,bool & result)826 int32_t DisplayPowerMgrService::AutoAdjustBrightness(bool enable, bool& result)
827 {
828     DisplayXCollie displayXCollie("DisplayPowerMgrService::AutoAdjustBrightness");
829     result = AutoAdjustBrightnessInner(enable);
830     return ERR_OK;
831 }
832 
IsAutoAdjustBrightness(bool & result)833 int32_t DisplayPowerMgrService::IsAutoAdjustBrightness(bool& result)
834 {
835     DisplayXCollie displayXCollie("DisplayPowerMgrService::IsAutoAdjustBrightness");
836     result = IsAutoAdjustBrightnessInner();
837     return ERR_OK;
838 }
839 
RegisterCallback(const sptr<IDisplayPowerCallback> & callback,bool & result)840 int32_t DisplayPowerMgrService::RegisterCallback(const sptr<IDisplayPowerCallback>& callback, bool& result)
841 {
842     DisplayXCollie displayXCollie("DisplayPowerMgrService::RegisterCallback");
843     result = RegisterCallbackInner(callback);
844     return ERR_OK;
845 }
846 
BoostBrightness(int32_t timeoutMs,uint32_t displayId,bool & result)847 int32_t DisplayPowerMgrService::BoostBrightness(int32_t timeoutMs, uint32_t displayId, bool& result)
848 {
849     DisplayXCollie displayXCollie("DisplayPowerMgrService::BoostBrightness");
850     result = BoostBrightnessInner(timeoutMs, displayId);
851     return ERR_OK;
852 }
853 
CancelBoostBrightness(uint32_t displayId,bool & result)854 int32_t DisplayPowerMgrService::CancelBoostBrightness(uint32_t displayId, bool& result)
855 {
856     DisplayXCollie displayXCollie("DisplayPowerMgrService::CancelBoostBrightness");
857     result = CancelBoostBrightnessInner(displayId);
858     return ERR_OK;
859 }
860 
GetDeviceBrightness(uint32_t displayId,uint32_t & deviceBrightness)861 int32_t DisplayPowerMgrService::GetDeviceBrightness(uint32_t displayId, uint32_t& deviceBrightness)
862 {
863     DisplayXCollie displayXCollie("DisplayPowerMgrService::GetDeviceBrightness");
864     deviceBrightness = GetDeviceBrightnessInner(displayId);
865     return ERR_OK;
866 }
867 
SetCoordinated(bool coordinated,uint32_t displayId,bool & result)868 int32_t DisplayPowerMgrService::SetCoordinated(bool coordinated, uint32_t displayId, bool& result)
869 {
870     DisplayXCollie displayXCollie("DisplayPowerMgrService::SetCoordinated");
871     result = SetCoordinatedInner(coordinated, displayId);
872     return ERR_OK;
873 }
874 
SetLightBrightnessThreshold(const std::vector<int32_t> & threshold,const sptr<IDisplayBrightnessCallback> & callback,uint32_t & result)875 int32_t DisplayPowerMgrService::SetLightBrightnessThreshold(const std::vector<int32_t>& threshold,
876     const sptr<IDisplayBrightnessCallback>& callback, uint32_t& result)
877 {
878     DisplayXCollie displayXCollie("DisplayPowerMgrService::SetLightBrightnessThreshold");
879     result = SetLightBrightnessThresholdInner(threshold, callback);
880     return ERR_OK;
881 }
882 
SetMaxBrightness(double value,uint32_t mode,bool & result,int32_t & displayError)883 int32_t DisplayPowerMgrService::SetMaxBrightness(double value, uint32_t mode, bool& result, int32_t& displayError)
884 {
885     DisplayXCollie displayXCollie("DisplayPowerMgrService::SetMaxBrightness");
886     result = SetMaxBrightnessInner(value, mode);
887     displayError = static_cast<int32_t>(GetError());
888     return ERR_OK;
889 }
890 
SetMaxBrightnessNit(uint32_t maxNit,uint32_t mode,bool & result,int32_t & displayError)891 int32_t DisplayPowerMgrService::SetMaxBrightnessNit(uint32_t maxNit, uint32_t mode, bool& result,
892     int32_t& displayError)
893 {
894     DisplayXCollie displayXCollie("DisplayPowerMgrService::SetMaxBrightnessNit");
895     result = SetMaxBrightnessNitInner(maxNit, mode);
896     displayError = static_cast<int32_t>(GetError());
897     return ERR_OK;
898 }
899 
SetScreenOnBrightness(bool & result)900 int32_t DisplayPowerMgrService::SetScreenOnBrightness(bool& result)
901 {
902     DisplayXCollie displayXCollie("DisplayPowerMgrService::SetScreenOnBrightness");
903     result = SetScreenOnBrightnessInner();
904     return ERR_OK;
905 }
906 
NotifyScreenPowerStatus(uint32_t displayId,uint32_t displayPowerStatus,int32_t & result)907 int32_t DisplayPowerMgrService::NotifyScreenPowerStatus(uint32_t displayId, uint32_t displayPowerStatus,
908     int32_t& result)
909 {
910     DisplayXCollie displayXCollie("DisplayPowerMgrService::NotifyScreenPowerStatus");
911     result = NotifyScreenPowerStatusInner(displayId, displayPowerStatus);
912     return ERR_OK;
913 }
914 } // namespace DisplayPowerMgr
915 } // namespace OHOS
916