• 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 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     DMError SetVirtualScreenAutoRotation(ScreenId screenId, bool enable);
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             TLOGE(WmsLogTag::DMS, "screenInfo is invalid.");
88             return;
89         }
90         if (pImpl_ == nullptr) {
91             TLOGE(WmsLogTag::DMS, "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             TLOGE(WmsLogTag::DMS, "screenId is invalid.");
105             return;
106         }
107         if (pImpl_ == nullptr) {
108             TLOGE(WmsLogTag::DMS, "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             TLOGE(WmsLogTag::DMS, "screenInfo is null.");
122             return;
123         }
124         if (pImpl_ == nullptr) {
125             TLOGE(WmsLogTag::DMS, "impl is nullptr.");
126             return;
127         }
128         TLOGD(WmsLogTag::DMS, "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             TLOGE(WmsLogTag::DMS, "screenInfos is empty.");
141             return;
142         }
143         if (pImpl_ == nullptr) {
144             TLOGE(WmsLogTag::DMS, "impl is nullptr.");
145             return;
146         }
147         TLOGD(WmsLogTag::DMS, "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             TLOGE(WmsLogTag::DMS, "screenInfo is nullptr");
167             return;
168         }
169         // check for invalid scene
170         if (pImpl_->virtualScreenGroupListeners_.size() <= 0) {
171             TLOGW(WmsLogTag::DMS, "no virtual screen group listeners");
172             return;
173         }
174         if (screenInfo->GetType() != ScreenType::VIRTUAL) {
175             TLOGW(WmsLogTag::DMS, "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         TLOGD(WmsLogTag::DMS, "parentId=[%{public}llu], lastParentId=[%{public}llu]",
183             (unsigned long long)screenInfo->GetParentId(), (unsigned long long)screenInfo->GetLastParentId());
184         if (parent == INVALID_SCREEN_ID) {
185             TLOGE(WmsLogTag::DMS, "parentId is invalid");
186             return;
187         }
188         auto screenGroup = pImpl_->GetScreenGroup(parent);
189         if (screenGroup == nullptr) {
190             TLOGE(WmsLogTag::DMS, "screenGroup is null");
191             return;
192         }
193 
194         // notify mirror
195         ScreenCombination comb = screenGroup->GetCombination();
196         TLOGD(WmsLogTag::DMS, "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     TLOGD(WmsLogTag::DMS, "Create instance");
217 }
218 
~ScreenManager()219 ScreenManager::~ScreenManager()
220 {
221     TLOGI(WmsLogTag::DMS, "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         TLOGE(WmsLogTag::DMS, "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         TLOGE(WmsLogTag::DMS, "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         TLOGE(WmsLogTag::DMS, "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         TLOGE(WmsLogTag::DMS, "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         TLOGE(WmsLogTag::DMS, "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         TLOGE(WmsLogTag::DMS, "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         TLOGE(WmsLogTag::DMS, "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         TLOGE(WmsLogTag::DMS, "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         TLOGE(WmsLogTag::DMS, "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         TLOGE(WmsLogTag::DMS, "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             TLOGW(WmsLogTag::DMS, "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             TLOGW(WmsLogTag::DMS, "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     TLOGD(WmsLogTag::DMS, "Make expand");
444     if (options.empty()) {
445         return DMError::DM_ERROR_INVALID_PARAM;
446     }
447     if (options.size() > MAX_SCREEN_SIZE) {
448         TLOGW(WmsLogTag::DMS, "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         TLOGE(WmsLogTag::DMS, "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     TLOGD(WmsLogTag::DMS, "start Make UniqueScreen");
476     if (screenIds.empty()) {
477         TLOGE(WmsLogTag::DMS, "screenIds is null");
478         return DMError::DM_ERROR_INVALID_PARAM;
479     }
480     if (screenIds.size() > MAX_SCREEN_SIZE) {
481         TLOGW(WmsLogTag::DMS, "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     TLOGI(WmsLogTag::DMS, "Make mirror for screen: %{public}" PRIu64"", mainScreenId);
491     if (mirrorScreenId.size() > MAX_SCREEN_SIZE) {
492         TLOGW(WmsLogTag::DMS, "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         TLOGE(WmsLogTag::DMS, "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     TLOGI(WmsLogTag::DMS, "Make mirror for screen: %{public}" PRIu64"", mainScreenId);
507     if (mirrorScreenId.size() > MAX_SCREEN_SIZE) {
508         TLOGW(WmsLogTag::DMS, "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         TLOGE(WmsLogTag::DMS, "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     TLOGI(WmsLogTag::DMS, "Make mirror with region for screen: %{public}" PRIu64"", mainScreenId);
523     if (mirrorScreenId.size() > MAX_SCREEN_SIZE) {
524         TLOGW(WmsLogTag::DMS, "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         TLOGE(WmsLogTag::DMS, "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     TLOGI(WmsLogTag::DMS, "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     TLOGI(WmsLogTag::DMS, "mId:%{public}" PRIu64", X:%{public}u, Y:%{public}u,sId:%{public}" PRIu64", X:%{public}u, "
549         "Y:%{public}u", 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     TLOGD(WmsLogTag::DMS, "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     TLOGD(WmsLogTag::DMS, "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     TLOGI(WmsLogTag::DMS, "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     TLOGI(WmsLogTag::DMS, "screens.size=%{public}llu", (unsigned long long)screens.size());
583     if (screens.empty()) {
584         TLOGW(WmsLogTag::DMS, "RemoveVirtualScreenFromGroup failed. screens is empty.");
585         return DMError::DM_ERROR_INVALID_PARAM;
586     }
587     if (screens.size() > MAX_SCREEN_SIZE) {
588         TLOGW(WmsLogTag::DMS, "RemoveVirtualScreenFromGroup failed. Screens size bigger than %{public}u.",
589             MAX_SCREEN_SIZE);
590         return DMError::DM_ERROR_INVALID_PARAM;
591     }
592     SingletonContainer::Get<ScreenManagerAdapter>().RemoveVirtualScreenFromGroup(screens);
593     return DMError::DM_OK;
594 }
595 
CreateVirtualScreen(VirtualScreenOption option)596 ScreenId ScreenManager::CreateVirtualScreen(VirtualScreenOption option)
597 {
598     return pImpl_->CreateVirtualScreen(option);
599 }
600 
CreateVirtualScreen(VirtualScreenOption option)601 ScreenId ScreenManager::Impl::CreateVirtualScreen(VirtualScreenOption option)
602 {
603     //  After the process creating the virtual screen is killed, DMS needs to delete the virtual screen
604     std::lock_guard<std::mutex> agentLock(virtualScreenAgentMutex_);
605     if (virtualScreenAgent_ == nullptr) {
606         virtualScreenAgent_ = new DisplayManagerAgentDefault();
607     }
608     return SingletonContainer::Get<ScreenManagerAdapter>().CreateVirtualScreen(option, virtualScreenAgent_);
609 }
610 
DestroyVirtualScreen(ScreenId screenId)611 DMError ScreenManager::DestroyVirtualScreen(ScreenId screenId)
612 {
613     return SingletonContainer::Get<ScreenManagerAdapter>().DestroyVirtualScreen(screenId);
614 }
615 
SetVirtualScreenSurface(ScreenId screenId,sptr<Surface> surface)616 DMError ScreenManager::SetVirtualScreenSurface(ScreenId screenId, sptr<Surface> surface)
617 {
618     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenSurface(screenId, surface);
619 }
620 
AddVirtualScreenBlockList(const std::vector<int32_t> & persistentIds)621 DMError ScreenManager::AddVirtualScreenBlockList(const std::vector<int32_t>& persistentIds)
622 {
623     return SingletonContainer::Get<ScreenManagerAdapter>().AddVirtualScreenBlockList(persistentIds);
624 }
625 
RemoveVirtualScreenBlockList(const std::vector<int32_t> & persistentIds)626 DMError ScreenManager::RemoveVirtualScreenBlockList(const std::vector<int32_t>& persistentIds)
627 {
628     return SingletonContainer::Get<ScreenManagerAdapter>().RemoveVirtualScreenBlockList(persistentIds);
629 }
630 
ResizeVirtualScreen(ScreenId screenId,uint32_t width,uint32_t height)631 DMError ScreenManager::ResizeVirtualScreen(ScreenId screenId, uint32_t width, uint32_t height)
632 {
633     return SingletonContainer::Get<ScreenManagerAdapter>().ResizeVirtualScreen(screenId, width, height);
634 }
635 
SetScreenPrivacyMaskImage(ScreenId screenId,const std::shared_ptr<Media::PixelMap> & privacyMaskImg)636 DMError ScreenManager::SetScreenPrivacyMaskImage(ScreenId screenId,
637     const std::shared_ptr<Media::PixelMap>& privacyMaskImg)
638 {
639     return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenPrivacyMaskImage(screenId, privacyMaskImg);
640 }
641 
SetVirtualMirrorScreenCanvasRotation(ScreenId screenId,bool rotation)642 DMError ScreenManager::SetVirtualMirrorScreenCanvasRotation(ScreenId screenId, bool rotation)
643 {
644     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualMirrorScreenCanvasRotation(screenId, rotation);
645 }
646 
SetVirtualMirrorScreenScaleMode(ScreenId screenId,ScreenScaleMode scaleMode)647 DMError ScreenManager::SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode)
648 {
649     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualMirrorScreenScaleMode(screenId, scaleMode);
650 }
651 
GetVirtualScreenFlag(ScreenId screenId)652 VirtualScreenFlag ScreenManager::GetVirtualScreenFlag(ScreenId screenId)
653 {
654     return SingletonContainer::Get<ScreenManagerAdapter>().GetVirtualScreenFlag(screenId);
655 }
656 
SetVirtualScreenFlag(ScreenId screenId,VirtualScreenFlag screenFlag)657 DMError ScreenManager::SetVirtualScreenFlag(ScreenId screenId, VirtualScreenFlag screenFlag)
658 {
659     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenFlag(screenId, screenFlag);
660 }
661 
SetVirtualScreenRefreshRate(ScreenId screenId,uint32_t refreshInterval)662 DMError ScreenManager::SetVirtualScreenRefreshRate(ScreenId screenId, uint32_t refreshInterval)
663 {
664     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenRefreshRate(screenId, refreshInterval);
665 }
666 
SetSpecifiedScreenPower(ScreenId screenId,ScreenPowerState state,PowerStateChangeReason reason)667 bool ScreenManager::SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason)
668 {
669     TLOGI(WmsLogTag::DMS, "screenId:%{public}" PRIu64 ", state:%{public}u, reason:%{public}u", screenId, state, reason);
670     return SingletonContainer::Get<ScreenManagerAdapter>().SetSpecifiedScreenPower(screenId, state, reason);
671 }
672 
SetScreenPowerForAll(ScreenPowerState state,PowerStateChangeReason reason)673 bool ScreenManager::SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason)
674 {
675     TLOGI(WmsLogTag::DMS, "state:%{public}u, reason:%{public}u", state, reason);
676     return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenPowerForAll(state, reason);
677 }
678 
GetScreenPower(ScreenId dmsScreenId)679 ScreenPowerState ScreenManager::GetScreenPower(ScreenId dmsScreenId)
680 {
681     return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenPower(dmsScreenId);
682 }
683 
GetScreenPower()684 ScreenPowerState ScreenManager::GetScreenPower()
685 {
686     return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenPower();
687 }
688 
SetScreenRotationLocked(bool isLocked)689 DMError ScreenManager::SetScreenRotationLocked(bool isLocked)
690 {
691     return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenRotationLocked(isLocked);
692 }
693 
SetScreenRotationLockedFromJs(bool isLocked)694 DMError ScreenManager::SetScreenRotationLockedFromJs(bool isLocked)
695 {
696     return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenRotationLockedFromJs(isLocked);
697 }
698 
IsScreenRotationLocked(bool & isLocked)699 DMError ScreenManager::IsScreenRotationLocked(bool& isLocked)
700 {
701     return SingletonContainer::Get<ScreenManagerAdapter>().IsScreenRotationLocked(isLocked);
702 }
703 
NotifyScreenConnect(sptr<ScreenInfo> info)704 void ScreenManager::Impl::NotifyScreenConnect(sptr<ScreenInfo> info)
705 {
706     std::lock_guard<std::recursive_mutex> lock(mutex_);
707     UpdateScreenInfoLocked(info);
708 }
709 
NotifyScreenDisconnect(ScreenId screenId)710 void ScreenManager::Impl::NotifyScreenDisconnect(ScreenId screenId)
711 {
712     TLOGI(WmsLogTag::DMS, "screenId:%{public}" PRIu64".", screenId);
713     std::lock_guard<std::recursive_mutex> lock(mutex_);
714     screenMap_.erase(screenId);
715 }
716 
NotifyScreenChange(const sptr<ScreenInfo> & screenInfo)717 void ScreenManager::Impl::NotifyScreenChange(const sptr<ScreenInfo>& screenInfo)
718 {
719     std::lock_guard<std::recursive_mutex> lock(mutex_);
720     UpdateScreenInfoLocked(screenInfo);
721 }
722 
NotifyScreenChange(const std::vector<sptr<ScreenInfo>> & screenInfos)723 void ScreenManager::Impl::NotifyScreenChange(const std::vector<sptr<ScreenInfo>>& screenInfos)
724 {
725     std::lock_guard<std::recursive_mutex> lock(mutex_);
726     for (auto screenInfo : screenInfos) {
727         UpdateScreenInfoLocked(screenInfo);
728     }
729 }
730 
UpdateScreenInfoLocked(sptr<ScreenInfo> screenInfo)731 bool ScreenManager::Impl::UpdateScreenInfoLocked(sptr<ScreenInfo> screenInfo)
732 {
733     if (screenInfo == nullptr) {
734         TLOGE(WmsLogTag::DMS, "displayInfo is null");
735         return false;
736     }
737     ScreenId screenId = screenInfo->GetScreenId();
738     TLOGD(WmsLogTag::DMS, "screenId:%{public}" PRIu64".", screenId);
739     if (screenId == SCREEN_ID_INVALID) {
740         TLOGE(WmsLogTag::DMS, "displayId is invalid.");
741         return false;
742     }
743     auto iter = screenMap_.find(screenId);
744     if (iter != screenMap_.end() && iter->second != nullptr) {
745         TLOGD(WmsLogTag::DMS, "Screen Info Updated: %{public}s",
746             GetScreenInfoSrting(screenInfo).c_str());
747         iter->second->UpdateScreenInfo(screenInfo);
748         return true;
749     }
750     sptr<Screen> screen = new Screen(screenInfo);
751     screenMap_[screenId] = screen;
752     return true;
753 }
754 
GetScreenInfoSrting(sptr<ScreenInfo> screenInfo)755 std::string ScreenManager::Impl::GetScreenInfoSrting(sptr<ScreenInfo> screenInfo)
756 {
757     if (screenInfo == nullptr) {
758         TLOGE(WmsLogTag::DMS, "screenInfo nullptr.");
759         return "";
760     }
761     std::ostringstream oss;
762     oss <<  "Screen ID: " << screenInfo->GetScreenId() << ", ";
763     oss <<  "Name: " << screenInfo->GetName() << ", ";
764     oss <<  "VirtualWidth: " << screenInfo->GetVirtualWidth() << ", ";
765     oss <<  "VirtualHeight: " << screenInfo->GetVirtualHeight() << ", ";
766     oss <<  "VirtualPixelRatio: " << screenInfo->GetVirtualPixelRatio() << ", ";
767     oss <<  "Rotation: " << static_cast<int32_t>(screenInfo->GetRotation());
768     return oss.str();
769 }
770 
isAllListenersRemoved() const771 bool ScreenManager::Impl::isAllListenersRemoved() const
772 {
773     return screenListeners_.empty() && screenGroupListeners_.empty() && virtualScreenGroupListeners_.empty();
774 }
775 
OnRemoteDied()776 void ScreenManager::Impl::OnRemoteDied()
777 {
778     TLOGD(WmsLogTag::DMS, "dms is died");
779     {
780         std::lock_guard<std::mutex> agentLock(virtualScreenAgentMutex_);
781         virtualScreenAgent_ = nullptr;
782     }
783 
784     std::lock_guard<std::recursive_mutex> lock(mutex_);
785     screenManagerListener_ = nullptr;
786 }
787 
OnRemoteDied()788 void ScreenManager::OnRemoteDied()
789 {
790     pImpl_->OnRemoteDied();
791 }
792 
SetVirtualScreenStatus(ScreenId screenId,VirtualScreenStatus screenStatus)793 bool ScreenManager::SetVirtualScreenStatus(ScreenId screenId, VirtualScreenStatus screenStatus)
794 {
795     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenStatus(screenId, screenStatus);
796 }
797 
SetVirtualScreenMaxRefreshRate(ScreenId id,uint32_t refreshRate,uint32_t & actualRefreshRate)798 DMError ScreenManager::SetVirtualScreenMaxRefreshRate(ScreenId id, uint32_t refreshRate,
799     uint32_t& actualRefreshRate)
800 {
801     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenMaxRefreshRate(id,
802         refreshRate, actualRefreshRate);
803 }
804 
SetFoldStatusExpandAndLocked(bool locked)805 void ScreenManager::SetFoldStatusExpandAndLocked(bool locked)
806 {
807     return SingletonContainer::Get<ScreenManagerAdapter>().SetFoldStatusExpandAndLocked(locked);
808 }
809 
SetScreenSkipProtectedWindow(const std::vector<ScreenId> & screenIds,bool isEnable)810 DMError ScreenManager::SetScreenSkipProtectedWindow(const std::vector<ScreenId>& screenIds, bool isEnable)
811 {
812     if (screenIds.empty()) {
813         TLOGI(WmsLogTag::DMS, "screenIds is null");
814         return DMError::DM_ERROR_INVALID_PARAM;
815     }
816     return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenSkipProtectedWindow(screenIds, isEnable);
817 }
818 
SetVirtualScreenAutoRotation(ScreenId screenId,bool enable)819 DMError ScreenManager::SetVirtualScreenAutoRotation(ScreenId screenId, bool enable)
820 {
821     return pImpl_->SetVirtualScreenAutoRotation(screenId, enable);
822 }
823 
SetVirtualScreenAutoRotation(ScreenId screenId,bool enable)824 DMError ScreenManager::Impl::SetVirtualScreenAutoRotation(ScreenId screenId, bool enable)
825 {
826     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenAutoRotation(screenId, enable);
827 }
828 
SetScreenPrivacyWindowTagSwitch(ScreenId screenId,const std::vector<std::string> & privacyWindowTag,bool enable)829 DMError ScreenManager::SetScreenPrivacyWindowTagSwitch(ScreenId screenId,
830     const std::vector<std::string>& privacyWindowTag, bool enable)
831 {
832     return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenPrivacyWindowTagSwitch(screenId,
833         privacyWindowTag, enable);
834 }
835 } // namespace OHOS::Rosen
836