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
StopExpand(const std::vector<ScreenId> & expandScreenIds)492 DMError ScreenManager::StopExpand(const std::vector<ScreenId>& expandScreenIds)
493 {
494 WLOGFD("Stop expand");
495 if (expandScreenIds.empty()) {
496 return DMError::DM_OK;
497 }
498 return SingletonContainer::Get<ScreenManagerAdapter>().StopExpand(expandScreenIds);
499 }
500
StopMirror(const std::vector<ScreenId> & mirrorScreenIds)501 DMError ScreenManager::StopMirror(const std::vector<ScreenId>& mirrorScreenIds)
502 {
503 WLOGFD("Stop mirror");
504 if (mirrorScreenIds.empty()) {
505 return DMError::DM_OK;
506 }
507 return SingletonContainer::Get<ScreenManagerAdapter>().StopMirror(mirrorScreenIds);
508 }
509
DisableMirror(bool disableOrNot)510 DMError ScreenManager::DisableMirror(bool disableOrNot)
511 {
512 WLOGFI("Disable mirror %{public}d", disableOrNot);
513 return SingletonContainer::Get<ScreenManagerAdapter>().DisableMirror(disableOrNot);
514 }
515
RemoveVirtualScreenFromGroup(std::vector<ScreenId> screens)516 DMError ScreenManager::RemoveVirtualScreenFromGroup(std::vector<ScreenId> screens)
517 {
518 WLOGFI("screens.size=%{public}llu", (unsigned long long)screens.size());
519 if (screens.empty()) {
520 WLOGFW("RemoveVirtualScreenFromGroup failed. screens is empty.");
521 return DMError::DM_ERROR_INVALID_PARAM;
522 }
523 if (screens.size() > MAX_SCREEN_SIZE) {
524 WLOGFW("RemoveVirtualScreenFromGroup failed. The screens size is bigger than %{public}u.", MAX_SCREEN_SIZE);
525 return DMError::DM_ERROR_INVALID_PARAM;
526 }
527 SingletonContainer::Get<ScreenManagerAdapter>().RemoveVirtualScreenFromGroup(screens);
528 return DMError::DM_OK;
529 }
530
CreateVirtualScreen(VirtualScreenOption option)531 ScreenId ScreenManager::CreateVirtualScreen(VirtualScreenOption option)
532 {
533 return pImpl_->CreateVirtualScreen(option);
534 }
535
CreateVirtualScreen(VirtualScreenOption option)536 ScreenId ScreenManager::Impl::CreateVirtualScreen(VirtualScreenOption option)
537 {
538 // After the process creating the virtual screen is killed, DMS needs to delete the virtual screen
539 if (virtualScreenAgent_ == nullptr) {
540 virtualScreenAgent_ = new DisplayManagerAgentDefault();
541 }
542 return SingletonContainer::Get<ScreenManagerAdapter>().CreateVirtualScreen(option, virtualScreenAgent_);
543 }
544
DestroyVirtualScreen(ScreenId screenId)545 DMError ScreenManager::DestroyVirtualScreen(ScreenId screenId)
546 {
547 return SingletonContainer::Get<ScreenManagerAdapter>().DestroyVirtualScreen(screenId);
548 }
549
SetVirtualScreenSurface(ScreenId screenId,sptr<Surface> surface)550 DMError ScreenManager::SetVirtualScreenSurface(ScreenId screenId, sptr<Surface> surface)
551 {
552 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenSurface(screenId, surface);
553 }
554
SetVirtualMirrorScreenCanvasRotation(ScreenId screenId,bool rotation)555 DMError ScreenManager::SetVirtualMirrorScreenCanvasRotation(ScreenId screenId, bool rotation)
556 {
557 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualMirrorScreenCanvasRotation(screenId, rotation);
558 }
559
ResizeVirtualScreen(ScreenId screenId,uint32_t width,uint32_t height)560 DMError ScreenManager::ResizeVirtualScreen(ScreenId screenId, uint32_t width, uint32_t height)
561 {
562 return SingletonContainer::Get<ScreenManagerAdapter>().ResizeVirtualScreen(screenId, width, height);
563 }
564
SetVirtualMirrorScreenScaleMode(ScreenId screenId,ScreenScaleMode scaleMode)565 DMError ScreenManager::SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode)
566 {
567 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualMirrorScreenScaleMode(screenId, scaleMode);
568 }
569
GetVirtualScreenFlag(ScreenId screenId)570 VirtualScreenFlag ScreenManager::GetVirtualScreenFlag(ScreenId screenId)
571 {
572 return SingletonContainer::Get<ScreenManagerAdapter>().GetVirtualScreenFlag(screenId);
573 }
574
SetVirtualScreenFlag(ScreenId screenId,VirtualScreenFlag screenFlag)575 DMError ScreenManager::SetVirtualScreenFlag(ScreenId screenId, VirtualScreenFlag screenFlag)
576 {
577 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenFlag(screenId, screenFlag);
578 }
579
SetVirtualScreenRefreshRate(ScreenId screenId,uint32_t refreshInterval)580 DMError ScreenManager::SetVirtualScreenRefreshRate(ScreenId screenId, uint32_t refreshInterval)
581 {
582 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenRefreshRate(screenId, refreshInterval);
583 }
584
SetSpecifiedScreenPower(ScreenId screenId,ScreenPowerState state,PowerStateChangeReason reason)585 bool ScreenManager::SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason)
586 {
587 WLOGFI("screenId:%{public}" PRIu64 ", state:%{public}u, reason:%{public}u", screenId, state, reason);
588 return SingletonContainer::Get<ScreenManagerAdapter>().SetSpecifiedScreenPower(screenId, state, reason);
589 }
590
SetScreenPowerForAll(ScreenPowerState state,PowerStateChangeReason reason)591 bool ScreenManager::SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason)
592 {
593 WLOGFI("state:%{public}u, reason:%{public}u", state, reason);
594 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenPowerForAll(state, reason);
595 }
596
GetScreenPower(ScreenId dmsScreenId)597 ScreenPowerState ScreenManager::GetScreenPower(ScreenId dmsScreenId)
598 {
599 return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenPower(dmsScreenId);
600 }
601
SetScreenRotationLocked(bool isLocked)602 DMError ScreenManager::SetScreenRotationLocked(bool isLocked)
603 {
604 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenRotationLocked(isLocked);
605 }
606
SetScreenRotationLockedFromJs(bool isLocked)607 DMError ScreenManager::SetScreenRotationLockedFromJs(bool isLocked)
608 {
609 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenRotationLockedFromJs(isLocked);
610 }
611
IsScreenRotationLocked(bool & isLocked)612 DMError ScreenManager::IsScreenRotationLocked(bool& isLocked)
613 {
614 return SingletonContainer::Get<ScreenManagerAdapter>().IsScreenRotationLocked(isLocked);
615 }
616
NotifyScreenConnect(sptr<ScreenInfo> info)617 void ScreenManager::Impl::NotifyScreenConnect(sptr<ScreenInfo> info)
618 {
619 std::lock_guard<std::recursive_mutex> lock(mutex_);
620 UpdateScreenInfoLocked(info);
621 }
622
NotifyScreenDisconnect(ScreenId screenId)623 void ScreenManager::Impl::NotifyScreenDisconnect(ScreenId screenId)
624 {
625 WLOGFI("screenId:%{public}" PRIu64".", screenId);
626 std::lock_guard<std::recursive_mutex> lock(mutex_);
627 screenMap_.erase(screenId);
628 }
629
NotifyScreenChange(const sptr<ScreenInfo> & screenInfo)630 void ScreenManager::Impl::NotifyScreenChange(const sptr<ScreenInfo>& screenInfo)
631 {
632 std::lock_guard<std::recursive_mutex> lock(mutex_);
633 UpdateScreenInfoLocked(screenInfo);
634 }
635
NotifyScreenChange(const std::vector<sptr<ScreenInfo>> & screenInfos)636 void ScreenManager::Impl::NotifyScreenChange(const std::vector<sptr<ScreenInfo>>& screenInfos)
637 {
638 std::lock_guard<std::recursive_mutex> lock(mutex_);
639 for (auto screenInfo : screenInfos) {
640 UpdateScreenInfoLocked(screenInfo);
641 }
642 }
643
UpdateScreenInfoLocked(sptr<ScreenInfo> screenInfo)644 bool ScreenManager::Impl::UpdateScreenInfoLocked(sptr<ScreenInfo> screenInfo)
645 {
646 if (screenInfo == nullptr) {
647 WLOGFE("displayInfo is null");
648 return false;
649 }
650 ScreenId screenId = screenInfo->GetScreenId();
651 WLOGFD("screenId:%{public}" PRIu64".", screenId);
652 if (screenId == SCREEN_ID_INVALID) {
653 WLOGFE("displayId is invalid.");
654 return false;
655 }
656 auto iter = screenMap_.find(screenId);
657 if (iter != screenMap_.end() && iter->second != nullptr) {
658 WLOGFD("Screen Info Updated: %{public}s",
659 GetScreenInfoSrting(screenInfo).c_str());
660 iter->second->UpdateScreenInfo(screenInfo);
661 return true;
662 }
663 sptr<Screen> screen = new Screen(screenInfo);
664 screenMap_[screenId] = screen;
665 return true;
666 }
667
GetScreenInfoSrting(sptr<ScreenInfo> screenInfo)668 std::string ScreenManager::Impl::GetScreenInfoSrting(sptr<ScreenInfo> screenInfo)
669 {
670 if (screenInfo == nullptr) {
671 WLOGFE("screenInfo nullptr.");
672 return "";
673 }
674 std::ostringstream oss;
675 oss << "Screen ID: " << screenInfo->GetScreenId() << ", ";
676 oss << "Name: " << screenInfo->GetName() << ", ";
677 oss << "VirtualWidth: " << screenInfo->GetVirtualWidth() << ", ";
678 oss << "VirtualHeight: " << screenInfo->GetVirtualHeight() << ", ";
679 oss << "VirtualPixelRatio: " << screenInfo->GetVirtualPixelRatio() << ", ";
680 oss << "Rotation: " << static_cast<int32_t>(screenInfo->GetRotation());
681 return oss.str();
682 }
683
isAllListenersRemoved() const684 bool ScreenManager::Impl::isAllListenersRemoved() const
685 {
686 return screenListeners_.empty() && screenGroupListeners_.empty() && virtualScreenGroupListeners_.empty();
687 }
688
OnRemoteDied()689 void ScreenManager::Impl::OnRemoteDied()
690 {
691 WLOGFD("dms is died");
692 std::lock_guard<std::recursive_mutex> lock(mutex_);
693 screenManagerListener_ = nullptr;
694 virtualScreenAgent_ = nullptr;
695 }
696
OnRemoteDied()697 void ScreenManager::OnRemoteDied()
698 {
699 pImpl_->OnRemoteDied();
700 }
701
SetVirtualScreenMaxRefreshRate(ScreenId id,uint32_t refreshRate,uint32_t & actualRefreshRate)702 DMError ScreenManager::SetVirtualScreenMaxRefreshRate(ScreenId id, uint32_t refreshRate,
703 uint32_t& actualRefreshRate)
704 {
705 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenMaxRefreshRate(id,
706 refreshRate, actualRefreshRate);
707 }
708 } // namespace OHOS::Rosen