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