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