1e0dac50fSopenharmony_ci/*
2e0dac50fSopenharmony_ci * Copyright (c) 2023 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
16e0dac50fSopenharmony_ci#include "window_manager_lite.h"
17e0dac50fSopenharmony_ci
18e0dac50fSopenharmony_ci#include <algorithm>
19e0dac50fSopenharmony_ci#include <cinttypes>
20e0dac50fSopenharmony_ci
21e0dac50fSopenharmony_ci#include "marshalling_helper.h"
22e0dac50fSopenharmony_ci#include "window_adapter_lite.h"
23e0dac50fSopenharmony_ci#include "window_manager_agent_lite.h"
24e0dac50fSopenharmony_ci#include "window_manager_hilog.h"
25e0dac50fSopenharmony_ci#include "wm_common.h"
26e0dac50fSopenharmony_ci
27e0dac50fSopenharmony_cinamespace OHOS {
28e0dac50fSopenharmony_cinamespace Rosen {
29e0dac50fSopenharmony_cinamespace {
30e0dac50fSopenharmony_ciconstexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowManagerLite"};
31e0dac50fSopenharmony_ci}
32e0dac50fSopenharmony_ci
33e0dac50fSopenharmony_ciWM_IMPLEMENT_SINGLE_INSTANCE(WindowManagerLite)
34e0dac50fSopenharmony_ci
35e0dac50fSopenharmony_ciclass WindowManagerLite::Impl {
36e0dac50fSopenharmony_cipublic:
37e0dac50fSopenharmony_ci    explicit Impl(std::recursive_mutex& mutex) : mutex_(mutex) {}
38e0dac50fSopenharmony_ci    void NotifyFocused(uint32_t windowId, const sptr<IRemoteObject>& abilityToken,
39e0dac50fSopenharmony_ci        WindowType windowType, DisplayId displayId);
40e0dac50fSopenharmony_ci    void NotifyUnfocused(uint32_t windowId, const sptr<IRemoteObject>& abilityToken,
41e0dac50fSopenharmony_ci        WindowType windowType, DisplayId displayId);
42e0dac50fSopenharmony_ci    void NotifyFocused(const sptr<FocusChangeInfo>& focusChangeInfo);
43e0dac50fSopenharmony_ci    void NotifyUnfocused(const sptr<FocusChangeInfo>& focusChangeInfo);
44e0dac50fSopenharmony_ci    void NotifyWindowVisibilityInfoChanged(const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos);
45e0dac50fSopenharmony_ci    void NotifyWindowDrawingContentInfoChanged(const std::vector<sptr<WindowDrawingContentInfo>>&
46e0dac50fSopenharmony_ci        windowDrawingContentInfos);
47e0dac50fSopenharmony_ci    void NotifyWindowModeChange(WindowModeType type);
48e0dac50fSopenharmony_ci    void UpdateCameraWindowStatus(uint32_t accessTokenId, bool isShowing);
49e0dac50fSopenharmony_ci    void NotifyWMSConnected(int32_t userId, int32_t screenId);
50e0dac50fSopenharmony_ci    void NotifyWMSDisconnected(int32_t userId, int32_t screenId);
51e0dac50fSopenharmony_ci    void NotifyWindowStyleChange(WindowStyleType type);
52e0dac50fSopenharmony_ci    void UpdatePiPWindowStateChanged(const std::string& bundleName, bool isForeground);
53e0dac50fSopenharmony_ci    void NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>>& infos,
54e0dac50fSopenharmony_ci        WindowUpdateType type);
55e0dac50fSopenharmony_ci
56e0dac50fSopenharmony_ci    static inline SingletonDelegator<WindowManagerLite> delegator_;
57e0dac50fSopenharmony_ci
58e0dac50fSopenharmony_ci    std::recursive_mutex& mutex_;
59e0dac50fSopenharmony_ci    std::vector<sptr<IFocusChangedListener>> focusChangedListeners_;
60e0dac50fSopenharmony_ci    sptr<WindowManagerAgentLite> focusChangedListenerAgent_;
61e0dac50fSopenharmony_ci    std::vector<sptr<IWindowUpdateListener>> windowUpdateListeners_;
62e0dac50fSopenharmony_ci    sptr<WindowManagerAgentLite> windowUpdateListenerAgent_;
63e0dac50fSopenharmony_ci    std::vector<sptr<IVisibilityChangedListener>> windowVisibilityListeners_;
64e0dac50fSopenharmony_ci    sptr<WindowManagerAgentLite> windowVisibilityListenerAgent_;
65e0dac50fSopenharmony_ci    std::vector<sptr<IDrawingContentChangedListener>> windowDrawingContentListeners_;
66e0dac50fSopenharmony_ci    sptr<WindowManagerAgentLite> windowDrawingContentListenerAgent_;
67e0dac50fSopenharmony_ci    std::vector<sptr<IWindowModeChangedListener>> windowModeListeners_;
68e0dac50fSopenharmony_ci    sptr<WindowManagerAgentLite> windowModeListenerAgent_;
69e0dac50fSopenharmony_ci    std::vector<sptr<ICameraWindowChangedListener>> cameraWindowChangedListeners_;
70e0dac50fSopenharmony_ci    sptr<WindowManagerAgentLite> cameraWindowChangedListenerAgent_;
71e0dac50fSopenharmony_ci    sptr<IWMSConnectionChangedListener> wmsConnectionChangedListener_;
72e0dac50fSopenharmony_ci    std::vector<sptr<IWindowStyleChangedListener>> windowStyleListeners_;
73e0dac50fSopenharmony_ci    sptr<WindowManagerAgentLite> windowStyleListenerAgent_;
74e0dac50fSopenharmony_ci    std::vector<sptr<IPiPStateChangedListener>> pipStateChangedListeners_;
75e0dac50fSopenharmony_ci    sptr<WindowManagerAgentLite> pipStateChangedListenerAgent_;
76e0dac50fSopenharmony_ci};
77e0dac50fSopenharmony_ci
78e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyWMSConnected(int32_t userId, int32_t screenId)
79e0dac50fSopenharmony_ci{
80e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_MULTI_USER, "WMS connected [userId:%{public}d; screenId:%{public}d]", userId, screenId);
81e0dac50fSopenharmony_ci    sptr<IWMSConnectionChangedListener> wmsConnectionChangedListener;
82e0dac50fSopenharmony_ci    {
83e0dac50fSopenharmony_ci        std::lock_guard<std::recursive_mutex> lock(mutex_);
84e0dac50fSopenharmony_ci        wmsConnectionChangedListener = wmsConnectionChangedListener_;
85e0dac50fSopenharmony_ci    }
86e0dac50fSopenharmony_ci    if (wmsConnectionChangedListener != nullptr) {
87e0dac50fSopenharmony_ci        wmsConnectionChangedListener->OnConnected(userId, screenId);
88e0dac50fSopenharmony_ci    }
89e0dac50fSopenharmony_ci}
90e0dac50fSopenharmony_ci
91e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyWMSDisconnected(int32_t userId, int32_t screenId)
92e0dac50fSopenharmony_ci{
93e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_MULTI_USER, "WMS disconnected [userId:%{public}d; screenId:%{public}d]", userId, screenId);
94e0dac50fSopenharmony_ci    sptr<IWMSConnectionChangedListener> wmsConnectionChangedListener;
95e0dac50fSopenharmony_ci    {
96e0dac50fSopenharmony_ci        std::lock_guard<std::recursive_mutex> lock(mutex_);
97e0dac50fSopenharmony_ci        wmsConnectionChangedListener = wmsConnectionChangedListener_;
98e0dac50fSopenharmony_ci    }
99e0dac50fSopenharmony_ci    if (wmsConnectionChangedListener != nullptr) {
100e0dac50fSopenharmony_ci        wmsConnectionChangedListener->OnDisconnected(userId, screenId);
101e0dac50fSopenharmony_ci    }
102e0dac50fSopenharmony_ci}
103e0dac50fSopenharmony_ci
104e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyFocused(const sptr<FocusChangeInfo>& focusChangeInfo)
105e0dac50fSopenharmony_ci{
106e0dac50fSopenharmony_ci    if (focusChangeInfo == nullptr) {
107e0dac50fSopenharmony_ci        return;
108e0dac50fSopenharmony_ci    }
109e0dac50fSopenharmony_ci    WLOGFD("[WMSFocus]NotifyFocused [%{public}u; %{public}" PRIu64"; %{public}d; %{public}d; %{public}u]",
110e0dac50fSopenharmony_ci        focusChangeInfo->windowId_, focusChangeInfo->displayId_, focusChangeInfo->pid_, focusChangeInfo->uid_,
111e0dac50fSopenharmony_ci        static_cast<uint32_t>(focusChangeInfo->windowType_));
112e0dac50fSopenharmony_ci
113e0dac50fSopenharmony_ci    std::vector<sptr<IFocusChangedListener>> focusChangeListeners;
114e0dac50fSopenharmony_ci    {
115e0dac50fSopenharmony_ci        std::lock_guard<std::recursive_mutex> lock(mutex_);
116e0dac50fSopenharmony_ci        focusChangeListeners = focusChangedListeners_;
117e0dac50fSopenharmony_ci    }
118e0dac50fSopenharmony_ci    WLOGFD("NotifyFocused listeners: %{public}zu", focusChangeListeners.size());
119e0dac50fSopenharmony_ci    for (auto& listener : focusChangeListeners) {
120e0dac50fSopenharmony_ci        if (listener == nullptr) {
121e0dac50fSopenharmony_ci            continue;
122e0dac50fSopenharmony_ci        }
123e0dac50fSopenharmony_ci        listener->OnFocused(focusChangeInfo);
124e0dac50fSopenharmony_ci    }
125e0dac50fSopenharmony_ci}
126e0dac50fSopenharmony_ci
127e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyUnfocused(const sptr<FocusChangeInfo>& focusChangeInfo)
128e0dac50fSopenharmony_ci{
129e0dac50fSopenharmony_ci    if (focusChangeInfo == nullptr) {
130e0dac50fSopenharmony_ci        return;
131e0dac50fSopenharmony_ci    }
132e0dac50fSopenharmony_ci    WLOGFD("[WMSFocus]NotifyUnfocused [%{public}u; %{public}" PRIu64"; %{public}d; %{public}d; %{public}u]",
133e0dac50fSopenharmony_ci        focusChangeInfo->windowId_, focusChangeInfo->displayId_, focusChangeInfo->pid_, focusChangeInfo->uid_,
134e0dac50fSopenharmony_ci        static_cast<uint32_t>(focusChangeInfo->windowType_));
135e0dac50fSopenharmony_ci
136e0dac50fSopenharmony_ci    std::vector<sptr<IFocusChangedListener>> focusChangeListeners;
137e0dac50fSopenharmony_ci    {
138e0dac50fSopenharmony_ci        std::lock_guard<std::recursive_mutex> lock(mutex_);
139e0dac50fSopenharmony_ci        focusChangeListeners = focusChangedListeners_;
140e0dac50fSopenharmony_ci    }
141e0dac50fSopenharmony_ci    WLOGFD("NotifyUnfocused listeners: %{public}zu", focusChangeListeners.size());
142e0dac50fSopenharmony_ci    for (auto& listener : focusChangeListeners) {
143e0dac50fSopenharmony_ci        if (listener == nullptr) {
144e0dac50fSopenharmony_ci            continue;
145e0dac50fSopenharmony_ci        }
146e0dac50fSopenharmony_ci        listener->OnUnfocused(focusChangeInfo);
147e0dac50fSopenharmony_ci    }
148e0dac50fSopenharmony_ci}
149e0dac50fSopenharmony_ci
150e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyWindowVisibilityInfoChanged(
151e0dac50fSopenharmony_ci    const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos)
152e0dac50fSopenharmony_ci{
153e0dac50fSopenharmony_ci    std::vector<sptr<IVisibilityChangedListener>> visibilityChangeListeners;
154e0dac50fSopenharmony_ci    {
155e0dac50fSopenharmony_ci        std::lock_guard<std::recursive_mutex> lock(mutex_);
156e0dac50fSopenharmony_ci        visibilityChangeListeners = windowVisibilityListeners_;
157e0dac50fSopenharmony_ci    }
158e0dac50fSopenharmony_ci    for (auto& listener : visibilityChangeListeners) {
159e0dac50fSopenharmony_ci        if (listener == nullptr) {
160e0dac50fSopenharmony_ci            continue;
161e0dac50fSopenharmony_ci        }
162e0dac50fSopenharmony_ci        listener->OnWindowVisibilityChanged(windowVisibilityInfos);
163e0dac50fSopenharmony_ci    }
164e0dac50fSopenharmony_ci}
165e0dac50fSopenharmony_ci
166e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyWindowDrawingContentInfoChanged(
167e0dac50fSopenharmony_ci    const std::vector<sptr<WindowDrawingContentInfo>>& windowDrawingContentInfos)
168e0dac50fSopenharmony_ci{
169e0dac50fSopenharmony_ci    std::vector<sptr<IDrawingContentChangedListener>> windowDrawingContentChangeListeners;
170e0dac50fSopenharmony_ci    {
171e0dac50fSopenharmony_ci        std::lock_guard<std::recursive_mutex> lock(mutex_);
172e0dac50fSopenharmony_ci        windowDrawingContentChangeListeners = windowDrawingContentListeners_;
173e0dac50fSopenharmony_ci    }
174e0dac50fSopenharmony_ci    for (auto& listener : windowDrawingContentChangeListeners) {
175e0dac50fSopenharmony_ci        if (listener == nullptr) {
176e0dac50fSopenharmony_ci            continue;
177e0dac50fSopenharmony_ci        }
178e0dac50fSopenharmony_ci        listener->OnWindowDrawingContentChanged(windowDrawingContentInfos);
179e0dac50fSopenharmony_ci    }
180e0dac50fSopenharmony_ci}
181e0dac50fSopenharmony_ci
182e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyWindowModeChange(WindowModeType type)
183e0dac50fSopenharmony_ci{
184e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_MAIN, "WindowManager::Impl UpdateWindowModeTypeInfo type: %{public}d",
185e0dac50fSopenharmony_ci          static_cast<uint8_t>(type));
186e0dac50fSopenharmony_ci    std::vector<sptr<IWindowModeChangedListener>> windowModeListeners;
187e0dac50fSopenharmony_ci    {
188e0dac50fSopenharmony_ci        std::lock_guard<std::recursive_mutex> lock(mutex_);
189e0dac50fSopenharmony_ci        windowModeListeners = windowModeListeners_;
190e0dac50fSopenharmony_ci    }
191e0dac50fSopenharmony_ci    for (auto &listener : windowModeListeners) {
192e0dac50fSopenharmony_ci        listener->OnWindowModeUpdate(type);
193e0dac50fSopenharmony_ci    }
194e0dac50fSopenharmony_ci}
195e0dac50fSopenharmony_ci
196e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>>& infos,
197e0dac50fSopenharmony_ci    WindowUpdateType type)
198e0dac50fSopenharmony_ci{
199e0dac50fSopenharmony_ci    if (infos.empty()) {
200e0dac50fSopenharmony_ci        WLOGFE("infos is empty");
201e0dac50fSopenharmony_ci        return;
202e0dac50fSopenharmony_ci    }
203e0dac50fSopenharmony_ci    for (auto& info : infos) {
204e0dac50fSopenharmony_ci        if (info == nullptr) {
205e0dac50fSopenharmony_ci            TLOGD(WmsLogTag::WMS_MAIN, "info is nullptr");
206e0dac50fSopenharmony_ci            continue;
207e0dac50fSopenharmony_ci        }
208e0dac50fSopenharmony_ci        TLOGD(WmsLogTag::WMS_MAIN, "wid[%{public}u], innerWid[%{public}u], "
209e0dac50fSopenharmony_ci            "uiNodeId[%{public}u], rect[%{public}d %{public}d %{public}d %{public}d], "
210e0dac50fSopenharmony_ci            "isFocused[%{public}d], isDecorEnable[%{public}d], displayId[%{public}" PRIu64 "], layer[%{public}u], "
211e0dac50fSopenharmony_ci            "mode[%{public}u], type[%{public}u, updateType[%{public}d], bundle[%{public}s]",
212e0dac50fSopenharmony_ci            info->wid_, info->innerWid_, info->uiNodeId_, info->windowRect_.width_, info->windowRect_.height_,
213e0dac50fSopenharmony_ci            info->windowRect_.posX_, info->windowRect_.posY_, info->focused_, info->isDecorEnable_, info->displayId_,
214e0dac50fSopenharmony_ci            info->layer_, info->mode_, info->type_, type, info->bundleName_.c_str());
215e0dac50fSopenharmony_ci        for (const auto& rect : info->touchHotAreas_) {
216e0dac50fSopenharmony_ci            TLOGD(WmsLogTag::WMS_MAIN, "window touch hot areas rect[x=%{public}d, y=%{public}d, "
217e0dac50fSopenharmony_ci            "w=%{public}d, h=%{public}d]", rect.posX_, rect.posY_, rect.width_, rect.height_);
218e0dac50fSopenharmony_ci        }
219e0dac50fSopenharmony_ci    }
220e0dac50fSopenharmony_ci
221e0dac50fSopenharmony_ci    std::vector<sptr<IWindowUpdateListener>> windowUpdateListeners;
222e0dac50fSopenharmony_ci    {
223e0dac50fSopenharmony_ci        std::lock_guard<std::recursive_mutex> lock(mutex_);
224e0dac50fSopenharmony_ci        windowUpdateListeners = windowUpdateListeners_;
225e0dac50fSopenharmony_ci    }
226e0dac50fSopenharmony_ci    for (auto& listener : windowUpdateListeners) {
227e0dac50fSopenharmony_ci        listener->OnWindowUpdate(infos, type);
228e0dac50fSopenharmony_ci    }
229e0dac50fSopenharmony_ci}
230e0dac50fSopenharmony_ci
231e0dac50fSopenharmony_civoid WindowManagerLite::Impl::UpdateCameraWindowStatus(uint32_t accessTokenId, bool isShowing)
232e0dac50fSopenharmony_ci{
233e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_SYSTEM, "Camera window, accessTokenId = %{public}u, isShowing = %{public}u",
234e0dac50fSopenharmony_ci        accessTokenId, isShowing);
235e0dac50fSopenharmony_ci    std::vector<sptr<ICameraWindowChangedListener>> cameraWindowChangeListeners;
236e0dac50fSopenharmony_ci    {
237e0dac50fSopenharmony_ci        std::lock_guard<std::recursive_mutex> lock(mutex_);
238e0dac50fSopenharmony_ci        cameraWindowChangeListeners = cameraWindowChangedListeners_;
239e0dac50fSopenharmony_ci    }
240e0dac50fSopenharmony_ci    for (auto& listener : cameraWindowChangeListeners) {
241e0dac50fSopenharmony_ci        listener->OnCameraWindowChange(accessTokenId, isShowing);
242e0dac50fSopenharmony_ci    }
243e0dac50fSopenharmony_ci}
244e0dac50fSopenharmony_ci
245e0dac50fSopenharmony_civoid WindowManagerLite::Impl::NotifyWindowStyleChange(WindowStyleType type)
246e0dac50fSopenharmony_ci{
247e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_MAIN, "WindowStyleChange: %{public}d",
248e0dac50fSopenharmony_ci          static_cast<uint8_t>(type));
249e0dac50fSopenharmony_ci    std::vector<sptr<IWindowStyleChangedListener>> windowStyleListeners;
250e0dac50fSopenharmony_ci    {
251e0dac50fSopenharmony_ci        std::lock_guard<std::recursive_mutex> lock(mutex_);
252e0dac50fSopenharmony_ci        windowStyleListeners = windowStyleListeners_;
253e0dac50fSopenharmony_ci    }
254e0dac50fSopenharmony_ci    for (auto &listener : windowStyleListeners) {
255e0dac50fSopenharmony_ci        TLOGI(WmsLogTag::WMS_MAIN, "real WindowStyleChange type: %{public}d",
256e0dac50fSopenharmony_ci              static_cast<uint8_t>(type));
257e0dac50fSopenharmony_ci        listener->OnWindowStyleUpdate(type);
258e0dac50fSopenharmony_ci    }
259e0dac50fSopenharmony_ci}
260e0dac50fSopenharmony_ci
261e0dac50fSopenharmony_civoid WindowManagerLite::Impl::UpdatePiPWindowStateChanged(const std::string& bundleName, bool isForeground)
262e0dac50fSopenharmony_ci{
263e0dac50fSopenharmony_ci    std::vector<sptr<IPiPStateChangedListener>> pipStateChangedListeners;
264e0dac50fSopenharmony_ci    {
265e0dac50fSopenharmony_ci        std::lock_guard<std::recursive_mutex> lock(mutex_);
266e0dac50fSopenharmony_ci        pipStateChangedListeners = pipStateChangedListeners_;
267e0dac50fSopenharmony_ci    }
268e0dac50fSopenharmony_ci    for (auto& listener : pipStateChangedListeners) {
269e0dac50fSopenharmony_ci        if (listener == nullptr) {
270e0dac50fSopenharmony_ci            continue;
271e0dac50fSopenharmony_ci        }
272e0dac50fSopenharmony_ci        listener->OnPiPStateChanged(bundleName, isForeground);
273e0dac50fSopenharmony_ci    }
274e0dac50fSopenharmony_ci}
275e0dac50fSopenharmony_ci
276e0dac50fSopenharmony_ciWindowManagerLite::WindowManagerLite() : pImpl_(std::make_unique<Impl>(mutex_))
277e0dac50fSopenharmony_ci{
278e0dac50fSopenharmony_ci}
279e0dac50fSopenharmony_ci
280e0dac50fSopenharmony_ciWindowManagerLite::~WindowManagerLite()
281e0dac50fSopenharmony_ci{
282e0dac50fSopenharmony_ci    std::lock_guard<std::recursive_mutex> lock(mutex_);
283e0dac50fSopenharmony_ci    destroyed_ = true;
284e0dac50fSopenharmony_ci}
285e0dac50fSopenharmony_ci
286e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterFocusChangedListener(const sptr<IFocusChangedListener>& listener)
287e0dac50fSopenharmony_ci{
288e0dac50fSopenharmony_ci    if (listener == nullptr) {
289e0dac50fSopenharmony_ci        WLOGFE("listener could not be null");
290e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
291e0dac50fSopenharmony_ci    }
292e0dac50fSopenharmony_ci
293e0dac50fSopenharmony_ci    std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
294e0dac50fSopenharmony_ci    WMError ret = WMError::WM_OK;
295e0dac50fSopenharmony_ci    if (pImpl_->focusChangedListenerAgent_ == nullptr) {
296e0dac50fSopenharmony_ci        pImpl_->focusChangedListenerAgent_ = new (std::nothrow) WindowManagerAgentLite();
297e0dac50fSopenharmony_ci        ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
298e0dac50fSopenharmony_ci            WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_FOCUS, pImpl_->focusChangedListenerAgent_);
299e0dac50fSopenharmony_ci    }
300e0dac50fSopenharmony_ci    if (ret != WMError::WM_OK) {
301e0dac50fSopenharmony_ci        WLOGFW("RegisterWindowManagerAgent failed !");
302e0dac50fSopenharmony_ci        pImpl_->focusChangedListenerAgent_ = nullptr;
303e0dac50fSopenharmony_ci    } else {
304e0dac50fSopenharmony_ci        auto iter = std::find(pImpl_->focusChangedListeners_.begin(), pImpl_->focusChangedListeners_.end(), listener);
305e0dac50fSopenharmony_ci        if (iter != pImpl_->focusChangedListeners_.end()) {
306e0dac50fSopenharmony_ci            WLOGFW("Listener is already registered.");
307e0dac50fSopenharmony_ci            return WMError::WM_OK;
308e0dac50fSopenharmony_ci        }
309e0dac50fSopenharmony_ci        pImpl_->focusChangedListeners_.push_back(listener);
310e0dac50fSopenharmony_ci    }
311e0dac50fSopenharmony_ci    return ret;
312e0dac50fSopenharmony_ci}
313e0dac50fSopenharmony_ci
314e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterFocusChangedListener(const sptr<IFocusChangedListener>& listener)
315e0dac50fSopenharmony_ci{
316e0dac50fSopenharmony_ci    if (listener == nullptr) {
317e0dac50fSopenharmony_ci        WLOGFE("listener could not be null");
318e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
319e0dac50fSopenharmony_ci    }
320e0dac50fSopenharmony_ci
321e0dac50fSopenharmony_ci    std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
322e0dac50fSopenharmony_ci    auto iter = std::find(pImpl_->focusChangedListeners_.begin(), pImpl_->focusChangedListeners_.end(), listener);
323e0dac50fSopenharmony_ci    if (iter == pImpl_->focusChangedListeners_.end()) {
324e0dac50fSopenharmony_ci        WLOGFE("could not find this listener");
325e0dac50fSopenharmony_ci        return WMError::WM_OK;
326e0dac50fSopenharmony_ci    }
327e0dac50fSopenharmony_ci    pImpl_->focusChangedListeners_.erase(iter);
328e0dac50fSopenharmony_ci    WMError ret = WMError::WM_OK;
329e0dac50fSopenharmony_ci    if (pImpl_->focusChangedListeners_.empty() && pImpl_->focusChangedListenerAgent_ != nullptr) {
330e0dac50fSopenharmony_ci        ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
331e0dac50fSopenharmony_ci            WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_FOCUS, pImpl_->focusChangedListenerAgent_);
332e0dac50fSopenharmony_ci        if (ret == WMError::WM_OK) {
333e0dac50fSopenharmony_ci            pImpl_->focusChangedListenerAgent_ = nullptr;
334e0dac50fSopenharmony_ci        }
335e0dac50fSopenharmony_ci    }
336e0dac50fSopenharmony_ci    return ret;
337e0dac50fSopenharmony_ci}
338e0dac50fSopenharmony_ci
339e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterVisibilityChangedListener(const sptr<IVisibilityChangedListener>& listener)
340e0dac50fSopenharmony_ci{
341e0dac50fSopenharmony_ci    if (listener == nullptr) {
342e0dac50fSopenharmony_ci        WLOGFE("listener could not be null");
343e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
344e0dac50fSopenharmony_ci    }
345e0dac50fSopenharmony_ci    std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
346e0dac50fSopenharmony_ci    WMError ret = WMError::WM_OK;
347e0dac50fSopenharmony_ci    if (pImpl_->windowVisibilityListenerAgent_ == nullptr) {
348e0dac50fSopenharmony_ci        pImpl_->windowVisibilityListenerAgent_ = new (std::nothrow) WindowManagerAgentLite();
349e0dac50fSopenharmony_ci        ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
350e0dac50fSopenharmony_ci            WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_VISIBILITY,
351e0dac50fSopenharmony_ci            pImpl_->windowVisibilityListenerAgent_);
352e0dac50fSopenharmony_ci    }
353e0dac50fSopenharmony_ci    if (ret != WMError::WM_OK) {
354e0dac50fSopenharmony_ci        WLOGFW("RegisterWindowManagerAgent failed !");
355e0dac50fSopenharmony_ci        pImpl_->windowVisibilityListenerAgent_ = nullptr;
356e0dac50fSopenharmony_ci    } else {
357e0dac50fSopenharmony_ci        auto iter = std::find(pImpl_->windowVisibilityListeners_.begin(), pImpl_->windowVisibilityListeners_.end(),
358e0dac50fSopenharmony_ci            listener);
359e0dac50fSopenharmony_ci        if (iter != pImpl_->windowVisibilityListeners_.end()) {
360e0dac50fSopenharmony_ci            WLOGFW("Listener is already registered.");
361e0dac50fSopenharmony_ci            return WMError::WM_OK;
362e0dac50fSopenharmony_ci        }
363e0dac50fSopenharmony_ci        pImpl_->windowVisibilityListeners_.emplace_back(listener);
364e0dac50fSopenharmony_ci    }
365e0dac50fSopenharmony_ci    return ret;
366e0dac50fSopenharmony_ci}
367e0dac50fSopenharmony_ci
368e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterVisibilityChangedListener(const sptr<IVisibilityChangedListener>& listener)
369e0dac50fSopenharmony_ci{
370e0dac50fSopenharmony_ci    if (listener == nullptr) {
371e0dac50fSopenharmony_ci        WLOGFE("listener could not be null");
372e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
373e0dac50fSopenharmony_ci    }
374e0dac50fSopenharmony_ci    std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
375e0dac50fSopenharmony_ci    pImpl_->windowVisibilityListeners_.erase(std::remove_if(pImpl_->windowVisibilityListeners_.begin(),
376e0dac50fSopenharmony_ci        pImpl_->windowVisibilityListeners_.end(), [listener](sptr<IVisibilityChangedListener> registeredListener) {
377e0dac50fSopenharmony_ci            return registeredListener == listener;
378e0dac50fSopenharmony_ci        }), pImpl_->windowVisibilityListeners_.end());
379e0dac50fSopenharmony_ci
380e0dac50fSopenharmony_ci    WMError ret = WMError::WM_OK;
381e0dac50fSopenharmony_ci    if (pImpl_->windowVisibilityListeners_.empty() && pImpl_->windowVisibilityListenerAgent_ != nullptr) {
382e0dac50fSopenharmony_ci        ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
383e0dac50fSopenharmony_ci            WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_VISIBILITY,
384e0dac50fSopenharmony_ci            pImpl_->windowVisibilityListenerAgent_);
385e0dac50fSopenharmony_ci        if (ret == WMError::WM_OK) {
386e0dac50fSopenharmony_ci            pImpl_->windowVisibilityListenerAgent_ = nullptr;
387e0dac50fSopenharmony_ci        }
388e0dac50fSopenharmony_ci    }
389e0dac50fSopenharmony_ci    return ret;
390e0dac50fSopenharmony_ci}
391e0dac50fSopenharmony_ci
392e0dac50fSopenharmony_civoid WindowManagerLite::GetFocusWindowInfo(FocusChangeInfo& focusInfo)
393e0dac50fSopenharmony_ci{
394e0dac50fSopenharmony_ci    WLOGFD("In");
395e0dac50fSopenharmony_ci    SingletonContainer::Get<WindowAdapterLite>().GetFocusWindowInfo(focusInfo);
396e0dac50fSopenharmony_ci}
397e0dac50fSopenharmony_ci
398e0dac50fSopenharmony_civoid WindowManagerLite::UpdateFocusChangeInfo(const sptr<FocusChangeInfo>& focusChangeInfo, bool focused) const
399e0dac50fSopenharmony_ci{
400e0dac50fSopenharmony_ci    if (focusChangeInfo == nullptr) {
401e0dac50fSopenharmony_ci        WLOGFE("focusChangeInfo is nullptr.");
402e0dac50fSopenharmony_ci        return;
403e0dac50fSopenharmony_ci    }
404e0dac50fSopenharmony_ci    WLOGFD("[WMSFocus]window focus change: %{public}d, id: %{public}u", focused, focusChangeInfo->windowId_);
405e0dac50fSopenharmony_ci    if (focused) {
406e0dac50fSopenharmony_ci        pImpl_->NotifyFocused(focusChangeInfo);
407e0dac50fSopenharmony_ci    } else {
408e0dac50fSopenharmony_ci        pImpl_->NotifyUnfocused(focusChangeInfo);
409e0dac50fSopenharmony_ci    }
410e0dac50fSopenharmony_ci}
411e0dac50fSopenharmony_ci
412e0dac50fSopenharmony_civoid WindowManagerLite::UpdateWindowVisibilityInfo(
413e0dac50fSopenharmony_ci    const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos) const
414e0dac50fSopenharmony_ci{
415e0dac50fSopenharmony_ci    pImpl_->NotifyWindowVisibilityInfoChanged(windowVisibilityInfos);
416e0dac50fSopenharmony_ci}
417e0dac50fSopenharmony_ci
418e0dac50fSopenharmony_ciWMError WindowManagerLite::GetVisibilityWindowInfo(std::vector<sptr<WindowVisibilityInfo>>& infos) const
419e0dac50fSopenharmony_ci{
420e0dac50fSopenharmony_ci    WMError ret = SingletonContainer::Get<WindowAdapterLite>().GetVisibilityWindowInfo(infos);
421e0dac50fSopenharmony_ci    if (ret != WMError::WM_OK) {
422e0dac50fSopenharmony_ci        WLOGFE("get window visibility info failed");
423e0dac50fSopenharmony_ci    }
424e0dac50fSopenharmony_ci    return ret;
425e0dac50fSopenharmony_ci}
426e0dac50fSopenharmony_ci
427e0dac50fSopenharmony_civoid WindowManagerLite::UpdateWindowDrawingContentInfo(
428e0dac50fSopenharmony_ci    const std::vector<sptr<WindowDrawingContentInfo>>& windowDrawingContentInfos) const
429e0dac50fSopenharmony_ci{
430e0dac50fSopenharmony_ci    pImpl_->NotifyWindowDrawingContentInfoChanged(windowDrawingContentInfos);
431e0dac50fSopenharmony_ci}
432e0dac50fSopenharmony_ci
433e0dac50fSopenharmony_civoid WindowManagerLite::UpdateCameraWindowStatus(uint32_t accessTokenId, bool isShowing) const
434e0dac50fSopenharmony_ci{
435e0dac50fSopenharmony_ci    pImpl_->UpdateCameraWindowStatus(accessTokenId, isShowing);
436e0dac50fSopenharmony_ci}
437e0dac50fSopenharmony_ci
438e0dac50fSopenharmony_civoid WindowManagerLite::OnRemoteDied()
439e0dac50fSopenharmony_ci{
440e0dac50fSopenharmony_ci    WLOGI("wms is died");
441e0dac50fSopenharmony_ci    std::lock_guard<std::recursive_mutex> lock(mutex_);
442e0dac50fSopenharmony_ci    if (destroyed_) {
443e0dac50fSopenharmony_ci        WLOGE("Already destroyed");
444e0dac50fSopenharmony_ci        return;
445e0dac50fSopenharmony_ci    }
446e0dac50fSopenharmony_ci    pImpl_->focusChangedListenerAgent_ = nullptr;
447e0dac50fSopenharmony_ci    pImpl_->windowUpdateListenerAgent_ = nullptr;
448e0dac50fSopenharmony_ci    pImpl_->windowVisibilityListenerAgent_ = nullptr;
449e0dac50fSopenharmony_ci    pImpl_->windowDrawingContentListenerAgent_ = nullptr;
450e0dac50fSopenharmony_ci}
451e0dac50fSopenharmony_ci
452e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterDrawingContentChangedListener(const sptr<IDrawingContentChangedListener>& listener)
453e0dac50fSopenharmony_ci{
454e0dac50fSopenharmony_ci    if (listener == nullptr) {
455e0dac50fSopenharmony_ci        WLOGFE("listener could not be null");
456e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
457e0dac50fSopenharmony_ci    }
458e0dac50fSopenharmony_ci    std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
459e0dac50fSopenharmony_ci    WMError ret = WMError::WM_OK;
460e0dac50fSopenharmony_ci    if (pImpl_->windowDrawingContentListenerAgent_ == nullptr) {
461e0dac50fSopenharmony_ci        pImpl_->windowDrawingContentListenerAgent_ = new (std::nothrow) WindowManagerAgentLite();
462e0dac50fSopenharmony_ci        ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
463e0dac50fSopenharmony_ci            WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_DRAWING_STATE,
464e0dac50fSopenharmony_ci            pImpl_->windowDrawingContentListenerAgent_);
465e0dac50fSopenharmony_ci    }
466e0dac50fSopenharmony_ci    if (ret != WMError::WM_OK) {
467e0dac50fSopenharmony_ci        WLOGFW("RegisterWindowManagerAgent failed !");
468e0dac50fSopenharmony_ci        pImpl_->windowDrawingContentListenerAgent_ = nullptr;
469e0dac50fSopenharmony_ci    } else {
470e0dac50fSopenharmony_ci        auto iter = std::find(pImpl_->windowDrawingContentListeners_.begin(),
471e0dac50fSopenharmony_ci            pImpl_->windowDrawingContentListeners_.end(), listener);
472e0dac50fSopenharmony_ci        if (iter != pImpl_->windowDrawingContentListeners_.end()) {
473e0dac50fSopenharmony_ci            WLOGFW("Listener is already registered.");
474e0dac50fSopenharmony_ci            return WMError::WM_OK;
475e0dac50fSopenharmony_ci        }
476e0dac50fSopenharmony_ci        pImpl_->windowDrawingContentListeners_.emplace_back(listener);
477e0dac50fSopenharmony_ci    }
478e0dac50fSopenharmony_ci    return ret;
479e0dac50fSopenharmony_ci}
480e0dac50fSopenharmony_ci
481e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterDrawingContentChangedListener(const sptr<IDrawingContentChangedListener>& listener)
482e0dac50fSopenharmony_ci{
483e0dac50fSopenharmony_ci    if (listener == nullptr) {
484e0dac50fSopenharmony_ci        WLOGFE("listener could not be null");
485e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
486e0dac50fSopenharmony_ci    }
487e0dac50fSopenharmony_ci    std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
488e0dac50fSopenharmony_ci    pImpl_->windowDrawingContentListeners_.erase(std::remove_if(pImpl_->windowDrawingContentListeners_.begin(),
489e0dac50fSopenharmony_ci        pImpl_->windowDrawingContentListeners_.end(),
490e0dac50fSopenharmony_ci        [listener](sptr<IDrawingContentChangedListener> registeredListener) { return registeredListener == listener; }),
491e0dac50fSopenharmony_ci        pImpl_->windowDrawingContentListeners_.end());
492e0dac50fSopenharmony_ci
493e0dac50fSopenharmony_ci    WMError ret = WMError::WM_OK;
494e0dac50fSopenharmony_ci    if (pImpl_->windowDrawingContentListeners_.empty() && pImpl_->windowDrawingContentListenerAgent_ != nullptr) {
495e0dac50fSopenharmony_ci        ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
496e0dac50fSopenharmony_ci            WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_DRAWING_STATE,
497e0dac50fSopenharmony_ci            pImpl_->windowDrawingContentListenerAgent_);
498e0dac50fSopenharmony_ci        if (ret == WMError::WM_OK) {
499e0dac50fSopenharmony_ci            pImpl_->windowDrawingContentListenerAgent_ = nullptr;
500e0dac50fSopenharmony_ci        }
501e0dac50fSopenharmony_ci    }
502e0dac50fSopenharmony_ci    return ret;
503e0dac50fSopenharmony_ci}
504e0dac50fSopenharmony_ci
505e0dac50fSopenharmony_civoid WindowManagerLite::UpdateWindowModeTypeInfo(WindowModeType type) const
506e0dac50fSopenharmony_ci{
507e0dac50fSopenharmony_ci    pImpl_->NotifyWindowModeChange(type);
508e0dac50fSopenharmony_ci}
509e0dac50fSopenharmony_ci
510e0dac50fSopenharmony_civoid WindowManagerLite::NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>>& infos,
511e0dac50fSopenharmony_ci    WindowUpdateType type) const
512e0dac50fSopenharmony_ci{
513e0dac50fSopenharmony_ci    pImpl_->NotifyAccessibilityWindowInfo(infos, type);
514e0dac50fSopenharmony_ci}
515e0dac50fSopenharmony_ci
516e0dac50fSopenharmony_ciWMError WindowManagerLite::GetWindowModeType(WindowModeType& windowModeType) const
517e0dac50fSopenharmony_ci{
518e0dac50fSopenharmony_ci    WMError ret = SingletonContainer::Get<WindowAdapterLite>().GetWindowModeType(windowModeType);
519e0dac50fSopenharmony_ci    if (ret != WMError::WM_OK) {
520e0dac50fSopenharmony_ci        WLOGFE("get window visibility info failed");
521e0dac50fSopenharmony_ci    }
522e0dac50fSopenharmony_ci    return ret;
523e0dac50fSopenharmony_ci}
524e0dac50fSopenharmony_ci
525e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterWindowModeChangedListener(const sptr<IWindowModeChangedListener>& listener)
526e0dac50fSopenharmony_ci{
527e0dac50fSopenharmony_ci    if (listener == nullptr) {
528e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null");
529e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
530e0dac50fSopenharmony_ci    }
531e0dac50fSopenharmony_ci
532e0dac50fSopenharmony_ci    std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
533e0dac50fSopenharmony_ci    if (pImpl_->windowModeListenerAgent_ == nullptr) {
534e0dac50fSopenharmony_ci        pImpl_->windowModeListenerAgent_ = new (std::nothrow) WindowManagerAgentLite();
535e0dac50fSopenharmony_ci    }
536e0dac50fSopenharmony_ci    WMError ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
537e0dac50fSopenharmony_ci        WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_MODE, pImpl_->windowModeListenerAgent_);
538e0dac50fSopenharmony_ci    if (ret != WMError::WM_OK) {
539e0dac50fSopenharmony_ci        TLOGW(WmsLogTag::WMS_MAIN, "RegisterWindowManagerAgent failed!");
540e0dac50fSopenharmony_ci        pImpl_->windowModeListenerAgent_ = nullptr;
541e0dac50fSopenharmony_ci        return ret;
542e0dac50fSopenharmony_ci    }
543e0dac50fSopenharmony_ci    auto iter = std::find(pImpl_->windowModeListeners_.begin(), pImpl_->windowModeListeners_.end(), listener);
544e0dac50fSopenharmony_ci    if (iter != pImpl_->windowModeListeners_.end()) {
545e0dac50fSopenharmony_ci        TLOGW(WmsLogTag::WMS_MAIN, "Listener is already registered.");
546e0dac50fSopenharmony_ci        return WMError::WM_OK;
547e0dac50fSopenharmony_ci    }
548e0dac50fSopenharmony_ci    pImpl_->windowModeListeners_.push_back(listener);
549e0dac50fSopenharmony_ci    return ret;
550e0dac50fSopenharmony_ci}
551e0dac50fSopenharmony_ci
552e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterWindowModeChangedListener(const sptr<IWindowModeChangedListener>& listener)
553e0dac50fSopenharmony_ci{
554e0dac50fSopenharmony_ci    if (listener == nullptr) {
555e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null");
556e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
557e0dac50fSopenharmony_ci    }
558e0dac50fSopenharmony_ci
559e0dac50fSopenharmony_ci    std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
560e0dac50fSopenharmony_ci    auto iter = std::find(pImpl_->windowModeListeners_.begin(), pImpl_->windowModeListeners_.end(), listener);
561e0dac50fSopenharmony_ci    if (iter == pImpl_->windowModeListeners_.end()) {
562e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_MAIN, "could not find this listener");
563e0dac50fSopenharmony_ci        return WMError::WM_OK;
564e0dac50fSopenharmony_ci    }
565e0dac50fSopenharmony_ci    pImpl_->windowModeListeners_.erase(iter);
566e0dac50fSopenharmony_ci    WMError ret = WMError::WM_OK;
567e0dac50fSopenharmony_ci    if (pImpl_->windowModeListeners_.empty() && pImpl_->windowModeListenerAgent_ != nullptr) {
568e0dac50fSopenharmony_ci        ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
569e0dac50fSopenharmony_ci            WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_MODE, pImpl_->windowModeListenerAgent_);
570e0dac50fSopenharmony_ci        if (ret == WMError::WM_OK) {
571e0dac50fSopenharmony_ci            pImpl_->windowModeListenerAgent_ = nullptr;
572e0dac50fSopenharmony_ci        }
573e0dac50fSopenharmony_ci    }
574e0dac50fSopenharmony_ci    return ret;
575e0dac50fSopenharmony_ci}
576e0dac50fSopenharmony_ci
577e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterCameraWindowChangedListener(const sptr<ICameraWindowChangedListener>& listener)
578e0dac50fSopenharmony_ci{
579e0dac50fSopenharmony_ci    if (listener == nullptr) {
580e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_SYSTEM, "listener could not be null");
581e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
582e0dac50fSopenharmony_ci    }
583e0dac50fSopenharmony_ci
584e0dac50fSopenharmony_ci    std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
585e0dac50fSopenharmony_ci    if (pImpl_->cameraWindowChangedListenerAgent_ == nullptr) {
586e0dac50fSopenharmony_ci        pImpl_->cameraWindowChangedListenerAgent_ = new WindowManagerAgentLite();
587e0dac50fSopenharmony_ci    }
588e0dac50fSopenharmony_ci    WMError ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
589e0dac50fSopenharmony_ci        WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_CAMERA_WINDOW, pImpl_->cameraWindowChangedListenerAgent_);
590e0dac50fSopenharmony_ci    if (ret != WMError::WM_OK) {
591e0dac50fSopenharmony_ci        TLOGW(WmsLogTag::WMS_SYSTEM, "RegisterWindowManagerAgent failed!");
592e0dac50fSopenharmony_ci        pImpl_->cameraWindowChangedListenerAgent_ = nullptr;
593e0dac50fSopenharmony_ci    } else {
594e0dac50fSopenharmony_ci        auto iter = std::find(pImpl_->cameraWindowChangedListeners_.begin(),
595e0dac50fSopenharmony_ci            pImpl_->cameraWindowChangedListeners_.end(), listener);
596e0dac50fSopenharmony_ci        if (iter != pImpl_->cameraWindowChangedListeners_.end()) {
597e0dac50fSopenharmony_ci            TLOGW(WmsLogTag::WMS_SYSTEM, "Listener is already registered.");
598e0dac50fSopenharmony_ci            return WMError::WM_OK;
599e0dac50fSopenharmony_ci        }
600e0dac50fSopenharmony_ci        pImpl_->cameraWindowChangedListeners_.push_back(listener);
601e0dac50fSopenharmony_ci    }
602e0dac50fSopenharmony_ci    return ret;
603e0dac50fSopenharmony_ci}
604e0dac50fSopenharmony_ci
605e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterCameraWindowChangedListener(const sptr<ICameraWindowChangedListener>& listener)
606e0dac50fSopenharmony_ci{
607e0dac50fSopenharmony_ci    if (listener == nullptr) {
608e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_SYSTEM, "listener could not be null");
609e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
610e0dac50fSopenharmony_ci    }
611e0dac50fSopenharmony_ci
612e0dac50fSopenharmony_ci    std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
613e0dac50fSopenharmony_ci    auto iter = std::find(pImpl_->cameraWindowChangedListeners_.begin(),
614e0dac50fSopenharmony_ci        pImpl_->cameraWindowChangedListeners_.end(), listener);
615e0dac50fSopenharmony_ci    if (iter == pImpl_->cameraWindowChangedListeners_.end()) {
616e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_SYSTEM, "could not find this listener");
617e0dac50fSopenharmony_ci        return WMError::WM_OK;
618e0dac50fSopenharmony_ci    }
619e0dac50fSopenharmony_ci    pImpl_->cameraWindowChangedListeners_.erase(iter);
620e0dac50fSopenharmony_ci    WMError ret = WMError::WM_OK;
621e0dac50fSopenharmony_ci    if (pImpl_->cameraWindowChangedListeners_.empty() &&
622e0dac50fSopenharmony_ci        pImpl_->cameraWindowChangedListenerAgent_ != nullptr) {
623e0dac50fSopenharmony_ci        ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
624e0dac50fSopenharmony_ci            WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_CAMERA_WINDOW,
625e0dac50fSopenharmony_ci            pImpl_->cameraWindowChangedListenerAgent_);
626e0dac50fSopenharmony_ci        if (ret == WMError::WM_OK) {
627e0dac50fSopenharmony_ci            pImpl_->cameraWindowChangedListenerAgent_ = nullptr;
628e0dac50fSopenharmony_ci        }
629e0dac50fSopenharmony_ci    }
630e0dac50fSopenharmony_ci    return ret;
631e0dac50fSopenharmony_ci}
632e0dac50fSopenharmony_ci
633e0dac50fSopenharmony_ciWMError WindowManagerLite::GetMainWindowInfos(int32_t topNum, std::vector<MainWindowInfo>& topNInfo)
634e0dac50fSopenharmony_ci{
635e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_MAIN, "Get main window info lite");
636e0dac50fSopenharmony_ci    return SingletonContainer::Get<WindowAdapterLite>().GetMainWindowInfos(topNum, topNInfo);
637e0dac50fSopenharmony_ci}
638e0dac50fSopenharmony_ci
639e0dac50fSopenharmony_ciWMError WindowManagerLite::GetAllMainWindowInfos(std::vector<MainWindowInfo>& infos) const
640e0dac50fSopenharmony_ci{
641e0dac50fSopenharmony_ci    if (!infos.empty()) {
642e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_MAIN, "infos is not empty.");
643e0dac50fSopenharmony_ci        return WMError::WM_ERROR_INVALID_PARAM;
644e0dac50fSopenharmony_ci    }
645e0dac50fSopenharmony_ci    return SingletonContainer::Get<WindowAdapterLite>().GetAllMainWindowInfos(infos);
646e0dac50fSopenharmony_ci}
647e0dac50fSopenharmony_ci
648e0dac50fSopenharmony_ciWMError WindowManagerLite::ClearMainSessions(const std::vector<int32_t>& persistentIds)
649e0dac50fSopenharmony_ci{
650e0dac50fSopenharmony_ci    if (persistentIds.empty()) {
651e0dac50fSopenharmony_ci        TLOGW(WmsLogTag::WMS_MAIN, "Clear main Session failed, persistentIds is empty.");
652e0dac50fSopenharmony_ci        return WMError::WM_OK;
653e0dac50fSopenharmony_ci    }
654e0dac50fSopenharmony_ci    return SingletonContainer::Get<WindowAdapterLite>().ClearMainSessions(persistentIds);
655e0dac50fSopenharmony_ci}
656e0dac50fSopenharmony_ci
657e0dac50fSopenharmony_ciWMError WindowManagerLite::ClearMainSessions(const std::vector<int32_t>& persistentIds,
658e0dac50fSopenharmony_ci    std::vector<int32_t>& clearFailedIds)
659e0dac50fSopenharmony_ci{
660e0dac50fSopenharmony_ci    if (persistentIds.empty()) {
661e0dac50fSopenharmony_ci        TLOGW(WmsLogTag::WMS_MAIN, "Clear main Session failed, persistentIds is empty.");
662e0dac50fSopenharmony_ci        return WMError::WM_OK;
663e0dac50fSopenharmony_ci    }
664e0dac50fSopenharmony_ci    return SingletonContainer::Get<WindowAdapterLite>().ClearMainSessions(persistentIds, clearFailedIds);
665e0dac50fSopenharmony_ci}
666e0dac50fSopenharmony_ci
667e0dac50fSopenharmony_ciWMError WindowManagerLite::RaiseWindowToTop(int32_t persistentId)
668e0dac50fSopenharmony_ci{
669e0dac50fSopenharmony_ci    WMError ret = SingletonContainer::Get<WindowAdapterLite>().RaiseWindowToTop(persistentId);
670e0dac50fSopenharmony_ci    if (ret != WMError::WM_OK) {
671e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_SYSTEM, "raise window to top failed.");
672e0dac50fSopenharmony_ci    }
673e0dac50fSopenharmony_ci    return ret;
674e0dac50fSopenharmony_ci}
675e0dac50fSopenharmony_ci
676e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterWMSConnectionChangedListener(const sptr<IWMSConnectionChangedListener>& listener)
677e0dac50fSopenharmony_ci{
678e0dac50fSopenharmony_ci    int32_t clientUserId = GetUserIdByUid(getuid());
679e0dac50fSopenharmony_ci    if (clientUserId != SYSTEM_USERID) {
680e0dac50fSopenharmony_ci        TLOGW(WmsLogTag::WMS_MULTI_USER, "Not u0 user, permission denied");
681e0dac50fSopenharmony_ci        return WMError::WM_ERROR_INVALID_PERMISSION;
682e0dac50fSopenharmony_ci    }
683e0dac50fSopenharmony_ci    if (listener == nullptr) {
684e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_MULTI_USER, "WMS connection changed listener registered could not be null");
685e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
686e0dac50fSopenharmony_ci    }
687e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_MULTI_USER, "Register enter");
688e0dac50fSopenharmony_ci    {
689e0dac50fSopenharmony_ci        std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
690e0dac50fSopenharmony_ci        if (pImpl_->wmsConnectionChangedListener_) {
691e0dac50fSopenharmony_ci            TLOGI(WmsLogTag::WMS_MULTI_USER, "wmsConnectionChangedListener is already registered, do nothing");
692e0dac50fSopenharmony_ci            return WMError::WM_OK;
693e0dac50fSopenharmony_ci        }
694e0dac50fSopenharmony_ci        pImpl_->wmsConnectionChangedListener_ = listener;
695e0dac50fSopenharmony_ci    }
696e0dac50fSopenharmony_ci    auto ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWMSConnectionChangedListener(
697e0dac50fSopenharmony_ci        std::bind(&WindowManagerLite::OnWMSConnectionChanged, this, std::placeholders::_1, std::placeholders::_2,
698e0dac50fSopenharmony_ci            std::placeholders::_3));
699e0dac50fSopenharmony_ci    if (ret != WMError::WM_OK) {
700e0dac50fSopenharmony_ci        pImpl_->wmsConnectionChangedListener_ = nullptr;
701e0dac50fSopenharmony_ci    }
702e0dac50fSopenharmony_ci    return ret;
703e0dac50fSopenharmony_ci}
704e0dac50fSopenharmony_ci
705e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterWMSConnectionChangedListener()
706e0dac50fSopenharmony_ci{
707e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_MULTI_USER, "Unregister enter");
708e0dac50fSopenharmony_ci    std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
709e0dac50fSopenharmony_ci    pImpl_->wmsConnectionChangedListener_ = nullptr;
710e0dac50fSopenharmony_ci    return WMError::WM_OK;
711e0dac50fSopenharmony_ci}
712e0dac50fSopenharmony_ci
713e0dac50fSopenharmony_civoid WindowManagerLite::OnWMSConnectionChanged(int32_t userId, int32_t screenId, bool isConnected) const
714e0dac50fSopenharmony_ci{
715e0dac50fSopenharmony_ci    if (isConnected) {
716e0dac50fSopenharmony_ci        pImpl_->NotifyWMSConnected(userId, screenId);
717e0dac50fSopenharmony_ci    } else {
718e0dac50fSopenharmony_ci        pImpl_->NotifyWMSDisconnected(userId, screenId);
719e0dac50fSopenharmony_ci    }
720e0dac50fSopenharmony_ci}
721e0dac50fSopenharmony_ci
722e0dac50fSopenharmony_ciWMError WindowManagerLite::NotifyWindowStyleChange(WindowStyleType type)
723e0dac50fSopenharmony_ci{
724e0dac50fSopenharmony_ci    pImpl_->NotifyWindowStyleChange(type);
725e0dac50fSopenharmony_ci    return WMError::WM_OK;
726e0dac50fSopenharmony_ci}
727e0dac50fSopenharmony_ci
728e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterWindowStyleChangedListener(const sptr<IWindowStyleChangedListener>& listener)
729e0dac50fSopenharmony_ci{
730e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_MAIN, "start register windowStyleChangedListener");
731e0dac50fSopenharmony_ci    if (listener == nullptr) {
732e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null");
733e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
734e0dac50fSopenharmony_ci    }
735e0dac50fSopenharmony_ci    {
736e0dac50fSopenharmony_ci        std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
737e0dac50fSopenharmony_ci        if (pImpl_->windowStyleListenerAgent_ == nullptr) {
738e0dac50fSopenharmony_ci            pImpl_->windowStyleListenerAgent_ = new WindowManagerAgentLite();
739e0dac50fSopenharmony_ci        }
740e0dac50fSopenharmony_ci        auto iter = std::find(pImpl_->windowStyleListeners_.begin(), pImpl_->windowStyleListeners_.end(), listener);
741e0dac50fSopenharmony_ci        if (iter != pImpl_->windowStyleListeners_.end()) {
742e0dac50fSopenharmony_ci            TLOGW(WmsLogTag::WMS_MAIN, "Listener is already registered.");
743e0dac50fSopenharmony_ci            return WMError::WM_OK;
744e0dac50fSopenharmony_ci        }
745e0dac50fSopenharmony_ci        pImpl_->windowStyleListeners_.push_back(listener);
746e0dac50fSopenharmony_ci    }
747e0dac50fSopenharmony_ci    WMError ret = WMError::WM_OK;
748e0dac50fSopenharmony_ci    ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
749e0dac50fSopenharmony_ci        WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_STYLE, pImpl_->windowStyleListenerAgent_);
750e0dac50fSopenharmony_ci    if (ret != WMError::WM_OK) {
751e0dac50fSopenharmony_ci        TLOGW(WmsLogTag::WMS_MAIN, "RegisterWindowManagerAgent failed!");
752e0dac50fSopenharmony_ci        std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
753e0dac50fSopenharmony_ci        pImpl_->windowStyleListenerAgent_ = nullptr;
754e0dac50fSopenharmony_ci        auto iter = std::find(pImpl_->windowStyleListeners_.begin(), pImpl_->windowStyleListeners_.end(), listener);
755e0dac50fSopenharmony_ci        if (iter != pImpl_->windowStyleListeners_.end()) {
756e0dac50fSopenharmony_ci            pImpl_->windowStyleListeners_.erase(iter);
757e0dac50fSopenharmony_ci        }
758e0dac50fSopenharmony_ci    }
759e0dac50fSopenharmony_ci    return ret;
760e0dac50fSopenharmony_ci}
761e0dac50fSopenharmony_ci
762e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterWindowStyleChangedListener(const sptr<IWindowStyleChangedListener>& listener)
763e0dac50fSopenharmony_ci{
764e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_MAIN, "start unregister windowStyleChangedListener");
765e0dac50fSopenharmony_ci    if (listener == nullptr) {
766e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null");
767e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
768e0dac50fSopenharmony_ci    }
769e0dac50fSopenharmony_ci    {
770e0dac50fSopenharmony_ci        std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
771e0dac50fSopenharmony_ci        auto iter = std::find(pImpl_->windowStyleListeners_.begin(), pImpl_->windowStyleListeners_.end(), listener);
772e0dac50fSopenharmony_ci        if (iter == pImpl_->windowStyleListeners_.end()) {
773e0dac50fSopenharmony_ci            TLOGE(WmsLogTag::WMS_MAIN, "could not find this listener");
774e0dac50fSopenharmony_ci            return WMError::WM_OK;
775e0dac50fSopenharmony_ci        }
776e0dac50fSopenharmony_ci        pImpl_->windowStyleListeners_.erase(iter);
777e0dac50fSopenharmony_ci    }
778e0dac50fSopenharmony_ci    WMError ret = WMError::WM_OK;
779e0dac50fSopenharmony_ci    if (pImpl_->windowStyleListeners_.empty() && pImpl_->windowStyleListenerAgent_ != nullptr) {
780e0dac50fSopenharmony_ci        ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
781e0dac50fSopenharmony_ci            WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_STYLE, pImpl_->windowStyleListenerAgent_);
782e0dac50fSopenharmony_ci        if (ret == WMError::WM_OK) {
783e0dac50fSopenharmony_ci            std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
784e0dac50fSopenharmony_ci            pImpl_->windowStyleListenerAgent_ = nullptr;
785e0dac50fSopenharmony_ci        }
786e0dac50fSopenharmony_ci    }
787e0dac50fSopenharmony_ci    return ret;
788e0dac50fSopenharmony_ci}
789e0dac50fSopenharmony_ci
790e0dac50fSopenharmony_ciWindowStyleType WindowManagerLite::GetWindowStyleType()
791e0dac50fSopenharmony_ci{
792e0dac50fSopenharmony_ci    WindowStyleType styleType;
793e0dac50fSopenharmony_ci    if (SingletonContainer::Get<WindowAdapterLite>().GetWindowStyleType(styleType) == WMError::WM_OK) {
794e0dac50fSopenharmony_ci        return styleType;
795e0dac50fSopenharmony_ci    }
796e0dac50fSopenharmony_ci    return styleType;
797e0dac50fSopenharmony_ci}
798e0dac50fSopenharmony_ci
799e0dac50fSopenharmony_ci
800e0dac50fSopenharmony_ciWMError WindowManagerLite::TerminateSessionByPersistentId(int32_t persistentId)
801e0dac50fSopenharmony_ci{
802e0dac50fSopenharmony_ci    if (persistentId == INVALID_SESSION_ID) {
803e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_LIFE, "persistentId is invalid.");
804e0dac50fSopenharmony_ci        return WMError::WM_ERROR_INVALID_PARAM;
805e0dac50fSopenharmony_ci    }
806e0dac50fSopenharmony_ci    return SingletonContainer::Get<WindowAdapterLite>().TerminateSessionByPersistentId(persistentId);
807e0dac50fSopenharmony_ci}
808e0dac50fSopenharmony_ci
809e0dac50fSopenharmony_ciWMError WindowManagerLite::CloseTargetFloatWindow(const std::string& bundleName)
810e0dac50fSopenharmony_ci{
811e0dac50fSopenharmony_ci    if (bundleName.empty()) {
812e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_MULTI_WINDOW, "bundleName is empty.");
813e0dac50fSopenharmony_ci        return WMError::WM_ERROR_INVALID_PARAM;
814e0dac50fSopenharmony_ci    }
815e0dac50fSopenharmony_ci    return SingletonContainer::Get<WindowAdapterLite>().CloseTargetFloatWindow(bundleName);
816e0dac50fSopenharmony_ci}
817e0dac50fSopenharmony_ci
818e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterPiPStateChangedListener(const sptr<IPiPStateChangedListener>& listener)
819e0dac50fSopenharmony_ci{
820e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_PIP, "in");
821e0dac50fSopenharmony_ci    if (listener == nullptr) {
822e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_PIP, "listener could not be null");
823e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
824e0dac50fSopenharmony_ci    }
825e0dac50fSopenharmony_ci
826e0dac50fSopenharmony_ci    std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
827e0dac50fSopenharmony_ci    if (pImpl_->pipStateChangedListenerAgent_ == nullptr) {
828e0dac50fSopenharmony_ci        pImpl_->pipStateChangedListenerAgent_ = new WindowManagerAgentLite();
829e0dac50fSopenharmony_ci    }
830e0dac50fSopenharmony_ci    WMError ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
831e0dac50fSopenharmony_ci        WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_PIP, pImpl_->pipStateChangedListenerAgent_);
832e0dac50fSopenharmony_ci    if (ret != WMError::WM_OK) {
833e0dac50fSopenharmony_ci        TLOGW(WmsLogTag::WMS_PIP, "RegisterWindowManagerAgent failed!");
834e0dac50fSopenharmony_ci        pImpl_->pipStateChangedListenerAgent_ = nullptr;
835e0dac50fSopenharmony_ci    } else {
836e0dac50fSopenharmony_ci        auto iter = std::find(pImpl_->pipStateChangedListeners_.begin(),
837e0dac50fSopenharmony_ci            pImpl_->pipStateChangedListeners_.end(), listener);
838e0dac50fSopenharmony_ci        if (iter != pImpl_->pipStateChangedListeners_.end()) {
839e0dac50fSopenharmony_ci            TLOGW(WmsLogTag::WMS_PIP, "Listener is already registered.");
840e0dac50fSopenharmony_ci            return WMError::WM_OK;
841e0dac50fSopenharmony_ci        }
842e0dac50fSopenharmony_ci        pImpl_->pipStateChangedListeners_.push_back(listener);
843e0dac50fSopenharmony_ci    }
844e0dac50fSopenharmony_ci    return ret;
845e0dac50fSopenharmony_ci}
846e0dac50fSopenharmony_ci
847e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterPiPStateChangedListener(const sptr<IPiPStateChangedListener>& listener)
848e0dac50fSopenharmony_ci{
849e0dac50fSopenharmony_ci    TLOGI(WmsLogTag::WMS_PIP, "in");
850e0dac50fSopenharmony_ci    if (listener == nullptr) {
851e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_PIP, "listener could not be null");
852e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
853e0dac50fSopenharmony_ci    }
854e0dac50fSopenharmony_ci
855e0dac50fSopenharmony_ci    std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
856e0dac50fSopenharmony_ci    auto iter = std::find(pImpl_->pipStateChangedListeners_.begin(),
857e0dac50fSopenharmony_ci        pImpl_->pipStateChangedListeners_.end(), listener);
858e0dac50fSopenharmony_ci    if (iter == pImpl_->pipStateChangedListeners_.end()) {
859e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_PIP, "could not find this listener");
860e0dac50fSopenharmony_ci        return WMError::WM_OK;
861e0dac50fSopenharmony_ci    }
862e0dac50fSopenharmony_ci    pImpl_->pipStateChangedListeners_.erase(iter);
863e0dac50fSopenharmony_ci    WMError ret = WMError::WM_OK;
864e0dac50fSopenharmony_ci    if (pImpl_->pipStateChangedListeners_.empty() &&
865e0dac50fSopenharmony_ci        pImpl_->pipStateChangedListenerAgent_ != nullptr) {
866e0dac50fSopenharmony_ci        ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
867e0dac50fSopenharmony_ci            WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_PIP,
868e0dac50fSopenharmony_ci            pImpl_->pipStateChangedListenerAgent_);
869e0dac50fSopenharmony_ci        if (ret == WMError::WM_OK) {
870e0dac50fSopenharmony_ci            pImpl_->pipStateChangedListenerAgent_ = nullptr;
871e0dac50fSopenharmony_ci        }
872e0dac50fSopenharmony_ci    }
873e0dac50fSopenharmony_ci    return ret;
874e0dac50fSopenharmony_ci}
875e0dac50fSopenharmony_ci
876e0dac50fSopenharmony_ciWMError WindowManagerLite::CloseTargetPiPWindow(const std::string& bundleName)
877e0dac50fSopenharmony_ci{
878e0dac50fSopenharmony_ci    if (bundleName.empty()) {
879e0dac50fSopenharmony_ci        TLOGE(WmsLogTag::WMS_PIP, "bundleName is empty.");
880e0dac50fSopenharmony_ci        return WMError::WM_ERROR_INVALID_PARAM;
881e0dac50fSopenharmony_ci    }
882e0dac50fSopenharmony_ci    TLOGD(WmsLogTag::WMS_PIP, "bundleName:%{public}s", bundleName.c_str());
883e0dac50fSopenharmony_ci    return SingletonContainer::Get<WindowAdapterLite>().CloseTargetPiPWindow(bundleName);
884e0dac50fSopenharmony_ci}
885e0dac50fSopenharmony_ci
886e0dac50fSopenharmony_ciWMError WindowManagerLite::GetCurrentPiPWindowInfo(std::string& bundleName)
887e0dac50fSopenharmony_ci{
888e0dac50fSopenharmony_ci    return SingletonContainer::Get<WindowAdapterLite>().GetCurrentPiPWindowInfo(bundleName);
889e0dac50fSopenharmony_ci}
890e0dac50fSopenharmony_ci
891e0dac50fSopenharmony_civoid WindowManagerLite::UpdatePiPWindowStateChanged(const std::string& bundleName, bool isForeground) const
892e0dac50fSopenharmony_ci{
893e0dac50fSopenharmony_ci    pImpl_->UpdatePiPWindowStateChanged(bundleName, isForeground);
894e0dac50fSopenharmony_ci}
895e0dac50fSopenharmony_ci
896e0dac50fSopenharmony_ciWMError WindowManagerLite::GetAccessibilityWindowInfo(std::vector<sptr<AccessibilityWindowInfo>>& infos) const
897e0dac50fSopenharmony_ci{
898e0dac50fSopenharmony_ci    WMError ret = SingletonContainer::Get<WindowAdapterLite>().GetAccessibilityWindowInfo(infos);
899e0dac50fSopenharmony_ci    if (ret != WMError::WM_OK) {
900e0dac50fSopenharmony_ci        WLOGFE("get window info failed");
901e0dac50fSopenharmony_ci    }
902e0dac50fSopenharmony_ci    return ret;
903e0dac50fSopenharmony_ci}
904e0dac50fSopenharmony_ci
905e0dac50fSopenharmony_ciWMError WindowManagerLite::RegisterWindowUpdateListener(const sptr<IWindowUpdateListener>& listener)
906e0dac50fSopenharmony_ci{
907e0dac50fSopenharmony_ci    if (listener == nullptr) {
908e0dac50fSopenharmony_ci        WLOGFE("listener could not be null");
909e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
910e0dac50fSopenharmony_ci    }
911e0dac50fSopenharmony_ci    std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
912e0dac50fSopenharmony_ci    if (pImpl_->windowUpdateListenerAgent_ == nullptr) {
913e0dac50fSopenharmony_ci        pImpl_->windowUpdateListenerAgent_ = new WindowManagerAgentLite();
914e0dac50fSopenharmony_ci    }
915e0dac50fSopenharmony_ci    WMError ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
916e0dac50fSopenharmony_ci        WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_UPDATE, pImpl_->windowUpdateListenerAgent_);
917e0dac50fSopenharmony_ci    if (ret != WMError::WM_OK) {
918e0dac50fSopenharmony_ci        WLOGFW("RegisterWindowManagerAgent failed!");
919e0dac50fSopenharmony_ci        pImpl_->windowUpdateListenerAgent_ = nullptr;
920e0dac50fSopenharmony_ci    } else {
921e0dac50fSopenharmony_ci        auto iter = std::find(pImpl_->windowUpdateListeners_.begin(), pImpl_->windowUpdateListeners_.end(), listener);
922e0dac50fSopenharmony_ci        if (iter != pImpl_->windowUpdateListeners_.end()) {
923e0dac50fSopenharmony_ci            WLOGI("Listener is already registered.");
924e0dac50fSopenharmony_ci            return WMError::WM_OK;
925e0dac50fSopenharmony_ci        }
926e0dac50fSopenharmony_ci        pImpl_->windowUpdateListeners_.emplace_back(listener);
927e0dac50fSopenharmony_ci    }
928e0dac50fSopenharmony_ci    return ret;
929e0dac50fSopenharmony_ci}
930e0dac50fSopenharmony_ci
931e0dac50fSopenharmony_ciWMError WindowManagerLite::UnregisterWindowUpdateListener(const sptr<IWindowUpdateListener>& listener)
932e0dac50fSopenharmony_ci{
933e0dac50fSopenharmony_ci    if (listener == nullptr) {
934e0dac50fSopenharmony_ci        WLOGFE("listener could not be null");
935e0dac50fSopenharmony_ci        return WMError::WM_ERROR_NULLPTR;
936e0dac50fSopenharmony_ci    }
937e0dac50fSopenharmony_ci    std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
938e0dac50fSopenharmony_ci    auto iter = std::find(pImpl_->windowUpdateListeners_.begin(), pImpl_->windowUpdateListeners_.end(), listener);
939e0dac50fSopenharmony_ci    if (iter == pImpl_->windowUpdateListeners_.end()) {
940e0dac50fSopenharmony_ci        WLOGFE("could not find this listener");
941e0dac50fSopenharmony_ci        return WMError::WM_OK;
942e0dac50fSopenharmony_ci    }
943e0dac50fSopenharmony_ci    pImpl_->windowUpdateListeners_.erase(iter);
944e0dac50fSopenharmony_ci    WMError ret = WMError::WM_OK;
945e0dac50fSopenharmony_ci    if (pImpl_->windowUpdateListeners_.empty() && pImpl_->windowUpdateListenerAgent_ != nullptr) {
946e0dac50fSopenharmony_ci        ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
947e0dac50fSopenharmony_ci            WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_UPDATE, pImpl_->windowUpdateListenerAgent_);
948e0dac50fSopenharmony_ci        if (ret == WMError::WM_OK) {
949e0dac50fSopenharmony_ci            pImpl_->windowUpdateListenerAgent_ = nullptr;
950e0dac50fSopenharmony_ci        }
951e0dac50fSopenharmony_ci    }
952e0dac50fSopenharmony_ci    return ret;
953e0dac50fSopenharmony_ci}
954e0dac50fSopenharmony_ci} // namespace Rosen
955e0dac50fSopenharmony_ci} // namespace OHOS
956