1 /*
2 * Copyright (c) 2021-2022 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_manager.h"
17
18 #include <chrono>
19 #include <cinttypes>
20 #include <transaction/rs_interfaces.h>
21 #include <ui/rs_surface_node.h>
22
23 #include "display_manager_adapter.h"
24 #include "display_manager_agent_default.h"
25 #include "dm_common.h"
26 #include "screen_manager.h"
27 #include "singleton_delegator.h"
28 #include "window_manager_hilog.h"
29
30 namespace OHOS::Rosen {
31 namespace {
32 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "DisplayManager"};
33 const static uint32_t MAX_RETRY_NUM = 6;
34 const static uint32_t RETRY_WAIT_MS = 500;
35 const static uint32_t MAX_DISPLAY_SIZE = 32;
36 const static uint32_t MAX_INTERVAL_US = 25000;
37 std::atomic<bool> g_dmIsDestroyed = false;
38 std::mutex snapBypickerMutex;
39 }
40 WM_IMPLEMENT_SINGLE_INSTANCE(DisplayManager)
41
42 class DisplayManager::Impl : public RefBase {
43 public:
Impl(std::recursive_mutex& mutex)44 Impl(std::recursive_mutex& mutex) : mutex_(mutex) {}
45 ~Impl();
46
47 static inline SingletonDelegator<DisplayManager> delegator;
48 bool CheckRectValid(const Media::Rect& rect, int32_t oriHeight, int32_t oriWidth) const;
49 bool CheckSizeValid(const Media::Size& size, int32_t oriHeight, int32_t oriWidth) const;
50 sptr<Display> GetDefaultDisplay();
51 sptr<Display> GetDefaultDisplaySync();
52 std::vector<DisplayPhysicalResolution> GetAllDisplayPhysicalResolution();
53 sptr<Display> GetDisplayById(DisplayId displayId);
54 DMError HasPrivateWindow(DisplayId displayId, bool& hasPrivateWindow);
55 bool ConvertScreenIdToRsScreenId(ScreenId screenId, ScreenId& rsScreenId);
56 bool IsFoldable();
57 bool IsCaptured();
58 FoldStatus GetFoldStatus();
59 FoldDisplayMode GetFoldDisplayMode();
60 void SetFoldDisplayMode(const FoldDisplayMode);
61 DMError SetFoldDisplayModeFromJs(const FoldDisplayMode);
62 void SetDisplayScale(ScreenId screenId, float scaleX, float scaleY, float pivotX, float pivotY);
63 void SetFoldStatusLocked(bool locked);
64 DMError SetFoldStatusLockedFromJs(bool locked);
65 sptr<FoldCreaseRegion> GetCurrentFoldCreaseRegion();
66 DMError RegisterDisplayListener(sptr<IDisplayListener> listener);
67 DMError UnregisterDisplayListener(sptr<IDisplayListener> listener);
68 bool SetDisplayState(DisplayState state, DisplayStateCallback callback);
69 DMError RegisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener);
70 DMError UnregisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener);
71 DMError RegisterScreenshotListener(sptr<IScreenshotListener> listener);
72 DMError UnregisterScreenshotListener(sptr<IScreenshotListener> listener);
73 DMError RegisterPrivateWindowListener(sptr<IPrivateWindowListener> listener);
74 DMError UnregisterPrivateWindowListener(sptr<IPrivateWindowListener> listener);
75 DMError RegisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener);
76 DMError UnregisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener);
77 DMError RegisterFoldStatusListener(sptr<IFoldStatusListener> listener);
78 DMError UnregisterFoldStatusListener(sptr<IFoldStatusListener> listener);
79 DMError RegisterFoldAngleListener(sptr<IFoldAngleListener> listener);
80 DMError UnregisterFoldAngleListener(sptr<IFoldAngleListener> listener);
81 DMError RegisterCaptureStatusListener(sptr<ICaptureStatusListener> listener);
82 DMError UnregisterCaptureStatusListener(sptr<ICaptureStatusListener> listener);
83 DMError RegisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener);
84 DMError UnregisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener);
85 DMError RegisterDisplayModeListener(sptr<IDisplayModeListener> listener);
86 DMError UnregisterDisplayModeListener(sptr<IDisplayModeListener> listener);
87 DMError RegisterAvailableAreaListener(sptr<IAvailableAreaListener> listener);
88 DMError UnregisterAvailableAreaListener(sptr<IAvailableAreaListener> listener);
89 sptr<Display> GetDisplayByScreenId(ScreenId screenId);
90 DMError ProxyForFreeze(const std::set<int32_t>& pidList, bool isProxy);
91 DMError ResetAllFreezeStatus();
92 DMError SetVirtualScreenSecurityExemption(ScreenId screenId, uint32_t pid, std::vector<uint64_t>& windowIdList);
93 void OnRemoteDied();
94 private:
95 void ClearDisplayStateCallback();
96 void ClearFoldStatusCallback();
97 void ClearFoldAngleCallback();
98 void ClearCaptureStatusCallback();
99 void ClearDisplayModeCallback();
100 void NotifyPrivateWindowStateChanged(bool hasPrivate);
101 void NotifyPrivateStateWindowListChanged(DisplayId id, std::vector<std::string> privacyWindowList);
102 void NotifyScreenshot(sptr<ScreenshotInfo> info);
103 void NotifyDisplayPowerEvent(DisplayPowerEvent event, EventStatus status);
104 void NotifyDisplayStateChanged(DisplayId id, DisplayState state);
105 void NotifyDisplayChangedEvent(sptr<DisplayInfo> info, DisplayChangeEvent event);
106 void NotifyDisplayCreate(sptr<DisplayInfo> info);
107 void NotifyDisplayDestroy(DisplayId);
108 void NotifyDisplayChange(sptr<DisplayInfo> displayInfo);
109 bool UpdateDisplayInfoLocked(sptr<DisplayInfo>);
110 void NotifyFoldStatusChanged(FoldStatus foldStatus);
111 void NotifyFoldAngleChanged(std::vector<float> foldAngles);
112 void NotifyCaptureStatusChanged(bool isCapture);
113 void NotifyDisplayChangeInfoChanged(const sptr<DisplayChangeInfo>& info);
114 void NotifyDisplayModeChanged(FoldDisplayMode displayMode);
115 void NotifyAvailableAreaChanged(DMRect rect);
116 void Clear();
117 std::string GetDisplayInfoSrting(sptr<DisplayInfo> displayInfo);
118
119 DisplayId defaultDisplayId_ = DISPLAY_ID_INVALID;
120 std::map<DisplayId, sptr<Display>> displayMap_;
121 DisplayStateCallback displayStateCallback_;
122 std::recursive_mutex& mutex_;
123 std::set<sptr<IDisplayListener>> displayListeners_;
124 std::set<sptr<IDisplayPowerEventListener>> powerEventListeners_;
125 std::set<sptr<IScreenshotListener>> screenshotListeners_;
126 std::set<sptr<IPrivateWindowListener>> privateWindowListeners_;
127 std::set<sptr<IPrivateWindowListChangeListener>> privateWindowListChangeListeners_;
128 std::set<sptr<IFoldStatusListener>> foldStatusListeners_;
129 std::set<sptr<IFoldAngleListener>> foldAngleListeners_;
130 std::set<sptr<ICaptureStatusListener>> captureStatusListeners_;
131 std::set<sptr<IDisplayUpdateListener>> displayUpdateListeners_;
132 std::set<sptr<IDisplayModeListener>> displayModeListeners_;
133 std::set<sptr<IAvailableAreaListener>> availableAreaListeners_;
134 class DisplayManagerListener;
135 sptr<DisplayManagerListener> displayManagerListener_;
136 class DisplayManagerAgent;
137 sptr<DisplayManagerAgent> displayStateAgent_;
138 sptr<DisplayManagerAgent> powerEventListenerAgent_;
139 class DisplayManagerScreenshotAgent;
140 sptr<DisplayManagerScreenshotAgent> screenshotListenerAgent_;
141 class DisplayManagerPrivateWindowAgent;
142 sptr<DisplayManagerPrivateWindowAgent> privateWindowListenerAgent_;
143 class DisplayManagerPrivateWindowListAgent;
144 sptr<DisplayManagerPrivateWindowListAgent> privateWindowListChangeListenerAgent_;
145 class DisplayManagerFoldStatusAgent;
146 sptr<DisplayManagerFoldStatusAgent> foldStatusListenerAgent_;
147 class DisplayManagerFoldAngleAgent;
148 sptr<DisplayManagerFoldAngleAgent> foldAngleListenerAgent_;
149 class DisplayManagerCaptureStatusAgent;
150 sptr<DisplayManagerCaptureStatusAgent> captureStatusListenerAgent_;
151 class DisplayManagerDisplayUpdateAgent;
152 sptr<DisplayManagerDisplayUpdateAgent> displayUpdateListenerAgent_;
153 class DisplayManagerDisplayModeAgent;
154 sptr<DisplayManagerDisplayModeAgent> displayModeListenerAgent_;
155 class DisplayManagerAvailableAreaAgent;
156 sptr<DisplayManagerAvailableAreaAgent> availableAreaListenerAgent_;
157 };
158
159 class DisplayManager::Impl::DisplayManagerListener : public DisplayManagerAgentDefault {
160 public:
DisplayManagerListener(sptr<Impl> impl)161 explicit DisplayManagerListener(sptr<Impl> impl) : pImpl_(impl)
162 {
163 }
164
165 void OnDisplayCreate(sptr<DisplayInfo> displayInfo) override
166 {
167 if (displayInfo == nullptr || displayInfo->GetDisplayId() == DISPLAY_ID_INVALID) {
168 WLOGFE("OnDisplayCreate, displayInfo is invalid.");
169 return;
170 }
171 if (pImpl_ == nullptr) {
172 WLOGFE("OnDisplayCreate, impl is nullptr.");
173 return;
174 }
175 pImpl_->NotifyDisplayCreate(displayInfo);
176 std::set<sptr<IDisplayListener>> displayListeners;
177 {
178 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
179 displayListeners = pImpl_->displayListeners_;
180 }
181 for (auto listener : displayListeners) {
182 listener->OnCreate(displayInfo->GetDisplayId());
183 }
184 };
185
186 void OnDisplayDestroy(DisplayId displayId) override
187 {
188 if (displayId == DISPLAY_ID_INVALID) {
189 WLOGFE("OnDisplayDestroy, displayId is invalid.");
190 return;
191 }
192 if (pImpl_ == nullptr) {
193 WLOGFE("OnDisplayDestroy, impl is nullptr.");
194 return;
195 }
196 pImpl_->NotifyDisplayDestroy(displayId);
197 std::set<sptr<IDisplayListener>> displayListeners;
198 {
199 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
200 displayListeners = pImpl_->displayListeners_;
201 }
202 for (auto listener : displayListeners) {
203 listener->OnDestroy(displayId);
204 }
205 };
206
207 void OnDisplayChange(sptr<DisplayInfo> displayInfo, DisplayChangeEvent event) override
208 {
209 if (displayInfo == nullptr || displayInfo->GetDisplayId() == DISPLAY_ID_INVALID) {
210 WLOGFE("OnDisplayChange, displayInfo is invalid.");
211 return;
212 }
213 if (pImpl_ == nullptr) {
214 WLOGFE("OnDisplayChange, impl is nullptr.");
215 return;
216 }
217 WLOGD("OnDisplayChange. display %{public}" PRIu64", event %{public}u", displayInfo->GetDisplayId(), event);
218 pImpl_->NotifyDisplayChange(displayInfo);
219 std::set<sptr<IDisplayListener>> displayListeners;
220 {
221 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
222 displayListeners = pImpl_->displayListeners_;
223 }
224 for (auto listener : displayListeners) {
225 listener->OnChange(displayInfo->GetDisplayId());
226 }
227 };
228 private:
229 sptr<Impl> pImpl_;
230 };
231
232 class DisplayManager::Impl::DisplayManagerAgent : public DisplayManagerAgentDefault {
233 public:
DisplayManagerAgent(sptr<Impl> impl)234 explicit DisplayManagerAgent(sptr<Impl> impl) : pImpl_(impl)
235 {
236 }
237 ~DisplayManagerAgent() = default;
238
239 virtual void NotifyDisplayPowerEvent(DisplayPowerEvent event, EventStatus status) override
240 {
241 pImpl_->NotifyDisplayPowerEvent(event, status);
242 }
243
244 virtual void NotifyDisplayStateChanged(DisplayId id, DisplayState state) override
245 {
246 pImpl_->NotifyDisplayStateChanged(id, state);
247 }
248 private:
249 sptr<Impl> pImpl_;
250 };
251
252 class DisplayManager::Impl::DisplayManagerScreenshotAgent : public DisplayManagerAgentDefault {
253 public:
DisplayManagerScreenshotAgent(sptr<Impl> impl)254 explicit DisplayManagerScreenshotAgent(sptr<Impl> impl) : pImpl_(impl)
255 {
256 }
257 ~DisplayManagerScreenshotAgent() = default;
258
259 virtual void OnScreenshot(sptr<ScreenshotInfo> info) override
260 {
261 pImpl_->NotifyScreenshot(info);
262 }
263 private:
264 sptr<Impl> pImpl_;
265 };
266
267 class DisplayManager::Impl::DisplayManagerPrivateWindowAgent : public DisplayManagerAgentDefault {
268 public:
DisplayManagerPrivateWindowAgent(sptr<Impl> impl)269 explicit DisplayManagerPrivateWindowAgent(sptr<Impl> impl) : pImpl_(impl)
270 {
271 }
272 ~DisplayManagerPrivateWindowAgent() = default;
273
274 virtual void NotifyPrivateWindowStateChanged(bool hasPrivate) override
275 {
276 pImpl_->NotifyPrivateWindowStateChanged(hasPrivate);
277 }
278 private:
279 sptr<Impl> pImpl_;
280 };
281
282 class DisplayManager::Impl::DisplayManagerPrivateWindowListAgent : public DisplayManagerAgentDefault {
283 public:
DisplayManagerPrivateWindowListAgent(sptr<Impl> impl)284 explicit DisplayManagerPrivateWindowListAgent(sptr<Impl> impl) : pImpl_(impl)
285 {
286 }
287 ~DisplayManagerPrivateWindowListAgent() = default;
288
289 virtual void NotifyPrivateStateWindowListChanged(DisplayId id, std::vector<std::string> privacyWindowList) override
290 {
291 pImpl_->NotifyPrivateStateWindowListChanged(id, privacyWindowList);
292 }
293 private:
294 sptr<Impl> pImpl_;
295 };
296
297 class DisplayManager::Impl::DisplayManagerFoldStatusAgent : public DisplayManagerAgentDefault {
298 public:
DisplayManagerFoldStatusAgent(sptr<Impl> impl)299 explicit DisplayManagerFoldStatusAgent(sptr<Impl> impl) : pImpl_(impl)
300 {
301 }
302 ~DisplayManagerFoldStatusAgent() = default;
303
304 virtual void NotifyFoldStatusChanged(FoldStatus foldStatus) override
305 {
306 pImpl_->NotifyFoldStatusChanged(foldStatus);
307 }
308 private:
309 sptr<Impl> pImpl_;
310 };
311
312 class DisplayManager::Impl::DisplayManagerFoldAngleAgent : public DisplayManagerAgentDefault {
313 public:
DisplayManagerFoldAngleAgent(sptr<Impl> impl)314 explicit DisplayManagerFoldAngleAgent(sptr<Impl> impl) : pImpl_(impl)
315 {
316 }
317 ~DisplayManagerFoldAngleAgent() = default;
318
319 virtual void NotifyFoldAngleChanged(std::vector<float> foldAngles) override
320 {
321 pImpl_->NotifyFoldAngleChanged(foldAngles);
322 }
323 private:
324 sptr<Impl> pImpl_;
325 };
326
327 class DisplayManager::Impl::DisplayManagerCaptureStatusAgent : public DisplayManagerAgentDefault {
328 public:
DisplayManagerCaptureStatusAgent(sptr<Impl> impl)329 explicit DisplayManagerCaptureStatusAgent(sptr<Impl> impl) : pImpl_(impl)
330 {
331 }
332 ~DisplayManagerCaptureStatusAgent() = default;
333
334 virtual void NotifyCaptureStatusChanged(bool isCapture) override
335 {
336 pImpl_->NotifyCaptureStatusChanged(isCapture);
337 }
338 private:
339 sptr<Impl> pImpl_;
340 };
341
342 class DisplayManager::Impl::DisplayManagerDisplayUpdateAgent : public DisplayManagerAgentDefault {
343 public:
DisplayManagerDisplayUpdateAgent(sptr<Impl> impl)344 explicit DisplayManagerDisplayUpdateAgent(sptr<Impl> impl) : pImpl_(impl)
345 {
346 }
347 ~DisplayManagerDisplayUpdateAgent() = default;
348
349 virtual void NotifyDisplayChangeInfoChanged(const sptr<DisplayChangeInfo>& info) override
350 {
351 pImpl_->NotifyDisplayChangeInfoChanged(info);
352 }
353 private:
354 sptr<Impl> pImpl_;
355 };
356
357
358 class DisplayManager::Impl::DisplayManagerDisplayModeAgent : public DisplayManagerAgentDefault {
359 public:
DisplayManagerDisplayModeAgent(sptr<Impl> impl)360 explicit DisplayManagerDisplayModeAgent(sptr<Impl> impl) : pImpl_(impl)
361 {
362 }
363 ~DisplayManagerDisplayModeAgent() = default;
364
365 virtual void NotifyDisplayModeChanged(FoldDisplayMode displayMode) override
366 {
367 pImpl_->NotifyDisplayModeChanged(displayMode);
368 }
369 private:
370 sptr<Impl> pImpl_;
371 };
372
373 class DisplayManager::Impl::DisplayManagerAvailableAreaAgent : public DisplayManagerAgentDefault {
374 public:
DisplayManagerAvailableAreaAgent(sptr<Impl> impl)375 explicit DisplayManagerAvailableAreaAgent(sptr<Impl> impl) : pImpl_(impl)
376 {
377 }
378 ~DisplayManagerAvailableAreaAgent() = default;
379
380 virtual void NotifyAvailableAreaChanged(DMRect area) override
381 {
382 pImpl_->NotifyAvailableAreaChanged(area);
383 }
384 private:
385 sptr<Impl> pImpl_;
386 };
387
CheckRectValid(const Media::Rect& rect, int32_t oriHeight, int32_t oriWidth) const388 bool DisplayManager::Impl::CheckRectValid(const Media::Rect& rect, int32_t oriHeight, int32_t oriWidth) const
389 {
390 if (rect.left < 0) {
391 return false;
392 }
393 if (rect.top < 0) {
394 return false;
395 }
396 if (rect.width < 0) {
397 return false;
398 }
399 if (rect.height < 0) {
400 return false;
401 }
402 if (rect.width + rect.left > oriWidth) {
403 return false;
404 }
405 if (rect.height + rect.top > oriHeight) {
406 return false;
407 }
408 return true;
409 }
410
CheckSizeValid(const Media::Size& size, int32_t oriHeight, int32_t oriWidth) const411 bool DisplayManager::Impl::CheckSizeValid(const Media::Size& size, int32_t oriHeight, int32_t oriWidth) const
412 {
413 if (size.width < 0) {
414 return false;
415 }
416 if (size.height < 0) {
417 return false;
418 }
419 if (size.width > MAX_RESOLUTION_SIZE_SCREENSHOT) {
420 return false;
421 }
422 if (size.height > MAX_RESOLUTION_SIZE_SCREENSHOT) {
423 return false;
424 }
425 return true;
426 }
427
ClearDisplayStateCallback()428 void DisplayManager::Impl::ClearDisplayStateCallback()
429 {
430 std::lock_guard<std::recursive_mutex> lock(mutex_);
431 WLOGFD("[UL_POWER]Clear displaystatecallback enter");
432 displayStateCallback_ = nullptr;
433 if (displayStateAgent_ != nullptr) {
434 WLOGFI("[UL_POWER]UnregisterDisplayManagerAgent enter and displayStateAgent_ is cleared");
435 SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(displayStateAgent_,
436 DisplayManagerAgentType::DISPLAY_STATE_LISTENER);
437 displayStateAgent_ = nullptr;
438 }
439 }
440
ClearFoldStatusCallback()441 void DisplayManager::Impl::ClearFoldStatusCallback()
442 {
443 DMError res = DMError::DM_OK;
444 std::lock_guard<std::recursive_mutex> lock(mutex_);
445 if (foldStatusListenerAgent_ != nullptr) {
446 res = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(foldStatusListenerAgent_,
447 DisplayManagerAgentType::FOLD_STATUS_CHANGED_LISTENER);
448 foldStatusListenerAgent_ = nullptr;
449 WLOGI("ClearFoldStatusCallback foldStatusListenerAgent_ is nullptr !");
450 }
451 if (res != DMError::DM_OK) {
452 WLOGFW("UnregisterDisplayManagerAgent FOLD_STATUS_CHANGED_LISTENER failed !");
453 }
454 }
455
ClearFoldAngleCallback()456 void DisplayManager::Impl::ClearFoldAngleCallback()
457 {
458 std::lock_guard<std::recursive_mutex> lock(mutex_);
459 if (foldAngleListenerAgent_ == nullptr) {
460 return;
461 }
462 DMError res = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
463 foldAngleListenerAgent_, DisplayManagerAgentType::FOLD_ANGLE_CHANGED_LISTENER);
464 foldAngleListenerAgent_ = nullptr;
465 if (res != DMError::DM_OK) {
466 WLOGFE("ClearFoldAngleCallback FOLD_ANGLE_CHANGED_LISTENER failed !");
467 } else {
468 WLOGI("ClearFoldAngleCallback foldAngleListenerAgent_!");
469 }
470 }
471
ClearCaptureStatusCallback()472 void DisplayManager::Impl::ClearCaptureStatusCallback()
473 {
474 std::lock_guard<std::recursive_mutex> lock(mutex_);
475 if (captureStatusListenerAgent_ == nullptr) {
476 return;
477 }
478 DMError res = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
479 captureStatusListenerAgent_, DisplayManagerAgentType::CAPTURE_STATUS_CHANGED_LISTENER);
480 captureStatusListenerAgent_ = nullptr;
481 if (res != DMError::DM_OK) {
482 WLOGFE("ClearCaptureStatusCallback FOLD_ANGLE_CHANGED_LISTENER failed !");
483 } else {
484 WLOGI("ClearCaptureStatusCallback captureStatusListenerAgent_!");
485 }
486 }
487
ClearDisplayModeCallback()488 void DisplayManager::Impl::ClearDisplayModeCallback()
489 {
490 DMError res = DMError::DM_OK;
491 std::lock_guard<std::recursive_mutex> lock(mutex_);
492 if (displayModeListenerAgent_ != nullptr) {
493 res = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(displayModeListenerAgent_,
494 DisplayManagerAgentType::DISPLAY_MODE_CHANGED_LISTENER);
495 displayModeListenerAgent_ = nullptr;
496 WLOGI("ClearDisplayStateCallback displayModeListenerAgent_ is nullptr !");
497 }
498 if (res != DMError::DM_OK) {
499 WLOGFW("UnregisterDisplayManagerAgent DISPLAY_MODE_CHANGED_LISTENER failed !");
500 }
501 }
502
Clear()503 void DisplayManager::Impl::Clear()
504 {
505 WLOGFI("Clear displaymanager listener");
506 std::lock_guard<std::recursive_mutex> lock(mutex_);
507 DMError res = DMError::DM_OK;
508 if (displayManagerListener_ != nullptr) {
509 res = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
510 displayManagerListener_, DisplayManagerAgentType::DISPLAY_EVENT_LISTENER);
511 }
512 displayManagerListener_ = nullptr;
513 if (res != DMError::DM_OK) {
514 WLOGFW("UnregisterDisplayManagerAgent DISPLAY_EVENT_LISTENER failed !");
515 }
516 res = DMError::DM_OK;
517 if (powerEventListenerAgent_ != nullptr) {
518 res = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
519 powerEventListenerAgent_, DisplayManagerAgentType::DISPLAY_POWER_EVENT_LISTENER);
520 }
521 powerEventListenerAgent_ = nullptr;
522 if (res != DMError::DM_OK) {
523 WLOGFW("UnregisterDisplayManagerAgent DISPLAY_POWER_EVENT_LISTENER failed !");
524 }
525 ClearDisplayStateCallback();
526 ClearFoldStatusCallback();
527 ClearFoldAngleCallback();
528 ClearCaptureStatusCallback();
529 ClearDisplayModeCallback();
530 }
531
~Impl()532 DisplayManager::Impl::~Impl()
533 {
534 Clear();
535 }
536
DisplayManager()537 DisplayManager::DisplayManager() : pImpl_(new Impl(mutex_))
538 {
539 WLOGFD("Create displaymanager instance");
540 g_dmIsDestroyed = false;
541 }
542
~DisplayManager()543 DisplayManager::~DisplayManager()
544 {
545 WLOGFI("Destroy displaymanager instance");
546 g_dmIsDestroyed = true;
547 }
548
GetDefaultDisplayId()549 DisplayId DisplayManager::GetDefaultDisplayId()
550 {
551 auto info = SingletonContainer::Get<DisplayManagerAdapter>().GetDefaultDisplayInfo();
552 if (info == nullptr) {
553 return DISPLAY_ID_INVALID;
554 }
555 return info->GetDisplayId();
556 }
557
GetDefaultDisplay()558 sptr<Display> DisplayManager::Impl::GetDefaultDisplay()
559 {
560 auto displayInfo = SingletonContainer::Get<DisplayManagerAdapter>().GetDefaultDisplayInfo();
561 if (displayInfo == nullptr) {
562 return nullptr;
563 }
564 auto displayId = displayInfo->GetDisplayId();
565 std::lock_guard<std::recursive_mutex> lock(mutex_);
566 if (!UpdateDisplayInfoLocked(displayInfo)) {
567 displayMap_.erase(displayId);
568 return nullptr;
569 }
570 return displayMap_[displayId];
571 }
572
GetDefaultDisplaySync()573 sptr<Display> DisplayManager::Impl::GetDefaultDisplaySync()
574 {
575 static std::chrono::steady_clock::time_point lastRequestTime = std::chrono::steady_clock::now();
576 auto currentTime = std::chrono::steady_clock::now();
577 auto interval = std::chrono::duration_cast<std::chrono::microseconds>(currentTime - lastRequestTime).count();
578 if (defaultDisplayId_ != DISPLAY_ID_INVALID && interval < MAX_INTERVAL_US) {
579 std::lock_guard<std::recursive_mutex> lock(mutex_);
580 auto iter = displayMap_.find(defaultDisplayId_);
581 if (iter != displayMap_.end()) {
582 return displayMap_[defaultDisplayId_];
583 }
584 }
585
586 uint32_t retryTimes = 0;
587 sptr<DisplayInfo> displayInfo = nullptr;
588 while (retryTimes < MAX_RETRY_NUM) {
589 displayInfo = SingletonContainer::Get<DisplayManagerAdapter>().GetDefaultDisplayInfo();
590 if (displayInfo != nullptr) {
591 break;
592 }
593 retryTimes++;
594 WLOGFW("Current get display info is null, retry %{public}u times", retryTimes);
595 std::this_thread::sleep_for(std::chrono::milliseconds(RETRY_WAIT_MS));
596 }
597 if (retryTimes >= MAX_RETRY_NUM || displayInfo == nullptr) {
598 WLOGFE("Get display info failed, please check whether the onscreenchange event is triggered");
599 return nullptr;
600 }
601
602 auto displayId = displayInfo->GetDisplayId();
603 std::lock_guard<std::recursive_mutex> lock(mutex_);
604 if (!UpdateDisplayInfoLocked(displayInfo)) {
605 displayMap_.erase(displayId);
606 return nullptr;
607 }
608 lastRequestTime = currentTime;
609 defaultDisplayId_ = displayId;
610 return displayMap_[displayId];
611 }
612
GetDisplayById(DisplayId displayId)613 sptr<Display> DisplayManager::Impl::GetDisplayById(DisplayId displayId)
614 {
615 WLOGFD("GetDisplayById start, displayId: %{public}" PRIu64" ", displayId);
616 auto displayInfo = SingletonContainer::Get<DisplayManagerAdapter>().GetDisplayInfo(displayId);
617 std::lock_guard<std::recursive_mutex> lock(mutex_);
618 if (!UpdateDisplayInfoLocked(displayInfo)) {
619 displayMap_.erase(displayId);
620 return nullptr;
621 }
622 return displayMap_[displayId];
623 }
624
GetDisplayById(DisplayId displayId)625 sptr<Display> DisplayManager::GetDisplayById(DisplayId displayId)
626 {
627 if (g_dmIsDestroyed) {
628 WLOGFI("DM has been destructed");
629 return nullptr;
630 }
631 std::lock_guard<std::recursive_mutex> lock(mutex_);
632 return pImpl_->GetDisplayById(displayId);
633 }
634
GetDisplayByScreen(ScreenId screenId)635 sptr<Display> DisplayManager::GetDisplayByScreen(ScreenId screenId)
636 {
637 if (screenId == SCREEN_ID_INVALID) {
638 WLOGFE("screenId is invalid.");
639 return nullptr;
640 }
641 sptr<Display> display = pImpl_->GetDisplayByScreenId(screenId);
642 if (display == nullptr) {
643 WLOGFE("get display by screenId failed. screen %{public}" PRIu64"", screenId);
644 }
645 return display;
646 }
647
GetDisplayByScreenId(ScreenId screenId)648 sptr<Display> DisplayManager::Impl::GetDisplayByScreenId(ScreenId screenId)
649 {
650 sptr<DisplayInfo> displayInfo = SingletonContainer::Get<DisplayManagerAdapter>().GetDisplayInfoByScreenId(screenId);
651 if (displayInfo == nullptr) {
652 WLOGFE("get display by screenId: displayInfo is null");
653 return nullptr;
654 }
655 DisplayId displayId = displayInfo->GetDisplayId();
656 if (displayId == DISPLAY_ID_INVALID) {
657 WLOGFE("get display by screenId: invalid displayInfo");
658 return nullptr;
659 }
660
661 std::lock_guard<std::recursive_mutex> lock(mutex_);
662 if (!UpdateDisplayInfoLocked(displayInfo)) {
663 displayMap_.erase(displayId);
664 return nullptr;
665 }
666 return displayMap_[displayId];
667 }
668
GetScreenshot(DisplayId displayId, DmErrorCode* errorCode)669 std::shared_ptr<Media::PixelMap> DisplayManager::GetScreenshot(DisplayId displayId, DmErrorCode* errorCode)
670 {
671 if (displayId == DISPLAY_ID_INVALID) {
672 WLOGFE("displayId invalid!");
673 return nullptr;
674 }
675 std::shared_ptr<Media::PixelMap> screenShot =
676 SingletonContainer::Get<DisplayManagerAdapter>().GetDisplaySnapshot(displayId, errorCode);
677 if (screenShot == nullptr) {
678 WLOGFE("DisplayManager::GetScreenshot failed!");
679 return nullptr;
680 }
681
682 return screenShot;
683 }
684
GetSnapshotByPicker(Media::Rect &rect, DmErrorCode* errorCode)685 std::shared_ptr<Media::PixelMap> DisplayManager::GetSnapshotByPicker(Media::Rect &rect, DmErrorCode* errorCode)
686 {
687 std::unique_lock<std::mutex> lock(snapBypickerMutex, std::defer_lock);
688 if (!lock.try_lock()) {
689 WLOGFE("DisplayManager::GetSnapshotByPicker try_lock failed!");
690 return nullptr;
691 }
692 std::shared_ptr<Media::PixelMap> screenShot =
693 SingletonContainer::Get<DisplayManagerAdapter>().GetSnapshotByPicker(rect, errorCode);
694 lock.unlock();
695 if (screenShot == nullptr) {
696 WLOGFE("DisplayManager::GetSnapshotByPicker failed!");
697 return nullptr;
698 }
699 WLOGFI("snapshot area left:%{public}d, top:%{public}d, width:%{public}d, height:%{public}d",
700 rect.left, rect.top, rect.width, rect.height);
701 // create crop pixel map
702 if (rect.width == 0 || rect.height == 0) {
703 WLOGFE("width or height is invalid!");
704 return nullptr;
705 }
706 Media::InitializationOptions opt;
707 opt.size.width = rect.width;
708 opt.size.height = rect.height;
709 opt.scaleMode = Media::ScaleMode::FIT_TARGET_SIZE;
710 opt.editable = false;
711 auto pixelMap = Media::PixelMap::Create(*screenShot, rect, opt);
712 if (pixelMap == nullptr) {
713 WLOGFE("Media pixel map create failed");
714 return nullptr;
715 }
716 return pixelMap;
717 }
718
GetScreenshot(DisplayId displayId, const Media::Rect &rect, const Media::Size &size, int rotation, DmErrorCode* errorCode)719 std::shared_ptr<Media::PixelMap> DisplayManager::GetScreenshot(DisplayId displayId, const Media::Rect &rect,
720 const Media::Size &size, int rotation, DmErrorCode* errorCode)
721 {
722 std::shared_ptr<Media::PixelMap> screenShot = GetScreenshot(displayId, errorCode);
723 if (screenShot == nullptr) {
724 WLOGFE("DisplayManager::GetScreenshot failed!");
725 return nullptr;
726 }
727
728 // check parameters
729 int32_t oriHeight = screenShot->GetHeight();
730 int32_t oriWidth = screenShot->GetWidth();
731 if (!pImpl_->CheckRectValid(rect, oriHeight, oriWidth)) {
732 WLOGFE("rect invalid! left %{public}d, top %{public}d, w %{public}d, h %{public}d",
733 rect.left, rect.top, rect.width, rect.height);
734 return nullptr;
735 }
736 if (!pImpl_->CheckSizeValid(size, oriHeight, oriWidth)) {
737 WLOGFE("size invalid! w %{public}d, h %{public}d", rect.width, rect.height);
738 return nullptr;
739 }
740
741 // create crop dest pixelmap
742 Media::InitializationOptions opt;
743 opt.size.width = size.width;
744 opt.size.height = size.height;
745 opt.scaleMode = Media::ScaleMode::FIT_TARGET_SIZE;
746 opt.editable = false;
747 auto pixelMap = Media::PixelMap::Create(*screenShot, rect, opt);
748 if (pixelMap == nullptr) {
749 WLOGFE("Media::PixelMap::Create failed!");
750 return nullptr;
751 }
752 std::shared_ptr<Media::PixelMap> dstScreenshot(pixelMap.release());
753
754 return dstScreenshot;
755 }
756
GetDefaultDisplay()757 sptr<Display> DisplayManager::GetDefaultDisplay()
758 {
759 return pImpl_->GetDefaultDisplay();
760 }
761
AddDisplayIdFromAms(DisplayId displayId, const wptr<IRemoteObject>& abilityToken)762 void DisplayManager::AddDisplayIdFromAms(DisplayId displayId, const wptr<IRemoteObject>& abilityToken)
763 {
764 if (abilityToken == nullptr || displayId == DISPLAY_ID_INVALID) {
765 WLOGFE("abilityToken is nullptr or display id invalid.");
766 return;
767 }
768 std::lock_guard<std::mutex> lock(displayOperateMutex_);
769 auto iter = std::find_if(displayIdList_.begin(), displayIdList_.end(),
770 [displayId, abilityToken](const auto &item) -> bool {
771 return item.first == abilityToken && item.second == displayId;
772 });
773 if (iter != displayIdList_.end()) {
774 WLOGFI("abilityToken and display[%{public}" PRIu64"] has been added.", displayId);
775 } else {
776 displayIdList_.push_back(std::make_pair(abilityToken, displayId));
777 }
778 ShowDisplayIdList(true);
779 }
780
RemoveDisplayIdFromAms(const wptr<IRemoteObject>& abilityToken)781 void DisplayManager::RemoveDisplayIdFromAms(const wptr<IRemoteObject>& abilityToken)
782 {
783 if (abilityToken == nullptr) {
784 WLOGFE("abilityToken is nullptr.");
785 return;
786 }
787 std::lock_guard<std::mutex> lock(displayOperateMutex_);
788 if (displayIdList_.empty()) {
789 WLOGFI("displayIdList_ is empty.");
790 return;
791 }
792 auto iter = std::find_if(displayIdList_.begin(), displayIdList_.end(),
793 [abilityToken](const auto &item) -> bool {
794 return item.first == abilityToken;
795 });
796 if (iter != displayIdList_.end()) {
797 displayIdList_.erase(iter);
798 }
799 ShowDisplayIdList(true);
800 }
801
GetCallingAbilityDisplayId()802 DisplayId DisplayManager::GetCallingAbilityDisplayId()
803 {
804 DisplayId displayId = DISPLAY_ID_INVALID;
805 std::lock_guard<std::mutex> lock(displayOperateMutex_);
806 if (displayIdList_.empty()) {
807 WLOGFI("displayIdList is empty.");
808 return displayId;
809 }
810 int displayCount = 0;
811 for (const auto &iter : displayIdList_) {
812 if (displayId == DISPLAY_ID_INVALID || displayId != iter.second) {
813 displayCount++;
814 }
815 displayId = iter.second;
816 if (displayCount > 1) {
817 break;
818 }
819 }
820 ShowDisplayIdList(false);
821 return displayCount == 1 ? displayId : DISPLAY_ID_INVALID;
822 }
823
ShowDisplayIdList(bool isShowLog)824 void DisplayManager::ShowDisplayIdList(bool isShowLog)
825 {
826 std::ostringstream oss;
827 oss << "current display id list:[";
828 for (const auto &iter : displayIdList_) {
829 oss << iter.second << ",";
830 }
831 if (isShowLog) {
832 WLOGFD("%{public}s]", oss.str().c_str());
833 } else {
834 WLOGFI("%{public}s]", oss.str().c_str());
835 }
836 }
837
GetDefaultDisplaySync(bool isFromNapi)838 sptr<Display> DisplayManager::GetDefaultDisplaySync(bool isFromNapi)
839 {
840 if (isFromNapi) {
841 sptr<Display> display = nullptr;
842 DisplayId displayId = GetCallingAbilityDisplayId();
843 if (displayId != DISPLAY_ID_INVALID) {
844 WLOGFI("displayId:%{public}" PRIu64, displayId);
845 display = pImpl_->GetDisplayById(displayId);
846 }
847 if (display != nullptr) {
848 return display;
849 } else {
850 WLOGFI("get displayId:%{public}" PRIu64" info nullptr.", displayId);
851 }
852 }
853 return pImpl_->GetDefaultDisplaySync();
854 }
855
GetAllDisplayIds()856 std::vector<DisplayId> DisplayManager::GetAllDisplayIds()
857 {
858 return SingletonContainer::Get<DisplayManagerAdapter>().GetAllDisplayIds();
859 }
860
GetAllDisplayPhysicalResolution()861 std::vector<DisplayPhysicalResolution> DisplayManager::Impl::GetAllDisplayPhysicalResolution()
862 {
863 return SingletonContainer::Get<DisplayManagerAdapter>().GetAllDisplayPhysicalResolution();
864 }
865
GetAllDisplayPhysicalResolution()866 std::vector<DisplayPhysicalResolution> DisplayManager::GetAllDisplayPhysicalResolution()
867 {
868 return pImpl_->GetAllDisplayPhysicalResolution();
869 }
870
GetAllDisplays()871 std::vector<sptr<Display>> DisplayManager::GetAllDisplays()
872 {
873 WLOGFD("GetAllDisplays start");
874 std::vector<sptr<Display>> res;
875 auto displayIds = GetAllDisplayIds();
876 for (auto displayId : displayIds) {
877 const sptr<Display> display = GetDisplayById(displayId);
878 if (display != nullptr) {
879 res.emplace_back(display);
880 } else {
881 WLOGFE("DisplayManager::GetAllDisplays display %" PRIu64" nullptr!", displayId);
882 }
883 }
884 return res;
885 }
886
HasPrivateWindow(DisplayId displayId, bool& hasPrivateWindow)887 DMError DisplayManager::HasPrivateWindow(DisplayId displayId, bool& hasPrivateWindow)
888 {
889 return pImpl_->HasPrivateWindow(displayId, hasPrivateWindow);
890 }
891
HasPrivateWindow(DisplayId displayId, bool& hasPrivateWindow)892 DMError DisplayManager::Impl::HasPrivateWindow(DisplayId displayId, bool& hasPrivateWindow)
893 {
894 return SingletonContainer::Get<DisplayManagerAdapter>().HasPrivateWindow(displayId, hasPrivateWindow);
895 }
896
IsFoldable()897 bool DisplayManager::IsFoldable()
898 {
899 return pImpl_->IsFoldable();
900 }
901
IsFoldable()902 bool DisplayManager::Impl::IsFoldable()
903 {
904 return SingletonContainer::Get<DisplayManagerAdapter>().IsFoldable();
905 }
906
IsCaptured()907 bool DisplayManager::IsCaptured()
908 {
909 return pImpl_->IsCaptured();
910 }
911
IsCaptured()912 bool DisplayManager::Impl::IsCaptured()
913 {
914 return SingletonContainer::Get<DisplayManagerAdapter>().IsCaptured();
915 }
916
GetFoldStatus()917 FoldStatus DisplayManager::GetFoldStatus()
918 {
919 return pImpl_->GetFoldStatus();
920 }
921
GetFoldStatus()922 FoldStatus DisplayManager::Impl::GetFoldStatus()
923 {
924 return SingletonContainer::Get<DisplayManagerAdapter>().GetFoldStatus();
925 }
926
GetFoldDisplayMode()927 FoldDisplayMode DisplayManager::GetFoldDisplayMode()
928 {
929 return pImpl_->GetFoldDisplayMode();
930 }
931
GetFoldDisplayMode()932 FoldDisplayMode DisplayManager::Impl::GetFoldDisplayMode()
933 {
934 return SingletonContainer::Get<DisplayManagerAdapter>().GetFoldDisplayMode();
935 }
936
SetFoldDisplayMode(const FoldDisplayMode mode)937 void DisplayManager::SetFoldDisplayMode(const FoldDisplayMode mode)
938 {
939 pImpl_->SetFoldDisplayMode(mode);
940 }
941
SetFoldDisplayModeFromJs(const FoldDisplayMode mode)942 DMError DisplayManager::SetFoldDisplayModeFromJs(const FoldDisplayMode mode)
943 {
944 return pImpl_->SetFoldDisplayModeFromJs(mode);
945 }
946
SetDisplayScale(ScreenId screenId, float scaleX, float scaleY, float pivotX, float pivotY)947 void DisplayManager::SetDisplayScale(ScreenId screenId, float scaleX, float scaleY, float pivotX, float pivotY)
948 {
949 pImpl_->SetDisplayScale(screenId, scaleX, scaleY, pivotX, pivotY);
950 }
951
SetDisplayScale(ScreenId screenId, float scaleX, float scaleY, float pivotX, float pivotY)952 void DisplayManager::Impl::SetDisplayScale(ScreenId screenId,
953 float scaleX, float scaleY, float pivotX, float pivotY)
954 {
955 SingletonContainer::Get<DisplayManagerAdapter>().SetDisplayScale(screenId, scaleX, scaleY, pivotX, pivotY);
956 }
957
SetFoldDisplayMode(const FoldDisplayMode mode)958 void DisplayManager::Impl::SetFoldDisplayMode(const FoldDisplayMode mode)
959 {
960 SingletonContainer::Get<DisplayManagerAdapter>().SetFoldDisplayMode(mode);
961 }
962
SetFoldDisplayModeFromJs(const FoldDisplayMode mode)963 DMError DisplayManager::Impl::SetFoldDisplayModeFromJs(const FoldDisplayMode mode)
964 {
965 return SingletonContainer::Get<DisplayManagerAdapter>().SetFoldDisplayModeFromJs(mode);
966 }
967
SetFoldStatusLocked(bool locked)968 void DisplayManager::SetFoldStatusLocked(bool locked)
969 {
970 pImpl_->SetFoldStatusLocked(locked);
971 }
972
SetFoldStatusLockedFromJs(bool locked)973 DMError DisplayManager::SetFoldStatusLockedFromJs(bool locked)
974 {
975 return pImpl_->SetFoldStatusLockedFromJs(locked);
976 }
977
SetFoldStatusLocked(bool locked)978 void DisplayManager::Impl::SetFoldStatusLocked(bool locked)
979 {
980 SingletonContainer::Get<DisplayManagerAdapter>().SetFoldStatusLocked(locked);
981 }
982
SetFoldStatusLockedFromJs(bool locked)983 DMError DisplayManager::Impl::SetFoldStatusLockedFromJs(bool locked)
984 {
985 return SingletonContainer::Get<DisplayManagerAdapter>().SetFoldStatusLockedFromJs(locked);
986 }
987
GetCurrentFoldCreaseRegion()988 sptr<FoldCreaseRegion> DisplayManager::GetCurrentFoldCreaseRegion()
989 {
990 return pImpl_->GetCurrentFoldCreaseRegion();
991 }
992
GetCurrentFoldCreaseRegion()993 sptr<FoldCreaseRegion> DisplayManager::Impl::GetCurrentFoldCreaseRegion()
994 {
995 return SingletonContainer::Get<DisplayManagerAdapter>().GetCurrentFoldCreaseRegion();
996 }
997
RegisterDisplayListener(sptr<IDisplayListener> listener)998 DMError DisplayManager::Impl::RegisterDisplayListener(sptr<IDisplayListener> listener)
999 {
1000 std::lock_guard<std::recursive_mutex> lock(mutex_);
1001 DMError ret = DMError::DM_OK;
1002 if (displayManagerListener_ == nullptr) {
1003 displayManagerListener_ = new DisplayManagerListener(this);
1004 ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1005 displayManagerListener_,
1006 DisplayManagerAgentType::DISPLAY_EVENT_LISTENER);
1007 }
1008 if (ret != DMError::DM_OK) {
1009 WLOGFW("RegisterDisplayManagerAgent failed !");
1010 displayManagerListener_ = nullptr;
1011 } else {
1012 displayListeners_.insert(listener);
1013 }
1014 return ret;
1015 }
1016
NotifyPrivateWindowStateChanged(bool hasPrivate)1017 void DisplayManager::Impl::NotifyPrivateWindowStateChanged(bool hasPrivate)
1018 {
1019 std::set<sptr<IPrivateWindowListener>> privateWindowListeners;
1020 {
1021 std::lock_guard<std::recursive_mutex> lock(mutex_);
1022 privateWindowListeners = privateWindowListeners_;
1023 }
1024 for (auto& listener : privateWindowListeners) {
1025 listener->OnPrivateWindow(hasPrivate);
1026 }
1027 }
1028
NotifyPrivateStateWindowListChanged(DisplayId id, std::vector<std::string> privacyWindowList)1029 void DisplayManager::Impl::NotifyPrivateStateWindowListChanged(DisplayId id, std::vector<std::string> privacyWindowList)
1030 {
1031 std::set<sptr<IPrivateWindowListChangeListener>> privateWindowListChangeListeners;
1032 {
1033 std::lock_guard<std::recursive_mutex> lock(mutex_);
1034 privateWindowListChangeListeners = privateWindowListChangeListeners_;
1035 }
1036 for (auto& listener : privateWindowListChangeListeners) {
1037 listener->OnPrivateWindowListChange(id, privacyWindowList);
1038 }
1039 }
1040
RegisterPrivateWindowListener(sptr<IPrivateWindowListener> listener)1041 DMError DisplayManager::RegisterPrivateWindowListener(sptr<IPrivateWindowListener> listener)
1042 {
1043 if (listener == nullptr) {
1044 WLOGFE("RegisterPrivateWindowListener listener is nullptr.");
1045 return DMError::DM_ERROR_NULLPTR;
1046 }
1047 return pImpl_->RegisterPrivateWindowListener(listener);
1048 }
1049
UnregisterPrivateWindowListener(sptr<IPrivateWindowListener> listener)1050 DMError DisplayManager::UnregisterPrivateWindowListener(sptr<IPrivateWindowListener> listener)
1051 {
1052 if (listener == nullptr) {
1053 WLOGFE("UnregisterPrivateWindowListener listener is nullptr.");
1054 return DMError::DM_ERROR_NULLPTR;
1055 }
1056 return pImpl_->UnregisterPrivateWindowListener(listener);
1057 }
1058
RegisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener)1059 DMError DisplayManager::RegisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener)
1060 {
1061 if (listener == nullptr) {
1062 WLOGFE("RegisterPrivateWindowListChangeListener listener is nullptr.");
1063 return DMError::DM_ERROR_NULLPTR;
1064 }
1065 return pImpl_->RegisterPrivateWindowListChangeListener(listener);
1066 }
1067
UnregisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener)1068 DMError DisplayManager::UnregisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener)
1069 {
1070 if (listener == nullptr) {
1071 WLOGFE("UnregisterPrivateWindowListChangeListener listener is nullptr.");
1072 return DMError::DM_ERROR_NULLPTR;
1073 }
1074 return pImpl_->UnregisterPrivateWindowListChangeListener(listener);
1075 }
1076
RegisterPrivateWindowListener(sptr<IPrivateWindowListener> listener)1077 DMError DisplayManager::Impl::RegisterPrivateWindowListener(sptr<IPrivateWindowListener> listener)
1078 {
1079 std::lock_guard<std::recursive_mutex> lock(mutex_);
1080 DMError ret = DMError::DM_OK;
1081 if (privateWindowListenerAgent_ == nullptr) {
1082 privateWindowListenerAgent_ = new DisplayManagerPrivateWindowAgent(this);
1083 ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1084 privateWindowListenerAgent_,
1085 DisplayManagerAgentType::PRIVATE_WINDOW_LISTENER);
1086 }
1087 if (ret != DMError::DM_OK) {
1088 WLOGFW("RegisterDisplayManagerAgent failed !");
1089 privateWindowListenerAgent_ = nullptr;
1090 } else {
1091 WLOGI("privateWindowListener register success");
1092 privateWindowListeners_.insert(listener);
1093 }
1094 return ret;
1095 }
1096
UnregisterPrivateWindowListener(sptr<IPrivateWindowListener> listener)1097 DMError DisplayManager::Impl::UnregisterPrivateWindowListener(sptr<IPrivateWindowListener> listener)
1098 {
1099 std::lock_guard<std::recursive_mutex> lock(mutex_);
1100 auto iter = std::find(privateWindowListeners_.begin(), privateWindowListeners_.end(), listener);
1101 if (iter == privateWindowListeners_.end()) {
1102 WLOGFE("could not find this listener");
1103 return DMError::DM_ERROR_NULLPTR;
1104 }
1105 privateWindowListeners_.erase(iter);
1106 DMError ret = DMError::DM_OK;
1107 if (privateWindowListeners_.empty() && privateWindowListenerAgent_ != nullptr) {
1108 ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1109 privateWindowListenerAgent_,
1110 DisplayManagerAgentType::PRIVATE_WINDOW_LISTENER);
1111 privateWindowListenerAgent_ = nullptr;
1112 }
1113 return ret;
1114 }
1115
RegisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener)1116 DMError DisplayManager::Impl::RegisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener)
1117 {
1118 std::lock_guard<std::recursive_mutex> lock(mutex_);
1119 DMError ret = DMError::DM_OK;
1120 if (privateWindowListChangeListenerAgent_ == nullptr) {
1121 privateWindowListChangeListenerAgent_ = new DisplayManagerPrivateWindowListAgent(this);
1122 ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1123 privateWindowListChangeListenerAgent_,
1124 DisplayManagerAgentType::PRIVATE_WINDOW_LIST_LISTENER);
1125 }
1126 if (ret != DMError::DM_OK) {
1127 WLOGFW("RegisterDisplayManagerAgent failed !");
1128 privateWindowListChangeListenerAgent_ = nullptr;
1129 } else {
1130 WLOGI("privateWindowListChangeListener register success");
1131 privateWindowListChangeListeners_.insert(listener);
1132 }
1133 return ret;
1134 }
1135
UnregisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener)1136 DMError DisplayManager::Impl::UnregisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener)
1137 {
1138 std::lock_guard<std::recursive_mutex> lock(mutex_);
1139 auto iter = std::find(privateWindowListChangeListeners_.begin(), privateWindowListChangeListeners_.end(), listener);
1140 if (iter == privateWindowListChangeListeners_.end()) {
1141 WLOGFE("could not find this listener");
1142 return DMError::DM_ERROR_NULLPTR;
1143 }
1144 privateWindowListChangeListeners_.erase(iter);
1145 DMError ret = DMError::DM_OK;
1146 if (privateWindowListChangeListeners_.empty() && privateWindowListChangeListenerAgent_ != nullptr) {
1147 ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1148 privateWindowListChangeListenerAgent_,
1149 DisplayManagerAgentType::PRIVATE_WINDOW_LIST_LISTENER);
1150 privateWindowListChangeListenerAgent_ = nullptr;
1151 }
1152 return ret;
1153 }
1154
RegisterDisplayListener(sptr<IDisplayListener> listener)1155 DMError DisplayManager::RegisterDisplayListener(sptr<IDisplayListener> listener)
1156 {
1157 if (listener == nullptr) {
1158 WLOGFE("RegisterDisplayListener listener is nullptr.");
1159 return DMError::DM_ERROR_NULLPTR;
1160 }
1161 return pImpl_->RegisterDisplayListener(listener);
1162 }
1163
UnregisterDisplayListener(sptr<IDisplayListener> listener)1164 DMError DisplayManager::Impl::UnregisterDisplayListener(sptr<IDisplayListener> listener)
1165 {
1166 std::lock_guard<std::recursive_mutex> lock(mutex_);
1167 auto iter = std::find(displayListeners_.begin(), displayListeners_.end(), listener);
1168 if (iter == displayListeners_.end()) {
1169 WLOGFE("could not find this listener");
1170 return DMError::DM_ERROR_NULLPTR;
1171 }
1172 displayListeners_.erase(iter);
1173 DMError ret = DMError::DM_OK;
1174 if (displayListeners_.empty() && displayManagerListener_ != nullptr) {
1175 ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1176 displayManagerListener_,
1177 DisplayManagerAgentType::DISPLAY_EVENT_LISTENER);
1178 displayManagerListener_ = nullptr;
1179 }
1180 return ret;
1181 }
1182
UnregisterDisplayListener(sptr<IDisplayListener> listener)1183 DMError DisplayManager::UnregisterDisplayListener(sptr<IDisplayListener> listener)
1184 {
1185 if (listener == nullptr) {
1186 WLOGFW("UnregisterDisplayListener listener is nullptr.");
1187 return DMError::DM_ERROR_NULLPTR;
1188 }
1189 return pImpl_->UnregisterDisplayListener(listener);
1190 }
1191
RegisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener)1192 DMError DisplayManager::Impl::RegisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener)
1193 {
1194 std::lock_guard<std::recursive_mutex> lock(mutex_);
1195 DMError ret = DMError::DM_OK;
1196 if (powerEventListenerAgent_ == nullptr) {
1197 powerEventListenerAgent_ = new DisplayManagerAgent(this);
1198 ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1199 powerEventListenerAgent_,
1200 DisplayManagerAgentType::DISPLAY_POWER_EVENT_LISTENER);
1201 }
1202 if (ret != DMError::DM_OK) {
1203 WLOGFW("RegisterDisplayManagerAgent failed !");
1204 powerEventListenerAgent_ = nullptr;
1205 } else {
1206 powerEventListeners_.insert(listener);
1207 }
1208 WLOGFD("RegisterDisplayPowerEventListener end");
1209 return ret;
1210 }
1211
RegisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener)1212 DMError DisplayManager::RegisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener)
1213 {
1214 if (listener == nullptr) {
1215 WLOGFE("listener is nullptr");
1216 return DMError::DM_ERROR_NULLPTR;
1217 }
1218 return pImpl_->RegisterDisplayPowerEventListener(listener);
1219 }
1220
UnregisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener)1221 DMError DisplayManager::Impl::UnregisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener)
1222 {
1223 std::lock_guard<std::recursive_mutex> lock(mutex_);
1224 auto iter = std::find(powerEventListeners_.begin(), powerEventListeners_.end(), listener);
1225 if (iter == powerEventListeners_.end()) {
1226 WLOGFE("could not find this listener");
1227 return DMError::DM_ERROR_NULLPTR;
1228 }
1229 powerEventListeners_.erase(iter);
1230 DMError ret = DMError::DM_OK;
1231 if (powerEventListeners_.empty() && powerEventListenerAgent_ != nullptr) {
1232 ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1233 powerEventListenerAgent_,
1234 DisplayManagerAgentType::DISPLAY_POWER_EVENT_LISTENER);
1235 powerEventListenerAgent_ = nullptr;
1236 }
1237 WLOGFD("UnregisterDisplayPowerEventListener end");
1238 return ret;
1239 }
1240
UnregisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener)1241 DMError DisplayManager::UnregisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener)
1242 {
1243 if (listener == nullptr) {
1244 WLOGFE("listener is nullptr");
1245 return DMError::DM_ERROR_NULLPTR;
1246 }
1247 return pImpl_->UnregisterDisplayPowerEventListener(listener);
1248 }
1249
RegisterScreenshotListener(sptr<IScreenshotListener> listener)1250 DMError DisplayManager::Impl::RegisterScreenshotListener(sptr<IScreenshotListener> listener)
1251 {
1252 std::lock_guard<std::recursive_mutex> lock(mutex_);
1253 DMError ret = DMError::DM_OK;
1254 if (screenshotListenerAgent_ == nullptr) {
1255 screenshotListenerAgent_ = new DisplayManagerScreenshotAgent(this);
1256 ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1257 screenshotListenerAgent_,
1258 DisplayManagerAgentType::SCREENSHOT_EVENT_LISTENER);
1259 }
1260 if (ret != DMError::DM_OK) {
1261 WLOGFW("RegisterDisplayManagerAgent failed !");
1262 screenshotListenerAgent_ = nullptr;
1263 } else {
1264 screenshotListeners_.insert(listener);
1265 }
1266 return ret;
1267 }
1268
RegisterScreenshotListener(sptr<IScreenshotListener> listener)1269 DMError DisplayManager::RegisterScreenshotListener(sptr<IScreenshotListener> listener)
1270 {
1271 if (listener == nullptr) {
1272 WLOGFE("RegisterScreenshotListener listener is nullptr.");
1273 return DMError::DM_ERROR_NULLPTR;
1274 }
1275 return pImpl_->RegisterScreenshotListener(listener);
1276 }
1277
UnregisterScreenshotListener(sptr<IScreenshotListener> listener)1278 DMError DisplayManager::Impl::UnregisterScreenshotListener(sptr<IScreenshotListener> listener)
1279 {
1280 std::lock_guard<std::recursive_mutex> lock(mutex_);
1281 auto iter = std::find(screenshotListeners_.begin(), screenshotListeners_.end(), listener);
1282 if (iter == screenshotListeners_.end()) {
1283 WLOGFE("could not find this listener");
1284 return DMError::DM_ERROR_NULLPTR;
1285 }
1286 screenshotListeners_.erase(iter);
1287 DMError ret = DMError::DM_OK;
1288 if (screenshotListeners_.empty() && screenshotListenerAgent_ != nullptr) {
1289 ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1290 screenshotListenerAgent_,
1291 DisplayManagerAgentType::SCREENSHOT_EVENT_LISTENER);
1292 screenshotListenerAgent_ = nullptr;
1293 }
1294 return ret;
1295 }
1296
UnregisterScreenshotListener(sptr<IScreenshotListener> listener)1297 DMError DisplayManager::UnregisterScreenshotListener(sptr<IScreenshotListener> listener)
1298 {
1299 if (listener == nullptr) {
1300 WLOGFE("UnregisterScreenshotListener listener is nullptr.");
1301 return DMError::DM_ERROR_NULLPTR;
1302 }
1303 return pImpl_->UnregisterScreenshotListener(listener);
1304 }
1305
NotifyFoldAngleChanged(std::vector<float> foldAngles)1306 void DisplayManager::Impl::NotifyFoldAngleChanged(std::vector<float> foldAngles)
1307 {
1308 std::set<sptr<IFoldAngleListener>> foldAngleListeners;
1309 {
1310 std::lock_guard<std::recursive_mutex> lock(mutex_);
1311 foldAngleListeners = foldAngleListeners_;
1312 }
1313 for (auto& listener : foldAngleListeners) {
1314 listener->OnFoldAngleChanged(foldAngles);
1315 }
1316 }
1317
RegisterFoldAngleListener(sptr<IFoldAngleListener> listener)1318 DMError DisplayManager::RegisterFoldAngleListener(sptr<IFoldAngleListener> listener)
1319 {
1320 if (listener == nullptr) {
1321 WLOGFE("IFoldAngleListener listener is nullptr.");
1322 return DMError::DM_ERROR_NULLPTR;
1323 }
1324 return pImpl_->RegisterFoldAngleListener(listener);
1325 }
1326
RegisterFoldAngleListener(sptr<IFoldAngleListener> listener)1327 DMError DisplayManager::Impl::RegisterFoldAngleListener(sptr<IFoldAngleListener> listener)
1328 {
1329 std::lock_guard<std::recursive_mutex> lock(mutex_);
1330 DMError ret = DMError::DM_OK;
1331 if (foldAngleListenerAgent_ == nullptr) {
1332 foldAngleListenerAgent_ = new DisplayManagerFoldAngleAgent(this);
1333 ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1334 foldAngleListenerAgent_,
1335 DisplayManagerAgentType::FOLD_ANGLE_CHANGED_LISTENER);
1336 }
1337 if (ret != DMError::DM_OK) {
1338 WLOGFW("RegisterFoldAngleListener failed !");
1339 foldAngleListenerAgent_ = nullptr;
1340 } else {
1341 WLOGD("IFoldAngleListener register success");
1342 foldAngleListeners_.insert(listener);
1343 }
1344 return ret;
1345 }
1346
UnregisterFoldAngleListener(sptr<IFoldAngleListener> listener)1347 DMError DisplayManager::UnregisterFoldAngleListener(sptr<IFoldAngleListener> listener)
1348 {
1349 if (listener == nullptr) {
1350 WLOGFE("UnregisterFoldAngleListener listener is nullptr.");
1351 return DMError::DM_ERROR_NULLPTR;
1352 }
1353 return pImpl_->UnregisterFoldAngleListener(listener);
1354 }
1355
UnregisterFoldAngleListener(sptr<IFoldAngleListener> listener)1356 DMError DisplayManager::Impl::UnregisterFoldAngleListener(sptr<IFoldAngleListener> listener)
1357 {
1358 std::lock_guard<std::recursive_mutex> lock(mutex_);
1359 auto iter = std::find(foldAngleListeners_.begin(), foldAngleListeners_.end(), listener);
1360 if (iter == foldAngleListeners_.end()) {
1361 WLOGFE("could not find this listener");
1362 return DMError::DM_ERROR_NULLPTR;
1363 }
1364 foldAngleListeners_.erase(iter);
1365 DMError ret = DMError::DM_OK;
1366 if (foldAngleListeners_.empty() && foldAngleListenerAgent_ != nullptr) {
1367 ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1368 foldAngleListenerAgent_,
1369 DisplayManagerAgentType::FOLD_ANGLE_CHANGED_LISTENER);
1370 foldAngleListenerAgent_ = nullptr;
1371 }
1372 return ret;
1373 }
1374
NotifyCaptureStatusChanged(bool isCapture)1375 void DisplayManager::Impl::NotifyCaptureStatusChanged(bool isCapture)
1376 {
1377 std::set<sptr<ICaptureStatusListener>> captureStatusListeners;
1378 {
1379 std::lock_guard<std::recursive_mutex> lock(mutex_);
1380 captureStatusListeners = captureStatusListeners_;
1381 }
1382 for (auto& listener : captureStatusListeners) {
1383 listener->OnCaptureStatusChanged(isCapture);
1384 }
1385 }
1386
RegisterCaptureStatusListener(sptr<ICaptureStatusListener> listener)1387 DMError DisplayManager::RegisterCaptureStatusListener(sptr<ICaptureStatusListener> listener)
1388 {
1389 if (listener == nullptr) {
1390 WLOGFE("ICaptureStatusListener listener is nullptr.");
1391 return DMError::DM_ERROR_NULLPTR;
1392 }
1393 return pImpl_->RegisterCaptureStatusListener(listener);
1394 }
1395
RegisterCaptureStatusListener(sptr<ICaptureStatusListener> listener)1396 DMError DisplayManager::Impl::RegisterCaptureStatusListener(sptr<ICaptureStatusListener> listener)
1397 {
1398 std::lock_guard<std::recursive_mutex> lock(mutex_);
1399 DMError ret = DMError::DM_OK;
1400 if (captureStatusListenerAgent_ == nullptr) {
1401 captureStatusListenerAgent_ = new DisplayManagerCaptureStatusAgent(this);
1402 ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1403 captureStatusListenerAgent_,
1404 DisplayManagerAgentType::CAPTURE_STATUS_CHANGED_LISTENER);
1405 }
1406 if (ret != DMError::DM_OK) {
1407 WLOGFE("RegisterCaptureStatusListener failed !");
1408 captureStatusListenerAgent_ = nullptr;
1409 } else {
1410 WLOGD("ICaptureStatusListener register success");
1411 captureStatusListeners_.insert(listener);
1412 }
1413 return ret;
1414 }
1415
UnregisterCaptureStatusListener(sptr<ICaptureStatusListener> listener)1416 DMError DisplayManager::UnregisterCaptureStatusListener(sptr<ICaptureStatusListener> listener)
1417 {
1418 if (listener == nullptr) {
1419 WLOGFE("UnregisterCaptureStatusListener listener is nullptr.");
1420 return DMError::DM_ERROR_NULLPTR;
1421 }
1422 return pImpl_->UnregisterCaptureStatusListener(listener);
1423 }
1424
UnregisterCaptureStatusListener(sptr<ICaptureStatusListener> listener)1425 DMError DisplayManager::Impl::UnregisterCaptureStatusListener(sptr<ICaptureStatusListener> listener)
1426 {
1427 std::lock_guard<std::recursive_mutex> lock(mutex_);
1428 auto iter = std::find(captureStatusListeners_.begin(), captureStatusListeners_.end(), listener);
1429 if (iter == captureStatusListeners_.end()) {
1430 WLOGFE("could not find this listener");
1431 return DMError::DM_ERROR_NULLPTR;
1432 }
1433 captureStatusListeners_.erase(iter);
1434 DMError ret = DMError::DM_OK;
1435 if (captureStatusListeners_.empty() && captureStatusListenerAgent_ != nullptr) {
1436 ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1437 captureStatusListenerAgent_,
1438 DisplayManagerAgentType::CAPTURE_STATUS_CHANGED_LISTENER);
1439 captureStatusListenerAgent_ = nullptr;
1440 }
1441 return ret;
1442 }
1443
NotifyFoldStatusChanged(FoldStatus foldStatus)1444 void DisplayManager::Impl::NotifyFoldStatusChanged(FoldStatus foldStatus)
1445 {
1446 std::set<sptr<IFoldStatusListener>> foldStatusListeners;
1447 {
1448 std::lock_guard<std::recursive_mutex> lock(mutex_);
1449 foldStatusListeners = foldStatusListeners_;
1450 }
1451 for (auto& listener : foldStatusListeners) {
1452 listener->OnFoldStatusChanged(foldStatus);
1453 }
1454 }
1455
RegisterFoldStatusListener(sptr<IFoldStatusListener> listener)1456 DMError DisplayManager::RegisterFoldStatusListener(sptr<IFoldStatusListener> listener)
1457 {
1458 if (listener == nullptr) {
1459 WLOGFE("IFoldStatusListener listener is nullptr.");
1460 return DMError::DM_ERROR_NULLPTR;
1461 }
1462 return pImpl_->RegisterFoldStatusListener(listener);
1463 }
1464
RegisterFoldStatusListener(sptr<IFoldStatusListener> listener)1465 DMError DisplayManager::Impl::RegisterFoldStatusListener(sptr<IFoldStatusListener> listener)
1466 {
1467 std::lock_guard<std::recursive_mutex> lock(mutex_);
1468 DMError ret = DMError::DM_OK;
1469 if (foldStatusListenerAgent_ == nullptr) {
1470 foldStatusListenerAgent_ = new DisplayManagerFoldStatusAgent(this);
1471 ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1472 foldStatusListenerAgent_,
1473 DisplayManagerAgentType::FOLD_STATUS_CHANGED_LISTENER);
1474 }
1475 if (ret != DMError::DM_OK) {
1476 WLOGFW("RegisterFoldStatusListener failed !");
1477 foldStatusListenerAgent_ = nullptr;
1478 } else {
1479 WLOGD("IFoldStatusListener register success");
1480 foldStatusListeners_.insert(listener);
1481 }
1482 return ret;
1483 }
1484
UnregisterFoldStatusListener(sptr<IFoldStatusListener> listener)1485 DMError DisplayManager::UnregisterFoldStatusListener(sptr<IFoldStatusListener> listener)
1486 {
1487 if (listener == nullptr) {
1488 WLOGFE("UnregisterFoldStatusListener listener is nullptr.");
1489 return DMError::DM_ERROR_NULLPTR;
1490 }
1491 return pImpl_->UnregisterFoldStatusListener(listener);
1492 }
1493
UnregisterFoldStatusListener(sptr<IFoldStatusListener> listener)1494 DMError DisplayManager::Impl::UnregisterFoldStatusListener(sptr<IFoldStatusListener> listener)
1495 {
1496 std::lock_guard<std::recursive_mutex> lock(mutex_);
1497 auto iter = std::find(foldStatusListeners_.begin(), foldStatusListeners_.end(), listener);
1498 if (iter == foldStatusListeners_.end()) {
1499 WLOGFE("could not find this listener");
1500 return DMError::DM_ERROR_NULLPTR;
1501 }
1502 foldStatusListeners_.erase(iter);
1503 DMError ret = DMError::DM_OK;
1504 if (foldStatusListeners_.empty() && foldStatusListenerAgent_ != nullptr) {
1505 ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1506 foldStatusListenerAgent_,
1507 DisplayManagerAgentType::FOLD_STATUS_CHANGED_LISTENER);
1508 foldStatusListenerAgent_ = nullptr;
1509 }
1510 return ret;
1511 }
1512
NotifyDisplayChangeInfoChanged(const sptr<DisplayChangeInfo>& info)1513 void DisplayManager::Impl::NotifyDisplayChangeInfoChanged(const sptr<DisplayChangeInfo>& info)
1514 {
1515 std::set<sptr<IDisplayUpdateListener>> displayUpdateListeners;
1516 {
1517 std::lock_guard<std::recursive_mutex> lock(mutex_);
1518 displayUpdateListeners = displayUpdateListeners_;
1519 }
1520 for (auto& listener : displayUpdateListeners) {
1521 listener->OnDisplayUpdate(info);
1522 }
1523 }
1524
RegisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener)1525 DMError DisplayManager::RegisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener)
1526 {
1527 if (listener == nullptr) {
1528 WLOGFE("IDisplayUpdateListener listener is nullptr.");
1529 return DMError::DM_ERROR_NULLPTR;
1530 }
1531 return pImpl_->RegisterDisplayUpdateListener(listener);
1532 }
1533
RegisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener)1534 DMError DisplayManager::Impl::RegisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener)
1535 {
1536 std::lock_guard<std::recursive_mutex> lock(mutex_);
1537 DMError ret = DMError::DM_OK;
1538 if (displayUpdateListenerAgent_ == nullptr) {
1539 displayUpdateListenerAgent_ = new DisplayManagerDisplayUpdateAgent(this);
1540 ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1541 displayUpdateListenerAgent_,
1542 DisplayManagerAgentType::DISPLAY_UPDATE_LISTENER);
1543 }
1544 if (ret != DMError::DM_OK) {
1545 WLOGFW("RegisterDisplayUpdateListener failed !");
1546 displayUpdateListenerAgent_ = nullptr;
1547 } else {
1548 WLOGI("IDisplayUpdateListener register success");
1549 displayUpdateListeners_.insert(listener);
1550 }
1551 return ret;
1552 }
1553
UnregisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener)1554 DMError DisplayManager::UnregisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener)
1555 {
1556 if (listener == nullptr) {
1557 WLOGFE("UnregisterDisplayUpdateListener listener is nullptr.");
1558 return DMError::DM_ERROR_NULLPTR;
1559 }
1560 return pImpl_->UnregisterDisplayUpdateListener(listener);
1561 }
1562
UnregisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener)1563 DMError DisplayManager::Impl::UnregisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener)
1564 {
1565 std::lock_guard<std::recursive_mutex> lock(mutex_);
1566 auto iter = std::find(displayUpdateListeners_.begin(), displayUpdateListeners_.end(), listener);
1567 if (iter == displayUpdateListeners_.end()) {
1568 WLOGFE("could not find this listener");
1569 return DMError::DM_ERROR_NULLPTR;
1570 }
1571 displayUpdateListeners_.erase(iter);
1572 DMError ret = DMError::DM_OK;
1573 if (displayUpdateListeners_.empty() && displayUpdateListenerAgent_ != nullptr) {
1574 ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1575 displayUpdateListenerAgent_,
1576 DisplayManagerAgentType::DISPLAY_UPDATE_LISTENER);
1577 displayUpdateListenerAgent_ = nullptr;
1578 }
1579 return ret;
1580 }
1581
NotifyDisplayModeChanged(FoldDisplayMode displayMode)1582 void DisplayManager::Impl::NotifyDisplayModeChanged(FoldDisplayMode displayMode)
1583 {
1584 std::set<sptr<IDisplayModeListener>> displayModeListeners;
1585 {
1586 std::lock_guard<std::recursive_mutex> lock(mutex_);
1587 displayModeListeners = displayModeListeners_;
1588 }
1589 auto displayInfo = SingletonContainer::Get<DisplayManagerAdapter>().GetDefaultDisplayInfo();
1590 NotifyDisplayChange(displayInfo);
1591 for (auto& listener : displayModeListeners) {
1592 listener->OnDisplayModeChanged(displayMode);
1593 }
1594 }
1595
NotifyAvailableAreaChanged(DMRect rect)1596 void DisplayManager::Impl::NotifyAvailableAreaChanged(DMRect rect)
1597 {
1598 std::set<sptr<IAvailableAreaListener>> availableAreaListeners;
1599 {
1600 std::lock_guard<std::recursive_mutex> lock(mutex_);
1601 availableAreaListeners = availableAreaListeners_;
1602 }
1603 for (auto& listener : availableAreaListeners) {
1604 listener->OnAvailableAreaChanged(rect);
1605 }
1606 }
1607
RegisterDisplayModeListener(sptr<IDisplayModeListener> listener)1608 DMError DisplayManager::RegisterDisplayModeListener(sptr<IDisplayModeListener> listener)
1609 {
1610 if (listener == nullptr) {
1611 WLOGFE("IDisplayModeListener listener is nullptr.");
1612 return DMError::DM_ERROR_NULLPTR;
1613 }
1614 return pImpl_->RegisterDisplayModeListener(listener);
1615 }
1616
RegisterDisplayModeListener(sptr<IDisplayModeListener> listener)1617 DMError DisplayManager::Impl::RegisterDisplayModeListener(sptr<IDisplayModeListener> listener)
1618 {
1619 std::lock_guard<std::recursive_mutex> lock(mutex_);
1620 DMError ret = DMError::DM_OK;
1621 if (displayModeListenerAgent_ == nullptr) {
1622 displayModeListenerAgent_ = new DisplayManagerDisplayModeAgent(this);
1623 ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1624 displayModeListenerAgent_,
1625 DisplayManagerAgentType::DISPLAY_MODE_CHANGED_LISTENER);
1626 }
1627 if (ret != DMError::DM_OK) {
1628 WLOGFW("RegisterDisplayModeListener failed !");
1629 displayModeListenerAgent_ = nullptr;
1630 } else {
1631 WLOGD("IDisplayModeListener register success");
1632 displayModeListeners_.insert(listener);
1633 }
1634 return ret;
1635 }
1636
UnregisterDisplayModeListener(sptr<IDisplayModeListener> listener)1637 DMError DisplayManager::UnregisterDisplayModeListener(sptr<IDisplayModeListener> listener)
1638 {
1639 if (listener == nullptr) {
1640 WLOGFE("UnregisterPrivateWindowListener listener is nullptr.");
1641 return DMError::DM_ERROR_NULLPTR;
1642 }
1643 return pImpl_->UnregisterDisplayModeListener(listener);
1644 }
1645
UnregisterDisplayModeListener(sptr<IDisplayModeListener> listener)1646 DMError DisplayManager::Impl::UnregisterDisplayModeListener(sptr<IDisplayModeListener> listener)
1647 {
1648 std::lock_guard<std::recursive_mutex> lock(mutex_);
1649 auto iter = std::find(displayModeListeners_.begin(), displayModeListeners_.end(), listener);
1650 if (iter == displayModeListeners_.end()) {
1651 WLOGFE("could not find this listener");
1652 return DMError::DM_ERROR_NULLPTR;
1653 }
1654 displayModeListeners_.erase(iter);
1655 DMError ret = DMError::DM_OK;
1656 if (displayModeListeners_.empty() && displayModeListenerAgent_ != nullptr) {
1657 ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1658 displayModeListenerAgent_,
1659 DisplayManagerAgentType::DISPLAY_MODE_CHANGED_LISTENER);
1660 displayModeListenerAgent_ = nullptr;
1661 }
1662 return ret;
1663 }
1664
RegisterAvailableAreaListener(sptr<IAvailableAreaListener> listener)1665 DMError DisplayManager::RegisterAvailableAreaListener(sptr<IAvailableAreaListener> listener)
1666 {
1667 if (listener == nullptr) {
1668 WLOGFE("RegisterAvailableAreaListener listener is nullptr.");
1669 return DMError::DM_ERROR_NULLPTR;
1670 }
1671 return pImpl_->RegisterAvailableAreaListener(listener);
1672 }
1673
RegisterAvailableAreaListener(sptr<IAvailableAreaListener> listener)1674 DMError DisplayManager::Impl::RegisterAvailableAreaListener(sptr<IAvailableAreaListener> listener)
1675 {
1676 std::lock_guard<std::recursive_mutex> lock(mutex_);
1677 DMError ret = DMError::DM_OK;
1678 if (availableAreaListenerAgent_ == nullptr) {
1679 availableAreaListenerAgent_ = new DisplayManagerAvailableAreaAgent(this);
1680 ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1681 availableAreaListenerAgent_,
1682 DisplayManagerAgentType::AVAILABLE_AREA_CHANGED_LISTENER);
1683 }
1684 if (ret != DMError::DM_OK) {
1685 WLOGFW("RegisterAvailableAreaListener failed !");
1686 availableAreaListenerAgent_ = nullptr;
1687 } else {
1688 WLOGD("IAvailableAreaListener register success");
1689 availableAreaListeners_.insert(listener);
1690 }
1691 return ret;
1692 }
1693
UnregisterAvailableAreaListener(sptr<IAvailableAreaListener> listener)1694 DMError DisplayManager::UnregisterAvailableAreaListener(sptr<IAvailableAreaListener> listener)
1695 {
1696 if (listener == nullptr) {
1697 WLOGFE("UnregisterPrivateWindowListener listener is nullptr.");
1698 return DMError::DM_ERROR_NULLPTR;
1699 }
1700 return pImpl_->UnregisterAvailableAreaListener(listener);
1701 }
1702
UnregisterAvailableAreaListener(sptr<IAvailableAreaListener> listener)1703 DMError DisplayManager::Impl::UnregisterAvailableAreaListener(sptr<IAvailableAreaListener> listener)
1704 {
1705 std::lock_guard<std::recursive_mutex> lock(mutex_);
1706 auto iter = std::find(availableAreaListeners_.begin(), availableAreaListeners_.end(), listener);
1707 if (iter == availableAreaListeners_.end()) {
1708 WLOGFE("could not find this listener");
1709 return DMError::DM_ERROR_NULLPTR;
1710 }
1711 availableAreaListeners_.erase(iter);
1712 DMError ret = DMError::DM_OK;
1713 if (availableAreaListeners_.empty() && availableAreaListenerAgent_ != nullptr) {
1714 ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1715 availableAreaListenerAgent_,
1716 DisplayManagerAgentType::AVAILABLE_AREA_CHANGED_LISTENER);
1717 availableAreaListenerAgent_ = nullptr;
1718 }
1719 return ret;
1720 }
1721
NotifyScreenshot(sptr<ScreenshotInfo> info)1722 void DisplayManager::Impl::NotifyScreenshot(sptr<ScreenshotInfo> info)
1723 {
1724 WLOGFI("NotifyScreenshot trigger:[%{public}s] displayId:%{public}" PRIu64" size:%{public}zu",
1725 info->GetTrigger().c_str(), info->GetDisplayId(), screenshotListeners_.size());
1726 std::set<sptr<IScreenshotListener>> screenshotListeners;
1727 {
1728 std::lock_guard<std::recursive_mutex> lock(mutex_);
1729 screenshotListeners = screenshotListeners_;
1730 }
1731 for (auto& listener : screenshotListeners) {
1732 listener->OnScreenshot(*info);
1733 }
1734 }
1735
NotifyDisplayPowerEvent(DisplayPowerEvent event, EventStatus status)1736 void DisplayManager::Impl::NotifyDisplayPowerEvent(DisplayPowerEvent event, EventStatus status)
1737 {
1738 WLOGFD("[UL_POWER]NotifyDisplayPowerEvent event:%{public}u, status:%{public}u, size:%{public}zu", event, status,
1739 powerEventListeners_.size());
1740 std::set<sptr<IDisplayPowerEventListener>> powerEventListeners;
1741 {
1742 std::lock_guard<std::recursive_mutex> lock(mutex_);
1743 powerEventListeners = powerEventListeners_;
1744 }
1745 for (auto& listener : powerEventListeners) {
1746 listener->OnDisplayPowerEvent(event, status);
1747 }
1748 }
1749
NotifyDisplayStateChanged(DisplayId id, DisplayState state)1750 void DisplayManager::Impl::NotifyDisplayStateChanged(DisplayId id, DisplayState state)
1751 {
1752 WLOGFD("state:%{public}u", state);
1753 DisplayStateCallback displayStateCallback = nullptr;
1754 {
1755 std::lock_guard<std::recursive_mutex> lock(mutex_);
1756 displayStateCallback = displayStateCallback_;
1757 }
1758 if (displayStateCallback) {
1759 displayStateCallback(state);
1760 ClearDisplayStateCallback();
1761 return;
1762 }
1763 WLOGFW("callback_ target is not set!");
1764 }
1765
NotifyDisplayCreate(sptr<DisplayInfo> info)1766 void DisplayManager::Impl::NotifyDisplayCreate(sptr<DisplayInfo> info)
1767 {
1768 std::lock_guard<std::recursive_mutex> lock(mutex_);
1769 UpdateDisplayInfoLocked(info);
1770 }
1771
NotifyDisplayDestroy(DisplayId displayId)1772 void DisplayManager::Impl::NotifyDisplayDestroy(DisplayId displayId)
1773 {
1774 WLOGFD("displayId:%{public}" PRIu64".", displayId);
1775 std::lock_guard<std::recursive_mutex> lock(mutex_);
1776 displayMap_.erase(displayId);
1777 }
1778
NotifyDisplayChange(sptr<DisplayInfo> displayInfo)1779 void DisplayManager::Impl::NotifyDisplayChange(sptr<DisplayInfo> displayInfo)
1780 {
1781 std::lock_guard<std::recursive_mutex> lock(mutex_);
1782 UpdateDisplayInfoLocked(displayInfo);
1783 }
1784
UpdateDisplayInfoLocked(sptr<DisplayInfo> displayInfo)1785 bool DisplayManager::Impl::UpdateDisplayInfoLocked(sptr<DisplayInfo> displayInfo)
1786 {
1787 if (displayInfo == nullptr) {
1788 WLOGFW("displayInfo is null");
1789 return false;
1790 }
1791 DisplayId displayId = displayInfo->GetDisplayId();
1792 WLOGFD("displayId:%{public}" PRIu64".", displayId);
1793 if (displayId == DISPLAY_ID_INVALID) {
1794 WLOGFE("displayId is invalid.");
1795 return false;
1796 }
1797 auto iter = displayMap_.find(displayId);
1798 if (iter != displayMap_.end() && iter->second != nullptr) {
1799 WLOGFD("display Info Updated: %{public}s",
1800 GetDisplayInfoSrting(displayInfo).c_str());
1801 iter->second->UpdateDisplayInfo(displayInfo);
1802 return true;
1803 }
1804 sptr<Display> display = new (std::nothrow) Display("", displayInfo);
1805 if (display == nullptr) {
1806 WLOGFE("malloc display failed");
1807 return false;
1808 }
1809 displayMap_[displayId] = display;
1810 return true;
1811 }
1812
GetDisplayInfoSrting(sptr<DisplayInfo> displayInfo)1813 std::string DisplayManager::Impl::GetDisplayInfoSrting(sptr<DisplayInfo> displayInfo)
1814 {
1815 if (displayInfo == nullptr) {
1816 WLOGFE("displayInfo nullptr.");
1817 return "";
1818 }
1819 std::ostringstream oss;
1820 oss << "Display ID: " << displayInfo->GetDisplayId() << ", ";
1821 oss << "Name: " << displayInfo->GetName() << ", ";
1822 oss << "RefreshRate: " << displayInfo->GetRefreshRate() << ", ";
1823 oss << "VirtualPixelRatio: " << displayInfo->GetVirtualPixelRatio() << ", ";
1824 oss << "DensityInCurResolution: " << displayInfo->GetDensityInCurResolution() << ", ";
1825 oss << "DefaultVirtualPixelRatio: " << displayInfo->GetDefaultVirtualPixelRatio() << ", ";
1826 oss << "Rotation: " << static_cast<int32_t>(displayInfo->GetRotation());
1827 return oss.str();
1828 }
1829
WakeUpBegin(PowerStateChangeReason reason)1830 bool DisplayManager::WakeUpBegin(PowerStateChangeReason reason)
1831 {
1832 WLOGFD("[UL_POWER]WakeUpBegin start, reason:%{public}u", reason);
1833 return SingletonContainer::Get<DisplayManagerAdapter>().WakeUpBegin(reason);
1834 }
1835
WakeUpEnd()1836 bool DisplayManager::WakeUpEnd()
1837 {
1838 WLOGFD("[UL_POWER]WakeUpEnd start");
1839 return SingletonContainer::Get<DisplayManagerAdapter>().WakeUpEnd();
1840 }
1841
SuspendBegin(PowerStateChangeReason reason)1842 bool DisplayManager::SuspendBegin(PowerStateChangeReason reason)
1843 {
1844 // dms->wms notify other windows to hide
1845 WLOGFD("[UL_POWER]SuspendBegin start, reason:%{public}u", reason);
1846 return SingletonContainer::Get<DisplayManagerAdapter>().SuspendBegin(reason);
1847 }
1848
SuspendEnd()1849 bool DisplayManager::SuspendEnd()
1850 {
1851 WLOGFD("[UL_POWER]SuspendEnd start");
1852 return SingletonContainer::Get<DisplayManagerAdapter>().SuspendEnd();
1853 }
1854
GetInternalScreenId()1855 ScreenId DisplayManager::GetInternalScreenId()
1856 {
1857 WLOGFD("[UL_POWER]GetInternalScreenId start");
1858 return SingletonContainer::Get<DisplayManagerAdapter>().GetInternalScreenId();
1859 }
1860
SetScreenPowerById(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason)1861 bool DisplayManager::SetScreenPowerById(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason)
1862 {
1863 WLOGFD("[UL_POWER]SetScreenPowerById start");
1864 return SingletonContainer::Get<DisplayManagerAdapter>().SetScreenPowerById(screenId, state, reason);
1865 }
1866
SetDisplayState(DisplayState state, DisplayStateCallback callback)1867 bool DisplayManager::Impl::SetDisplayState(DisplayState state, DisplayStateCallback callback)
1868 {
1869 WLOGFD("[UL_POWER]state:%{public}u", state);
1870 bool ret = true;
1871 {
1872 std::lock_guard<std::recursive_mutex> lock(mutex_);
1873 if (displayStateCallback_ != nullptr || callback == nullptr) {
1874 WLOGFI("[UL_POWER]previous callback not called or callback invalid");
1875 if (displayStateCallback_ != nullptr) {
1876 WLOGFI("[UL_POWER]previous callback not called, the displayStateCallback_ is not null");
1877 }
1878 if (callback == nullptr) {
1879 WLOGFI("[UL_POWER]Invalid callback received");
1880 }
1881 return false;
1882 }
1883 displayStateCallback_ = callback;
1884
1885 if (displayStateAgent_ == nullptr) {
1886 displayStateAgent_ = new DisplayManagerAgent(this);
1887 ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1888 displayStateAgent_,
1889 DisplayManagerAgentType::DISPLAY_STATE_LISTENER) == DMError::DM_OK;
1890 }
1891 }
1892 ret = ret && SingletonContainer::Get<DisplayManagerAdapter>().SetDisplayState(state);
1893 if (!ret) {
1894 ClearDisplayStateCallback();
1895 }
1896 return ret;
1897 }
1898
SetDisplayState(DisplayState state, DisplayStateCallback callback)1899 bool DisplayManager::SetDisplayState(DisplayState state, DisplayStateCallback callback)
1900 {
1901 return pImpl_->SetDisplayState(state, callback);
1902 }
1903
GetDisplayState(DisplayId displayId)1904 DisplayState DisplayManager::GetDisplayState(DisplayId displayId)
1905 {
1906 return SingletonContainer::Get<DisplayManagerAdapter>().GetDisplayState(displayId);
1907 }
1908
TryToCancelScreenOff()1909 bool DisplayManager::TryToCancelScreenOff()
1910 {
1911 WLOGFD("[UL_POWER]TryToCancelScreenOff start");
1912 return SingletonContainer::Get<DisplayManagerAdapter>().TryToCancelScreenOff();
1913 }
1914
SetScreenBrightness(uint64_t screenId, uint32_t level)1915 bool DisplayManager::SetScreenBrightness(uint64_t screenId, uint32_t level)
1916 {
1917 WLOGFI("[UL_POWER]ScreenId:%{public}" PRIu64", level:%{public}u,", screenId, level);
1918 RSInterfaces::GetInstance().SetScreenBacklight(screenId, level);
1919 return true;
1920 }
1921
GetScreenBrightness(uint64_t screenId) const1922 uint32_t DisplayManager::GetScreenBrightness(uint64_t screenId) const
1923 {
1924 uint32_t level = static_cast<uint32_t>(RSInterfaces::GetInstance().GetScreenBacklight(screenId));
1925 WLOGFI("GetScreenBrightness screenId:%{public}" PRIu64", level:%{public}u,", screenId, level);
1926 return level;
1927 }
1928
NotifyDisplayEvent(DisplayEvent event)1929 void DisplayManager::NotifyDisplayEvent(DisplayEvent event)
1930 {
1931 // Unlock event dms->wms restore other hidden windows
1932 WLOGFD("[UL_POWER]DisplayEvent:%{public}u", event);
1933 SingletonContainer::Get<DisplayManagerAdapter>().NotifyDisplayEvent(event);
1934 }
1935
Freeze(std::vector<DisplayId> displayIds)1936 bool DisplayManager::Freeze(std::vector<DisplayId> displayIds)
1937 {
1938 WLOGFD("freeze display");
1939 if (displayIds.size() == 0) {
1940 WLOGFE("freeze display fail, num of display is 0");
1941 return false;
1942 }
1943 if (displayIds.size() > MAX_DISPLAY_SIZE) {
1944 WLOGFE("freeze display fail, displayIds size is bigger than %{public}u.", MAX_DISPLAY_SIZE);
1945 return false;
1946 }
1947 return SingletonContainer::Get<DisplayManagerAdapter>().SetFreeze(displayIds, true);
1948 }
1949
Unfreeze(std::vector<DisplayId> displayIds)1950 bool DisplayManager::Unfreeze(std::vector<DisplayId> displayIds)
1951 {
1952 WLOGFD("unfreeze display");
1953 if (displayIds.size() == 0) {
1954 WLOGFE("unfreeze display fail, num of display is 0");
1955 return false;
1956 }
1957 if (displayIds.size() > MAX_DISPLAY_SIZE) {
1958 WLOGFE("unfreeze display fail, displayIds size is bigger than %{public}u.", MAX_DISPLAY_SIZE);
1959 return false;
1960 }
1961 return SingletonContainer::Get<DisplayManagerAdapter>().SetFreeze(displayIds, false);
1962 }
1963
AddSurfaceNodeToDisplay(DisplayId displayId, std::shared_ptr<class RSSurfaceNode>& surfaceNode)1964 DMError DisplayManager::AddSurfaceNodeToDisplay(DisplayId displayId,
1965 std::shared_ptr<class RSSurfaceNode>& surfaceNode)
1966 {
1967 return SingletonContainer::Get<DisplayManagerAdapter>().AddSurfaceNodeToDisplay(displayId, surfaceNode);
1968 }
1969
RemoveSurfaceNodeFromDisplay(DisplayId displayId, std::shared_ptr<class RSSurfaceNode>& surfaceNode)1970 DMError DisplayManager::RemoveSurfaceNodeFromDisplay(DisplayId displayId,
1971 std::shared_ptr<class RSSurfaceNode>& surfaceNode)
1972 {
1973 return SingletonContainer::Get<DisplayManagerAdapter>().RemoveSurfaceNodeFromDisplay(displayId, surfaceNode);
1974 }
1975
OnRemoteDied()1976 void DisplayManager::Impl::OnRemoteDied()
1977 {
1978 WLOGFI("dms is died");
1979 if (g_dmIsDestroyed) {
1980 WLOGFE("dm has been destructed, mutex_ is invalid");
1981 return;
1982 }
1983 std::lock_guard<std::recursive_mutex> lock(mutex_);
1984 displayManagerListener_ = nullptr;
1985 displayStateAgent_ = nullptr;
1986 powerEventListenerAgent_ = nullptr;
1987 screenshotListenerAgent_ = nullptr;
1988 privateWindowListenerAgent_ = nullptr;
1989 privateWindowListChangeListenerAgent_ = nullptr;
1990 foldStatusListenerAgent_ = nullptr;
1991 foldAngleListenerAgent_ = nullptr;
1992 captureStatusListenerAgent_ = nullptr;
1993 }
1994
OnRemoteDied()1995 void DisplayManager::OnRemoteDied()
1996 {
1997 if (g_dmIsDestroyed) {
1998 WLOGFE("dms is dying, pImpl_ is nullptr");
1999 return;
2000 }
2001 pImpl_->OnRemoteDied();
2002 }
2003
ConvertScreenIdToRsScreenId(ScreenId screenId, ScreenId& rsScreenId)2004 bool DisplayManager::ConvertScreenIdToRsScreenId(ScreenId screenId, ScreenId& rsScreenId)
2005 {
2006 return pImpl_->ConvertScreenIdToRsScreenId(screenId, rsScreenId);
2007 }
2008
ConvertScreenIdToRsScreenId(ScreenId screenId, ScreenId& rsScreenId)2009 bool DisplayManager::Impl::ConvertScreenIdToRsScreenId(ScreenId screenId, ScreenId& rsScreenId)
2010 {
2011 bool res = SingletonContainer::Get<DisplayManagerAdapter>().ConvertScreenIdToRsScreenId(screenId, rsScreenId);
2012 WLOGFD("Convert ScreenId %{public}" PRIu64" To RsScreenId %{public}" PRIu64"", screenId, rsScreenId);
2013 return res;
2014 }
2015
SetVirtualScreenBlackList(ScreenId screenId, std::vector<uint64_t>& windowIdList)2016 void DisplayManager::SetVirtualScreenBlackList(ScreenId screenId, std::vector<uint64_t>& windowIdList)
2017 {
2018 SingletonContainer::Get<DisplayManagerAdapter>().SetVirtualScreenBlackList(screenId, windowIdList);
2019 }
2020
DisablePowerOffRenderControl(ScreenId screenId)2021 void DisplayManager::DisablePowerOffRenderControl(ScreenId screenId)
2022 {
2023 SingletonContainer::Get<DisplayManagerAdapter>().DisablePowerOffRenderControl(screenId);
2024 }
2025
ProxyForFreeze(std::set<int32_t> pidList, bool isProxy)2026 DMError DisplayManager::ProxyForFreeze(std::set<int32_t> pidList, bool isProxy)
2027 {
2028 std::ostringstream oss;
2029 for (auto pid : pidList) {
2030 oss << pid << " ";
2031 }
2032 WLOGFI("pidList:%{public}s, isProxy: %{public}d", oss.str().c_str(), isProxy);
2033 return pImpl_->ProxyForFreeze(pidList, isProxy);
2034 }
2035
ProxyForFreeze(const std::set<int32_t>& pidList, bool isProxy)2036 DMError DisplayManager::Impl::ProxyForFreeze(const std::set<int32_t>& pidList, bool isProxy)
2037 {
2038 return SingletonContainer::Get<DisplayManagerAdapter>().ProxyForFreeze(pidList, isProxy);
2039 }
2040
ResetAllFreezeStatus()2041 DMError DisplayManager::ResetAllFreezeStatus()
2042 {
2043 return pImpl_->ResetAllFreezeStatus();
2044 }
2045
ResetAllFreezeStatus()2046 DMError DisplayManager::Impl::ResetAllFreezeStatus()
2047 {
2048 return SingletonContainer::Get<DisplayManagerAdapter>().ResetAllFreezeStatus();
2049 }
2050
SetVirtualScreenSecurityExemption(ScreenId screenId, uint32_t pid, std::vector<uint64_t>& windowIdList)2051 DMError DisplayManager::SetVirtualScreenSecurityExemption(ScreenId screenId, uint32_t pid,
2052 std::vector<uint64_t>& windowIdList)
2053 {
2054 return pImpl_->SetVirtualScreenSecurityExemption(screenId, pid, windowIdList);
2055 }
2056
SetVirtualScreenSecurityExemption(ScreenId screenId, uint32_t pid, std::vector<uint64_t>& windowIdList)2057 DMError DisplayManager::Impl::SetVirtualScreenSecurityExemption(ScreenId screenId, uint32_t pid,
2058 std::vector<uint64_t>& windowIdList)
2059 {
2060 return SingletonContainer::Get<DisplayManagerAdapter>().SetVirtualScreenSecurityExemption(
2061 screenId, pid, windowIdList);
2062 }
2063 } // namespace OHOS::Rosen
2064
2065