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