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