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