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_adapter.h"
17 
18 #include <iremote_broker.h>
19 #include <iservice_registry.h>
20 #include <system_ability_definition.h>
21 
22 #include "display_manager.h"
23 #include "dm_common.h"
24 #include "scene_board_judgement.h"
25 #include "screen_manager.h"
26 #include "window_manager_hilog.h"
27 #include "zidl/screen_session_manager_interface.h"
28 
29 namespace OHOS::Rosen {
30 namespace {
31 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "DisplayManagerAdapter"};
32 }
33 WM_IMPLEMENT_SINGLE_INSTANCE(DisplayManagerAdapter)
34 WM_IMPLEMENT_SINGLE_INSTANCE(ScreenManagerAdapter)
35 
36 #define INIT_PROXY_CHECK_RETURN(ret) \
37     do { \
38         if (!InitDMSProxy()) { \
39             WLOGFE("InitDMSProxy failed!"); \
40             return ret; \
41         } \
42     } while (false)
43 
GetDefaultDisplayInfo()44 sptr<DisplayInfo> DisplayManagerAdapter::GetDefaultDisplayInfo()
45 {
46     INIT_PROXY_CHECK_RETURN(nullptr);
47 
48     return displayManagerServiceProxy_->GetDefaultDisplayInfo();
49 }
50 
GetDisplayInfoByScreenId(ScreenId screenId)51 sptr<DisplayInfo> DisplayManagerAdapter::GetDisplayInfoByScreenId(ScreenId screenId)
52 {
53     INIT_PROXY_CHECK_RETURN(nullptr);
54 
55     return  displayManagerServiceProxy_->GetDisplayInfoByScreen(screenId);
56 }
57 
GetDisplaySnapshot(DisplayId displayId, DmErrorCode* errorCode)58 std::shared_ptr<Media::PixelMap> DisplayManagerAdapter::GetDisplaySnapshot(DisplayId displayId, DmErrorCode* errorCode)
59 {
60     INIT_PROXY_CHECK_RETURN(nullptr);
61 
62     return displayManagerServiceProxy_->GetDisplaySnapshot(displayId, errorCode);
63 }
64 
GetSnapshotByPicker(Media::Rect &rect, DmErrorCode* errorCode)65 std::shared_ptr<Media::PixelMap> DisplayManagerAdapter::GetSnapshotByPicker(Media::Rect &rect, DmErrorCode* errorCode)
66 {
67     INIT_PROXY_CHECK_RETURN(nullptr);
68 
69     return displayManagerServiceProxy_->GetSnapshotByPicker(rect, errorCode);
70 }
71 
GetScreenSupportedColorGamuts(ScreenId screenId, std::vector<ScreenColorGamut>& colorGamuts)72 DMError ScreenManagerAdapter::GetScreenSupportedColorGamuts(ScreenId screenId,
73     std::vector<ScreenColorGamut>& colorGamuts)
74 {
75     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
76 
77     return displayManagerServiceProxy_->GetScreenSupportedColorGamuts(screenId, colorGamuts);
78 }
79 
GetScreenColorGamut(ScreenId screenId, ScreenColorGamut& colorGamut)80 DMError ScreenManagerAdapter::GetScreenColorGamut(ScreenId screenId, ScreenColorGamut& colorGamut)
81 {
82     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
83 
84     return displayManagerServiceProxy_->GetScreenColorGamut(screenId, colorGamut);
85 }
86 
SetScreenColorGamut(ScreenId screenId, int32_t colorGamutIdx)87 DMError ScreenManagerAdapter::SetScreenColorGamut(ScreenId screenId, int32_t colorGamutIdx)
88 {
89     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
90 
91     return displayManagerServiceProxy_->SetScreenColorGamut(screenId, colorGamutIdx);
92 }
93 
GetScreenGamutMap(ScreenId screenId, ScreenGamutMap& gamutMap)94 DMError ScreenManagerAdapter::GetScreenGamutMap(ScreenId screenId, ScreenGamutMap& gamutMap)
95 {
96     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
97 
98     return displayManagerServiceProxy_->GetScreenGamutMap(screenId, gamutMap);
99 }
100 
SetScreenGamutMap(ScreenId screenId, ScreenGamutMap gamutMap)101 DMError ScreenManagerAdapter::SetScreenGamutMap(ScreenId screenId, ScreenGamutMap gamutMap)
102 {
103     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
104 
105     return displayManagerServiceProxy_->SetScreenGamutMap(screenId, gamutMap);
106 }
107 
SetScreenColorTransform(ScreenId screenId)108 DMError ScreenManagerAdapter::SetScreenColorTransform(ScreenId screenId)
109 {
110     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
111 
112     return displayManagerServiceProxy_->SetScreenColorTransform(screenId);
113 }
114 
GetPixelFormat(ScreenId screenId, GraphicPixelFormat& pixelFormat)115 DMError ScreenManagerAdapter::GetPixelFormat(ScreenId screenId, GraphicPixelFormat& pixelFormat)
116 {
117     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
118 
119     WLOGFI("ScreenManagerAdapter::GetPixelFormat");
120     return displayManagerServiceProxy_->GetPixelFormat(screenId, pixelFormat);
121 }
122 
SetPixelFormat(ScreenId screenId, GraphicPixelFormat pixelFormat)123 DMError ScreenManagerAdapter::SetPixelFormat(ScreenId screenId, GraphicPixelFormat pixelFormat)
124 {
125     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
126 
127     WLOGFI("ScreenManagerAdapter::SetPixelFormat");
128     return displayManagerServiceProxy_->SetPixelFormat(screenId, pixelFormat);
129 }
130 
GetSupportedHDRFormats(ScreenId screenId, std::vector<ScreenHDRFormat>& hdrFormats)131 DMError ScreenManagerAdapter::GetSupportedHDRFormats(ScreenId screenId,
132     std::vector<ScreenHDRFormat>& hdrFormats)
133 {
134     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
135 
136     WLOGFI("ScreenManagerAdapter::GetSupportedHDRFormats");
137     return displayManagerServiceProxy_->GetSupportedHDRFormats(screenId, hdrFormats);
138 }
139 
GetScreenHDRFormat(ScreenId screenId, ScreenHDRFormat& hdrFormat)140 DMError ScreenManagerAdapter::GetScreenHDRFormat(ScreenId screenId, ScreenHDRFormat& hdrFormat)
141 {
142     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
143 
144     WLOGFI("ScreenManagerAdapter::GetScreenHDRFormat");
145     return displayManagerServiceProxy_->GetScreenHDRFormat(screenId, hdrFormat);
146 }
147 
SetScreenHDRFormat(ScreenId screenId, int32_t modeIdx)148 DMError ScreenManagerAdapter::SetScreenHDRFormat(ScreenId screenId, int32_t modeIdx)
149 {
150     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
151 
152     WLOGFI("ScreenManagerAdapter::SetScreenHDRFormat");
153     return displayManagerServiceProxy_->SetScreenHDRFormat(screenId, modeIdx);
154 }
155 
GetSupportedColorSpaces(ScreenId screenId, std::vector<GraphicCM_ColorSpaceType>& colorSpaces)156 DMError ScreenManagerAdapter::GetSupportedColorSpaces(ScreenId screenId,
157     std::vector<GraphicCM_ColorSpaceType>& colorSpaces)
158 {
159     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
160 
161     WLOGFI("ScreenManagerAdapter::GetSupportedColorSpaces");
162     return displayManagerServiceProxy_->GetSupportedColorSpaces(screenId, colorSpaces);
163 }
164 
GetScreenColorSpace(ScreenId screenId, GraphicCM_ColorSpaceType& colorSpace)165 DMError ScreenManagerAdapter::GetScreenColorSpace(ScreenId screenId,
166     GraphicCM_ColorSpaceType& colorSpace)
167 {
168     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
169 
170     WLOGFI("ScreenManagerAdapter::GetScreenColorSpace");
171     return displayManagerServiceProxy_->GetScreenColorSpace(screenId, colorSpace);
172 }
173 
SetScreenColorSpace(ScreenId screenId, GraphicCM_ColorSpaceType colorSpace)174 DMError ScreenManagerAdapter::SetScreenColorSpace(ScreenId screenId,
175     GraphicCM_ColorSpaceType colorSpace)
176 {
177     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
178 
179     WLOGFI("ScreenManagerAdapter::SetScreenColorSpace");
180     return displayManagerServiceProxy_->SetScreenColorSpace(screenId, colorSpace);
181 }
182 
GetSupportedHDRFormats(ScreenId screenId, std::vector<uint32_t>& hdrFormats)183 DMError ScreenManagerAdapter::GetSupportedHDRFormats(ScreenId screenId, std::vector<uint32_t>& hdrFormats)
184 {
185     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
186 
187     std::vector<ScreenHDRFormat> hdrFormatsVec;
188     DMError ret = GetSupportedHDRFormats(screenId, hdrFormatsVec);
189     for (auto value : hdrFormatsVec) {
190         hdrFormats.push_back(static_cast<uint32_t>(value));
191     }
192     WLOGFI("ScreenManagerAdapter::GetSupportedHDRFormats ret %{public}d", static_cast<int32_t>(ret));
193     return ret;
194 }
195 
GetSupportedColorSpaces(ScreenId screenId, std::vector<uint32_t>& colorSpaces)196 DMError ScreenManagerAdapter::GetSupportedColorSpaces(ScreenId screenId, std::vector<uint32_t>& colorSpaces)
197 {
198     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
199 
200     std::vector<GraphicCM_ColorSpaceType> colorSpacesVec;
201     DMError ret = GetSupportedColorSpaces(screenId, colorSpacesVec);
202     for (auto value : colorSpacesVec) {
203         colorSpaces.push_back(static_cast<uint32_t>(value));
204     }
205     WLOGFI("ScreenManagerAdapter::GetSupportedColorSpaces ret %{public}d", static_cast<int32_t>(ret));
206     return ret;
207 }
208 
CreateVirtualScreen(VirtualScreenOption option, const sptr<IDisplayManagerAgent>& displayManagerAgent)209 ScreenId ScreenManagerAdapter::CreateVirtualScreen(VirtualScreenOption option,
210     const sptr<IDisplayManagerAgent>& displayManagerAgent)
211 {
212     INIT_PROXY_CHECK_RETURN(SCREEN_ID_INVALID);
213 
214     WLOGFI("DisplayManagerAdapter::CreateVirtualScreen");
215     return displayManagerServiceProxy_->CreateVirtualScreen(option, displayManagerAgent->AsObject());
216 }
217 
DestroyVirtualScreen(ScreenId screenId)218 DMError ScreenManagerAdapter::DestroyVirtualScreen(ScreenId screenId)
219 {
220     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
221 
222     WLOGFI("DisplayManagerAdapter::DestroyVirtualScreen");
223     return displayManagerServiceProxy_->DestroyVirtualScreen(screenId);
224 }
225 
SetVirtualScreenSurface(ScreenId screenId, sptr<Surface> surface)226 DMError ScreenManagerAdapter::SetVirtualScreenSurface(ScreenId screenId, sptr<Surface> surface)
227 {
228     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
229 
230     if (surface == nullptr) {
231         WLOGFE("Surface is nullptr");
232         return DMError::DM_ERROR_NULLPTR;
233     }
234     WLOGFI("DisplayManagerAdapter::SetVirtualScreenSurface");
235     return displayManagerServiceProxy_->SetVirtualScreenSurface(screenId, surface->GetProducer());
236 }
237 
SetVirtualMirrorScreenCanvasRotation(ScreenId screenId, bool canvasRotation)238 DMError ScreenManagerAdapter::SetVirtualMirrorScreenCanvasRotation(ScreenId screenId, bool canvasRotation)
239 {
240     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
241     WLOGFI("DisplayManagerAdapter::SetVirtualMirrorScreenCanvasRotation");
242     return displayManagerServiceProxy_->SetVirtualMirrorScreenCanvasRotation(screenId, canvasRotation);
243 }
244 
SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode)245 DMError ScreenManagerAdapter::SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode)
246 {
247     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
248     WLOGFI("DisplayManagerAdapter::SetVirtualMirrorScreenScaleMode");
249     return displayManagerServiceProxy_->SetVirtualMirrorScreenScaleMode(screenId, scaleMode);
250 }
251 
SetScreenRotationLocked(bool isLocked)252 DMError ScreenManagerAdapter::SetScreenRotationLocked(bool isLocked)
253 {
254     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
255     WLOGFI("DisplayManagerAdapter::SetScreenRotationLocked");
256     return displayManagerServiceProxy_->SetScreenRotationLocked(isLocked);
257 }
258 
SetScreenRotationLockedFromJs(bool isLocked)259 DMError ScreenManagerAdapter::SetScreenRotationLockedFromJs(bool isLocked)
260 {
261     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
262     WLOGFI("DisplayManagerAdapter::SetScreenRotationLockedFromJs");
263     return displayManagerServiceProxy_->SetScreenRotationLockedFromJs(isLocked);
264 }
265 
IsScreenRotationLocked(bool& isLocked)266 DMError ScreenManagerAdapter::IsScreenRotationLocked(bool& isLocked)
267 {
268     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
269     WLOGFI("DisplayManagerAdapter::IsScreenRotationLocked");
270     return displayManagerServiceProxy_->IsScreenRotationLocked(isLocked);
271 }
272 
SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason)273 bool ScreenManagerAdapter::SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason)
274 {
275     INIT_PROXY_CHECK_RETURN(false);
276     return displayManagerServiceProxy_->SetSpecifiedScreenPower(screenId, state, reason);
277 }
278 
SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason)279 bool ScreenManagerAdapter::SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason)
280 {
281     INIT_PROXY_CHECK_RETURN(false);
282     return displayManagerServiceProxy_->SetScreenPowerForAll(state, reason);
283 }
284 
GetScreenPower(ScreenId dmsScreenId)285 ScreenPowerState ScreenManagerAdapter::GetScreenPower(ScreenId dmsScreenId)
286 {
287     INIT_PROXY_CHECK_RETURN(ScreenPowerState::INVALID_STATE);
288     return displayManagerServiceProxy_->GetScreenPower(dmsScreenId);
289 }
290 
SetOrientation(ScreenId screenId, Orientation orientation)291 DMError ScreenManagerAdapter::SetOrientation(ScreenId screenId, Orientation orientation)
292 {
293     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
294 
295     return displayManagerServiceProxy_->SetOrientation(screenId, orientation);
296 }
297 
RegisterDisplayManagerAgent(const sptr<IDisplayManagerAgent>& displayManagerAgent, DisplayManagerAgentType type)298 DMError BaseAdapter::RegisterDisplayManagerAgent(const sptr<IDisplayManagerAgent>& displayManagerAgent,
299     DisplayManagerAgentType type)
300 {
301     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
302 
303     return displayManagerServiceProxy_->RegisterDisplayManagerAgent(displayManagerAgent, type);
304 }
305 
UnregisterDisplayManagerAgent(const sptr<IDisplayManagerAgent>& displayManagerAgent, DisplayManagerAgentType type)306 DMError BaseAdapter::UnregisterDisplayManagerAgent(const sptr<IDisplayManagerAgent>& displayManagerAgent,
307     DisplayManagerAgentType type)
308 {
309     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
310 
311     return displayManagerServiceProxy_->UnregisterDisplayManagerAgent(displayManagerAgent, type);
312 }
313 
WakeUpBegin(PowerStateChangeReason reason)314 bool DisplayManagerAdapter::WakeUpBegin(PowerStateChangeReason reason)
315 {
316     INIT_PROXY_CHECK_RETURN(false);
317 
318     return displayManagerServiceProxy_->WakeUpBegin(reason);
319 }
320 
WakeUpEnd()321 bool DisplayManagerAdapter::WakeUpEnd()
322 {
323     INIT_PROXY_CHECK_RETURN(false);
324 
325     return displayManagerServiceProxy_->WakeUpEnd();
326 }
327 
SuspendBegin(PowerStateChangeReason reason)328 bool DisplayManagerAdapter::SuspendBegin(PowerStateChangeReason reason)
329 {
330     INIT_PROXY_CHECK_RETURN(false);
331 
332     return displayManagerServiceProxy_->SuspendBegin(reason);
333 }
334 
SuspendEnd()335 bool DisplayManagerAdapter::SuspendEnd()
336 {
337     INIT_PROXY_CHECK_RETURN(false);
338 
339     return displayManagerServiceProxy_->SuspendEnd();
340 }
341 
GetInternalScreenId()342 ScreenId DisplayManagerAdapter::GetInternalScreenId()
343 {
344     INIT_PROXY_CHECK_RETURN(false);
345 
346     return displayManagerServiceProxy_->GetInternalScreenId();
347 }
348 
SetScreenPowerById(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason)349 bool DisplayManagerAdapter::SetScreenPowerById(ScreenId screenId, ScreenPowerState state,
350     PowerStateChangeReason reason)
351 {
352     INIT_PROXY_CHECK_RETURN(false);
353 
354     return displayManagerServiceProxy_->SetScreenPowerById(screenId, state, reason);
355 }
356 
SetDisplayState(DisplayState state)357 bool DisplayManagerAdapter::SetDisplayState(DisplayState state)
358 {
359     INIT_PROXY_CHECK_RETURN(false);
360 
361     return displayManagerServiceProxy_->SetDisplayState(state);
362 }
363 
GetDisplayState(DisplayId displayId)364 DisplayState DisplayManagerAdapter::GetDisplayState(DisplayId displayId)
365 {
366     INIT_PROXY_CHECK_RETURN(DisplayState::UNKNOWN);
367 
368     return displayManagerServiceProxy_->GetDisplayState(displayId);
369 }
370 
TryToCancelScreenOff()371 bool DisplayManagerAdapter::TryToCancelScreenOff()
372 {
373     INIT_PROXY_CHECK_RETURN(false);
374 
375     return displayManagerServiceProxy_->TryToCancelScreenOff();
376 }
377 
NotifyDisplayEvent(DisplayEvent event)378 void DisplayManagerAdapter::NotifyDisplayEvent(DisplayEvent event)
379 {
380     INIT_PROXY_CHECK_RETURN();
381 
382     displayManagerServiceProxy_->NotifyDisplayEvent(event);
383 }
384 
SetFreeze(std::vector<DisplayId> displayIds, bool isFreeze)385 bool DisplayManagerAdapter::SetFreeze(std::vector<DisplayId> displayIds, bool isFreeze)
386 {
387     INIT_PROXY_CHECK_RETURN(false);
388 
389     return displayManagerServiceProxy_->SetFreeze(displayIds, isFreeze);
390 }
391 
InitDMSProxy()392 bool BaseAdapter::InitDMSProxy()
393 {
394     std::lock_guard<std::recursive_mutex> lock(mutex_);
395     if (!isProxyValid_) {
396         sptr<ISystemAbilityManager> systemAbilityManager =
397                 SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
398         if (!systemAbilityManager) {
399             WLOGFE("Failed to get system ability mgr.");
400             return false;
401         }
402 
403         sptr<IRemoteObject> remoteObject
404             = systemAbilityManager->GetSystemAbility(DISPLAY_MANAGER_SERVICE_SA_ID);
405         if (!remoteObject) {
406             WLOGFE("Failed to get display manager service.");
407             return false;
408         }
409 
410         if (SceneBoardJudgement::IsSceneBoardEnabled()) {
411             displayManagerServiceProxy_ = iface_cast<IScreenSessionManager>(remoteObject);
412         } else {
413             displayManagerServiceProxy_ = iface_cast<IDisplayManager>(remoteObject);
414         }
415         if ((!displayManagerServiceProxy_) || (!displayManagerServiceProxy_->AsObject())) {
416             WLOGFW("Failed to get system display manager services");
417             return false;
418         }
419 
420         dmsDeath_ = new(std::nothrow) DMSDeathRecipient(*this);
421         if (dmsDeath_ == nullptr) {
422             WLOGFE("Failed to create death Recipient ptr DMSDeathRecipient");
423             return false;
424         }
425         if (remoteObject->IsProxyObject() && !remoteObject->AddDeathRecipient(dmsDeath_)) {
426             WLOGFE("Failed to add death recipient");
427             return false;
428         }
429         isProxyValid_ = true;
430     }
431     return true;
432 }
433 
DMSDeathRecipient(BaseAdapter& adapter)434 DMSDeathRecipient::DMSDeathRecipient(BaseAdapter& adapter) : adapter_(adapter)
435 {
436 }
437 
OnRemoteDied(const wptr<IRemoteObject>& wptrDeath)438 void DMSDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& wptrDeath)
439 {
440     if (wptrDeath == nullptr) {
441         WLOGFE("wptrDeath is null");
442         return;
443     }
444 
445     sptr<IRemoteObject> object = wptrDeath.promote();
446     if (!object) {
447         WLOGFE("object is null");
448         return;
449     }
450     WLOGFI("dms OnRemoteDied");
451     adapter_.Clear();
452     SingletonContainer::Get<DisplayManager>().OnRemoteDied();
453     SingletonContainer::Get<ScreenManager>().OnRemoteDied();
454     return;
455 }
456 
457 
~BaseAdapter()458 BaseAdapter::~BaseAdapter()
459 {
460     WLOGFI("BaseAdapter destory!");
461     std::lock_guard<std::recursive_mutex> lock(mutex_);
462     Clear();
463     displayManagerServiceProxy_ = nullptr;
464 }
465 
Clear()466 void BaseAdapter::Clear()
467 {
468     WLOGFD("BaseAdapter Clear!");
469     std::lock_guard<std::recursive_mutex> lock(mutex_);
470     if ((displayManagerServiceProxy_ != nullptr) && (displayManagerServiceProxy_->AsObject() != nullptr)) {
471         displayManagerServiceProxy_->AsObject()->RemoveDeathRecipient(dmsDeath_);
472     }
473     isProxyValid_ = false;
474 }
475 
MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId, ScreenId& screenGroupId)476 DMError ScreenManagerAdapter::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId,
477                                          ScreenId& screenGroupId)
478 {
479     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
480 
481     return displayManagerServiceProxy_->MakeMirror(mainScreenId, mirrorScreenId, screenGroupId);
482 }
483 
SetMultiScreenMode(ScreenId mainScreenId, ScreenId secondaryScreenId, MultiScreenMode screenMode)484 DMError ScreenManagerAdapter::SetMultiScreenMode(ScreenId mainScreenId, ScreenId secondaryScreenId,
485     MultiScreenMode screenMode)
486 {
487     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
488 
489     return displayManagerServiceProxy_->SetMultiScreenMode(mainScreenId, secondaryScreenId, screenMode);
490 }
491 
SetMultiScreenRelativePosition(MultiScreenPositionOptions mainScreenOptions, MultiScreenPositionOptions secondScreenOption)492 DMError ScreenManagerAdapter::SetMultiScreenRelativePosition(MultiScreenPositionOptions mainScreenOptions,
493     MultiScreenPositionOptions secondScreenOption)
494 {
495     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
496 
497     return displayManagerServiceProxy_->SetMultiScreenRelativePosition(mainScreenOptions, secondScreenOption);
498 }
499 
StopMirror(const std::vector<ScreenId>& mirrorScreenIds)500 DMError ScreenManagerAdapter::StopMirror(const std::vector<ScreenId>& mirrorScreenIds)
501 {
502     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
503 
504     return displayManagerServiceProxy_->StopMirror(mirrorScreenIds);
505 }
506 
DisableMirror(bool disableOrNot)507 DMError ScreenManagerAdapter::DisableMirror(bool disableOrNot)
508 {
509     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
510 
511     return displayManagerServiceProxy_->DisableMirror(disableOrNot);
512 }
513 
GetScreenInfo(ScreenId screenId)514 sptr<ScreenInfo> ScreenManagerAdapter::GetScreenInfo(ScreenId screenId)
515 {
516     if (screenId == SCREEN_ID_INVALID) {
517         WLOGFE("screen id is invalid");
518         return nullptr;
519     }
520     INIT_PROXY_CHECK_RETURN(nullptr);
521 
522     sptr<ScreenInfo> screenInfo = displayManagerServiceProxy_->GetScreenInfoById(screenId);
523     return screenInfo;
524 }
525 
GetAllDisplayIds()526 std::vector<DisplayId> DisplayManagerAdapter::GetAllDisplayIds()
527 {
528     WLOGFD("DisplayManagerAdapter::GetAllDisplayIds enter");
529     INIT_PROXY_CHECK_RETURN(std::vector<DisplayId>());
530 
531     return displayManagerServiceProxy_->GetAllDisplayIds();
532 }
533 
HasPrivateWindow(DisplayId displayId, bool& hasPrivateWindow)534 DMError DisplayManagerAdapter::HasPrivateWindow(DisplayId displayId, bool& hasPrivateWindow)
535 {
536     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
537 
538     return displayManagerServiceProxy_->HasPrivateWindow(displayId, hasPrivateWindow);
539 }
540 
ConvertScreenIdToRsScreenId(ScreenId screenId, ScreenId& rsScreenId)541 bool DisplayManagerAdapter::ConvertScreenIdToRsScreenId(ScreenId screenId, ScreenId& rsScreenId)
542 {
543     INIT_PROXY_CHECK_RETURN(false);
544 
545     return displayManagerServiceProxy_->ConvertScreenIdToRsScreenId(screenId, rsScreenId);
546 }
547 
HasImmersiveWindow(ScreenId screenId, bool& immersive)548 DMError DisplayManagerAdapter::HasImmersiveWindow(ScreenId screenId, bool& immersive)
549 {
550     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
551 
552     return displayManagerServiceProxy_->HasImmersiveWindow(screenId, immersive);
553 }
554 
GetDisplayInfo(DisplayId displayId)555 sptr<DisplayInfo> DisplayManagerAdapter::GetDisplayInfo(DisplayId displayId)
556 {
557     WLOGFD("DisplayManagerAdapter::GetDisplayInfo enter, displayId: %{public}" PRIu64" ", displayId);
558     if (displayId == DISPLAY_ID_INVALID) {
559         WLOGFE("screen id is invalid");
560         return nullptr;
561     }
562     INIT_PROXY_CHECK_RETURN(nullptr);
563 
564     return displayManagerServiceProxy_->GetDisplayInfoById(displayId);
565 }
566 
GetCutoutInfo(DisplayId displayId)567 sptr<CutoutInfo> DisplayManagerAdapter::GetCutoutInfo(DisplayId displayId)
568 {
569     WLOGFD("DisplayManagerAdapter::GetCutoutInfo");
570     if (displayId == DISPLAY_ID_INVALID) {
571         WLOGFE("screen id is invalid");
572         return nullptr;
573     }
574     INIT_PROXY_CHECK_RETURN(nullptr);
575     return displayManagerServiceProxy_->GetCutoutInfo(displayId);
576 }
577 
AddSurfaceNodeToDisplay(DisplayId displayId, std::shared_ptr<class RSSurfaceNode>& surfaceNode)578 DMError DisplayManagerAdapter::AddSurfaceNodeToDisplay(DisplayId displayId,
579     std::shared_ptr<class RSSurfaceNode>& surfaceNode)
580 {
581     if (displayId == DISPLAY_ID_INVALID) {
582         WLOGFE("screen id is invalid");
583         return DMError::DM_ERROR_INVALID_PARAM;
584     }
585     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
586     return displayManagerServiceProxy_->AddSurfaceNodeToDisplay(displayId, surfaceNode);
587 }
588 
RemoveSurfaceNodeFromDisplay(DisplayId displayId, std::shared_ptr<class RSSurfaceNode>& surfaceNode)589 DMError DisplayManagerAdapter::RemoveSurfaceNodeFromDisplay(DisplayId displayId,
590     std::shared_ptr<class RSSurfaceNode>& surfaceNode)
591 {
592     if (displayId == DISPLAY_ID_INVALID) {
593         WLOGFE("screen id is invalid");
594         return DMError::DM_ERROR_INVALID_PARAM;
595     }
596     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
597     return displayManagerServiceProxy_->RemoveSurfaceNodeFromDisplay(displayId, surfaceNode);
598 }
599 
IsFoldable()600 bool DisplayManagerAdapter::IsFoldable()
601 {
602     INIT_PROXY_CHECK_RETURN(false);
603 
604     return displayManagerServiceProxy_->IsFoldable();
605 }
606 
IsCaptured()607 bool DisplayManagerAdapter::IsCaptured()
608 {
609     INIT_PROXY_CHECK_RETURN(false);
610 
611     return displayManagerServiceProxy_->IsCaptured();
612 }
613 
GetFoldStatus()614 FoldStatus DisplayManagerAdapter::GetFoldStatus()
615 {
616     INIT_PROXY_CHECK_RETURN(FoldStatus::UNKNOWN);
617 
618     return displayManagerServiceProxy_->GetFoldStatus();
619 }
620 
GetFoldDisplayMode()621 FoldDisplayMode DisplayManagerAdapter::GetFoldDisplayMode()
622 {
623     INIT_PROXY_CHECK_RETURN(FoldDisplayMode::UNKNOWN);
624 
625     return displayManagerServiceProxy_->GetFoldDisplayMode();
626 }
627 
SetFoldDisplayMode(const FoldDisplayMode mode)628 void DisplayManagerAdapter::SetFoldDisplayMode(const FoldDisplayMode mode)
629 {
630     INIT_PROXY_CHECK_RETURN();
631 
632     return displayManagerServiceProxy_->SetFoldDisplayMode(mode);
633 }
634 
SetFoldDisplayModeFromJs(const FoldDisplayMode mode)635 DMError DisplayManagerAdapter::SetFoldDisplayModeFromJs(const FoldDisplayMode mode)
636 {
637     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
638 
639     return displayManagerServiceProxy_->SetFoldDisplayModeFromJs(mode);
640 }
641 
SetDisplayScale(ScreenId screenId, float scaleX, float scaleY, float pivotX, float pivotY)642 void DisplayManagerAdapter::SetDisplayScale(ScreenId screenId,
643     float scaleX, float scaleY, float pivotX, float pivotY)
644 {
645     INIT_PROXY_CHECK_RETURN();
646 
647     return displayManagerServiceProxy_->SetDisplayScale(screenId, scaleX, scaleY, pivotX, pivotY);
648 }
649 
SetFoldStatusLocked(bool locked)650 void DisplayManagerAdapter::SetFoldStatusLocked(bool locked)
651 {
652     INIT_PROXY_CHECK_RETURN();
653 
654     return displayManagerServiceProxy_->SetFoldStatusLocked(locked);
655 }
656 
SetFoldStatusLockedFromJs(bool locked)657 DMError DisplayManagerAdapter::SetFoldStatusLockedFromJs(bool locked)
658 {
659     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
660 
661     return displayManagerServiceProxy_->SetFoldStatusLockedFromJs(locked);
662 }
663 
GetCurrentFoldCreaseRegion()664 sptr<FoldCreaseRegion> DisplayManagerAdapter::GetCurrentFoldCreaseRegion()
665 {
666     INIT_PROXY_CHECK_RETURN(nullptr);
667 
668     return displayManagerServiceProxy_->GetCurrentFoldCreaseRegion();
669 }
670 
GetScreenGroupInfoById(ScreenId screenId)671 sptr<ScreenGroupInfo> ScreenManagerAdapter::GetScreenGroupInfoById(ScreenId screenId)
672 {
673     if (screenId == SCREEN_ID_INVALID) {
674         WLOGFE("screenGroup id is invalid");
675         return nullptr;
676     }
677     INIT_PROXY_CHECK_RETURN(nullptr);
678 
679     return displayManagerServiceProxy_->GetScreenGroupInfoById(screenId);
680 }
681 
GetAllScreenInfos(std::vector<sptr<ScreenInfo>>& screenInfos)682 DMError ScreenManagerAdapter::GetAllScreenInfos(std::vector<sptr<ScreenInfo>>& screenInfos)
683 {
684     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
685 
686     return displayManagerServiceProxy_->GetAllScreenInfos(screenInfos);
687 }
688 
MakeExpand(std::vector<ScreenId> screenId, std::vector<Point> startPoint, ScreenId& screenGroupId)689 DMError ScreenManagerAdapter::MakeExpand(std::vector<ScreenId> screenId, std::vector<Point> startPoint,
690                                          ScreenId& screenGroupId)
691 {
692     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
693 
694     return displayManagerServiceProxy_->MakeExpand(screenId, startPoint, screenGroupId);
695 }
696 
StopExpand(const std::vector<ScreenId>& expandScreenIds)697 DMError ScreenManagerAdapter::StopExpand(const std::vector<ScreenId>& expandScreenIds)
698 {
699     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
700 
701     return displayManagerServiceProxy_->StopExpand(expandScreenIds);
702 }
703 
704 
RemoveVirtualScreenFromGroup(std::vector<ScreenId> screens)705 void ScreenManagerAdapter::RemoveVirtualScreenFromGroup(std::vector<ScreenId> screens)
706 {
707     INIT_PROXY_CHECK_RETURN();
708 
709     displayManagerServiceProxy_->RemoveVirtualScreenFromGroup(screens);
710 }
711 
SetScreenActiveMode(ScreenId screenId, uint32_t modeId)712 DMError ScreenManagerAdapter::SetScreenActiveMode(ScreenId screenId, uint32_t modeId)
713 {
714     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
715 
716     return displayManagerServiceProxy_->SetScreenActiveMode(screenId, modeId);
717 }
718 
SetVirtualPixelRatio(ScreenId screenId, float virtualPixelRatio)719 DMError ScreenManagerAdapter::SetVirtualPixelRatio(ScreenId screenId, float virtualPixelRatio)
720 {
721     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
722 
723     return displayManagerServiceProxy_->SetVirtualPixelRatio(screenId, virtualPixelRatio);
724 }
725 
SetVirtualPixelRatioSystem(ScreenId screenId, float virtualPixelRatio)726 DMError ScreenManagerAdapter::SetVirtualPixelRatioSystem(ScreenId screenId, float virtualPixelRatio)
727 {
728     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
729 
730     return displayManagerServiceProxy_->SetVirtualPixelRatioSystem(screenId, virtualPixelRatio);
731 }
732 
SetResolution(ScreenId screenId, uint32_t width, uint32_t height, float virtualPixelRatio)733 DMError ScreenManagerAdapter::SetResolution(ScreenId screenId, uint32_t width, uint32_t height, float virtualPixelRatio)
734 {
735     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
736 
737     return displayManagerServiceProxy_->SetResolution(screenId, width, height, virtualPixelRatio);
738 }
739 
GetDensityInCurResolution(ScreenId screenId, float& virtualPixelRatio)740 DMError ScreenManagerAdapter::GetDensityInCurResolution(ScreenId screenId, float& virtualPixelRatio)
741 {
742     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
743 
744     return displayManagerServiceProxy_->GetDensityInCurResolution(screenId, virtualPixelRatio);
745 }
746 
ResizeVirtualScreen(ScreenId screenId, uint32_t width, uint32_t height)747 DMError ScreenManagerAdapter::ResizeVirtualScreen(ScreenId screenId, uint32_t width, uint32_t height)
748 {
749     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
750 
751     return displayManagerServiceProxy_->ResizeVirtualScreen(screenId, width, height);
752 }
753 
MakeUniqueScreen(const std::vector<ScreenId>& screenIds)754 DMError ScreenManagerAdapter::MakeUniqueScreen(const std::vector<ScreenId>& screenIds)
755 {
756     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
757 
758     return displayManagerServiceProxy_->MakeUniqueScreen(screenIds);
759 }
760 
GetAvailableArea(DisplayId displayId, DMRect& area)761 DMError DisplayManagerAdapter::GetAvailableArea(DisplayId displayId, DMRect& area)
762 {
763     if (displayId == DISPLAY_ID_INVALID) {
764         WLOGFE("displayId id is invalid");
765         return DMError::DM_ERROR_INVALID_PARAM;
766     }
767     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
768 
769     return displayManagerServiceProxy_->GetAvailableArea(displayId, area);
770 }
771 
GetVirtualScreenFlag(ScreenId screenId)772 VirtualScreenFlag ScreenManagerAdapter::GetVirtualScreenFlag(ScreenId screenId)
773 {
774     INIT_PROXY_CHECK_RETURN(VirtualScreenFlag::DEFAULT);
775     if (screenId == SCREEN_ID_INVALID) {
776         WLOGFE("screenId id is invalid");
777         return VirtualScreenFlag::DEFAULT;
778     }
779 
780     return displayManagerServiceProxy_->GetVirtualScreenFlag(screenId);
781 }
782 
SetVirtualScreenFlag(ScreenId screenId, VirtualScreenFlag screenFlag)783 DMError ScreenManagerAdapter::SetVirtualScreenFlag(ScreenId screenId, VirtualScreenFlag screenFlag)
784 {
785     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
786     if (screenId == SCREEN_ID_INVALID) {
787         WLOGFE("displayId id is invalid");
788         return DMError::DM_ERROR_INVALID_PARAM;
789     }
790     if (screenFlag < VirtualScreenFlag::DEFAULT || screenFlag >= VirtualScreenFlag::MAX) {
791         return DMError::DM_ERROR_INVALID_PARAM;
792     }
793     return displayManagerServiceProxy_->SetVirtualScreenFlag(screenId, screenFlag);
794 }
795 
SetVirtualScreenRefreshRate(ScreenId screenId, uint32_t refreshInterval)796 DMError ScreenManagerAdapter::SetVirtualScreenRefreshRate(ScreenId screenId, uint32_t refreshInterval)
797 {
798     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
799 
800     return displayManagerServiceProxy_->SetVirtualScreenRefreshRate(screenId, refreshInterval);
801 }
802 
SetVirtualScreenBlackList(ScreenId screenId, std::vector<uint64_t>& windowIdList)803 void DisplayManagerAdapter::SetVirtualScreenBlackList(ScreenId screenId, std::vector<uint64_t>& windowIdList)
804 {
805     INIT_PROXY_CHECK_RETURN();
806     displayManagerServiceProxy_->SetVirtualScreenBlackList(screenId, windowIdList);
807 }
808 
DisablePowerOffRenderControl(ScreenId screenId)809 void DisplayManagerAdapter::DisablePowerOffRenderControl(ScreenId screenId)
810 {
811     INIT_PROXY_CHECK_RETURN();
812     displayManagerServiceProxy_->DisablePowerOffRenderControl(screenId);
813 }
814 
ProxyForFreeze(const std::set<int32_t>& pidList, bool isProxy)815 DMError DisplayManagerAdapter::ProxyForFreeze(const std::set<int32_t>& pidList, bool isProxy)
816 {
817     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
818     return displayManagerServiceProxy_->ProxyForFreeze(pidList, isProxy);
819 }
820 
ResetAllFreezeStatus()821 DMError DisplayManagerAdapter::ResetAllFreezeStatus()
822 {
823     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
824     return displayManagerServiceProxy_->ResetAllFreezeStatus();
825 }
826 
GetAllDisplayPhysicalResolution()827 std::vector<DisplayPhysicalResolution> DisplayManagerAdapter::GetAllDisplayPhysicalResolution()
828 {
829     INIT_PROXY_CHECK_RETURN(std::vector<DisplayPhysicalResolution>{});
830     return displayManagerServiceProxy_->GetAllDisplayPhysicalResolution();
831 }
832 
SetVirtualScreenSecurityExemption(ScreenId screenId, uint32_t pid, std::vector<uint64_t>& windowIdList)833 DMError DisplayManagerAdapter::SetVirtualScreenSecurityExemption(ScreenId screenId, uint32_t pid,
834     std::vector<uint64_t>& windowIdList)
835 {
836     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
837     return displayManagerServiceProxy_->SetVirtualScreenSecurityExemption(screenId, pid, windowIdList);
838 }
839 
SetVirtualScreenStatus(ScreenId screenId, VirtualScreenStatus screenStatus)840 bool ScreenManagerAdapter::SetVirtualScreenStatus(ScreenId screenId, VirtualScreenStatus screenStatus)
841 {
842     INIT_PROXY_CHECK_RETURN(false);
843     return displayManagerServiceProxy_->SetVirtualScreenStatus(screenId, screenStatus);
844 }
845 
SetVirtualScreenMaxRefreshRate(ScreenId id, uint32_t refreshRate, uint32_t& actualRefreshRate)846 DMError ScreenManagerAdapter::SetVirtualScreenMaxRefreshRate(ScreenId id, uint32_t refreshRate,
847     uint32_t& actualRefreshRate)
848 {
849     INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
850     return displayManagerServiceProxy_->SetVirtualScreenMaxRefreshRate(id, refreshRate, actualRefreshRate);
851 }
852 
853 } // namespace OHOS::Rosen