• 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 "singleton_delegator.h"
25 #include "window_manager_hilog.h"
26 
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 }
33 class ScreenManager::Impl : public RefBase {
34 public:
35     Impl() = default;
36     ~Impl();
37     static inline SingletonDelegator<ScreenManager> delegator;
38     ScreenId CreateVirtualScreen(VirtualScreenOption option);
39     sptr<Screen> GetScreen(ScreenId screenId);
40     sptr<ScreenGroup> GetScreenGroup(ScreenId screenId);
41     std::vector<sptr<Screen>> GetAllScreens();
42     bool RegisterScreenListener(sptr<IScreenListener> listener);
43     bool UnregisterScreenListener(sptr<IScreenListener> listener);
44     bool RegisterScreenGroupListener(sptr<IScreenGroupListener> listener);
45     bool UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener);
46     bool RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener);
47     bool UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener);
48     void OnRemoteDied();
49 
50 private:
51     void NotifyScreenConnect(sptr<ScreenInfo> info);
52     void NotifyScreenDisconnect(ScreenId);
53     void NotifyScreenChange(const sptr<ScreenInfo>& screenInfo);
54     void NotifyScreenChange(const std::vector<sptr<ScreenInfo>>& screenInfos);
55     bool UpdateScreenInfoLocked(sptr<ScreenInfo>);
56     bool RegisterDisplayManagerAgent();
57     bool UnregisterDisplayManagerAgent();
58     bool isAllListenersRemoved() const;
59 
60     class ScreenManagerListener;
61     sptr<ScreenManagerListener> screenManagerListener_;
62     std::map<ScreenId, sptr<Screen>> screenMap_;
63     std::map<ScreenId, sptr<ScreenGroup>> screenGroupMap_;
64     std::recursive_mutex mutex_;
65     std::set<sptr<IScreenListener>> screenListeners_;
66     std::set<sptr<IScreenGroupListener>> screenGroupListeners_;
67     std::set<sptr<IVirtualScreenGroupListener>> virtualScreenGroupListeners_;
68     sptr<IDisplayManagerAgent> virtualScreenAgent_ = nullptr;
69 };
70 
71 class ScreenManager::Impl::ScreenManagerListener : public DisplayManagerAgentDefault {
72 public:
ScreenManagerListener(sptr<Impl> impl)73     ScreenManagerListener(sptr<Impl> impl) : pImpl_(impl)
74     {
75     }
76 
OnScreenConnect(sptr<ScreenInfo> screenInfo)77     void OnScreenConnect(sptr<ScreenInfo> screenInfo)
78     {
79         if (screenInfo == nullptr || screenInfo->GetScreenId() == SCREEN_ID_INVALID) {
80             WLOGFE("OnScreenConnect, screenInfo is invalid.");
81             return;
82         }
83         if (pImpl_ == nullptr) {
84             WLOGFE("OnScreenConnect, impl is nullptr.");
85             return;
86         }
87         pImpl_->NotifyScreenConnect(screenInfo);
88         std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
89         for (auto listener : pImpl_->screenListeners_) {
90             listener->OnConnect(screenInfo->GetScreenId());
91         }
92     };
93 
OnScreenDisconnect(ScreenId screenId)94     void OnScreenDisconnect(ScreenId screenId)
95     {
96         if (screenId == SCREEN_ID_INVALID) {
97             WLOGFE("OnScreenDisconnect, screenId is invalid.");
98             return;
99         }
100         if (pImpl_ == nullptr) {
101             WLOGFE("OnScreenDisconnect, impl is nullptr.");
102             return;
103         }
104         pImpl_->NotifyScreenDisconnect(screenId);
105         std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
106         for (auto listener : pImpl_->screenListeners_) {
107             listener->OnDisconnect(screenId);
108         }
109     };
110 
OnScreenChange(const sptr<ScreenInfo> & screenInfo,ScreenChangeEvent event)111     void OnScreenChange(const sptr<ScreenInfo>& screenInfo, ScreenChangeEvent event)
112     {
113         if (screenInfo == nullptr) {
114             WLOGFE("OnScreenChange, screenInfo is null.");
115             return;
116         }
117         if (pImpl_ == nullptr) {
118             WLOGFE("OnScreenChange, impl is nullptr.");
119             return;
120         }
121         WLOGFD("OnScreenChange. event %{public}u", event);
122         pImpl_->NotifyScreenChange(screenInfo);
123         std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
124         for (auto listener: pImpl_->screenListeners_) {
125             listener->OnChange(screenInfo->GetScreenId());
126         }
127     };
128 
OnScreenGroupChange(const std::string & trigger,const std::vector<sptr<ScreenInfo>> & screenInfos,ScreenGroupChangeEvent groupEvent)129     void OnScreenGroupChange(const std::string& trigger, const std::vector<sptr<ScreenInfo>>& screenInfos,
130         ScreenGroupChangeEvent groupEvent)
131     {
132         if (screenInfos.empty()) {
133             WLOGFE("screenInfos is empty.");
134             return;
135         }
136         if (pImpl_ == nullptr) {
137             WLOGFE("impl is nullptr.");
138             return;
139         }
140         WLOGFD("trigger %{public}s, event %{public}u", trigger.c_str(), groupEvent);
141         pImpl_->NotifyScreenChange(screenInfos);
142         std::vector<ScreenId> screenIds;
143         for (auto screenInfo : screenInfos) {
144             if (screenInfo->GetScreenId() != SCREEN_ID_INVALID) {
145                 screenIds.push_back(screenInfo->GetScreenId());
146             }
147         }
148         std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
149         for (auto listener: pImpl_->screenGroupListeners_) {
150             listener->OnChange(screenIds, groupEvent);
151         }
152         NotifyVirtualScreenGroupChanged(screenInfos[0], trigger, screenIds, groupEvent);
153     };
154 private:
NotifyVirtualScreenGroupChanged(sptr<ScreenInfo> screenInfo,const std::string trigger,std::vector<ScreenId> & ids,ScreenGroupChangeEvent groupEvent)155     void NotifyVirtualScreenGroupChanged(sptr<ScreenInfo> screenInfo,
156         const std::string trigger, std::vector<ScreenId>& ids, ScreenGroupChangeEvent groupEvent)
157     {
158         // check for invalid scene
159         if (pImpl_->virtualScreenGroupListeners_.size() <= 0) {
160             WLOGFW("no virtual screnn group listeners");
161             return;
162         }
163         if (screenInfo->GetType() != ScreenType::VIRTUAL) {
164             WLOGFW("not virtual screen type: %{public}u", screenInfo->GetType());
165             return;
166         }
167 
168         // get the parent of screen
169         ScreenId parent = groupEvent == ScreenGroupChangeEvent::ADD_TO_GROUP ?
170             screenInfo->GetParentId() : screenInfo->GetLastParentId();
171         WLOGFD("parentId=[%{public}llu], lastParentId=[%{public}llu]", (unsigned long long)screenInfo->GetParentId(),
172             (unsigned long long)screenInfo->GetLastParentId());
173         if (parent == INVALID_SCREEN_ID) {
174             WLOGFE("parentId is invalid");
175             return;
176         }
177         auto screenGroup = pImpl_->GetScreenGroup(parent);
178         if (screenGroup == nullptr) {
179             WLOGFE("screenGroup is null");
180             return;
181         }
182 
183         // notify mirror
184         ScreenCombination comb = screenGroup->GetCombination();
185         WLOGFD("comb %{public}u", comb);
186         IVirtualScreenGroupListener::ChangeInfo changeInfo = {groupEvent, trigger, ids};
187         for (auto listener: pImpl_->virtualScreenGroupListeners_) {
188             if (comb == ScreenCombination::SCREEN_MIRROR) {
189                 listener->OnMirrorChange(changeInfo);
190             }
191         }
192     }
193     sptr<Impl> pImpl_;
194 };
195 
WM_IMPLEMENT_SINGLE_INSTANCE(ScreenManager)196 WM_IMPLEMENT_SINGLE_INSTANCE(ScreenManager)
197 
198 ScreenManager::ScreenManager()
199 {
200     pImpl_ = new Impl();
201 }
202 
~ScreenManager()203 ScreenManager::~ScreenManager()
204 {
205 }
206 
~Impl()207 ScreenManager::Impl::~Impl()
208 {
209     std::lock_guard<std::recursive_mutex> lock(mutex_);
210     UnregisterDisplayManagerAgent();
211 }
212 
GetScreen(ScreenId screenId)213 sptr<Screen> ScreenManager::Impl::GetScreen(ScreenId screenId)
214 {
215     auto screenInfo = SingletonContainer::Get<ScreenManagerAdapter>().GetScreenInfo(screenId);
216     std::lock_guard<std::recursive_mutex> lock(mutex_);
217     if (!UpdateScreenInfoLocked(screenInfo)) {
218         screenMap_.erase(screenId);
219         return nullptr;
220     }
221     return screenMap_[screenId];
222 }
223 
GetScreenById(ScreenId screenId)224 sptr<Screen> ScreenManager::GetScreenById(ScreenId screenId)
225 {
226     return pImpl_->GetScreen(screenId);
227 }
228 
GetScreenGroup(ScreenId screenId)229 sptr<ScreenGroup> ScreenManager::Impl::GetScreenGroup(ScreenId screenId)
230 {
231     auto screenGroupInfo = SingletonContainer::Get<ScreenManagerAdapter>().GetScreenGroupInfoById(screenId);
232     std::lock_guard<std::recursive_mutex> lock(mutex_);
233     if (screenGroupInfo == nullptr) {
234         WLOGFE("screenGroupInfo is null");
235         screenGroupMap_.erase(screenId);
236         return nullptr;
237     }
238     auto iter = screenGroupMap_.find(screenId);
239     if (iter != screenGroupMap_.end() && iter->second != nullptr) {
240         WLOGFI("get screenGroup in screenGroup map");
241         iter->second->UpdateScreenGroupInfo(screenGroupInfo);
242         return iter->second;
243     }
244     sptr<ScreenGroup> screenGroup = new ScreenGroup(screenGroupInfo);
245     screenGroupMap_[screenId] = screenGroup;
246     return screenGroup;
247 }
248 
GetScreenGroup(ScreenId screenId)249 sptr<ScreenGroup> ScreenManager::GetScreenGroup(ScreenId screenId)
250 {
251     return pImpl_->GetScreenGroup(screenId);
252 }
253 
GetAllScreens()254 std::vector<sptr<Screen>> ScreenManager::Impl::GetAllScreens()
255 {
256     auto screenInfos = SingletonContainer::Get<ScreenManagerAdapter>().GetAllScreenInfos();
257     std::vector<sptr<Screen>> screens;
258     std::lock_guard<std::recursive_mutex> lock(mutex_);
259     for (auto info: screenInfos) {
260         if (UpdateScreenInfoLocked(info)) {
261             screens.emplace_back(screenMap_[info->GetScreenId()]);
262         }
263     }
264     screenMap_.clear();
265     for (auto screen: screens) {
266         screenMap_.insert(std::make_pair(screen->GetId(), screen));
267     }
268     return screens;
269 }
270 
GetAllScreens()271 std::vector<sptr<Screen>> ScreenManager::GetAllScreens()
272 {
273     return pImpl_->GetAllScreens();
274 }
275 
RegisterScreenListener(sptr<IScreenListener> listener)276 bool ScreenManager::Impl::RegisterScreenListener(sptr<IScreenListener> listener)
277 {
278     std::lock_guard<std::recursive_mutex> lock(mutex_);
279     bool regSucc = RegisterDisplayManagerAgent();
280     if (regSucc) {
281         screenListeners_.insert(listener);
282     }
283     return regSucc;
284 }
285 
RegisterScreenListener(sptr<IScreenListener> listener)286 bool ScreenManager::RegisterScreenListener(sptr<IScreenListener> listener)
287 {
288     if (listener == nullptr) {
289         WLOGFE("RegisterScreenListener listener is nullptr.");
290         return false;
291     }
292     return pImpl_->RegisterScreenListener(listener);
293 }
294 
UnregisterScreenListener(sptr<IScreenListener> listener)295 bool ScreenManager::Impl::UnregisterScreenListener(sptr<IScreenListener> listener)
296 {
297     std::lock_guard<std::recursive_mutex> lock(mutex_);
298     auto iter = std::find(screenListeners_.begin(), screenListeners_.end(), listener);
299     if (iter == screenListeners_.end()) {
300         WLOGFE("could not find this listener");
301         return false;
302     }
303     screenListeners_.erase(iter);
304     return isAllListenersRemoved() ? UnregisterDisplayManagerAgent() : true;
305 }
306 
UnregisterScreenListener(sptr<IScreenListener> listener)307 bool ScreenManager::UnregisterScreenListener(sptr<IScreenListener> listener)
308 {
309     if (listener == nullptr) {
310         WLOGFE("UnregisterScreenListener listener is nullptr.");
311         return false;
312     }
313     return pImpl_->UnregisterScreenListener(listener);
314 }
315 
RegisterScreenGroupListener(sptr<IScreenGroupListener> listener)316 bool ScreenManager::Impl::RegisterScreenGroupListener(sptr<IScreenGroupListener> listener)
317 {
318     std::lock_guard<std::recursive_mutex> lock(mutex_);
319     bool regSucc = RegisterDisplayManagerAgent();
320     if (regSucc) {
321         screenGroupListeners_.insert(listener);
322     }
323     return regSucc;
324 }
325 
RegisterScreenGroupListener(sptr<IScreenGroupListener> listener)326 bool ScreenManager::RegisterScreenGroupListener(sptr<IScreenGroupListener> listener)
327 {
328     if (listener == nullptr) {
329         WLOGFE("RegisterScreenGroupListener listener is nullptr.");
330         return false;
331     }
332     return pImpl_->RegisterScreenGroupListener(listener);
333 }
334 
UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener)335 bool ScreenManager::Impl::UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener)
336 {
337     std::lock_guard<std::recursive_mutex> lock(mutex_);
338     auto iter = std::find(screenGroupListeners_.begin(), screenGroupListeners_.end(), listener);
339     if (iter == screenGroupListeners_.end()) {
340         WLOGFE("could not find this listener");
341         return false;
342     }
343     screenGroupListeners_.erase(iter);
344     return isAllListenersRemoved() ? UnregisterDisplayManagerAgent() : true;
345 }
346 
UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener)347 bool ScreenManager::UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener)
348 {
349     if (listener == nullptr) {
350         WLOGFE("UnregisterScreenGroupListener listener is nullptr.");
351         return false;
352     }
353     return pImpl_->UnregisterScreenGroupListener(listener);
354 }
355 
RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)356 bool ScreenManager::Impl::RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)
357 {
358     std::lock_guard<std::recursive_mutex> lock(mutex_);
359     bool regSucc = RegisterDisplayManagerAgent();
360     if (regSucc) {
361         virtualScreenGroupListeners_.insert(listener);
362     }
363     return regSucc;
364 }
365 
RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)366 bool ScreenManager::RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)
367 {
368     if (listener == nullptr) {
369         WLOGFE("RegisterVirtualScreenGroupListener listener is nullptr.");
370         return false;
371     }
372     return pImpl_->RegisterVirtualScreenGroupListener(listener);
373 }
374 
UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)375 bool ScreenManager::Impl::UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)
376 {
377     std::lock_guard<std::recursive_mutex> lock(mutex_);
378     auto iter = std::find(virtualScreenGroupListeners_.begin(), virtualScreenGroupListeners_.end(), listener);
379     if (iter == virtualScreenGroupListeners_.end()) {
380         WLOGFE("could not find this listener");
381         return false;
382     }
383     virtualScreenGroupListeners_.erase(iter);
384     return isAllListenersRemoved() ? UnregisterDisplayManagerAgent() : true;
385 }
386 
UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)387 bool ScreenManager::UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)
388 {
389     if (listener == nullptr) {
390         WLOGFE("UnregisterVirtualScreenGroupListener listener is nullptr.");
391         return false;
392     }
393     return pImpl_->UnregisterVirtualScreenGroupListener(listener);
394 }
395 
RegisterDisplayManagerAgent()396 bool ScreenManager::Impl::RegisterDisplayManagerAgent()
397 {
398     bool regSucc = true;
399     if (screenManagerListener_ == nullptr) {
400         screenManagerListener_ = new ScreenManagerListener(this);
401         bool regSucc = SingletonContainer::Get<ScreenManagerAdapter>().RegisterDisplayManagerAgent(
402             screenManagerListener_, DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
403         if (!regSucc) {
404             screenManagerListener_ = nullptr;
405             WLOGFW("RegisterDisplayManagerAgent failed !");
406         }
407     }
408     return regSucc;
409 }
410 
UnregisterDisplayManagerAgent()411 bool ScreenManager::Impl::UnregisterDisplayManagerAgent()
412 {
413     bool unRegSucc = true;
414     if (screenManagerListener_ != nullptr) {
415         unRegSucc = SingletonContainer::Get<ScreenManagerAdapter>().UnregisterDisplayManagerAgent(
416             screenManagerListener_, DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
417         screenManagerListener_ = nullptr;
418         if (!unRegSucc) {
419             WLOGFW("UnregisterDisplayManagerAgent failed!");
420         }
421     }
422     return unRegSucc;
423 }
424 
MakeExpand(const std::vector<ExpandOption> & options)425 ScreenId ScreenManager::MakeExpand(const std::vector<ExpandOption>& options)
426 {
427     WLOGFI("Make expand");
428     if (options.empty()) {
429         return SCREEN_ID_INVALID;
430     }
431     if (options.size() > MAX_SCREEN_SIZE) {
432         WLOGFW("Make expand failed. The options size is bigger than %{public}u.", MAX_SCREEN_SIZE);
433         return SCREEN_ID_INVALID;
434     }
435     std::vector<ScreenId> screenIds;
436     std::vector<Point> startPoints;
437     for (auto& option: options) {
438         if (std::find(screenIds.begin(), screenIds.end(), option.screenId_) != screenIds.end()) {
439             continue;
440         }
441         screenIds.emplace_back(option.screenId_);
442         startPoints.emplace_back(Point(option.startX_, option.startY_));
443     }
444     ScreenId group = SingletonContainer::Get<ScreenManagerAdapter>().MakeExpand(screenIds, startPoints);
445     if (group == SCREEN_ID_INVALID) {
446         WLOGFI("Make expand failed");
447     }
448     return group;
449 }
450 
MakeMirror(ScreenId mainScreenId,std::vector<ScreenId> mirrorScreenId)451 ScreenId ScreenManager::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId)
452 {
453     WLOGFI("Make mirror for screen: %{public}" PRIu64"", mainScreenId);
454     if (mirrorScreenId.size() > MAX_SCREEN_SIZE) {
455         WLOGFW("Make Mirror failed. The mirrorScreenId size is bigger than %{public}u.", MAX_SCREEN_SIZE);
456         return SCREEN_ID_INVALID;
457     }
458     ScreenId group = SingletonContainer::Get<ScreenManagerAdapter>().MakeMirror(mainScreenId, mirrorScreenId);
459     if (group == SCREEN_ID_INVALID) {
460         WLOGFI("create mirror failed");
461     }
462     return group;
463 }
464 
RemoveVirtualScreenFromGroup(std::vector<ScreenId> screens)465 DMError ScreenManager::RemoveVirtualScreenFromGroup(std::vector<ScreenId> screens)
466 {
467     WLOGFI("screens.size=%{public}llu", (unsigned long long)screens.size());
468     if (screens.empty()) {
469         WLOGFW("RemoveVirtualScreenFromGroup failed. screens is empty.");
470         return DMError::DM_ERROR_INVALID_PARAM;
471     }
472     if (screens.size() > MAX_SCREEN_SIZE) {
473         WLOGFW("RemoveVirtualScreenFromGroup failed. The screens size is bigger than %{public}u.", MAX_SCREEN_SIZE);
474         return DMError::DM_ERROR_INVALID_PARAM;
475     }
476     SingletonContainer::Get<ScreenManagerAdapter>().RemoveVirtualScreenFromGroup(screens);
477     return DMError::DM_OK;
478 }
479 
CreateVirtualScreen(VirtualScreenOption option)480 ScreenId ScreenManager::CreateVirtualScreen(VirtualScreenOption option)
481 {
482     return pImpl_->CreateVirtualScreen(option);
483 }
484 
CreateVirtualScreen(VirtualScreenOption option)485 ScreenId ScreenManager::Impl::CreateVirtualScreen(VirtualScreenOption option)
486 {
487     //  After the process creating the virtual screen is killed, DMS needs to delete the virtual screen
488     if (virtualScreenAgent_ == nullptr) {
489         virtualScreenAgent_ = new DisplayManagerAgentDefault();
490     }
491     return SingletonContainer::Get<ScreenManagerAdapter>().CreateVirtualScreen(option, virtualScreenAgent_);
492 }
493 
DestroyVirtualScreen(ScreenId screenId)494 DMError ScreenManager::DestroyVirtualScreen(ScreenId screenId)
495 {
496     return SingletonContainer::Get<ScreenManagerAdapter>().DestroyVirtualScreen(screenId);
497 }
498 
SetVirtualScreenSurface(ScreenId screenId,sptr<Surface> surface)499 DMError ScreenManager::SetVirtualScreenSurface(ScreenId screenId, sptr<Surface> surface)
500 {
501     return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenSurface(screenId, surface);
502 }
503 
SetScreenPowerForAll(ScreenPowerState state,PowerStateChangeReason reason)504 bool ScreenManager::SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason)
505 {
506     WLOGFI("state:%{public}u, reason:%{public}u", state, reason);
507     return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenPowerForAll(state, reason);
508 }
509 
GetScreenPower(ScreenId dmsScreenId)510 ScreenPowerState ScreenManager::GetScreenPower(ScreenId dmsScreenId)
511 {
512     return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenPower(dmsScreenId);
513 }
514 
SetScreenRotationLocked(bool isLocked)515 DMError ScreenManager::SetScreenRotationLocked(bool isLocked)
516 {
517     SingletonContainer::Get<ScreenManagerAdapter>().SetScreenRotationLocked(isLocked);
518     return DMError::DM_OK;
519 }
520 
IsScreenRotationLocked()521 bool ScreenManager::IsScreenRotationLocked()
522 {
523     return SingletonContainer::Get<ScreenManagerAdapter>().IsScreenRotationLocked();
524 }
525 
NotifyScreenConnect(sptr<ScreenInfo> info)526 void ScreenManager::Impl::NotifyScreenConnect(sptr<ScreenInfo> info)
527 {
528     std::lock_guard<std::recursive_mutex> lock(mutex_);
529     UpdateScreenInfoLocked(info);
530 }
531 
NotifyScreenDisconnect(ScreenId screenId)532 void ScreenManager::Impl::NotifyScreenDisconnect(ScreenId screenId)
533 {
534     WLOGFI("screenId:%{public}" PRIu64".", screenId);
535     std::lock_guard<std::recursive_mutex> lock(mutex_);
536     screenMap_.erase(screenId);
537 }
538 
NotifyScreenChange(const sptr<ScreenInfo> & screenInfo)539 void ScreenManager::Impl::NotifyScreenChange(const sptr<ScreenInfo>& screenInfo)
540 {
541     std::lock_guard<std::recursive_mutex> lock(mutex_);
542     UpdateScreenInfoLocked(screenInfo);
543 }
544 
NotifyScreenChange(const std::vector<sptr<ScreenInfo>> & screenInfos)545 void ScreenManager::Impl::NotifyScreenChange(const std::vector<sptr<ScreenInfo>>& screenInfos)
546 {
547     std::lock_guard<std::recursive_mutex> lock(mutex_);
548     for (auto screenInfo : screenInfos) {
549         UpdateScreenInfoLocked(screenInfo);
550     }
551 }
552 
UpdateScreenInfoLocked(sptr<ScreenInfo> screenInfo)553 bool ScreenManager::Impl::UpdateScreenInfoLocked(sptr<ScreenInfo> screenInfo)
554 {
555     if (screenInfo == nullptr) {
556         WLOGFE("displayInfo is null");
557         return false;
558     }
559     ScreenId screenId = screenInfo->GetScreenId();
560     WLOGFI("screenId:%{public}" PRIu64".", screenId);
561     if (screenId == SCREEN_ID_INVALID) {
562         WLOGFE("displayId is invalid.");
563         return false;
564     }
565     auto iter = screenMap_.find(screenId);
566     if (iter != screenMap_.end() && iter->second != nullptr) {
567         WLOGFI("get screen in screen map");
568         iter->second->UpdateScreenInfo(screenInfo);
569         return true;
570     }
571     sptr<Screen> screen = new Screen(screenInfo);
572     screenMap_[screenId] = screen;
573     return true;
574 }
575 
isAllListenersRemoved() const576 bool ScreenManager::Impl::isAllListenersRemoved() const
577 {
578     return screenListeners_.empty() && screenGroupListeners_.empty() && virtualScreenGroupListeners_.empty();
579 }
580 
OnRemoteDied()581 void ScreenManager::Impl::OnRemoteDied()
582 {
583     WLOGFI("dms is died");
584     std::lock_guard<std::recursive_mutex> lock(mutex_);
585     screenManagerListener_ = nullptr;
586     virtualScreenAgent_ = nullptr;
587 }
588 
OnRemoteDied()589 void ScreenManager::OnRemoteDied()
590 {
591     pImpl_->OnRemoteDied();
592 }
593 } // namespace OHOS::Rosen