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 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 DMError SetVirtualScreenAutoRotation(ScreenId screenId, bool enable);
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 TLOGE(WmsLogTag::DMS, "screenInfo is invalid.");
88 return;
89 }
90 if (pImpl_ == nullptr) {
91 TLOGE(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "screenId is invalid.");
105 return;
106 }
107 if (pImpl_ == nullptr) {
108 TLOGE(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "screenInfo is null.");
122 return;
123 }
124 if (pImpl_ == nullptr) {
125 TLOGE(WmsLogTag::DMS, "impl is nullptr.");
126 return;
127 }
128 TLOGD(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "screenInfos is empty.");
141 return;
142 }
143 if (pImpl_ == nullptr) {
144 TLOGE(WmsLogTag::DMS, "impl is nullptr.");
145 return;
146 }
147 TLOGD(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "screenInfo is nullptr");
167 return;
168 }
169 // check for invalid scene
170 if (pImpl_->virtualScreenGroupListeners_.size() <= 0) {
171 TLOGW(WmsLogTag::DMS, "no virtual screen group listeners");
172 return;
173 }
174 if (screenInfo->GetType() != ScreenType::VIRTUAL) {
175 TLOGW(WmsLogTag::DMS, "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 TLOGD(WmsLogTag::DMS, "parentId=[%{public}llu], lastParentId=[%{public}llu]",
183 (unsigned long long)screenInfo->GetParentId(), (unsigned long long)screenInfo->GetLastParentId());
184 if (parent == INVALID_SCREEN_ID) {
185 TLOGE(WmsLogTag::DMS, "parentId is invalid");
186 return;
187 }
188 auto screenGroup = pImpl_->GetScreenGroup(parent);
189 if (screenGroup == nullptr) {
190 TLOGE(WmsLogTag::DMS, "screenGroup is null");
191 return;
192 }
193
194 // notify mirror
195 ScreenCombination comb = screenGroup->GetCombination();
196 TLOGD(WmsLogTag::DMS, "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 TLOGD(WmsLogTag::DMS, "Create instance");
217 }
218
~ScreenManager()219 ScreenManager::~ScreenManager()
220 {
221 TLOGI(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "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 TLOGW(WmsLogTag::DMS, "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 TLOGW(WmsLogTag::DMS, "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 TLOGD(WmsLogTag::DMS, "Make expand");
444 if (options.empty()) {
445 return DMError::DM_ERROR_INVALID_PARAM;
446 }
447 if (options.size() > MAX_SCREEN_SIZE) {
448 TLOGW(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "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 TLOGD(WmsLogTag::DMS, "start Make UniqueScreen");
476 if (screenIds.empty()) {
477 TLOGE(WmsLogTag::DMS, "screenIds is null");
478 return DMError::DM_ERROR_INVALID_PARAM;
479 }
480 if (screenIds.size() > MAX_SCREEN_SIZE) {
481 TLOGW(WmsLogTag::DMS, "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 TLOGI(WmsLogTag::DMS, "Make mirror for screen: %{public}" PRIu64"", mainScreenId);
491 if (mirrorScreenId.size() > MAX_SCREEN_SIZE) {
492 TLOGW(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "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 TLOGI(WmsLogTag::DMS, "Make mirror for screen: %{public}" PRIu64"", mainScreenId);
507 if (mirrorScreenId.size() > MAX_SCREEN_SIZE) {
508 TLOGW(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "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 TLOGI(WmsLogTag::DMS, "Make mirror with region for screen: %{public}" PRIu64"", mainScreenId);
523 if (mirrorScreenId.size() > MAX_SCREEN_SIZE) {
524 TLOGW(WmsLogTag::DMS, "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 TLOGE(WmsLogTag::DMS, "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 TLOGI(WmsLogTag::DMS, "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 TLOGI(WmsLogTag::DMS, "mId:%{public}" PRIu64", X:%{public}u, Y:%{public}u,sId:%{public}" PRIu64", X:%{public}u, "
549 "Y:%{public}u", 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 TLOGD(WmsLogTag::DMS, "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 TLOGD(WmsLogTag::DMS, "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 TLOGI(WmsLogTag::DMS, "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 TLOGI(WmsLogTag::DMS, "screens.size=%{public}llu", (unsigned long long)screens.size());
583 if (screens.empty()) {
584 TLOGW(WmsLogTag::DMS, "RemoveVirtualScreenFromGroup failed. screens is empty.");
585 return DMError::DM_ERROR_INVALID_PARAM;
586 }
587 if (screens.size() > MAX_SCREEN_SIZE) {
588 TLOGW(WmsLogTag::DMS, "RemoveVirtualScreenFromGroup failed. Screens size bigger than %{public}u.",
589 MAX_SCREEN_SIZE);
590 return DMError::DM_ERROR_INVALID_PARAM;
591 }
592 SingletonContainer::Get<ScreenManagerAdapter>().RemoveVirtualScreenFromGroup(screens);
593 return DMError::DM_OK;
594 }
595
CreateVirtualScreen(VirtualScreenOption option)596 ScreenId ScreenManager::CreateVirtualScreen(VirtualScreenOption option)
597 {
598 return pImpl_->CreateVirtualScreen(option);
599 }
600
CreateVirtualScreen(VirtualScreenOption option)601 ScreenId ScreenManager::Impl::CreateVirtualScreen(VirtualScreenOption option)
602 {
603 // After the process creating the virtual screen is killed, DMS needs to delete the virtual screen
604 std::lock_guard<std::mutex> agentLock(virtualScreenAgentMutex_);
605 if (virtualScreenAgent_ == nullptr) {
606 virtualScreenAgent_ = new DisplayManagerAgentDefault();
607 }
608 return SingletonContainer::Get<ScreenManagerAdapter>().CreateVirtualScreen(option, virtualScreenAgent_);
609 }
610
DestroyVirtualScreen(ScreenId screenId)611 DMError ScreenManager::DestroyVirtualScreen(ScreenId screenId)
612 {
613 return SingletonContainer::Get<ScreenManagerAdapter>().DestroyVirtualScreen(screenId);
614 }
615
SetVirtualScreenSurface(ScreenId screenId,sptr<Surface> surface)616 DMError ScreenManager::SetVirtualScreenSurface(ScreenId screenId, sptr<Surface> surface)
617 {
618 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenSurface(screenId, surface);
619 }
620
AddVirtualScreenBlockList(const std::vector<int32_t> & persistentIds)621 DMError ScreenManager::AddVirtualScreenBlockList(const std::vector<int32_t>& persistentIds)
622 {
623 return SingletonContainer::Get<ScreenManagerAdapter>().AddVirtualScreenBlockList(persistentIds);
624 }
625
RemoveVirtualScreenBlockList(const std::vector<int32_t> & persistentIds)626 DMError ScreenManager::RemoveVirtualScreenBlockList(const std::vector<int32_t>& persistentIds)
627 {
628 return SingletonContainer::Get<ScreenManagerAdapter>().RemoveVirtualScreenBlockList(persistentIds);
629 }
630
ResizeVirtualScreen(ScreenId screenId,uint32_t width,uint32_t height)631 DMError ScreenManager::ResizeVirtualScreen(ScreenId screenId, uint32_t width, uint32_t height)
632 {
633 return SingletonContainer::Get<ScreenManagerAdapter>().ResizeVirtualScreen(screenId, width, height);
634 }
635
SetScreenPrivacyMaskImage(ScreenId screenId,const std::shared_ptr<Media::PixelMap> & privacyMaskImg)636 DMError ScreenManager::SetScreenPrivacyMaskImage(ScreenId screenId,
637 const std::shared_ptr<Media::PixelMap>& privacyMaskImg)
638 {
639 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenPrivacyMaskImage(screenId, privacyMaskImg);
640 }
641
SetVirtualMirrorScreenCanvasRotation(ScreenId screenId,bool rotation)642 DMError ScreenManager::SetVirtualMirrorScreenCanvasRotation(ScreenId screenId, bool rotation)
643 {
644 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualMirrorScreenCanvasRotation(screenId, rotation);
645 }
646
SetVirtualMirrorScreenScaleMode(ScreenId screenId,ScreenScaleMode scaleMode)647 DMError ScreenManager::SetVirtualMirrorScreenScaleMode(ScreenId screenId, ScreenScaleMode scaleMode)
648 {
649 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualMirrorScreenScaleMode(screenId, scaleMode);
650 }
651
GetVirtualScreenFlag(ScreenId screenId)652 VirtualScreenFlag ScreenManager::GetVirtualScreenFlag(ScreenId screenId)
653 {
654 return SingletonContainer::Get<ScreenManagerAdapter>().GetVirtualScreenFlag(screenId);
655 }
656
SetVirtualScreenFlag(ScreenId screenId,VirtualScreenFlag screenFlag)657 DMError ScreenManager::SetVirtualScreenFlag(ScreenId screenId, VirtualScreenFlag screenFlag)
658 {
659 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenFlag(screenId, screenFlag);
660 }
661
SetVirtualScreenRefreshRate(ScreenId screenId,uint32_t refreshInterval)662 DMError ScreenManager::SetVirtualScreenRefreshRate(ScreenId screenId, uint32_t refreshInterval)
663 {
664 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenRefreshRate(screenId, refreshInterval);
665 }
666
SetSpecifiedScreenPower(ScreenId screenId,ScreenPowerState state,PowerStateChangeReason reason)667 bool ScreenManager::SetSpecifiedScreenPower(ScreenId screenId, ScreenPowerState state, PowerStateChangeReason reason)
668 {
669 TLOGI(WmsLogTag::DMS, "screenId:%{public}" PRIu64 ", state:%{public}u, reason:%{public}u", screenId, state, reason);
670 return SingletonContainer::Get<ScreenManagerAdapter>().SetSpecifiedScreenPower(screenId, state, reason);
671 }
672
SetScreenPowerForAll(ScreenPowerState state,PowerStateChangeReason reason)673 bool ScreenManager::SetScreenPowerForAll(ScreenPowerState state, PowerStateChangeReason reason)
674 {
675 TLOGI(WmsLogTag::DMS, "state:%{public}u, reason:%{public}u", state, reason);
676 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenPowerForAll(state, reason);
677 }
678
GetScreenPower(ScreenId dmsScreenId)679 ScreenPowerState ScreenManager::GetScreenPower(ScreenId dmsScreenId)
680 {
681 return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenPower(dmsScreenId);
682 }
683
GetScreenPower()684 ScreenPowerState ScreenManager::GetScreenPower()
685 {
686 return SingletonContainer::Get<ScreenManagerAdapter>().GetScreenPower();
687 }
688
SetScreenRotationLocked(bool isLocked)689 DMError ScreenManager::SetScreenRotationLocked(bool isLocked)
690 {
691 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenRotationLocked(isLocked);
692 }
693
SetScreenRotationLockedFromJs(bool isLocked)694 DMError ScreenManager::SetScreenRotationLockedFromJs(bool isLocked)
695 {
696 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenRotationLockedFromJs(isLocked);
697 }
698
IsScreenRotationLocked(bool & isLocked)699 DMError ScreenManager::IsScreenRotationLocked(bool& isLocked)
700 {
701 return SingletonContainer::Get<ScreenManagerAdapter>().IsScreenRotationLocked(isLocked);
702 }
703
NotifyScreenConnect(sptr<ScreenInfo> info)704 void ScreenManager::Impl::NotifyScreenConnect(sptr<ScreenInfo> info)
705 {
706 std::lock_guard<std::recursive_mutex> lock(mutex_);
707 UpdateScreenInfoLocked(info);
708 }
709
NotifyScreenDisconnect(ScreenId screenId)710 void ScreenManager::Impl::NotifyScreenDisconnect(ScreenId screenId)
711 {
712 TLOGI(WmsLogTag::DMS, "screenId:%{public}" PRIu64".", screenId);
713 std::lock_guard<std::recursive_mutex> lock(mutex_);
714 screenMap_.erase(screenId);
715 }
716
NotifyScreenChange(const sptr<ScreenInfo> & screenInfo)717 void ScreenManager::Impl::NotifyScreenChange(const sptr<ScreenInfo>& screenInfo)
718 {
719 std::lock_guard<std::recursive_mutex> lock(mutex_);
720 UpdateScreenInfoLocked(screenInfo);
721 }
722
NotifyScreenChange(const std::vector<sptr<ScreenInfo>> & screenInfos)723 void ScreenManager::Impl::NotifyScreenChange(const std::vector<sptr<ScreenInfo>>& screenInfos)
724 {
725 std::lock_guard<std::recursive_mutex> lock(mutex_);
726 for (auto screenInfo : screenInfos) {
727 UpdateScreenInfoLocked(screenInfo);
728 }
729 }
730
UpdateScreenInfoLocked(sptr<ScreenInfo> screenInfo)731 bool ScreenManager::Impl::UpdateScreenInfoLocked(sptr<ScreenInfo> screenInfo)
732 {
733 if (screenInfo == nullptr) {
734 TLOGE(WmsLogTag::DMS, "displayInfo is null");
735 return false;
736 }
737 ScreenId screenId = screenInfo->GetScreenId();
738 TLOGD(WmsLogTag::DMS, "screenId:%{public}" PRIu64".", screenId);
739 if (screenId == SCREEN_ID_INVALID) {
740 TLOGE(WmsLogTag::DMS, "displayId is invalid.");
741 return false;
742 }
743 auto iter = screenMap_.find(screenId);
744 if (iter != screenMap_.end() && iter->second != nullptr) {
745 TLOGD(WmsLogTag::DMS, "Screen Info Updated: %{public}s",
746 GetScreenInfoSrting(screenInfo).c_str());
747 iter->second->UpdateScreenInfo(screenInfo);
748 return true;
749 }
750 sptr<Screen> screen = new Screen(screenInfo);
751 screenMap_[screenId] = screen;
752 return true;
753 }
754
GetScreenInfoSrting(sptr<ScreenInfo> screenInfo)755 std::string ScreenManager::Impl::GetScreenInfoSrting(sptr<ScreenInfo> screenInfo)
756 {
757 if (screenInfo == nullptr) {
758 TLOGE(WmsLogTag::DMS, "screenInfo nullptr.");
759 return "";
760 }
761 std::ostringstream oss;
762 oss << "Screen ID: " << screenInfo->GetScreenId() << ", ";
763 oss << "Name: " << screenInfo->GetName() << ", ";
764 oss << "VirtualWidth: " << screenInfo->GetVirtualWidth() << ", ";
765 oss << "VirtualHeight: " << screenInfo->GetVirtualHeight() << ", ";
766 oss << "VirtualPixelRatio: " << screenInfo->GetVirtualPixelRatio() << ", ";
767 oss << "Rotation: " << static_cast<int32_t>(screenInfo->GetRotation());
768 return oss.str();
769 }
770
isAllListenersRemoved() const771 bool ScreenManager::Impl::isAllListenersRemoved() const
772 {
773 return screenListeners_.empty() && screenGroupListeners_.empty() && virtualScreenGroupListeners_.empty();
774 }
775
OnRemoteDied()776 void ScreenManager::Impl::OnRemoteDied()
777 {
778 TLOGD(WmsLogTag::DMS, "dms is died");
779 {
780 std::lock_guard<std::mutex> agentLock(virtualScreenAgentMutex_);
781 virtualScreenAgent_ = nullptr;
782 }
783
784 std::lock_guard<std::recursive_mutex> lock(mutex_);
785 screenManagerListener_ = nullptr;
786 }
787
OnRemoteDied()788 void ScreenManager::OnRemoteDied()
789 {
790 pImpl_->OnRemoteDied();
791 }
792
SetVirtualScreenStatus(ScreenId screenId,VirtualScreenStatus screenStatus)793 bool ScreenManager::SetVirtualScreenStatus(ScreenId screenId, VirtualScreenStatus screenStatus)
794 {
795 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenStatus(screenId, screenStatus);
796 }
797
SetVirtualScreenMaxRefreshRate(ScreenId id,uint32_t refreshRate,uint32_t & actualRefreshRate)798 DMError ScreenManager::SetVirtualScreenMaxRefreshRate(ScreenId id, uint32_t refreshRate,
799 uint32_t& actualRefreshRate)
800 {
801 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenMaxRefreshRate(id,
802 refreshRate, actualRefreshRate);
803 }
804
SetFoldStatusExpandAndLocked(bool locked)805 void ScreenManager::SetFoldStatusExpandAndLocked(bool locked)
806 {
807 return SingletonContainer::Get<ScreenManagerAdapter>().SetFoldStatusExpandAndLocked(locked);
808 }
809
SetScreenSkipProtectedWindow(const std::vector<ScreenId> & screenIds,bool isEnable)810 DMError ScreenManager::SetScreenSkipProtectedWindow(const std::vector<ScreenId>& screenIds, bool isEnable)
811 {
812 if (screenIds.empty()) {
813 TLOGI(WmsLogTag::DMS, "screenIds is null");
814 return DMError::DM_ERROR_INVALID_PARAM;
815 }
816 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenSkipProtectedWindow(screenIds, isEnable);
817 }
818
SetVirtualScreenAutoRotation(ScreenId screenId,bool enable)819 DMError ScreenManager::SetVirtualScreenAutoRotation(ScreenId screenId, bool enable)
820 {
821 return pImpl_->SetVirtualScreenAutoRotation(screenId, enable);
822 }
823
SetVirtualScreenAutoRotation(ScreenId screenId,bool enable)824 DMError ScreenManager::Impl::SetVirtualScreenAutoRotation(ScreenId screenId, bool enable)
825 {
826 return SingletonContainer::Get<ScreenManagerAdapter>().SetVirtualScreenAutoRotation(screenId, enable);
827 }
828
SetScreenPrivacyWindowTagSwitch(ScreenId screenId,const std::vector<std::string> & privacyWindowTag,bool enable)829 DMError ScreenManager::SetScreenPrivacyWindowTagSwitch(ScreenId screenId,
830 const std::vector<std::string>& privacyWindowTag, bool enable)
831 {
832 return SingletonContainer::Get<ScreenManagerAdapter>().SetScreenPrivacyWindowTagSwitch(screenId,
833 privacyWindowTag, enable);
834 }
835 } // namespace OHOS::Rosen
836