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