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