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