• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 const static uint32_t MAX_RETRY_NUM = 6;
33 const static uint32_t RETRY_WAIT_MS = 500;
34 const static uint32_t MAX_DISPLAY_SIZE = 32;
35 const static uint32_t SCB_GET_DISPLAY_INTERVAL_US = 5000;
36 const static uint32_t APP_GET_DISPLAY_INTERVAL_US = 25000;
37 const static float INVALID_DEFAULT_DENSITY = 1.0f;
38 const static uint32_t PIXMAP_VECTOR_SIZE = 2;
39 std::atomic<bool> g_dmIsDestroyed = false;
40 std::mutex snapBypickerMutex;
41 
IsTargetDisplay(const sptr<DisplayInfo> & displayInfo,const Position & globalPosition)42 bool IsTargetDisplay(const sptr<DisplayInfo>& displayInfo, const Position& globalPosition)
43 {
44     if (displayInfo == nullptr) {
45         TLOGE(WmsLogTag::DMS, "displayInfo is nullptr while judgging target display!");
46         return false;
47     }
48     int32_t posX = globalPosition.x - displayInfo->GetX();
49     int32_t posY = globalPosition.y - displayInfo->GetY();
50     return !(posX < 0 || posY < 0 || posX >= displayInfo->GetWidth() || posY >= displayInfo->GetHeight());
51 }
52 
IsInt32AddOverflow(int32_t num1,int32_t num2)53 bool IsInt32AddOverflow(int32_t num1, int32_t num2)
54 {
55     if ((num2 > 0 && num1 > INT32_MAX - num2) || (num2 < 0 && num1 < INT32_MIN - num2)) {
56         return true;
57     }
58     return false;
59 }
60 
IsInt32SubOverflow(int32_t num1,int32_t num2)61 bool IsInt32SubOverflow(int32_t num1, int32_t num2)
62 {
63     if ((num2 > 0 && num1 < INT32_MIN + num2) || (num2 < 0 && num1 > INT32_MAX + num2)) {
64         return true;
65     }
66     return false;
67 }
68 }
69 WM_IMPLEMENT_SINGLE_INSTANCE(DisplayManager)
70 
71 class DisplayManager::Impl : public RefBase {
72 public:
Impl(std::recursive_mutex & mutex)73     Impl(std::recursive_mutex& mutex) : mutex_(mutex) {}
74     ~Impl();
75 
76     static inline SingletonDelegator<DisplayManager> delegator;
77     bool CheckRectValid(const Media::Rect& rect, int32_t oriHeight, int32_t oriWidth) const;
78     bool CheckSizeValid(const Media::Size& size, int32_t oriHeight, int32_t oriWidth) const;
79     sptr<Display> GetDefaultDisplay();
80     sptr<Display> GetDefaultDisplaySync();
81     std::vector<DisplayPhysicalResolution> GetAllDisplayPhysicalResolution();
82     sptr<Display> GetDisplayById(DisplayId displayId);
83     sptr<DisplayInfo> GetVisibleAreaDisplayInfoById(DisplayId displayId);
84     DMError GetExpandAvailableArea(DisplayId displayId, DMRect& area);
85     DMError HasPrivateWindow(DisplayId displayId, bool& hasPrivateWindow);
86     bool ConvertScreenIdToRsScreenId(ScreenId screenId, ScreenId& rsScreenId);
87     bool IsFoldable();
88     bool IsCaptured();
89     FoldStatus GetFoldStatus();
90     FoldDisplayMode GetFoldDisplayMode();
91     FoldDisplayMode GetFoldDisplayModeForExternal();
92     void SetFoldDisplayMode(const FoldDisplayMode);
93     void SetFoldDisplayModeAsync(const FoldDisplayMode);
94     DMError SetFoldDisplayModeFromJs(const FoldDisplayMode, std::string reason = "");
95     void SetDisplayScale(ScreenId screenId, float scaleX, float scaleY, float pivotX, float pivotY);
96     void SetFoldStatusLocked(bool locked);
97     DMError SetFoldStatusLockedFromJs(bool locked);
98     sptr<FoldCreaseRegion> GetCurrentFoldCreaseRegion();
99     DMError RegisterDisplayListener(sptr<IDisplayListener> listener);
100     DMError UnregisterDisplayListener(sptr<IDisplayListener> listener);
101     bool SetDisplayState(DisplayState state, DisplayStateCallback callback);
102     void SetVirtualDisplayMuteFlag(ScreenId screenId, bool muteFlag);
103     bool SetVirtualScreenAsDefault(ScreenId screenId);
104     DMError RegisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener);
105     DMError UnregisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener);
106     DMError RegisterScreenshotListener(sptr<IScreenshotListener> listener);
107     DMError UnregisterScreenshotListener(sptr<IScreenshotListener> listener);
108     DMError RegisterPrivateWindowListener(sptr<IPrivateWindowListener> listener);
109     DMError UnregisterPrivateWindowListener(sptr<IPrivateWindowListener> listener);
110     DMError RegisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener);
111     DMError UnregisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener);
112     DMError RegisterFoldStatusListener(sptr<IFoldStatusListener> listener);
113     DMError UnregisterFoldStatusListener(sptr<IFoldStatusListener> listener);
114     DMError RegisterFoldAngleListener(sptr<IFoldAngleListener> listener);
115     DMError UnregisterFoldAngleListener(sptr<IFoldAngleListener> listener);
116     DMError RegisterCaptureStatusListener(sptr<ICaptureStatusListener> listener);
117     DMError UnregisterCaptureStatusListener(sptr<ICaptureStatusListener> listener);
118     DMError RegisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener);
119     DMError UnregisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener);
120     DMError RegisterDisplayModeListener(sptr<IDisplayModeListener> listener);
121     DMError UnregisterDisplayModeListener(sptr<IDisplayModeListener> listener);
122     DMError RegisterAvailableAreaListener(sptr<IAvailableAreaListener> listener);
123     DMError UnregisterAvailableAreaListener(sptr<IAvailableAreaListener> listener);
124     DMError RegisterAvailableAreaListener(sptr<IAvailableAreaListener> listener, DisplayId displayId);
125     DMError UnregisterAvailableAreaListener(sptr<IAvailableAreaListener> listener, DisplayId displayId);
126     DMError RegisterScreenMagneticStateListener(sptr<IScreenMagneticStateListener> listener);
127     DMError UnregisterScreenMagneticStateListener(sptr<IScreenMagneticStateListener> listener);
128     sptr<Display> GetDisplayByScreenId(ScreenId screenId);
129     DMError ProxyForFreeze(const std::set<int32_t>& pidList, bool isProxy);
130     DMError ResetAllFreezeStatus();
131     DMError SetVirtualScreenSecurityExemption(ScreenId screenId, uint32_t pid, std::vector<uint64_t>& windowIdList);
132     sptr<Display> GetPrimaryDisplaySync();
133     void OnRemoteDied();
134     sptr<CutoutInfo> GetCutoutInfoWithRotation(Rotation rotation);
135     DMError GetScreenAreaOfDisplayArea(DisplayId displayId, const DMRect& displayArea,
136         ScreenId& screenId, DMRect& screenArea);
137     DMError ConvertRelativeCoordinateToGlobal(const RelativePosition& relativePosition, Position& position);
138     DMError ConvertGlobalCoordinateToRelative(const Position& globalPosition, RelativePosition& relativePosition);
139     DMError ConvertGlobalCoordinateToRelativeWithDisplayId(const Position& globalPosition, DisplayId displayId,
140         RelativePosition& relativePosition);
141 
142 private:
143     void ClearDisplayStateCallback();
144     void ClearFoldStatusCallback();
145     void ClearFoldAngleCallback();
146     void ClearCaptureStatusCallback();
147     void ClearDisplayModeCallback();
148     void NotifyPrivateWindowStateChanged(bool hasPrivate);
149     void NotifyPrivateStateWindowListChanged(DisplayId id, std::vector<std::string> privacyWindowList);
150     void NotifyScreenshot(sptr<ScreenshotInfo> info);
151     void NotifyDisplayPowerEvent(DisplayPowerEvent event, EventStatus status);
152     void NotifyDisplayStateChanged(DisplayId id, DisplayState state);
153     void NotifyDisplayChangedEvent(sptr<DisplayInfo> info, DisplayChangeEvent event);
154     void NotifyDisplayCreate(sptr<DisplayInfo> info);
155     void NotifyDisplayDestroy(DisplayId);
156     void NotifyDisplayChange(sptr<DisplayInfo> displayInfo);
157     bool UpdateDisplayInfoLocked(sptr<DisplayInfo>);
158     void NotifyFoldStatusChanged(FoldStatus foldStatus);
159     void NotifyFoldAngleChanged(std::vector<float> foldAngles);
160     void NotifyCaptureStatusChanged(bool isCapture);
161     void NotifyDisplayChangeInfoChanged(const sptr<DisplayChangeInfo>& info);
162     void NotifyDisplayModeChanged(FoldDisplayMode displayMode);
163     void NotifyAvailableAreaChanged(DMRect rect, DisplayId displayId);
164     void Clear();
165     std::string GetDisplayInfoSrting(sptr<DisplayInfo> displayInfo);
166     std::atomic<bool> needUpdateDisplayFromDMS_ = false;
167     DisplayId defaultDisplayId_ = DISPLAY_ID_INVALID;
168     DisplayId primaryDisplayId_ = DISPLAY_ID_INVALID;
169     std::map<DisplayId, sptr<Display>> displayMap_;
170     std::map<DisplayId, std::chrono::steady_clock::time_point> displayUptateTimeMap_;
171     DisplayStateCallback displayStateCallback_;
172     std::recursive_mutex& mutex_;
173     std::set<sptr<IDisplayListener>> displayListeners_;
174     std::set<sptr<IDisplayPowerEventListener>> powerEventListeners_;
175     std::set<sptr<IScreenshotListener>> screenshotListeners_;
176     std::set<sptr<IPrivateWindowListener>> privateWindowListeners_;
177     std::set<sptr<IPrivateWindowListChangeListener>> privateWindowListChangeListeners_;
178     std::set<sptr<IFoldStatusListener>> foldStatusListeners_;
179     std::set<sptr<IFoldAngleListener>> foldAngleListeners_;
180     std::set<sptr<ICaptureStatusListener>> captureStatusListeners_;
181     std::set<sptr<IDisplayUpdateListener>> displayUpdateListeners_;
182     std::set<sptr<IDisplayModeListener>> displayModeListeners_;
183     std::set<sptr<IAvailableAreaListener>> availableAreaListeners_;
184     std::map<DisplayId, std::set<sptr<IAvailableAreaListener>>> availableAreaListenersMap_;
185     class DisplayManagerListener;
186     sptr<DisplayManagerListener> displayManagerListener_;
187     class DisplayManagerAgent;
188     sptr<DisplayManagerAgent> displayStateAgent_;
189     sptr<DisplayManagerAgent> powerEventListenerAgent_;
190     class DisplayManagerScreenshotAgent;
191     sptr<DisplayManagerScreenshotAgent> screenshotListenerAgent_;
192     class DisplayManagerPrivateWindowAgent;
193     sptr<DisplayManagerPrivateWindowAgent> privateWindowListenerAgent_;
194     class DisplayManagerPrivateWindowListAgent;
195     sptr<DisplayManagerPrivateWindowListAgent> privateWindowListChangeListenerAgent_;
196     class DisplayManagerFoldStatusAgent;
197     sptr<DisplayManagerFoldStatusAgent> foldStatusListenerAgent_;
198     class DisplayManagerFoldAngleAgent;
199     sptr<DisplayManagerFoldAngleAgent> foldAngleListenerAgent_;
200     class DisplayManagerCaptureStatusAgent;
201     sptr<DisplayManagerCaptureStatusAgent> captureStatusListenerAgent_;
202     class DisplayManagerDisplayUpdateAgent;
203     sptr<DisplayManagerDisplayUpdateAgent> displayUpdateListenerAgent_;
204     class DisplayManagerDisplayModeAgent;
205     sptr<DisplayManagerDisplayModeAgent> displayModeListenerAgent_;
206     class DisplayManagerAvailableAreaAgent;
207     sptr<DisplayManagerAvailableAreaAgent> availableAreaListenerAgent_;
208 
209     void NotifyScreenMagneticStateChanged(bool isMagneticState);
210     std::set<sptr<IScreenMagneticStateListener>> screenMagneticStateListeners_;
211     class DisplayManagerScreenMagneticStateAgent;
212     sptr<DisplayManagerScreenMagneticStateAgent> screenMagneticStateListenerAgent_;
213 };
214 
215 class DisplayManager::Impl::DisplayManagerListener : public DisplayManagerAgentDefault {
216 public:
DisplayManagerListener(sptr<Impl> impl)217     explicit DisplayManagerListener(sptr<Impl> impl) : pImpl_(impl)
218     {
219     }
220 
OnDisplayCreate(sptr<DisplayInfo> displayInfo)221     void OnDisplayCreate(sptr<DisplayInfo> displayInfo) override
222     {
223         if (displayInfo == nullptr || displayInfo->GetDisplayId() == DISPLAY_ID_INVALID) {
224             TLOGE(WmsLogTag::DMS, "displayInfo is invalid.");
225             return;
226         }
227         if (pImpl_ == nullptr) {
228             TLOGE(WmsLogTag::DMS, "impl is nullptr.");
229             return;
230         }
231         pImpl_->NotifyDisplayCreate(displayInfo);
232         std::set<sptr<IDisplayListener>> displayListeners;
233         {
234             std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
235             displayListeners = pImpl_->displayListeners_;
236         }
237         for (auto listener : displayListeners) {
238             listener->OnCreate(displayInfo->GetDisplayId());
239         }
240     };
241 
OnDisplayDestroy(DisplayId displayId)242     void OnDisplayDestroy(DisplayId displayId) override
243     {
244         if (displayId == DISPLAY_ID_INVALID) {
245             TLOGE(WmsLogTag::DMS, "displayId is invalid.");
246             return;
247         }
248         if (pImpl_ == nullptr) {
249             TLOGE(WmsLogTag::DMS, "impl is nullptr.");
250             return;
251         }
252         pImpl_->NotifyDisplayDestroy(displayId);
253         std::set<sptr<IDisplayListener>> displayListeners;
254         {
255             std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
256             displayListeners = pImpl_->displayListeners_;
257         }
258         for (auto listener : displayListeners) {
259             listener->OnDestroy(displayId);
260         }
261     };
262 
OnDisplayChange(sptr<DisplayInfo> displayInfo,DisplayChangeEvent event)263     void OnDisplayChange(sptr<DisplayInfo> displayInfo, DisplayChangeEvent event) override
264     {
265         if (displayInfo == nullptr || displayInfo->GetDisplayId() == DISPLAY_ID_INVALID) {
266             TLOGE(WmsLogTag::DMS, "displayInfo is invalid.");
267             return;
268         }
269         if (pImpl_ == nullptr) {
270             TLOGE(WmsLogTag::DMS, "impl is nullptr.");
271             return;
272         }
273         TLOGD(WmsLogTag::DMS, "display %{public}" PRIu64", event %{public}u", displayInfo->GetDisplayId(), event);
274         pImpl_->NotifyDisplayChange(displayInfo);
275         std::set<sptr<IDisplayListener>> displayListeners;
276         {
277             std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
278             displayListeners = pImpl_->displayListeners_;
279         }
280         for (auto listener : displayListeners) {
281             listener->OnChange(displayInfo->GetDisplayId());
282         }
283     };
284 private:
285     sptr<Impl> pImpl_;
286 };
287 
288 class DisplayManager::Impl::DisplayManagerAgent : public DisplayManagerAgentDefault {
289 public:
DisplayManagerAgent(sptr<Impl> impl)290     explicit DisplayManagerAgent(sptr<Impl> impl) : pImpl_(impl)
291     {
292     }
293     ~DisplayManagerAgent() = default;
294 
NotifyDisplayPowerEvent(DisplayPowerEvent event,EventStatus status)295     virtual void NotifyDisplayPowerEvent(DisplayPowerEvent event, EventStatus status) override
296     {
297         pImpl_->NotifyDisplayPowerEvent(event, status);
298     }
299 
NotifyDisplayStateChanged(DisplayId id,DisplayState state)300     virtual void NotifyDisplayStateChanged(DisplayId id, DisplayState state) override
301     {
302         pImpl_->NotifyDisplayStateChanged(id, state);
303     }
304 private:
305     sptr<Impl> pImpl_;
306 };
307 
308 class DisplayManager::Impl::DisplayManagerScreenshotAgent : public DisplayManagerAgentDefault {
309 public:
DisplayManagerScreenshotAgent(sptr<Impl> impl)310     explicit DisplayManagerScreenshotAgent(sptr<Impl> impl) : pImpl_(impl)
311     {
312     }
313     ~DisplayManagerScreenshotAgent() = default;
314 
OnScreenshot(sptr<ScreenshotInfo> info)315     virtual void OnScreenshot(sptr<ScreenshotInfo> info) override
316     {
317         pImpl_->NotifyScreenshot(info);
318     }
319 private:
320     sptr<Impl> pImpl_;
321 };
322 
323 class DisplayManager::Impl::DisplayManagerPrivateWindowAgent : public DisplayManagerAgentDefault {
324 public:
DisplayManagerPrivateWindowAgent(sptr<Impl> impl)325     explicit DisplayManagerPrivateWindowAgent(sptr<Impl> impl) : pImpl_(impl)
326     {
327     }
328     ~DisplayManagerPrivateWindowAgent() = default;
329 
NotifyPrivateWindowStateChanged(bool hasPrivate)330     virtual void NotifyPrivateWindowStateChanged(bool hasPrivate) override
331     {
332         pImpl_->NotifyPrivateWindowStateChanged(hasPrivate);
333     }
334 private:
335     sptr<Impl> pImpl_;
336 };
337 
338 class DisplayManager::Impl::DisplayManagerPrivateWindowListAgent : public DisplayManagerAgentDefault {
339 public:
DisplayManagerPrivateWindowListAgent(sptr<Impl> impl)340     explicit DisplayManagerPrivateWindowListAgent(sptr<Impl> impl) : pImpl_(impl)
341     {
342     }
343     ~DisplayManagerPrivateWindowListAgent() = default;
344 
NotifyPrivateStateWindowListChanged(DisplayId id,std::vector<std::string> privacyWindowList)345     virtual void NotifyPrivateStateWindowListChanged(DisplayId id, std::vector<std::string> privacyWindowList) override
346     {
347         pImpl_->NotifyPrivateStateWindowListChanged(id, privacyWindowList);
348     }
349 private:
350     sptr<Impl> pImpl_;
351 };
352 
353 class DisplayManager::Impl::DisplayManagerFoldStatusAgent : public DisplayManagerAgentDefault {
354 public:
DisplayManagerFoldStatusAgent(sptr<Impl> impl)355     explicit DisplayManagerFoldStatusAgent(sptr<Impl> impl) : pImpl_(impl)
356     {
357     }
358     ~DisplayManagerFoldStatusAgent() = default;
359 
NotifyFoldStatusChanged(FoldStatus foldStatus)360     virtual void NotifyFoldStatusChanged(FoldStatus foldStatus) override
361     {
362         pImpl_->NotifyFoldStatusChanged(foldStatus);
363     }
364 private:
365     sptr<Impl> pImpl_;
366 };
367 
368 class DisplayManager::Impl::DisplayManagerFoldAngleAgent : public DisplayManagerAgentDefault {
369 public:
DisplayManagerFoldAngleAgent(sptr<Impl> impl)370     explicit DisplayManagerFoldAngleAgent(sptr<Impl> impl) : pImpl_(impl)
371     {
372     }
373     ~DisplayManagerFoldAngleAgent() = default;
374 
NotifyFoldAngleChanged(std::vector<float> foldAngles)375     virtual void NotifyFoldAngleChanged(std::vector<float> foldAngles) override
376     {
377         pImpl_->NotifyFoldAngleChanged(foldAngles);
378     }
379 private:
380     sptr<Impl> pImpl_;
381 };
382 
383 class DisplayManager::Impl::DisplayManagerCaptureStatusAgent : public DisplayManagerAgentDefault {
384 public:
DisplayManagerCaptureStatusAgent(sptr<Impl> impl)385     explicit DisplayManagerCaptureStatusAgent(sptr<Impl> impl) : pImpl_(impl)
386     {
387     }
388     ~DisplayManagerCaptureStatusAgent() = default;
389 
NotifyCaptureStatusChanged(bool isCapture)390     virtual void NotifyCaptureStatusChanged(bool isCapture) override
391     {
392         pImpl_->NotifyCaptureStatusChanged(isCapture);
393     }
394 private:
395     sptr<Impl> pImpl_;
396 };
397 
398 class DisplayManager::Impl::DisplayManagerDisplayUpdateAgent : public DisplayManagerAgentDefault {
399 public:
DisplayManagerDisplayUpdateAgent(sptr<Impl> impl)400     explicit DisplayManagerDisplayUpdateAgent(sptr<Impl> impl) : pImpl_(impl)
401     {
402     }
403     ~DisplayManagerDisplayUpdateAgent() = default;
404 
NotifyDisplayChangeInfoChanged(const sptr<DisplayChangeInfo> & info)405     virtual void NotifyDisplayChangeInfoChanged(const sptr<DisplayChangeInfo>& info) override
406     {
407         pImpl_->NotifyDisplayChangeInfoChanged(info);
408     }
409 private:
410     sptr<Impl> pImpl_;
411 };
412 
413 class DisplayManager::Impl::DisplayManagerDisplayModeAgent : public DisplayManagerAgentDefault {
414 public:
DisplayManagerDisplayModeAgent(sptr<Impl> impl)415     explicit DisplayManagerDisplayModeAgent(sptr<Impl> impl) : pImpl_(impl)
416     {
417     }
418     ~DisplayManagerDisplayModeAgent() = default;
419 
NotifyDisplayModeChanged(FoldDisplayMode displayMode)420     virtual void NotifyDisplayModeChanged(FoldDisplayMode displayMode) override
421     {
422         pImpl_->NotifyDisplayModeChanged(displayMode);
423     }
424 private:
425     sptr<Impl> pImpl_;
426 };
427 
428 class DisplayManager::Impl::DisplayManagerScreenMagneticStateAgent : public DisplayManagerAgentDefault {
429 public:
DisplayManagerScreenMagneticStateAgent(sptr<Impl> impl)430     explicit DisplayManagerScreenMagneticStateAgent(sptr<Impl> impl) : pImpl_(impl)
431     {
432     }
433     ~DisplayManagerScreenMagneticStateAgent() = default;
434 
NotifyScreenMagneticStateChanged(bool isMagneticState)435     virtual void NotifyScreenMagneticStateChanged(bool isMagneticState) override
436     {
437         pImpl_->NotifyScreenMagneticStateChanged(isMagneticState);
438     }
439 private:
440     sptr<Impl> pImpl_;
441 };
442 
443 class DisplayManager::Impl::DisplayManagerAvailableAreaAgent : public DisplayManagerAgentDefault {
444 public:
DisplayManagerAvailableAreaAgent(sptr<Impl> impl)445     explicit DisplayManagerAvailableAreaAgent(sptr<Impl> impl) : pImpl_(impl)
446     {
447     }
448     ~DisplayManagerAvailableAreaAgent() = default;
449 
NotifyAvailableAreaChanged(DMRect area,DisplayId displayId)450     virtual void NotifyAvailableAreaChanged(DMRect area, DisplayId displayId) override
451     {
452         pImpl_->NotifyAvailableAreaChanged(area, displayId);
453     }
454 private:
455     sptr<Impl> pImpl_;
456 };
457 
CheckRectValid(const Media::Rect & rect,int32_t oriHeight,int32_t oriWidth) const458 bool DisplayManager::Impl::CheckRectValid(const Media::Rect& rect, int32_t oriHeight, int32_t oriWidth) const
459 {
460     if (rect.left < 0) {
461         return false;
462     }
463     if (rect.top < 0) {
464         return false;
465     }
466     if (rect.width < 0) {
467         return false;
468     }
469     if (rect.height < 0) {
470         return false;
471     }
472     if (rect.width + rect.left > oriWidth) {
473         return false;
474     }
475     if (rect.height + rect.top > oriHeight) {
476         return false;
477     }
478     return true;
479 }
480 
CheckSizeValid(const Media::Size & size,int32_t oriHeight,int32_t oriWidth) const481 bool DisplayManager::Impl::CheckSizeValid(const Media::Size& size, int32_t oriHeight, int32_t oriWidth) const
482 {
483     if (size.width < 0) {
484         return false;
485     }
486     if (size.height < 0) {
487         return false;
488     }
489     if (size.width > MAX_RESOLUTION_SIZE_SCREENSHOT) {
490         return false;
491     }
492     if (size.height > MAX_RESOLUTION_SIZE_SCREENSHOT) {
493         return false;
494     }
495     return true;
496 }
497 
ClearDisplayStateCallback()498 void DisplayManager::Impl::ClearDisplayStateCallback()
499 {
500     std::lock_guard<std::recursive_mutex> lock(mutex_);
501     TLOGD(WmsLogTag::DMS, "[UL_POWER]Clear displaystatecallback enter");
502     displayStateCallback_ = nullptr;
503     if (displayStateAgent_ != nullptr) {
504         TLOGI(WmsLogTag::DMS, "[UL_POWER]UnregisterDisplayManagerAgent and clear displayStateAgent_");
505         SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(displayStateAgent_,
506             DisplayManagerAgentType::DISPLAY_STATE_LISTENER);
507         displayStateAgent_ = nullptr;
508     }
509 }
510 
ClearFoldStatusCallback()511 void DisplayManager::Impl::ClearFoldStatusCallback()
512 {
513     DMError res = DMError::DM_OK;
514     std::lock_guard<std::recursive_mutex> lock(mutex_);
515     if (foldStatusListenerAgent_ != nullptr) {
516         res = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(foldStatusListenerAgent_,
517             DisplayManagerAgentType::FOLD_STATUS_CHANGED_LISTENER);
518         foldStatusListenerAgent_ = nullptr;
519         TLOGI(WmsLogTag::DMS, "ClearFoldStatusCallback foldStatusListenerAgent_ is nullptr !");
520     }
521     if (res != DMError::DM_OK) {
522         TLOGW(WmsLogTag::DMS, "UnregisterDisplayManagerAgent FOLD_STATUS_CHANGED_LISTENER failed !");
523     }
524 }
525 
ClearFoldAngleCallback()526 void DisplayManager::Impl::ClearFoldAngleCallback()
527 {
528     std::lock_guard<std::recursive_mutex> lock(mutex_);
529     if (foldAngleListenerAgent_ == nullptr) {
530         return;
531     }
532     DMError res = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
533         foldAngleListenerAgent_, DisplayManagerAgentType::FOLD_ANGLE_CHANGED_LISTENER);
534     foldAngleListenerAgent_ = nullptr;
535     if (res != DMError::DM_OK) {
536         TLOGE(WmsLogTag::DMS, "ClearFoldAngleCallback FOLD_ANGLE_CHANGED_LISTENER failed !");
537     } else {
538         TLOGI(WmsLogTag::DMS, "ClearFoldAngleCallback foldAngleListenerAgent_!");
539     }
540 }
541 
ClearCaptureStatusCallback()542 void DisplayManager::Impl::ClearCaptureStatusCallback()
543 {
544     std::lock_guard<std::recursive_mutex> lock(mutex_);
545     if (captureStatusListenerAgent_ == nullptr) {
546         return;
547     }
548     DMError res = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
549         captureStatusListenerAgent_, DisplayManagerAgentType::CAPTURE_STATUS_CHANGED_LISTENER);
550     captureStatusListenerAgent_ = nullptr;
551     if (res != DMError::DM_OK) {
552         TLOGE(WmsLogTag::DMS, "ClearCaptureStatusCallback FOLD_ANGLE_CHANGED_LISTENER failed !");
553     } else {
554         TLOGI(WmsLogTag::DMS, "ClearCaptureStatusCallback captureStatusListenerAgent_!");
555     }
556 }
557 
ClearDisplayModeCallback()558 void DisplayManager::Impl::ClearDisplayModeCallback()
559 {
560     DMError res = DMError::DM_OK;
561     std::lock_guard<std::recursive_mutex> lock(mutex_);
562     if (displayModeListenerAgent_ != nullptr) {
563         res = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(displayModeListenerAgent_,
564             DisplayManagerAgentType::DISPLAY_MODE_CHANGED_LISTENER);
565         displayModeListenerAgent_ = nullptr;
566         TLOGI(WmsLogTag::DMS, "ClearDisplayStateCallback displayModeListenerAgent_ is nullptr !");
567     }
568     if (res != DMError::DM_OK) {
569         TLOGW(WmsLogTag::DMS, "UnregisterDisplayManagerAgent DISPLAY_MODE_CHANGED_LISTENER failed !");
570     }
571 }
572 
Clear()573 void DisplayManager::Impl::Clear()
574 {
575     TLOGI(WmsLogTag::DMS, "Clear listener");
576     std::lock_guard<std::recursive_mutex> lock(mutex_);
577     DMError res = DMError::DM_OK;
578     if (displayManagerListener_ != nullptr) {
579         res = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
580             displayManagerListener_, DisplayManagerAgentType::DISPLAY_EVENT_LISTENER);
581     }
582     displayManagerListener_ = nullptr;
583     if (res != DMError::DM_OK) {
584         TLOGW(WmsLogTag::DMS, "UnregisterDisplayManagerAgent DISPLAY_EVENT_LISTENER failed !");
585     }
586     res = DMError::DM_OK;
587     if (powerEventListenerAgent_ != nullptr) {
588         res = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
589             powerEventListenerAgent_, DisplayManagerAgentType::DISPLAY_POWER_EVENT_LISTENER);
590     }
591     powerEventListenerAgent_ = nullptr;
592     if (res != DMError::DM_OK) {
593         TLOGW(WmsLogTag::DMS, "UnregisterDisplayManagerAgent DISPLAY_POWER_EVENT_LISTENER failed !");
594     }
595     ClearDisplayStateCallback();
596     ClearFoldStatusCallback();
597     ClearFoldAngleCallback();
598     ClearCaptureStatusCallback();
599     ClearDisplayModeCallback();
600 }
601 
~Impl()602 DisplayManager::Impl::~Impl()
603 {
604     Clear();
605 }
606 
DisplayManager()607 DisplayManager::DisplayManager() : pImpl_(new Impl(mutex_))
608 {
609     TLOGD(WmsLogTag::DMS, "Create instance");
610     g_dmIsDestroyed = false;
611 }
612 
~DisplayManager()613 DisplayManager::~DisplayManager()
614 {
615     TLOGI(WmsLogTag::DMS, "Destroy instance");
616     g_dmIsDestroyed = true;
617 }
618 
GetDefaultDisplayId()619 DisplayId DisplayManager::GetDefaultDisplayId()
620 {
621     auto info = SingletonContainer::Get<DisplayManagerAdapter>().GetDefaultDisplayInfo();
622     if (info == nullptr) {
623         return DISPLAY_ID_INVALID;
624     }
625     return info->GetDisplayId();
626 }
627 
GetDefaultDisplay()628 sptr<Display> DisplayManager::Impl::GetDefaultDisplay()
629 {
630     auto displayInfo = SingletonContainer::Get<DisplayManagerAdapter>().GetDefaultDisplayInfo();
631     if (displayInfo == nullptr) {
632         return nullptr;
633     }
634     auto displayId = displayInfo->GetDisplayId();
635     std::lock_guard<std::recursive_mutex> lock(mutex_);
636     if (!UpdateDisplayInfoLocked(displayInfo)) {
637         displayMap_.erase(displayId);
638         return nullptr;
639     }
640     return displayMap_[displayId];
641 }
642 
GetDefaultDisplaySync()643 sptr<Display> DisplayManager::Impl::GetDefaultDisplaySync()
644 {
645     static std::chrono::steady_clock::time_point lastRequestTime = std::chrono::steady_clock::now();
646     auto currentTime = std::chrono::steady_clock::now();
647     auto interval = std::chrono::duration_cast<std::chrono::microseconds>(currentTime - lastRequestTime).count();
648     if (defaultDisplayId_ != DISPLAY_ID_INVALID && interval < APP_GET_DISPLAY_INTERVAL_US) {
649         std::lock_guard<std::recursive_mutex> lock(mutex_);
650         auto iter = displayMap_.find(defaultDisplayId_);
651         if (iter != displayMap_.end()) {
652             return displayMap_[defaultDisplayId_];
653         }
654     }
655 
656     uint32_t retryTimes = 0;
657     sptr<DisplayInfo> displayInfo = nullptr;
658     while (retryTimes < MAX_RETRY_NUM) {
659         displayInfo = SingletonContainer::Get<DisplayManagerAdapter>().GetDefaultDisplayInfo();
660         if (displayInfo != nullptr) {
661             break;
662         }
663         retryTimes++;
664         TLOGW(WmsLogTag::DMS, "Current get display info is null, retry %{public}u times", retryTimes);
665         std::this_thread::sleep_for(std::chrono::milliseconds(RETRY_WAIT_MS));
666     }
667     if (retryTimes >= MAX_RETRY_NUM || displayInfo == nullptr) {
668         TLOGE(WmsLogTag::DMS, "Get display info failed, please check whether the onscreenchange event is triggered");
669         return nullptr;
670     }
671 
672     auto displayId = displayInfo->GetDisplayId();
673     std::lock_guard<std::recursive_mutex> lock(mutex_);
674     if (!UpdateDisplayInfoLocked(displayInfo)) {
675         displayMap_.erase(displayId);
676         return nullptr;
677     }
678     lastRequestTime = currentTime;
679     defaultDisplayId_ = displayId;
680     return displayMap_[displayId];
681 }
682 
SetVirtualScreenAsDefault(ScreenId screenId)683 bool DisplayManager::Impl::SetVirtualScreenAsDefault(ScreenId screenId)
684 {
685     return SingletonContainer::Get<DisplayManagerAdapter>().SetVirtualScreenAsDefault(screenId);
686 }
687 
GetDisplayById(DisplayId displayId)688 sptr<Display> DisplayManager::Impl::GetDisplayById(DisplayId displayId)
689 {
690     TLOGD(WmsLogTag::DMS, "GetDisplayById start, displayId: %{public}" PRIu64" ", displayId);
691     auto currentTime = std::chrono::steady_clock::now();
692     {
693         std::lock_guard<std::recursive_mutex> lock(mutex_);
694         auto lastRequestIter = displayUptateTimeMap_.find(displayId);
695         static uint32_t getDisplayIntervalUs_ = (std::string(program_invocation_name) != "com.ohos.sceneboard")
696              ? APP_GET_DISPLAY_INTERVAL_US : SCB_GET_DISPLAY_INTERVAL_US;
697         if (displayId != DISPLAY_ID_INVALID && lastRequestIter != displayUptateTimeMap_.end()) {
698             auto interval = std::chrono::duration_cast<std::chrono::microseconds>(currentTime - lastRequestIter->second)
699                 .count();
700             if (interval < getDisplayIntervalUs_ && !needUpdateDisplayFromDMS_) {
701                 auto iter = displayMap_.find(displayId);
702                 if (iter != displayMap_.end()) {
703                     return displayMap_[displayId];
704                 }
705             }
706         }
707     }
708     sptr<DisplayInfo> displayInfo = SingletonContainer::Get<DisplayManagerAdapter>().GetDisplayInfo(displayId);
709     if (displayInfo == nullptr) {
710         TLOGW(WmsLogTag::DMS, "display null id : %{public}" PRIu64" ", displayId);
711         return nullptr;
712     }
713 
714     std::lock_guard<std::recursive_mutex> lock(mutex_);
715     if (!UpdateDisplayInfoLocked(displayInfo)) {
716         displayMap_.erase(displayId);
717         //map erase函数删除不存在key行为安全
718         displayUptateTimeMap_.erase(displayId);
719         return nullptr;
720     }
721     needUpdateDisplayFromDMS_ = false;
722     displayUptateTimeMap_[displayId] = currentTime;
723     return displayMap_[displayId];
724 }
725 
GetVisibleAreaDisplayInfoById(DisplayId displayId)726 sptr<DisplayInfo> DisplayManager::Impl::GetVisibleAreaDisplayInfoById(DisplayId displayId)
727 {
728     TLOGD(WmsLogTag::DMS, "start, displayId: %{public}" PRIu64" ", displayId);
729     sptr<DisplayInfo> displayInfo =
730         SingletonContainer::Get<DisplayManagerAdapter>().GetVisibleAreaDisplayInfoById(displayId);
731     if (displayInfo == nullptr) {
732         TLOGW(WmsLogTag::DMS, "display null id : %{public}" PRIu64" ", displayId);
733         return nullptr;
734     }
735     return displayInfo;
736 }
737 
GetDisplayById(DisplayId displayId)738 sptr<Display> DisplayManager::GetDisplayById(DisplayId displayId)
739 {
740     if (g_dmIsDestroyed) {
741         TLOGI(WmsLogTag::DMS, "DM has been destructed");
742         return nullptr;
743     }
744     std::lock_guard<std::recursive_mutex> lock(mutex_);
745     return pImpl_->GetDisplayById(displayId);
746 }
747 
GetVisibleAreaDisplayInfoById(DisplayId displayId)748 sptr<DisplayInfo> DisplayManager::GetVisibleAreaDisplayInfoById(DisplayId displayId)
749 {
750     if (g_dmIsDestroyed) {
751         TLOGI(WmsLogTag::DMS, "DM has been destructed");
752         return nullptr;
753     }
754     std::lock_guard<std::recursive_mutex> lock(mutex_);
755     return pImpl_->GetVisibleAreaDisplayInfoById(displayId);
756 }
757 
GetExpandAvailableArea(DisplayId displayId,DMRect & area)758 DMError DisplayManager::GetExpandAvailableArea(DisplayId displayId, DMRect& area)
759 {
760     return pImpl_->GetExpandAvailableArea(displayId, area);
761 }
762 
GetExpandAvailableArea(DisplayId displayId,DMRect & area)763 DMError DisplayManager::Impl::GetExpandAvailableArea(DisplayId displayId, DMRect& area)
764 {
765     return SingletonContainer::Get<DisplayManagerAdapter>().GetExpandAvailableArea(displayId, area);
766 }
767 
GetDisplayByScreen(ScreenId screenId)768 sptr<Display> DisplayManager::GetDisplayByScreen(ScreenId screenId)
769 {
770     if (screenId == SCREEN_ID_INVALID) {
771         TLOGE(WmsLogTag::DMS, "screenId is invalid.");
772         return nullptr;
773     }
774     sptr<Display> display = pImpl_->GetDisplayByScreenId(screenId);
775     if (display == nullptr) {
776         TLOGE(WmsLogTag::DMS, "get display by screenId failed. screen %{public}" PRIu64"", screenId);
777     }
778     return display;
779 }
780 
GetDisplayByScreenId(ScreenId screenId)781 sptr<Display> DisplayManager::Impl::GetDisplayByScreenId(ScreenId screenId)
782 {
783     sptr<DisplayInfo> displayInfo = SingletonContainer::Get<DisplayManagerAdapter>().GetDisplayInfoByScreenId(screenId);
784     if (displayInfo == nullptr) {
785         TLOGE(WmsLogTag::DMS, "get display by screenId: displayInfo is null");
786         return nullptr;
787     }
788     DisplayId displayId = displayInfo->GetDisplayId();
789     if (displayId == DISPLAY_ID_INVALID) {
790         TLOGE(WmsLogTag::DMS, "get display by screenId: invalid displayInfo");
791         return nullptr;
792     }
793 
794     std::lock_guard<std::recursive_mutex> lock(mutex_);
795     if (!UpdateDisplayInfoLocked(displayInfo)) {
796         displayMap_.erase(displayId);
797         return nullptr;
798     }
799     return displayMap_[displayId];
800 }
801 
GetScreenshot(DisplayId displayId,DmErrorCode * errorCode,bool isUseDma,bool isCaptureFullOfScreen)802 std::shared_ptr<Media::PixelMap> DisplayManager::GetScreenshot(DisplayId displayId,
803     DmErrorCode* errorCode, bool isUseDma, bool isCaptureFullOfScreen)
804 {
805     if (displayId == DISPLAY_ID_INVALID) {
806         TLOGE(WmsLogTag::DMS, "displayId invalid!");
807         return nullptr;
808     }
809     std::shared_ptr<Media::PixelMap> screenShot =
810         SingletonContainer::Get<DisplayManagerAdapter>().GetDisplaySnapshot(displayId, errorCode,
811             isUseDma, isCaptureFullOfScreen);
812     if (screenShot == nullptr) {
813         TLOGE(WmsLogTag::DMS, "failed!");
814         return nullptr;
815     }
816 
817     return screenShot;
818 }
819 
GetScreenHDRshot(DisplayId displayId,DmErrorCode & errorCode,bool isUseDma,bool isCaptureFullOfScreen)820 std::vector<std::shared_ptr<Media::PixelMap>> DisplayManager::GetScreenHDRshot(DisplayId displayId,
821     DmErrorCode& errorCode, bool isUseDma, bool isCaptureFullOfScreen)
822 {
823     if (displayId == DISPLAY_ID_INVALID) {
824         TLOGE(WmsLogTag::DMS, "displayId invalid!");
825         return { nullptr, nullptr };
826     }
827     const std::vector<std::shared_ptr<Media::PixelMap>>& screenShotVec =
828         SingletonContainer::Get<DisplayManagerAdapter>().GetDisplayHDRSnapshot(displayId, errorCode,
829             isUseDma, isCaptureFullOfScreen);
830     if (screenShotVec.size() != PIXMAP_VECTOR_SIZE) {
831         TLOGE(WmsLogTag::DMS, "failed!");
832         return { nullptr, nullptr };
833     }
834     return screenShotVec;
835 }
836 
GetSnapshotByPicker(Media::Rect & rect,DmErrorCode * errorCode)837 std::shared_ptr<Media::PixelMap> DisplayManager::GetSnapshotByPicker(Media::Rect &rect, DmErrorCode* errorCode)
838 {
839     std::unique_lock<std::mutex> lock(snapBypickerMutex, std::defer_lock);
840     if (!lock.try_lock()) {
841         TLOGE(WmsLogTag::DMS, "try_lock failed!");
842         return nullptr;
843     }
844     std::shared_ptr<Media::PixelMap> screenShot =
845         SingletonContainer::Get<DisplayManagerAdapter>().GetSnapshotByPicker(rect, errorCode);
846     lock.unlock();
847     if (screenShot == nullptr) {
848         TLOGE(WmsLogTag::DMS, "failed!");
849         return nullptr;
850     }
851     TLOGI(WmsLogTag::DMS, "snapshot area left:%{public}d, top:%{public}d, width:%{public}d, height:%{public}d",
852         rect.left, rect.top, rect.width, rect.height);
853     // create crop pixel map
854     if (rect.width == 0 || rect.height == 0) {
855         TLOGE(WmsLogTag::DMS, "width or height is invalid!");
856         return nullptr;
857     }
858     Media::InitializationOptions opt;
859     opt.size.width = rect.width;
860     opt.size.height = rect.height;
861     opt.scaleMode = Media::ScaleMode::FIT_TARGET_SIZE;
862     opt.editable = false;
863     auto pixelMap = Media::PixelMap::Create(*screenShot, rect, opt);
864     if (pixelMap == nullptr) {
865         TLOGE(WmsLogTag::DMS, "Media pixel map create failed");
866         return nullptr;
867     }
868     return pixelMap;
869 }
870 
GetScreenshotwithConfig(const SnapShotConfig & snapShotConfig,DmErrorCode * errorCode,bool isUseDma)871 std::shared_ptr<Media::PixelMap> DisplayManager::GetScreenshotwithConfig(const SnapShotConfig &snapShotConfig,
872     DmErrorCode* errorCode, bool isUseDma)
873 {
874     std::shared_ptr<Media::PixelMap> screenShot = GetScreenshot(snapShotConfig.displayId_, errorCode, isUseDma,
875         snapShotConfig.isCaptureFullOfScreen_);
876     if (screenShot == nullptr) {
877         TLOGE(WmsLogTag::DMS, "failed!");
878         return nullptr;
879     }
880     // check parameters
881     int32_t oriHeight = screenShot->GetHeight();
882     int32_t oriWidth = screenShot->GetWidth();
883     if (!pImpl_->CheckRectValid(snapShotConfig.imageRect_, oriHeight, oriWidth)) {
884         TLOGE(WmsLogTag::DMS, "rect invalid! left %{public}d, top %{public}d, w %{public}d, h %{public}d",
885             snapShotConfig.imageRect_.left, snapShotConfig.imageRect_.top,
886             snapShotConfig.imageRect_.width, snapShotConfig.imageRect_.height);
887         return nullptr;
888     }
889     if (!pImpl_->CheckSizeValid(snapShotConfig.imageSize_, oriHeight, oriWidth)) {
890         TLOGE(WmsLogTag::DMS, "size invalid! w %{public}d, h %{public}d", snapShotConfig.imageSize_.width,
891             snapShotConfig.imageSize_.height);
892         return nullptr;
893     }
894     // create crop dest pixelmap
895     Media::InitializationOptions opt;
896     opt.size.width = snapShotConfig.imageSize_.width;
897     opt.size.height = snapShotConfig.imageSize_.height;
898     opt.scaleMode = Media::ScaleMode::FIT_TARGET_SIZE;
899     opt.editable = false;
900     auto pixelMap = Media::PixelMap::Create(*screenShot, snapShotConfig.imageRect_, opt);
901     if (pixelMap == nullptr) {
902         TLOGE(WmsLogTag::DMS, "Media::PixelMap::Create failed!");
903         return nullptr;
904     }
905     std::shared_ptr<Media::PixelMap> dstScreenshot(pixelMap.release());
906     return dstScreenshot;
907 }
908 
GetScreenshot(DisplayId displayId,const Media::Rect & rect,const Media::Size & size,int rotation,DmErrorCode * errorCode)909 std::shared_ptr<Media::PixelMap> DisplayManager::GetScreenshot(DisplayId displayId, const Media::Rect &rect,
910     const Media::Size &size, int rotation, DmErrorCode* errorCode)
911 {
912     std::shared_ptr<Media::PixelMap> screenShot = GetScreenshot(displayId, errorCode);
913     if (screenShot == nullptr) {
914         TLOGE(WmsLogTag::DMS, "failed!");
915         return nullptr;
916     }
917 
918     // check parameters
919     int32_t oriHeight = screenShot->GetHeight();
920     int32_t oriWidth = screenShot->GetWidth();
921     if (!pImpl_->CheckRectValid(rect, oriHeight, oriWidth)) {
922         TLOGE(WmsLogTag::DMS, "rect invalid! left %{public}d, top %{public}d, w %{public}d, h %{public}d",
923             rect.left, rect.top, rect.width, rect.height);
924         return nullptr;
925     }
926     if (!pImpl_->CheckSizeValid(size, oriHeight, oriWidth)) {
927         TLOGE(WmsLogTag::DMS, "size invalid! w %{public}d, h %{public}d", rect.width, rect.height);
928         return nullptr;
929     }
930 
931     // create crop dest pixelmap
932     Media::InitializationOptions opt;
933     opt.size.width = size.width;
934     opt.size.height = size.height;
935     opt.scaleMode = Media::ScaleMode::FIT_TARGET_SIZE;
936     opt.editable = false;
937     auto pixelMap = Media::PixelMap::Create(*screenShot, rect, opt);
938     if (pixelMap == nullptr) {
939         TLOGE(WmsLogTag::DMS, "Media::PixelMap::Create failed!");
940         return nullptr;
941     }
942     std::shared_ptr<Media::PixelMap> dstScreenshot(pixelMap.release());
943 
944     return dstScreenshot;
945 }
946 
GetDefaultDisplay()947 sptr<Display> DisplayManager::GetDefaultDisplay()
948 {
949     return pImpl_->GetDefaultDisplay();
950 }
951 
AddDisplayIdFromAms(DisplayId displayId,const wptr<IRemoteObject> & abilityToken)952 void DisplayManager::AddDisplayIdFromAms(DisplayId displayId, const wptr<IRemoteObject>& abilityToken)
953 {
954     if (abilityToken == nullptr || displayId == DISPLAY_ID_INVALID) {
955         TLOGE(WmsLogTag::DMS, "abilityToken is nullptr or display id invalid.");
956         return;
957     }
958     std::lock_guard<std::mutex> lock(displayOperateMutex_);
959     auto iter = std::find_if(displayIdList_.begin(), displayIdList_.end(),
960         [displayId, abilityToken](const auto &item) -> bool {
961             return item.first == abilityToken && item.second == displayId;
962     });
963     if (iter != displayIdList_.end()) {
964         TLOGI(WmsLogTag::DMS, "abilityToken and display[%{public}" PRIu64"] has been added.", displayId);
965     } else {
966         displayIdList_.push_back(std::make_pair(abilityToken, displayId));
967     }
968     ShowDisplayIdList(false);
969 }
970 
RemoveDisplayIdFromAms(const wptr<IRemoteObject> & abilityToken)971 void DisplayManager::RemoveDisplayIdFromAms(const wptr<IRemoteObject>& abilityToken)
972 {
973     if (abilityToken == nullptr) {
974         TLOGE(WmsLogTag::DMS, "abilityToken is nullptr.");
975         return;
976     }
977     std::lock_guard<std::mutex> lock(displayOperateMutex_);
978     if (displayIdList_.empty()) {
979         TLOGI(WmsLogTag::DMS, "displayIdList_ is empty.");
980         return;
981     }
982     auto iter = std::find_if(displayIdList_.begin(), displayIdList_.end(),
983         [abilityToken](const auto &item) -> bool {
984             return item.first == abilityToken;
985     });
986     if (iter != displayIdList_.end()) {
987         displayIdList_.erase(iter);
988     }
989     ShowDisplayIdList(false);
990 }
991 
GetCallingAbilityDisplayId()992 DisplayId DisplayManager::GetCallingAbilityDisplayId()
993 {
994     DisplayId displayId = DISPLAY_ID_INVALID;
995     std::lock_guard<std::mutex> lock(displayOperateMutex_);
996     if (displayIdList_.empty()) {
997         TLOGI(WmsLogTag::DMS, "displayIdList is empty.");
998         return displayId;
999     }
1000     int displayCount = 0;
1001     for (const auto &iter : displayIdList_) {
1002         if (displayId == DISPLAY_ID_INVALID || displayId != iter.second) {
1003             displayCount++;
1004         }
1005         displayId = iter.second;
1006         if (displayCount > 1) {
1007             break;
1008         }
1009     }
1010     ShowDisplayIdList(false);
1011     return displayCount == 1 ? displayId : DISPLAY_ID_INVALID;
1012 }
1013 
ShowDisplayIdList(bool isShowLog)1014 void DisplayManager::ShowDisplayIdList(bool isShowLog)
1015 {
1016     std::ostringstream oss;
1017     oss << "current display id list:[";
1018     for (const auto &iter : displayIdList_) {
1019         oss << iter.second << ",";
1020     }
1021     if (isShowLog) {
1022         TLOGI(WmsLogTag::DMS, "%{public}s]", oss.str().c_str());
1023     } else {
1024         TLOGD(WmsLogTag::DMS, "%{public}s]", oss.str().c_str());
1025     }
1026 }
1027 
GetDefaultDisplaySync(bool isFromNapi)1028 sptr<Display> DisplayManager::GetDefaultDisplaySync(bool isFromNapi)
1029 {
1030     if (isFromNapi) {
1031         sptr<Display> display = nullptr;
1032         DisplayId displayId = GetCallingAbilityDisplayId();
1033         if (displayId != DISPLAY_ID_INVALID) {
1034             TLOGD(WmsLogTag::DMS, "displayId:%{public}" PRIu64, displayId);
1035             display = pImpl_->GetDisplayById(displayId);
1036         }
1037         if (display != nullptr) {
1038             return display;
1039         } else {
1040             TLOGI(WmsLogTag::DMS, "get displayId:%{public}" PRIu64" info nullptr.", displayId);
1041         }
1042     }
1043     return pImpl_->GetDefaultDisplaySync();
1044 }
1045 
SetVirtualScreenAsDefault(ScreenId screenId)1046 bool DisplayManager::SetVirtualScreenAsDefault(ScreenId screenId)
1047 {
1048     if (pImpl_ == nullptr) {
1049         TLOGE(WmsLogTag::DMS, "pImpl_ is null");
1050         return false;
1051     }
1052     return pImpl_->SetVirtualScreenAsDefault(screenId);
1053 }
1054 
GetAllDisplayIds()1055 std::vector<DisplayId> DisplayManager::GetAllDisplayIds()
1056 {
1057     return SingletonContainer::Get<DisplayManagerAdapter>().GetAllDisplayIds();
1058 }
1059 
GetAllDisplayPhysicalResolution()1060 std::vector<DisplayPhysicalResolution> DisplayManager::Impl::GetAllDisplayPhysicalResolution()
1061 {
1062     return SingletonContainer::Get<DisplayManagerAdapter>().GetAllDisplayPhysicalResolution();
1063 }
1064 
GetAllDisplayPhysicalResolution()1065 std::vector<DisplayPhysicalResolution> DisplayManager::GetAllDisplayPhysicalResolution()
1066 {
1067     return pImpl_->GetAllDisplayPhysicalResolution();
1068 }
1069 
GetAllDisplays()1070 std::vector<sptr<Display>> DisplayManager::GetAllDisplays()
1071 {
1072     TLOGD(WmsLogTag::DMS, "GetAllDisplays start");
1073     std::vector<sptr<Display>> res;
1074     auto displayIds = GetAllDisplayIds();
1075     for (auto displayId : displayIds) {
1076         const sptr<Display> display = GetDisplayById(displayId);
1077         if (display != nullptr) {
1078             res.emplace_back(display);
1079         } else {
1080             TLOGE(WmsLogTag::DMS, "DisplayManager::GetAllDisplays display %" PRIu64" nullptr!", displayId);
1081         }
1082     }
1083     return res;
1084 }
1085 
HasPrivateWindow(DisplayId displayId,bool & hasPrivateWindow)1086 DMError DisplayManager::HasPrivateWindow(DisplayId displayId, bool& hasPrivateWindow)
1087 {
1088     return pImpl_->HasPrivateWindow(displayId, hasPrivateWindow);
1089 }
1090 
HasPrivateWindow(DisplayId displayId,bool & hasPrivateWindow)1091 DMError DisplayManager::Impl::HasPrivateWindow(DisplayId displayId, bool& hasPrivateWindow)
1092 {
1093     return SingletonContainer::Get<DisplayManagerAdapter>().HasPrivateWindow(displayId, hasPrivateWindow);
1094 }
1095 
IsFoldable()1096 bool DisplayManager::IsFoldable()
1097 {
1098     return pImpl_->IsFoldable();
1099 }
1100 
IsFoldable()1101 bool DisplayManager::Impl::IsFoldable()
1102 {
1103     return SingletonContainer::Get<DisplayManagerAdapter>().IsFoldable();
1104 }
1105 
IsCaptured()1106 bool DisplayManager::IsCaptured()
1107 {
1108     return pImpl_->IsCaptured();
1109 }
1110 
IsCaptured()1111 bool DisplayManager::Impl::IsCaptured()
1112 {
1113     return SingletonContainer::Get<DisplayManagerAdapter>().IsCaptured();
1114 }
1115 
GetFoldStatus()1116 FoldStatus DisplayManager::GetFoldStatus()
1117 {
1118     return pImpl_->GetFoldStatus();
1119 }
1120 
GetFoldStatus()1121 FoldStatus DisplayManager::Impl::GetFoldStatus()
1122 {
1123     return SingletonContainer::Get<DisplayManagerAdapter>().GetFoldStatus();
1124 }
1125 
GetFoldDisplayMode()1126 FoldDisplayMode DisplayManager::GetFoldDisplayMode()
1127 {
1128     return pImpl_->GetFoldDisplayMode();
1129 }
1130 
GetFoldDisplayModeForExternal()1131 FoldDisplayMode DisplayManager::GetFoldDisplayModeForExternal()
1132 {
1133     return pImpl_->GetFoldDisplayModeForExternal();
1134 }
1135 
GetFoldDisplayMode()1136 FoldDisplayMode DisplayManager::Impl::GetFoldDisplayMode()
1137 {
1138     return SingletonContainer::Get<DisplayManagerAdapter>().GetFoldDisplayMode();
1139 }
1140 
GetFoldDisplayModeForExternal()1141 FoldDisplayMode DisplayManager::Impl::GetFoldDisplayModeForExternal()
1142 {
1143     FoldDisplayMode displayMode = SingletonContainer::Get<DisplayManagerAdapter>().GetFoldDisplayMode();
1144     if (displayMode == FoldDisplayMode::GLOBAL_FULL) {
1145         return FoldDisplayMode::FULL;
1146     }
1147     return displayMode;
1148 }
1149 
SetFoldDisplayMode(const FoldDisplayMode mode)1150 void DisplayManager::SetFoldDisplayMode(const FoldDisplayMode mode)
1151 {
1152     pImpl_->SetFoldDisplayMode(mode);
1153 }
1154 
SetFoldDisplayModeAsync(const FoldDisplayMode mode)1155 void DisplayManager::SetFoldDisplayModeAsync(const FoldDisplayMode mode)
1156 {
1157     pImpl_->SetFoldDisplayModeAsync(mode);
1158 }
1159 
SetFoldDisplayModeFromJs(const FoldDisplayMode mode,std::string reason)1160 DMError DisplayManager::SetFoldDisplayModeFromJs(const FoldDisplayMode mode, std::string reason)
1161 {
1162     return pImpl_->SetFoldDisplayModeFromJs(mode, reason);
1163 }
1164 
SetDisplayScale(ScreenId screenId,float scaleX,float scaleY,float pivotX,float pivotY)1165 void DisplayManager::SetDisplayScale(ScreenId screenId, float scaleX, float scaleY, float pivotX, float pivotY)
1166 {
1167     pImpl_->SetDisplayScale(screenId, scaleX, scaleY, pivotX, pivotY);
1168 }
1169 
SetDisplayScale(ScreenId screenId,float scaleX,float scaleY,float pivotX,float pivotY)1170 void DisplayManager::Impl::SetDisplayScale(ScreenId screenId,
1171     float scaleX, float scaleY, float pivotX, float pivotY)
1172 {
1173     SingletonContainer::Get<DisplayManagerAdapter>().SetDisplayScale(screenId, scaleX, scaleY, pivotX, pivotY);
1174 }
1175 
SetFoldDisplayMode(const FoldDisplayMode mode)1176 void DisplayManager::Impl::SetFoldDisplayMode(const FoldDisplayMode mode)
1177 {
1178     SingletonContainer::Get<DisplayManagerAdapter>().SetFoldDisplayMode(mode);
1179 }
1180 
SetFoldDisplayModeAsync(const FoldDisplayMode mode)1181 void DisplayManager::Impl::SetFoldDisplayModeAsync(const FoldDisplayMode mode)
1182 {
1183     SingletonContainer::Get<DisplayManagerAdapter>().SetFoldDisplayModeAsync(mode);
1184 }
1185 
SetFoldDisplayModeFromJs(const FoldDisplayMode mode,std::string reason)1186 DMError DisplayManager::Impl::SetFoldDisplayModeFromJs(const FoldDisplayMode mode, std::string reason)
1187 {
1188     return SingletonContainer::Get<DisplayManagerAdapter>().SetFoldDisplayModeFromJs(mode, reason);
1189 }
1190 
SetFoldStatusLocked(bool locked)1191 void DisplayManager::SetFoldStatusLocked(bool locked)
1192 {
1193     pImpl_->SetFoldStatusLocked(locked);
1194 }
1195 
SetFoldStatusLockedFromJs(bool locked)1196 DMError DisplayManager::SetFoldStatusLockedFromJs(bool locked)
1197 {
1198     return pImpl_->SetFoldStatusLockedFromJs(locked);
1199 }
1200 
SetFoldStatusLocked(bool locked)1201 void DisplayManager::Impl::SetFoldStatusLocked(bool locked)
1202 {
1203     SingletonContainer::Get<DisplayManagerAdapter>().SetFoldStatusLocked(locked);
1204 }
1205 
SetFoldStatusLockedFromJs(bool locked)1206 DMError DisplayManager::Impl::SetFoldStatusLockedFromJs(bool locked)
1207 {
1208     return SingletonContainer::Get<DisplayManagerAdapter>().SetFoldStatusLockedFromJs(locked);
1209 }
1210 
GetCurrentFoldCreaseRegion()1211 sptr<FoldCreaseRegion> DisplayManager::GetCurrentFoldCreaseRegion()
1212 {
1213     return pImpl_->GetCurrentFoldCreaseRegion();
1214 }
1215 
GetCurrentFoldCreaseRegion()1216 sptr<FoldCreaseRegion> DisplayManager::Impl::GetCurrentFoldCreaseRegion()
1217 {
1218     return SingletonContainer::Get<DisplayManagerAdapter>().GetCurrentFoldCreaseRegion();
1219 }
1220 
RegisterDisplayListener(sptr<IDisplayListener> listener)1221 DMError DisplayManager::Impl::RegisterDisplayListener(sptr<IDisplayListener> listener)
1222 {
1223     std::lock_guard<std::recursive_mutex> lock(mutex_);
1224     DMError ret = DMError::DM_OK;
1225     if (displayManagerListener_ == nullptr) {
1226         displayManagerListener_ = new DisplayManagerListener(this);
1227         ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1228             displayManagerListener_,
1229             DisplayManagerAgentType::DISPLAY_EVENT_LISTENER);
1230     }
1231     if (ret != DMError::DM_OK) {
1232         TLOGW(WmsLogTag::DMS, "RegisterDisplayManagerAgent failed !");
1233         displayManagerListener_ = nullptr;
1234     } else {
1235         displayListeners_.insert(listener);
1236     }
1237     return ret;
1238 }
1239 
NotifyPrivateWindowStateChanged(bool hasPrivate)1240 void DisplayManager::Impl::NotifyPrivateWindowStateChanged(bool hasPrivate)
1241 {
1242     std::set<sptr<IPrivateWindowListener>> privateWindowListeners;
1243     {
1244         std::lock_guard<std::recursive_mutex> lock(mutex_);
1245         privateWindowListeners = privateWindowListeners_;
1246     }
1247     for (auto& listener : privateWindowListeners) {
1248         listener->OnPrivateWindow(hasPrivate);
1249     }
1250 }
1251 
NotifyPrivateStateWindowListChanged(DisplayId id,std::vector<std::string> privacyWindowList)1252 void DisplayManager::Impl::NotifyPrivateStateWindowListChanged(DisplayId id, std::vector<std::string> privacyWindowList)
1253 {
1254     std::set<sptr<IPrivateWindowListChangeListener>> privateWindowListChangeListeners;
1255     {
1256         std::lock_guard<std::recursive_mutex> lock(mutex_);
1257         privateWindowListChangeListeners = privateWindowListChangeListeners_;
1258     }
1259     for (auto& listener : privateWindowListChangeListeners) {
1260         listener->OnPrivateWindowListChange(id, privacyWindowList);
1261     }
1262 }
1263 
RegisterPrivateWindowListener(sptr<IPrivateWindowListener> listener)1264 DMError DisplayManager::RegisterPrivateWindowListener(sptr<IPrivateWindowListener> listener)
1265 {
1266     if (listener == nullptr) {
1267         TLOGE(WmsLogTag::DMS, "listener is nullptr.");
1268         return DMError::DM_ERROR_NULLPTR;
1269     }
1270     return pImpl_->RegisterPrivateWindowListener(listener);
1271 }
1272 
UnregisterPrivateWindowListener(sptr<IPrivateWindowListener> listener)1273 DMError DisplayManager::UnregisterPrivateWindowListener(sptr<IPrivateWindowListener> listener)
1274 {
1275     if (listener == nullptr) {
1276         TLOGE(WmsLogTag::DMS, "listener is nullptr.");
1277         return DMError::DM_ERROR_NULLPTR;
1278     }
1279     return pImpl_->UnregisterPrivateWindowListener(listener);
1280 }
1281 
RegisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener)1282 DMError DisplayManager::RegisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener)
1283 {
1284     if (listener == nullptr) {
1285         TLOGE(WmsLogTag::DMS, "listener is nullptr.");
1286         return DMError::DM_ERROR_NULLPTR;
1287     }
1288     return pImpl_->RegisterPrivateWindowListChangeListener(listener);
1289 }
1290 
UnregisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener)1291 DMError DisplayManager::UnregisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener)
1292 {
1293     if (listener == nullptr) {
1294         TLOGE(WmsLogTag::DMS, "listener is nullptr.");
1295         return DMError::DM_ERROR_NULLPTR;
1296     }
1297     return pImpl_->UnregisterPrivateWindowListChangeListener(listener);
1298 }
1299 
RegisterPrivateWindowListener(sptr<IPrivateWindowListener> listener)1300 DMError DisplayManager::Impl::RegisterPrivateWindowListener(sptr<IPrivateWindowListener> listener)
1301 {
1302     std::lock_guard<std::recursive_mutex> lock(mutex_);
1303     DMError ret = DMError::DM_OK;
1304     if (privateWindowListenerAgent_ == nullptr) {
1305         privateWindowListenerAgent_ = new DisplayManagerPrivateWindowAgent(this);
1306         ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1307             privateWindowListenerAgent_,
1308             DisplayManagerAgentType::PRIVATE_WINDOW_LISTENER);
1309     }
1310     if (ret != DMError::DM_OK) {
1311         TLOGW(WmsLogTag::DMS, "RegisterDisplayManagerAgent failed !");
1312         privateWindowListenerAgent_ = nullptr;
1313     } else {
1314         TLOGI(WmsLogTag::DMS, "privateWindowListener register success");
1315         privateWindowListeners_.insert(listener);
1316     }
1317     return ret;
1318 }
1319 
UnregisterPrivateWindowListener(sptr<IPrivateWindowListener> listener)1320 DMError DisplayManager::Impl::UnregisterPrivateWindowListener(sptr<IPrivateWindowListener> listener)
1321 {
1322     std::lock_guard<std::recursive_mutex> lock(mutex_);
1323     auto iter = std::find(privateWindowListeners_.begin(), privateWindowListeners_.end(), listener);
1324     if (iter == privateWindowListeners_.end()) {
1325         TLOGE(WmsLogTag::DMS, "could not find this listener");
1326         return DMError::DM_ERROR_NULLPTR;
1327     }
1328     privateWindowListeners_.erase(iter);
1329     DMError ret = DMError::DM_OK;
1330     if (privateWindowListeners_.empty() && privateWindowListenerAgent_ != nullptr) {
1331         ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1332             privateWindowListenerAgent_,
1333             DisplayManagerAgentType::PRIVATE_WINDOW_LISTENER);
1334         privateWindowListenerAgent_ = nullptr;
1335     }
1336     return ret;
1337 }
1338 
RegisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener)1339 DMError DisplayManager::Impl::RegisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener)
1340 {
1341     std::lock_guard<std::recursive_mutex> lock(mutex_);
1342     DMError ret = DMError::DM_OK;
1343     if (privateWindowListChangeListenerAgent_ == nullptr) {
1344         privateWindowListChangeListenerAgent_ = new DisplayManagerPrivateWindowListAgent(this);
1345         ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1346             privateWindowListChangeListenerAgent_,
1347             DisplayManagerAgentType::PRIVATE_WINDOW_LIST_LISTENER);
1348     }
1349     if (ret != DMError::DM_OK) {
1350         TLOGW(WmsLogTag::DMS, "RegisterDisplayManagerAgent failed !");
1351         privateWindowListChangeListenerAgent_ = nullptr;
1352     } else {
1353         TLOGI(WmsLogTag::DMS, "privateWindowListChangeListener register success");
1354         privateWindowListChangeListeners_.insert(listener);
1355     }
1356     return ret;
1357 }
1358 
UnregisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener)1359 DMError DisplayManager::Impl::UnregisterPrivateWindowListChangeListener(sptr<IPrivateWindowListChangeListener> listener)
1360 {
1361     std::lock_guard<std::recursive_mutex> lock(mutex_);
1362     auto iter = std::find(privateWindowListChangeListeners_.begin(), privateWindowListChangeListeners_.end(), listener);
1363     if (iter == privateWindowListChangeListeners_.end()) {
1364         TLOGE(WmsLogTag::DMS, "could not find this listener");
1365         return DMError::DM_ERROR_NULLPTR;
1366     }
1367     privateWindowListChangeListeners_.erase(iter);
1368     DMError ret = DMError::DM_OK;
1369     if (privateWindowListChangeListeners_.empty() && privateWindowListChangeListenerAgent_ != nullptr) {
1370         ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1371             privateWindowListChangeListenerAgent_,
1372             DisplayManagerAgentType::PRIVATE_WINDOW_LIST_LISTENER);
1373         privateWindowListChangeListenerAgent_ = nullptr;
1374     }
1375     return ret;
1376 }
1377 
RegisterDisplayListener(sptr<IDisplayListener> listener)1378 DMError DisplayManager::RegisterDisplayListener(sptr<IDisplayListener> listener)
1379 {
1380     if (listener == nullptr) {
1381         TLOGE(WmsLogTag::DMS, "RegisterDisplayListener listener is nullptr.");
1382         return DMError::DM_ERROR_NULLPTR;
1383     }
1384     return pImpl_->RegisterDisplayListener(listener);
1385 }
1386 
UnregisterDisplayListener(sptr<IDisplayListener> listener)1387 DMError DisplayManager::Impl::UnregisterDisplayListener(sptr<IDisplayListener> listener)
1388 {
1389     std::lock_guard<std::recursive_mutex> lock(mutex_);
1390     auto iter = std::find(displayListeners_.begin(), displayListeners_.end(), listener);
1391     if (iter == displayListeners_.end()) {
1392         TLOGE(WmsLogTag::DMS, "could not find this listener");
1393         return DMError::DM_ERROR_NULLPTR;
1394     }
1395     displayListeners_.erase(iter);
1396     DMError ret = DMError::DM_OK;
1397     if (displayListeners_.empty() && displayManagerListener_ != nullptr) {
1398         ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1399             displayManagerListener_,
1400             DisplayManagerAgentType::DISPLAY_EVENT_LISTENER);
1401         displayManagerListener_ = nullptr;
1402     }
1403     return ret;
1404 }
1405 
UnregisterDisplayListener(sptr<IDisplayListener> listener)1406 DMError DisplayManager::UnregisterDisplayListener(sptr<IDisplayListener> listener)
1407 {
1408     if (listener == nullptr) {
1409         TLOGW(WmsLogTag::DMS, "UnregisterDisplayListener listener is nullptr.");
1410         return DMError::DM_ERROR_NULLPTR;
1411     }
1412     return pImpl_->UnregisterDisplayListener(listener);
1413 }
1414 
RegisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener)1415 DMError DisplayManager::Impl::RegisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener)
1416 {
1417     std::lock_guard<std::recursive_mutex> lock(mutex_);
1418     DMError ret = DMError::DM_OK;
1419     if (powerEventListenerAgent_ == nullptr) {
1420         powerEventListenerAgent_ = new DisplayManagerAgent(this);
1421         ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1422             powerEventListenerAgent_,
1423             DisplayManagerAgentType::DISPLAY_POWER_EVENT_LISTENER);
1424     }
1425     if (ret != DMError::DM_OK) {
1426         TLOGW(WmsLogTag::DMS, "RegisterDisplayManagerAgent failed !");
1427         powerEventListenerAgent_ = nullptr;
1428     } else {
1429         powerEventListeners_.insert(listener);
1430     }
1431     TLOGD(WmsLogTag::DMS, "end");
1432     return ret;
1433 }
1434 
RegisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener)1435 DMError DisplayManager::RegisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener)
1436 {
1437     if (listener == nullptr) {
1438         TLOGE(WmsLogTag::DMS, "listener is nullptr");
1439         return DMError::DM_ERROR_NULLPTR;
1440     }
1441     return pImpl_->RegisterDisplayPowerEventListener(listener);
1442 }
1443 
UnregisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener)1444 DMError DisplayManager::Impl::UnregisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener)
1445 {
1446     std::lock_guard<std::recursive_mutex> lock(mutex_);
1447     auto iter = std::find(powerEventListeners_.begin(), powerEventListeners_.end(), listener);
1448     if (iter == powerEventListeners_.end()) {
1449         TLOGE(WmsLogTag::DMS, "could not find this listener");
1450         return DMError::DM_ERROR_NULLPTR;
1451     }
1452     powerEventListeners_.erase(iter);
1453     DMError ret = DMError::DM_OK;
1454     if (powerEventListeners_.empty() && powerEventListenerAgent_ != nullptr) {
1455         ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1456             powerEventListenerAgent_,
1457             DisplayManagerAgentType::DISPLAY_POWER_EVENT_LISTENER);
1458         powerEventListenerAgent_ = nullptr;
1459     }
1460     TLOGD(WmsLogTag::DMS, "end");
1461     return ret;
1462 }
1463 
UnregisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener)1464 DMError DisplayManager::UnregisterDisplayPowerEventListener(sptr<IDisplayPowerEventListener> listener)
1465 {
1466     if (listener == nullptr) {
1467         TLOGE(WmsLogTag::DMS, "listener is nullptr");
1468         return DMError::DM_ERROR_NULLPTR;
1469     }
1470     return pImpl_->UnregisterDisplayPowerEventListener(listener);
1471 }
1472 
RegisterScreenshotListener(sptr<IScreenshotListener> listener)1473 DMError DisplayManager::Impl::RegisterScreenshotListener(sptr<IScreenshotListener> listener)
1474 {
1475     std::lock_guard<std::recursive_mutex> lock(mutex_);
1476     DMError ret = DMError::DM_OK;
1477     if (screenshotListenerAgent_ == nullptr) {
1478         screenshotListenerAgent_ = new DisplayManagerScreenshotAgent(this);
1479         ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1480             screenshotListenerAgent_,
1481             DisplayManagerAgentType::SCREENSHOT_EVENT_LISTENER);
1482     }
1483     if (ret != DMError::DM_OK) {
1484         TLOGW(WmsLogTag::DMS, "RegisterDisplayManagerAgent failed !");
1485         screenshotListenerAgent_ = nullptr;
1486     } else {
1487         screenshotListeners_.insert(listener);
1488     }
1489     return ret;
1490 }
1491 
RegisterScreenshotListener(sptr<IScreenshotListener> listener)1492 DMError DisplayManager::RegisterScreenshotListener(sptr<IScreenshotListener> listener)
1493 {
1494     if (listener == nullptr) {
1495         TLOGE(WmsLogTag::DMS, "listener is nullptr.");
1496         return DMError::DM_ERROR_NULLPTR;
1497     }
1498     return pImpl_->RegisterScreenshotListener(listener);
1499 }
1500 
UnregisterScreenshotListener(sptr<IScreenshotListener> listener)1501 DMError DisplayManager::Impl::UnregisterScreenshotListener(sptr<IScreenshotListener> listener)
1502 {
1503     std::lock_guard<std::recursive_mutex> lock(mutex_);
1504     auto iter = std::find(screenshotListeners_.begin(), screenshotListeners_.end(), listener);
1505     if (iter == screenshotListeners_.end()) {
1506         TLOGE(WmsLogTag::DMS, "could not find this listener");
1507         return DMError::DM_ERROR_NULLPTR;
1508     }
1509     screenshotListeners_.erase(iter);
1510     DMError ret = DMError::DM_OK;
1511     if (screenshotListeners_.empty() && screenshotListenerAgent_ != nullptr) {
1512         ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1513             screenshotListenerAgent_,
1514             DisplayManagerAgentType::SCREENSHOT_EVENT_LISTENER);
1515         screenshotListenerAgent_ = nullptr;
1516     }
1517     return ret;
1518 }
1519 
UnregisterScreenshotListener(sptr<IScreenshotListener> listener)1520 DMError DisplayManager::UnregisterScreenshotListener(sptr<IScreenshotListener> listener)
1521 {
1522     if (listener == nullptr) {
1523         TLOGE(WmsLogTag::DMS, "listener is nullptr.");
1524         return DMError::DM_ERROR_NULLPTR;
1525     }
1526     return pImpl_->UnregisterScreenshotListener(listener);
1527 }
1528 
NotifyFoldAngleChanged(std::vector<float> foldAngles)1529 void DisplayManager::Impl::NotifyFoldAngleChanged(std::vector<float> foldAngles)
1530 {
1531     std::set<sptr<IFoldAngleListener>> foldAngleListeners;
1532     {
1533         std::lock_guard<std::recursive_mutex> lock(mutex_);
1534         foldAngleListeners = foldAngleListeners_;
1535     }
1536     for (auto& listener : foldAngleListeners) {
1537         listener->OnFoldAngleChanged(foldAngles);
1538     }
1539 }
1540 
RegisterFoldAngleListener(sptr<IFoldAngleListener> listener)1541 DMError DisplayManager::RegisterFoldAngleListener(sptr<IFoldAngleListener> listener)
1542 {
1543     if (listener == nullptr) {
1544         TLOGE(WmsLogTag::DMS, "IFoldAngleListener listener is nullptr.");
1545         return DMError::DM_ERROR_NULLPTR;
1546     }
1547     return pImpl_->RegisterFoldAngleListener(listener);
1548 }
1549 
RegisterFoldAngleListener(sptr<IFoldAngleListener> listener)1550 DMError DisplayManager::Impl::RegisterFoldAngleListener(sptr<IFoldAngleListener> listener)
1551 {
1552     std::lock_guard<std::recursive_mutex> lock(mutex_);
1553     DMError ret = DMError::DM_OK;
1554     if (foldAngleListenerAgent_ == nullptr) {
1555         foldAngleListenerAgent_ = new DisplayManagerFoldAngleAgent(this);
1556         ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1557             foldAngleListenerAgent_,
1558             DisplayManagerAgentType::FOLD_ANGLE_CHANGED_LISTENER);
1559     }
1560     if (ret != DMError::DM_OK) {
1561         TLOGW(WmsLogTag::DMS, "failed !");
1562         foldAngleListenerAgent_ = nullptr;
1563     } else {
1564         TLOGD(WmsLogTag::DMS, "IFoldAngleListener register success");
1565         foldAngleListeners_.insert(listener);
1566     }
1567     return ret;
1568 }
1569 
UnregisterFoldAngleListener(sptr<IFoldAngleListener> listener)1570 DMError DisplayManager::UnregisterFoldAngleListener(sptr<IFoldAngleListener> listener)
1571 {
1572     if (listener == nullptr) {
1573         TLOGE(WmsLogTag::DMS, "listener is nullptr.");
1574         return DMError::DM_ERROR_NULLPTR;
1575     }
1576     return pImpl_->UnregisterFoldAngleListener(listener);
1577 }
1578 
UnregisterFoldAngleListener(sptr<IFoldAngleListener> listener)1579 DMError DisplayManager::Impl::UnregisterFoldAngleListener(sptr<IFoldAngleListener> listener)
1580 {
1581     std::lock_guard<std::recursive_mutex> lock(mutex_);
1582     auto iter = std::find(foldAngleListeners_.begin(), foldAngleListeners_.end(), listener);
1583     if (iter == foldAngleListeners_.end()) {
1584         TLOGE(WmsLogTag::DMS, "could not find this listener");
1585         return DMError::DM_ERROR_NULLPTR;
1586     }
1587     foldAngleListeners_.erase(iter);
1588     DMError ret = DMError::DM_OK;
1589     if (foldAngleListeners_.empty() && foldAngleListenerAgent_ != nullptr) {
1590         ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1591             foldAngleListenerAgent_,
1592             DisplayManagerAgentType::FOLD_ANGLE_CHANGED_LISTENER);
1593         foldAngleListenerAgent_ = nullptr;
1594     }
1595     return ret;
1596 }
1597 
NotifyCaptureStatusChanged(bool isCapture)1598 void DisplayManager::Impl::NotifyCaptureStatusChanged(bool isCapture)
1599 {
1600     std::set<sptr<ICaptureStatusListener>> captureStatusListeners;
1601     {
1602         std::lock_guard<std::recursive_mutex> lock(mutex_);
1603         captureStatusListeners = captureStatusListeners_;
1604     }
1605     for (auto& listener : captureStatusListeners) {
1606         listener->OnCaptureStatusChanged(isCapture);
1607     }
1608 }
1609 
RegisterCaptureStatusListener(sptr<ICaptureStatusListener> listener)1610 DMError DisplayManager::RegisterCaptureStatusListener(sptr<ICaptureStatusListener> listener)
1611 {
1612     if (listener == nullptr) {
1613         TLOGE(WmsLogTag::DMS, "ICaptureStatusListener listener is nullptr.");
1614         return DMError::DM_ERROR_NULLPTR;
1615     }
1616     return pImpl_->RegisterCaptureStatusListener(listener);
1617 }
1618 
RegisterCaptureStatusListener(sptr<ICaptureStatusListener> listener)1619 DMError DisplayManager::Impl::RegisterCaptureStatusListener(sptr<ICaptureStatusListener> listener)
1620 {
1621     std::lock_guard<std::recursive_mutex> lock(mutex_);
1622     DMError ret = DMError::DM_OK;
1623     if (captureStatusListenerAgent_ == nullptr) {
1624         captureStatusListenerAgent_ = new DisplayManagerCaptureStatusAgent(this);
1625         ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1626             captureStatusListenerAgent_,
1627             DisplayManagerAgentType::CAPTURE_STATUS_CHANGED_LISTENER);
1628     }
1629     if (ret != DMError::DM_OK) {
1630         TLOGE(WmsLogTag::DMS, "failed !");
1631         captureStatusListenerAgent_ = nullptr;
1632     } else {
1633         TLOGD(WmsLogTag::DMS, "ICaptureStatusListener register success");
1634         captureStatusListeners_.insert(listener);
1635     }
1636     return ret;
1637 }
1638 
UnregisterCaptureStatusListener(sptr<ICaptureStatusListener> listener)1639 DMError DisplayManager::UnregisterCaptureStatusListener(sptr<ICaptureStatusListener> listener)
1640 {
1641     if (listener == nullptr) {
1642         TLOGE(WmsLogTag::DMS, "UnregisterCaptureStatusListener listener is nullptr.");
1643         return DMError::DM_ERROR_NULLPTR;
1644     }
1645     return pImpl_->UnregisterCaptureStatusListener(listener);
1646 }
1647 
UnregisterCaptureStatusListener(sptr<ICaptureStatusListener> listener)1648 DMError DisplayManager::Impl::UnregisterCaptureStatusListener(sptr<ICaptureStatusListener> listener)
1649 {
1650     std::lock_guard<std::recursive_mutex> lock(mutex_);
1651     auto iter = std::find(captureStatusListeners_.begin(), captureStatusListeners_.end(), listener);
1652     if (iter == captureStatusListeners_.end()) {
1653         TLOGE(WmsLogTag::DMS, "could not find this listener");
1654         return DMError::DM_ERROR_NULLPTR;
1655     }
1656     captureStatusListeners_.erase(iter);
1657     DMError ret = DMError::DM_OK;
1658     if (captureStatusListeners_.empty() && captureStatusListenerAgent_ != nullptr) {
1659         ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1660             captureStatusListenerAgent_,
1661             DisplayManagerAgentType::CAPTURE_STATUS_CHANGED_LISTENER);
1662         captureStatusListenerAgent_ = nullptr;
1663     }
1664     return ret;
1665 }
1666 
NotifyFoldStatusChanged(FoldStatus foldStatus)1667 void DisplayManager::Impl::NotifyFoldStatusChanged(FoldStatus foldStatus)
1668 {
1669     std::set<sptr<IFoldStatusListener>> foldStatusListeners;
1670     {
1671         std::lock_guard<std::recursive_mutex> lock(mutex_);
1672         foldStatusListeners = foldStatusListeners_;
1673     }
1674     for (auto& listener : foldStatusListeners) {
1675         listener->OnFoldStatusChanged(foldStatus);
1676     }
1677 }
1678 
RegisterFoldStatusListener(sptr<IFoldStatusListener> listener)1679 DMError DisplayManager::RegisterFoldStatusListener(sptr<IFoldStatusListener> listener)
1680 {
1681     if (listener == nullptr) {
1682         TLOGE(WmsLogTag::DMS, "IFoldStatusListener listener is nullptr.");
1683         return DMError::DM_ERROR_NULLPTR;
1684     }
1685     return pImpl_->RegisterFoldStatusListener(listener);
1686 }
1687 
RegisterFoldStatusListener(sptr<IFoldStatusListener> listener)1688 DMError DisplayManager::Impl::RegisterFoldStatusListener(sptr<IFoldStatusListener> listener)
1689 {
1690     std::lock_guard<std::recursive_mutex> lock(mutex_);
1691     DMError ret = DMError::DM_OK;
1692     if (foldStatusListenerAgent_ == nullptr) {
1693         foldStatusListenerAgent_ = new DisplayManagerFoldStatusAgent(this);
1694         ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1695             foldStatusListenerAgent_,
1696             DisplayManagerAgentType::FOLD_STATUS_CHANGED_LISTENER);
1697     }
1698     if (ret != DMError::DM_OK) {
1699         TLOGW(WmsLogTag::DMS, "failed !");
1700         foldStatusListenerAgent_ = nullptr;
1701     } else {
1702         TLOGD(WmsLogTag::DMS, "IFoldStatusListener register success");
1703         foldStatusListeners_.insert(listener);
1704     }
1705     return ret;
1706 }
1707 
UnregisterFoldStatusListener(sptr<IFoldStatusListener> listener)1708 DMError DisplayManager::UnregisterFoldStatusListener(sptr<IFoldStatusListener> listener)
1709 {
1710     if (listener == nullptr) {
1711         TLOGE(WmsLogTag::DMS, "listener is nullptr.");
1712         return DMError::DM_ERROR_NULLPTR;
1713     }
1714     return pImpl_->UnregisterFoldStatusListener(listener);
1715 }
1716 
UnregisterFoldStatusListener(sptr<IFoldStatusListener> listener)1717 DMError DisplayManager::Impl::UnregisterFoldStatusListener(sptr<IFoldStatusListener> listener)
1718 {
1719     std::lock_guard<std::recursive_mutex> lock(mutex_);
1720     auto iter = std::find(foldStatusListeners_.begin(), foldStatusListeners_.end(), listener);
1721     if (iter == foldStatusListeners_.end()) {
1722         TLOGE(WmsLogTag::DMS, "could not find this listener");
1723         return DMError::DM_ERROR_NULLPTR;
1724     }
1725     foldStatusListeners_.erase(iter);
1726     DMError ret = DMError::DM_OK;
1727     if (foldStatusListeners_.empty() && foldStatusListenerAgent_ != nullptr) {
1728         ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1729             foldStatusListenerAgent_,
1730             DisplayManagerAgentType::FOLD_STATUS_CHANGED_LISTENER);
1731         foldStatusListenerAgent_ = nullptr;
1732     }
1733     return ret;
1734 }
1735 
NotifyDisplayChangeInfoChanged(const sptr<DisplayChangeInfo> & info)1736 void DisplayManager::Impl::NotifyDisplayChangeInfoChanged(const sptr<DisplayChangeInfo>& info)
1737 {
1738     std::set<sptr<IDisplayUpdateListener>> displayUpdateListeners;
1739     {
1740         std::lock_guard<std::recursive_mutex> lock(mutex_);
1741         displayUpdateListeners = displayUpdateListeners_;
1742     }
1743     for (auto& listener : displayUpdateListeners) {
1744         listener->OnDisplayUpdate(info);
1745     }
1746 }
1747 
RegisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener)1748 DMError DisplayManager::RegisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener)
1749 {
1750     if (listener == nullptr) {
1751         TLOGE(WmsLogTag::DMS, "IDisplayUpdateListener listener is nullptr.");
1752         return DMError::DM_ERROR_NULLPTR;
1753     }
1754     return pImpl_->RegisterDisplayUpdateListener(listener);
1755 }
1756 
RegisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener)1757 DMError DisplayManager::Impl::RegisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener)
1758 {
1759     std::lock_guard<std::recursive_mutex> lock(mutex_);
1760     DMError ret = DMError::DM_OK;
1761     if (displayUpdateListenerAgent_ == nullptr) {
1762         displayUpdateListenerAgent_ = new DisplayManagerDisplayUpdateAgent(this);
1763         ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1764             displayUpdateListenerAgent_,
1765             DisplayManagerAgentType::DISPLAY_UPDATE_LISTENER);
1766     }
1767     if (ret != DMError::DM_OK) {
1768         TLOGW(WmsLogTag::DMS, "RegisterDisplayUpdateListener failed !");
1769         displayUpdateListenerAgent_ = nullptr;
1770     } else {
1771         TLOGI(WmsLogTag::DMS, "IDisplayUpdateListener register success");
1772         displayUpdateListeners_.insert(listener);
1773     }
1774     return ret;
1775 }
1776 
UnregisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener)1777 DMError DisplayManager::UnregisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener)
1778 {
1779     if (listener == nullptr) {
1780         TLOGE(WmsLogTag::DMS, "UnregisterDisplayUpdateListener listener is nullptr.");
1781         return DMError::DM_ERROR_NULLPTR;
1782     }
1783     return pImpl_->UnregisterDisplayUpdateListener(listener);
1784 }
1785 
UnregisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener)1786 DMError DisplayManager::Impl::UnregisterDisplayUpdateListener(sptr<IDisplayUpdateListener> listener)
1787 {
1788     std::lock_guard<std::recursive_mutex> lock(mutex_);
1789     auto iter = std::find(displayUpdateListeners_.begin(), displayUpdateListeners_.end(), listener);
1790     if (iter == displayUpdateListeners_.end()) {
1791         TLOGE(WmsLogTag::DMS, "could not find this listener");
1792         return DMError::DM_ERROR_NULLPTR;
1793     }
1794     displayUpdateListeners_.erase(iter);
1795     DMError ret = DMError::DM_OK;
1796     if (displayUpdateListeners_.empty() && displayUpdateListenerAgent_ != nullptr) {
1797         ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1798             displayUpdateListenerAgent_,
1799             DisplayManagerAgentType::DISPLAY_UPDATE_LISTENER);
1800         displayUpdateListenerAgent_ = nullptr;
1801     }
1802     return ret;
1803 }
1804 
NotifyDisplayModeChanged(FoldDisplayMode displayMode)1805 void DisplayManager::Impl::NotifyDisplayModeChanged(FoldDisplayMode displayMode)
1806 {
1807     std::set<sptr<IDisplayModeListener>> displayModeListeners;
1808     {
1809         std::lock_guard<std::recursive_mutex> lock(mutex_);
1810         displayModeListeners = displayModeListeners_;
1811     }
1812     auto displayInfo = SingletonContainer::Get<DisplayManagerAdapter>().GetDefaultDisplayInfo();
1813     NotifyDisplayChange(displayInfo);
1814     for (auto& listener : displayModeListeners) {
1815         listener->OnDisplayModeChanged(displayMode);
1816     }
1817 }
1818 
NotifyScreenMagneticStateChanged(bool isMagneticState)1819 void DisplayManager::Impl::NotifyScreenMagneticStateChanged(bool isMagneticState)
1820 {
1821     std::set<sptr<IScreenMagneticStateListener>> screenMagneticStateListeners;
1822     {
1823         std::lock_guard<std::recursive_mutex> lock(mutex_);
1824         screenMagneticStateListeners = screenMagneticStateListeners_;
1825     }
1826     for (auto& listener : screenMagneticStateListeners) {
1827         listener->OnScreenMagneticStateChanged(isMagneticState);
1828     }
1829 }
1830 
NotifyAvailableAreaChanged(DMRect rect,DisplayId displayId)1831 void DisplayManager::Impl::NotifyAvailableAreaChanged(DMRect rect, DisplayId displayId)
1832 {
1833     std::set<sptr<IAvailableAreaListener>> availableAreaListeners;
1834     {
1835         std::lock_guard<std::recursive_mutex> lock(mutex_);
1836         availableAreaListeners = availableAreaListeners_;
1837     }
1838     for (auto& listener : availableAreaListeners) {
1839         listener->OnAvailableAreaChanged(rect);
1840     }
1841     std::map<DisplayId, std::set<sptr<IAvailableAreaListener>>> availableAreaListenersMap;
1842     {
1843         std::lock_guard<std::recursive_mutex> lock(mutex_);
1844         availableAreaListenersMap = availableAreaListenersMap_;
1845     }
1846     if (availableAreaListenersMap.find(displayId) != availableAreaListenersMap.end()) {
1847         for (auto& listener : availableAreaListenersMap[displayId]) {
1848             listener->OnAvailableAreaChanged(rect);
1849         }
1850     }
1851 }
1852 
RegisterDisplayModeListener(sptr<IDisplayModeListener> listener)1853 DMError DisplayManager::RegisterDisplayModeListener(sptr<IDisplayModeListener> listener)
1854 {
1855     if (listener == nullptr) {
1856         TLOGE(WmsLogTag::DMS, "IDisplayModeListener listener is nullptr.");
1857         return DMError::DM_ERROR_NULLPTR;
1858     }
1859     return pImpl_->RegisterDisplayModeListener(listener);
1860 }
1861 
RegisterDisplayModeListener(sptr<IDisplayModeListener> listener)1862 DMError DisplayManager::Impl::RegisterDisplayModeListener(sptr<IDisplayModeListener> listener)
1863 {
1864     std::lock_guard<std::recursive_mutex> lock(mutex_);
1865     DMError ret = DMError::DM_OK;
1866     if (displayModeListenerAgent_ == nullptr) {
1867         displayModeListenerAgent_ = new DisplayManagerDisplayModeAgent(this);
1868         ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1869             displayModeListenerAgent_,
1870             DisplayManagerAgentType::DISPLAY_MODE_CHANGED_LISTENER);
1871     }
1872     if (ret != DMError::DM_OK) {
1873         TLOGW(WmsLogTag::DMS, "RegisterDisplayModeListener failed !");
1874         displayModeListenerAgent_ = nullptr;
1875     } else {
1876         TLOGD(WmsLogTag::DMS, "IDisplayModeListener register success");
1877         displayModeListeners_.insert(listener);
1878     }
1879     return ret;
1880 }
1881 
UnregisterDisplayModeListener(sptr<IDisplayModeListener> listener)1882 DMError DisplayManager::UnregisterDisplayModeListener(sptr<IDisplayModeListener> listener)
1883 {
1884     if (listener == nullptr) {
1885         TLOGE(WmsLogTag::DMS, "UnregisterPrivateWindowListener listener is nullptr.");
1886         return DMError::DM_ERROR_NULLPTR;
1887     }
1888     return pImpl_->UnregisterDisplayModeListener(listener);
1889 }
1890 
UnregisterDisplayModeListener(sptr<IDisplayModeListener> listener)1891 DMError DisplayManager::Impl::UnregisterDisplayModeListener(sptr<IDisplayModeListener> listener)
1892 {
1893     std::lock_guard<std::recursive_mutex> lock(mutex_);
1894     auto iter = std::find(displayModeListeners_.begin(), displayModeListeners_.end(), listener);
1895     if (iter == displayModeListeners_.end()) {
1896         TLOGE(WmsLogTag::DMS, "could not find this listener");
1897         return DMError::DM_ERROR_NULLPTR;
1898     }
1899     displayModeListeners_.erase(iter);
1900     DMError ret = DMError::DM_OK;
1901     if (displayModeListeners_.empty() && displayModeListenerAgent_ != nullptr) {
1902         ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1903             displayModeListenerAgent_,
1904             DisplayManagerAgentType::DISPLAY_MODE_CHANGED_LISTENER);
1905         displayModeListenerAgent_ = nullptr;
1906     }
1907     return ret;
1908 }
1909 
RegisterScreenMagneticStateListener(sptr<IScreenMagneticStateListener> listener)1910 DMError DisplayManager::RegisterScreenMagneticStateListener(sptr<IScreenMagneticStateListener> listener)
1911 {
1912     if (listener == nullptr) {
1913         TLOGE(WmsLogTag::DMS, "IScreenMagneticStateListener listener is nullptr.");
1914         return DMError::DM_ERROR_NULLPTR;
1915     }
1916     return pImpl_->RegisterScreenMagneticStateListener(listener);
1917 }
1918 
RegisterScreenMagneticStateListener(sptr<IScreenMagneticStateListener> listener)1919 DMError DisplayManager::Impl::RegisterScreenMagneticStateListener(sptr<IScreenMagneticStateListener> listener)
1920 {
1921     std::lock_guard<std::recursive_mutex> lock(mutex_);
1922     DMError ret = DMError::DM_OK;
1923     if (screenMagneticStateListenerAgent_ == nullptr) {
1924         screenMagneticStateListenerAgent_ = new DisplayManagerScreenMagneticStateAgent(this);
1925         ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1926             screenMagneticStateListenerAgent_,
1927             DisplayManagerAgentType::SCREEN_MAGNETIC_STATE_CHANGED_LISTENER);
1928     }
1929     if (ret != DMError::DM_OK) {
1930         TLOGW(WmsLogTag::DMS, "RegisterScreenMagneticStateListener failed !");
1931         screenMagneticStateListenerAgent_ = nullptr;
1932     } else {
1933         TLOGD(WmsLogTag::DMS, "IScreenMagneticStateListener register success");
1934         screenMagneticStateListeners_.insert(listener);
1935     }
1936     return ret;
1937 }
1938 
UnregisterScreenMagneticStateListener(sptr<IScreenMagneticStateListener> listener)1939 DMError DisplayManager::UnregisterScreenMagneticStateListener(sptr<IScreenMagneticStateListener> listener)
1940 {
1941     if (listener == nullptr) {
1942         TLOGE(WmsLogTag::DMS, "listener is nullptr.");
1943         return DMError::DM_ERROR_NULLPTR;
1944     }
1945     return pImpl_->UnregisterScreenMagneticStateListener(listener);
1946 }
1947 
UnregisterScreenMagneticStateListener(sptr<IScreenMagneticStateListener> listener)1948 DMError DisplayManager::Impl::UnregisterScreenMagneticStateListener(sptr<IScreenMagneticStateListener> listener)
1949 {
1950     std::lock_guard<std::recursive_mutex> lock(mutex_);
1951     auto iter = std::find(screenMagneticStateListeners_.begin(), screenMagneticStateListeners_.end(), listener);
1952     if (iter == screenMagneticStateListeners_.end()) {
1953         TLOGE(WmsLogTag::DMS, "could not find this listener");
1954         return DMError::DM_ERROR_NULLPTR;
1955     }
1956     screenMagneticStateListeners_.erase(iter);
1957     DMError ret = DMError::DM_OK;
1958     if (screenMagneticStateListeners_.empty() && screenMagneticStateListenerAgent_ != nullptr) {
1959         ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
1960             screenMagneticStateListenerAgent_,
1961             DisplayManagerAgentType::SCREEN_MAGNETIC_STATE_CHANGED_LISTENER);
1962         screenMagneticStateListenerAgent_ = nullptr;
1963     }
1964     return ret;
1965 }
1966 
RegisterAvailableAreaListener(sptr<IAvailableAreaListener> listener)1967 DMError DisplayManager::RegisterAvailableAreaListener(sptr<IAvailableAreaListener> listener)
1968 {
1969     if (listener == nullptr) {
1970         TLOGE(WmsLogTag::DMS, "listener is nullptr.");
1971         return DMError::DM_ERROR_NULLPTR;
1972     }
1973     return pImpl_->RegisterAvailableAreaListener(listener);
1974 }
1975 
RegisterAvailableAreaListener(sptr<IAvailableAreaListener> listener)1976 DMError DisplayManager::Impl::RegisterAvailableAreaListener(sptr<IAvailableAreaListener> listener)
1977 {
1978     std::lock_guard<std::recursive_mutex> lock(mutex_);
1979     DMError ret = DMError::DM_OK;
1980     if (availableAreaListenerAgent_ == nullptr) {
1981         availableAreaListenerAgent_ = new DisplayManagerAvailableAreaAgent(this);
1982         ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
1983             availableAreaListenerAgent_,
1984             DisplayManagerAgentType::AVAILABLE_AREA_CHANGED_LISTENER);
1985     }
1986     if (ret != DMError::DM_OK) {
1987         TLOGW(WmsLogTag::DMS, "RegisterAvailableAreaListener failed !");
1988         availableAreaListenerAgent_ = nullptr;
1989     } else {
1990         TLOGD(WmsLogTag::DMS, "IAvailableAreaListener register success");
1991         availableAreaListeners_.insert(listener);
1992     }
1993     return ret;
1994 }
1995 
RegisterAvailableAreaListener(sptr<IAvailableAreaListener> listener,DisplayId displayId)1996 DMError DisplayManager::RegisterAvailableAreaListener(sptr<IAvailableAreaListener> listener, DisplayId displayId)
1997 {
1998     if (listener == nullptr) {
1999         TLOGE(WmsLogTag::DMS, "listener is nullptr.");
2000         return DMError::DM_ERROR_NULLPTR;
2001     }
2002     return pImpl_->RegisterAvailableAreaListener(listener, displayId);
2003 }
2004 
RegisterAvailableAreaListener(sptr<IAvailableAreaListener> listener,DisplayId displayId)2005 DMError DisplayManager::Impl::RegisterAvailableAreaListener(sptr<IAvailableAreaListener> listener, DisplayId displayId)
2006 {
2007     std::lock_guard<std::recursive_mutex> lock(mutex_);
2008     DMError ret = DMError::DM_OK;
2009     if (availableAreaListenerAgent_ == nullptr) {
2010         availableAreaListenerAgent_ = new DisplayManagerAvailableAreaAgent(this);
2011         ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
2012             availableAreaListenerAgent_,
2013             DisplayManagerAgentType::AVAILABLE_AREA_CHANGED_LISTENER);
2014     }
2015     if (ret != DMError::DM_OK) {
2016         TLOGW(WmsLogTag::DMS, "RegisterAvailableAreaListener failed !");
2017         availableAreaListenerAgent_ = nullptr;
2018     } else {
2019         TLOGD(WmsLogTag::DMS, "IAvailableAreaListener register success");
2020         availableAreaListenersMap_[displayId].insert(listener);
2021     }
2022     return ret;
2023 }
2024 
UnregisterAvailableAreaListener(sptr<IAvailableAreaListener> listener)2025 DMError DisplayManager::UnregisterAvailableAreaListener(sptr<IAvailableAreaListener> listener)
2026 {
2027     if (listener == nullptr) {
2028         TLOGE(WmsLogTag::DMS, "listener is nullptr.");
2029         return DMError::DM_ERROR_NULLPTR;
2030     }
2031     return pImpl_->UnregisterAvailableAreaListener(listener);
2032 }
2033 
UnregisterAvailableAreaListener(sptr<IAvailableAreaListener> listener)2034 DMError DisplayManager::Impl::UnregisterAvailableAreaListener(sptr<IAvailableAreaListener> listener)
2035 {
2036     std::lock_guard<std::recursive_mutex> lock(mutex_);
2037     auto iter = std::find(availableAreaListeners_.begin(), availableAreaListeners_.end(), listener);
2038     if (iter == availableAreaListeners_.end()) {
2039         TLOGE(WmsLogTag::DMS, "could not find this listener");
2040         return DMError::DM_ERROR_NULLPTR;
2041     }
2042     availableAreaListeners_.erase(iter);
2043     DMError ret = DMError::DM_OK;
2044     if (availableAreaListeners_.empty() && availableAreaListenersMap_.empty() &&
2045         availableAreaListenerAgent_ != nullptr) {
2046         ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
2047             availableAreaListenerAgent_,
2048             DisplayManagerAgentType::AVAILABLE_AREA_CHANGED_LISTENER);
2049         availableAreaListenerAgent_ = nullptr;
2050     }
2051     return ret;
2052 }
2053 
UnregisterAvailableAreaListener(sptr<IAvailableAreaListener> listener,DisplayId displayId)2054 DMError DisplayManager::UnregisterAvailableAreaListener(sptr<IAvailableAreaListener> listener, DisplayId displayId)
2055 {
2056     if (listener == nullptr) {
2057         TLOGE(WmsLogTag::DMS, "listener is nullptr.");
2058         return DMError::DM_ERROR_NULLPTR;
2059     }
2060     return pImpl_->UnregisterAvailableAreaListener(listener, displayId);
2061 }
2062 
UnregisterAvailableAreaListener(sptr<IAvailableAreaListener> listener,DisplayId displayId)2063 DMError DisplayManager::Impl::UnregisterAvailableAreaListener(sptr<IAvailableAreaListener> listener,
2064     DisplayId displayId)
2065 {
2066     std::lock_guard<std::recursive_mutex> lock(mutex_);
2067     if (availableAreaListenersMap_.find(displayId) == availableAreaListenersMap_.end()) {
2068         TLOGE(WmsLogTag::DMS, "could not find this listener");
2069         return DMError::DM_ERROR_NULLPTR;
2070     }
2071     auto iter = std::find(availableAreaListenersMap_[displayId].begin(), availableAreaListenersMap_[displayId].end(),
2072         listener);
2073     if (iter == availableAreaListenersMap_[displayId].end()) {
2074         TLOGE(WmsLogTag::DMS, "could not find this listener");
2075         return DMError::DM_ERROR_NULLPTR;
2076     }
2077     availableAreaListenersMap_[displayId].erase(iter);
2078     if (availableAreaListenersMap_[displayId].empty()) {
2079         availableAreaListenersMap_.erase(displayId);
2080     }
2081     DMError ret = DMError::DM_OK;
2082     if (availableAreaListeners_.empty() && availableAreaListenersMap_.empty() &&
2083         availableAreaListenerAgent_ != nullptr) {
2084         ret = SingletonContainer::Get<DisplayManagerAdapter>().UnregisterDisplayManagerAgent(
2085             availableAreaListenerAgent_,
2086             DisplayManagerAgentType::AVAILABLE_AREA_CHANGED_LISTENER);
2087         availableAreaListenerAgent_ = nullptr;
2088     }
2089     return ret;
2090 }
2091 
NotifyScreenshot(sptr<ScreenshotInfo> info)2092 void DisplayManager::Impl::NotifyScreenshot(sptr<ScreenshotInfo> info)
2093 {
2094     if (info == nullptr) {
2095         TLOGE(WmsLogTag::DMS, "info is null");
2096         return;
2097     }
2098     std::set<sptr<IScreenshotListener>> screenshotListeners;
2099     {
2100         std::lock_guard<std::recursive_mutex> lock(mutex_);
2101         screenshotListeners = screenshotListeners_;
2102     }
2103     TLOGI(WmsLogTag::DMS, "NotifyScreenshot trigger:[%{public}s] displayId:%{public}" PRIu64" size:%{public}zu",
2104         info->GetTrigger().c_str(), info->GetDisplayId(), screenshotListeners.size());
2105     for (auto& listener : screenshotListeners) {
2106         listener->OnScreenshot(*info);
2107     }
2108 }
2109 
NotifyDisplayPowerEvent(DisplayPowerEvent event,EventStatus status)2110 void DisplayManager::Impl::NotifyDisplayPowerEvent(DisplayPowerEvent event, EventStatus status)
2111 {
2112     std::set<sptr<IDisplayPowerEventListener>> powerEventListeners;
2113     {
2114         std::lock_guard<std::recursive_mutex> lock(mutex_);
2115         powerEventListeners = powerEventListeners_;
2116     }
2117     TLOGD(WmsLogTag::DMS, "[UL_POWER]NotifyDisplayPowerEvent event:%{public}u, status:%{public}u, size:%{public}zu",
2118         event, status, powerEventListeners.size());
2119     for (auto& listener : powerEventListeners) {
2120         listener->OnDisplayPowerEvent(event, status);
2121     }
2122 }
2123 
NotifyDisplayStateChanged(DisplayId id,DisplayState state)2124 void DisplayManager::Impl::NotifyDisplayStateChanged(DisplayId id, DisplayState state)
2125 {
2126     TLOGD(WmsLogTag::DMS, "state:%{public}u", state);
2127     DisplayStateCallback displayStateCallback = nullptr;
2128     {
2129         std::lock_guard<std::recursive_mutex> lock(mutex_);
2130         displayStateCallback = displayStateCallback_;
2131     }
2132     if (displayStateCallback) {
2133         displayStateCallback(state);
2134         ClearDisplayStateCallback();
2135         return;
2136     }
2137     TLOGW(WmsLogTag::DMS, "callback_ target is not set!");
2138 }
2139 
NotifyDisplayCreate(sptr<DisplayInfo> info)2140 void DisplayManager::Impl::NotifyDisplayCreate(sptr<DisplayInfo> info)
2141 {
2142     std::lock_guard<std::recursive_mutex> lock(mutex_);
2143     needUpdateDisplayFromDMS_ = true;
2144 }
2145 
NotifyDisplayDestroy(DisplayId displayId)2146 void DisplayManager::Impl::NotifyDisplayDestroy(DisplayId displayId)
2147 {
2148     TLOGD(WmsLogTag::DMS, "displayId:%{public}" PRIu64".", displayId);
2149     std::lock_guard<std::recursive_mutex> lock(mutex_);
2150     displayMap_.erase(displayId);
2151 }
2152 
NotifyDisplayChange(sptr<DisplayInfo> displayInfo)2153 void DisplayManager::Impl::NotifyDisplayChange(sptr<DisplayInfo> displayInfo)
2154 {
2155     std::lock_guard<std::recursive_mutex> lock(mutex_);
2156     needUpdateDisplayFromDMS_ = true;
2157 }
2158 
UpdateDisplayInfoLocked(sptr<DisplayInfo> displayInfo)2159 bool DisplayManager::Impl::UpdateDisplayInfoLocked(sptr<DisplayInfo> displayInfo)
2160 {
2161     if (displayInfo == nullptr) {
2162         TLOGW(WmsLogTag::DMS, "displayInfo is null");
2163         return false;
2164     }
2165     DisplayId displayId = displayInfo->GetDisplayId();
2166     TLOGD(WmsLogTag::DMS, "displayId:%{public}" PRIu64".", displayId);
2167     if (displayId == DISPLAY_ID_INVALID) {
2168         TLOGE(WmsLogTag::DMS, "displayId is invalid.");
2169         return false;
2170     }
2171     auto iter = displayMap_.find(displayId);
2172     if (iter != displayMap_.end() && iter->second != nullptr) {
2173         TLOGD(WmsLogTag::DMS, "display Info Updated: %{public}s",
2174             GetDisplayInfoSrting(displayInfo).c_str());
2175         iter->second->UpdateDisplayInfo(displayInfo);
2176         return true;
2177     }
2178     sptr<Display> display = new (std::nothrow) Display("", displayInfo);
2179     if (display == nullptr) {
2180         TLOGE(WmsLogTag::DMS, "malloc display failed");
2181         return false;
2182     }
2183     displayMap_[displayId] = display;
2184     return true;
2185 }
2186 
GetDisplayInfoSrting(sptr<DisplayInfo> displayInfo)2187 std::string DisplayManager::Impl::GetDisplayInfoSrting(sptr<DisplayInfo> displayInfo)
2188 {
2189     if (displayInfo == nullptr) {
2190         TLOGE(WmsLogTag::DMS, "displayInfo nullptr.");
2191         return "";
2192     }
2193     std::ostringstream oss;
2194     oss <<  "Display ID: " << displayInfo->GetDisplayId() << ", ";
2195     oss <<  "Name: " << displayInfo->GetName() << ", ";
2196     oss <<  "RefreshRate: " << displayInfo->GetRefreshRate() << ", ";
2197     oss <<  "VirtualPixelRatio: " << displayInfo->GetVirtualPixelRatio() << ", ";
2198     oss <<  "DensityInCurResolution: " << displayInfo->GetDensityInCurResolution() << ", ";
2199     oss <<  "DefaultVirtualPixelRatio: " << displayInfo->GetDefaultVirtualPixelRatio() << ", ";
2200     oss <<  "Rotation: " << static_cast<int32_t>(displayInfo->GetRotation());
2201     return oss.str();
2202 }
2203 
WakeUpBegin(PowerStateChangeReason reason)2204 bool DisplayManager::WakeUpBegin(PowerStateChangeReason reason)
2205 {
2206     TLOGD(WmsLogTag::DMS, "[UL_POWER]WakeUpBegin start, reason:%{public}u", reason);
2207     return SingletonContainer::Get<DisplayManagerAdapter>().WakeUpBegin(reason);
2208 }
2209 
WakeUpEnd()2210 bool DisplayManager::WakeUpEnd()
2211 {
2212     TLOGD(WmsLogTag::DMS, "[UL_POWER]WakeUpEnd start");
2213     return SingletonContainer::Get<DisplayManagerAdapter>().WakeUpEnd();
2214 }
2215 
SuspendBegin(PowerStateChangeReason reason)2216 bool DisplayManager::SuspendBegin(PowerStateChangeReason reason)
2217 {
2218     // dms->wms notify other windows to hide
2219     TLOGD(WmsLogTag::DMS, "[UL_POWER]SuspendBegin start, reason:%{public}u", reason);
2220     return SingletonContainer::Get<DisplayManagerAdapter>().SuspendBegin(reason);
2221 }
2222 
SuspendEnd()2223 bool DisplayManager::SuspendEnd()
2224 {
2225     TLOGD(WmsLogTag::DMS, "[UL_POWER]SuspendEnd start");
2226     return SingletonContainer::Get<DisplayManagerAdapter>().SuspendEnd();
2227 }
2228 
GetInternalScreenId()2229 ScreenId DisplayManager::GetInternalScreenId()
2230 {
2231     TLOGD(WmsLogTag::DMS, "[UL_POWER]GetInternalScreenId start");
2232     return SingletonContainer::Get<DisplayManagerAdapter>().GetInternalScreenId();
2233 }
2234 
SetScreenPowerById(ScreenId screenId,ScreenPowerState state,PowerStateChangeReason reason)2235 bool DisplayManager::SetScreenPowerById(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason)
2236 {
2237     TLOGD(WmsLogTag::DMS, "[UL_POWER]SetScreenPowerById start");
2238     return SingletonContainer::Get<DisplayManagerAdapter>().SetScreenPowerById(screenId, state, reason);
2239 }
2240 
SetDisplayState(DisplayState state,DisplayStateCallback callback)2241 bool DisplayManager::Impl::SetDisplayState(DisplayState state, DisplayStateCallback callback)
2242 {
2243     TLOGD(WmsLogTag::DMS, "[UL_POWER]state:%{public}u", state);
2244     bool ret = true;
2245     {
2246         std::lock_guard<std::recursive_mutex> lock(mutex_);
2247         if (displayStateCallback_ != nullptr || callback == nullptr) {
2248             if (displayStateCallback_ != nullptr) {
2249                 TLOGI(WmsLogTag::DMS, "[UL_POWER]previous callback not called, the displayStateCallback_ is not null");
2250             }
2251             if (callback == nullptr) {
2252                 TLOGI(WmsLogTag::DMS, "[UL_POWER]Invalid callback received");
2253             }
2254             return false;
2255         }
2256         displayStateCallback_ = callback;
2257 
2258         if (displayStateAgent_ == nullptr) {
2259             displayStateAgent_ = new DisplayManagerAgent(this);
2260             ret = SingletonContainer::Get<DisplayManagerAdapter>().RegisterDisplayManagerAgent(
2261                 displayStateAgent_,
2262                 DisplayManagerAgentType::DISPLAY_STATE_LISTENER) == DMError::DM_OK;
2263         }
2264     }
2265     ret = ret && SingletonContainer::Get<DisplayManagerAdapter>().SetDisplayState(state);
2266     if (!ret) {
2267         ClearDisplayStateCallback();
2268     }
2269     return ret;
2270 }
2271 
SetDisplayState(DisplayState state,DisplayStateCallback callback)2272 bool DisplayManager::SetDisplayState(DisplayState state, DisplayStateCallback callback)
2273 {
2274     return pImpl_->SetDisplayState(state, callback);
2275 }
2276 
GetDisplayState(DisplayId displayId)2277 DisplayState DisplayManager::GetDisplayState(DisplayId displayId)
2278 {
2279     return SingletonContainer::Get<DisplayManagerAdapter>().GetDisplayState(displayId);
2280 }
2281 
TryToCancelScreenOff()2282 bool DisplayManager::TryToCancelScreenOff()
2283 {
2284     TLOGD(WmsLogTag::DMS, "[UL_POWER]TryToCancelScreenOff start");
2285     return SingletonContainer::Get<DisplayManagerAdapter>().TryToCancelScreenOff();
2286 }
2287 
SetScreenBrightness(uint64_t screenId,uint32_t level)2288 bool DisplayManager::SetScreenBrightness(uint64_t screenId, uint32_t level)
2289 {
2290     TLOGI(WmsLogTag::DMS, "[UL_POWER]ScreenId:%{public}" PRIu64", level:%{public}u,", screenId, level);
2291     RSInterfaces::GetInstance().SetScreenBacklight(screenId, level);
2292     return true;
2293 }
2294 
GetScreenBrightness(uint64_t screenId) const2295 uint32_t DisplayManager::GetScreenBrightness(uint64_t screenId) const
2296 {
2297     uint32_t level = static_cast<uint32_t>(RSInterfaces::GetInstance().GetScreenBacklight(screenId));
2298     TLOGI(WmsLogTag::DMS, "screenId:%{public}" PRIu64", level:%{public}u,", screenId, level);
2299     return level;
2300 }
2301 
NotifyDisplayEvent(DisplayEvent event)2302 void DisplayManager::NotifyDisplayEvent(DisplayEvent event)
2303 {
2304     // Unlock event dms->wms restore other hidden windows
2305     TLOGD(WmsLogTag::DMS, "[UL_POWER]DisplayEvent:%{public}u", event);
2306     SingletonContainer::Get<DisplayManagerAdapter>().NotifyDisplayEvent(event);
2307 }
2308 
Freeze(std::vector<DisplayId> displayIds)2309 bool DisplayManager::Freeze(std::vector<DisplayId> displayIds)
2310 {
2311     TLOGD(WmsLogTag::DMS, "freeze display");
2312     if (displayIds.size() == 0) {
2313         TLOGE(WmsLogTag::DMS, "freeze fail, num of display is 0");
2314         return false;
2315     }
2316     if (displayIds.size() > MAX_DISPLAY_SIZE) {
2317         TLOGE(WmsLogTag::DMS, "freeze fail, displayIds size is bigger than %{public}u.", MAX_DISPLAY_SIZE);
2318         return false;
2319     }
2320     return SingletonContainer::Get<DisplayManagerAdapter>().SetFreeze(displayIds, true);
2321 }
2322 
Unfreeze(std::vector<DisplayId> displayIds)2323 bool DisplayManager::Unfreeze(std::vector<DisplayId> displayIds)
2324 {
2325     TLOGD(WmsLogTag::DMS, "unfreeze display");
2326     if (displayIds.size() == 0) {
2327         TLOGE(WmsLogTag::DMS, "unfreeze fail, num of display is 0");
2328         return false;
2329     }
2330     if (displayIds.size() > MAX_DISPLAY_SIZE) {
2331         TLOGE(WmsLogTag::DMS, "unfreeze fail, displayIds size is bigger than %{public}u.", MAX_DISPLAY_SIZE);
2332         return false;
2333     }
2334     return SingletonContainer::Get<DisplayManagerAdapter>().SetFreeze(displayIds, false);
2335 }
2336 
AddSurfaceNodeToDisplay(DisplayId displayId,std::shared_ptr<class RSSurfaceNode> & surfaceNode)2337 DMError DisplayManager::AddSurfaceNodeToDisplay(DisplayId displayId,
2338     std::shared_ptr<class RSSurfaceNode>& surfaceNode)
2339 {
2340     return SingletonContainer::Get<DisplayManagerAdapter>().AddSurfaceNodeToDisplay(displayId, surfaceNode);
2341 }
2342 
RemoveSurfaceNodeFromDisplay(DisplayId displayId,std::shared_ptr<class RSSurfaceNode> & surfaceNode)2343 DMError DisplayManager::RemoveSurfaceNodeFromDisplay(DisplayId displayId,
2344     std::shared_ptr<class RSSurfaceNode>& surfaceNode)
2345 {
2346     return SingletonContainer::Get<DisplayManagerAdapter>().RemoveSurfaceNodeFromDisplay(displayId, surfaceNode);
2347 }
2348 
OnRemoteDied()2349 void DisplayManager::Impl::OnRemoteDied()
2350 {
2351     TLOGI(WmsLogTag::DMS, "dms is died");
2352     if (g_dmIsDestroyed) {
2353         TLOGE(WmsLogTag::DMS, "dm has been destructed, mutex_ is invalid");
2354         return;
2355     }
2356     std::lock_guard<std::recursive_mutex> lock(mutex_);
2357     displayManagerListener_ = nullptr;
2358     displayStateAgent_ = nullptr;
2359     powerEventListenerAgent_ = nullptr;
2360     screenshotListenerAgent_ = nullptr;
2361     privateWindowListenerAgent_ = nullptr;
2362     privateWindowListChangeListenerAgent_ = nullptr;
2363     foldStatusListenerAgent_ = nullptr;
2364     foldAngleListenerAgent_ = nullptr;
2365     captureStatusListenerAgent_ = nullptr;
2366 }
2367 
OnRemoteDied()2368 void DisplayManager::OnRemoteDied()
2369 {
2370     if (g_dmIsDestroyed) {
2371         TLOGE(WmsLogTag::DMS, "dms is dying, pImpl_ is nullptr");
2372         return;
2373     }
2374     pImpl_->OnRemoteDied();
2375 }
2376 
ConvertScreenIdToRsScreenId(ScreenId screenId,ScreenId & rsScreenId)2377 bool DisplayManager::ConvertScreenIdToRsScreenId(ScreenId screenId, ScreenId& rsScreenId)
2378 {
2379     return pImpl_->ConvertScreenIdToRsScreenId(screenId, rsScreenId);
2380 }
2381 
ConvertScreenIdToRsScreenId(ScreenId screenId,ScreenId & rsScreenId)2382 bool DisplayManager::Impl::ConvertScreenIdToRsScreenId(ScreenId screenId, ScreenId& rsScreenId)
2383 {
2384     bool res = SingletonContainer::Get<DisplayManagerAdapter>().ConvertScreenIdToRsScreenId(screenId, rsScreenId);
2385     TLOGD(WmsLogTag::DMS, "Convert ScreenId %{public}" PRIu64" To RsScreenId %{public}" PRIu64"", screenId, rsScreenId);
2386     return res;
2387 }
2388 
SetVirtualDisplayMuteFlag(ScreenId screenId,bool muteFlag)2389 void DisplayManager::SetVirtualDisplayMuteFlag(ScreenId screenId, bool muteFlag)
2390 {
2391     return pImpl_->SetVirtualDisplayMuteFlag(screenId, muteFlag);
2392 }
2393 
SetVirtualDisplayMuteFlag(ScreenId screenId,bool muteFlag)2394 void DisplayManager::Impl::SetVirtualDisplayMuteFlag(ScreenId screenId, bool muteFlag)
2395 {
2396     return SingletonContainer::Get<DisplayManagerAdapter>().SetVirtualDisplayMuteFlag(screenId, muteFlag);
2397 }
2398 
ProxyForFreeze(std::set<int32_t> pidList,bool isProxy)2399 DMError DisplayManager::ProxyForFreeze(std::set<int32_t> pidList, bool isProxy)
2400 {
2401     std::ostringstream oss;
2402     for (auto pid : pidList) {
2403         oss << pid << " ";
2404     }
2405     TLOGI(WmsLogTag::DMS, "pidList:%{public}s, isProxy: %{public}d", oss.str().c_str(), isProxy);
2406     return pImpl_->ProxyForFreeze(pidList, isProxy);
2407 }
2408 
ProxyForFreeze(const std::set<int32_t> & pidList,bool isProxy)2409 DMError DisplayManager::Impl::ProxyForFreeze(const std::set<int32_t>& pidList, bool isProxy)
2410 {
2411     return SingletonContainer::Get<DisplayManagerAdapter>().ProxyForFreeze(pidList, isProxy);
2412 }
2413 
ResetAllFreezeStatus()2414 DMError DisplayManager::ResetAllFreezeStatus()
2415 {
2416     return pImpl_->ResetAllFreezeStatus();
2417 }
2418 
ResetAllFreezeStatus()2419 DMError DisplayManager::Impl::ResetAllFreezeStatus()
2420 {
2421     return SingletonContainer::Get<DisplayManagerAdapter>().ResetAllFreezeStatus();
2422 }
2423 
SetVirtualScreenBlackList(ScreenId screenId,std::vector<uint64_t> & windowIdList,std::vector<uint64_t> surfaceIdList,std::vector<uint8_t> typeBlackList)2424 void DisplayManager::SetVirtualScreenBlackList(ScreenId screenId, std::vector<uint64_t>& windowIdList,
2425     std::vector<uint64_t> surfaceIdList, std::vector<uint8_t> typeBlackList)
2426 {
2427     SingletonContainer::Get<DisplayManagerAdapter>().SetVirtualScreenBlackList(screenId, windowIdList, surfaceIdList,
2428         typeBlackList);
2429 }
2430 
DisablePowerOffRenderControl(ScreenId screenId)2431 void DisplayManager::DisablePowerOffRenderControl(ScreenId screenId)
2432 {
2433     SingletonContainer::Get<DisplayManagerAdapter>().DisablePowerOffRenderControl(screenId);
2434 }
2435 
SetVirtualScreenSecurityExemption(ScreenId screenId,uint32_t pid,std::vector<uint64_t> & windowIdList)2436 DMError DisplayManager::SetVirtualScreenSecurityExemption(ScreenId screenId, uint32_t pid,
2437     std::vector<uint64_t>& windowIdList)
2438 {
2439     return pImpl_->SetVirtualScreenSecurityExemption(screenId, pid, windowIdList);
2440 }
2441 
SetVirtualScreenSecurityExemption(ScreenId screenId,uint32_t pid,std::vector<uint64_t> & windowIdList)2442 DMError DisplayManager::Impl::SetVirtualScreenSecurityExemption(ScreenId screenId, uint32_t pid,
2443     std::vector<uint64_t>& windowIdList)
2444 {
2445     return SingletonContainer::Get<DisplayManagerAdapter>().SetVirtualScreenSecurityExemption(
2446         screenId, pid, windowIdList);
2447 }
2448 
GetPrimaryDisplaySync()2449 sptr<Display> DisplayManager::Impl::GetPrimaryDisplaySync()
2450 {
2451     static std::chrono::steady_clock::time_point lastRequestTime = std::chrono::steady_clock::now();
2452     auto currentTime = std::chrono::steady_clock::now();
2453     auto interval = std::chrono::duration_cast<std::chrono::microseconds>(currentTime - lastRequestTime).count();
2454     if (primaryDisplayId_ != DISPLAY_ID_INVALID && interval < APP_GET_DISPLAY_INTERVAL_US) {
2455         std::lock_guard<std::recursive_mutex> lock(mutex_);
2456         auto iter = displayMap_.find(primaryDisplayId_);
2457         if (iter != displayMap_.end()) {
2458             return displayMap_[primaryDisplayId_];
2459         }
2460     }
2461 
2462     uint32_t retryTimes = 0;
2463     sptr<DisplayInfo> displayInfo = nullptr;
2464     while (retryTimes < MAX_RETRY_NUM) {
2465         displayInfo = SingletonContainer::Get<DisplayManagerAdapter>().GetPrimaryDisplayInfo();
2466         if (displayInfo != nullptr) {
2467             break;
2468         }
2469         retryTimes++;
2470         TLOGW(WmsLogTag::DMS, "get display info null, retry %{public}u times", retryTimes);
2471         std::this_thread::sleep_for(std::chrono::milliseconds(RETRY_WAIT_MS));
2472     }
2473     if (retryTimes >= MAX_RETRY_NUM || displayInfo == nullptr) {
2474         TLOGE(WmsLogTag::DMS, "get display info failed");
2475         return nullptr;
2476     }
2477 
2478     auto displayId = displayInfo->GetDisplayId();
2479     std::lock_guard<std::recursive_mutex> lock(mutex_);
2480     if (!UpdateDisplayInfoLocked(displayInfo)) {
2481         displayMap_.erase(displayId);
2482         return nullptr;
2483     }
2484     lastRequestTime = currentTime;
2485     primaryDisplayId_ = displayId;
2486     return displayMap_[displayId];
2487 }
2488 
GetPrimaryDisplaySync()2489 sptr<Display> DisplayManager::GetPrimaryDisplaySync()
2490 {
2491     return pImpl_->GetPrimaryDisplaySync();
2492 }
2493 
GetScreenCapture(const CaptureOption & captureOption,DmErrorCode * errorCode)2494 std::shared_ptr<Media::PixelMap> DisplayManager::GetScreenCapture(const CaptureOption& captureOption,
2495     DmErrorCode* errorCode)
2496 {
2497     std::shared_ptr<Media::PixelMap> screenCapture =
2498         SingletonContainer::Get<DisplayManagerAdapter>().GetScreenCapture(captureOption, errorCode);
2499     if (screenCapture == nullptr) {
2500         TLOGE(WmsLogTag::DMS, "screen capture failed!");
2501         return nullptr;
2502     }
2503     return screenCapture;
2504 }
2505 
GetScreenshotWithOption(const CaptureOption & captureOption,DmErrorCode * errorCode)2506 std::shared_ptr<Media::PixelMap> DisplayManager::GetScreenshotWithOption(const CaptureOption& captureOption,
2507     DmErrorCode* errorCode)
2508 {
2509     if (captureOption.displayId_ == DISPLAY_ID_INVALID) {
2510         TLOGE(WmsLogTag::DMS, "displayId invalid!");
2511         return nullptr;
2512     }
2513     std::shared_ptr<Media::PixelMap> screenShot =
2514         SingletonContainer::Get<DisplayManagerAdapter>().GetDisplaySnapshotWithOption(captureOption, errorCode);
2515     if (screenShot == nullptr) {
2516         TLOGE(WmsLogTag::DMS, "get snapshot with option failed!");
2517         return nullptr;
2518     }
2519     return screenShot;
2520 }
2521 
GetScreenshotWithOption(const CaptureOption & captureOption,const Media::Rect & rect,const Media::Size & size,int rotation,DmErrorCode * errorCode)2522 std::shared_ptr<Media::PixelMap> DisplayManager::GetScreenshotWithOption(const CaptureOption& captureOption,
2523     const Media::Rect &rect, const Media::Size &size, int rotation, DmErrorCode* errorCode)
2524 {
2525     std::shared_ptr<Media::PixelMap> screenShot = GetScreenshotWithOption(captureOption, errorCode);
2526     if (screenShot == nullptr) {
2527         TLOGE(WmsLogTag::DMS, "set snapshot with option failed!");
2528         return nullptr;
2529     }
2530     // check parameters
2531     int32_t oriHeight = screenShot->GetHeight();
2532     int32_t oriWidth = screenShot->GetWidth();
2533     if (!pImpl_->CheckRectValid(rect, oriHeight, oriWidth)) {
2534         TLOGE(WmsLogTag::DMS, "rect invalid! left %{public}d, top %{public}d, w %{public}d, h %{public}d",
2535             rect.left, rect.top, rect.width, rect.height);
2536         return nullptr;
2537     }
2538     if (!pImpl_->CheckSizeValid(size, oriHeight, oriWidth)) {
2539         TLOGE(WmsLogTag::DMS, "size invalid! w %{public}d, h %{public}d", rect.width, rect.height);
2540         return nullptr;
2541     }
2542     // create crop dest pixelmap
2543     Media::InitializationOptions opt;
2544     opt.size.width = size.width;
2545     opt.size.height = size.height;
2546     opt.scaleMode = Media::ScaleMode::FIT_TARGET_SIZE;
2547     opt.editable = false;
2548     auto pixelMap = Media::PixelMap::Create(*screenShot, rect, opt);
2549     if (pixelMap == nullptr) {
2550         TLOGE(WmsLogTag::DMS, "Media::PixelMap::Create failed!");
2551         return nullptr;
2552     }
2553     std::shared_ptr<Media::PixelMap> dstScreenshot(pixelMap.release());
2554     return dstScreenshot;
2555 }
2556 
GetScreenHDRshotWithOption(const CaptureOption & captureOption,DmErrorCode & errorCode)2557 std::vector<std::shared_ptr<Media::PixelMap>> DisplayManager::GetScreenHDRshotWithOption(
2558     const CaptureOption& captureOption, DmErrorCode& errorCode)
2559 {
2560     TLOGI(WmsLogTag::DMS, "start!");
2561     if (captureOption.displayId_ == DISPLAY_ID_INVALID) {
2562         TLOGE(WmsLogTag::DMS, "displayId invalid!");
2563         return { nullptr, nullptr };
2564     }
2565     const std::vector<std::shared_ptr<Media::PixelMap>>& screenShotVec =
2566         SingletonContainer::Get<DisplayManagerAdapter>().GetDisplayHDRSnapshotWithOption(captureOption, errorCode);
2567     if (screenShotVec.size() != PIXMAP_VECTOR_SIZE) {
2568         TLOGE(WmsLogTag::DMS, "get snapshot with option failed!");
2569         return { nullptr, nullptr };
2570     }
2571     return screenShotVec;
2572 }
2573 
GetPrimaryDisplaySystemDpi() const2574 float DisplayManager::GetPrimaryDisplaySystemDpi() const
2575 {
2576     sptr<DisplayInfo> displayInfo = SingletonContainer::Get<DisplayManagerAdapter>().GetPrimaryDisplayInfo();
2577     if (displayInfo == nullptr) {
2578         return INVALID_DEFAULT_DENSITY;
2579     }
2580     return displayInfo->GetDensityInCurResolution();
2581 }
2582 
GetCutoutInfoWithRotation(Rotation rotation)2583 sptr<CutoutInfo> DisplayManager::GetCutoutInfoWithRotation(Rotation rotation)
2584 {
2585     return pImpl_->GetCutoutInfoWithRotation(rotation);
2586 }
2587 
GetCutoutInfoWithRotation(Rotation rotation)2588 sptr<CutoutInfo> DisplayManager::Impl::GetCutoutInfoWithRotation(Rotation rotation)
2589 {
2590     auto displayInfo = SingletonContainer::Get<DisplayManagerAdapter>().GetDefaultDisplayInfo();
2591     if (displayInfo == nullptr) {
2592         return nullptr;
2593     }
2594     return SingletonContainer::Get<DisplayManagerAdapter>().GetCutoutInfo(displayInfo->GetDisplayId(),
2595         displayInfo->GetWidth(), displayInfo->GetHeight(), rotation);
2596 }
2597 
GetScreenAreaOfDisplayArea(DisplayId displayId,const DMRect & displayArea,ScreenId & screenId,DMRect & screenArea)2598 DMError DisplayManager::GetScreenAreaOfDisplayArea(DisplayId displayId, const DMRect& displayArea,
2599     ScreenId& screenId, DMRect& screenArea)
2600 {
2601     return pImpl_->GetScreenAreaOfDisplayArea(displayId, displayArea, screenId, screenArea);
2602 }
2603 
GetScreenAreaOfDisplayArea(DisplayId displayId,const DMRect & displayArea,ScreenId & screenId,DMRect & screenArea)2604 DMError DisplayManager::Impl::GetScreenAreaOfDisplayArea(DisplayId displayId, const DMRect& displayArea,
2605     ScreenId& screenId, DMRect& screenArea)
2606 {
2607     return SingletonContainer::Get<DisplayManagerAdapter>().GetScreenAreaOfDisplayArea(
2608         displayId, displayArea, screenId, screenArea);
2609 }
2610 
ConvertRelativeCoordinateToGlobal(const RelativePosition & relativePosition,Position & position)2611 DMError DisplayManager::ConvertRelativeCoordinateToGlobal(const RelativePosition& relativePosition, Position& position)
2612 {
2613     return pImpl_->ConvertRelativeCoordinateToGlobal(relativePosition, position);
2614 }
2615 
ConvertRelativeCoordinateToGlobal(const RelativePosition & relativePosition,Position & position)2616 DMError DisplayManager::Impl::ConvertRelativeCoordinateToGlobal(const RelativePosition& relativePosition,
2617     Position& position)
2618 {
2619     sptr<Display> display = GetDisplayById(relativePosition.displayId);
2620     if (display == nullptr) {
2621         TLOGE(WmsLogTag::DMS, "Get display by ID failed, display:%{public}" PRIu64 "nullptr",
2622             relativePosition.displayId);
2623         return DMError::DM_ERROR_ILLEGAL_PARAM;
2624     }
2625     sptr<DisplayInfo> displayInfo = display->GetDisplayInfo();
2626     if (displayInfo == nullptr) {
2627         TLOGE(WmsLogTag::DMS, "get display info failed, display id: %{public}" PRIu64,
2628             relativePosition.displayId);
2629         return DMError::DM_ERROR_NULLPTR;
2630     }
2631 
2632     int32_t startX = displayInfo->GetX();
2633     int32_t startY = displayInfo->GetY();
2634     if (IsInt32AddOverflow(relativePosition.position.x, startX) ||
2635         IsInt32AddOverflow(relativePosition.position.y, startY)) {
2636         TLOGE(WmsLogTag::DMS, "coordinate x or y overflowed!");
2637         return DMError::DM_ERROR_ILLEGAL_PARAM;
2638     }
2639     position.x = relativePosition.position.x + startX;
2640     position.y = relativePosition.position.y + startY;
2641     return DMError::DM_OK;
2642 }
2643 
ConvertGlobalCoordinateToRelative(const Position & globalPosition,RelativePosition & relativePosition)2644 DMError DisplayManager::ConvertGlobalCoordinateToRelative(const Position& globalPosition,
2645     RelativePosition& relativePosition)
2646 {
2647     return pImpl_->ConvertGlobalCoordinateToRelative(globalPosition, relativePosition);
2648 }
2649 
ConvertGlobalCoordinateToRelative(const Position & globalPosition,RelativePosition & relativePosition)2650 DMError DisplayManager::Impl::ConvertGlobalCoordinateToRelative(const Position& globalPosition,
2651     RelativePosition& relativePosition)
2652 {
2653     auto displayIds = SingletonContainer::Get<DisplayManagerAdapter>().GetAllDisplayIds();
2654     for (auto displayId : displayIds) {
2655         const sptr<Display> display = GetDisplayById(displayId);
2656         if (display == nullptr) {
2657             TLOGW(WmsLogTag::DMS, "get display failed, display id : %{public}" PRIu64, displayId);
2658             continue;
2659         }
2660         const sptr<DisplayInfo> displayInfo = display->GetDisplayInfo();
2661         if (displayInfo == nullptr) {
2662             TLOGW(WmsLogTag::DMS, "get display info failed, display id : %{public}" PRIu64, displayId);
2663             continue;
2664         }
2665         if (IsTargetDisplay(displayInfo, globalPosition)) {
2666             int32_t startX = displayInfo->GetX();
2667             int32_t startY = displayInfo->GetY();
2668             if (IsInt32SubOverflow(globalPosition.x, startX) ||
2669                 IsInt32SubOverflow(globalPosition.y, startY)) {
2670                 TLOGE(WmsLogTag::DMS, "coordinate x or y overflowed!");
2671                 return DMError::DM_ERROR_ILLEGAL_PARAM;
2672             }
2673             relativePosition.displayId = displayInfo->GetDisplayId();
2674             relativePosition.position.x = globalPosition.x - startX;
2675             relativePosition.position.y = globalPosition.y - startY;
2676             return DMError::DM_OK;
2677         }
2678     }
2679     relativePosition.displayId = 0;
2680     relativePosition.position.x = globalPosition.x;
2681     relativePosition.position.y = globalPosition.y;
2682     return DMError::DM_OK;
2683 }
2684 
ConvertGlobalCoordinateToRelativeWithDisplayId(const Position & globalPosition,DisplayId displayId,RelativePosition & relativePosition)2685 DMError DisplayManager::ConvertGlobalCoordinateToRelativeWithDisplayId(const Position& globalPosition,
2686     DisplayId displayId, RelativePosition& relativePosition)
2687 {
2688     return pImpl_->ConvertGlobalCoordinateToRelativeWithDisplayId(globalPosition, displayId, relativePosition);
2689 }
2690 
ConvertGlobalCoordinateToRelativeWithDisplayId(const Position & globalPosition,DisplayId displayId,RelativePosition & relativePosition)2691 DMError DisplayManager::Impl::ConvertGlobalCoordinateToRelativeWithDisplayId(const Position& globalPosition,
2692     DisplayId displayId, RelativePosition& relativePosition)
2693 {
2694     const sptr<Display> display = GetDisplayById(displayId);
2695     if (display == nullptr) {
2696         TLOGW(WmsLogTag::DMS, "get display failed, display id : %{public}" PRIu64, displayId);
2697         relativePosition.displayId = 0;
2698         relativePosition.position.x = globalPosition.x;
2699         relativePosition.position.y = globalPosition.y;
2700         return DMError::DM_OK;
2701     }
2702 
2703     const sptr<DisplayInfo> displayInfo = display->GetDisplayInfo();
2704     if (displayInfo == nullptr) {
2705         TLOGW(WmsLogTag::DMS, "get display info failed, display id : %{public}" PRIu64, displayId);
2706         return DMError::DM_ERROR_NULLPTR;
2707     }
2708     int32_t startX = displayInfo->GetX();
2709     int32_t startY = displayInfo->GetY();
2710     if (IsInt32SubOverflow(globalPosition.x, startX) ||
2711         IsInt32SubOverflow(globalPosition.y, startY)) {
2712         TLOGE(WmsLogTag::DMS, "coordinate x or y overflowed!");
2713         return DMError::DM_ERROR_ILLEGAL_PARAM;
2714     }
2715     relativePosition.displayId = displayId;
2716     relativePosition.position.x = globalPosition.x - displayInfo->GetX();
2717     relativePosition.position.y = globalPosition.y - displayInfo->GetY();
2718     return DMError::DM_OK;
2719 }
2720 } // namespace OHOS::Rosen
2721 
2722