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