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