• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #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 
MakeMirror(ScreenId mainScreenId,std::vector<ScreenId> mirrorScreenId,DMRect mainScreenRegion,ScreenId & screenGroupId)492 DMError ScreenManager::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId, DMRect mainScreenRegion,
493     ScreenId& screenGroupId)
494 {
495     WLOGFI("Make mirror with region for screen: %{public}" PRIu64"", mainScreenId);
496     if (mirrorScreenId.size() > MAX_SCREEN_SIZE) {
497         WLOGFW("Make Mirror failed. MirrorScreenId size bigger than %{public}u.", MAX_SCREEN_SIZE);
498         return DMError::DM_ERROR_INVALID_PARAM;
499     }
500     DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().MakeMirror(mainScreenId, mirrorScreenId,
501         mainScreenRegion, screenGroupId);
502     if (screenGroupId == SCREEN_ID_INVALID) {
503         WLOGFE("create mirror failed");
504     }
505     return ret;
506 }
507 
StopExpand(const std::vector<ScreenId> & expandScreenIds)508 DMError ScreenManager::StopExpand(const std::vector<ScreenId>& expandScreenIds)
509 {
510     WLOGFD("Stop expand");
511     if (expandScreenIds.empty()) {
512         return DMError::DM_OK;
513     }
514     return SingletonContainer::Get<ScreenManagerAdapter>().StopExpand(expandScreenIds);
515 }
516 
StopMirror(const std::vector<ScreenId> & mirrorScreenIds)517 DMError ScreenManager::StopMirror(const std::vector<ScreenId>& mirrorScreenIds)
518 {
519     WLOGFD("Stop mirror");
520     if (mirrorScreenIds.empty()) {
521         return DMError::DM_OK;
522     }
523     return SingletonContainer::Get<ScreenManagerAdapter>().StopMirror(mirrorScreenIds);
524 }
525 
DisableMirror(bool disableOrNot)526 DMError ScreenManager::DisableMirror(bool disableOrNot)
527 {
528     WLOGFI("Disable mirror %{public}d", disableOrNot);
529     return SingletonContainer::Get<ScreenManagerAdapter>().DisableMirror(disableOrNot);
530 }
531 
RemoveVirtualScreenFromGroup(std::vector<ScreenId> screens)532 DMError ScreenManager::RemoveVirtualScreenFromGroup(std::vector<ScreenId> screens)
533 {
534     WLOGFI("screens.size=%{public}llu", (unsigned long long)screens.size());
535     if (screens.empty()) {
536         WLOGFW("RemoveVirtualScreenFromGroup failed. screens is empty.");
537         return DMError::DM_ERROR_INVALID_PARAM;
538     }
539     if (screens.size() > MAX_SCREEN_SIZE) {
540         WLOGFW("RemoveVirtualScreenFromGroup failed. The screens size is bigger than %{public}u.", MAX_SCREEN_SIZE);
541         return DMError::DM_ERROR_INVALID_PARAM;
542     }
543     SingletonContainer::Get<ScreenManagerAdapter>().RemoveVirtualScreenFromGroup(screens);
544     return DMError::DM_OK;
545 }
546 
CreateVirtualScreen(VirtualScreenOption option)547 ScreenId ScreenManager::CreateVirtualScreen(VirtualScreenOption option)
548 {
549     return pImpl_->CreateVirtualScreen(option);
550 }
551 
CreateVirtualScreen(VirtualScreenOption option)552 ScreenId ScreenManager::Impl::CreateVirtualScreen(VirtualScreenOption option)
553 {
554     //  After the process creating the virtual screen is killed, DMS needs to delete the virtual screen
555     if (virtualScreenAgent_ == nullptr) {
556         virtualScreenAgent_ = new DisplayManagerAgentDefault();
557     }
558     return SingletonContainer::Get<ScreenManagerAdapter>().CreateVirtualScreen(option, virtualScreenAgent_);
559 }
560 
DestroyVirtualScreen(ScreenId screenId)561 DMError ScreenManager::DestroyVirtualScreen(ScreenId screenId)
562 {
563     return SingletonContainer::Get<ScreenManagerAdapter>().DestroyVirtualScreen(screenId);
564 }
565 
SetVirtualScreenSurface(ScreenId screenId,sptr<Surface> surface)566 DMError ScreenManager::SetVirtualScreenSurface(ScreenId screenId, sptr<Surface> surface)
567 {
568     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenSurface(screenId, surface);
569 }
570 
SetVirtualMirrorScreenCanvasRotation(ScreenId screenId,bool rotation)571 DMError ScreenManager::SetVirtualMirrorScreenCanvasRotation(ScreenId screenId, bool rotation)
572 {
573     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualMirrorScreenCanvasRotation(screenId, rotation);
574 }
575 
ResizeVirtualScreen(ScreenId screenId,uint32_t width,uint32_t height)576 DMError ScreenManager::ResizeVirtualScreen(ScreenId screenId, uint32_t width, uint32_t height)
577 {
578     return SingletonContainer::Get<ScreenManagerAdapter>().ResizeVirtualScreen(screenId, width, height);
579 }
580 
SetVirtualMirrorScreenScaleMode(ScreenId screenId,ScreenScaleMode scaleMode)581 DMError ScreenManager::SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode)
582 {
583     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualMirrorScreenScaleMode(screenId, scaleMode);
584 }
585 
GetVirtualScreenFlag(ScreenId screenId)586 VirtualScreenFlag ScreenManager::GetVirtualScreenFlag(ScreenId screenId)
587 {
588     return SingletonContainer::Get<ScreenManagerAdapter>().GetVirtualScreenFlag(screenId);
589 }
590 
SetVirtualScreenFlag(ScreenId screenId,VirtualScreenFlag screenFlag)591 DMError ScreenManager::SetVirtualScreenFlag(ScreenId screenId, VirtualScreenFlag screenFlag)
592 {
593     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenFlag(screenId, screenFlag);
594 }
595 
SetVirtualScreenRefreshRate(ScreenId screenId,uint32_t refreshInterval)596 DMError ScreenManager::SetVirtualScreenRefreshRate(ScreenId screenId, uint32_t refreshInterval)
597 {
598     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenRefreshRate(screenId, refreshInterval);
599 }
600 
SetSpecifiedScreenPower(ScreenId screenId,ScreenPowerState state,PowerStateChangeReason reason)601 bool ScreenManager::SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason)
602 {
603     WLOGFI("screenId:%{public}" PRIu64 ", state:%{public}u, reason:%{public}u", screenId, state, reason);
604     return SingletonContainer::Get<ScreenManagerAdapter>().SetSpecifiedScreenPower(screenId, state, reason);
605 }
606 
SetScreenPowerForAll(ScreenPowerState state,PowerStateChangeReason reason)607 bool ScreenManager::SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason)
608 {
609     WLOGFI("state:%{public}u, reason:%{public}u", state, reason);
610     return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenPowerForAll(state, reason);
611 }
612 
GetScreenPower(ScreenId dmsScreenId)613 ScreenPowerState ScreenManager::GetScreenPower(ScreenId dmsScreenId)
614 {
615     return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenPower(dmsScreenId);
616 }
617 
GetScreenPower()618 ScreenPowerState ScreenManager::GetScreenPower()
619 {
620     return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenPower();
621 }
622 
SetScreenRotationLocked(bool isLocked)623 DMError ScreenManager::SetScreenRotationLocked(bool isLocked)
624 {
625     return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenRotationLocked(isLocked);
626 }
627 
SetScreenRotationLockedFromJs(bool isLocked)628 DMError ScreenManager::SetScreenRotationLockedFromJs(bool isLocked)
629 {
630     return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenRotationLockedFromJs(isLocked);
631 }
632 
IsScreenRotationLocked(bool & isLocked)633 DMError ScreenManager::IsScreenRotationLocked(bool& isLocked)
634 {
635     return SingletonContainer::Get<ScreenManagerAdapter>().IsScreenRotationLocked(isLocked);
636 }
637 
NotifyScreenConnect(sptr<ScreenInfo> info)638 void ScreenManager::Impl::NotifyScreenConnect(sptr<ScreenInfo> info)
639 {
640     std::lock_guard<std::recursive_mutex> lock(mutex_);
641     UpdateScreenInfoLocked(info);
642 }
643 
NotifyScreenDisconnect(ScreenId screenId)644 void ScreenManager::Impl::NotifyScreenDisconnect(ScreenId screenId)
645 {
646     WLOGFI("screenId:%{public}" PRIu64".", screenId);
647     std::lock_guard<std::recursive_mutex> lock(mutex_);
648     screenMap_.erase(screenId);
649 }
650 
NotifyScreenChange(const sptr<ScreenInfo> & screenInfo)651 void ScreenManager::Impl::NotifyScreenChange(const sptr<ScreenInfo>& screenInfo)
652 {
653     std::lock_guard<std::recursive_mutex> lock(mutex_);
654     UpdateScreenInfoLocked(screenInfo);
655 }
656 
NotifyScreenChange(const std::vector<sptr<ScreenInfo>> & screenInfos)657 void ScreenManager::Impl::NotifyScreenChange(const std::vector<sptr<ScreenInfo>>& screenInfos)
658 {
659     std::lock_guard<std::recursive_mutex> lock(mutex_);
660     for (auto screenInfo : screenInfos) {
661         UpdateScreenInfoLocked(screenInfo);
662     }
663 }
664 
UpdateScreenInfoLocked(sptr<ScreenInfo> screenInfo)665 bool ScreenManager::Impl::UpdateScreenInfoLocked(sptr<ScreenInfo> screenInfo)
666 {
667     if (screenInfo == nullptr) {
668         WLOGFE("displayInfo is null");
669         return false;
670     }
671     ScreenId screenId = screenInfo->GetScreenId();
672     WLOGFD("screenId:%{public}" PRIu64".", screenId);
673     if (screenId == SCREEN_ID_INVALID) {
674         WLOGFE("displayId is invalid.");
675         return false;
676     }
677     auto iter = screenMap_.find(screenId);
678     if (iter != screenMap_.end() && iter->second != nullptr) {
679         WLOGFD("Screen Info Updated: %{public}s",
680             GetScreenInfoSrting(screenInfo).c_str());
681         iter->second->UpdateScreenInfo(screenInfo);
682         return true;
683     }
684     sptr<Screen> screen = new Screen(screenInfo);
685     screenMap_[screenId] = screen;
686     return true;
687 }
688 
GetScreenInfoSrting(sptr<ScreenInfo> screenInfo)689 std::string ScreenManager::Impl::GetScreenInfoSrting(sptr<ScreenInfo> screenInfo)
690 {
691     if (screenInfo == nullptr) {
692         WLOGFE("screenInfo nullptr.");
693         return "";
694     }
695     std::ostringstream oss;
696     oss <<  "Screen ID: " << screenInfo->GetScreenId() << ", ";
697     oss <<  "Name: " << screenInfo->GetName() << ", ";
698     oss <<  "VirtualWidth: " << screenInfo->GetVirtualWidth() << ", ";
699     oss <<  "VirtualHeight: " << screenInfo->GetVirtualHeight() << ", ";
700     oss <<  "VirtualPixelRatio: " << screenInfo->GetVirtualPixelRatio() << ", ";
701     oss <<  "Rotation: " << static_cast<int32_t>(screenInfo->GetRotation());
702     return oss.str();
703 }
704 
isAllListenersRemoved() const705 bool ScreenManager::Impl::isAllListenersRemoved() const
706 {
707     return screenListeners_.empty() && screenGroupListeners_.empty() && virtualScreenGroupListeners_.empty();
708 }
709 
OnRemoteDied()710 void ScreenManager::Impl::OnRemoteDied()
711 {
712     WLOGFD("dms is died");
713     std::lock_guard<std::recursive_mutex> lock(mutex_);
714     screenManagerListener_ = nullptr;
715     virtualScreenAgent_ = nullptr;
716 }
717 
OnRemoteDied()718 void ScreenManager::OnRemoteDied()
719 {
720     pImpl_->OnRemoteDied();
721 }
722 
SetVirtualScreenMaxRefreshRate(ScreenId id,uint32_t refreshRate,uint32_t & actualRefreshRate)723 DMError ScreenManager::SetVirtualScreenMaxRefreshRate(ScreenId id, uint32_t refreshRate,
724     uint32_t& actualRefreshRate)
725 {
726     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenMaxRefreshRate(id,
727         refreshRate, actualRefreshRate);
728 }
729 
SetScreenSkipProtectedWindow(const std::vector<ScreenId> & screenIds,bool isEnable)730 DMError ScreenManager::SetScreenSkipProtectedWindow(const std::vector<ScreenId>& screenIds, bool isEnable)
731 {
732     if (screenIds.empty()) {
733         WLOGFI("screenIds is null");
734         return DMError::DM_ERROR_INVALID_PARAM;
735     }
736     return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenSkipProtectedWindow(screenIds, isEnable);
737 }
738 } // namespace OHOS::Rosen