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 #include "screen_manager.h"
16 
17 #include <map>
18 #include <vector>
19 
20 #include <transaction/rs_interfaces.h>
21 
22 #include "display_manager_adapter.h"
23 #include "display_manager_agent_default.h"
24 #include "permission.h"
25 #include "singleton_delegator.h"
26 #include "window_manager_hilog.h"
27 
28 namespace OHOS::Rosen {
29 namespace {
30 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "ScreenManager"};
31 const static uint32_t MAX_SCREEN_SIZE = 32;
32 const static uint32_t DLCLOSE_TIMEOUT = 300000;
33 }
34 class ScreenManager::Impl : public RefBase {
35 public:
36     Impl() = default;
37     ~Impl();
38 
39     static inline SingletonDelegator<ScreenManager> delegator;
40     ScreenId CreateVirtualScreen(VirtualScreenOption option);
41     sptr<Screen> GetScreen(ScreenId screenId);
42     sptr<ScreenGroup> GetScreenGroup(ScreenId screenId);
43     DMError GetAllScreens(std::vector<sptr<Screen>>& screens);
44     DMError RegisterScreenListener(sptr<IScreenListener> listener);
45     DMError UnregisterScreenListener(sptr<IScreenListener> listener);
46     DMError RegisterScreenGroupListener(sptr<IScreenGroupListener> listener);
47     DMError UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener);
48     DMError RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener);
49     DMError UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener);
50     DMError RegisterDisplayManagerAgent();
51     DMError UnregisterDisplayManagerAgent();
52     void OnRemoteDied();
53 
54 private:
55     void NotifyScreenConnect(sptr<ScreenInfo> info);
56     void NotifyScreenDisconnect(ScreenId);
57     void NotifyScreenChange(const sptr<ScreenInfo>& screenInfo);
58     void NotifyScreenChange(const std::vector<sptr<ScreenInfo>>& screenInfos);
59     bool UpdateScreenInfoLocked(sptr<ScreenInfo>);
60     std::string GetScreenInfoSrting(sptr<ScreenInfo> screenInfo);
61     void DlcloseTimeout();
62 
63     bool isAllListenersRemoved() const;
64 
65     class ScreenManagerListener;
66     sptr<ScreenManagerListener> screenManagerListener_;
67     std::map<ScreenId, sptr<Screen>> screenMap_;
68     std::map<ScreenId, sptr<ScreenGroup>> screenGroupMap_;
69     std::recursive_mutex mutex_;
70     std::set<sptr<IScreenListener>> screenListeners_;
71     std::set<sptr<IScreenGroupListener>> screenGroupListeners_;
72     std::set<sptr<IVirtualScreenGroupListener>> virtualScreenGroupListeners_;
73     sptr<IDisplayManagerAgent> virtualScreenAgent_ = nullptr;
74 };
75 
76 class ScreenManager::Impl::ScreenManagerListener : public DisplayManagerAgentDefault {
77 public:
ScreenManagerListener(sptr<Impl> impl)78     explicit ScreenManagerListener(sptr<Impl> impl) : pImpl_(impl)
79     {
80     }
81 
OnScreenConnect(sptr<ScreenInfo> screenInfo)82     void OnScreenConnect(sptr<ScreenInfo> screenInfo)
83     {
84         if (screenInfo == nullptr || screenInfo->GetScreenId() == SCREEN_ID_INVALID) {
85             WLOGFE("OnScreenConnect, screenInfo is invalid.");
86             return;
87         }
88         if (pImpl_ == nullptr) {
89             WLOGFE("OnScreenConnect, impl is nullptr.");
90             return;
91         }
92         pImpl_->NotifyScreenConnect(screenInfo);
93         std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
94         for (auto listener : pImpl_->screenListeners_) {
95             listener->OnConnect(screenInfo->GetScreenId());
96         }
97     };
98 
OnScreenDisconnect(ScreenId screenId)99     void OnScreenDisconnect(ScreenId screenId)
100     {
101         if (screenId == SCREEN_ID_INVALID) {
102             WLOGFE("OnScreenDisconnect, screenId is invalid.");
103             return;
104         }
105         if (pImpl_ == nullptr) {
106             WLOGFE("OnScreenDisconnect, impl is nullptr.");
107             return;
108         }
109         pImpl_->NotifyScreenDisconnect(screenId);
110         std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
111         for (auto listener : pImpl_->screenListeners_) {
112             listener->OnDisconnect(screenId);
113         }
114     };
115 
OnScreenChange(const sptr<ScreenInfo> & screenInfo,ScreenChangeEvent event)116     void OnScreenChange(const sptr<ScreenInfo>& screenInfo, ScreenChangeEvent event)
117     {
118         if (screenInfo == nullptr) {
119             WLOGFE("OnScreenChange, screenInfo is null.");
120             return;
121         }
122         if (pImpl_ == nullptr) {
123             WLOGFE("OnScreenChange, impl is nullptr.");
124             return;
125         }
126         WLOGFD("OnScreenChange. event %{public}u", event);
127         pImpl_->NotifyScreenChange(screenInfo);
128         std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
129         for (auto listener: pImpl_->screenListeners_) {
130             listener->OnChange(screenInfo->GetScreenId());
131         }
132     };
133 
OnScreenGroupChange(const std::string & trigger,const std::vector<sptr<ScreenInfo>> & screenInfos,ScreenGroupChangeEvent groupEvent)134     void OnScreenGroupChange(const std::string& trigger, const std::vector<sptr<ScreenInfo>>& screenInfos,
135         ScreenGroupChangeEvent groupEvent)
136     {
137         if (screenInfos.empty()) {
138             WLOGFE("screenInfos is empty.");
139             return;
140         }
141         if (pImpl_ == nullptr) {
142             WLOGFE("impl is nullptr.");
143             return;
144         }
145         WLOGFD("trigger %{public}s, event %{public}u", trigger.c_str(), groupEvent);
146         pImpl_->NotifyScreenChange(screenInfos);
147         std::vector<ScreenId> screenIds;
148         for (auto screenInfo : screenInfos) {
149             if (screenInfo->GetScreenId() != SCREEN_ID_INVALID) {
150                 screenIds.push_back(screenInfo->GetScreenId());
151             }
152         }
153         std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
154         for (auto listener: pImpl_->screenGroupListeners_) {
155             listener->OnChange(screenIds, groupEvent);
156         }
157         NotifyVirtualScreenGroupChanged(screenInfos[0], trigger, screenIds, groupEvent);
158     };
159 private:
NotifyVirtualScreenGroupChanged(sptr<ScreenInfo> screenInfo,const std::string trigger,std::vector<ScreenId> & ids,ScreenGroupChangeEvent groupEvent)160     void NotifyVirtualScreenGroupChanged(sptr<ScreenInfo> screenInfo,
161         const std::string trigger, std::vector<ScreenId>& ids, ScreenGroupChangeEvent groupEvent)
162     {
163         // check for invalid scene
164         if (pImpl_->virtualScreenGroupListeners_.size() <= 0) {
165             WLOGFW("no virtual screen group listeners");
166             return;
167         }
168         if (screenInfo->GetType() != ScreenType::VIRTUAL) {
169             WLOGFW("not virtual screen type: %{public}u", screenInfo->GetType());
170             return;
171         }
172 
173         // get the parent of screen
174         ScreenId parent = groupEvent == ScreenGroupChangeEvent::ADD_TO_GROUP ?
175             screenInfo->GetParentId() : screenInfo->GetLastParentId();
176         WLOGFD("parentId=[%{public}llu], lastParentId=[%{public}llu]", (unsigned long long)screenInfo->GetParentId(),
177             (unsigned long long)screenInfo->GetLastParentId());
178         if (parent == INVALID_SCREEN_ID) {
179             WLOGFE("parentId is invalid");
180             return;
181         }
182         auto screenGroup = pImpl_->GetScreenGroup(parent);
183         if (screenGroup == nullptr) {
184             WLOGFE("screenGroup is null");
185             return;
186         }
187 
188         // notify mirror
189         ScreenCombination comb = screenGroup->GetCombination();
190         WLOGFD("comb %{public}u", comb);
191         IVirtualScreenGroupListener::ChangeInfo changeInfo = {groupEvent, trigger, ids};
192         for (auto listener: pImpl_->virtualScreenGroupListeners_) {
193             if (comb == ScreenCombination::SCREEN_MIRROR) {
194                 listener->OnMirrorChange(changeInfo);
195             }
196         }
197     }
198     sptr<Impl> pImpl_;
199 };
200 
WM_IMPLEMENT_SINGLE_INSTANCE(ScreenManager)201 WM_IMPLEMENT_SINGLE_INSTANCE(ScreenManager)
202 
203 extern "C" __attribute__((destructor)) void ScreenManager::Impl::DlcloseTimeout()
204 {
205     usleep(DLCLOSE_TIMEOUT);
206 }
207 
ScreenManager()208 ScreenManager::ScreenManager()
209 {
210     pImpl_ = new Impl();
211     WLOGFD("Create screenmanager instance");
212 }
213 
~ScreenManager()214 ScreenManager::~ScreenManager()
215 {
216     WLOGFI("Destroy screenmanager instance");
217 }
218 
~Impl()219 ScreenManager::Impl::~Impl()
220 {
221     std::lock_guard<std::recursive_mutex> lock(mutex_);
222     UnregisterDisplayManagerAgent();
223 }
224 
GetScreen(ScreenId screenId)225 sptr<Screen> ScreenManager::Impl::GetScreen(ScreenId screenId)
226 {
227     auto screenInfo = SingletonContainer::Get<ScreenManagerAdapter>().GetScreenInfo(screenId);
228     std::lock_guard<std::recursive_mutex> lock(mutex_);
229     if (!UpdateScreenInfoLocked(screenInfo)) {
230         screenMap_.erase(screenId);
231         return nullptr;
232     }
233     return screenMap_[screenId];
234 }
235 
GetScreenById(ScreenId screenId)236 sptr<Screen> ScreenManager::GetScreenById(ScreenId screenId)
237 {
238     return pImpl_->GetScreen(screenId);
239 }
240 
GetScreenGroup(ScreenId screenId)241 sptr<ScreenGroup> ScreenManager::Impl::GetScreenGroup(ScreenId screenId)
242 {
243     auto screenGroupInfo = SingletonContainer::Get<ScreenManagerAdapter>().GetScreenGroupInfoById(screenId);
244     std::lock_guard<std::recursive_mutex> lock(mutex_);
245     if (screenGroupInfo == nullptr) {
246         WLOGFE("screenGroupInfo is null");
247         screenGroupMap_.erase(screenId);
248         return nullptr;
249     }
250     auto iter = screenGroupMap_.find(screenId);
251     if (iter != screenGroupMap_.end() && iter->second != nullptr) {
252         iter->second->UpdateScreenGroupInfo(screenGroupInfo);
253         return iter->second;
254     }
255     sptr<ScreenGroup> screenGroup = new ScreenGroup(screenGroupInfo);
256     screenGroupMap_[screenId] = screenGroup;
257     return screenGroup;
258 }
259 
GetScreenGroup(ScreenId screenId)260 sptr<ScreenGroup> ScreenManager::GetScreenGroup(ScreenId screenId)
261 {
262     return pImpl_->GetScreenGroup(screenId);
263 }
264 
GetAllScreens(std::vector<sptr<Screen>> & screens)265 DMError ScreenManager::Impl::GetAllScreens(std::vector<sptr<Screen>>& screens)
266 {
267     std::vector<sptr<ScreenInfo>> screenInfos;
268     DMError ret  = SingletonContainer::Get<ScreenManagerAdapter>().GetAllScreenInfos(screenInfos);
269     std::lock_guard<std::recursive_mutex> lock(mutex_);
270     for (auto info: screenInfos) {
271         if (UpdateScreenInfoLocked(info)) {
272             screens.emplace_back(screenMap_[info->GetScreenId()]);
273         }
274     }
275     screenMap_.clear();
276     for (auto screen: screens) {
277         screenMap_.insert(std::make_pair(screen->GetId(), screen));
278     }
279     return ret;
280 }
281 
GetAllScreens(std::vector<sptr<Screen>> & screens)282 DMError ScreenManager::GetAllScreens(std::vector<sptr<Screen>>& screens)
283 {
284     return pImpl_->GetAllScreens(screens);
285 }
286 
RegisterScreenListener(sptr<IScreenListener> listener)287 DMError ScreenManager::Impl::RegisterScreenListener(sptr<IScreenListener> listener)
288 {
289     std::lock_guard<std::recursive_mutex> lock(mutex_);
290     DMError regSucc = RegisterDisplayManagerAgent();
291     if (regSucc == DMError::DM_OK) {
292         screenListeners_.insert(listener);
293     }
294     return regSucc;
295 }
296 
RegisterScreenListener(sptr<IScreenListener> listener)297 DMError ScreenManager::RegisterScreenListener(sptr<IScreenListener> listener)
298 {
299     if (listener == nullptr) {
300         WLOGFE("RegisterScreenListener listener is nullptr.");
301         return DMError::DM_ERROR_NULLPTR;
302     }
303     return pImpl_->RegisterScreenListener(listener);
304 }
305 
UnregisterScreenListener(sptr<IScreenListener> listener)306 DMError ScreenManager::Impl::UnregisterScreenListener(sptr<IScreenListener> listener)
307 {
308     std::lock_guard<std::recursive_mutex> lock(mutex_);
309     auto iter = std::find(screenListeners_.begin(), screenListeners_.end(), listener);
310     if (iter == screenListeners_.end()) {
311         WLOGFE("could not find this listener");
312         return DMError::DM_ERROR_NULLPTR;
313     }
314     screenListeners_.erase(iter);
315     return isAllListenersRemoved() ? UnregisterDisplayManagerAgent() : DMError::DM_OK;
316 }
317 
UnregisterScreenListener(sptr<IScreenListener> listener)318 DMError ScreenManager::UnregisterScreenListener(sptr<IScreenListener> listener)
319 {
320     if (listener == nullptr) {
321         WLOGFE("UnregisterScreenListener listener is nullptr.");
322         return DMError::DM_ERROR_NULLPTR;
323     }
324     return pImpl_->UnregisterScreenListener(listener);
325 }
326 
RegisterScreenGroupListener(sptr<IScreenGroupListener> listener)327 DMError ScreenManager::Impl::RegisterScreenGroupListener(sptr<IScreenGroupListener> listener)
328 {
329     std::lock_guard<std::recursive_mutex> lock(mutex_);
330     DMError regSucc = RegisterDisplayManagerAgent();
331     if (regSucc == DMError::DM_OK) {
332         screenGroupListeners_.insert(listener);
333     }
334     return regSucc;
335 }
336 
RegisterScreenGroupListener(sptr<IScreenGroupListener> listener)337 DMError ScreenManager::RegisterScreenGroupListener(sptr<IScreenGroupListener> listener)
338 {
339     if (listener == nullptr) {
340         WLOGFE("RegisterScreenGroupListener listener is nullptr.");
341         return DMError::DM_ERROR_NULLPTR;
342     }
343     return pImpl_->RegisterScreenGroupListener(listener);
344 }
345 
UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener)346 DMError ScreenManager::Impl::UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener)
347 {
348     std::lock_guard<std::recursive_mutex> lock(mutex_);
349     auto iter = std::find(screenGroupListeners_.begin(), screenGroupListeners_.end(), listener);
350     if (iter == screenGroupListeners_.end()) {
351         WLOGFE("could not find this listener");
352         return DMError::DM_ERROR_NULLPTR;
353     }
354     screenGroupListeners_.erase(iter);
355     return isAllListenersRemoved() ? UnregisterDisplayManagerAgent() : DMError::DM_OK;
356 }
357 
UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener)358 DMError ScreenManager::UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener)
359 {
360     if (listener == nullptr) {
361         WLOGFE("UnregisterScreenGroupListener listener is nullptr.");
362         return DMError::DM_ERROR_NULLPTR;
363     }
364     return pImpl_->UnregisterScreenGroupListener(listener);
365 }
366 
RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)367 DMError ScreenManager::Impl::RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)
368 {
369     std::lock_guard<std::recursive_mutex> lock(mutex_);
370     DMError regSucc = RegisterDisplayManagerAgent();
371     if (regSucc == DMError::DM_OK) {
372         virtualScreenGroupListeners_.insert(listener);
373     }
374     return regSucc;
375 }
376 
RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)377 DMError ScreenManager::RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)
378 {
379     if (listener == nullptr) {
380         WLOGFE("RegisterVirtualScreenGroupListener listener is nullptr.");
381         return DMError::DM_ERROR_NULLPTR;
382     }
383     return pImpl_->RegisterVirtualScreenGroupListener(listener);
384 }
385 
UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)386 DMError ScreenManager::Impl::UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)
387 {
388     std::lock_guard<std::recursive_mutex> lock(mutex_);
389     auto iter = std::find(virtualScreenGroupListeners_.begin(), virtualScreenGroupListeners_.end(), listener);
390     if (iter == virtualScreenGroupListeners_.end()) {
391         WLOGFE("could not find this listener");
392         return DMError::DM_ERROR_NULLPTR;
393     }
394     virtualScreenGroupListeners_.erase(iter);
395     return isAllListenersRemoved() ? UnregisterDisplayManagerAgent() : DMError::DM_OK;
396 }
397 
UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)398 DMError ScreenManager::UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)
399 {
400     if (listener == nullptr) {
401         WLOGFE("UnregisterVirtualScreenGroupListener listener is nullptr.");
402         return DMError::DM_ERROR_NULLPTR;
403     }
404     return pImpl_->UnregisterVirtualScreenGroupListener(listener);
405 }
406 
RegisterDisplayManagerAgent()407 DMError ScreenManager::Impl::RegisterDisplayManagerAgent()
408 {
409     DMError regSucc = DMError::DM_OK;
410     if (screenManagerListener_ == nullptr) {
411         screenManagerListener_ = new ScreenManagerListener(this);
412         regSucc = SingletonContainer::Get<ScreenManagerAdapter>().RegisterDisplayManagerAgent(
413             screenManagerListener_, DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
414         if (regSucc != DMError::DM_OK) {
415             screenManagerListener_ = nullptr;
416             WLOGFW("RegisterDisplayManagerAgent failed !");
417         }
418     }
419     return regSucc;
420 }
421 
UnregisterDisplayManagerAgent()422 DMError ScreenManager::Impl::UnregisterDisplayManagerAgent()
423 {
424     DMError unRegSucc = DMError::DM_OK;
425     if (screenManagerListener_ != nullptr) {
426         unRegSucc = SingletonContainer::Get<ScreenManagerAdapter>().UnregisterDisplayManagerAgent(
427             screenManagerListener_, DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
428         screenManagerListener_ = nullptr;
429         if (unRegSucc != DMError::DM_OK) {
430             WLOGFW("UnregisterDisplayManagerAgent failed!");
431         }
432     }
433     return unRegSucc;
434 }
435 
MakeExpand(const std::vector<ExpandOption> & options,ScreenId & screenGroupId)436 DMError ScreenManager::MakeExpand(const std::vector<ExpandOption>& options, ScreenId& screenGroupId)
437 {
438     WLOGFD("Make expand");
439     if (options.empty()) {
440         return DMError::DM_ERROR_INVALID_PARAM;
441     }
442     if (options.size() > MAX_SCREEN_SIZE) {
443         WLOGFW("Make expand failed. The options size is bigger than %{public}u.", MAX_SCREEN_SIZE);
444         return DMError::DM_ERROR_INVALID_PARAM;
445     }
446     std::vector<ScreenId> screenIds;
447     std::vector<Point> startPoints;
448     for (auto& option: options) {
449         if (std::find(screenIds.begin(), screenIds.end(), option.screenId_) != screenIds.end()) {
450             continue;
451         }
452         screenIds.emplace_back(option.screenId_);
453         startPoints.emplace_back(Point(option.startX_, option.startY_));
454     }
455     DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().MakeExpand(screenIds, startPoints, screenGroupId);
456     if (screenGroupId == SCREEN_ID_INVALID) {
457         WLOGFE("Make expand failed");
458     }
459     return ret;
460 }
461 
MakeUniqueScreen(const std::vector<ScreenId> & screenIds)462 DMError ScreenManager::MakeUniqueScreen(const std::vector<ScreenId>& screenIds)
463 {
464     WLOGFD("start Make UniqueScreen");
465     if (screenIds.empty()) {
466         WLOGFE("screenIds is null");
467         return DMError::DM_ERROR_INVALID_PARAM;
468     }
469     if (screenIds.size() > MAX_SCREEN_SIZE) {
470         WLOGFW("Make UniqueScreen failed. The screenIds size is bigger than %{public}u.", MAX_SCREEN_SIZE);
471         return DMError::DM_ERROR_INVALID_PARAM;
472     }
473     DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().MakeUniqueScreen(screenIds);
474     return ret;
475 }
476 
MakeMirror(ScreenId mainScreenId,std::vector<ScreenId> mirrorScreenId,ScreenId & screenGroupId)477 DMError ScreenManager::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId, ScreenId& screenGroupId)
478 {
479     WLOGFI("Make mirror for screen: %{public}" PRIu64"", mainScreenId);
480     if (mirrorScreenId.size() > MAX_SCREEN_SIZE) {
481         WLOGFW("Make Mirror failed. The mirrorScreenId size is bigger than %{public}u.", MAX_SCREEN_SIZE);
482         return DMError::DM_ERROR_INVALID_PARAM;
483     }
484     DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().MakeMirror(mainScreenId, mirrorScreenId,
485                                                                              screenGroupId);
486     if (screenGroupId == SCREEN_ID_INVALID) {
487         WLOGFE("create mirror failed");
488     }
489     return ret;
490 }
491 
StopExpand(const std::vector<ScreenId> & expandScreenIds)492 DMError ScreenManager::StopExpand(const std::vector<ScreenId>& expandScreenIds)
493 {
494     WLOGFD("Stop expand");
495     if (expandScreenIds.empty()) {
496         return DMError::DM_OK;
497     }
498     return SingletonContainer::Get<ScreenManagerAdapter>().StopExpand(expandScreenIds);
499 }
500 
StopMirror(const std::vector<ScreenId> & mirrorScreenIds)501 DMError ScreenManager::StopMirror(const std::vector<ScreenId>& mirrorScreenIds)
502 {
503     WLOGFD("Stop mirror");
504     if (mirrorScreenIds.empty()) {
505         return DMError::DM_OK;
506     }
507     return SingletonContainer::Get<ScreenManagerAdapter>().StopMirror(mirrorScreenIds);
508 }
509 
DisableMirror(bool disableOrNot)510 DMError ScreenManager::DisableMirror(bool disableOrNot)
511 {
512     WLOGFI("Disable mirror %{public}d", disableOrNot);
513     return SingletonContainer::Get<ScreenManagerAdapter>().DisableMirror(disableOrNot);
514 }
515 
RemoveVirtualScreenFromGroup(std::vector<ScreenId> screens)516 DMError ScreenManager::RemoveVirtualScreenFromGroup(std::vector<ScreenId> screens)
517 {
518     WLOGFI("screens.size=%{public}llu", (unsigned long long)screens.size());
519     if (screens.empty()) {
520         WLOGFW("RemoveVirtualScreenFromGroup failed. screens is empty.");
521         return DMError::DM_ERROR_INVALID_PARAM;
522     }
523     if (screens.size() > MAX_SCREEN_SIZE) {
524         WLOGFW("RemoveVirtualScreenFromGroup failed. The screens size is bigger than %{public}u.", MAX_SCREEN_SIZE);
525         return DMError::DM_ERROR_INVALID_PARAM;
526     }
527     SingletonContainer::Get<ScreenManagerAdapter>().RemoveVirtualScreenFromGroup(screens);
528     return DMError::DM_OK;
529 }
530 
CreateVirtualScreen(VirtualScreenOption option)531 ScreenId ScreenManager::CreateVirtualScreen(VirtualScreenOption option)
532 {
533     return pImpl_->CreateVirtualScreen(option);
534 }
535 
CreateVirtualScreen(VirtualScreenOption option)536 ScreenId ScreenManager::Impl::CreateVirtualScreen(VirtualScreenOption option)
537 {
538     //  After the process creating the virtual screen is killed, DMS needs to delete the virtual screen
539     if (virtualScreenAgent_ == nullptr) {
540         virtualScreenAgent_ = new DisplayManagerAgentDefault();
541     }
542     return SingletonContainer::Get<ScreenManagerAdapter>().CreateVirtualScreen(option, virtualScreenAgent_);
543 }
544 
DestroyVirtualScreen(ScreenId screenId)545 DMError ScreenManager::DestroyVirtualScreen(ScreenId screenId)
546 {
547     return SingletonContainer::Get<ScreenManagerAdapter>().DestroyVirtualScreen(screenId);
548 }
549 
SetVirtualScreenSurface(ScreenId screenId,sptr<Surface> surface)550 DMError ScreenManager::SetVirtualScreenSurface(ScreenId screenId, sptr<Surface> surface)
551 {
552     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenSurface(screenId, surface);
553 }
554 
SetVirtualMirrorScreenCanvasRotation(ScreenId screenId,bool rotation)555 DMError ScreenManager::SetVirtualMirrorScreenCanvasRotation(ScreenId screenId, bool rotation)
556 {
557     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualMirrorScreenCanvasRotation(screenId, rotation);
558 }
559 
ResizeVirtualScreen(ScreenId screenId,uint32_t width,uint32_t height)560 DMError ScreenManager::ResizeVirtualScreen(ScreenId screenId, uint32_t width, uint32_t height)
561 {
562     return SingletonContainer::Get<ScreenManagerAdapter>().ResizeVirtualScreen(screenId, width, height);
563 }
564 
SetVirtualMirrorScreenScaleMode(ScreenId screenId,ScreenScaleMode scaleMode)565 DMError ScreenManager::SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode)
566 {
567     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualMirrorScreenScaleMode(screenId, scaleMode);
568 }
569 
GetVirtualScreenFlag(ScreenId screenId)570 VirtualScreenFlag ScreenManager::GetVirtualScreenFlag(ScreenId screenId)
571 {
572     return SingletonContainer::Get<ScreenManagerAdapter>().GetVirtualScreenFlag(screenId);
573 }
574 
SetVirtualScreenFlag(ScreenId screenId,VirtualScreenFlag screenFlag)575 DMError ScreenManager::SetVirtualScreenFlag(ScreenId screenId, VirtualScreenFlag screenFlag)
576 {
577     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenFlag(screenId, screenFlag);
578 }
579 
SetVirtualScreenRefreshRate(ScreenId screenId,uint32_t refreshInterval)580 DMError ScreenManager::SetVirtualScreenRefreshRate(ScreenId screenId, uint32_t refreshInterval)
581 {
582     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenRefreshRate(screenId, refreshInterval);
583 }
584 
SetSpecifiedScreenPower(ScreenId screenId,ScreenPowerState state,PowerStateChangeReason reason)585 bool ScreenManager::SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason)
586 {
587     WLOGFI("screenId:%{public}" PRIu64 ", state:%{public}u, reason:%{public}u", screenId, state, reason);
588     return SingletonContainer::Get<ScreenManagerAdapter>().SetSpecifiedScreenPower(screenId, state, reason);
589 }
590 
SetScreenPowerForAll(ScreenPowerState state,PowerStateChangeReason reason)591 bool ScreenManager::SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason)
592 {
593     WLOGFI("state:%{public}u, reason:%{public}u", state, reason);
594     return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenPowerForAll(state, reason);
595 }
596 
GetScreenPower(ScreenId dmsScreenId)597 ScreenPowerState ScreenManager::GetScreenPower(ScreenId dmsScreenId)
598 {
599     return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenPower(dmsScreenId);
600 }
601 
SetScreenRotationLocked(bool isLocked)602 DMError ScreenManager::SetScreenRotationLocked(bool isLocked)
603 {
604     return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenRotationLocked(isLocked);
605 }
606 
SetScreenRotationLockedFromJs(bool isLocked)607 DMError ScreenManager::SetScreenRotationLockedFromJs(bool isLocked)
608 {
609     return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenRotationLockedFromJs(isLocked);
610 }
611 
IsScreenRotationLocked(bool & isLocked)612 DMError ScreenManager::IsScreenRotationLocked(bool& isLocked)
613 {
614     return SingletonContainer::Get<ScreenManagerAdapter>().IsScreenRotationLocked(isLocked);
615 }
616 
NotifyScreenConnect(sptr<ScreenInfo> info)617 void ScreenManager::Impl::NotifyScreenConnect(sptr<ScreenInfo> info)
618 {
619     std::lock_guard<std::recursive_mutex> lock(mutex_);
620     UpdateScreenInfoLocked(info);
621 }
622 
NotifyScreenDisconnect(ScreenId screenId)623 void ScreenManager::Impl::NotifyScreenDisconnect(ScreenId screenId)
624 {
625     WLOGFI("screenId:%{public}" PRIu64".", screenId);
626     std::lock_guard<std::recursive_mutex> lock(mutex_);
627     screenMap_.erase(screenId);
628 }
629 
NotifyScreenChange(const sptr<ScreenInfo> & screenInfo)630 void ScreenManager::Impl::NotifyScreenChange(const sptr<ScreenInfo>& screenInfo)
631 {
632     std::lock_guard<std::recursive_mutex> lock(mutex_);
633     UpdateScreenInfoLocked(screenInfo);
634 }
635 
NotifyScreenChange(const std::vector<sptr<ScreenInfo>> & screenInfos)636 void ScreenManager::Impl::NotifyScreenChange(const std::vector<sptr<ScreenInfo>>& screenInfos)
637 {
638     std::lock_guard<std::recursive_mutex> lock(mutex_);
639     for (auto screenInfo : screenInfos) {
640         UpdateScreenInfoLocked(screenInfo);
641     }
642 }
643 
UpdateScreenInfoLocked(sptr<ScreenInfo> screenInfo)644 bool ScreenManager::Impl::UpdateScreenInfoLocked(sptr<ScreenInfo> screenInfo)
645 {
646     if (screenInfo == nullptr) {
647         WLOGFE("displayInfo is null");
648         return false;
649     }
650     ScreenId screenId = screenInfo->GetScreenId();
651     WLOGFD("screenId:%{public}" PRIu64".", screenId);
652     if (screenId == SCREEN_ID_INVALID) {
653         WLOGFE("displayId is invalid.");
654         return false;
655     }
656     auto iter = screenMap_.find(screenId);
657     if (iter != screenMap_.end() && iter->second != nullptr) {
658         WLOGFD("Screen Info Updated: %{public}s",
659             GetScreenInfoSrting(screenInfo).c_str());
660         iter->second->UpdateScreenInfo(screenInfo);
661         return true;
662     }
663     sptr<Screen> screen = new Screen(screenInfo);
664     screenMap_[screenId] = screen;
665     return true;
666 }
667 
GetScreenInfoSrting(sptr<ScreenInfo> screenInfo)668 std::string ScreenManager::Impl::GetScreenInfoSrting(sptr<ScreenInfo> screenInfo)
669 {
670     if (screenInfo == nullptr) {
671         WLOGFE("screenInfo nullptr.");
672         return "";
673     }
674     std::ostringstream oss;
675     oss <<  "Screen ID: " << screenInfo->GetScreenId() << ", ";
676     oss <<  "Name: " << screenInfo->GetName() << ", ";
677     oss <<  "VirtualWidth: " << screenInfo->GetVirtualWidth() << ", ";
678     oss <<  "VirtualHeight: " << screenInfo->GetVirtualHeight() << ", ";
679     oss <<  "VirtualPixelRatio: " << screenInfo->GetVirtualPixelRatio() << ", ";
680     oss <<  "Rotation: " << static_cast<int32_t>(screenInfo->GetRotation());
681     return oss.str();
682 }
683 
isAllListenersRemoved() const684 bool ScreenManager::Impl::isAllListenersRemoved() const
685 {
686     return screenListeners_.empty() && screenGroupListeners_.empty() && virtualScreenGroupListeners_.empty();
687 }
688 
OnRemoteDied()689 void ScreenManager::Impl::OnRemoteDied()
690 {
691     WLOGFD("dms is died");
692     std::lock_guard<std::recursive_mutex> lock(mutex_);
693     screenManagerListener_ = nullptr;
694     virtualScreenAgent_ = nullptr;
695 }
696 
OnRemoteDied()697 void ScreenManager::OnRemoteDied()
698 {
699     pImpl_->OnRemoteDied();
700 }
701 
SetVirtualScreenMaxRefreshRate(ScreenId id,uint32_t refreshRate,uint32_t & actualRefreshRate)702 DMError ScreenManager::SetVirtualScreenMaxRefreshRate(ScreenId id, uint32_t refreshRate,
703     uint32_t& actualRefreshRate)
704 {
705     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenMaxRefreshRate(id,
706         refreshRate, actualRefreshRate);
707 }
708 } // namespace OHOS::Rosen