• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "window_manager.h"
17 
18 #include <algorithm>
19 #include <cinttypes>
20 #include <shared_mutex>
21 
22 #include "input_manager.h"
23 
24 #include "marshalling_helper.h"
25 #include "window_adapter.h"
26 #include "window_manager_agent.h"
27 #include "window_manager_hilog.h"
28 #include "window_display_change_adapter.h"
29 #include "wm_common.h"
30 #include "ws_common.h"
31 
32 namespace OHOS {
33 namespace Rosen {
34 namespace {
35 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowManager"};
36 struct WindowChecker : public MMI::IWindowChecker {
37 public:
38     WindowChecker() = default;
39     ~WindowChecker() = default;
40     int32_t CheckWindowId(int32_t windowId) const override;
41 };
42 }
43 
44 WM_IMPLEMENT_SINGLE_INSTANCE(WindowManager)
45 
46 class WindowManager::Impl {
47 public:
48     void NotifyWMSConnected(int32_t userId, int32_t screenId);
49     void NotifyWMSDisconnected(int32_t userId, int32_t screenId);
50     void NotifyFocused(uint32_t windowId, const sptr<IRemoteObject>& abilityToken,
51         WindowType windowType, DisplayId displayId);
52     void NotifyUnfocused(uint32_t windowId, const sptr<IRemoteObject>& abilityToken,
53         WindowType windowType, DisplayId displayId);
54     void NotifyFocused(const sptr<FocusChangeInfo>& focusChangeInfo);
55     void NotifyWindowModeChange(WindowModeType type);
56     void NotifyUnfocused(const sptr<FocusChangeInfo>& focusChangeInfo);
57     void NotifySystemBarChanged(DisplayId displayId, const SystemBarRegionTints& tints);
58     void NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>>& infos, WindowUpdateType type);
59     void NotifyWindowVisibilityInfoChanged(const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos);
60     void NotifyWindowVisibilityStateChanged(const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos);
61     void PackWindowChangeInfo(const std::unordered_set<WindowInfoKey>& interestInfo,
62         const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos,
63         std::vector<std::unordered_map<WindowInfoKey, WindowChangeInfoType>>& windowChangeInfos);
64     void NotifyWindowDrawingContentInfoChanged(const std::vector<sptr<WindowDrawingContentInfo>>&
65         windowDrawingContentInfos);
66     void UpdateCameraFloatWindowStatus(uint32_t accessTokenId, bool isShowing);
67     void NotifyWaterMarkFlagChangedResult(bool showWaterMark);
68     void NotifyVisibleWindowNumChanged(const std::vector<VisibleWindowNumInfo>& visibleWindowNumInfo);
69     void NotifyGestureNavigationEnabledResult(bool enable);
70     void NotifyDisplayInfoChanged(const sptr<IRemoteObject>& token, DisplayId displayId,
71         float density, DisplayOrientation orientation);
72     void NotifyDisplayIdChange(
73         const std::vector<std::unordered_map<WindowInfoKey, WindowChangeInfoType>>& windowInfoList);
74     void NotifyWindowModeChangeForPropertyChange(
75         const std::vector<std::unordered_map<WindowInfoKey, WindowChangeInfoType>>& windowInfoList);
76     void NotifyFloatingScaleChange(
77         const std::vector<std::unordered_map<WindowInfoKey, WindowChangeInfoType>>& windowInfoList);
78     bool IsNeedToSkipForInterestWindowIds(sptr<IWindowInfoChangedListener> listener,
79         const std::vector<std::unordered_map<WindowInfoKey, WindowChangeInfoType>>& windowInfoList);
80     void NotifyWindowStyleChange(WindowStyleType type);
81     void NotifyWindowSystemBarPropertyChange(WindowType type, const SystemBarProperty& systemBarProperty);
82     void NotifyWindowPidVisibilityChanged(const sptr<WindowPidVisibilityInfo>& info);
83     void NotifyWindowRectChange(
84         const std::vector<std::unordered_map<WindowInfoKey, WindowChangeInfoType>>& windowInfoList);
85     void NotifyWMSWindowDestroyed(const WindowLifeCycleInfo& lifeCycleInfo, void* jsWindowNapiValue);
86 
87     static inline SingletonDelegator<WindowManager> delegator_;
88 
89     std::shared_mutex listenerMutex_;
90     sptr<IWMSConnectionChangedListener> wmsConnectionChangedListener_;
91     std::vector<sptr<IFocusChangedListener>> focusChangedListeners_;
92     sptr<WindowManagerAgent> focusChangedListenerAgent_;
93     std::vector<sptr<IWindowModeChangedListener>> windowModeListeners_;
94     sptr<WindowManagerAgent> windowModeListenerAgent_;
95     std::vector<sptr<ISystemBarChangedListener>> systemBarChangedListeners_;
96     sptr<WindowManagerAgent> systemBarChangedListenerAgent_;
97     std::vector<sptr<IWindowUpdateListener>> windowUpdateListeners_;
98     sptr<WindowManagerAgent> windowUpdateListenerAgent_;
99     std::vector<sptr<IVisibilityChangedListener>> windowVisibilityListeners_;
100     sptr<WindowManagerAgent> windowVisibilityListenerAgent_;
101     std::vector<sptr<IWindowInfoChangedListener>> windowVisibilityStateListeners_;
102     sptr<WindowManagerAgent> windowVisibilityStateListenerAgent_;
103     std::vector<sptr<IDrawingContentChangedListener>> windowDrawingContentListeners_;
104     sptr<WindowManagerAgent> windowDrawingContentListenerAgent_;
105     std::vector<sptr<ICameraFloatWindowChangedListener>> cameraFloatWindowChangedListeners_;
106     sptr<WindowManagerAgent> cameraFloatWindowChangedListenerAgent_;
107     std::vector<sptr<IWaterMarkFlagChangedListener>> waterMarkFlagChangeListeners_;
108     sptr<WindowManagerAgent> waterMarkFlagChangeAgent_;
109     std::vector<sptr<IGestureNavigationEnabledChangedListener>> gestureNavigationEnabledListeners_;
110     sptr<WindowManagerAgent> gestureNavigationEnabledAgent_;
111     std::vector<sptr<IVisibleWindowNumChangedListener>> visibleWindowNumChangedListeners_;
112     sptr<WindowManagerAgent> visibleWindowNumChangedListenerAgent_;
113     std::vector<sptr<IWindowStyleChangedListener>> windowStyleListeners_;
114     sptr<WindowManagerAgent> windowStyleListenerAgent_;
115     std::map<sptr<IRemoteObject>,
116         std::vector<sptr<WindowDisplayChangeAdapter>>> displayInfoChangedListeners_;
117     std::vector<sptr<IWindowPidVisibilityChangedListener>> windowPidVisibilityListeners_;
118     sptr<WindowManagerAgent> windowPidVisibilityListenerAgent_;
119     std::shared_mutex visibilityListenerAgentListenerMutex_;
120     sptr<WindowManagerAgent> WindowDisplayIdChangeListenerAgent_;
121     std::vector<sptr<IWindowInfoChangedListener>> windowDisplayIdChangeListeners_;
122     sptr<WindowManagerAgent> windowPropertyChangeAgent_;
123     std::vector<sptr<IWindowInfoChangedListener>> windowRectChangeListeners_;
124     std::vector<sptr<IWindowInfoChangedListener>> windowModeChangeListeners_;
125     std::vector<sptr<IWindowInfoChangedListener>> floatingScaleChangeListeners_;
126     sptr<WindowManagerAgent> windowSystemBarPropertyChangeAgent_;
127     std::vector<sptr<IWindowSystemBarPropertyChangedListener>> windowSystemBarPropertyChangedListeners_;
128     sptr<IWindowLifeCycleListener> windowLifeCycleListener_;
129 };
130 
NotifyWMSConnected(int32_t userId,int32_t screenId)131 void WindowManager::Impl::NotifyWMSConnected(int32_t userId, int32_t screenId)
132 {
133     TLOGD(WmsLogTag::WMS_MULTI_USER, "WMS connected [userId:%{public}d; screenId:%{public}d]", userId, screenId);
134     sptr<IWMSConnectionChangedListener> wmsConnectionChangedListener;
135     {
136         std::shared_lock<std::shared_mutex> lock(listenerMutex_);
137         wmsConnectionChangedListener = wmsConnectionChangedListener_;
138     }
139     if (wmsConnectionChangedListener != nullptr) {
140         wmsConnectionChangedListener->OnConnected(userId, screenId);
141     }
142 }
143 
NotifyWMSDisconnected(int32_t userId,int32_t screenId)144 void WindowManager::Impl::NotifyWMSDisconnected(int32_t userId, int32_t screenId)
145 {
146     TLOGI(WmsLogTag::WMS_MULTI_USER, "WMS disconnected [userId:%{public}d; screenId:%{public}d]", userId, screenId);
147     sptr<IWMSConnectionChangedListener> wmsConnectionChangedListener;
148     {
149         std::shared_lock<std::shared_mutex> lock(listenerMutex_);
150         wmsConnectionChangedListener = wmsConnectionChangedListener_;
151     }
152     if (wmsConnectionChangedListener != nullptr) {
153         wmsConnectionChangedListener->OnDisconnected(userId, screenId);
154     }
155 }
156 
NotifyFocused(const sptr<FocusChangeInfo> & focusChangeInfo)157 void WindowManager::Impl::NotifyFocused(const sptr<FocusChangeInfo>& focusChangeInfo)
158 {
159     TLOGD(WmsLogTag::WMS_FOCUS, "NotifyFocused [%{public}u; %{public}" PRIu64"; %{public}d; %{public}d; %{public}u]",
160         focusChangeInfo->windowId_, focusChangeInfo->displayId_, focusChangeInfo->pid_, focusChangeInfo->uid_,
161         static_cast<uint32_t>(focusChangeInfo->windowType_));
162     std::vector<sptr<IFocusChangedListener>> focusChangeListeners;
163     {
164         std::shared_lock<std::shared_mutex> lock(listenerMutex_);
165         focusChangeListeners = focusChangedListeners_;
166     }
167     for (auto& listener : focusChangeListeners) {
168         listener->OnFocused(focusChangeInfo);
169     }
170 }
171 
NotifyUnfocused(const sptr<FocusChangeInfo> & focusChangeInfo)172 void WindowManager::Impl::NotifyUnfocused(const sptr<FocusChangeInfo>& focusChangeInfo)
173 {
174     TLOGD(WmsLogTag::WMS_FOCUS, "NotifyUnfocused [%{public}u; %{public}" PRIu64"; %{public}d; %{public}d; %{public}u]",
175         focusChangeInfo->windowId_, focusChangeInfo->displayId_, focusChangeInfo->pid_, focusChangeInfo->uid_,
176         static_cast<uint32_t>(focusChangeInfo->windowType_));
177     std::vector<sptr<IFocusChangedListener>> focusChangeListeners;
178     {
179         std::shared_lock<std::shared_mutex> lock(listenerMutex_);
180         focusChangeListeners = focusChangedListeners_;
181     }
182     for (auto& listener : focusChangeListeners) {
183         listener->OnUnfocused(focusChangeInfo);
184     }
185 }
186 
NotifyWindowModeChange(WindowModeType type)187 void WindowManager::Impl::NotifyWindowModeChange(WindowModeType type)
188 {
189     TLOGI(WmsLogTag::WMS_MAIN, "WindowManager::Impl UpdateWindowModeTypeInfo type: %{public}d",
190         static_cast<uint8_t>(type));
191     std::vector<sptr<IWindowModeChangedListener>> windowModeListeners;
192     {
193         std::shared_lock<std::shared_mutex> lock(listenerMutex_);
194         windowModeListeners = windowModeListeners_;
195     }
196     for (auto &listener : windowModeListeners) {
197         listener->OnWindowModeUpdate(type);
198     }
199 }
200 
NotifySystemBarChanged(DisplayId displayId,const SystemBarRegionTints & tints)201 void WindowManager::Impl::NotifySystemBarChanged(DisplayId displayId, const SystemBarRegionTints& tints)
202 {
203     for (auto tint : tints) {
204         WLOGFD("type:%{public}d, enable:%{public}d," \
205             "backgroundColor:%{public}x, contentColor:%{public}x " \
206             "region:[%{public}d, %{public}d, %{public}d, %{public}d]",
207             tint.type_, tint.prop_.enable_, tint.prop_.backgroundColor_, tint.prop_.contentColor_,
208             tint.region_.posX_, tint.region_.posY_, tint.region_.width_, tint.region_.height_);
209     }
210     std::vector<sptr<ISystemBarChangedListener>> systemBarChangeListeners;
211     {
212         std::shared_lock<std::shared_mutex> lock(listenerMutex_);
213         systemBarChangeListeners = systemBarChangedListeners_;
214     }
215     for (auto& listener : systemBarChangeListeners) {
216         listener->OnSystemBarPropertyChange(displayId, tints);
217     }
218 }
219 
NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>> & infos,WindowUpdateType type)220 void WindowManager::Impl::NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>>& infos,
221     WindowUpdateType type)
222 {
223     if (infos.empty()) {
224         WLOGFE("infos is empty");
225         return;
226     }
227     for (auto& info : infos) {
228         if (info == nullptr) {
229             TLOGD(WmsLogTag::WMS_MAIN, "info is nullptr");
230             continue;
231         }
232         TLOGD(WmsLogTag::WMS_MAIN, "NotifyAccessibilityWindowInfo: wid[%{public}u], innerWid_[%{public}u]," \
233             "uiNodeId_[%{public}u], rect[%{public}d %{public}d %{public}d %{public}d]," \
234             "isFocused[%{public}d], isDecorEnable[%{public}d], displayId[%{public}" PRIu64"], layer[%{public}u]," \
235             "mode[%{public}u], type[%{public}u, updateType[%{public}d], bundle[%{public}s]",
236             info->wid_, info->innerWid_, info->uiNodeId_, info->windowRect_.width_, info->windowRect_.height_,
237             info->windowRect_.posX_, info->windowRect_.posY_, info->focused_, info->isDecorEnable_, info->displayId_,
238             info->layer_, info->mode_, info->type_, type, info->bundleName_.c_str());
239         for (const auto& rect : info->touchHotAreas_) {
240             TLOGD(WmsLogTag::WMS_MAIN, "window touch hot areas rect[x=%{public}d,y=%{public}d," \
241             "w=%{public}d,h=%{public}d]", rect.posX_, rect.posY_, rect.width_, rect.height_);
242         }
243     }
244 
245     std::vector<sptr<IWindowUpdateListener>> windowUpdateListeners;
246     {
247         std::shared_lock<std::shared_mutex> lock(listenerMutex_);
248         windowUpdateListeners = windowUpdateListeners_;
249     }
250     for (auto& listener : windowUpdateListeners) {
251         listener->OnWindowUpdate(infos, type);
252     }
253 }
254 
NotifyWindowVisibilityInfoChanged(const std::vector<sptr<WindowVisibilityInfo>> & windowVisibilityInfos)255 void WindowManager::Impl::NotifyWindowVisibilityInfoChanged(
256     const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos)
257 {
258     std::vector<sptr<IVisibilityChangedListener>> visibilityChangeListeners;
259     {
260         std::shared_lock<std::shared_mutex> lock(listenerMutex_);
261         visibilityChangeListeners = windowVisibilityListeners_;
262     }
263     for (auto& listener : visibilityChangeListeners) {
264         WLOGD("Notify WindowVisibilityInfo to caller");
265         listener->OnWindowVisibilityChanged(windowVisibilityInfos);
266     }
267 }
268 
NotifyWindowVisibilityStateChanged(const std::vector<sptr<WindowVisibilityInfo>> & windowVisibilityInfos)269 void WindowManager::Impl::NotifyWindowVisibilityStateChanged(
270     const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos)
271 {
272     TLOGD(WmsLogTag::WMS_ATTRIBUTE, "in");
273     std::vector<sptr<IWindowInfoChangedListener>> windowVisibilityStateListeners;
274     {
275         std::shared_lock<std::shared_mutex> lock(listenerMutex_);
276         windowVisibilityStateListeners = windowVisibilityStateListeners_;
277     }
278     for (auto& listener : windowVisibilityStateListeners) {
279         if (listener == nullptr) {
280             TLOGE(WmsLogTag::WMS_ATTRIBUTE, "listener is null");
281             continue;
282         }
283         std::vector<std::unordered_map<WindowInfoKey, WindowChangeInfoType>> windowChangeInfos;
284         PackWindowChangeInfo(listener->GetInterestInfo(), windowVisibilityInfos, windowChangeInfos);
285         TLOGD(WmsLogTag::WMS_ATTRIBUTE, "Notify WindowVisibilityState to caller, info size: %{public}zu",
286             windowChangeInfos.size());
287         listener->OnWindowInfoChanged(windowChangeInfos);
288     }
289 }
290 
PackWindowChangeInfo(const std::unordered_set<WindowInfoKey> & interestInfo,const std::vector<sptr<WindowVisibilityInfo>> & windowVisibilityInfos,std::vector<std::unordered_map<WindowInfoKey,WindowChangeInfoType>> & windowChangeInfos)291 void WindowManager::Impl::PackWindowChangeInfo(const std::unordered_set<WindowInfoKey>& interestInfo,
292     const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos,
293     std::vector<std::unordered_map<WindowInfoKey, WindowChangeInfoType>>& windowChangeInfos)
294 {
295     for (const auto& info : windowVisibilityInfos) {
296         std::unordered_map<WindowInfoKey, WindowChangeInfoType> windowChangeInfo;
297         if (interestInfo.find(WindowInfoKey::WINDOW_ID) != interestInfo.end()) {
298             windowChangeInfo.emplace(WindowInfoKey::WINDOW_ID, info->windowId_);
299         }
300         if (interestInfo.find(WindowInfoKey::BUNDLE_NAME) != interestInfo.end()) {
301             windowChangeInfo.emplace(WindowInfoKey::BUNDLE_NAME, info->bundleName_);
302         }
303         if (interestInfo.find(WindowInfoKey::ABILITY_NAME) != interestInfo.end()) {
304             windowChangeInfo.emplace(WindowInfoKey::ABILITY_NAME, info->abilityName_);
305         }
306         if (interestInfo.find(WindowInfoKey::APP_INDEX) != interestInfo.end()) {
307             windowChangeInfo.emplace(WindowInfoKey::APP_INDEX, info->appIndex_);
308         }
309         if (interestInfo.find(WindowInfoKey::VISIBILITY_STATE) != interestInfo.end()) {
310             windowChangeInfo.emplace(WindowInfoKey::VISIBILITY_STATE, info->visibilityState_);
311         }
312         windowChangeInfos.emplace_back(windowChangeInfo);
313     }
314 }
315 
NotifyWindowDrawingContentInfoChanged(const std::vector<sptr<WindowDrawingContentInfo>> & windowDrawingContentInfos)316 void WindowManager::Impl::NotifyWindowDrawingContentInfoChanged(
317     const std::vector<sptr<WindowDrawingContentInfo>>& windowDrawingContentInfos)
318 {
319     std::vector<sptr<IDrawingContentChangedListener>> windowDrawingContentChangeListeners;
320     {
321         std::shared_lock<std::shared_mutex> lock(listenerMutex_);
322         windowDrawingContentChangeListeners = windowDrawingContentListeners_;
323     }
324     for (auto& listener : windowDrawingContentChangeListeners) {
325         WLOGFD("Notify windowDrawingContentInfo to caller");
326         listener->OnWindowDrawingContentChanged(windowDrawingContentInfos);
327     }
328 }
329 
UpdateCameraFloatWindowStatus(uint32_t accessTokenId,bool isShowing)330 void WindowManager::Impl::UpdateCameraFloatWindowStatus(uint32_t accessTokenId, bool isShowing)
331 {
332     TLOGD(WmsLogTag::DEFAULT,
333         "Camera float window, accessTokenId=%{private}u, isShowing=%{public}u", accessTokenId, isShowing);
334     std::vector<sptr<ICameraFloatWindowChangedListener>> cameraFloatWindowChangeListeners;
335     {
336         std::shared_lock<std::shared_mutex> lock(listenerMutex_);
337         cameraFloatWindowChangeListeners = cameraFloatWindowChangedListeners_;
338     }
339     for (auto& listener : cameraFloatWindowChangeListeners) {
340         listener->OnCameraFloatWindowChange(accessTokenId, isShowing);
341     }
342 }
343 
NotifyWaterMarkFlagChangedResult(bool showWaterMark)344 void WindowManager::Impl::NotifyWaterMarkFlagChangedResult(bool showWaterMark)
345 {
346     TLOGI(WmsLogTag::DEFAULT, "%{public}d", showWaterMark);
347     std::vector<sptr<IWaterMarkFlagChangedListener>> waterMarkFlagChangeListeners;
348     {
349         std::shared_lock<std::shared_mutex> lock(listenerMutex_);
350         waterMarkFlagChangeListeners = waterMarkFlagChangeListeners_;
351     }
352     for (auto& listener : waterMarkFlagChangeListeners) {
353         listener->OnWaterMarkFlagUpdate(showWaterMark);
354     }
355 }
356 
NotifyGestureNavigationEnabledResult(bool enable)357 void WindowManager::Impl::NotifyGestureNavigationEnabledResult(bool enable)
358 {
359     WLOGFI("Notify gesture navigation enable result, enable=%{public}d", enable);
360     std::vector<sptr<IGestureNavigationEnabledChangedListener>> gestureNavigationEnabledListeners;
361     {
362         std::shared_lock<std::shared_mutex> lock(listenerMutex_);
363         gestureNavigationEnabledListeners = gestureNavigationEnabledListeners_;
364     }
365     for (auto& listener : gestureNavigationEnabledListeners) {
366         listener->OnGestureNavigationEnabledUpdate(enable);
367     }
368 }
369 
NotifyVisibleWindowNumChanged(const std::vector<VisibleWindowNumInfo> & visibleWindowNumInfo)370 void WindowManager::Impl::NotifyVisibleWindowNumChanged(
371     const std::vector<VisibleWindowNumInfo>& visibleWindowNumInfo)
372 {
373     std::vector<sptr<IVisibleWindowNumChangedListener>> visibleWindowNumChangedListeners;
374     {
375         std::shared_lock<std::shared_mutex> lock(listenerMutex_);
376         visibleWindowNumChangedListeners = visibleWindowNumChangedListeners_;
377     }
378     for (auto& listener : visibleWindowNumChangedListeners) {
379         if (listener == nullptr) {
380             continue;
381         }
382         listener->OnVisibleWindowNumChange(visibleWindowNumInfo);
383     }
384 }
385 
NotifyDisplayInfoChanged(const sptr<IRemoteObject> & token,DisplayId displayId,float density,DisplayOrientation orientation)386 void WindowManager::Impl::NotifyDisplayInfoChanged(const sptr<IRemoteObject>& token, DisplayId displayId,
387     float density, DisplayOrientation orientation)
388 {
389     auto iter = displayInfoChangedListeners_.end();
390     std::vector<sptr<WindowDisplayChangeAdapter>> displayInfoChangedListeners;
391     {
392         std::unique_lock<std::shared_mutex> lock(listenerMutex_);
393         iter = displayInfoChangedListeners_.find(token);
394         if (iter == displayInfoChangedListeners_.end()) {
395             TLOGI(WmsLogTag::DMS, "can not find token in listener list");
396             return;
397         }
398         displayInfoChangedListeners = iter->second;
399     }
400 
401     for (auto& listener : displayInfoChangedListeners) {
402         listener->OnDisplayInfoChange(token, displayId, density, orientation);
403     }
404 }
405 
NotifyWindowModeChangeForPropertyChange(const std::vector<std::unordered_map<WindowInfoKey,WindowChangeInfoType>> & windowInfoList)406 void WindowManager::Impl::NotifyWindowModeChangeForPropertyChange(
407     const std::vector<std::unordered_map<WindowInfoKey, WindowChangeInfoType>>& windowInfoList)
408 {
409     std::vector<sptr<IWindowInfoChangedListener>> windowModeChangeListeners;
410     {
411         std::unique_lock<std::shared_mutex> lock(listenerMutex_);
412         windowModeChangeListeners = windowModeChangeListeners_;
413     }
414 
415     for (auto &listener : windowModeChangeListeners) {
416         if (listener != nullptr && !IsNeedToSkipForInterestWindowIds(listener, windowInfoList)) {
417             listener->OnWindowInfoChanged(windowInfoList);
418         }
419     }
420 }
421 
NotifyFloatingScaleChange(const std::vector<std::unordered_map<WindowInfoKey,WindowChangeInfoType>> & windowInfoList)422 void WindowManager::Impl::NotifyFloatingScaleChange(
423     const std::vector<std::unordered_map<WindowInfoKey, WindowChangeInfoType>>& windowInfoList)
424 {
425     std::vector<sptr<IWindowInfoChangedListener>> floatingScaleChangeListeners;
426     {
427         std::unique_lock<std::shared_mutex> lock(listenerMutex_);
428         floatingScaleChangeListeners = floatingScaleChangeListeners_;
429     }
430 
431     for (auto &listener : floatingScaleChangeListeners) {
432         if (listener != nullptr && !IsNeedToSkipForInterestWindowIds(listener, windowInfoList)) {
433             listener->OnWindowInfoChanged(windowInfoList);
434         }
435     }
436 }
437 
NotifyDisplayIdChange(const std::vector<std::unordered_map<WindowInfoKey,WindowChangeInfoType>> & windowInfoList)438 void WindowManager::Impl::NotifyDisplayIdChange(
439     const std::vector<std::unordered_map<WindowInfoKey, WindowChangeInfoType>>& windowInfoList)
440 {
441     std::vector<sptr<IWindowInfoChangedListener>> windowDisplayIdChangeListeners;
442     {
443         std::unique_lock<std::shared_mutex> lock(listenerMutex_);
444         windowDisplayIdChangeListeners = windowDisplayIdChangeListeners_;
445     }
446 
447     for (auto &listener : windowDisplayIdChangeListeners) {
448         if (listener != nullptr && !IsNeedToSkipForInterestWindowIds(listener, windowInfoList)) {
449             listener->OnWindowInfoChanged(windowInfoList);
450         }
451     }
452 }
453 
IsNeedToSkipForInterestWindowIds(sptr<IWindowInfoChangedListener> listener,const std::vector<std::unordered_map<WindowInfoKey,WindowChangeInfoType>> & windowInfoList)454 bool WindowManager::Impl::IsNeedToSkipForInterestWindowIds(sptr<IWindowInfoChangedListener> listener,
455     const std::vector<std::unordered_map<WindowInfoKey, WindowChangeInfoType>>& windowInfoList)
456 {
457     auto interestWindowIds = listener->GetInterestWindowIds();
458     if (interestWindowIds.empty()) {
459         return false;
460     }
461     for (const auto& item : windowInfoList) {
462         auto windowInfo = item;
463         if (windowInfo.find(WindowInfoKey::WINDOW_ID) != windowInfo.end() &&
464             interestWindowIds.find(std::get<uint32_t>(windowInfo[WindowInfoKey::WINDOW_ID])) !=
465             interestWindowIds.end()) {
466             return false;
467         }
468     }
469     return true;
470 }
471 
NotifyWindowStyleChange(WindowStyleType type)472 void WindowManager::Impl::NotifyWindowStyleChange(WindowStyleType type)
473 {
474     TLOGI(WmsLogTag::WMS_MAIN, "WindowStyleChange type: %{public}d",
475           static_cast<uint8_t>(type));
476     std::vector<sptr<IWindowStyleChangedListener>> windowStyleListeners;
477     {
478         std::unique_lock<std::shared_mutex> lock(listenerMutex_);
479         windowStyleListeners = windowStyleListeners_;
480     }
481     for (auto &listener : windowStyleListeners) {
482         TLOGI(WmsLogTag::WMS_MAIN, "WindowStyleChange type: %{public}d",
483               static_cast<uint8_t>(type));
484         listener->OnWindowStyleUpdate(type);
485     }
486 }
487 
NotifyWindowPidVisibilityChanged(const sptr<WindowPidVisibilityInfo> & info)488 void WindowManager::Impl::NotifyWindowPidVisibilityChanged(
489     const sptr<WindowPidVisibilityInfo>& info)
490 {
491     std::vector<sptr<IWindowPidVisibilityChangedListener>> windowPidVisibilityListeners;
492     {
493         std::unique_lock<std::shared_mutex> lock(listenerMutex_);
494         windowPidVisibilityListeners = windowPidVisibilityListeners_;
495     }
496     for (auto &listener : windowPidVisibilityListeners) {
497         if (listener != nullptr) {
498             listener->NotifyWindowPidVisibilityChanged(info);
499         }
500     }
501 }
502 
NotifyWindowRectChange(const std::vector<std::unordered_map<WindowInfoKey,WindowChangeInfoType>> & windowInfoList)503 void WindowManager::Impl::NotifyWindowRectChange(
504     const std::vector<std::unordered_map<WindowInfoKey, WindowChangeInfoType>>& windowInfoList)
505 {
506     std::vector<sptr<IWindowInfoChangedListener>> windowRectChangeListeners;
507     {
508         std::unique_lock<std::shared_mutex> lock(listenerMutex_);
509         windowRectChangeListeners = windowRectChangeListeners_;
510     }
511     for (auto &listener : windowRectChangeListeners) {
512         if (listener != nullptr) {
513             listener->OnWindowInfoChanged(windowInfoList);
514         }
515     }
516 }
517 
NotifyWMSWindowDestroyed(const WindowLifeCycleInfo & lifeCycleInfo,void * jsWindowNapiValue)518 void WindowManager::Impl::NotifyWMSWindowDestroyed(const WindowLifeCycleInfo& lifeCycleInfo, void* jsWindowNapiValue)
519 {
520     TLOGD(WmsLogTag::WMS_LIFE, "notify window destroyed");
521 
522     sptr<IWindowLifeCycleListener> wmsWindowDestroyedListener;
523     {
524         std::shared_lock<std::shared_mutex> lock(listenerMutex_);
525         wmsWindowDestroyedListener = windowLifeCycleListener_;
526     }
527     if (wmsWindowDestroyedListener == nullptr) {
528         TLOGE(WmsLogTag::WMS_LIFE, "window destroyed listener is nullptr");
529         return;
530     }
531     wmsWindowDestroyedListener->OnWindowDestroyed(lifeCycleInfo, jsWindowNapiValue);
532 }
533 
WindowManager()534 WindowManager::WindowManager() : pImpl_(std::make_unique<Impl>())
535 {
536 }
537 
CheckWindowId(int32_t windowId) const538 int32_t WindowChecker::CheckWindowId(int32_t windowId) const
539 {
540     int32_t pid = INVALID_PID;
541     WMError ret = SingletonContainer::Get<WindowAdapter>().CheckWindowId(windowId, pid);
542     if (ret != WMError::WM_OK) {
543         WLOGFE("Window(%{public}d) do not allow styles to be set", windowId);
544     }
545     return pid;
546 }
547 
~WindowManager()548 WindowManager::~WindowManager()
549 {
550     std::lock_guard<std::recursive_mutex> lock(mutex_);
551     destroyed_ = true;
552 }
553 
RegisterWMSConnectionChangedListener(const sptr<IWMSConnectionChangedListener> & listener)554 WMError WindowManager::RegisterWMSConnectionChangedListener(const sptr<IWMSConnectionChangedListener>& listener)
555 {
556     int32_t clientUserId = GetUserIdByUid(getuid());
557     // only system applications or services with a userId of 0 are allowed to communicate
558     // with multiple WMS-Servers and are permitted to listen for WMS connection status.
559     if (clientUserId != SYSTEM_USERID) {
560         TLOGW(WmsLogTag::WMS_MULTI_USER, "Permission denied");
561         return WMError::WM_ERROR_INVALID_PERMISSION;
562     }
563     if (listener == nullptr) {
564         TLOGE(WmsLogTag::WMS_MULTI_USER, "Register failed: listener is null");
565         return WMError::WM_ERROR_NULLPTR;
566     }
567     TLOGI(WmsLogTag::WMS_MULTI_USER, "Start registration");
568     {
569         std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
570         if (pImpl_->wmsConnectionChangedListener_) {
571             TLOGI(WmsLogTag::WMS_MULTI_USER, "Listener already registered, skipping");
572             return WMError::WM_OK;
573         }
574         pImpl_->wmsConnectionChangedListener_ = listener;
575     }
576     auto ret = WindowAdapter::GetInstance().RegisterWMSConnectionChangedListener(
577         [this](int32_t userId, int32_t screenId, bool isConnected) {
578             this->OnWMSConnectionChanged(userId, screenId, isConnected);
579         });
580     if (ret != WMError::WM_OK) {
581         TLOGE(WmsLogTag::WMS_MULTI_USER, "Register failed: error = %{public}d", static_cast<int32_t>(ret));
582         std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
583         pImpl_->wmsConnectionChangedListener_ = nullptr;
584     }
585     return ret;
586 }
587 
UnregisterWMSConnectionChangedListener()588 WMError WindowManager::UnregisterWMSConnectionChangedListener()
589 {
590     TLOGI(WmsLogTag::WMS_MULTI_USER, "Unregister enter");
591     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
592     pImpl_->wmsConnectionChangedListener_ = nullptr;
593     WindowAdapter::GetInstance().UnregisterWMSConnectionChangedListener();
594     return WMError::WM_OK;
595 }
596 
RegisterFocusChangedListener(const sptr<IFocusChangedListener> & listener)597 WMError WindowManager::RegisterFocusChangedListener(const sptr<IFocusChangedListener>& listener)
598 {
599     if (listener == nullptr) {
600         WLOGFE("listener could not be null");
601         return WMError::WM_ERROR_NULLPTR;
602     }
603 
604     sptr<WindowManagerAgent> focusChangedListenerAgentBack = nullptr;
605     WMError ret = WMError::WM_OK;
606     {
607         std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
608         if (pImpl_->focusChangedListenerAgent_ == nullptr) {
609             pImpl_->focusChangedListenerAgent_ = new WindowManagerAgent();
610         }
611         focusChangedListenerAgentBack = pImpl_->focusChangedListenerAgent_;
612     }
613     ret = WindowAdapter::GetInstance().RegisterWindowManagerAgent(
614         WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_FOCUS, focusChangedListenerAgentBack);
615     {
616         std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
617         if (ret != WMError::WM_OK) {
618             TLOGE(WmsLogTag::WMS_FOCUS, "RegisterWindowManagerAgent failed!");
619             pImpl_->focusChangedListenerAgent_ = nullptr;
620         } else {
621             auto iter = std::find(
622                 pImpl_->focusChangedListeners_.begin(), pImpl_->focusChangedListeners_.end(), listener);
623             if (iter != pImpl_->focusChangedListeners_.end()) {
624                 TLOGW(WmsLogTag::WMS_FOCUS, "Listener is already registered.");
625                 return WMError::WM_OK;
626             }
627             pImpl_->focusChangedListeners_.push_back(listener);
628         }
629     }
630     return ret;
631 }
632 
UnregisterFocusChangedListener(const sptr<IFocusChangedListener> & listener)633 WMError WindowManager::UnregisterFocusChangedListener(const sptr<IFocusChangedListener>& listener)
634 {
635     if (listener == nullptr) {
636         WLOGFE("listener could not be null");
637         return WMError::WM_ERROR_NULLPTR;
638     }
639 
640     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
641     auto iter = std::find(pImpl_->focusChangedListeners_.begin(), pImpl_->focusChangedListeners_.end(), listener);
642     if (iter == pImpl_->focusChangedListeners_.end()) {
643         WLOGFE("could not find this listener");
644         return WMError::WM_OK;
645     }
646     pImpl_->focusChangedListeners_.erase(iter);
647     WMError ret = WMError::WM_OK;
648     if (pImpl_->focusChangedListeners_.empty() && pImpl_->focusChangedListenerAgent_ != nullptr) {
649         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
650             WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_FOCUS, pImpl_->focusChangedListenerAgent_);
651         if (ret == WMError::WM_OK) {
652             pImpl_->focusChangedListenerAgent_ = nullptr;
653         }
654     }
655     return ret;
656 }
657 
RegisterWindowModeChangedListener(const sptr<IWindowModeChangedListener> & listener)658 WMError WindowManager::RegisterWindowModeChangedListener(const sptr<IWindowModeChangedListener>& listener)
659 {
660     if (listener == nullptr) {
661         TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null");
662         return WMError::WM_ERROR_NULLPTR;
663     }
664 
665     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
666     WMError ret = WMError::WM_OK;
667     if (pImpl_->windowModeListenerAgent_ == nullptr) {
668         pImpl_->windowModeListenerAgent_ = new WindowManagerAgent();
669     }
670     ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
671         WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_MODE, pImpl_->windowModeListenerAgent_);
672     if (ret != WMError::WM_OK) {
673         TLOGW(WmsLogTag::WMS_MAIN, "RegisterWindowManagerAgent failed!");
674         pImpl_->windowModeListenerAgent_ = nullptr;
675         return ret;
676     }
677     auto iter = std::find(pImpl_->windowModeListeners_.begin(), pImpl_->windowModeListeners_.end(), listener);
678     if (iter != pImpl_->windowModeListeners_.end()) {
679         TLOGW(WmsLogTag::WMS_MAIN, "Listener is already registered.");
680         return WMError::WM_OK;
681     }
682     pImpl_->windowModeListeners_.push_back(listener);
683     return ret;
684 }
685 
UnregisterWindowModeChangedListener(const sptr<IWindowModeChangedListener> & listener)686 WMError WindowManager::UnregisterWindowModeChangedListener(const sptr<IWindowModeChangedListener>& listener)
687 {
688     if (listener == nullptr) {
689         TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null");
690         return WMError::WM_ERROR_NULLPTR;
691     }
692 
693     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
694     auto iter = std::find(pImpl_->windowModeListeners_.begin(), pImpl_->windowModeListeners_.end(), listener);
695     if (iter == pImpl_->windowModeListeners_.end()) {
696         TLOGE(WmsLogTag::WMS_MAIN, "could not find this listener");
697         return WMError::WM_OK;
698     }
699     pImpl_->windowModeListeners_.erase(iter);
700     WMError ret = WMError::WM_OK;
701     if (pImpl_->windowModeListeners_.empty() && pImpl_->windowModeListenerAgent_ != nullptr) {
702         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
703             WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_MODE, pImpl_->windowModeListenerAgent_);
704         if (ret == WMError::WM_OK) {
705             pImpl_->windowModeListenerAgent_ = nullptr;
706         }
707     }
708     return ret;
709 }
710 
RegisterSystemBarChangedListener(const sptr<ISystemBarChangedListener> & listener)711 WMError WindowManager::RegisterSystemBarChangedListener(const sptr<ISystemBarChangedListener>& listener)
712 {
713     if (listener == nullptr) {
714         WLOGFE("listener could not be null");
715         return WMError::WM_ERROR_NULLPTR;
716     }
717 
718     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
719     WMError ret = WMError::WM_OK;
720     if (pImpl_->systemBarChangedListenerAgent_ == nullptr) {
721         pImpl_->systemBarChangedListenerAgent_ = new WindowManagerAgent();
722     }
723     ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
724         WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_SYSTEM_BAR, pImpl_->systemBarChangedListenerAgent_);
725     if (ret != WMError::WM_OK) {
726         WLOGFW("RegisterWindowManagerAgent failed!");
727         pImpl_->systemBarChangedListenerAgent_ = nullptr;
728     } else {
729         auto iter = std::find(pImpl_->systemBarChangedListeners_.begin(), pImpl_->systemBarChangedListeners_.end(),
730             listener);
731         if (iter != pImpl_->systemBarChangedListeners_.end()) {
732             WLOGFW("Listener is already registered.");
733             return WMError::WM_OK;
734         }
735         pImpl_->systemBarChangedListeners_.push_back(listener);
736     }
737     return ret;
738 }
739 
UnregisterSystemBarChangedListener(const sptr<ISystemBarChangedListener> & listener)740 WMError WindowManager::UnregisterSystemBarChangedListener(const sptr<ISystemBarChangedListener>& listener)
741 {
742     if (listener == nullptr) {
743         WLOGFE("listener could not be null");
744         return WMError::WM_ERROR_NULLPTR;
745     }
746 
747     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
748     auto iter = std::find(pImpl_->systemBarChangedListeners_.begin(), pImpl_->systemBarChangedListeners_.end(),
749         listener);
750     if (iter == pImpl_->systemBarChangedListeners_.end()) {
751         WLOGFE("could not find this listener");
752         return WMError::WM_OK;
753     }
754     pImpl_->systemBarChangedListeners_.erase(iter);
755     WMError ret = WMError::WM_OK;
756     if (pImpl_->systemBarChangedListeners_.empty() && pImpl_->systemBarChangedListenerAgent_ != nullptr) {
757         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
758             WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_SYSTEM_BAR, pImpl_->systemBarChangedListenerAgent_);
759         if (ret == WMError::WM_OK) {
760             pImpl_->systemBarChangedListenerAgent_ = nullptr;
761         }
762     }
763     return ret;
764 }
765 
MinimizeAllAppWindows(DisplayId displayId)766 WMError WindowManager::MinimizeAllAppWindows(DisplayId displayId)
767 {
768     WLOGFD("displayId %{public}" PRIu64"", displayId);
769     return SingletonContainer::Get<WindowAdapter>().MinimizeAllAppWindows(displayId);
770 }
771 
ToggleShownStateForAllAppWindows()772 WMError WindowManager::ToggleShownStateForAllAppWindows()
773 {
774     WLOGFD("ToggleShownStateForAllAppWindows");
775     return SingletonContainer::Get<WindowAdapter>().ToggleShownStateForAllAppWindows();
776 }
777 
SetWindowLayoutMode(WindowLayoutMode mode)778 WMError WindowManager::SetWindowLayoutMode(WindowLayoutMode mode)
779 {
780     WLOGFD("set window layout mode: %{public}u", mode);
781     WMError ret  = SingletonContainer::Get<WindowAdapter>().SetWindowLayoutMode(mode);
782     if (ret != WMError::WM_OK) {
783         WLOGFE("set layout mode failed");
784     }
785     return ret;
786 }
787 
RegisterWindowUpdateListener(const sptr<IWindowUpdateListener> & listener)788 WMError WindowManager::RegisterWindowUpdateListener(const sptr<IWindowUpdateListener>& listener)
789 {
790     if (listener == nullptr) {
791         WLOGFE("listener could not be null");
792         return WMError::WM_ERROR_NULLPTR;
793     }
794     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
795     WMError ret = WMError::WM_OK;
796     if (pImpl_->windowUpdateListenerAgent_ == nullptr) {
797         pImpl_->windowUpdateListenerAgent_ = new WindowManagerAgent();
798     }
799     ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
800         WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_UPDATE, pImpl_->windowUpdateListenerAgent_);
801     if (ret != WMError::WM_OK) {
802         WLOGFW("RegisterWindowManagerAgent failed!");
803         pImpl_->windowUpdateListenerAgent_ = nullptr;
804     } else {
805         auto iter = std::find(pImpl_->windowUpdateListeners_.begin(), pImpl_->windowUpdateListeners_.end(), listener);
806         if (iter != pImpl_->windowUpdateListeners_.end()) {
807             WLOGI("Listener is already registered.");
808             return WMError::WM_OK;
809         }
810         pImpl_->windowUpdateListeners_.emplace_back(listener);
811     }
812     return ret;
813 }
814 
UnregisterWindowUpdateListener(const sptr<IWindowUpdateListener> & listener)815 WMError WindowManager::UnregisterWindowUpdateListener(const sptr<IWindowUpdateListener>& listener)
816 {
817     if (listener == nullptr) {
818         WLOGFE("listener could not be null");
819         return WMError::WM_ERROR_NULLPTR;
820     }
821     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
822     auto iter = std::find(pImpl_->windowUpdateListeners_.begin(), pImpl_->windowUpdateListeners_.end(), listener);
823     if (iter == pImpl_->windowUpdateListeners_.end()) {
824         WLOGFE("could not find this listener");
825         return WMError::WM_OK;
826     }
827     pImpl_->windowUpdateListeners_.erase(iter);
828     WMError ret = WMError::WM_OK;
829     if (pImpl_->windowUpdateListeners_.empty() && pImpl_->windowUpdateListenerAgent_ != nullptr) {
830         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
831             WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_UPDATE, pImpl_->windowUpdateListenerAgent_);
832         if (ret == WMError::WM_OK) {
833             pImpl_->windowUpdateListenerAgent_ = nullptr;
834         }
835     }
836     return ret;
837 }
838 
RegisterVisibilityChangedListener(const sptr<IVisibilityChangedListener> & listener)839 WMError WindowManager::RegisterVisibilityChangedListener(const sptr<IVisibilityChangedListener>& listener)
840 {
841     if (listener == nullptr) {
842         WLOGFE("listener could not be null");
843         return WMError::WM_ERROR_NULLPTR;
844     }
845     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
846     WMError ret = WMError::WM_OK;
847     if (pImpl_->windowVisibilityListenerAgent_ == nullptr) {
848         pImpl_->windowVisibilityListenerAgent_ = new WindowManagerAgent();
849     }
850     ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
851         WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_VISIBILITY,
852         pImpl_->windowVisibilityListenerAgent_);
853     if (ret != WMError::WM_OK) {
854         WLOGFW("RegisterWindowManagerAgent failed!");
855         pImpl_->windowVisibilityListenerAgent_ = nullptr;
856     } else {
857         auto iter = std::find(pImpl_->windowVisibilityListeners_.begin(), pImpl_->windowVisibilityListeners_.end(),
858             listener);
859         if (iter != pImpl_->windowVisibilityListeners_.end()) {
860             WLOGFW("Listener is already registered.");
861             return WMError::WM_OK;
862         }
863         pImpl_->windowVisibilityListeners_.emplace_back(listener);
864     }
865     return ret;
866 }
867 
UnregisterVisibilityChangedListener(const sptr<IVisibilityChangedListener> & listener)868 WMError WindowManager::UnregisterVisibilityChangedListener(const sptr<IVisibilityChangedListener>& listener)
869 {
870     if (listener == nullptr) {
871         WLOGFE("listener could not be null");
872         return WMError::WM_ERROR_NULLPTR;
873     }
874     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
875     pImpl_->windowVisibilityListeners_.erase(std::remove_if(pImpl_->windowVisibilityListeners_.begin(),
876         pImpl_->windowVisibilityListeners_.end(), [listener](sptr<IVisibilityChangedListener> registeredListener) {
877             return registeredListener == listener;
878         }), pImpl_->windowVisibilityListeners_.end());
879 
880     WMError ret = WMError::WM_OK;
881     if (pImpl_->windowVisibilityListeners_.empty() && pImpl_->windowVisibilityListenerAgent_ != nullptr) {
882         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
883             WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_VISIBILITY,
884             pImpl_->windowVisibilityListenerAgent_);
885         if (ret == WMError::WM_OK) {
886             pImpl_->windowVisibilityListenerAgent_ = nullptr;
887         }
888     }
889     return ret;
890 }
891 
RegisterDisplayIdChangedListener(const sptr<IWindowInfoChangedListener> & listener)892 WMError WindowManager::RegisterDisplayIdChangedListener(const sptr<IWindowInfoChangedListener>& listener)
893 {
894     if (listener == nullptr) {
895         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "listener is null");
896         return WMError::WM_ERROR_NULLPTR;
897     }
898     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
899     WMError ret = WMError::WM_OK;
900     if (pImpl_->windowPropertyChangeAgent_ == nullptr) {
901         pImpl_->windowPropertyChangeAgent_ = new WindowManagerAgent();
902     }
903     uint32_t interestInfo = 0;
904     for (auto windowInfoKey : listener->GetInterestInfo()) {
905         if (interestInfoMap_.find(windowInfoKey) == interestInfoMap_.end()) {
906             interestInfoMap_[windowInfoKey] = 1;
907         } else {
908             interestInfoMap_[windowInfoKey]++;
909         }
910         interestInfo |= static_cast<uint32_t>(windowInfoKey);
911     }
912     ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowPropertyChangeAgent(
913         WindowInfoKey::DISPLAY_ID, interestInfo, pImpl_->windowPropertyChangeAgent_);
914     if (ret != WMError::WM_OK) {
915         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "RegisterWindowPropertyChangeAgent failed!");
916         pImpl_->windowPropertyChangeAgent_ = nullptr;
917     } else {
918         auto iter = std::find(pImpl_->windowDisplayIdChangeListeners_.begin(),
919             pImpl_->windowDisplayIdChangeListeners_.end(), listener);
920         if (iter != pImpl_->windowDisplayIdChangeListeners_.end()) {
921             TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Listener is already registered.");
922             return WMError::WM_OK;
923         }
924         pImpl_->windowDisplayIdChangeListeners_.emplace_back(listener);
925     }
926     return ret;
927 }
928 
UnregisterDisplayIdChangedListener(const sptr<IWindowInfoChangedListener> & listener)929 WMError WindowManager::UnregisterDisplayIdChangedListener(const sptr<IWindowInfoChangedListener>& listener)
930 {
931     if (listener == nullptr) {
932         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "listener is null");
933         return WMError::WM_ERROR_NULLPTR;
934     }
935     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
936     pImpl_->windowDisplayIdChangeListeners_.erase(std::remove_if(pImpl_->windowDisplayIdChangeListeners_.begin(),
937         pImpl_->windowDisplayIdChangeListeners_.end(), [listener](sptr<IWindowInfoChangedListener> registeredListener) {
938             return registeredListener == listener;
939         }), pImpl_->windowDisplayIdChangeListeners_.end());
940     uint32_t interestInfo = 0;
941     for (auto windowInfoKey : listener->GetInterestInfo()) {
942         if (interestInfoMap_.find(windowInfoKey) == interestInfoMap_.end()) {
943             continue;
944         } else if (interestInfoMap_[windowInfoKey] == 1) {
945             interestInfoMap_.erase(windowInfoKey);
946             interestInfo |= static_cast<uint32_t>(windowInfoKey);
947         } else {
948             interestInfoMap_[windowInfoKey]--;
949         }
950     }
951     WMError ret = WMError::WM_OK;
952     if (pImpl_->windowDisplayIdChangeListeners_.empty() && pImpl_->windowPropertyChangeAgent_ != nullptr) {
953         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowPropertyChangeAgent(WindowInfoKey::DISPLAY_ID,
954             interestInfo, pImpl_->windowPropertyChangeAgent_);
955         if (ret == WMError::WM_OK) {
956             pImpl_->windowPropertyChangeAgent_ = nullptr;
957         }
958     }
959     return ret;
960 }
961 
RegisterRectChangedListener(const sptr<IWindowInfoChangedListener> & listener)962 WMError WindowManager::RegisterRectChangedListener(const sptr<IWindowInfoChangedListener>& listener)
963 {
964     if (listener == nullptr) {
965         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "listener is null");
966         return WMError::WM_ERROR_NULLPTR;
967     }
968     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
969     WMError ret = WMError::WM_OK;
970     if (pImpl_->windowPropertyChangeAgent_ == nullptr) {
971         pImpl_->windowPropertyChangeAgent_ = new WindowManagerAgent();
972     }
973     uint32_t interestInfo = 0;
974     for (auto windowInfoKey : listener->GetInterestInfo()) {
975         if (interestInfoMap_.find(windowInfoKey) == interestInfoMap_.end()) {
976             interestInfoMap_[windowInfoKey] = 1;
977         } else {
978             interestInfoMap_[windowInfoKey]++;
979         }
980         interestInfo |= static_cast<uint32_t>(windowInfoKey);
981     }
982     ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowPropertyChangeAgent(
983         WindowInfoKey::WINDOW_RECT, interestInfo, pImpl_->windowPropertyChangeAgent_);
984     if (ret != WMError::WM_OK) {
985         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "RegisterWindowPropertyChangeAgent failed!");
986         pImpl_->windowPropertyChangeAgent_ = nullptr;
987     } else {
988         auto iter = std::find(pImpl_->windowRectChangeListeners_.begin(), pImpl_->windowRectChangeListeners_.end(),
989             listener);
990         if (iter != pImpl_->windowRectChangeListeners_.end()) {
991             TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Listener is already registered.");
992             return WMError::WM_OK;
993         }
994         pImpl_->windowRectChangeListeners_.emplace_back(listener);
995     }
996     return ret;
997 }
998 
UnregisterRectChangedListener(const sptr<IWindowInfoChangedListener> & listener)999 WMError WindowManager::UnregisterRectChangedListener(const sptr<IWindowInfoChangedListener>& listener)
1000 {
1001     if (listener == nullptr) {
1002         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "listener is null");
1003         return WMError::WM_ERROR_NULLPTR;
1004     }
1005     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1006     pImpl_->windowRectChangeListeners_.erase(std::remove_if(pImpl_->windowRectChangeListeners_.begin(),
1007         pImpl_->windowRectChangeListeners_.end(), [listener](sptr<IWindowInfoChangedListener> registeredListener) {
1008             return registeredListener == listener;
1009         }), pImpl_->windowRectChangeListeners_.end());
1010     uint32_t interestInfo = 0;
1011     for (auto windowInfoKey : listener->GetInterestInfo()) {
1012         if (interestInfoMap_.find(windowInfoKey) == interestInfoMap_.end()) {
1013             continue;
1014         } else if (interestInfoMap_[windowInfoKey] == 1) {
1015             interestInfoMap_.erase(windowInfoKey);
1016             interestInfo |= static_cast<uint32_t>(windowInfoKey);
1017         } else {
1018             interestInfoMap_[windowInfoKey]--;
1019         }
1020     }
1021     WMError ret = WMError::WM_OK;
1022     if (pImpl_->windowRectChangeListeners_.empty() && pImpl_->windowPropertyChangeAgent_ != nullptr) {
1023         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowPropertyChangeAgent(WindowInfoKey::WINDOW_RECT,
1024             interestInfo, pImpl_->windowPropertyChangeAgent_);
1025         if (ret == WMError::WM_OK) {
1026             pImpl_->windowPropertyChangeAgent_ = nullptr;
1027         }
1028     }
1029     return ret;
1030 }
1031 
RegisterWindowModeChangedListenerForPropertyChange(const sptr<IWindowInfoChangedListener> & listener)1032 WMError WindowManager::RegisterWindowModeChangedListenerForPropertyChange(
1033     const sptr<IWindowInfoChangedListener>& listener)
1034 {
1035     if (listener == nullptr) {
1036         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "listener is null");
1037         return WMError::WM_ERROR_NULLPTR;
1038     }
1039     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1040     WMError ret = WMError::WM_OK;
1041     if (pImpl_->windowPropertyChangeAgent_ == nullptr) {
1042         pImpl_->windowPropertyChangeAgent_ = new WindowManagerAgent();
1043     }
1044     uint32_t interestInfo = 0;
1045     for (auto windowInfoKey : listener->GetInterestInfo()) {
1046         if (interestInfoMap_.find(windowInfoKey) == interestInfoMap_.end()) {
1047             interestInfoMap_[windowInfoKey] = 1;
1048         } else {
1049             interestInfoMap_[windowInfoKey]++;
1050         }
1051         interestInfo |= static_cast<uint32_t>(windowInfoKey);
1052     }
1053     ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowPropertyChangeAgent(
1054         WindowInfoKey::WINDOW_MODE, interestInfo, pImpl_->windowPropertyChangeAgent_);
1055     if (ret != WMError::WM_OK) {
1056         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "RegisterWindowPropertyChangeAgent failed!");
1057         pImpl_->windowPropertyChangeAgent_ = nullptr;
1058     } else {
1059         auto iter = std::find(pImpl_->windowModeChangeListeners_.begin(), pImpl_->windowModeChangeListeners_.end(),
1060             listener);
1061         if (iter != pImpl_->windowModeChangeListeners_.end()) {
1062             TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Listener is already registered.");
1063             return WMError::WM_OK;
1064         }
1065         pImpl_->windowModeChangeListeners_.emplace_back(listener);
1066     }
1067     return ret;
1068 }
1069 
UnregisterWindowModeChangedListenerForPropertyChange(const sptr<IWindowInfoChangedListener> & listener)1070 WMError WindowManager::UnregisterWindowModeChangedListenerForPropertyChange(
1071     const sptr<IWindowInfoChangedListener>& listener)
1072 {
1073     if (listener == nullptr) {
1074         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "listener is null");
1075         return WMError::WM_ERROR_NULLPTR;
1076     }
1077     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1078     pImpl_->windowModeChangeListeners_.erase(std::remove_if(pImpl_->windowModeChangeListeners_.begin(),
1079         pImpl_->windowModeChangeListeners_.end(), [listener](sptr<IWindowInfoChangedListener> registeredListener) {
1080             return registeredListener == listener;
1081         }), pImpl_->windowModeChangeListeners_.end());
1082     uint32_t interestInfo = 0;
1083     for (auto windowInfoKey : listener->GetInterestInfo()) {
1084         if (interestInfoMap_.find(windowInfoKey) == interestInfoMap_.end()) {
1085             continue;
1086         } else if (interestInfoMap_[windowInfoKey] == 1) {
1087             interestInfoMap_.erase(windowInfoKey);
1088             interestInfo |= static_cast<uint32_t>(windowInfoKey);
1089         } else {
1090             interestInfoMap_[windowInfoKey]--;
1091         }
1092     }
1093     WMError ret = WMError::WM_OK;
1094     if (pImpl_->windowModeChangeListeners_.empty() && pImpl_->windowPropertyChangeAgent_ != nullptr) {
1095         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowPropertyChangeAgent(WindowInfoKey::WINDOW_MODE,
1096             interestInfo, pImpl_->windowPropertyChangeAgent_);
1097         if (ret == WMError::WM_OK) {
1098             pImpl_->windowPropertyChangeAgent_ = nullptr;
1099         }
1100     }
1101     return ret;
1102 }
1103 
RegisterFloatingScaleChangedListener(const sptr<IWindowInfoChangedListener> & listener)1104 WMError WindowManager::RegisterFloatingScaleChangedListener(const sptr<IWindowInfoChangedListener>& listener)
1105 {
1106     if (listener == nullptr) {
1107         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "listener is null");
1108         return WMError::WM_ERROR_NULLPTR;
1109     }
1110     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1111     WMError ret = WMError::WM_OK;
1112     if (pImpl_->windowPropertyChangeAgent_ == nullptr) {
1113         pImpl_->windowPropertyChangeAgent_ = new WindowManagerAgent();
1114     }
1115     uint32_t interestInfo = 0;
1116     for (auto windowInfoKey : listener->GetInterestInfo()) {
1117         if (interestInfoMap_.find(windowInfoKey) == interestInfoMap_.end()) {
1118             interestInfoMap_[windowInfoKey] = 1;
1119         } else {
1120             interestInfoMap_[windowInfoKey]++;
1121         }
1122         interestInfo |= static_cast<uint32_t>(windowInfoKey);
1123     }
1124     ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowPropertyChangeAgent(
1125         WindowInfoKey::FLOATING_SCALE, interestInfo, pImpl_->windowPropertyChangeAgent_);
1126     if (ret != WMError::WM_OK) {
1127         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "RegisterWindowPropertyChangeAgent failed!");
1128         pImpl_->windowPropertyChangeAgent_ = nullptr;
1129     } else {
1130         auto iter = std::find(pImpl_->floatingScaleChangeListeners_.begin(),
1131             pImpl_->floatingScaleChangeListeners_.end(), listener);
1132         if (iter != pImpl_->floatingScaleChangeListeners_.end()) {
1133             TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Listener is already registered.");
1134             return WMError::WM_OK;
1135         }
1136         pImpl_->floatingScaleChangeListeners_.emplace_back(listener);
1137     }
1138     return ret;
1139 }
1140 
UnregisterFloatingScaleChangedListener(const sptr<IWindowInfoChangedListener> & listener)1141 WMError WindowManager::UnregisterFloatingScaleChangedListener(const sptr<IWindowInfoChangedListener>& listener)
1142 {
1143     if (listener == nullptr) {
1144         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "listener is null");
1145         return WMError::WM_ERROR_NULLPTR;
1146     }
1147     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1148     pImpl_->floatingScaleChangeListeners_.erase(std::remove_if(pImpl_->floatingScaleChangeListeners_.begin(),
1149         pImpl_->floatingScaleChangeListeners_.end(), [listener](sptr<IWindowInfoChangedListener> registeredListener) {
1150             return registeredListener == listener;
1151         }), pImpl_->floatingScaleChangeListeners_.end());
1152     uint32_t interestInfo = 0;
1153     for (auto windowInfoKey : listener->GetInterestInfo()) {
1154         if (interestInfoMap_.find(windowInfoKey) == interestInfoMap_.end()) {
1155             continue;
1156         } else if (interestInfoMap_[windowInfoKey] == 1) {
1157             interestInfoMap_.erase(windowInfoKey);
1158             interestInfo |= static_cast<uint32_t>(windowInfoKey);
1159         } else {
1160             interestInfoMap_[windowInfoKey]--;
1161         }
1162     }
1163     WMError ret = WMError::WM_OK;
1164     if (pImpl_->floatingScaleChangeListeners_.empty() && pImpl_->windowPropertyChangeAgent_ != nullptr) {
1165         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowPropertyChangeAgent(
1166             WindowInfoKey::FLOATING_SCALE, interestInfo, pImpl_->windowPropertyChangeAgent_);
1167         if (ret == WMError::WM_OK) {
1168             pImpl_->windowPropertyChangeAgent_ = nullptr;
1169         }
1170     }
1171     return ret;
1172 }
1173 
RegisterVisibilityStateChangedListener(const sptr<IWindowInfoChangedListener> & listener)1174 WMError WindowManager::RegisterVisibilityStateChangedListener(const sptr<IWindowInfoChangedListener>& listener)
1175 {
1176     if (listener == nullptr) {
1177         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "listener is null");
1178         return WMError::WM_ERROR_NULLPTR;
1179     }
1180     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1181     WMError ret = WMError::WM_OK;
1182     if (pImpl_->windowVisibilityStateListenerAgent_ == nullptr) {
1183         pImpl_->windowVisibilityStateListenerAgent_ = new WindowManagerAgent();
1184     }
1185     ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
1186         WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_VISIBILITY,
1187         pImpl_->windowVisibilityStateListenerAgent_);
1188     if (ret != WMError::WM_OK) {
1189         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "RegisterWindowManagerAgent failed!");
1190         pImpl_->windowVisibilityStateListenerAgent_ = nullptr;
1191     } else {
1192         auto iter = std::find(pImpl_->windowVisibilityStateListeners_.begin(),
1193             pImpl_->windowVisibilityStateListeners_.end(), listener);
1194         if (iter != pImpl_->windowVisibilityStateListeners_.end()) {
1195             TLOGW(WmsLogTag::WMS_ATTRIBUTE, "Listener is already registered.");
1196             return WMError::WM_OK;
1197         }
1198         pImpl_->windowVisibilityStateListeners_.emplace_back(listener);
1199     }
1200     return ret;
1201 }
1202 
UnregisterVisibilityStateChangedListener(const sptr<IWindowInfoChangedListener> & listener)1203 WMError WindowManager::UnregisterVisibilityStateChangedListener(const sptr<IWindowInfoChangedListener>& listener)
1204 {
1205     if (listener == nullptr) {
1206         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "listener is null");
1207         return WMError::WM_ERROR_NULLPTR;
1208     }
1209     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1210     pImpl_->windowVisibilityStateListeners_.erase(std::remove_if(pImpl_->windowVisibilityStateListeners_ .begin(),
1211         pImpl_->windowVisibilityStateListeners_.end(), [listener](sptr<IWindowInfoChangedListener> registeredListener) {
1212             return registeredListener == listener;
1213         }), pImpl_->windowVisibilityStateListeners_.end());
1214 
1215     WMError ret = WMError::WM_OK;
1216     if (pImpl_->windowVisibilityStateListeners_.empty() && pImpl_->windowVisibilityStateListenerAgent_ != nullptr) {
1217         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
1218             WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_VISIBILITY,
1219             pImpl_->windowVisibilityStateListenerAgent_);
1220         if (ret == WMError::WM_OK) {
1221             pImpl_->windowVisibilityStateListenerAgent_ = nullptr;
1222         }
1223     }
1224     return ret;
1225 }
1226 
RegisterCameraFloatWindowChangedListener(const sptr<ICameraFloatWindowChangedListener> & listener)1227 WMError WindowManager::RegisterCameraFloatWindowChangedListener(const sptr<ICameraFloatWindowChangedListener>& listener)
1228 {
1229     if (listener == nullptr) {
1230         WLOGFE("listener could not be null");
1231         return WMError::WM_ERROR_NULLPTR;
1232     }
1233 
1234     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1235     WMError ret = WMError::WM_OK;
1236     if (pImpl_->cameraFloatWindowChangedListenerAgent_ == nullptr) {
1237         pImpl_->cameraFloatWindowChangedListenerAgent_ = new WindowManagerAgent();
1238     }
1239     ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
1240         WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_CAMERA_FLOAT,
1241         pImpl_->cameraFloatWindowChangedListenerAgent_);
1242     if (ret != WMError::WM_OK) {
1243         WLOGFW("RegisterWindowManagerAgent failed!");
1244         pImpl_->cameraFloatWindowChangedListenerAgent_ = nullptr;
1245     } else {
1246         auto iter = std::find(pImpl_->cameraFloatWindowChangedListeners_.begin(),
1247             pImpl_->cameraFloatWindowChangedListeners_.end(), listener);
1248         if (iter != pImpl_->cameraFloatWindowChangedListeners_.end()) {
1249             WLOGFW("Listener is already registered.");
1250             return WMError::WM_OK;
1251         }
1252         pImpl_->cameraFloatWindowChangedListeners_.push_back(listener);
1253     }
1254     return ret;
1255 }
1256 
UnregisterCameraFloatWindowChangedListener(const sptr<ICameraFloatWindowChangedListener> & listener)1257 WMError WindowManager::UnregisterCameraFloatWindowChangedListener(
1258     const sptr<ICameraFloatWindowChangedListener>& listener)
1259 {
1260     if (listener == nullptr) {
1261         WLOGFE("listener could not be null");
1262         return WMError::WM_ERROR_NULLPTR;
1263     }
1264 
1265     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1266     auto iter = std::find(pImpl_->cameraFloatWindowChangedListeners_.begin(),
1267         pImpl_->cameraFloatWindowChangedListeners_.end(), listener);
1268     if (iter == pImpl_->cameraFloatWindowChangedListeners_.end()) {
1269         WLOGFE("could not find this listener");
1270         return WMError::WM_OK;
1271     }
1272     pImpl_->cameraFloatWindowChangedListeners_.erase(iter);
1273     WMError ret = WMError::WM_OK;
1274     if (pImpl_->cameraFloatWindowChangedListeners_.empty() &&
1275         pImpl_->cameraFloatWindowChangedListenerAgent_ != nullptr) {
1276         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
1277             WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_CAMERA_FLOAT,
1278             pImpl_->cameraFloatWindowChangedListenerAgent_);
1279         if (ret == WMError::WM_OK) {
1280             pImpl_->cameraFloatWindowChangedListenerAgent_ = nullptr;
1281         }
1282     }
1283     return ret;
1284 }
1285 
RegisterWaterMarkFlagChangedListener(const sptr<IWaterMarkFlagChangedListener> & listener)1286 WMError WindowManager::RegisterWaterMarkFlagChangedListener(const sptr<IWaterMarkFlagChangedListener>& listener)
1287 {
1288     if (listener == nullptr) {
1289         WLOGFE("listener could not be null");
1290         return WMError::WM_ERROR_NULLPTR;
1291     }
1292 
1293     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1294     WMError ret = WMError::WM_OK;
1295     if (pImpl_->waterMarkFlagChangeAgent_ == nullptr) {
1296         pImpl_->waterMarkFlagChangeAgent_ = new WindowManagerAgent();
1297     }
1298     ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
1299         WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WATER_MARK_FLAG,
1300         pImpl_->waterMarkFlagChangeAgent_);
1301     if (ret != WMError::WM_OK) {
1302         WLOGFW("RegisterWindowManagerAgent failed!");
1303         pImpl_->waterMarkFlagChangeAgent_ = nullptr;
1304     } else {
1305         auto iter = std::find(pImpl_->waterMarkFlagChangeListeners_.begin(),
1306             pImpl_->waterMarkFlagChangeListeners_.end(), listener);
1307         if (iter != pImpl_->waterMarkFlagChangeListeners_.end()) {
1308             WLOGFW("Listener is already registered.");
1309             return WMError::WM_OK;
1310         }
1311         pImpl_->waterMarkFlagChangeListeners_.push_back(listener);
1312     }
1313     WLOGFD("Try to registerWaterMarkFlagChangedListener && result : %{public}u", static_cast<uint32_t>(ret));
1314     return ret;
1315 }
1316 
UnregisterWaterMarkFlagChangedListener(const sptr<IWaterMarkFlagChangedListener> & listener)1317 WMError WindowManager::UnregisterWaterMarkFlagChangedListener(const sptr<IWaterMarkFlagChangedListener>& listener)
1318 {
1319     if (listener == nullptr) {
1320         WLOGFE("listener could not be null");
1321         return WMError::WM_ERROR_NULLPTR;
1322     }
1323 
1324     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1325     auto iter = std::find(pImpl_->waterMarkFlagChangeListeners_.begin(),
1326         pImpl_->waterMarkFlagChangeListeners_.end(), listener);
1327     if (iter == pImpl_->waterMarkFlagChangeListeners_.end()) {
1328         WLOGFE("could not find this listener");
1329         return WMError::WM_OK;
1330     }
1331     pImpl_->waterMarkFlagChangeListeners_.erase(iter);
1332     WMError ret = WMError::WM_OK;
1333     if (pImpl_->waterMarkFlagChangeListeners_.empty() &&
1334         pImpl_->waterMarkFlagChangeAgent_ != nullptr) {
1335         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
1336             WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WATER_MARK_FLAG,
1337             pImpl_->waterMarkFlagChangeAgent_);
1338         if (ret == WMError::WM_OK) {
1339             pImpl_->waterMarkFlagChangeAgent_ = nullptr;
1340         }
1341     }
1342     WLOGFD("Try to unregisterWaterMarkFlagChangedListener && result : %{public}u", static_cast<uint32_t>(ret));
1343     return ret;
1344 }
1345 
RegisterGestureNavigationEnabledChangedListener(const sptr<IGestureNavigationEnabledChangedListener> & listener)1346 WMError WindowManager::RegisterGestureNavigationEnabledChangedListener(
1347     const sptr<IGestureNavigationEnabledChangedListener>& listener)
1348 {
1349     if (listener == nullptr) {
1350         WLOGFE("listener could not be null");
1351         return WMError::WM_ERROR_NULLPTR;
1352     }
1353 
1354     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1355     WMError ret = WMError::WM_OK;
1356     if (pImpl_->gestureNavigationEnabledAgent_ == nullptr) {
1357         pImpl_->gestureNavigationEnabledAgent_ = new (std::nothrow)WindowManagerAgent();
1358     }
1359     if (pImpl_->gestureNavigationEnabledAgent_ != nullptr) {
1360         ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
1361             WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_GESTURE_NAVIGATION_ENABLED,
1362             pImpl_->gestureNavigationEnabledAgent_);
1363     } else {
1364         WLOGFE("Create windowManagerAgent object failed!");
1365         ret = WMError::WM_ERROR_NULLPTR;
1366     }
1367     if (ret != WMError::WM_OK) {
1368         WLOGFE("RegisterWindowManagerAgent failed!");
1369         pImpl_->gestureNavigationEnabledAgent_ = nullptr;
1370     } else {
1371         auto iter = std::find(pImpl_->gestureNavigationEnabledListeners_.begin(),
1372             pImpl_->gestureNavigationEnabledListeners_.end(), listener);
1373         if (iter != pImpl_->gestureNavigationEnabledListeners_.end()) {
1374             WLOGFW("Listener is already registered.");
1375             return WMError::WM_OK;
1376         }
1377         pImpl_->gestureNavigationEnabledListeners_.push_back(listener);
1378     }
1379     WLOGFD("Try to registerGestureNavigationEnabledChangedListener and result is %{public}u",
1380         static_cast<uint32_t>(ret));
1381     return ret;
1382 }
1383 
UnregisterGestureNavigationEnabledChangedListener(const sptr<IGestureNavigationEnabledChangedListener> & listener)1384 WMError WindowManager::UnregisterGestureNavigationEnabledChangedListener(
1385     const sptr<IGestureNavigationEnabledChangedListener>& listener)
1386 {
1387     if (listener == nullptr) {
1388         WLOGFE("listener could not be null");
1389         return WMError::WM_ERROR_NULLPTR;
1390     }
1391 
1392     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1393     auto iter = std::find(pImpl_->gestureNavigationEnabledListeners_.begin(),
1394         pImpl_->gestureNavigationEnabledListeners_.end(), listener);
1395     if (iter == pImpl_->gestureNavigationEnabledListeners_.end()) {
1396         WLOGFE("could not find this listener");
1397         return WMError::WM_ERROR_INVALID_PARAM;
1398     }
1399     pImpl_->gestureNavigationEnabledListeners_.erase(iter);
1400     WMError ret = WMError::WM_OK;
1401     if (pImpl_->gestureNavigationEnabledListeners_.empty() &&
1402         pImpl_->gestureNavigationEnabledAgent_ != nullptr) {
1403         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
1404             WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_GESTURE_NAVIGATION_ENABLED,
1405             pImpl_->gestureNavigationEnabledAgent_);
1406         if (ret == WMError::WM_OK) {
1407             pImpl_->gestureNavigationEnabledAgent_ = nullptr;
1408         }
1409     }
1410     WLOGFD("Try to unregisterGestureNavigationEnabledChangedListener and result is %{public}u",
1411         static_cast<uint32_t>(ret));
1412     return ret;
1413 }
1414 
RegisterDisplayInfoChangedListener(const sptr<IRemoteObject> & token,const sptr<IDisplayInfoChangedListener> & listener)1415 WMError WindowManager::RegisterDisplayInfoChangedListener(const sptr<IRemoteObject>& token,
1416     const sptr<IDisplayInfoChangedListener>& listener)
1417 {
1418     if (token == nullptr) {
1419         TLOGE(WmsLogTag::DMS, "ability token could not be null");
1420         return WMError::WM_ERROR_NULLPTR;
1421     }
1422 
1423     if (listener == nullptr) {
1424         TLOGE(WmsLogTag::DMS, "listener could not be null");
1425         return WMError::WM_ERROR_NULLPTR;
1426     }
1427 
1428     sptr<WindowDisplayChangeAdapter> listenerAdapter = new (std::nothrow) WindowDisplayChangeAdapter(token, listener);
1429     if (listenerAdapter == nullptr) {
1430         TLOGE(WmsLogTag::DMS, "create listener adapter failed.");
1431         return WMError::WM_ERROR_NO_MEM;
1432     }
1433     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1434     auto iter = pImpl_->displayInfoChangedListeners_.find(token);
1435     if (iter == pImpl_->displayInfoChangedListeners_.end()) {
1436         pImpl_->displayInfoChangedListeners_.insert({token, {listenerAdapter}});
1437     } else {
1438         auto listerneIter = std::find_if(iter->second.begin(), iter->second.end(),
1439             [&listener](const sptr<WindowDisplayChangeAdapter>& item) {
1440                 return listener == item->GetListener();
1441             });
1442         if (listerneIter != iter->second.end()) {
1443             TLOGW(WmsLogTag::DMS, "listener is already registered.");
1444         } else {
1445             iter->second.push_back(listenerAdapter);
1446         }
1447     }
1448     TLOGD(WmsLogTag::DMS, "try to registerDisplayInfoChangedListener success");
1449     return WMError::WM_OK;
1450 }
1451 
UnregisterDisplayInfoChangedListener(const sptr<IRemoteObject> & token,const sptr<IDisplayInfoChangedListener> & listener)1452 WMError WindowManager::UnregisterDisplayInfoChangedListener(const sptr<IRemoteObject>& token,
1453     const sptr<IDisplayInfoChangedListener>& listener)
1454 {
1455     if (token == nullptr) {
1456         TLOGE(WmsLogTag::DMS, "ability token could not be null");
1457         return WMError::WM_ERROR_NULLPTR;
1458     }
1459 
1460     if (listener == nullptr) {
1461         TLOGE(WmsLogTag::DMS, "listener could not be null");
1462         return WMError::WM_ERROR_NULLPTR;
1463     }
1464 
1465     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1466     auto iter = pImpl_->displayInfoChangedListeners_.find(token);
1467     if (iter == pImpl_->displayInfoChangedListeners_.end()) {
1468         TLOGW(WmsLogTag::DMS, "can not find the ability token");
1469     } else {
1470         auto listerneIter = std::find_if(iter->second.begin(), iter->second.end(),
1471             [&listener](sptr<WindowDisplayChangeAdapter>& item) {
1472                 return listener == item->GetListener();
1473             });
1474         if (listerneIter == iter->second.end()) {
1475             TLOGW(WmsLogTag::DMS, "can not find the listener.");
1476         } else {
1477             iter->second.erase(listerneIter);
1478             if (iter->second.empty()) {
1479                 pImpl_->displayInfoChangedListeners_.erase(iter);
1480             }
1481         }
1482     }
1483     TLOGD(WmsLogTag::DMS, "try to unregisterDisplayInfoChangedListener success");
1484     return WMError::WM_OK;
1485 }
1486 
RegisterWindowPidVisibilityChangedListener(const sptr<IWindowPidVisibilityChangedListener> & listener)1487 WMError WindowManager::RegisterWindowPidVisibilityChangedListener(
1488     const sptr<IWindowPidVisibilityChangedListener>& listener)
1489 {
1490     if (listener == nullptr) {
1491         TLOGE(WmsLogTag::WMS_LIFE, "listener could not be null");
1492         return WMError::WM_ERROR_NULLPTR;
1493     }
1494     WMError ret = WMError::WM_OK;
1495     {
1496         std::unique_lock<std::shared_mutex> lock(pImpl_->visibilityListenerAgentListenerMutex_);
1497         if (pImpl_->windowPidVisibilityListenerAgent_ == nullptr) {
1498             pImpl_->windowPidVisibilityListenerAgent_ = sptr<WindowManagerAgent>::MakeSptr();
1499         }
1500 
1501         ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
1502             WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_PID_VISIBILITY,
1503             pImpl_->windowPidVisibilityListenerAgent_);
1504         if (ret != WMError::WM_OK) {
1505             TLOGE(WmsLogTag::WMS_LIFE, "RegisterWindowManagerAgent failed!");
1506             pImpl_->windowPidVisibilityListenerAgent_ = nullptr;
1507         }
1508     }
1509     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1510     if (ret == WMError::WM_OK) {
1511         auto iter = std::find(pImpl_->windowPidVisibilityListeners_.begin(),
1512             pImpl_->windowPidVisibilityListeners_.end(), listener);
1513         if (iter != pImpl_->windowPidVisibilityListeners_.end()) {
1514             WLOGI("Listener is already registered.");
1515             return WMError::WM_OK;
1516         }
1517         pImpl_->windowPidVisibilityListeners_.emplace_back(listener);
1518     }
1519     return ret;
1520 }
1521 
UnregisterWindowPidVisibilityChangedListener(const sptr<IWindowPidVisibilityChangedListener> & listener)1522 WMError WindowManager::UnregisterWindowPidVisibilityChangedListener(
1523     const sptr<IWindowPidVisibilityChangedListener>& listener)
1524 {
1525     if (listener == nullptr) {
1526         TLOGE(WmsLogTag::WMS_LIFE, "listener could not be null");
1527         return WMError::WM_ERROR_NULLPTR;
1528     }
1529     bool isListenEmpty = true;
1530     {
1531         std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1532         auto iter = std::find(pImpl_->windowPidVisibilityListeners_.begin(),
1533             pImpl_->windowPidVisibilityListeners_.end(), listener);
1534         if (iter == pImpl_->windowPidVisibilityListeners_.end()) {
1535             TLOGE(WmsLogTag::WMS_LIFE, "could not find this listener");
1536             return WMError::WM_OK;
1537         }
1538         pImpl_->windowPidVisibilityListeners_.erase(iter);
1539         isListenEmpty = pImpl_->windowPidVisibilityListeners_.empty();
1540     }
1541 
1542     WMError ret = WMError::WM_OK;
1543     if (!isListenEmpty) {
1544         return ret;
1545     }
1546     std::unique_lock<std::shared_mutex> lock(pImpl_->visibilityListenerAgentListenerMutex_);
1547     if (isListenEmpty && pImpl_->windowPidVisibilityListenerAgent_ != nullptr) {
1548         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
1549             WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_PID_VISIBILITY,
1550             pImpl_->windowPidVisibilityListenerAgent_);
1551         if (ret == WMError::WM_OK) {
1552             pImpl_->windowPidVisibilityListenerAgent_ = nullptr;
1553         }
1554     }
1555     return ret;
1556 }
1557 
NotifyDisplayInfoChange(const sptr<IRemoteObject> & token,DisplayId displayId,float density,DisplayOrientation orientation)1558 WMError WindowManager::NotifyDisplayInfoChange(const sptr<IRemoteObject>& token, DisplayId displayId,
1559     float density, DisplayOrientation orientation)
1560 {
1561     TLOGD(WmsLogTag::DMS, "notify display info change, displayid=%{public}" PRIu64 ", density=%{public}f, "
1562         "orientation=%{public}d", displayId, density, orientation);
1563     if (token == nullptr) {
1564         TLOGE(WmsLogTag::DMS, "notify display info change failed, token is nullptr");
1565         return WMError::WM_ERROR_INVALID_PARAM;
1566     }
1567     pImpl_->NotifyDisplayInfoChanged(token, displayId, density, orientation);
1568     return WMError::WM_OK;
1569 }
1570 
GetFocusWindowInfo(FocusChangeInfo & focusInfo,DisplayId displayId)1571 void WindowManager::GetFocusWindowInfo(FocusChangeInfo& focusInfo, DisplayId displayId)
1572 {
1573     SingletonContainer::Get<WindowAdapter>().GetFocusWindowInfo(focusInfo, displayId);
1574 }
1575 
OnWMSConnectionChanged(int32_t userId,int32_t screenId,bool isConnected) const1576 void WindowManager::OnWMSConnectionChanged(int32_t userId, int32_t screenId, bool isConnected) const
1577 {
1578     if (isConnected) {
1579         pImpl_->NotifyWMSConnected(userId, screenId);
1580     } else {
1581         pImpl_->NotifyWMSDisconnected(userId, screenId);
1582     }
1583 }
1584 
UpdateFocusChangeInfo(const sptr<FocusChangeInfo> & focusChangeInfo,bool focused) const1585 void WindowManager::UpdateFocusChangeInfo(const sptr<FocusChangeInfo>& focusChangeInfo, bool focused) const
1586 {
1587     if (focusChangeInfo == nullptr) {
1588         WLOGFE("focusChangeInfo is nullptr.");
1589         return;
1590     }
1591     TLOGD(WmsLogTag::WMS_FOCUS, "window focus change: %{public}d, id: %{public}u", focused, focusChangeInfo->windowId_);
1592     if (focused) {
1593         pImpl_->NotifyFocused(focusChangeInfo);
1594     } else {
1595         pImpl_->NotifyUnfocused(focusChangeInfo);
1596     }
1597 }
1598 
UpdateWindowModeTypeInfo(WindowModeType type) const1599 void WindowManager::UpdateWindowModeTypeInfo(WindowModeType type) const
1600 {
1601     pImpl_->NotifyWindowModeChange(type);
1602 }
1603 
1604 
GetWindowModeType(WindowModeType & windowModeType) const1605 WMError WindowManager::GetWindowModeType(WindowModeType& windowModeType) const
1606 {
1607     WMError ret = SingletonContainer::Get<WindowAdapter>().GetWindowModeType(windowModeType);
1608     if (ret != WMError::WM_OK) {
1609         WLOGFE("get window mode type failed");
1610     }
1611     return ret;
1612 }
1613 
UpdateSystemBarRegionTints(DisplayId displayId,const SystemBarRegionTints & tints) const1614 void WindowManager::UpdateSystemBarRegionTints(DisplayId displayId,
1615     const SystemBarRegionTints& tints) const
1616 {
1617     pImpl_->NotifySystemBarChanged(displayId, tints);
1618 }
1619 
NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>> & infos,WindowUpdateType type) const1620 void WindowManager::NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>>& infos,
1621     WindowUpdateType type) const
1622 {
1623     pImpl_->NotifyAccessibilityWindowInfo(infos, type);
1624 }
1625 
UpdateWindowVisibilityInfo(const std::vector<sptr<WindowVisibilityInfo>> & windowVisibilityInfos) const1626 void WindowManager::UpdateWindowVisibilityInfo(
1627     const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos) const
1628 {
1629     pImpl_->NotifyWindowVisibilityInfoChanged(windowVisibilityInfos);
1630     pImpl_->NotifyWindowVisibilityStateChanged(windowVisibilityInfos);
1631 }
1632 
UpdateWindowDrawingContentInfo(const std::vector<sptr<WindowDrawingContentInfo>> & windowDrawingContentInfos) const1633 void WindowManager::UpdateWindowDrawingContentInfo(
1634     const std::vector<sptr<WindowDrawingContentInfo>>& windowDrawingContentInfos) const
1635 {
1636     pImpl_->NotifyWindowDrawingContentInfoChanged(windowDrawingContentInfos);
1637 }
1638 
GetAccessibilityWindowInfo(std::vector<sptr<AccessibilityWindowInfo>> & infos) const1639 WMError WindowManager::GetAccessibilityWindowInfo(std::vector<sptr<AccessibilityWindowInfo>>& infos) const
1640 {
1641     WMError ret = SingletonContainer::Get<WindowAdapter>().GetAccessibilityWindowInfo(infos);
1642     if (ret != WMError::WM_OK) {
1643         WLOGFE("get window info failed");
1644     }
1645     return ret;
1646 }
1647 
GetUnreliableWindowInfo(int32_t windowId,std::vector<sptr<UnreliableWindowInfo>> & infos) const1648 WMError WindowManager::GetUnreliableWindowInfo(int32_t windowId,
1649     std::vector<sptr<UnreliableWindowInfo>>& infos) const
1650 {
1651     WMError ret = SingletonContainer::Get<WindowAdapter>().GetUnreliableWindowInfo(windowId, infos);
1652     if (ret != WMError::WM_OK) {
1653         TLOGE(WmsLogTag::DEFAULT, "get unreliable window info failed");
1654     }
1655     return ret;
1656 }
1657 
ListWindowInfo(const WindowInfoOption & windowInfoOption,std::vector<sptr<WindowInfo>> & infos) const1658 WMError WindowManager::ListWindowInfo(const WindowInfoOption& windowInfoOption,
1659     std::vector<sptr<WindowInfo>>& infos) const
1660 {
1661     TLOGD(WmsLogTag::WMS_ATTRIBUTE, "windowInfoOption: %{public}u %{public}u %{public}" PRIu64 " %{public}d",
1662         static_cast<WindowInfoFilterOptionDataType>(windowInfoOption.windowInfoFilterOption),
1663         static_cast<WindowInfoTypeOptionDataType>(windowInfoOption.windowInfoTypeOption),
1664         windowInfoOption.displayId, windowInfoOption.windowId);
1665     WMError ret = SingletonContainer::Get<WindowAdapter>().ListWindowInfo(windowInfoOption, infos);
1666     if (ret != WMError::WM_OK) {
1667         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "failed");
1668     }
1669     return ret;
1670 }
1671 
GetAllWindowLayoutInfo(DisplayId displayId,std::vector<sptr<WindowLayoutInfo>> & infos) const1672 WMError WindowManager::GetAllWindowLayoutInfo(DisplayId displayId, std::vector<sptr<WindowLayoutInfo>>& infos) const
1673 {
1674     WMError ret = SingletonContainer::Get<WindowAdapter>().GetAllWindowLayoutInfo(displayId, infos);
1675     if (ret != WMError::WM_OK) {
1676         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "failed");
1677     }
1678     return ret;
1679 }
1680 
GetGlobalWindowMode(DisplayId displayId,GlobalWindowMode & globalWinMode) const1681 WMError WindowManager::GetGlobalWindowMode(DisplayId displayId, GlobalWindowMode& globalWinMode) const
1682 {
1683     return SingletonContainer::Get<WindowAdapter>().GetGlobalWindowMode(displayId, globalWinMode);
1684 }
1685 
GetTopNavDestinationName(int32_t windowId,std::string & topNavDestName) const1686 WMError WindowManager::GetTopNavDestinationName(int32_t windowId, std::string& topNavDestName) const
1687 {
1688     return SingletonContainer::Get<WindowAdapter>().GetTopNavDestinationName(windowId, topNavDestName);
1689 }
1690 
GetVisibilityWindowInfo(std::vector<sptr<WindowVisibilityInfo>> & infos) const1691 WMError WindowManager::GetVisibilityWindowInfo(std::vector<sptr<WindowVisibilityInfo>>& infos) const
1692 {
1693     WMError ret = SingletonContainer::Get<WindowAdapter>().GetVisibilityWindowInfo(infos);
1694     if (ret != WMError::WM_OK) {
1695         WLOGFE("get window visibility info failed");
1696     }
1697     return ret;
1698 }
1699 
DumpSessionAll(std::vector<std::string> & infos)1700 WMError WindowManager::DumpSessionAll(std::vector<std::string>& infos)
1701 {
1702     WMError ret = SingletonContainer::Get<WindowAdapter>().DumpSessionAll(infos);
1703     if (ret != WMError::WM_OK) {
1704         WLOGFE("dump session all failed");
1705     }
1706     return ret;
1707 }
1708 
DumpSessionWithId(int32_t persistentId,std::vector<std::string> & infos)1709 WMError WindowManager::DumpSessionWithId(int32_t persistentId, std::vector<std::string>& infos)
1710 {
1711     WMError ret = SingletonContainer::Get<WindowAdapter>().DumpSessionWithId(persistentId, infos);
1712     if (ret != WMError::WM_OK) {
1713         WLOGFE("dump session with id failed");
1714     }
1715     return ret;
1716 }
1717 
GetUIContentRemoteObj(int32_t windowId,sptr<IRemoteObject> & uiContentRemoteObj)1718 WMError WindowManager::GetUIContentRemoteObj(int32_t windowId, sptr<IRemoteObject>& uiContentRemoteObj)
1719 {
1720     WMError ret = SingletonContainer::Get<WindowAdapter>().GetUIContentRemoteObj(windowId, uiContentRemoteObj);
1721     if (ret != WMError::WM_OK) {
1722         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Failed to get UIContentRemoteObj. PersistentId=%{public}d; ret=%{public}u",
1723             windowId, static_cast<uint32_t>(ret));
1724     }
1725     return ret;
1726 }
1727 
SetGestureNavigationEnabled(bool enable) const1728 WMError WindowManager::SetGestureNavigationEnabled(bool enable) const
1729 {
1730     WMError ret = SingletonContainer::Get<WindowAdapter>().SetGestureNavigationEnabled(enable);
1731     if (ret != WMError::WM_OK) {
1732         WLOGFE("set gesture navigation enabled failed");
1733     }
1734     return ret;
1735 }
1736 
NotifyWindowExtensionVisibilityChange(int32_t pid,int32_t uid,bool visible)1737 WMError WindowManager::NotifyWindowExtensionVisibilityChange(int32_t pid, int32_t uid, bool visible)
1738 {
1739     WMError ret = SingletonContainer::Get<WindowAdapter>().NotifyWindowExtensionVisibilityChange(pid, uid, visible);
1740     if (ret != WMError::WM_OK) {
1741         WLOGFE("notify WindowExtension visibility change failed");
1742     }
1743     return ret;
1744 }
1745 
UpdateCameraFloatWindowStatus(uint32_t accessTokenId,bool isShowing) const1746 void WindowManager::UpdateCameraFloatWindowStatus(uint32_t accessTokenId, bool isShowing) const
1747 {
1748     pImpl_->UpdateCameraFloatWindowStatus(accessTokenId, isShowing);
1749 }
1750 
NotifyWaterMarkFlagChangedResult(bool showWaterMark) const1751 void WindowManager::NotifyWaterMarkFlagChangedResult(bool showWaterMark) const
1752 {
1753     pImpl_->NotifyWaterMarkFlagChangedResult(showWaterMark);
1754 }
1755 
NotifyGestureNavigationEnabledResult(bool enable) const1756 void WindowManager::NotifyGestureNavigationEnabledResult(bool enable) const
1757 {
1758     pImpl_->NotifyGestureNavigationEnabledResult(enable);
1759 }
1760 
NotifyWindowPidVisibilityChanged(const sptr<WindowPidVisibilityInfo> & info) const1761 void WindowManager::NotifyWindowPidVisibilityChanged(const sptr<WindowPidVisibilityInfo>& info) const
1762 {
1763     pImpl_->NotifyWindowPidVisibilityChanged(info);
1764 }
1765 
RaiseWindowToTop(int32_t persistentId)1766 WMError WindowManager::RaiseWindowToTop(int32_t persistentId)
1767 {
1768     WMError ret = SingletonContainer::Get<WindowAdapter>().RaiseWindowToTop(persistentId);
1769     if (ret != WMError::WM_OK) {
1770         WLOGFE("raise window to top failed");
1771     }
1772     return ret;
1773 }
1774 
NotifyWindowStyleChange(WindowStyleType type)1775 WMError WindowManager::NotifyWindowStyleChange(WindowStyleType type)
1776 {
1777     pImpl_->NotifyWindowStyleChange(type);
1778     return WMError::WM_OK;
1779 }
1780 
RegisterDrawingContentChangedListener(const sptr<IDrawingContentChangedListener> & listener)1781 WMError WindowManager::RegisterDrawingContentChangedListener(const sptr<IDrawingContentChangedListener>& listener)
1782 {
1783     if (listener == nullptr) {
1784         WLOGFE("listener could not be null");
1785         return WMError::WM_ERROR_NULLPTR;
1786     }
1787     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1788     WMError ret = WMError::WM_OK;
1789     if (pImpl_->windowDrawingContentListenerAgent_ == nullptr) {
1790         pImpl_->windowDrawingContentListenerAgent_ = new WindowManagerAgent();
1791     }
1792     ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
1793         WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_DRAWING_STATE,
1794         pImpl_->windowDrawingContentListenerAgent_);
1795     if (ret != WMError::WM_OK) {
1796         WLOGFW("RegisterWindowManagerAgent failed!");
1797         pImpl_->windowDrawingContentListenerAgent_ = nullptr;
1798     } else {
1799         auto iter = std::find(pImpl_->windowDrawingContentListeners_.begin(),
1800             pImpl_->windowDrawingContentListeners_.end(), listener);
1801         if (iter != pImpl_->windowDrawingContentListeners_.end()) {
1802             WLOGFW("Listener is already registered.");
1803             return WMError::WM_OK;
1804         }
1805         pImpl_->windowDrawingContentListeners_.emplace_back(listener);
1806     }
1807     return ret;
1808 }
1809 
UnregisterDrawingContentChangedListener(const sptr<IDrawingContentChangedListener> & listener)1810 WMError WindowManager::UnregisterDrawingContentChangedListener(const sptr<IDrawingContentChangedListener>& listener)
1811 {
1812     if (listener == nullptr) {
1813         WLOGFE("listener could not be null");
1814         return WMError::WM_ERROR_NULLPTR;
1815     }
1816     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1817     pImpl_->windowDrawingContentListeners_.erase(std::remove_if(pImpl_->windowDrawingContentListeners_.begin(),
1818         pImpl_->windowDrawingContentListeners_.end(),
1819         [listener](sptr<IDrawingContentChangedListener> registeredListener) { return registeredListener == listener; }),
1820         pImpl_->windowDrawingContentListeners_.end());
1821 
1822     WMError ret = WMError::WM_OK;
1823     if (pImpl_->windowDrawingContentListeners_.empty() && pImpl_->windowDrawingContentListenerAgent_ != nullptr) {
1824         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
1825             WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_DRAWING_STATE,
1826             pImpl_->windowDrawingContentListenerAgent_);
1827         if (ret == WMError::WM_OK) {
1828             pImpl_->windowDrawingContentListenerAgent_ = nullptr;
1829         }
1830     }
1831     return ret;
1832 }
1833 
RegisterWindowSystemBarPropertyChangedListener(const sptr<IWindowSystemBarPropertyChangedListener> & listener)1834 WMError WindowManager::RegisterWindowSystemBarPropertyChangedListener(
1835     const sptr<IWindowSystemBarPropertyChangedListener>& listener)
1836 {
1837     if (listener == nullptr) {
1838         TLOGE(WmsLogTag::WMS_IMMS, "listener is nullptr.");
1839         return WMError::WM_ERROR_NULLPTR;
1840     }
1841     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1842     WMError ret = WMError::WM_OK;
1843     if (pImpl_->windowSystemBarPropertyChangeAgent_ == nullptr) {
1844         pImpl_->windowSystemBarPropertyChangeAgent_ = new WindowManagerAgent();
1845     }
1846     ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
1847         WindowManagerAgentType::WINDOW_MANAGER_AGENT_STATUS_BAR_PROPERTY,
1848         pImpl_->windowSystemBarPropertyChangeAgent_);
1849     if (ret != WMError::WM_OK) {
1850         TLOGE(WmsLogTag::WMS_IMMS, "RegisterWindowManagerAgent failed.");
1851         pImpl_->windowSystemBarPropertyChangeAgent_ = nullptr;
1852     } else {
1853         auto iter = std::find(pImpl_->windowSystemBarPropertyChangedListeners_.begin(),
1854             pImpl_->windowSystemBarPropertyChangedListeners_.end(), listener);
1855         if (iter != pImpl_->windowSystemBarPropertyChangedListeners_.end()) {
1856             TLOGI(WmsLogTag::WMS_IMMS, "listener is already registered.");
1857             return WMError::WM_DO_NOTHING;
1858         }
1859         pImpl_->windowSystemBarPropertyChangedListeners_.emplace_back(listener);
1860         TLOGI(WmsLogTag::WMS_IMMS, "listener registered success.");
1861     }
1862     return ret;
1863 }
1864 
UnregisterWindowSystemBarPropertyChangedListener(const sptr<IWindowSystemBarPropertyChangedListener> & listener)1865 WMError WindowManager::UnregisterWindowSystemBarPropertyChangedListener(
1866     const sptr<IWindowSystemBarPropertyChangedListener>& listener)
1867 {
1868     if (listener == nullptr) {
1869         TLOGE(WmsLogTag::WMS_IMMS, "listener is nullptr.");
1870         return WMError::WM_ERROR_NULLPTR;
1871     }
1872     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1873     auto iter = std::find(pImpl_->windowSystemBarPropertyChangedListeners_.begin(),
1874         pImpl_->windowSystemBarPropertyChangedListeners_.end(), listener);
1875     if (iter == pImpl_->windowSystemBarPropertyChangedListeners_.end()) {
1876         TLOGI(WmsLogTag::WMS_IMMS, "could not find this listener.");
1877         return WMError::WM_DO_NOTHING;
1878     }
1879     WMError ret = WMError::WM_OK;
1880     if (pImpl_->windowSystemBarPropertyChangeAgent_ != nullptr) {
1881         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
1882             WindowManagerAgentType::WINDOW_MANAGER_AGENT_STATUS_BAR_PROPERTY,
1883             pImpl_->windowSystemBarPropertyChangeAgent_);
1884         if (ret == WMError::WM_OK) {
1885             pImpl_->windowSystemBarPropertyChangeAgent_ = nullptr;
1886         }
1887     }
1888     return ret;
1889 }
1890 
NotifyWindowSystemBarPropertyChange(WindowType type,const SystemBarProperty & systemBarProperty)1891 void WindowManager::NotifyWindowSystemBarPropertyChange(WindowType type, const SystemBarProperty& systemBarProperty)
1892 {
1893     pImpl_->NotifyWindowSystemBarPropertyChange(type, systemBarProperty);
1894 }
1895 
NotifyWindowSystemBarPropertyChange(WindowType type,const SystemBarProperty & systemBarProperty)1896 void WindowManager::Impl::NotifyWindowSystemBarPropertyChange(
1897     WindowType type, const SystemBarProperty& systemBarProperty)
1898 {
1899     std::vector<sptr<IWindowSystemBarPropertyChangedListener>> windowSystemBarPropertyChangedListeners;
1900     {
1901         std::unique_lock<std::shared_mutex> lock(listenerMutex_);
1902         windowSystemBarPropertyChangedListeners = windowSystemBarPropertyChangedListeners_;
1903     }
1904     for (auto &listener : windowSystemBarPropertyChangedListeners) {
1905         if (listener != nullptr) {
1906             TLOGI(WmsLogTag::WMS_IMMS, "type %{public}d, enable %{public}d.", type, systemBarProperty.enable_);
1907             listener->OnWindowSystemBarPropertyChanged(type, systemBarProperty);
1908         }
1909     }
1910 }
1911 
ShiftAppWindowFocus(int32_t sourcePersistentId,int32_t targetPersistentId)1912 WMError WindowManager::ShiftAppWindowFocus(int32_t sourcePersistentId, int32_t targetPersistentId)
1913 {
1914     WMError ret = SingletonContainer::Get<WindowAdapter>().ShiftAppWindowFocus(sourcePersistentId, targetPersistentId);
1915     if (ret != WMError::WM_OK) {
1916         WLOGFE("shift application window focus failed");
1917     }
1918     return ret;
1919 }
1920 
RegisterVisibleWindowNumChangedListener(const sptr<IVisibleWindowNumChangedListener> & listener)1921 WMError WindowManager::RegisterVisibleWindowNumChangedListener(const sptr<IVisibleWindowNumChangedListener>& listener)
1922 {
1923     if (listener == nullptr) {
1924         TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null");
1925         return WMError::WM_ERROR_NULLPTR;
1926     }
1927     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1928     WMError ret = WMError::WM_OK;
1929     if (pImpl_->visibleWindowNumChangedListenerAgent_ == nullptr) {
1930         pImpl_->visibleWindowNumChangedListenerAgent_ = new WindowManagerAgent();
1931     }
1932     ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
1933         WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_VISIBLE_WINDOW_NUM,
1934         pImpl_->visibleWindowNumChangedListenerAgent_);
1935     if (ret != WMError::WM_OK) {
1936         TLOGE(WmsLogTag::WMS_MAIN, "RegisterWindowManagerAgent failed!");
1937         pImpl_->visibleWindowNumChangedListenerAgent_ = nullptr;
1938     } else {
1939         auto iter = std::find(pImpl_->visibleWindowNumChangedListeners_.begin(),
1940             pImpl_->visibleWindowNumChangedListeners_.end(), listener);
1941         if (iter != pImpl_->visibleWindowNumChangedListeners_.end()) {
1942             TLOGE(WmsLogTag::WMS_MAIN, "Listener is already registered.");
1943             return WMError::WM_OK;
1944         }
1945         pImpl_->visibleWindowNumChangedListeners_.emplace_back(listener);
1946     }
1947     return ret;
1948 }
1949 
GetSnapshotByWindowId(int32_t windowId,std::shared_ptr<Media::PixelMap> & pixelMap)1950 WMError WindowManager::GetSnapshotByWindowId(int32_t windowId, std::shared_ptr<Media::PixelMap>& pixelMap)
1951 {
1952     return SingletonContainer::Get<WindowAdapter>().GetSnapshotByWindowId(windowId, pixelMap);
1953 }
1954 
UnregisterVisibleWindowNumChangedListener(const sptr<IVisibleWindowNumChangedListener> & listener)1955 WMError WindowManager::UnregisterVisibleWindowNumChangedListener(const sptr<IVisibleWindowNumChangedListener>& listener)
1956 {
1957     if (listener == nullptr) {
1958         TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null");
1959         return WMError::WM_ERROR_NULLPTR;
1960     }
1961     std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1962     auto iter = std::find(pImpl_->visibleWindowNumChangedListeners_.begin(),
1963         pImpl_->visibleWindowNumChangedListeners_.end(), listener);
1964     if (iter == pImpl_->visibleWindowNumChangedListeners_.end()) {
1965         TLOGE(WmsLogTag::WMS_MAIN, "could not find this listener");
1966         return WMError::WM_OK;
1967     }
1968 
1969     WMError ret = WMError::WM_OK;
1970     if (pImpl_->visibleWindowNumChangedListeners_.empty() && pImpl_->visibleWindowNumChangedListenerAgent_ != nullptr) {
1971         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
1972             WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_VISIBLE_WINDOW_NUM,
1973             pImpl_->visibleWindowNumChangedListenerAgent_);
1974         if (ret == WMError::WM_OK) {
1975             pImpl_->visibleWindowNumChangedListenerAgent_ = nullptr;
1976         }
1977     }
1978     return ret;
1979 }
1980 
UpdateVisibleWindowNum(const std::vector<VisibleWindowNumInfo> & visibleWindowNumInfo)1981 void WindowManager::UpdateVisibleWindowNum(const std::vector<VisibleWindowNumInfo>& visibleWindowNumInfo)
1982 {
1983     pImpl_->NotifyVisibleWindowNumChanged(visibleWindowNumInfo);
1984 }
1985 
1986 
RegisterWindowStyleChangedListener(const sptr<IWindowStyleChangedListener> & listener)1987 WMError WindowManager::RegisterWindowStyleChangedListener(const sptr<IWindowStyleChangedListener>& listener)
1988 {
1989     TLOGI(WmsLogTag::WMS_MAIN, "start register");
1990     if (listener == nullptr) {
1991         TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null");
1992         return WMError::WM_ERROR_NULLPTR;
1993     }
1994     {
1995         std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
1996         if (pImpl_->windowStyleListenerAgent_ == nullptr) {
1997             pImpl_->windowStyleListenerAgent_ = new WindowManagerAgent();
1998         }
1999         auto iter = std::find(pImpl_->windowStyleListeners_.begin(), pImpl_->windowStyleListeners_.end(), listener);
2000         if (iter != pImpl_->windowStyleListeners_.end()) {
2001             TLOGW(WmsLogTag::WMS_MAIN, "Listener is already registered.");
2002             return WMError::WM_OK;
2003         }
2004         pImpl_->windowStyleListeners_.push_back(listener);
2005     }
2006     WMError ret = WMError::WM_OK;
2007     ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
2008         WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_STYLE, pImpl_->windowStyleListenerAgent_);
2009     if (ret != WMError::WM_OK) {
2010         TLOGW(WmsLogTag::WMS_MAIN, "RegisterWindowManagerAgent failed!");
2011         std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
2012         pImpl_->windowStyleListenerAgent_ = nullptr;
2013         auto iter = std::find(pImpl_->windowStyleListeners_.begin(), pImpl_->windowStyleListeners_.end(), listener);
2014         if (iter != pImpl_->windowStyleListeners_.end()) {
2015             pImpl_->windowStyleListeners_.erase(iter);
2016         }
2017     }
2018     return ret;
2019 }
2020 
UnregisterWindowStyleChangedListener(const sptr<IWindowStyleChangedListener> & listener)2021 WMError WindowManager::UnregisterWindowStyleChangedListener(const sptr<IWindowStyleChangedListener>& listener)
2022 {
2023     TLOGI(WmsLogTag::WMS_MAIN, "start unregister");
2024     if (listener == nullptr) {
2025         TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null");
2026         return WMError::WM_ERROR_NULLPTR;
2027     }
2028     {
2029         std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
2030         auto iter = std::find(pImpl_->windowStyleListeners_.begin(), pImpl_->windowStyleListeners_.end(), listener);
2031         if (iter == pImpl_->windowStyleListeners_.end()) {
2032             TLOGE(WmsLogTag::WMS_MAIN, "could not find this listener");
2033             return WMError::WM_OK;
2034         }
2035         pImpl_->windowStyleListeners_.erase(iter);
2036     }
2037     WMError ret = WMError::WM_OK;
2038     if (pImpl_->windowStyleListeners_.empty() && pImpl_->windowStyleListenerAgent_ != nullptr) {
2039         ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
2040             WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_STYLE, pImpl_->windowStyleListenerAgent_);
2041         if (ret == WMError::WM_OK) {
2042             std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
2043             pImpl_->windowStyleListenerAgent_ = nullptr;
2044         }
2045     }
2046     return ret;
2047 }
2048 
GetWindowStyleType()2049 WindowStyleType WindowManager::GetWindowStyleType()
2050 {
2051     WindowStyleType styleType;
2052     if (SingletonContainer::Get<WindowAdapter>().GetWindowStyleType(styleType) == WMError::WM_OK) {
2053         return styleType;
2054     }
2055     return styleType;
2056 }
2057 
SkipSnapshotForAppProcess(int32_t pid,bool skip)2058 WMError WindowManager::SkipSnapshotForAppProcess(int32_t pid, bool skip)
2059 {
2060     WMError ret = SingletonContainer::Get<WindowAdapter>().SkipSnapshotForAppProcess(pid, skip);
2061     if (ret != WMError::WM_OK) {
2062         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "skip failed");
2063     }
2064     return ret;
2065 }
2066 
SetProcessWatermark(int32_t pid,const std::string & watermarkName,bool isEnabled)2067 WMError WindowManager::SetProcessWatermark(int32_t pid, const std::string& watermarkName, bool isEnabled)
2068 {
2069     WMError ret = SingletonContainer::Get<WindowAdapter>().SetProcessWatermark(pid, watermarkName, isEnabled);
2070     if (ret != WMError::WM_OK) {
2071         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "failed");
2072     }
2073     return ret;
2074 }
2075 
GetWindowIdsByCoordinate(DisplayId displayId,int32_t windowNumber,int32_t x,int32_t y,std::vector<int32_t> & windowIds) const2076 WMError WindowManager::GetWindowIdsByCoordinate(DisplayId displayId, int32_t windowNumber,
2077     int32_t x, int32_t y, std::vector<int32_t>& windowIds) const
2078 {
2079     WMError ret = SingletonContainer::Get<WindowAdapter>().GetWindowIdsByCoordinate(
2080         displayId, windowNumber, x, y, windowIds);
2081     if (ret != WMError::WM_OK) {
2082         TLOGE(WmsLogTag::DEFAULT, "get windowIds by coordinate failed");
2083     }
2084     return ret;
2085 }
2086 
UpdateScreenLockStatusForApp(const std::string & bundleName,bool isRelease)2087 WMError WindowManager::UpdateScreenLockStatusForApp(const std::string& bundleName, bool isRelease)
2088 {
2089     WMError ret = SingletonContainer::Get<WindowAdapter>().UpdateScreenLockStatusForApp(bundleName, isRelease);
2090     if (ret != WMError::WM_OK) {
2091         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "update screen lock status failed");
2092     }
2093     return ret;
2094 }
2095 
GetDisplayIdByWindowId(const std::vector<uint64_t> & windowIds,std::unordered_map<uint64_t,DisplayId> & windowDisplayIdMap)2096 WMError WindowManager::GetDisplayIdByWindowId(const std::vector<uint64_t>& windowIds,
2097     std::unordered_map<uint64_t, DisplayId>& windowDisplayIdMap)
2098 {
2099     WMError ret = SingletonContainer::Get<WindowAdapter>().GetDisplayIdByWindowId(windowIds, windowDisplayIdMap);
2100     if (ret != WMError::WM_OK) {
2101         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "failed");
2102     }
2103     return ret;
2104 }
2105 
SetGlobalDragResizeType(DragResizeType dragResizeType)2106 WMError WindowManager::SetGlobalDragResizeType(DragResizeType dragResizeType)
2107 {
2108     WMError ret = SingletonContainer::Get<WindowAdapter>().SetGlobalDragResizeType(dragResizeType);
2109     if (ret != WMError::WM_OK) {
2110         TLOGE(WmsLogTag::DEFAULT, "failed");
2111     }
2112     return ret;
2113 }
2114 
GetGlobalDragResizeType(DragResizeType & dragResizeType)2115 WMError WindowManager::GetGlobalDragResizeType(DragResizeType& dragResizeType)
2116 {
2117     WMError ret = SingletonContainer::Get<WindowAdapter>().GetGlobalDragResizeType(dragResizeType);
2118     if (ret != WMError::WM_OK) {
2119         TLOGE(WmsLogTag::DEFAULT, "failed");
2120     }
2121     return ret;
2122 }
2123 
SetAppDragResizeType(const std::string & bundleName,DragResizeType dragResizeType)2124 WMError WindowManager::SetAppDragResizeType(const std::string& bundleName, DragResizeType dragResizeType)
2125 {
2126     WMError ret = SingletonContainer::Get<WindowAdapter>().SetAppDragResizeType(bundleName, dragResizeType);
2127     if (ret != WMError::WM_OK) {
2128         TLOGE(WmsLogTag::DEFAULT, "failed");
2129     }
2130     return ret;
2131 }
2132 
GetAppDragResizeType(const std::string & bundleName,DragResizeType & dragResizeType)2133 WMError WindowManager::GetAppDragResizeType(const std::string& bundleName, DragResizeType& dragResizeType)
2134 {
2135     WMError ret = SingletonContainer::Get<WindowAdapter>().GetAppDragResizeType(bundleName, dragResizeType);
2136     if (ret != WMError::WM_OK) {
2137         TLOGE(WmsLogTag::DEFAULT, "failed");
2138     }
2139     return ret;
2140 }
2141 
SetAppKeyFramePolicy(const std::string & bundleName,const KeyFramePolicy & keyFramePolicy)2142 WMError WindowManager::SetAppKeyFramePolicy(const std::string& bundleName, const KeyFramePolicy& keyFramePolicy)
2143 {
2144     WMError ret = SingletonContainer::Get<WindowAdapter>().SetAppKeyFramePolicy(bundleName, keyFramePolicy);
2145     if (ret != WMError::WM_OK) {
2146         TLOGE(WmsLogTag::DEFAULT, "failed");
2147     }
2148     return ret;
2149 }
2150 
ShiftAppWindowPointerEvent(int32_t sourceWindowId,int32_t targetWindowId,int32_t fingerId)2151 WMError WindowManager::ShiftAppWindowPointerEvent(int32_t sourceWindowId, int32_t targetWindowId, int32_t fingerId)
2152 {
2153     WMError ret = SingletonContainer::Get<WindowAdapter>().ShiftAppWindowPointerEvent(
2154         sourceWindowId, targetWindowId, fingerId);
2155     if (ret != WMError::WM_OK) {
2156         TLOGE(WmsLogTag::WMS_PC, "failed");
2157     }
2158     return ret;
2159 }
2160 
NotifyScreenshotEvent(ScreenshotEventType type)2161 WMError WindowManager::NotifyScreenshotEvent(ScreenshotEventType type)
2162 {
2163     WMError ret = SingletonContainer::Get<WindowAdapter>().NotifyScreenshotEvent(type);
2164     if (ret != WMError::WM_OK) {
2165         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "failed");
2166     }
2167     return ret;
2168 }
2169 
SetStartWindowBackgroundColor(const std::string & moduleName,const std::string & abilityName,uint32_t color)2170 WMError WindowManager::SetStartWindowBackgroundColor(
2171     const std::string& moduleName, const std::string& abilityName, uint32_t color)
2172 {
2173     int32_t uid = static_cast<int32_t>(getuid());
2174     WMError ret = SingletonContainer::Get<WindowAdapter>().SetStartWindowBackgroundColor(
2175         moduleName, abilityName, color, uid);
2176     if (ret != WMError::WM_OK) {
2177         TLOGE(WmsLogTag::WMS_PATTERN, "failed");
2178     }
2179     return ret;
2180 }
2181 
RequestFocus(int32_t persistentId,bool isFocused,bool byForeground,WindowFocusChangeReason reason)2182 WMError WindowManager::RequestFocus(int32_t persistentId, bool isFocused,
2183     bool byForeground, WindowFocusChangeReason reason)
2184 {
2185     int32_t curReason = static_cast<int32_t>(reason);
2186     int32_t reasonStart = static_cast<int32_t>(FocusChangeReason::DEFAULT);
2187     int32_t reasonEnd = static_cast<int32_t>(FocusChangeReason::MAX);
2188     if (curReason < reasonStart || curReason > reasonEnd) {
2189         TLOGE(WmsLogTag::WMS_FOCUS, "could not find focus reason");
2190         return WMError::WM_ERROR_INVALID_PARAM;
2191     }
2192     WMError ret = SingletonContainer::Get<WindowAdapter>().RequestFocusStatusBySA(persistentId,
2193         isFocused, byForeground, static_cast<FocusChangeReason>(curReason));
2194     if (ret != WMError::WM_OK) {
2195         TLOGE(WmsLogTag::WMS_FOCUS, "failed");
2196     }
2197     return ret;
2198 }
2199 
MinimizeByWindowId(const std::vector<int32_t> & windowIds)2200 WMError WindowManager::MinimizeByWindowId(const std::vector<int32_t>& windowIds)
2201 {
2202     WMError ret = SingletonContainer::Get<WindowAdapter>().MinimizeByWindowId(windowIds);
2203     if (ret != WMError::WM_OK) {
2204         TLOGE(WmsLogTag::WMS_LIFE, "failed");
2205     }
2206     return ret;
2207 }
2208 
SetForegroundWindowNum(uint32_t windowNum)2209 WMError WindowManager::SetForegroundWindowNum(uint32_t windowNum)
2210 {
2211     WMError ret = SingletonContainer::Get<WindowAdapter>().SetForegroundWindowNum(windowNum);
2212     if (ret != WMError::WM_OK) {
2213         TLOGE(WmsLogTag::WMS_PC, "failed");
2214     }
2215     return ret;
2216 }
2217 
ProcessRegisterWindowInfoChangeCallback(WindowInfoKey observedInfo,const sptr<IWindowInfoChangedListener> & listener)2218 WMError WindowManager::ProcessRegisterWindowInfoChangeCallback(WindowInfoKey observedInfo,
2219     const sptr<IWindowInfoChangedListener>& listener)
2220 {
2221     switch (observedInfo) {
2222         case WindowInfoKey::VISIBILITY_STATE :
2223             return RegisterVisibilityStateChangedListener(listener);
2224         case WindowInfoKey::DISPLAY_ID :
2225             return RegisterDisplayIdChangedListener(listener);
2226         case WindowInfoKey::WINDOW_RECT :
2227             return RegisterRectChangedListener(listener);
2228         case WindowInfoKey::WINDOW_MODE :
2229             return RegisterWindowModeChangedListenerForPropertyChange(listener);
2230         case WindowInfoKey::FLOATING_SCALE :
2231             return RegisterFloatingScaleChangedListener(listener);
2232         default:
2233             TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Invalid observedInfo: %{public}d", static_cast<uint32_t>(observedInfo));
2234             return WMError::WM_ERROR_INVALID_PARAM;
2235     }
2236 }
2237 
ProcessUnregisterWindowInfoChangeCallback(WindowInfoKey observedInfo,const sptr<IWindowInfoChangedListener> & listener)2238 WMError WindowManager::ProcessUnregisterWindowInfoChangeCallback(WindowInfoKey observedInfo,
2239     const sptr<IWindowInfoChangedListener>& listener)
2240 {
2241     switch (observedInfo) {
2242         case WindowInfoKey::VISIBILITY_STATE :
2243             return UnregisterVisibilityStateChangedListener(listener);
2244         case WindowInfoKey::DISPLAY_ID :
2245             return UnregisterDisplayIdChangedListener(listener);
2246         case WindowInfoKey::WINDOW_RECT :
2247             return UnregisterRectChangedListener(listener);
2248         case WindowInfoKey::WINDOW_MODE :
2249             return UnregisterWindowModeChangedListenerForPropertyChange(listener);
2250         case WindowInfoKey::FLOATING_SCALE :
2251             return UnregisterFloatingScaleChangedListener(listener);
2252         default:
2253             TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Invalid observedInfo: %{public}d", static_cast<uint32_t>(observedInfo));
2254             return WMError::WM_ERROR_INVALID_PARAM;
2255     }
2256 }
2257 
RegisterWindowInfoChangeCallback(const std::unordered_set<WindowInfoKey> & observedInfo,const sptr<IWindowInfoChangedListener> & listener)2258 WMError WindowManager::RegisterWindowInfoChangeCallback(const std::unordered_set<WindowInfoKey>& observedInfo,
2259     const sptr<IWindowInfoChangedListener>& listener)
2260 {
2261     std::ostringstream observedInfoForLog;
2262     observedInfoForLog << "ObservedInfo: ";
2263     auto ret = WMError::WM_OK;
2264     if (!listener) {
2265         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "listener is null.");
2266         return WMError::WM_ERROR_NULLPTR;
2267     }
2268     for (const auto& info : observedInfo) {
2269         observedInfoForLog << static_cast<uint32_t>(info) << ", ";
2270         if (listener->GetInterestInfo().find(info) == listener->GetInterestInfo().end()) {
2271             listener->AddInterestInfo(info);
2272         }
2273         if (!listener->GetInterestWindowIds().empty()) {
2274             listener->AddInterestInfo(WindowInfoKey::WINDOW_ID);
2275         }
2276         ret = ProcessRegisterWindowInfoChangeCallback(info, listener);
2277         if (ret != WMError::WM_OK) {
2278             observedInfoForLog << "failed";
2279             break;
2280         }
2281     }
2282     TLOGI(WmsLogTag::WMS_ATTRIBUTE, "%{public}s", observedInfoForLog.str().c_str());
2283     return ret;
2284 }
2285 
UnregisterWindowInfoChangeCallback(const std::unordered_set<WindowInfoKey> & observedInfo,const sptr<IWindowInfoChangedListener> & listener)2286 WMError WindowManager::UnregisterWindowInfoChangeCallback(const std::unordered_set<WindowInfoKey>& observedInfo,
2287     const sptr<IWindowInfoChangedListener>& listener)
2288 {
2289     std::ostringstream observedInfoForLog;
2290     observedInfoForLog << "ObservedInfo: ";
2291     auto ret = WMError::WM_OK;
2292     if (!listener) {
2293         TLOGE(WmsLogTag::WMS_ATTRIBUTE, "listener is null.");
2294         return WMError::WM_ERROR_NULLPTR;
2295     }
2296     for (const auto& info : observedInfo) {
2297         observedInfoForLog << static_cast<uint32_t>(info) << ", ";
2298         if (listener->GetInterestInfo().find(info) == listener->GetInterestInfo().end()) {
2299             listener->AddInterestInfo(info);
2300         }
2301         if (!listener->GetInterestWindowIds().empty()) {
2302             listener->AddInterestInfo(WindowInfoKey::WINDOW_ID);
2303         }
2304         ret = ProcessUnregisterWindowInfoChangeCallback(info, listener);
2305         if (ret != WMError::WM_OK) {
2306             observedInfoForLog << "failed";
2307             break;
2308         }
2309     }
2310     TLOGI(WmsLogTag::WMS_ATTRIBUTE, "%{public}s", observedInfoForLog.str().c_str());
2311     return ret;
2312 }
2313 
SetIsModuleHookOffToSet(const std::string & moduleName)2314 void WindowManager::SetIsModuleHookOffToSet(const std::string& moduleName)
2315 {
2316     isModuleHookOffSet_.insert(moduleName);
2317     TLOGI(WmsLogTag::WMS_LIFE, "%{public}s", moduleName.c_str());
2318 }
2319 
GetIsModuleHookOffFromSet(const std::string & moduleName)2320 bool WindowManager::GetIsModuleHookOffFromSet(const std::string& moduleName)
2321 {
2322     auto iter = isModuleHookOffSet_.find(moduleName);
2323     if (iter != isModuleHookOffSet_.end()) {
2324         return true;
2325     }
2326     return false;
2327 }
2328 
IsModuleHookOff(bool isModuleAbilityHookEnd,const std::string & moduleName)2329 bool WindowManager::IsModuleHookOff(bool isModuleAbilityHookEnd, const std::string& moduleName)
2330 {
2331     if (isModuleAbilityHookEnd) {
2332         SetIsModuleHookOffToSet(moduleName);
2333     }
2334     if (GetIsModuleHookOffFromSet(moduleName)) {
2335         TLOGI(WmsLogTag::WMS_MAIN, "set IsModuleHookOff true");
2336         return true;
2337     }
2338     return false;
2339 }
2340 
NotifyWindowPropertyChange(uint32_t propertyDirtyFlags,const std::vector<std::unordered_map<WindowInfoKey,WindowChangeInfoType>> & windowInfoList)2341 void WindowManager::NotifyWindowPropertyChange(uint32_t propertyDirtyFlags,
2342     const std::vector<std::unordered_map<WindowInfoKey, WindowChangeInfoType>>& windowInfoList)
2343 {
2344     if (propertyDirtyFlags & static_cast<int32_t>(WindowInfoKey::WINDOW_RECT)) {
2345         pImpl_->NotifyWindowRectChange(windowInfoList);
2346     }
2347     if (propertyDirtyFlags & static_cast<int32_t>(WindowInfoKey::DISPLAY_ID)) {
2348         pImpl_->NotifyDisplayIdChange(windowInfoList);
2349     }
2350     if (propertyDirtyFlags & static_cast<int32_t>(WindowInfoKey::WINDOW_MODE)) {
2351         pImpl_->NotifyWindowModeChangeForPropertyChange(windowInfoList);
2352     }
2353     if (propertyDirtyFlags & static_cast<int32_t>(WindowInfoKey::FLOATING_SCALE)) {
2354         pImpl_->NotifyFloatingScaleChange(windowInfoList);
2355     }
2356 }
2357 
AnimateTo(int32_t windowId,WindowAnimationProperty animationProperty,WindowAnimationOption animationOption)2358 WMError WindowManager::AnimateTo(int32_t windowId, WindowAnimationProperty animationProperty,
2359     WindowAnimationOption animationOption)
2360 {
2361     TLOGI(WmsLogTag::WMS_ANIMATION, "In, windowId: %{public}d, targetScale: %{public}f, animationOption: %{public}s",
2362         windowId, animationProperty.targetScale, animationOption.ToString().c_str());
2363     WMError ret = SingletonContainer::Get<WindowAdapter>().AnimateTo(windowId, animationProperty, animationOption);
2364     if (ret != WMError::WM_OK) {
2365         TLOGE(WmsLogTag::WMS_ANIMATION, "Failed, errorCode: %{public}d", static_cast<int32_t>(ret));
2366     }
2367     return ret;
2368 }
2369 
RegisterWindowLifeCycleCallback(const sptr<IWindowLifeCycleListener> & listener)2370 WMError WindowManager::RegisterWindowLifeCycleCallback(const sptr<IWindowLifeCycleListener>& listener)
2371 {
2372     if (listener == nullptr) {
2373         TLOGE(WmsLogTag::WMS_LIFE, "window lifecycle listener registered could not be null");
2374         return WMError::WM_ERROR_NULLPTR;
2375     }
2376     TLOGI(WmsLogTag::WMS_LIFE, "Register window lifecycle listener");
2377     {
2378         std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
2379         if (pImpl_->windowLifeCycleListener_) {
2380             TLOGI(WmsLogTag::WMS_LIFE, "WindowLifeCycleListener is already registered, do nothing");
2381             return WMError::WM_OK;
2382         }
2383         pImpl_->windowLifeCycleListener_ = listener;
2384     }
2385 
2386     return WMError::WM_OK;
2387 }
2388 
UnregisterWindowLifeCycleCallback(const sptr<IWindowLifeCycleListener> & listener)2389 WMError WindowManager::UnregisterWindowLifeCycleCallback(const sptr<IWindowLifeCycleListener>& listener)
2390 {
2391     if (listener == nullptr) {
2392         TLOGE(WmsLogTag::WMS_LIFE, "window lifecycle listener unregistered could not be null");
2393         return WMError::WM_ERROR_NULLPTR;
2394     }
2395     TLOGI(WmsLogTag::WMS_LIFE, "Unregister window lifecycle listener");
2396     {
2397         std::unique_lock<std::shared_mutex> lock(pImpl_->listenerMutex_);
2398         pImpl_->windowLifeCycleListener_ = nullptr;
2399     }
2400 
2401     return WMError::WM_OK;
2402 }
2403 
RegisterGetJSWindowCallback(GetJSWindowObjFunc && getJSWindowFunc)2404 void WindowManager::RegisterGetJSWindowCallback(GetJSWindowObjFunc&& getJSWindowFunc)
2405 {
2406     getJSWindowObjFunc_ = std::move(getJSWindowFunc);
2407 }
2408 
NotifyWMSWindowDestroyed(const WindowLifeCycleInfo & lifeCycleInfo)2409 void WindowManager::NotifyWMSWindowDestroyed(const WindowLifeCycleInfo& lifeCycleInfo)
2410 {
2411     void* jsWindowNapiValue = nullptr;
2412     if (getJSWindowObjFunc_ != nullptr) {
2413         TLOGI(WmsLogTag::WMS_LIFE, "window name: %{public}s, window id: %{public}d", lifeCycleInfo.windowName.c_str(),
2414             lifeCycleInfo.windowId);
2415         jsWindowNapiValue = getJSWindowObjFunc_(lifeCycleInfo.windowName);
2416     }
2417     pImpl_->NotifyWMSWindowDestroyed(lifeCycleInfo, jsWindowNapiValue);
2418 }
2419 
AddSessionBlackList(const std::unordered_set<std::string> & bundleNames,const std::unordered_set<std::string> & privacyWindowTags)2420 WMError WindowManager::AddSessionBlackList(
2421     const std::unordered_set<std::string>& bundleNames, const std::unordered_set<std::string>& privacyWindowTags)
2422 {
2423     TLOGI(WmsLogTag::WMS_ATTRIBUTE, "in");
2424     auto ret = SingletonContainer::Get<WindowAdapter>().AddSessionBlackList(bundleNames, privacyWindowTags);
2425     return ret;
2426 }
2427 
RemoveSessionBlackList(const std::unordered_set<std::string> & bundleNames,const std::unordered_set<std::string> & privacyWindowTags)2428 WMError WindowManager::RemoveSessionBlackList(
2429     const std::unordered_set<std::string>& bundleNames, const std::unordered_set<std::string>& privacyWindowTags)
2430 {
2431     TLOGI(WmsLogTag::WMS_ATTRIBUTE, "in");
2432     auto ret = SingletonContainer::Get<WindowAdapter>().
2433         RemoveSessionBlackList(bundleNames, privacyWindowTags);
2434     return ret;
2435 }
2436 } // namespace Rosen
2437 } // namespace OHOS
2438