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