1 /*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "screen_manager.h"
17
18 #include <map>
19 #include <vector>
20
21 #include <transaction/rs_interfaces.h>
22
23 #include "display_manager_adapter.h"
24 #include "display_manager_agent_default.h"
25 #include "permission.h"
26 #include "singleton_delegator.h"
27 #include "window_manager_hilog.h"
28
29 namespace OHOS::Rosen {
30 namespace {
31 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "ScreenManager"};
32 const static uint32_t MAX_SCREEN_SIZE = 32;
33 const static uint32_t DLCLOSE_TIMEOUT = 300000;
34 }
35 class ScreenManager::Impl : public RefBase {
36 public:
37 Impl() = default;
38 ~Impl();
39
40 static inline SingletonDelegator<ScreenManager> delegator;
41 ScreenId CreateVirtualScreen(VirtualScreenOption option);
42 sptr<Screen> GetScreen(ScreenId screenId);
43 sptr<ScreenGroup> GetScreenGroup(ScreenId screenId);
44 DMError GetAllScreens(std::vector<sptr<Screen>>& screens);
45 DMError RegisterScreenListener(sptr<IScreenListener> listener);
46 DMError UnregisterScreenListener(sptr<IScreenListener> listener);
47 DMError RegisterScreenGroupListener(sptr<IScreenGroupListener> listener);
48 DMError UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener);
49 DMError RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener);
50 DMError UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener);
51 DMError RegisterDisplayManagerAgent();
52 DMError UnregisterDisplayManagerAgent();
53 void OnRemoteDied();
54
55 private:
56 void NotifyScreenConnect(sptr<ScreenInfo> info);
57 void NotifyScreenDisconnect(ScreenId);
58 void NotifyScreenChange(const sptr<ScreenInfo>& screenInfo);
59 void NotifyScreenChange(const std::vector<sptr<ScreenInfo>>& screenInfos);
60 bool UpdateScreenInfoLocked(sptr<ScreenInfo>);
61 std::string GetScreenInfoSrting(sptr<ScreenInfo> screenInfo);
62 void DlcloseTimeout();
63
64 bool isAllListenersRemoved() const;
65
66 class ScreenManagerListener;
67 sptr<ScreenManagerListener> screenManagerListener_;
68 std::map<ScreenId, sptr<Screen>> screenMap_;
69 std::map<ScreenId, sptr<ScreenGroup>> screenGroupMap_;
70 std::recursive_mutex mutex_;
71 std::set<sptr<IScreenListener>> screenListeners_;
72 std::set<sptr<IScreenGroupListener>> screenGroupListeners_;
73 std::set<sptr<IVirtualScreenGroupListener>> virtualScreenGroupListeners_;
74 sptr<IDisplayManagerAgent> virtualScreenAgent_ = nullptr;
75 std::mutex virtualScreenAgentMutex_;
76 };
77
78 class ScreenManager::Impl::ScreenManagerListener : public DisplayManagerAgentDefault {
79 public:
ScreenManagerListener(sptr<Impl> impl)80 explicit ScreenManagerListener(sptr<Impl> impl) : pImpl_(impl)
81 {
82 }
83
OnScreenConnect(sptr<ScreenInfo> screenInfo)84 void OnScreenConnect(sptr<ScreenInfo> screenInfo)
85 {
86 if (screenInfo == nullptr || screenInfo->GetScreenId() == SCREEN_ID_INVALID) {
87 WLOGFE("OnScreenConnect, screenInfo is invalid.");
88 return;
89 }
90 if (pImpl_ == nullptr) {
91 WLOGFE("OnScreenConnect, impl is nullptr.");
92 return;
93 }
94 pImpl_->NotifyScreenConnect(screenInfo);
95 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
96 for (auto listener : pImpl_->screenListeners_) {
97 listener->OnConnect(screenInfo->GetScreenId());
98 }
99 };
100
OnScreenDisconnect(ScreenId screenId)101 void OnScreenDisconnect(ScreenId screenId)
102 {
103 if (screenId == SCREEN_ID_INVALID) {
104 WLOGFE("OnScreenDisconnect, screenId is invalid.");
105 return;
106 }
107 if (pImpl_ == nullptr) {
108 WLOGFE("OnScreenDisconnect, impl is nullptr.");
109 return;
110 }
111 pImpl_->NotifyScreenDisconnect(screenId);
112 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
113 for (auto listener : pImpl_->screenListeners_) {
114 listener->OnDisconnect(screenId);
115 }
116 };
117
OnScreenChange(const sptr<ScreenInfo> & screenInfo,ScreenChangeEvent event)118 void OnScreenChange(const sptr<ScreenInfo>& screenInfo, ScreenChangeEvent event)
119 {
120 if (screenInfo == nullptr) {
121 WLOGFE("OnScreenChange, screenInfo is null.");
122 return;
123 }
124 if (pImpl_ == nullptr) {
125 WLOGFE("OnScreenChange, impl is nullptr.");
126 return;
127 }
128 WLOGFD("OnScreenChange. event %{public}u", event);
129 pImpl_->NotifyScreenChange(screenInfo);
130 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
131 for (auto listener: pImpl_->screenListeners_) {
132 listener->OnChange(screenInfo->GetScreenId());
133 }
134 };
135
OnScreenGroupChange(const std::string & trigger,const std::vector<sptr<ScreenInfo>> & screenInfos,ScreenGroupChangeEvent groupEvent)136 void OnScreenGroupChange(const std::string& trigger, const std::vector<sptr<ScreenInfo>>& screenInfos,
137 ScreenGroupChangeEvent groupEvent)
138 {
139 if (screenInfos.empty()) {
140 WLOGFE("screenInfos is empty.");
141 return;
142 }
143 if (pImpl_ == nullptr) {
144 WLOGFE("impl is nullptr.");
145 return;
146 }
147 WLOGFD("trigger %{public}s, event %{public}u", trigger.c_str(), groupEvent);
148 pImpl_->NotifyScreenChange(screenInfos);
149 std::vector<ScreenId> screenIds;
150 for (auto screenInfo : screenInfos) {
151 if (screenInfo->GetScreenId() != SCREEN_ID_INVALID) {
152 screenIds.push_back(screenInfo->GetScreenId());
153 }
154 }
155 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
156 for (auto listener: pImpl_->screenGroupListeners_) {
157 listener->OnChange(screenIds, groupEvent);
158 }
159 NotifyVirtualScreenGroupChanged(screenInfos[0], trigger, screenIds, groupEvent);
160 };
161 private:
NotifyVirtualScreenGroupChanged(sptr<ScreenInfo> screenInfo,const std::string trigger,std::vector<ScreenId> & ids,ScreenGroupChangeEvent groupEvent)162 void NotifyVirtualScreenGroupChanged(sptr<ScreenInfo> screenInfo,
163 const std::string trigger, std::vector<ScreenId>& ids, ScreenGroupChangeEvent groupEvent)
164 {
165 if (screenInfo == nullptr) {
166 WLOGFE("screenInfo is nullptr");
167 return;
168 }
169 // check for invalid scene
170 if (pImpl_->virtualScreenGroupListeners_.size() <= 0) {
171 WLOGFW("no virtual screen group listeners");
172 return;
173 }
174 if (screenInfo->GetType() != ScreenType::VIRTUAL) {
175 WLOGFW("not virtual screen type: %{public}u", screenInfo->GetType());
176 return;
177 }
178
179 // get the parent of screen
180 ScreenId parent = groupEvent == ScreenGroupChangeEvent::ADD_TO_GROUP ?
181 screenInfo->GetParentId() : screenInfo->GetLastParentId();
182 WLOGFD("parentId=[%{public}llu], lastParentId=[%{public}llu]", (unsigned long long)screenInfo->GetParentId(),
183 (unsigned long long)screenInfo->GetLastParentId());
184 if (parent == INVALID_SCREEN_ID) {
185 WLOGFE("parentId is invalid");
186 return;
187 }
188 auto screenGroup = pImpl_->GetScreenGroup(parent);
189 if (screenGroup == nullptr) {
190 WLOGFE("screenGroup is null");
191 return;
192 }
193
194 // notify mirror
195 ScreenCombination comb = screenGroup->GetCombination();
196 WLOGFD("comb %{public}u", comb);
197 IVirtualScreenGroupListener::ChangeInfo changeInfo = {groupEvent, trigger, ids};
198 for (auto listener: pImpl_->virtualScreenGroupListeners_) {
199 if (comb == ScreenCombination::SCREEN_MIRROR) {
200 listener->OnMirrorChange(changeInfo);
201 }
202 }
203 }
204 sptr<Impl> pImpl_;
205 };
206
WM_IMPLEMENT_SINGLE_INSTANCE(ScreenManager)207 WM_IMPLEMENT_SINGLE_INSTANCE(ScreenManager)
208 extern "C" __attribute__((destructor)) void ScreenManager::Impl::DlcloseTimeout()
209 {
210 usleep(DLCLOSE_TIMEOUT);
211 }
212
ScreenManager()213 ScreenManager::ScreenManager()
214 {
215 pImpl_ = new Impl();
216 WLOGFD("Create instance");
217 }
218
~ScreenManager()219 ScreenManager::~ScreenManager()
220 {
221 WLOGFI("Destroy instance");
222 }
223
~Impl()224 ScreenManager::Impl::~Impl()
225 {
226 std::lock_guard<std::recursive_mutex> lock(mutex_);
227 UnregisterDisplayManagerAgent();
228 }
229
GetScreen(ScreenId screenId)230 sptr<Screen> ScreenManager::Impl::GetScreen(ScreenId screenId)
231 {
232 auto screenInfo = SingletonContainer::Get<ScreenManagerAdapter>().GetScreenInfo(screenId);
233 std::lock_guard<std::recursive_mutex> lock(mutex_);
234 if (!UpdateScreenInfoLocked(screenInfo)) {
235 screenMap_.erase(screenId);
236 return nullptr;
237 }
238 return screenMap_[screenId];
239 }
240
GetScreenById(ScreenId screenId)241 sptr<Screen> ScreenManager::GetScreenById(ScreenId screenId)
242 {
243 return pImpl_->GetScreen(screenId);
244 }
245
GetScreenGroup(ScreenId screenId)246 sptr<ScreenGroup> ScreenManager::Impl::GetScreenGroup(ScreenId screenId)
247 {
248 auto screenGroupInfo = SingletonContainer::Get<ScreenManagerAdapter>().GetScreenGroupInfoById(screenId);
249 std::lock_guard<std::recursive_mutex> lock(mutex_);
250 if (screenGroupInfo == nullptr) {
251 WLOGFE("screenGroupInfo is null");
252 screenGroupMap_.erase(screenId);
253 return nullptr;
254 }
255 auto iter = screenGroupMap_.find(screenId);
256 if (iter != screenGroupMap_.end() && iter->second != nullptr) {
257 iter->second->UpdateScreenGroupInfo(screenGroupInfo);
258 return iter->second;
259 }
260 sptr<ScreenGroup> screenGroup = new ScreenGroup(screenGroupInfo);
261 screenGroupMap_[screenId] = screenGroup;
262 return screenGroup;
263 }
264
GetScreenGroup(ScreenId screenId)265 sptr<ScreenGroup> ScreenManager::GetScreenGroup(ScreenId screenId)
266 {
267 return pImpl_->GetScreenGroup(screenId);
268 }
269
GetAllScreens(std::vector<sptr<Screen>> & screens)270 DMError ScreenManager::Impl::GetAllScreens(std::vector<sptr<Screen>>& screens)
271 {
272 std::vector<sptr<ScreenInfo>> screenInfos;
273 DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().GetAllScreenInfos(screenInfos);
274 std::lock_guard<std::recursive_mutex> lock(mutex_);
275 for (auto info: screenInfos) {
276 if (UpdateScreenInfoLocked(info)) {
277 screens.emplace_back(screenMap_[info->GetScreenId()]);
278 }
279 }
280 screenMap_.clear();
281 for (auto screen: screens) {
282 screenMap_.insert(std::make_pair(screen->GetId(), screen));
283 }
284 return ret;
285 }
286
GetAllScreens(std::vector<sptr<Screen>> & screens)287 DMError ScreenManager::GetAllScreens(std::vector<sptr<Screen>>& screens)
288 {
289 return pImpl_->GetAllScreens(screens);
290 }
291
RegisterScreenListener(sptr<IScreenListener> listener)292 DMError ScreenManager::Impl::RegisterScreenListener(sptr<IScreenListener> listener)
293 {
294 std::lock_guard<std::recursive_mutex> lock(mutex_);
295 DMError regSucc = RegisterDisplayManagerAgent();
296 if (regSucc == DMError::DM_OK) {
297 screenListeners_.insert(listener);
298 }
299 return regSucc;
300 }
301
RegisterScreenListener(sptr<IScreenListener> listener)302 DMError ScreenManager::RegisterScreenListener(sptr<IScreenListener> listener)
303 {
304 if (listener == nullptr) {
305 WLOGFE("RegisterScreenListener listener is nullptr.");
306 return DMError::DM_ERROR_NULLPTR;
307 }
308 return pImpl_->RegisterScreenListener(listener);
309 }
310
UnregisterScreenListener(sptr<IScreenListener> listener)311 DMError ScreenManager::Impl::UnregisterScreenListener(sptr<IScreenListener> listener)
312 {
313 std::lock_guard<std::recursive_mutex> lock(mutex_);
314 auto iter = std::find(screenListeners_.begin(), screenListeners_.end(), listener);
315 if (iter == screenListeners_.end()) {
316 WLOGFE("could not find this listener");
317 return DMError::DM_ERROR_NULLPTR;
318 }
319 screenListeners_.erase(iter);
320 return isAllListenersRemoved() ? UnregisterDisplayManagerAgent() : DMError::DM_OK;
321 }
322
UnregisterScreenListener(sptr<IScreenListener> listener)323 DMError ScreenManager::UnregisterScreenListener(sptr<IScreenListener> listener)
324 {
325 if (listener == nullptr) {
326 WLOGFE("UnregisterScreenListener listener is nullptr.");
327 return DMError::DM_ERROR_NULLPTR;
328 }
329 return pImpl_->UnregisterScreenListener(listener);
330 }
331
RegisterScreenGroupListener(sptr<IScreenGroupListener> listener)332 DMError ScreenManager::Impl::RegisterScreenGroupListener(sptr<IScreenGroupListener> listener)
333 {
334 std::lock_guard<std::recursive_mutex> lock(mutex_);
335 DMError regSucc = RegisterDisplayManagerAgent();
336 if (regSucc == DMError::DM_OK) {
337 screenGroupListeners_.insert(listener);
338 }
339 return regSucc;
340 }
341
RegisterScreenGroupListener(sptr<IScreenGroupListener> listener)342 DMError ScreenManager::RegisterScreenGroupListener(sptr<IScreenGroupListener> listener)
343 {
344 if (listener == nullptr) {
345 WLOGFE("RegisterScreenGroupListener listener is nullptr.");
346 return DMError::DM_ERROR_NULLPTR;
347 }
348 return pImpl_->RegisterScreenGroupListener(listener);
349 }
350
UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener)351 DMError ScreenManager::Impl::UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener)
352 {
353 std::lock_guard<std::recursive_mutex> lock(mutex_);
354 auto iter = std::find(screenGroupListeners_.begin(), screenGroupListeners_.end(), listener);
355 if (iter == screenGroupListeners_.end()) {
356 WLOGFE("could not find this listener");
357 return DMError::DM_ERROR_NULLPTR;
358 }
359 screenGroupListeners_.erase(iter);
360 return isAllListenersRemoved() ? UnregisterDisplayManagerAgent() : DMError::DM_OK;
361 }
362
UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener)363 DMError ScreenManager::UnregisterScreenGroupListener(sptr<IScreenGroupListener> listener)
364 {
365 if (listener == nullptr) {
366 WLOGFE("UnregisterScreenGroupListener listener is nullptr.");
367 return DMError::DM_ERROR_NULLPTR;
368 }
369 return pImpl_->UnregisterScreenGroupListener(listener);
370 }
371
RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)372 DMError ScreenManager::Impl::RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)
373 {
374 std::lock_guard<std::recursive_mutex> lock(mutex_);
375 DMError regSucc = RegisterDisplayManagerAgent();
376 if (regSucc == DMError::DM_OK) {
377 virtualScreenGroupListeners_.insert(listener);
378 }
379 return regSucc;
380 }
381
RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)382 DMError ScreenManager::RegisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)
383 {
384 if (listener == nullptr) {
385 WLOGFE("RegisterVirtualScreenGroupListener listener is nullptr.");
386 return DMError::DM_ERROR_NULLPTR;
387 }
388 return pImpl_->RegisterVirtualScreenGroupListener(listener);
389 }
390
UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)391 DMError ScreenManager::Impl::UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)
392 {
393 std::lock_guard<std::recursive_mutex> lock(mutex_);
394 auto iter = std::find(virtualScreenGroupListeners_.begin(), virtualScreenGroupListeners_.end(), listener);
395 if (iter == virtualScreenGroupListeners_.end()) {
396 WLOGFE("could not find this listener");
397 return DMError::DM_ERROR_NULLPTR;
398 }
399 virtualScreenGroupListeners_.erase(iter);
400 return isAllListenersRemoved() ? UnregisterDisplayManagerAgent() : DMError::DM_OK;
401 }
402
UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)403 DMError ScreenManager::UnregisterVirtualScreenGroupListener(sptr<IVirtualScreenGroupListener> listener)
404 {
405 if (listener == nullptr) {
406 WLOGFE("UnregisterVirtualScreenGroupListener listener is nullptr.");
407 return DMError::DM_ERROR_NULLPTR;
408 }
409 return pImpl_->UnregisterVirtualScreenGroupListener(listener);
410 }
411
RegisterDisplayManagerAgent()412 DMError ScreenManager::Impl::RegisterDisplayManagerAgent()
413 {
414 DMError regSucc = DMError::DM_OK;
415 if (screenManagerListener_ == nullptr) {
416 screenManagerListener_ = new ScreenManagerListener(this);
417 regSucc = SingletonContainer::Get<ScreenManagerAdapter>().RegisterDisplayManagerAgent(
418 screenManagerListener_, DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
419 if (regSucc != DMError::DM_OK) {
420 screenManagerListener_ = nullptr;
421 WLOGFW("RegisterDisplayManagerAgent failed !");
422 }
423 }
424 return regSucc;
425 }
426
UnregisterDisplayManagerAgent()427 DMError ScreenManager::Impl::UnregisterDisplayManagerAgent()
428 {
429 DMError unRegSucc = DMError::DM_OK;
430 if (screenManagerListener_ != nullptr) {
431 unRegSucc = SingletonContainer::Get<ScreenManagerAdapter>().UnregisterDisplayManagerAgent(
432 screenManagerListener_, DisplayManagerAgentType::SCREEN_EVENT_LISTENER);
433 screenManagerListener_ = nullptr;
434 if (unRegSucc != DMError::DM_OK) {
435 WLOGFW("UnregisterDisplayManagerAgent failed!");
436 }
437 }
438 return unRegSucc;
439 }
440
MakeExpand(const std::vector<ExpandOption> & options,ScreenId & screenGroupId)441 DMError ScreenManager::MakeExpand(const std::vector<ExpandOption>& options, ScreenId& screenGroupId)
442 {
443 WLOGFD("Make expand");
444 if (options.empty()) {
445 return DMError::DM_ERROR_INVALID_PARAM;
446 }
447 if (options.size() > MAX_SCREEN_SIZE) {
448 WLOGFW("Make expand failed. Options size bigger than %{public}u.", MAX_SCREEN_SIZE);
449 return DMError::DM_ERROR_INVALID_PARAM;
450 }
451 std::vector<ScreenId> screenIds;
452 std::vector<Point> startPoints;
453 for (auto& option: options) {
454 if (std::find(screenIds.begin(), screenIds.end(), option.screenId_) != screenIds.end()) {
455 continue;
456 }
457 screenIds.emplace_back(option.screenId_);
458 startPoints.emplace_back(Point(option.startX_, option.startY_));
459 }
460 DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().MakeExpand(screenIds, startPoints, screenGroupId);
461 if (screenGroupId == SCREEN_ID_INVALID) {
462 WLOGFE("Make expand failed");
463 }
464 return ret;
465 }
466
MakeUniqueScreen(const std::vector<ScreenId> & screenIds)467 DMError ScreenManager::MakeUniqueScreen(const std::vector<ScreenId>& screenIds)
468 {
469 std::vector<DisplayId> displayIds;
470 return MakeUniqueScreen(screenIds, displayIds);
471 }
472
MakeUniqueScreen(const std::vector<ScreenId> & screenIds,std::vector<DisplayId> & displayIds)473 DMError ScreenManager::MakeUniqueScreen(const std::vector<ScreenId>& screenIds, std::vector<DisplayId>& displayIds)
474 {
475 WLOGFD("start Make UniqueScreen");
476 if (screenIds.empty()) {
477 WLOGFE("screenIds is null");
478 return DMError::DM_ERROR_INVALID_PARAM;
479 }
480 if (screenIds.size() > MAX_SCREEN_SIZE) {
481 WLOGFW("Make UniqueScreen failed. ScreenIds size bigger than %{public}u.", MAX_SCREEN_SIZE);
482 return DMError::DM_ERROR_INVALID_PARAM;
483 }
484 DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().MakeUniqueScreen(screenIds, displayIds);
485 return ret;
486 }
487
MakeMirror(ScreenId mainScreenId,std::vector<ScreenId> mirrorScreenId,ScreenId & screenGroupId)488 DMError ScreenManager::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId, ScreenId& screenGroupId)
489 {
490 WLOGFI("Make mirror for screen: %{public}" PRIu64"", mainScreenId);
491 if (mirrorScreenId.size() > MAX_SCREEN_SIZE) {
492 WLOGFW("Make Mirror failed. MirrorScreenId size bigger than %{public}u.", MAX_SCREEN_SIZE);
493 return DMError::DM_ERROR_INVALID_PARAM;
494 }
495 DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().MakeMirror(mainScreenId, mirrorScreenId,
496 screenGroupId);
497 if (screenGroupId == SCREEN_ID_INVALID) {
498 WLOGFE("create mirror failed");
499 }
500 return ret;
501 }
502
MakeMirrorForRecord(ScreenId mainScreenId,std::vector<ScreenId> mirrorScreenId,ScreenId & screenGroupId)503 DMError ScreenManager::MakeMirrorForRecord(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId,
504 ScreenId& screenGroupId)
505 {
506 WLOGFI("Make mirror for screen: %{public}" PRIu64"", mainScreenId);
507 if (mirrorScreenId.size() > MAX_SCREEN_SIZE) {
508 WLOGFW("Make Mirror failed. MirrorScreenId size bigger than %{public}u.", MAX_SCREEN_SIZE);
509 return DMError::DM_ERROR_INVALID_PARAM;
510 }
511 DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().MakeMirrorForRecord(mainScreenId, mirrorScreenId,
512 screenGroupId);
513 if (screenGroupId == SCREEN_ID_INVALID) {
514 WLOGFE("create mirror failed");
515 }
516 return ret;
517 }
518
MakeMirror(ScreenId mainScreenId,std::vector<ScreenId> mirrorScreenId,DMRect mainScreenRegion,ScreenId & screenGroupId)519 DMError ScreenManager::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId, DMRect mainScreenRegion,
520 ScreenId& screenGroupId)
521 {
522 WLOGFI("Make mirror with region for screen: %{public}" PRIu64"", mainScreenId);
523 if (mirrorScreenId.size() > MAX_SCREEN_SIZE) {
524 WLOGFW("Make Mirror failed. MirrorScreenId size bigger than %{public}u.", MAX_SCREEN_SIZE);
525 return DMError::DM_ERROR_INVALID_PARAM;
526 }
527 DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().MakeMirror(mainScreenId, mirrorScreenId,
528 mainScreenRegion, screenGroupId);
529 if (screenGroupId == SCREEN_ID_INVALID) {
530 WLOGFE("create mirror failed");
531 }
532 return ret;
533 }
534
SetMultiScreenMode(ScreenId mainScreenId,ScreenId secondaryScreenId,MultiScreenMode screenMode)535 DMError ScreenManager::SetMultiScreenMode(ScreenId mainScreenId, ScreenId secondaryScreenId,
536 MultiScreenMode screenMode)
537 {
538 WLOGFI("mainScreenId:%{public}" PRIu64",secondaryScreenId:%{public}" PRIu64",screenMode:%{public}u",
539 mainScreenId, secondaryScreenId, screenMode);
540 DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().SetMultiScreenMode(mainScreenId,
541 secondaryScreenId, screenMode);
542 return ret;
543 }
544
SetMultiScreenRelativePosition(MultiScreenPositionOptions mainScreenOptions,MultiScreenPositionOptions secondScreenOption)545 DMError ScreenManager::SetMultiScreenRelativePosition(MultiScreenPositionOptions mainScreenOptions,
546 MultiScreenPositionOptions secondScreenOption)
547 {
548 WLOGFI("mId:%{public}" PRIu64", X:%{public}u, Y:%{public}u,sId:%{public}" PRIu64", X:%{public}u, Y:%{public}u",
549 mainScreenOptions.screenId_, mainScreenOptions.startX_, mainScreenOptions.startY_,
550 secondScreenOption.screenId_, secondScreenOption.startX_, secondScreenOption.startY_);
551 DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().SetMultiScreenRelativePosition(mainScreenOptions,
552 secondScreenOption);
553 return ret;
554 }
555
StopExpand(const std::vector<ScreenId> & expandScreenIds)556 DMError ScreenManager::StopExpand(const std::vector<ScreenId>& expandScreenIds)
557 {
558 WLOGFD("Stop expand");
559 if (expandScreenIds.empty()) {
560 return DMError::DM_OK;
561 }
562 return SingletonContainer::Get<ScreenManagerAdapter>().StopExpand(expandScreenIds);
563 }
564
StopMirror(const std::vector<ScreenId> & mirrorScreenIds)565 DMError ScreenManager::StopMirror(const std::vector<ScreenId>& mirrorScreenIds)
566 {
567 WLOGFD("Stop mirror");
568 if (mirrorScreenIds.empty()) {
569 return DMError::DM_OK;
570 }
571 return SingletonContainer::Get<ScreenManagerAdapter>().StopMirror(mirrorScreenIds);
572 }
573
DisableMirror(bool disableOrNot)574 DMError ScreenManager::DisableMirror(bool disableOrNot)
575 {
576 WLOGFI("Disable mirror %{public}d", disableOrNot);
577 return SingletonContainer::Get<ScreenManagerAdapter>().DisableMirror(disableOrNot);
578 }
579
RemoveVirtualScreenFromGroup(std::vector<ScreenId> screens)580 DMError ScreenManager::RemoveVirtualScreenFromGroup(std::vector<ScreenId> screens)
581 {
582 WLOGFI("screens.size=%{public}llu", (unsigned long long)screens.size());
583 if (screens.empty()) {
584 WLOGFW("RemoveVirtualScreenFromGroup failed. screens is empty.");
585 return DMError::DM_ERROR_INVALID_PARAM;
586 }
587 if (screens.size() > MAX_SCREEN_SIZE) {
588 WLOGFW("RemoveVirtualScreenFromGroup failed. Screens size bigger than %{public}u.", MAX_SCREEN_SIZE);
589 return DMError::DM_ERROR_INVALID_PARAM;
590 }
591 SingletonContainer::Get<ScreenManagerAdapter>().RemoveVirtualScreenFromGroup(screens);
592 return DMError::DM_OK;
593 }
594
CreateVirtualScreen(VirtualScreenOption option)595 ScreenId ScreenManager::CreateVirtualScreen(VirtualScreenOption option)
596 {
597 return pImpl_->CreateVirtualScreen(option);
598 }
599
CreateVirtualScreen(VirtualScreenOption option)600 ScreenId ScreenManager::Impl::CreateVirtualScreen(VirtualScreenOption option)
601 {
602 // After the process creating the virtual screen is killed, DMS needs to delete the virtual screen
603 std::lock_guard<std::mutex> agentLock(virtualScreenAgentMutex_);
604 if (virtualScreenAgent_ == nullptr) {
605 virtualScreenAgent_ = new DisplayManagerAgentDefault();
606 }
607 return SingletonContainer::Get<ScreenManagerAdapter>().CreateVirtualScreen(option, virtualScreenAgent_);
608 }
609
DestroyVirtualScreen(ScreenId screenId)610 DMError ScreenManager::DestroyVirtualScreen(ScreenId screenId)
611 {
612 return SingletonContainer::Get<ScreenManagerAdapter>().DestroyVirtualScreen(screenId);
613 }
614
SetVirtualScreenSurface(ScreenId screenId,sptr<Surface> surface)615 DMError ScreenManager::SetVirtualScreenSurface(ScreenId screenId, sptr<Surface> surface)
616 {
617 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenSurface(screenId, surface);
618 }
619
AddVirtualScreenBlockList(const std::vector<int32_t> & persistentIds)620 DMError ScreenManager::AddVirtualScreenBlockList(const std::vector<int32_t>& persistentIds)
621 {
622 return SingletonContainer::Get<ScreenManagerAdapter>().AddVirtualScreenBlockList(persistentIds);
623 }
624
RemoveVirtualScreenBlockList(const std::vector<int32_t> & persistentIds)625 DMError ScreenManager::RemoveVirtualScreenBlockList(const std::vector<int32_t>& persistentIds)
626 {
627 return SingletonContainer::Get<ScreenManagerAdapter>().RemoveVirtualScreenBlockList(persistentIds);
628 }
629
SetScreenPrivacyMaskImage(ScreenId screenId,const std::shared_ptr<Media::PixelMap> & privacyMaskImg)630 DMError ScreenManager::SetScreenPrivacyMaskImage(ScreenId screenId,
631 const std::shared_ptr<Media::PixelMap>& privacyMaskImg)
632 {
633 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenPrivacyMaskImage(screenId, privacyMaskImg);
634 }
635
ResizeVirtualScreen(ScreenId screenId,uint32_t width,uint32_t height)636 DMError ScreenManager::ResizeVirtualScreen(ScreenId screenId, uint32_t width, uint32_t height)
637 {
638 return SingletonContainer::Get<ScreenManagerAdapter>().ResizeVirtualScreen(screenId, width, height);
639 }
640
SetVirtualMirrorScreenCanvasRotation(ScreenId screenId,bool rotation)641 DMError ScreenManager::SetVirtualMirrorScreenCanvasRotation(ScreenId screenId, bool rotation)
642 {
643 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualMirrorScreenCanvasRotation(screenId, rotation);
644 }
645
SetVirtualMirrorScreenScaleMode(ScreenId screenId,ScreenScaleMode scaleMode)646 DMError ScreenManager::SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode)
647 {
648 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualMirrorScreenScaleMode(screenId, scaleMode);
649 }
650
GetVirtualScreenFlag(ScreenId screenId)651 VirtualScreenFlag ScreenManager::GetVirtualScreenFlag(ScreenId screenId)
652 {
653 return SingletonContainer::Get<ScreenManagerAdapter>().GetVirtualScreenFlag(screenId);
654 }
655
SetVirtualScreenFlag(ScreenId screenId,VirtualScreenFlag screenFlag)656 DMError ScreenManager::SetVirtualScreenFlag(ScreenId screenId, VirtualScreenFlag screenFlag)
657 {
658 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenFlag(screenId, screenFlag);
659 }
660
SetVirtualScreenRefreshRate(ScreenId screenId,uint32_t refreshInterval)661 DMError ScreenManager::SetVirtualScreenRefreshRate(ScreenId screenId, uint32_t refreshInterval)
662 {
663 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenRefreshRate(screenId, refreshInterval);
664 }
665
SetSpecifiedScreenPower(ScreenId screenId,ScreenPowerState state,PowerStateChangeReason reason)666 bool ScreenManager::SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason)
667 {
668 WLOGFI("screenId:%{public}" PRIu64 ", state:%{public}u, reason:%{public}u", screenId, state, reason);
669 return SingletonContainer::Get<ScreenManagerAdapter>().SetSpecifiedScreenPower(screenId, state, reason);
670 }
671
SetScreenPowerForAll(ScreenPowerState state,PowerStateChangeReason reason)672 bool ScreenManager::SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason)
673 {
674 WLOGFI("state:%{public}u, reason:%{public}u", state, reason);
675 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenPowerForAll(state, reason);
676 }
677
GetScreenPower(ScreenId dmsScreenId)678 ScreenPowerState ScreenManager::GetScreenPower(ScreenId dmsScreenId)
679 {
680 return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenPower(dmsScreenId);
681 }
682
GetScreenPower()683 ScreenPowerState ScreenManager::GetScreenPower()
684 {
685 return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenPower();
686 }
687
SetScreenRotationLocked(bool isLocked)688 DMError ScreenManager::SetScreenRotationLocked(bool isLocked)
689 {
690 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenRotationLocked(isLocked);
691 }
692
SetScreenRotationLockedFromJs(bool isLocked)693 DMError ScreenManager::SetScreenRotationLockedFromJs(bool isLocked)
694 {
695 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenRotationLockedFromJs(isLocked);
696 }
697
IsScreenRotationLocked(bool & isLocked)698 DMError ScreenManager::IsScreenRotationLocked(bool& isLocked)
699 {
700 return SingletonContainer::Get<ScreenManagerAdapter>().IsScreenRotationLocked(isLocked);
701 }
702
NotifyScreenConnect(sptr<ScreenInfo> info)703 void ScreenManager::Impl::NotifyScreenConnect(sptr<ScreenInfo> info)
704 {
705 std::lock_guard<std::recursive_mutex> lock(mutex_);
706 UpdateScreenInfoLocked(info);
707 }
708
NotifyScreenDisconnect(ScreenId screenId)709 void ScreenManager::Impl::NotifyScreenDisconnect(ScreenId screenId)
710 {
711 WLOGFI("screenId:%{public}" PRIu64".", screenId);
712 std::lock_guard<std::recursive_mutex> lock(mutex_);
713 screenMap_.erase(screenId);
714 }
715
NotifyScreenChange(const sptr<ScreenInfo> & screenInfo)716 void ScreenManager::Impl::NotifyScreenChange(const sptr<ScreenInfo>& screenInfo)
717 {
718 std::lock_guard<std::recursive_mutex> lock(mutex_);
719 UpdateScreenInfoLocked(screenInfo);
720 }
721
NotifyScreenChange(const std::vector<sptr<ScreenInfo>> & screenInfos)722 void ScreenManager::Impl::NotifyScreenChange(const std::vector<sptr<ScreenInfo>>& screenInfos)
723 {
724 std::lock_guard<std::recursive_mutex> lock(mutex_);
725 for (auto screenInfo : screenInfos) {
726 UpdateScreenInfoLocked(screenInfo);
727 }
728 }
729
UpdateScreenInfoLocked(sptr<ScreenInfo> screenInfo)730 bool ScreenManager::Impl::UpdateScreenInfoLocked(sptr<ScreenInfo> screenInfo)
731 {
732 if (screenInfo == nullptr) {
733 WLOGFE("displayInfo is null");
734 return false;
735 }
736 ScreenId screenId = screenInfo->GetScreenId();
737 WLOGFD("screenId:%{public}" PRIu64".", screenId);
738 if (screenId == SCREEN_ID_INVALID) {
739 WLOGFE("displayId is invalid.");
740 return false;
741 }
742 auto iter = screenMap_.find(screenId);
743 if (iter != screenMap_.end() && iter->second != nullptr) {
744 WLOGFD("Screen Info Updated: %{public}s",
745 GetScreenInfoSrting(screenInfo).c_str());
746 iter->second->UpdateScreenInfo(screenInfo);
747 return true;
748 }
749 sptr<Screen> screen = new Screen(screenInfo);
750 screenMap_[screenId] = screen;
751 return true;
752 }
753
GetScreenInfoSrting(sptr<ScreenInfo> screenInfo)754 std::string ScreenManager::Impl::GetScreenInfoSrting(sptr<ScreenInfo> screenInfo)
755 {
756 if (screenInfo == nullptr) {
757 WLOGFE("screenInfo nullptr.");
758 return "";
759 }
760 std::ostringstream oss;
761 oss << "Screen ID: " << screenInfo->GetScreenId() << ", ";
762 oss << "Name: " << screenInfo->GetName() << ", ";
763 oss << "VirtualWidth: " << screenInfo->GetVirtualWidth() << ", ";
764 oss << "VirtualHeight: " << screenInfo->GetVirtualHeight() << ", ";
765 oss << "VirtualPixelRatio: " << screenInfo->GetVirtualPixelRatio() << ", ";
766 oss << "Rotation: " << static_cast<int32_t>(screenInfo->GetRotation());
767 return oss.str();
768 }
769
isAllListenersRemoved() const770 bool ScreenManager::Impl::isAllListenersRemoved() const
771 {
772 return screenListeners_.empty() && screenGroupListeners_.empty() && virtualScreenGroupListeners_.empty();
773 }
774
OnRemoteDied()775 void ScreenManager::Impl::OnRemoteDied()
776 {
777 WLOGFD("dms is died");
778 {
779 std::lock_guard<std::mutex> agentLock(virtualScreenAgentMutex_);
780 virtualScreenAgent_ = nullptr;
781 }
782
783 std::lock_guard<std::recursive_mutex> lock(mutex_);
784 screenManagerListener_ = nullptr;
785 }
786
OnRemoteDied()787 void ScreenManager::OnRemoteDied()
788 {
789 pImpl_->OnRemoteDied();
790 }
791
SetVirtualScreenStatus(ScreenId screenId,VirtualScreenStatus screenStatus)792 bool ScreenManager::SetVirtualScreenStatus(ScreenId screenId, VirtualScreenStatus screenStatus)
793 {
794 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenStatus(screenId, screenStatus);
795 }
796
SetVirtualScreenMaxRefreshRate(ScreenId id,uint32_t refreshRate,uint32_t & actualRefreshRate)797 DMError ScreenManager::SetVirtualScreenMaxRefreshRate(ScreenId id, uint32_t refreshRate,
798 uint32_t& actualRefreshRate)
799 {
800 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenMaxRefreshRate(id,
801 refreshRate, actualRefreshRate);
802 }
803
SetScreenSkipProtectedWindow(const std::vector<ScreenId> & screenIds,bool isEnable)804 DMError ScreenManager::SetScreenSkipProtectedWindow(const std::vector<ScreenId>& screenIds, bool isEnable)
805 {
806 if (screenIds.empty()) {
807 WLOGFI("screenIds is null");
808 return DMError::DM_ERROR_INVALID_PARAM;
809 }
810 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenSkipProtectedWindow(screenIds, isEnable);
811 }
812 } // namespace OHOS::Rosen
813