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 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 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
54 private:
55 void NotifyScreenConnect(sptr<ScreenInfo> info);
56 void NotifyScreenDisconnect(ScreenId);
57 void NotifyScreenChange(const sptr<ScreenInfo>& screenInfo);
58 void NotifyScreenChange(const std::vector<sptr<ScreenInfo>>& screenInfos);
59 bool UpdateScreenInfoLocked(sptr<ScreenInfo>);
60 std::string GetScreenInfoSrting(sptr<ScreenInfo> screenInfo);
61 void DlcloseTimeout();
62
63 bool isAllListenersRemoved() const;
64
65 class ScreenManagerListener;
66 sptr<ScreenManagerListener> screenManagerListener_;
67 std::map<ScreenId, sptr<Screen>> screenMap_;
68 std::map<ScreenId, sptr<ScreenGroup>> screenGroupMap_;
69 std::recursive_mutex mutex_;
70 std::set<sptr<IScreenListener>> screenListeners_;
71 std::set<sptr<IScreenGroupListener>> screenGroupListeners_;
72 std::set<sptr<IVirtualScreenGroupListener>> virtualScreenGroupListeners_;
73 sptr<IDisplayManagerAgent> virtualScreenAgent_ = nullptr;
74 };
75
76 class ScreenManager::Impl::ScreenManagerListener : public DisplayManagerAgentDefault {
77 public:
ScreenManagerListener(sptr<Impl> impl)78 explicit ScreenManagerListener(sptr<Impl> impl) : pImpl_(impl)
79 {
80 }
81
OnScreenConnect(sptr<ScreenInfo> screenInfo)82 void OnScreenConnect(sptr<ScreenInfo> screenInfo)
83 {
84 if (screenInfo == nullptr || screenInfo->GetScreenId() == SCREEN_ID_INVALID) {
85 WLOGFE("OnScreenConnect, screenInfo is invalid.");
86 return;
87 }
88 if (pImpl_ == nullptr) {
89 WLOGFE("OnScreenConnect, impl is nullptr.");
90 return;
91 }
92 pImpl_->NotifyScreenConnect(screenInfo);
93 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
94 for (auto listener : pImpl_->screenListeners_) {
95 listener->OnConnect(screenInfo->GetScreenId());
96 }
97 };
98
OnScreenDisconnect(ScreenId screenId)99 void OnScreenDisconnect(ScreenId screenId)
100 {
101 if (screenId == SCREEN_ID_INVALID) {
102 WLOGFE("OnScreenDisconnect, screenId is invalid.");
103 return;
104 }
105 if (pImpl_ == nullptr) {
106 WLOGFE("OnScreenDisconnect, impl is nullptr.");
107 return;
108 }
109 pImpl_->NotifyScreenDisconnect(screenId);
110 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
111 for (auto listener : pImpl_->screenListeners_) {
112 listener->OnDisconnect(screenId);
113 }
114 };
115
OnScreenChange(const sptr<ScreenInfo> & screenInfo,ScreenChangeEvent event)116 void OnScreenChange(const sptr<ScreenInfo>& screenInfo, ScreenChangeEvent event)
117 {
118 if (screenInfo == nullptr) {
119 WLOGFE("OnScreenChange, screenInfo is null.");
120 return;
121 }
122 if (pImpl_ == nullptr) {
123 WLOGFE("OnScreenChange, impl is nullptr.");
124 return;
125 }
126 WLOGFD("OnScreenChange. event %{public}u", event);
127 pImpl_->NotifyScreenChange(screenInfo);
128 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
129 for (auto listener: pImpl_->screenListeners_) {
130 listener->OnChange(screenInfo->GetScreenId());
131 }
132 };
133
OnScreenGroupChange(const std::string & trigger,const std::vector<sptr<ScreenInfo>> & screenInfos,ScreenGroupChangeEvent groupEvent)134 void OnScreenGroupChange(const std::string& trigger, const std::vector<sptr<ScreenInfo>>& screenInfos,
135 ScreenGroupChangeEvent groupEvent)
136 {
137 if (screenInfos.empty()) {
138 WLOGFE("screenInfos is empty.");
139 return;
140 }
141 if (pImpl_ == nullptr) {
142 WLOGFE("impl is nullptr.");
143 return;
144 }
145 WLOGFD("trigger %{public}s, event %{public}u", trigger.c_str(), groupEvent);
146 pImpl_->NotifyScreenChange(screenInfos);
147 std::vector<ScreenId> screenIds;
148 for (auto screenInfo : screenInfos) {
149 if (screenInfo->GetScreenId() != SCREEN_ID_INVALID) {
150 screenIds.push_back(screenInfo->GetScreenId());
151 }
152 }
153 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
154 for (auto listener: pImpl_->screenGroupListeners_) {
155 listener->OnChange(screenIds, groupEvent);
156 }
157 NotifyVirtualScreenGroupChanged(screenInfos[0], trigger, screenIds, groupEvent);
158 };
159 private:
NotifyVirtualScreenGroupChanged(sptr<ScreenInfo> screenInfo,const std::string trigger,std::vector<ScreenId> & ids,ScreenGroupChangeEvent groupEvent)160 void NotifyVirtualScreenGroupChanged(sptr<ScreenInfo> screenInfo,
161 const std::string trigger, std::vector<ScreenId>& ids, ScreenGroupChangeEvent groupEvent)
162 {
163 // check for invalid scene
164 if (pImpl_->virtualScreenGroupListeners_.size() <= 0) {
165 WLOGFW("no virtual screen group listeners");
166 return;
167 }
168 if (screenInfo->GetType() != ScreenType::VIRTUAL) {
169 WLOGFW("not virtual screen type: %{public}u", screenInfo->GetType());
170 return;
171 }
172
173 // get the parent of screen
174 ScreenId parent = groupEvent == ScreenGroupChangeEvent::ADD_TO_GROUP ?
175 screenInfo->GetParentId() : screenInfo->GetLastParentId();
176 WLOGFD("parentId=[%{public}llu], lastParentId=[%{public}llu]", (unsigned long long)screenInfo->GetParentId(),
177 (unsigned long long)screenInfo->GetLastParentId());
178 if (parent == INVALID_SCREEN_ID) {
179 WLOGFE("parentId is invalid");
180 return;
181 }
182 auto screenGroup = pImpl_->GetScreenGroup(parent);
183 if (screenGroup == nullptr) {
184 WLOGFE("screenGroup is null");
185 return;
186 }
187
188 // notify mirror
189 ScreenCombination comb = screenGroup->GetCombination();
190 WLOGFD("comb %{public}u", comb);
191 IVirtualScreenGroupListener::ChangeInfo changeInfo = {groupEvent, trigger, ids};
192 for (auto listener: pImpl_->virtualScreenGroupListeners_) {
193 if (comb == ScreenCombination::SCREEN_MIRROR) {
194 listener->OnMirrorChange(changeInfo);
195 }
196 }
197 }
198 sptr<Impl> pImpl_;
199 };
200
WM_IMPLEMENT_SINGLE_INSTANCE(ScreenManager)201 WM_IMPLEMENT_SINGLE_INSTANCE(ScreenManager)
202
203 extern "C" __attribute__((destructor)) void ScreenManager::Impl::DlcloseTimeout()
204 {
205 usleep(DLCLOSE_TIMEOUT);
206 }
207
ScreenManager()208 ScreenManager::ScreenManager()
209 {
210 pImpl_ = new Impl();
211 WLOGFD("Create screenmanager instance");
212 }
213
~ScreenManager()214 ScreenManager::~ScreenManager()
215 {
216 WLOGFI("Destroy screenmanager instance");
217 }
218
~Impl()219 ScreenManager::Impl::~Impl()
220 {
221 std::lock_guard<std::recursive_mutex> lock(mutex_);
222 UnregisterDisplayManagerAgent();
223 }
224
GetScreen(ScreenId screenId)225 sptr<Screen> ScreenManager::Impl::GetScreen(ScreenId screenId)
226 {
227 auto screenInfo = SingletonContainer::Get<ScreenManagerAdapter>().GetScreenInfo(screenId);
228 std::lock_guard<std::recursive_mutex> lock(mutex_);
229 if (!UpdateScreenInfoLocked(screenInfo)) {
230 screenMap_.erase(screenId);
231 return nullptr;
232 }
233 return screenMap_[screenId];
234 }
235
GetScreenById(ScreenId screenId)236 sptr<Screen> ScreenManager::GetScreenById(ScreenId screenId)
237 {
238 return pImpl_->GetScreen(screenId);
239 }
240
GetScreenGroup(ScreenId screenId)241 sptr<ScreenGroup> ScreenManager::Impl::GetScreenGroup(ScreenId screenId)
242 {
243 auto screenGroupInfo = SingletonContainer::Get<ScreenManagerAdapter>().GetScreenGroupInfoById(screenId);
244 std::lock_guard<std::recursive_mutex> lock(mutex_);
245 if (screenGroupInfo == nullptr) {
246 WLOGFE("screenGroupInfo is null");
247 screenGroupMap_.erase(screenId);
248 return nullptr;
249 }
250 auto iter = screenGroupMap_.find(screenId);
251 if (iter != screenGroupMap_.end() && iter->second != nullptr) {
252 iter->second->UpdateScreenGroupInfo(screenGroupInfo);
253 return iter->second;
254 }
255 sptr<ScreenGroup> screenGroup = new ScreenGroup(screenGroupInfo);
256 screenGroupMap_[screenId] = screenGroup;
257 return screenGroup;
258 }
259
GetScreenGroup(ScreenId screenId)260 sptr<ScreenGroup> ScreenManager::GetScreenGroup(ScreenId screenId)
261 {
262 return pImpl_->GetScreenGroup(screenId);
263 }
264
GetAllScreens(std::vector<sptr<Screen>> & screens)265 DMError ScreenManager::Impl::GetAllScreens(std::vector<sptr<Screen>>& screens)
266 {
267 std::vector<sptr<ScreenInfo>> screenInfos;
268 DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().GetAllScreenInfos(screenInfos);
269 std::lock_guard<std::recursive_mutex> lock(mutex_);
270 for (auto info: screenInfos) {
271 if (UpdateScreenInfoLocked(info)) {
272 screens.emplace_back(screenMap_[info->GetScreenId()]);
273 }
274 }
275 screenMap_.clear();
276 for (auto screen: screens) {
277 screenMap_.insert(std::make_pair(screen->GetId(), screen));
278 }
279 return ret;
280 }
281
GetAllScreens(std::vector<sptr<Screen>> & screens)282 DMError ScreenManager::GetAllScreens(std::vector<sptr<Screen>>& screens)
283 {
284 return pImpl_->GetAllScreens(screens);
285 }
286
RegisterScreenListener(sptr<IScreenListener> listener)287 DMError ScreenManager::Impl::RegisterScreenListener(sptr<IScreenListener> listener)
288 {
289 std::lock_guard<std::recursive_mutex> lock(mutex_);
290 DMError regSucc = RegisterDisplayManagerAgent();
291 if (regSucc == DMError::DM_OK) {
292 screenListeners_.insert(listener);
293 }
294 return regSucc;
295 }
296
RegisterScreenListener(sptr<IScreenListener> listener)297 DMError ScreenManager::RegisterScreenListener(sptr<IScreenListener> listener)
298 {
299 if (listener == nullptr) {
300 WLOGFE("RegisterScreenListener listener is nullptr.");
301 return DMError::DM_ERROR_NULLPTR;
302 }
303 return pImpl_->RegisterScreenListener(listener);
304 }
305
UnregisterScreenListener(sptr<IScreenListener> listener)306 DMError ScreenManager::Impl::UnregisterScreenListener(sptr<IScreenListener> listener)
307 {
308 std::lock_guard<std::recursive_mutex> lock(mutex_);
309 auto iter = std::find(screenListeners_.begin(), screenListeners_.end(), listener);
310 if (iter == screenListeners_.end()) {
311 WLOGFE("could not find this listener");
312 return DMError::DM_ERROR_NULLPTR;
313 }
314 screenListeners_.erase(iter);
315 return isAllListenersRemoved() ? UnregisterDisplayManagerAgent() : DMError::DM_OK;
316 }
317
UnregisterScreenListener(sptr<IScreenListener> listener)318 DMError ScreenManager::UnregisterScreenListener(sptr<IScreenListener> listener)
319 {
320 if (listener == nullptr) {
321 WLOGFE("UnregisterScreenListener listener is nullptr.");
322 return DMError::DM_ERROR_NULLPTR;
323 }
324 return pImpl_->UnregisterScreenListener(listener);
325 }
326
RegisterScreenGroupListener(sptr<IScreenGroupListener> listener)327 DMError ScreenManager::Impl::RegisterScreenGroupListener(sptr<IScreenGroupListener> listener)
328 {
329 std::lock_guard<std::recursive_mutex> lock(mutex_);
330 DMError regSucc = RegisterDisplayManagerAgent();
331 if (regSucc == DMError::DM_OK) {
332 screenGroupListeners_.insert(listener);
333 }
334 return regSucc;
335 }
336
RegisterScreenGroupListener(sptr<IScreenGroupListener> listener)337 DMError ScreenManager::RegisterScreenGroupListener(sptr<IScreenGroupListener> listener)
338 {
339 if (listener == nullptr) {
340 WLOGFE("RegisterScreenGroupListener listener is nullptr.");
341 return DMError::DM_ERROR_NULLPTR;
342 }
343 return pImpl_->RegisterScreenGroupListener(listener);
344 }
345
UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener)346 DMError ScreenManager::Impl::UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener)
347 {
348 std::lock_guard<std::recursive_mutex> lock(mutex_);
349 auto iter = std::find(screenGroupListeners_.begin(), screenGroupListeners_.end(), listener);
350 if (iter == screenGroupListeners_.end()) {
351 WLOGFE("could not find this listener");
352 return DMError::DM_ERROR_NULLPTR;
353 }
354 screenGroupListeners_.erase(iter);
355 return isAllListenersRemoved() ? UnregisterDisplayManagerAgent() : DMError::DM_OK;
356 }
357
UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener)358 DMError ScreenManager::UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener)
359 {
360 if (listener == nullptr) {
361 WLOGFE("UnregisterScreenGroupListener listener is nullptr.");
362 return DMError::DM_ERROR_NULLPTR;
363 }
364 return pImpl_->UnregisterScreenGroupListener(listener);
365 }
366
RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)367 DMError ScreenManager::Impl::RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)
368 {
369 std::lock_guard<std::recursive_mutex> lock(mutex_);
370 DMError regSucc = RegisterDisplayManagerAgent();
371 if (regSucc == DMError::DM_OK) {
372 virtualScreenGroupListeners_.insert(listener);
373 }
374 return regSucc;
375 }
376
RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)377 DMError ScreenManager::RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)
378 {
379 if (listener == nullptr) {
380 WLOGFE("RegisterVirtualScreenGroupListener listener is nullptr.");
381 return DMError::DM_ERROR_NULLPTR;
382 }
383 return pImpl_->RegisterVirtualScreenGroupListener(listener);
384 }
385
UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)386 DMError ScreenManager::Impl::UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)
387 {
388 std::lock_guard<std::recursive_mutex> lock(mutex_);
389 auto iter = std::find(virtualScreenGroupListeners_.begin(), virtualScreenGroupListeners_.end(), listener);
390 if (iter == virtualScreenGroupListeners_.end()) {
391 WLOGFE("could not find this listener");
392 return DMError::DM_ERROR_NULLPTR;
393 }
394 virtualScreenGroupListeners_.erase(iter);
395 return isAllListenersRemoved() ? UnregisterDisplayManagerAgent() : DMError::DM_OK;
396 }
397
UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)398 DMError ScreenManager::UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)
399 {
400 if (listener == nullptr) {
401 WLOGFE("UnregisterVirtualScreenGroupListener listener is nullptr.");
402 return DMError::DM_ERROR_NULLPTR;
403 }
404 return pImpl_->UnregisterVirtualScreenGroupListener(listener);
405 }
406
RegisterDisplayManagerAgent()407 DMError ScreenManager::Impl::RegisterDisplayManagerAgent()
408 {
409 DMError regSucc = DMError::DM_OK;
410 if (screenManagerListener_ == nullptr) {
411 screenManagerListener_ = new ScreenManagerListener(this);
412 regSucc = SingletonContainer::Get<ScreenManagerAdapter>().RegisterDisplayManagerAgent(
413 screenManagerListener_, DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
414 if (regSucc != DMError::DM_OK) {
415 screenManagerListener_ = nullptr;
416 WLOGFW("RegisterDisplayManagerAgent failed !");
417 }
418 }
419 return regSucc;
420 }
421
UnregisterDisplayManagerAgent()422 DMError ScreenManager::Impl::UnregisterDisplayManagerAgent()
423 {
424 DMError unRegSucc = DMError::DM_OK;
425 if (screenManagerListener_ != nullptr) {
426 unRegSucc = SingletonContainer::Get<ScreenManagerAdapter>().UnregisterDisplayManagerAgent(
427 screenManagerListener_, DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
428 screenManagerListener_ = nullptr;
429 if (unRegSucc != DMError::DM_OK) {
430 WLOGFW("UnregisterDisplayManagerAgent failed!");
431 }
432 }
433 return unRegSucc;
434 }
435
MakeExpand(const std::vector<ExpandOption> & options,ScreenId & screenGroupId)436 DMError ScreenManager::MakeExpand(const std::vector<ExpandOption>& options, ScreenId& screenGroupId)
437 {
438 WLOGFD("Make expand");
439 if (options.empty()) {
440 return DMError::DM_ERROR_INVALID_PARAM;
441 }
442 if (options.size() > MAX_SCREEN_SIZE) {
443 WLOGFW("Make expand failed. The options size is bigger than %{public}u.", MAX_SCREEN_SIZE);
444 return DMError::DM_ERROR_INVALID_PARAM;
445 }
446 std::vector<ScreenId> screenIds;
447 std::vector<Point> startPoints;
448 for (auto& option: options) {
449 if (std::find(screenIds.begin(), screenIds.end(), option.screenId_) != screenIds.end()) {
450 continue;
451 }
452 screenIds.emplace_back(option.screenId_);
453 startPoints.emplace_back(Point(option.startX_, option.startY_));
454 }
455 DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().MakeExpand(screenIds, startPoints, screenGroupId);
456 if (screenGroupId == SCREEN_ID_INVALID) {
457 WLOGFE("Make expand failed");
458 }
459 return ret;
460 }
461
MakeUniqueScreen(const std::vector<ScreenId> & screenIds)462 DMError ScreenManager::MakeUniqueScreen(const std::vector<ScreenId>& screenIds)
463 {
464 WLOGFD("start Make UniqueScreen");
465 if (screenIds.empty()) {
466 WLOGFE("screenIds is null");
467 return DMError::DM_ERROR_INVALID_PARAM;
468 }
469 if (screenIds.size() > MAX_SCREEN_SIZE) {
470 WLOGFW("Make UniqueScreen failed. The screenIds size is bigger than %{public}u.", MAX_SCREEN_SIZE);
471 return DMError::DM_ERROR_INVALID_PARAM;
472 }
473 DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().MakeUniqueScreen(screenIds);
474 return ret;
475 }
476
MakeMirror(ScreenId mainScreenId,std::vector<ScreenId> mirrorScreenId,ScreenId & screenGroupId)477 DMError ScreenManager::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId, ScreenId& screenGroupId)
478 {
479 WLOGFI("Make mirror for screen: %{public}" PRIu64"", mainScreenId);
480 if (mirrorScreenId.size() > MAX_SCREEN_SIZE) {
481 WLOGFW("Make Mirror failed. The mirrorScreenId size is bigger than %{public}u.", MAX_SCREEN_SIZE);
482 return DMError::DM_ERROR_INVALID_PARAM;
483 }
484 DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().MakeMirror(mainScreenId, mirrorScreenId,
485 screenGroupId);
486 if (screenGroupId == SCREEN_ID_INVALID) {
487 WLOGFE("create mirror failed");
488 }
489 return ret;
490 }
491
MakeMirror(ScreenId mainScreenId,std::vector<ScreenId> mirrorScreenId,DMRect mainScreenRegion,ScreenId & screenGroupId)492 DMError ScreenManager::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId, DMRect mainScreenRegion,
493 ScreenId& screenGroupId)
494 {
495 WLOGFI("Make mirror with region for screen: %{public}" PRIu64"", mainScreenId);
496 if (mirrorScreenId.size() > MAX_SCREEN_SIZE) {
497 WLOGFW("Make Mirror failed. MirrorScreenId size bigger than %{public}u.", MAX_SCREEN_SIZE);
498 return DMError::DM_ERROR_INVALID_PARAM;
499 }
500 DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().MakeMirror(mainScreenId, mirrorScreenId,
501 mainScreenRegion, screenGroupId);
502 if (screenGroupId == SCREEN_ID_INVALID) {
503 WLOGFE("create mirror failed");
504 }
505 return ret;
506 }
507
StopExpand(const std::vector<ScreenId> & expandScreenIds)508 DMError ScreenManager::StopExpand(const std::vector<ScreenId>& expandScreenIds)
509 {
510 WLOGFD("Stop expand");
511 if (expandScreenIds.empty()) {
512 return DMError::DM_OK;
513 }
514 return SingletonContainer::Get<ScreenManagerAdapter>().StopExpand(expandScreenIds);
515 }
516
StopMirror(const std::vector<ScreenId> & mirrorScreenIds)517 DMError ScreenManager::StopMirror(const std::vector<ScreenId>& mirrorScreenIds)
518 {
519 WLOGFD("Stop mirror");
520 if (mirrorScreenIds.empty()) {
521 return DMError::DM_OK;
522 }
523 return SingletonContainer::Get<ScreenManagerAdapter>().StopMirror(mirrorScreenIds);
524 }
525
DisableMirror(bool disableOrNot)526 DMError ScreenManager::DisableMirror(bool disableOrNot)
527 {
528 WLOGFI("Disable mirror %{public}d", disableOrNot);
529 return SingletonContainer::Get<ScreenManagerAdapter>().DisableMirror(disableOrNot);
530 }
531
RemoveVirtualScreenFromGroup(std::vector<ScreenId> screens)532 DMError ScreenManager::RemoveVirtualScreenFromGroup(std::vector<ScreenId> screens)
533 {
534 WLOGFI("screens.size=%{public}llu", (unsigned long long)screens.size());
535 if (screens.empty()) {
536 WLOGFW("RemoveVirtualScreenFromGroup failed. screens is empty.");
537 return DMError::DM_ERROR_INVALID_PARAM;
538 }
539 if (screens.size() > MAX_SCREEN_SIZE) {
540 WLOGFW("RemoveVirtualScreenFromGroup failed. The screens size is bigger than %{public}u.", MAX_SCREEN_SIZE);
541 return DMError::DM_ERROR_INVALID_PARAM;
542 }
543 SingletonContainer::Get<ScreenManagerAdapter>().RemoveVirtualScreenFromGroup(screens);
544 return DMError::DM_OK;
545 }
546
CreateVirtualScreen(VirtualScreenOption option)547 ScreenId ScreenManager::CreateVirtualScreen(VirtualScreenOption option)
548 {
549 return pImpl_->CreateVirtualScreen(option);
550 }
551
CreateVirtualScreen(VirtualScreenOption option)552 ScreenId ScreenManager::Impl::CreateVirtualScreen(VirtualScreenOption option)
553 {
554 // After the process creating the virtual screen is killed, DMS needs to delete the virtual screen
555 if (virtualScreenAgent_ == nullptr) {
556 virtualScreenAgent_ = new DisplayManagerAgentDefault();
557 }
558 return SingletonContainer::Get<ScreenManagerAdapter>().CreateVirtualScreen(option, virtualScreenAgent_);
559 }
560
DestroyVirtualScreen(ScreenId screenId)561 DMError ScreenManager::DestroyVirtualScreen(ScreenId screenId)
562 {
563 return SingletonContainer::Get<ScreenManagerAdapter>().DestroyVirtualScreen(screenId);
564 }
565
SetVirtualScreenSurface(ScreenId screenId,sptr<Surface> surface)566 DMError ScreenManager::SetVirtualScreenSurface(ScreenId screenId, sptr<Surface> surface)
567 {
568 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenSurface(screenId, surface);
569 }
570
SetVirtualMirrorScreenCanvasRotation(ScreenId screenId,bool rotation)571 DMError ScreenManager::SetVirtualMirrorScreenCanvasRotation(ScreenId screenId, bool rotation)
572 {
573 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualMirrorScreenCanvasRotation(screenId, rotation);
574 }
575
ResizeVirtualScreen(ScreenId screenId,uint32_t width,uint32_t height)576 DMError ScreenManager::ResizeVirtualScreen(ScreenId screenId, uint32_t width, uint32_t height)
577 {
578 return SingletonContainer::Get<ScreenManagerAdapter>().ResizeVirtualScreen(screenId, width, height);
579 }
580
SetVirtualMirrorScreenScaleMode(ScreenId screenId,ScreenScaleMode scaleMode)581 DMError ScreenManager::SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode)
582 {
583 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualMirrorScreenScaleMode(screenId, scaleMode);
584 }
585
GetVirtualScreenFlag(ScreenId screenId)586 VirtualScreenFlag ScreenManager::GetVirtualScreenFlag(ScreenId screenId)
587 {
588 return SingletonContainer::Get<ScreenManagerAdapter>().GetVirtualScreenFlag(screenId);
589 }
590
SetVirtualScreenFlag(ScreenId screenId,VirtualScreenFlag screenFlag)591 DMError ScreenManager::SetVirtualScreenFlag(ScreenId screenId, VirtualScreenFlag screenFlag)
592 {
593 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenFlag(screenId, screenFlag);
594 }
595
SetVirtualScreenRefreshRate(ScreenId screenId,uint32_t refreshInterval)596 DMError ScreenManager::SetVirtualScreenRefreshRate(ScreenId screenId, uint32_t refreshInterval)
597 {
598 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenRefreshRate(screenId, refreshInterval);
599 }
600
SetSpecifiedScreenPower(ScreenId screenId,ScreenPowerState state,PowerStateChangeReason reason)601 bool ScreenManager::SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason)
602 {
603 WLOGFI("screenId:%{public}" PRIu64 ", state:%{public}u, reason:%{public}u", screenId, state, reason);
604 return SingletonContainer::Get<ScreenManagerAdapter>().SetSpecifiedScreenPower(screenId, state, reason);
605 }
606
SetScreenPowerForAll(ScreenPowerState state,PowerStateChangeReason reason)607 bool ScreenManager::SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason)
608 {
609 WLOGFI("state:%{public}u, reason:%{public}u", state, reason);
610 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenPowerForAll(state, reason);
611 }
612
GetScreenPower(ScreenId dmsScreenId)613 ScreenPowerState ScreenManager::GetScreenPower(ScreenId dmsScreenId)
614 {
615 return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenPower(dmsScreenId);
616 }
617
GetScreenPower()618 ScreenPowerState ScreenManager::GetScreenPower()
619 {
620 return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenPower();
621 }
622
SetScreenRotationLocked(bool isLocked)623 DMError ScreenManager::SetScreenRotationLocked(bool isLocked)
624 {
625 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenRotationLocked(isLocked);
626 }
627
SetScreenRotationLockedFromJs(bool isLocked)628 DMError ScreenManager::SetScreenRotationLockedFromJs(bool isLocked)
629 {
630 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenRotationLockedFromJs(isLocked);
631 }
632
IsScreenRotationLocked(bool & isLocked)633 DMError ScreenManager::IsScreenRotationLocked(bool& isLocked)
634 {
635 return SingletonContainer::Get<ScreenManagerAdapter>().IsScreenRotationLocked(isLocked);
636 }
637
NotifyScreenConnect(sptr<ScreenInfo> info)638 void ScreenManager::Impl::NotifyScreenConnect(sptr<ScreenInfo> info)
639 {
640 std::lock_guard<std::recursive_mutex> lock(mutex_);
641 UpdateScreenInfoLocked(info);
642 }
643
NotifyScreenDisconnect(ScreenId screenId)644 void ScreenManager::Impl::NotifyScreenDisconnect(ScreenId screenId)
645 {
646 WLOGFI("screenId:%{public}" PRIu64".", screenId);
647 std::lock_guard<std::recursive_mutex> lock(mutex_);
648 screenMap_.erase(screenId);
649 }
650
NotifyScreenChange(const sptr<ScreenInfo> & screenInfo)651 void ScreenManager::Impl::NotifyScreenChange(const sptr<ScreenInfo>& screenInfo)
652 {
653 std::lock_guard<std::recursive_mutex> lock(mutex_);
654 UpdateScreenInfoLocked(screenInfo);
655 }
656
NotifyScreenChange(const std::vector<sptr<ScreenInfo>> & screenInfos)657 void ScreenManager::Impl::NotifyScreenChange(const std::vector<sptr<ScreenInfo>>& screenInfos)
658 {
659 std::lock_guard<std::recursive_mutex> lock(mutex_);
660 for (auto screenInfo : screenInfos) {
661 UpdateScreenInfoLocked(screenInfo);
662 }
663 }
664
UpdateScreenInfoLocked(sptr<ScreenInfo> screenInfo)665 bool ScreenManager::Impl::UpdateScreenInfoLocked(sptr<ScreenInfo> screenInfo)
666 {
667 if (screenInfo == nullptr) {
668 WLOGFE("displayInfo is null");
669 return false;
670 }
671 ScreenId screenId = screenInfo->GetScreenId();
672 WLOGFD("screenId:%{public}" PRIu64".", screenId);
673 if (screenId == SCREEN_ID_INVALID) {
674 WLOGFE("displayId is invalid.");
675 return false;
676 }
677 auto iter = screenMap_.find(screenId);
678 if (iter != screenMap_.end() && iter->second != nullptr) {
679 WLOGFD("Screen Info Updated: %{public}s",
680 GetScreenInfoSrting(screenInfo).c_str());
681 iter->second->UpdateScreenInfo(screenInfo);
682 return true;
683 }
684 sptr<Screen> screen = new Screen(screenInfo);
685 screenMap_[screenId] = screen;
686 return true;
687 }
688
GetScreenInfoSrting(sptr<ScreenInfo> screenInfo)689 std::string ScreenManager::Impl::GetScreenInfoSrting(sptr<ScreenInfo> screenInfo)
690 {
691 if (screenInfo == nullptr) {
692 WLOGFE("screenInfo nullptr.");
693 return "";
694 }
695 std::ostringstream oss;
696 oss << "Screen ID: " << screenInfo->GetScreenId() << ", ";
697 oss << "Name: " << screenInfo->GetName() << ", ";
698 oss << "VirtualWidth: " << screenInfo->GetVirtualWidth() << ", ";
699 oss << "VirtualHeight: " << screenInfo->GetVirtualHeight() << ", ";
700 oss << "VirtualPixelRatio: " << screenInfo->GetVirtualPixelRatio() << ", ";
701 oss << "Rotation: " << static_cast<int32_t>(screenInfo->GetRotation());
702 return oss.str();
703 }
704
isAllListenersRemoved() const705 bool ScreenManager::Impl::isAllListenersRemoved() const
706 {
707 return screenListeners_.empty() && screenGroupListeners_.empty() && virtualScreenGroupListeners_.empty();
708 }
709
OnRemoteDied()710 void ScreenManager::Impl::OnRemoteDied()
711 {
712 WLOGFD("dms is died");
713 std::lock_guard<std::recursive_mutex> lock(mutex_);
714 screenManagerListener_ = nullptr;
715 virtualScreenAgent_ = nullptr;
716 }
717
OnRemoteDied()718 void ScreenManager::OnRemoteDied()
719 {
720 pImpl_->OnRemoteDied();
721 }
722
SetVirtualScreenMaxRefreshRate(ScreenId id,uint32_t refreshRate,uint32_t & actualRefreshRate)723 DMError ScreenManager::SetVirtualScreenMaxRefreshRate(ScreenId id, uint32_t refreshRate,
724 uint32_t& actualRefreshRate)
725 {
726 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenMaxRefreshRate(id,
727 refreshRate, actualRefreshRate);
728 }
729
SetScreenSkipProtectedWindow(const std::vector<ScreenId> & screenIds,bool isEnable)730 DMError ScreenManager::SetScreenSkipProtectedWindow(const std::vector<ScreenId>& screenIds, bool isEnable)
731 {
732 if (screenIds.empty()) {
733 WLOGFI("screenIds is null");
734 return DMError::DM_ERROR_INVALID_PARAM;
735 }
736 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenSkipProtectedWindow(screenIds, isEnable);
737 }
738 } // namespace OHOS::Rosen