1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "window_manager_lite.h"
17
18 #include <algorithm>
19 #include <cinttypes>
20
21 #include "marshalling_helper.h"
22 #include "window_adapter_lite.h"
23 #include "window_manager_agent_lite.h"
24 #include "window_manager_hilog.h"
25 #include "wm_common.h"
26
27 namespace OHOS {
28 namespace Rosen {
29 namespace {
30 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowManagerLite"};
31 }
32
33 WM_IMPLEMENT_SINGLE_INSTANCE(WindowManagerLite)
34
35 class WindowManagerLite::Impl {
36 public:
Impl(std::recursive_mutex & mutex)37 explicit Impl(std::recursive_mutex& mutex) : mutex_(mutex) {}
38 void NotifyFocused(uint32_t windowId, const sptr<IRemoteObject>& abilityToken,
39 WindowType windowType, DisplayId displayId);
40 void NotifyUnfocused(uint32_t windowId, const sptr<IRemoteObject>& abilityToken,
41 WindowType windowType, DisplayId displayId);
42 void NotifyFocused(const sptr<FocusChangeInfo>& focusChangeInfo);
43 void NotifyUnfocused(const sptr<FocusChangeInfo>& focusChangeInfo);
44 void NotifyWindowVisibilityInfoChanged(const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos);
45 void NotifyWindowVisibilityStateChanged(const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos);
46 void PackWindowChangeInfo(const std::unordered_set<WindowInfoKey>& interestInfo,
47 const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos,
48 std::vector<std::unordered_map<WindowInfoKey, std::any>>& windowChangeInfos);
49 void NotifyWindowDrawingContentInfoChanged(const std::vector<sptr<WindowDrawingContentInfo>>&
50 windowDrawingContentInfos);
51 void NotifyWindowModeChange(WindowModeType type);
52 void UpdateCameraWindowStatus(uint32_t accessTokenId, bool isShowing);
53 void NotifyWMSConnected(int32_t userId, int32_t screenId);
54 void NotifyWMSDisconnected(int32_t userId, int32_t screenId);
55 void NotifyWindowStyleChange(WindowStyleType type);
56 void NotifyCallingWindowDisplayChanged(const CallingWindowInfo& callingWindowInfo);
57 void UpdatePiPWindowStateChanged(const std::string& bundleName, bool isForeground);
58 void NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>>& infos,
59 WindowUpdateType type);
60
61 static inline SingletonDelegator<WindowManagerLite> delegator_;
62
63 std::recursive_mutex& mutex_;
64 std::vector<sptr<IFocusChangedListener>> focusChangedListeners_;
65 sptr<WindowManagerAgentLite> focusChangedListenerAgent_;
66 std::vector<sptr<IWindowUpdateListener>> windowUpdateListeners_;
67 sptr<WindowManagerAgentLite> windowUpdateListenerAgent_;
68 std::vector<sptr<IVisibilityChangedListener>> windowVisibilityListeners_;
69 sptr<WindowManagerAgentLite> windowVisibilityListenerAgent_;
70 std::vector<sptr<IWindowInfoChangedListener>> windowVisibilityStateListeners_;
71 sptr<WindowManagerAgentLite> windowVisibilityStateListenerAgent_;
72 std::vector<sptr<IDrawingContentChangedListener>> windowDrawingContentListeners_;
73 sptr<WindowManagerAgentLite> windowDrawingContentListenerAgent_;
74 std::vector<sptr<IWindowModeChangedListener>> windowModeListeners_;
75 sptr<WindowManagerAgentLite> windowModeListenerAgent_;
76 std::vector<sptr<ICameraWindowChangedListener>> cameraWindowChangedListeners_;
77 sptr<WindowManagerAgentLite> cameraWindowChangedListenerAgent_;
78 sptr<IWMSConnectionChangedListener> wmsConnectionChangedListener_;
79 std::vector<sptr<IWindowStyleChangedListener>> windowStyleListeners_;
80 sptr<WindowManagerAgentLite> windowStyleListenerAgent_;
81 std::vector<sptr<IPiPStateChangedListener>> pipStateChangedListeners_;
82 sptr<WindowManagerAgentLite> pipStateChangedListenerAgent_;
83 std::vector<sptr<IKeyboardCallingWindowDisplayChangedListener>> callingDisplayChangedListeners_;
84 sptr<WindowManagerAgentLite> callingDisplayListenerAgent_;
85 };
86
NotifyWMSConnected(int32_t userId,int32_t screenId)87 void WindowManagerLite::Impl::NotifyWMSConnected(int32_t userId, int32_t screenId)
88 {
89 TLOGD(WmsLogTag::WMS_MULTI_USER, "WMS connected [userId:%{public}d; screenId:%{public}d]", userId, screenId);
90 sptr<IWMSConnectionChangedListener> wmsConnectionChangedListener;
91 {
92 std::lock_guard<std::recursive_mutex> lock(mutex_);
93 wmsConnectionChangedListener = wmsConnectionChangedListener_;
94 }
95 if (wmsConnectionChangedListener != nullptr) {
96 wmsConnectionChangedListener->OnConnected(userId, screenId);
97 }
98 }
99
NotifyWMSDisconnected(int32_t userId,int32_t screenId)100 void WindowManagerLite::Impl::NotifyWMSDisconnected(int32_t userId, int32_t screenId)
101 {
102 TLOGI(WmsLogTag::WMS_MULTI_USER, "WMS disconnected [userId:%{public}d; screenId:%{public}d]", userId, screenId);
103 sptr<IWMSConnectionChangedListener> wmsConnectionChangedListener;
104 {
105 std::lock_guard<std::recursive_mutex> lock(mutex_);
106 wmsConnectionChangedListener = wmsConnectionChangedListener_;
107 }
108 if (wmsConnectionChangedListener != nullptr) {
109 wmsConnectionChangedListener->OnDisconnected(userId, screenId);
110 }
111 }
112
NotifyFocused(const sptr<FocusChangeInfo> & focusChangeInfo)113 void WindowManagerLite::Impl::NotifyFocused(const sptr<FocusChangeInfo>& focusChangeInfo)
114 {
115 if (focusChangeInfo == nullptr) {
116 return;
117 }
118 WLOGFD("[WMSFocus]NotifyFocused [%{public}u; %{public}" PRIu64"; %{public}d; %{public}d; %{public}u]",
119 focusChangeInfo->windowId_, focusChangeInfo->displayId_, focusChangeInfo->pid_, focusChangeInfo->uid_,
120 static_cast<uint32_t>(focusChangeInfo->windowType_));
121
122 std::vector<sptr<IFocusChangedListener>> focusChangeListeners;
123 {
124 std::lock_guard<std::recursive_mutex> lock(mutex_);
125 focusChangeListeners = focusChangedListeners_;
126 }
127 WLOGFD("NotifyFocused listeners: %{public}zu", focusChangeListeners.size());
128 for (auto& listener : focusChangeListeners) {
129 if (listener == nullptr) {
130 continue;
131 }
132 listener->OnFocused(focusChangeInfo);
133 }
134 }
135
NotifyUnfocused(const sptr<FocusChangeInfo> & focusChangeInfo)136 void WindowManagerLite::Impl::NotifyUnfocused(const sptr<FocusChangeInfo>& focusChangeInfo)
137 {
138 if (focusChangeInfo == nullptr) {
139 return;
140 }
141 WLOGFD("[WMSFocus]NotifyUnfocused [%{public}u; %{public}" PRIu64"; %{public}d; %{public}d; %{public}u]",
142 focusChangeInfo->windowId_, focusChangeInfo->displayId_, focusChangeInfo->pid_, focusChangeInfo->uid_,
143 static_cast<uint32_t>(focusChangeInfo->windowType_));
144
145 std::vector<sptr<IFocusChangedListener>> focusChangeListeners;
146 {
147 std::lock_guard<std::recursive_mutex> lock(mutex_);
148 focusChangeListeners = focusChangedListeners_;
149 }
150 WLOGFD("NotifyUnfocused listeners: %{public}zu", focusChangeListeners.size());
151 for (auto& listener : focusChangeListeners) {
152 if (listener == nullptr) {
153 continue;
154 }
155 listener->OnUnfocused(focusChangeInfo);
156 }
157 }
158
NotifyWindowVisibilityInfoChanged(const std::vector<sptr<WindowVisibilityInfo>> & windowVisibilityInfos)159 void WindowManagerLite::Impl::NotifyWindowVisibilityInfoChanged(
160 const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos)
161 {
162 std::vector<sptr<IVisibilityChangedListener>> visibilityChangeListeners;
163 {
164 std::lock_guard<std::recursive_mutex> lock(mutex_);
165 visibilityChangeListeners = windowVisibilityListeners_;
166 }
167 for (auto& listener : visibilityChangeListeners) {
168 if (listener == nullptr) {
169 continue;
170 }
171 listener->OnWindowVisibilityChanged(windowVisibilityInfos);
172 }
173 }
174
NotifyWindowVisibilityStateChanged(const std::vector<sptr<WindowVisibilityInfo>> & windowVisibilityInfos)175 void WindowManagerLite::Impl::NotifyWindowVisibilityStateChanged(
176 const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos)
177 {
178 TLOGD(WmsLogTag::WMS_ATTRIBUTE, "in");
179 std::vector<sptr<IWindowInfoChangedListener>> windowVisibilityStateListeners;
180 {
181 std::lock_guard<std::recursive_mutex> lock(mutex_);
182 windowVisibilityStateListeners = windowVisibilityStateListeners_;
183 }
184 for (auto& listener : windowVisibilityStateListeners) {
185 if (listener == nullptr) {
186 TLOGE(WmsLogTag::WMS_ATTRIBUTE, "listener is null");
187 continue;
188 }
189 std::vector<std::unordered_map<WindowInfoKey, std::any>> windowChangeInfos;
190 PackWindowChangeInfo(listener->GetInterestInfo(), windowVisibilityInfos, windowChangeInfos);
191 TLOGD(WmsLogTag::WMS_ATTRIBUTE, "Notify WindowVisibilityState to caller, info size: %{public}zu",
192 windowChangeInfos.size());
193 listener->OnWindowInfoChanged(windowChangeInfos);
194 }
195 }
196
PackWindowChangeInfo(const std::unordered_set<WindowInfoKey> & interestInfo,const std::vector<sptr<WindowVisibilityInfo>> & windowVisibilityInfos,std::vector<std::unordered_map<WindowInfoKey,std::any>> & windowChangeInfos)197 void WindowManagerLite::Impl::PackWindowChangeInfo(const std::unordered_set<WindowInfoKey>& interestInfo,
198 const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos,
199 std::vector<std::unordered_map<WindowInfoKey, std::any>>& windowChangeInfos)
200 {
201 for (const auto& info : windowVisibilityInfos) {
202 std::unordered_map<WindowInfoKey, std::any> windowChangeInfo;
203 if (interestInfo.find(WindowInfoKey::WINDOW_ID) != interestInfo.end()) {
204 windowChangeInfo.emplace(WindowInfoKey::WINDOW_ID, info->windowId_);
205 }
206 if (interestInfo.find(WindowInfoKey::BUNDLE_NAME) != interestInfo.end()) {
207 windowChangeInfo.emplace(WindowInfoKey::BUNDLE_NAME, info->bundleName_);
208 }
209 if (interestInfo.find(WindowInfoKey::ABILITY_NAME) != interestInfo.end()) {
210 windowChangeInfo.emplace(WindowInfoKey::ABILITY_NAME, info->abilityName_);
211 }
212 if (interestInfo.find(WindowInfoKey::APP_INDEX) != interestInfo.end()) {
213 windowChangeInfo.emplace(WindowInfoKey::APP_INDEX, info->appIndex_);
214 }
215 if (interestInfo.find(WindowInfoKey::VISIBILITY_STATE) != interestInfo.end()) {
216 windowChangeInfo.emplace(WindowInfoKey::VISIBILITY_STATE, info->visibilityState_);
217 }
218 windowChangeInfos.emplace_back(windowChangeInfo);
219 }
220 }
221
NotifyWindowDrawingContentInfoChanged(const std::vector<sptr<WindowDrawingContentInfo>> & windowDrawingContentInfos)222 void WindowManagerLite::Impl::NotifyWindowDrawingContentInfoChanged(
223 const std::vector<sptr<WindowDrawingContentInfo>>& windowDrawingContentInfos)
224 {
225 std::vector<sptr<IDrawingContentChangedListener>> windowDrawingContentChangeListeners;
226 {
227 std::lock_guard<std::recursive_mutex> lock(mutex_);
228 windowDrawingContentChangeListeners = windowDrawingContentListeners_;
229 }
230 for (auto& listener : windowDrawingContentChangeListeners) {
231 if (listener == nullptr) {
232 continue;
233 }
234 listener->OnWindowDrawingContentChanged(windowDrawingContentInfos);
235 }
236 }
237
NotifyWindowModeChange(WindowModeType type)238 void WindowManagerLite::Impl::NotifyWindowModeChange(WindowModeType type)
239 {
240 TLOGI(WmsLogTag::WMS_MAIN, "WindowManager::Impl UpdateWindowModeTypeInfo type: %{public}d",
241 static_cast<uint8_t>(type));
242 std::vector<sptr<IWindowModeChangedListener>> windowModeListeners;
243 {
244 std::lock_guard<std::recursive_mutex> lock(mutex_);
245 windowModeListeners = windowModeListeners_;
246 }
247 for (auto &listener : windowModeListeners) {
248 listener->OnWindowModeUpdate(type);
249 }
250 }
251
NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>> & infos,WindowUpdateType type)252 void WindowManagerLite::Impl::NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>>& infos,
253 WindowUpdateType type)
254 {
255 if (infos.empty()) {
256 WLOGFE("infos is empty");
257 return;
258 }
259 for (auto& info : infos) {
260 if (info == nullptr) {
261 TLOGD(WmsLogTag::WMS_MAIN, "info is nullptr");
262 continue;
263 }
264 TLOGD(WmsLogTag::WMS_MAIN, "wid[%{public}u], innerWid[%{public}u], "
265 "uiNodeId[%{public}u], rect[%{public}d %{public}d %{public}d %{public}d], "
266 "isFocused[%{public}d], isDecorEnable[%{public}d], displayId[%{public}" PRIu64 "], layer[%{public}u], "
267 "mode[%{public}u], type[%{public}u, updateType[%{public}d], bundle[%{public}s]",
268 info->wid_, info->innerWid_, info->uiNodeId_, info->windowRect_.width_, info->windowRect_.height_,
269 info->windowRect_.posX_, info->windowRect_.posY_, info->focused_, info->isDecorEnable_, info->displayId_,
270 info->layer_, info->mode_, info->type_, type, info->bundleName_.c_str());
271 for (const auto& rect : info->touchHotAreas_) {
272 TLOGD(WmsLogTag::WMS_MAIN, "window touch hot areas rect[x=%{public}d, y=%{public}d, "
273 "w=%{public}d, h=%{public}d]", rect.posX_, rect.posY_, rect.width_, rect.height_);
274 }
275 }
276
277 std::vector<sptr<IWindowUpdateListener>> windowUpdateListeners;
278 {
279 std::lock_guard<std::recursive_mutex> lock(mutex_);
280 windowUpdateListeners = windowUpdateListeners_;
281 }
282 for (auto& listener : windowUpdateListeners) {
283 listener->OnWindowUpdate(infos, type);
284 }
285 }
286
UpdateCameraWindowStatus(uint32_t accessTokenId,bool isShowing)287 void WindowManagerLite::Impl::UpdateCameraWindowStatus(uint32_t accessTokenId, bool isShowing)
288 {
289 TLOGI(WmsLogTag::WMS_SYSTEM, "Camera window, accessTokenId=%{public}u, isShowing=%{public}u",
290 accessTokenId, isShowing);
291 std::vector<sptr<ICameraWindowChangedListener>> cameraWindowChangeListeners;
292 {
293 std::lock_guard<std::recursive_mutex> lock(mutex_);
294 cameraWindowChangeListeners = cameraWindowChangedListeners_;
295 }
296 for (auto& listener : cameraWindowChangeListeners) {
297 listener->OnCameraWindowChange(accessTokenId, isShowing);
298 }
299 }
300
NotifyWindowStyleChange(WindowStyleType type)301 void WindowManagerLite::Impl::NotifyWindowStyleChange(WindowStyleType type)
302 {
303 TLOGI(WmsLogTag::WMS_MAIN, "WindowStyleChange: %{public}d",
304 static_cast<uint8_t>(type));
305 std::vector<sptr<IWindowStyleChangedListener>> windowStyleListeners;
306 {
307 std::lock_guard<std::recursive_mutex> lock(mutex_);
308 windowStyleListeners = windowStyleListeners_;
309 }
310 for (auto &listener : windowStyleListeners) {
311 TLOGI(WmsLogTag::WMS_MAIN, "real WindowStyleChange type: %{public}d",
312 static_cast<uint8_t>(type));
313 listener->OnWindowStyleUpdate(type);
314 }
315 }
316
NotifyCallingWindowDisplayChanged(const CallingWindowInfo & callingWindowInfo)317 void WindowManagerLite::Impl::NotifyCallingWindowDisplayChanged(const CallingWindowInfo& callingWindowInfo)
318 {
319 std::vector<sptr<IKeyboardCallingWindowDisplayChangedListener>> displayChangeListeners;
320 {
321 std::lock_guard<std::recursive_mutex> lock(mutex_);
322 displayChangeListeners = callingDisplayChangedListeners_;
323 }
324 TLOGI(WmsLogTag::WMS_KEYBOARD, "notify persistentId: %{public}d, pid: %{public}d, "
325 "displayId: %{public}" PRIu64" , userId: %{public}d, size: %{public}zu",
326 callingWindowInfo.windowId_, callingWindowInfo.callingPid_, callingWindowInfo.displayId_,
327 callingWindowInfo.userId_, displayChangeListeners.size());
328
329 for (const auto& listener : displayChangeListeners) {
330 if (!listener) {
331 TLOGE(WmsLogTag::WMS_KEYBOARD, "listener is nullptr");
332 continue;
333 }
334 listener->OnCallingWindowDisplayChanged(callingWindowInfo);
335 }
336 }
337
UpdatePiPWindowStateChanged(const std::string & bundleName,bool isForeground)338 void WindowManagerLite::Impl::UpdatePiPWindowStateChanged(const std::string& bundleName, bool isForeground)
339 {
340 std::vector<sptr<IPiPStateChangedListener>> pipStateChangedListeners;
341 {
342 std::lock_guard<std::recursive_mutex> lock(mutex_);
343 pipStateChangedListeners = pipStateChangedListeners_;
344 }
345 for (auto& listener : pipStateChangedListeners) {
346 if (listener == nullptr) {
347 continue;
348 }
349 listener->OnPiPStateChanged(bundleName, isForeground);
350 }
351 }
352
WindowManagerLite()353 WindowManagerLite::WindowManagerLite() : pImpl_(std::make_unique<Impl>(mutex_))
354 {
355 }
356
~WindowManagerLite()357 WindowManagerLite::~WindowManagerLite()
358 {
359 std::lock_guard<std::recursive_mutex> lock(mutex_);
360 destroyed_ = true;
361 }
362
RegisterFocusChangedListener(const sptr<IFocusChangedListener> & listener)363 WMError WindowManagerLite::RegisterFocusChangedListener(const sptr<IFocusChangedListener>& listener)
364 {
365 if (listener == nullptr) {
366 WLOGFE("listener could not be null");
367 return WMError::WM_ERROR_NULLPTR;
368 }
369
370 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
371 WMError ret = WMError::WM_OK;
372 if (pImpl_->focusChangedListenerAgent_ == nullptr) {
373 pImpl_->focusChangedListenerAgent_ = new (std::nothrow) WindowManagerAgentLite();
374 ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
375 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_FOCUS, pImpl_->focusChangedListenerAgent_);
376 }
377 if (ret != WMError::WM_OK) {
378 WLOGFW("RegisterWindowManagerAgent failed !");
379 pImpl_->focusChangedListenerAgent_ = nullptr;
380 } else {
381 auto iter = std::find(pImpl_->focusChangedListeners_.begin(), pImpl_->focusChangedListeners_.end(), listener);
382 if (iter != pImpl_->focusChangedListeners_.end()) {
383 WLOGFW("Listener is already registered.");
384 return WMError::WM_OK;
385 }
386 pImpl_->focusChangedListeners_.push_back(listener);
387 }
388 return ret;
389 }
390
UnregisterFocusChangedListener(const sptr<IFocusChangedListener> & listener)391 WMError WindowManagerLite::UnregisterFocusChangedListener(const sptr<IFocusChangedListener>& listener)
392 {
393 if (listener == nullptr) {
394 WLOGFE("listener could not be null");
395 return WMError::WM_ERROR_NULLPTR;
396 }
397
398 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
399 auto iter = std::find(pImpl_->focusChangedListeners_.begin(), pImpl_->focusChangedListeners_.end(), listener);
400 if (iter == pImpl_->focusChangedListeners_.end()) {
401 WLOGFE("could not find this listener");
402 return WMError::WM_OK;
403 }
404 pImpl_->focusChangedListeners_.erase(iter);
405 WMError ret = WMError::WM_OK;
406 if (pImpl_->focusChangedListeners_.empty() && pImpl_->focusChangedListenerAgent_ != nullptr) {
407 ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
408 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_FOCUS, pImpl_->focusChangedListenerAgent_);
409 if (ret == WMError::WM_OK) {
410 pImpl_->focusChangedListenerAgent_ = nullptr;
411 }
412 }
413 return ret;
414 }
415
RegisterVisibilityChangedListener(const sptr<IVisibilityChangedListener> & listener)416 WMError WindowManagerLite::RegisterVisibilityChangedListener(const sptr<IVisibilityChangedListener>& listener)
417 {
418 if (listener == nullptr) {
419 WLOGFE("listener could not be null");
420 return WMError::WM_ERROR_NULLPTR;
421 }
422 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
423 WMError ret = WMError::WM_OK;
424 if (pImpl_->windowVisibilityListenerAgent_ == nullptr) {
425 pImpl_->windowVisibilityListenerAgent_ = new (std::nothrow) WindowManagerAgentLite();
426 ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
427 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_VISIBILITY,
428 pImpl_->windowVisibilityListenerAgent_);
429 }
430 if (ret != WMError::WM_OK) {
431 WLOGFW("RegisterWindowManagerAgent failed !");
432 pImpl_->windowVisibilityListenerAgent_ = nullptr;
433 } else {
434 auto iter = std::find(pImpl_->windowVisibilityListeners_.begin(), pImpl_->windowVisibilityListeners_.end(),
435 listener);
436 if (iter != pImpl_->windowVisibilityListeners_.end()) {
437 WLOGFW("Listener is already registered.");
438 return WMError::WM_OK;
439 }
440 pImpl_->windowVisibilityListeners_.emplace_back(listener);
441 }
442 return ret;
443 }
444
UnregisterVisibilityChangedListener(const sptr<IVisibilityChangedListener> & listener)445 WMError WindowManagerLite::UnregisterVisibilityChangedListener(const sptr<IVisibilityChangedListener>& listener)
446 {
447 if (listener == nullptr) {
448 WLOGFE("listener could not be null");
449 return WMError::WM_ERROR_NULLPTR;
450 }
451 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
452 pImpl_->windowVisibilityListeners_.erase(std::remove_if(pImpl_->windowVisibilityListeners_.begin(),
453 pImpl_->windowVisibilityListeners_.end(), [listener](sptr<IVisibilityChangedListener> registeredListener) {
454 return registeredListener == listener;
455 }), pImpl_->windowVisibilityListeners_.end());
456
457 WMError ret = WMError::WM_OK;
458 if (pImpl_->windowVisibilityListeners_.empty() && pImpl_->windowVisibilityListenerAgent_ != nullptr) {
459 ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
460 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_VISIBILITY,
461 pImpl_->windowVisibilityListenerAgent_);
462 if (ret == WMError::WM_OK) {
463 pImpl_->windowVisibilityListenerAgent_ = nullptr;
464 }
465 }
466 return ret;
467 }
468
RegisterVisibilityStateChangedListener(const sptr<IWindowInfoChangedListener> & listener)469 WMError WindowManagerLite::RegisterVisibilityStateChangedListener(const sptr<IWindowInfoChangedListener>& listener)
470 {
471 if (listener == nullptr) {
472 TLOGE(WmsLogTag::WMS_ATTRIBUTE, "listener is null");
473 return WMError::WM_ERROR_NULLPTR;
474 }
475 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
476 WMError ret = WMError::WM_OK;
477 if (pImpl_->windowVisibilityStateListenerAgent_ == nullptr) {
478 pImpl_->windowVisibilityStateListenerAgent_ = new WindowManagerAgentLite();
479 }
480 ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
481 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_VISIBILITY,
482 pImpl_->windowVisibilityStateListenerAgent_);
483 if (ret != WMError::WM_OK) {
484 TLOGE(WmsLogTag::WMS_ATTRIBUTE, "RegisterWindowManagerAgent failed!");
485 pImpl_->windowVisibilityStateListenerAgent_ = nullptr;
486 } else {
487 auto iter = std::find(pImpl_->windowVisibilityStateListeners_.begin(),
488 pImpl_->windowVisibilityStateListeners_.end(), listener);
489 if (iter != pImpl_->windowVisibilityStateListeners_.end()) {
490 TLOGW(WmsLogTag::WMS_ATTRIBUTE, "Listener is already registered.");
491 return WMError::WM_OK;
492 }
493 pImpl_->windowVisibilityStateListeners_.emplace_back(listener);
494 }
495 return ret;
496 }
497
UnregisterVisibilityStateChangedListener(const sptr<IWindowInfoChangedListener> & listener)498 WMError WindowManagerLite::UnregisterVisibilityStateChangedListener(const sptr<IWindowInfoChangedListener>& listener)
499 {
500 if (listener == nullptr) {
501 TLOGE(WmsLogTag::WMS_ATTRIBUTE, "listener is null");
502 return WMError::WM_ERROR_NULLPTR;
503 }
504 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
505 pImpl_->windowVisibilityStateListeners_.erase(std::remove_if(pImpl_->windowVisibilityStateListeners_ .begin(),
506 pImpl_->windowVisibilityStateListeners_.end(), [listener](sptr<IWindowInfoChangedListener> registeredListener) {
507 return registeredListener == listener;
508 }), pImpl_->windowVisibilityStateListeners_.end());
509
510 WMError ret = WMError::WM_OK;
511 if (pImpl_->windowVisibilityStateListeners_.empty() && pImpl_->windowVisibilityStateListenerAgent_ != nullptr) {
512 ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
513 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_VISIBILITY,
514 pImpl_->windowVisibilityStateListenerAgent_);
515 if (ret == WMError::WM_OK) {
516 pImpl_->windowVisibilityStateListenerAgent_ = nullptr;
517 }
518 }
519 return ret;
520 }
521
GetFocusWindowInfo(FocusChangeInfo & focusInfo,DisplayId displayId)522 void WindowManagerLite::GetFocusWindowInfo(FocusChangeInfo& focusInfo, DisplayId displayId)
523 {
524 WLOGFD("In");
525 SingletonContainer::Get<WindowAdapterLite>().GetFocusWindowInfo(focusInfo, displayId);
526 }
527
UpdateFocusChangeInfo(const sptr<FocusChangeInfo> & focusChangeInfo,bool focused) const528 void WindowManagerLite::UpdateFocusChangeInfo(const sptr<FocusChangeInfo>& focusChangeInfo, bool focused) const
529 {
530 if (focusChangeInfo == nullptr) {
531 WLOGFE("focusChangeInfo is nullptr.");
532 return;
533 }
534 WLOGFD("[WMSFocus]window focus change: %{public}d, id: %{public}u", focused, focusChangeInfo->windowId_);
535 if (focused) {
536 pImpl_->NotifyFocused(focusChangeInfo);
537 } else {
538 pImpl_->NotifyUnfocused(focusChangeInfo);
539 }
540 }
541
UpdateWindowVisibilityInfo(const std::vector<sptr<WindowVisibilityInfo>> & windowVisibilityInfos) const542 void WindowManagerLite::UpdateWindowVisibilityInfo(
543 const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos) const
544 {
545 pImpl_->NotifyWindowVisibilityInfoChanged(windowVisibilityInfos);
546 pImpl_->NotifyWindowVisibilityStateChanged(windowVisibilityInfos);
547 }
548
GetVisibilityWindowInfo(std::vector<sptr<WindowVisibilityInfo>> & infos) const549 WMError WindowManagerLite::GetVisibilityWindowInfo(std::vector<sptr<WindowVisibilityInfo>>& infos) const
550 {
551 WMError ret = SingletonContainer::Get<WindowAdapterLite>().GetVisibilityWindowInfo(infos);
552 if (ret != WMError::WM_OK) {
553 WLOGFE("get window visibility info failed");
554 }
555 return ret;
556 }
557
UpdateWindowDrawingContentInfo(const std::vector<sptr<WindowDrawingContentInfo>> & windowDrawingContentInfos) const558 void WindowManagerLite::UpdateWindowDrawingContentInfo(
559 const std::vector<sptr<WindowDrawingContentInfo>>& windowDrawingContentInfos) const
560 {
561 pImpl_->NotifyWindowDrawingContentInfoChanged(windowDrawingContentInfos);
562 }
563
UpdateCameraWindowStatus(uint32_t accessTokenId,bool isShowing) const564 void WindowManagerLite::UpdateCameraWindowStatus(uint32_t accessTokenId, bool isShowing) const
565 {
566 pImpl_->UpdateCameraWindowStatus(accessTokenId, isShowing);
567 }
568
OnRemoteDied()569 void WindowManagerLite::OnRemoteDied()
570 {
571 WLOGI("wms is died");
572 std::lock_guard<std::recursive_mutex> lock(mutex_);
573 if (destroyed_) {
574 WLOGE("Already destroyed");
575 return;
576 }
577 pImpl_->focusChangedListenerAgent_ = nullptr;
578 pImpl_->windowUpdateListenerAgent_ = nullptr;
579 pImpl_->windowVisibilityListenerAgent_ = nullptr;
580 pImpl_->windowDrawingContentListenerAgent_ = nullptr;
581 }
582
RegisterDrawingContentChangedListener(const sptr<IDrawingContentChangedListener> & listener)583 WMError WindowManagerLite::RegisterDrawingContentChangedListener(const sptr<IDrawingContentChangedListener>& listener)
584 {
585 if (listener == nullptr) {
586 WLOGFE("listener could not be null");
587 return WMError::WM_ERROR_NULLPTR;
588 }
589 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
590 WMError ret = WMError::WM_OK;
591 if (pImpl_->windowDrawingContentListenerAgent_ == nullptr) {
592 pImpl_->windowDrawingContentListenerAgent_ = new (std::nothrow) WindowManagerAgentLite();
593 ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
594 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_DRAWING_STATE,
595 pImpl_->windowDrawingContentListenerAgent_);
596 }
597 if (ret != WMError::WM_OK) {
598 WLOGFW("RegisterWindowManagerAgent failed !");
599 pImpl_->windowDrawingContentListenerAgent_ = nullptr;
600 } else {
601 auto iter = std::find(pImpl_->windowDrawingContentListeners_.begin(),
602 pImpl_->windowDrawingContentListeners_.end(), listener);
603 if (iter != pImpl_->windowDrawingContentListeners_.end()) {
604 WLOGFW("Listener is already registered.");
605 return WMError::WM_OK;
606 }
607 pImpl_->windowDrawingContentListeners_.emplace_back(listener);
608 }
609 return ret;
610 }
611
UnregisterDrawingContentChangedListener(const sptr<IDrawingContentChangedListener> & listener)612 WMError WindowManagerLite::UnregisterDrawingContentChangedListener(const sptr<IDrawingContentChangedListener>& listener)
613 {
614 if (listener == nullptr) {
615 WLOGFE("listener could not be null");
616 return WMError::WM_ERROR_NULLPTR;
617 }
618 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
619 pImpl_->windowDrawingContentListeners_.erase(std::remove_if(pImpl_->windowDrawingContentListeners_.begin(),
620 pImpl_->windowDrawingContentListeners_.end(),
621 [listener](sptr<IDrawingContentChangedListener> registeredListener) { return registeredListener == listener; }),
622 pImpl_->windowDrawingContentListeners_.end());
623
624 WMError ret = WMError::WM_OK;
625 if (pImpl_->windowDrawingContentListeners_.empty() && pImpl_->windowDrawingContentListenerAgent_ != nullptr) {
626 ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
627 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_DRAWING_STATE,
628 pImpl_->windowDrawingContentListenerAgent_);
629 if (ret == WMError::WM_OK) {
630 pImpl_->windowDrawingContentListenerAgent_ = nullptr;
631 }
632 }
633 return ret;
634 }
635
UpdateWindowModeTypeInfo(WindowModeType type) const636 void WindowManagerLite::UpdateWindowModeTypeInfo(WindowModeType type) const
637 {
638 pImpl_->NotifyWindowModeChange(type);
639 }
640
NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>> & infos,WindowUpdateType type) const641 void WindowManagerLite::NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>>& infos,
642 WindowUpdateType type) const
643 {
644 pImpl_->NotifyAccessibilityWindowInfo(infos, type);
645 }
646
GetWindowModeType(WindowModeType & windowModeType) const647 WMError WindowManagerLite::GetWindowModeType(WindowModeType& windowModeType) const
648 {
649 WMError ret = SingletonContainer::Get<WindowAdapterLite>().GetWindowModeType(windowModeType);
650 if (ret != WMError::WM_OK) {
651 WLOGFE("get window visibility info failed");
652 }
653 return ret;
654 }
655
RegisterWindowModeChangedListener(const sptr<IWindowModeChangedListener> & listener)656 WMError WindowManagerLite::RegisterWindowModeChangedListener(const sptr<IWindowModeChangedListener>& listener)
657 {
658 if (listener == nullptr) {
659 TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null");
660 return WMError::WM_ERROR_NULLPTR;
661 }
662
663 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
664 if (pImpl_->windowModeListenerAgent_ == nullptr) {
665 pImpl_->windowModeListenerAgent_ = new (std::nothrow) WindowManagerAgentLite();
666 }
667 WMError ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
668 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_MODE, pImpl_->windowModeListenerAgent_);
669 if (ret != WMError::WM_OK) {
670 TLOGW(WmsLogTag::WMS_MAIN, "RegisterWindowManagerAgent failed!");
671 pImpl_->windowModeListenerAgent_ = nullptr;
672 return ret;
673 }
674 auto iter = std::find(pImpl_->windowModeListeners_.begin(), pImpl_->windowModeListeners_.end(), listener);
675 if (iter != pImpl_->windowModeListeners_.end()) {
676 TLOGW(WmsLogTag::WMS_MAIN, "Listener is already registered.");
677 return WMError::WM_OK;
678 }
679 pImpl_->windowModeListeners_.push_back(listener);
680 return ret;
681 }
682
UnregisterWindowModeChangedListener(const sptr<IWindowModeChangedListener> & listener)683 WMError WindowManagerLite::UnregisterWindowModeChangedListener(const sptr<IWindowModeChangedListener>& listener)
684 {
685 if (listener == nullptr) {
686 TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null");
687 return WMError::WM_ERROR_NULLPTR;
688 }
689
690 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
691 auto iter = std::find(pImpl_->windowModeListeners_.begin(), pImpl_->windowModeListeners_.end(), listener);
692 if (iter == pImpl_->windowModeListeners_.end()) {
693 TLOGE(WmsLogTag::WMS_MAIN, "could not find this listener");
694 return WMError::WM_OK;
695 }
696 pImpl_->windowModeListeners_.erase(iter);
697 WMError ret = WMError::WM_OK;
698 if (pImpl_->windowModeListeners_.empty() && pImpl_->windowModeListenerAgent_ != nullptr) {
699 ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
700 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_MODE, pImpl_->windowModeListenerAgent_);
701 if (ret == WMError::WM_OK) {
702 pImpl_->windowModeListenerAgent_ = nullptr;
703 }
704 }
705 return ret;
706 }
707
RegisterCameraWindowChangedListener(const sptr<ICameraWindowChangedListener> & listener)708 WMError WindowManagerLite::RegisterCameraWindowChangedListener(const sptr<ICameraWindowChangedListener>& listener)
709 {
710 if (listener == nullptr) {
711 TLOGE(WmsLogTag::WMS_SYSTEM, "listener could not be null");
712 return WMError::WM_ERROR_NULLPTR;
713 }
714
715 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
716 if (pImpl_->cameraWindowChangedListenerAgent_ == nullptr) {
717 pImpl_->cameraWindowChangedListenerAgent_ = new WindowManagerAgentLite();
718 }
719 WMError ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
720 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_CAMERA_WINDOW, pImpl_->cameraWindowChangedListenerAgent_);
721 if (ret != WMError::WM_OK) {
722 TLOGW(WmsLogTag::WMS_SYSTEM, "RegisterWindowManagerAgent failed!");
723 pImpl_->cameraWindowChangedListenerAgent_ = nullptr;
724 } else {
725 auto iter = std::find(pImpl_->cameraWindowChangedListeners_.begin(),
726 pImpl_->cameraWindowChangedListeners_.end(), listener);
727 if (iter != pImpl_->cameraWindowChangedListeners_.end()) {
728 TLOGW(WmsLogTag::WMS_SYSTEM, "Listener is already registered.");
729 return WMError::WM_OK;
730 }
731 pImpl_->cameraWindowChangedListeners_.push_back(listener);
732 }
733 return ret;
734 }
735
UnregisterCameraWindowChangedListener(const sptr<ICameraWindowChangedListener> & listener)736 WMError WindowManagerLite::UnregisterCameraWindowChangedListener(const sptr<ICameraWindowChangedListener>& listener)
737 {
738 if (listener == nullptr) {
739 TLOGE(WmsLogTag::WMS_SYSTEM, "listener could not be null");
740 return WMError::WM_ERROR_NULLPTR;
741 }
742
743 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
744 auto iter = std::find(pImpl_->cameraWindowChangedListeners_.begin(),
745 pImpl_->cameraWindowChangedListeners_.end(), listener);
746 if (iter == pImpl_->cameraWindowChangedListeners_.end()) {
747 TLOGE(WmsLogTag::WMS_SYSTEM, "could not find this listener");
748 return WMError::WM_OK;
749 }
750 pImpl_->cameraWindowChangedListeners_.erase(iter);
751 WMError ret = WMError::WM_OK;
752 if (pImpl_->cameraWindowChangedListeners_.empty() &&
753 pImpl_->cameraWindowChangedListenerAgent_ != nullptr) {
754 ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
755 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_CAMERA_WINDOW,
756 pImpl_->cameraWindowChangedListenerAgent_);
757 if (ret == WMError::WM_OK) {
758 pImpl_->cameraWindowChangedListenerAgent_ = nullptr;
759 }
760 }
761 return ret;
762 }
763
RaiseWindowToTop(int32_t persistentId)764 WMError WindowManagerLite::RaiseWindowToTop(int32_t persistentId)
765 {
766 WMError ret = SingletonContainer::Get<WindowAdapterLite>().RaiseWindowToTop(persistentId);
767 if (ret != WMError::WM_OK) {
768 TLOGE(WmsLogTag::WMS_SYSTEM, "raise window to top failed.");
769 }
770 return ret;
771 }
772
GetMainWindowInfos(int32_t topNum,std::vector<MainWindowInfo> & topNInfo)773 WMError WindowManagerLite::GetMainWindowInfos(int32_t topNum, std::vector<MainWindowInfo>& topNInfo)
774 {
775 TLOGI(WmsLogTag::WMS_MAIN, "Get main window info lite");
776 return SingletonContainer::Get<WindowAdapterLite>().GetMainWindowInfos(topNum, topNInfo);
777 }
778
GetCallingWindowInfo(CallingWindowInfo & callingWindowInfo)779 WMError WindowManagerLite::GetCallingWindowInfo(CallingWindowInfo& callingWindowInfo)
780 {
781 return SingletonContainer::Get<WindowAdapterLite>().GetCallingWindowInfo(callingWindowInfo);
782 }
783
RegisterWMSConnectionChangedListener(const sptr<IWMSConnectionChangedListener> & listener)784 WMError WindowManagerLite::RegisterWMSConnectionChangedListener(const sptr<IWMSConnectionChangedListener>& listener)
785 {
786 int32_t clientUserId = GetUserIdByUid(getuid());
787 if (clientUserId != SYSTEM_USERID) {
788 TLOGW(WmsLogTag::WMS_MULTI_USER, "Not u0 user, permission denied");
789 return WMError::WM_ERROR_INVALID_PERMISSION;
790 }
791 if (listener == nullptr) {
792 TLOGE(WmsLogTag::WMS_MULTI_USER, "WMS connection changed listener registered could not be null");
793 return WMError::WM_ERROR_NULLPTR;
794 }
795 TLOGD(WmsLogTag::WMS_MULTI_USER, "Register enter");
796 {
797 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
798 if (pImpl_->wmsConnectionChangedListener_) {
799 TLOGI(WmsLogTag::WMS_MULTI_USER, "wmsConnectionChangedListener is already registered, do nothing");
800 return WMError::WM_OK;
801 }
802 pImpl_->wmsConnectionChangedListener_ = listener;
803 }
804 auto ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWMSConnectionChangedListener(
805 std::bind(&WindowManagerLite::OnWMSConnectionChanged, this, std::placeholders::_1, std::placeholders::_2,
806 std::placeholders::_3));
807 if (ret != WMError::WM_OK) {
808 pImpl_->wmsConnectionChangedListener_ = nullptr;
809 }
810 return ret;
811 }
812
UnregisterWMSConnectionChangedListener()813 WMError WindowManagerLite::UnregisterWMSConnectionChangedListener()
814 {
815 TLOGI(WmsLogTag::WMS_MULTI_USER, "Unregister enter");
816 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
817 pImpl_->wmsConnectionChangedListener_ = nullptr;
818 return WMError::WM_OK;
819 }
820
OnWMSConnectionChanged(int32_t userId,int32_t screenId,bool isConnected) const821 void WindowManagerLite::OnWMSConnectionChanged(int32_t userId, int32_t screenId, bool isConnected) const
822 {
823 if (isConnected) {
824 pImpl_->NotifyWMSConnected(userId, screenId);
825 } else {
826 pImpl_->NotifyWMSDisconnected(userId, screenId);
827 }
828 }
829
GetAllMainWindowInfos(std::vector<MainWindowInfo> & infos) const830 WMError WindowManagerLite::GetAllMainWindowInfos(std::vector<MainWindowInfo>& infos) const
831 {
832 if (!infos.empty()) {
833 TLOGE(WmsLogTag::WMS_MAIN, "infos is not empty.");
834 return WMError::WM_ERROR_INVALID_PARAM;
835 }
836 return SingletonContainer::Get<WindowAdapterLite>().GetAllMainWindowInfos(infos);
837 }
838
ClearMainSessions(const std::vector<int32_t> & persistentIds)839 WMError WindowManagerLite::ClearMainSessions(const std::vector<int32_t>& persistentIds)
840 {
841 if (persistentIds.empty()) {
842 TLOGW(WmsLogTag::WMS_MAIN, "Clear main Session failed, persistentIds is empty.");
843 return WMError::WM_OK;
844 }
845 return SingletonContainer::Get<WindowAdapterLite>().ClearMainSessions(persistentIds);
846 }
847
ClearMainSessions(const std::vector<int32_t> & persistentIds,std::vector<int32_t> & clearFailedIds)848 WMError WindowManagerLite::ClearMainSessions(const std::vector<int32_t>& persistentIds,
849 std::vector<int32_t>& clearFailedIds)
850 {
851 if (persistentIds.empty()) {
852 TLOGW(WmsLogTag::WMS_MAIN, "Clear main Session failed, persistentIds is empty.");
853 return WMError::WM_OK;
854 }
855 return SingletonContainer::Get<WindowAdapterLite>().ClearMainSessions(persistentIds, clearFailedIds);
856 }
857
NotifyWindowStyleChange(WindowStyleType type)858 WMError WindowManagerLite::NotifyWindowStyleChange(WindowStyleType type)
859 {
860 pImpl_->NotifyWindowStyleChange(type);
861 return WMError::WM_OK;
862 }
863
NotifyCallingWindowDisplayChanged(const CallingWindowInfo & callingWindowInfo)864 WMError WindowManagerLite::NotifyCallingWindowDisplayChanged(const CallingWindowInfo& callingWindowInfo)
865 {
866 pImpl_->NotifyCallingWindowDisplayChanged(callingWindowInfo);
867 return WMError::WM_OK;
868 }
869
RegisterWindowStyleChangedListener(const sptr<IWindowStyleChangedListener> & listener)870 WMError WindowManagerLite::RegisterWindowStyleChangedListener(const sptr<IWindowStyleChangedListener>& listener)
871 {
872 TLOGI(WmsLogTag::WMS_MAIN, "start register windowStyleChangedListener");
873 if (listener == nullptr) {
874 TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null");
875 return WMError::WM_ERROR_NULLPTR;
876 }
877 {
878 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
879 if (pImpl_->windowStyleListenerAgent_ == nullptr) {
880 pImpl_->windowStyleListenerAgent_ = new WindowManagerAgentLite();
881 }
882 auto iter = std::find(pImpl_->windowStyleListeners_.begin(), pImpl_->windowStyleListeners_.end(), listener);
883 if (iter != pImpl_->windowStyleListeners_.end()) {
884 TLOGW(WmsLogTag::WMS_MAIN, "Listener is already registered.");
885 return WMError::WM_OK;
886 }
887 pImpl_->windowStyleListeners_.push_back(listener);
888 }
889 WMError ret = WMError::WM_OK;
890 ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
891 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_STYLE, pImpl_->windowStyleListenerAgent_);
892 if (ret != WMError::WM_OK) {
893 TLOGW(WmsLogTag::WMS_MAIN, "RegisterWindowManagerAgent failed!");
894 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
895 pImpl_->windowStyleListenerAgent_ = nullptr;
896 auto iter = std::find(pImpl_->windowStyleListeners_.begin(), pImpl_->windowStyleListeners_.end(), listener);
897 if (iter != pImpl_->windowStyleListeners_.end()) {
898 pImpl_->windowStyleListeners_.erase(iter);
899 }
900 }
901 return ret;
902 }
903
UnregisterWindowStyleChangedListener(const sptr<IWindowStyleChangedListener> & listener)904 WMError WindowManagerLite::UnregisterWindowStyleChangedListener(const sptr<IWindowStyleChangedListener>& listener)
905 {
906 TLOGI(WmsLogTag::WMS_MAIN, "start unregister windowStyleChangedListener");
907 if (listener == nullptr) {
908 TLOGE(WmsLogTag::WMS_MAIN, "listener could not be null");
909 return WMError::WM_ERROR_NULLPTR;
910 }
911 {
912 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
913 auto iter = std::find(pImpl_->windowStyleListeners_.begin(), pImpl_->windowStyleListeners_.end(), listener);
914 if (iter == pImpl_->windowStyleListeners_.end()) {
915 TLOGE(WmsLogTag::WMS_MAIN, "could not find this listener");
916 return WMError::WM_OK;
917 }
918 pImpl_->windowStyleListeners_.erase(iter);
919 }
920 WMError ret = WMError::WM_OK;
921 if (pImpl_->windowStyleListeners_.empty() && pImpl_->windowStyleListenerAgent_ != nullptr) {
922 ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
923 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_STYLE, pImpl_->windowStyleListenerAgent_);
924 if (ret == WMError::WM_OK) {
925 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
926 pImpl_->windowStyleListenerAgent_ = nullptr;
927 }
928 }
929 return ret;
930 }
931
RegisterCallingWindowDisplayChangedListener(const sptr<IKeyboardCallingWindowDisplayChangedListener> & listener)932 WMError WindowManagerLite::RegisterCallingWindowDisplayChangedListener(
933 const sptr<IKeyboardCallingWindowDisplayChangedListener>& listener)
934 {
935 TLOGI(WmsLogTag::WMS_KEYBOARD, "start register callingDisplayChangeListener");
936 if (listener == nullptr) {
937 TLOGE(WmsLogTag::WMS_KEYBOARD, "listener could not be null");
938 return WMError::WM_ERROR_NULLPTR;
939 }
940 {
941 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
942 if (pImpl_->callingDisplayListenerAgent_ == nullptr) {
943 pImpl_->callingDisplayListenerAgent_ = new WindowManagerAgentLite();
944 }
945 auto iter = std::find(pImpl_->callingDisplayChangedListeners_.begin(),
946 pImpl_->callingDisplayChangedListeners_.end(), listener);
947 if (iter != pImpl_->callingDisplayChangedListeners_.end()) {
948 TLOGE(WmsLogTag::WMS_KEYBOARD, "listener is already registered");
949 return WMError::WM_OK;
950 }
951 pImpl_->callingDisplayChangedListeners_.emplace_back(listener);
952 }
953 WMError ret = WMError::WM_OK;
954 ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
955 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_CALLING_DISPLAY, pImpl_->callingDisplayListenerAgent_);
956 if (ret != WMError::WM_OK) {
957 TLOGW(WmsLogTag::WMS_KEYBOARD, "Register agent failed!");
958 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
959 pImpl_->callingDisplayListenerAgent_ = nullptr;
960 auto iter = std::find(pImpl_->callingDisplayChangedListeners_.begin(),
961 pImpl_->callingDisplayChangedListeners_.end(), listener);
962 if (iter != pImpl_->callingDisplayChangedListeners_.end()) {
963 pImpl_->callingDisplayChangedListeners_.erase(iter);
964 }
965 }
966 return ret;
967 }
968
UnregisterCallingWindowDisplayChangedListener(const sptr<IKeyboardCallingWindowDisplayChangedListener> & listener)969 WMError WindowManagerLite::UnregisterCallingWindowDisplayChangedListener(
970 const sptr<IKeyboardCallingWindowDisplayChangedListener>& listener)
971 {
972 TLOGI(WmsLogTag::WMS_KEYBOARD, "start unRegister callingDisplayChangeListener");
973 if (listener == nullptr) {
974 TLOGE(WmsLogTag::WMS_KEYBOARD, "listener could not be null");
975 return WMError::WM_ERROR_NULLPTR;
976 }
977 {
978 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
979 auto iter = std::find(pImpl_->callingDisplayChangedListeners_.begin(),
980 pImpl_->callingDisplayChangedListeners_.end(), listener);
981 if (iter == pImpl_->callingDisplayChangedListeners_.end()) {
982 TLOGE(WmsLogTag::WMS_KEYBOARD, "could not find this listener");
983 return WMError::WM_OK;
984 }
985 pImpl_->callingDisplayChangedListeners_.erase(iter);
986 }
987 WMError ret = WMError::WM_OK;
988 if (pImpl_->callingDisplayChangedListeners_.empty() && pImpl_->callingDisplayListenerAgent_ != nullptr) {
989 ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
990 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_CALLING_DISPLAY, pImpl_->callingDisplayListenerAgent_);
991 if (ret == WMError::WM_OK) {
992 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
993 pImpl_->callingDisplayListenerAgent_ = nullptr;
994 }
995 }
996 return ret;
997 }
998
GetWindowStyleType()999 WindowStyleType WindowManagerLite::GetWindowStyleType()
1000 {
1001 WindowStyleType styleType;
1002 if (SingletonContainer::Get<WindowAdapterLite>().GetWindowStyleType(styleType) == WMError::WM_OK) {
1003 return styleType;
1004 }
1005 return styleType;
1006 }
1007
TerminateSessionByPersistentId(int32_t persistentId)1008 WMError WindowManagerLite::TerminateSessionByPersistentId(int32_t persistentId)
1009 {
1010 if (persistentId == INVALID_SESSION_ID) {
1011 TLOGE(WmsLogTag::WMS_LIFE, "persistentId is invalid.");
1012 return WMError::WM_ERROR_INVALID_PARAM;
1013 }
1014 return SingletonContainer::Get<WindowAdapterLite>().TerminateSessionByPersistentId(persistentId);
1015 }
1016
CloseTargetFloatWindow(const std::string & bundleName)1017 WMError WindowManagerLite::CloseTargetFloatWindow(const std::string& bundleName)
1018 {
1019 if (bundleName.empty()) {
1020 TLOGE(WmsLogTag::WMS_MULTI_WINDOW, "bundleName is empty.");
1021 return WMError::WM_ERROR_INVALID_PARAM;
1022 }
1023 return SingletonContainer::Get<WindowAdapterLite>().CloseTargetFloatWindow(bundleName);
1024 }
1025
RegisterPiPStateChangedListener(const sptr<IPiPStateChangedListener> & listener)1026 WMError WindowManagerLite::RegisterPiPStateChangedListener(const sptr<IPiPStateChangedListener>& listener)
1027 {
1028 TLOGI(WmsLogTag::WMS_PIP, "in");
1029 if (listener == nullptr) {
1030 TLOGE(WmsLogTag::WMS_PIP, "listener could not be null");
1031 return WMError::WM_ERROR_NULLPTR;
1032 }
1033
1034 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
1035 if (pImpl_->pipStateChangedListenerAgent_ == nullptr) {
1036 pImpl_->pipStateChangedListenerAgent_ = new WindowManagerAgentLite();
1037 }
1038 WMError ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
1039 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_PIP, pImpl_->pipStateChangedListenerAgent_);
1040 if (ret != WMError::WM_OK) {
1041 TLOGW(WmsLogTag::WMS_PIP, "RegisterWindowManagerAgent failed!");
1042 pImpl_->pipStateChangedListenerAgent_ = nullptr;
1043 } else {
1044 auto iter = std::find(pImpl_->pipStateChangedListeners_.begin(),
1045 pImpl_->pipStateChangedListeners_.end(), listener);
1046 if (iter != pImpl_->pipStateChangedListeners_.end()) {
1047 TLOGW(WmsLogTag::WMS_PIP, "Listener is already registered.");
1048 return WMError::WM_OK;
1049 }
1050 pImpl_->pipStateChangedListeners_.push_back(listener);
1051 }
1052 return ret;
1053 }
1054
UnregisterPiPStateChangedListener(const sptr<IPiPStateChangedListener> & listener)1055 WMError WindowManagerLite::UnregisterPiPStateChangedListener(const sptr<IPiPStateChangedListener>& listener)
1056 {
1057 TLOGI(WmsLogTag::WMS_PIP, "in");
1058 if (listener == nullptr) {
1059 TLOGE(WmsLogTag::WMS_PIP, "listener could not be null");
1060 return WMError::WM_ERROR_NULLPTR;
1061 }
1062
1063 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
1064 auto iter = std::find(pImpl_->pipStateChangedListeners_.begin(),
1065 pImpl_->pipStateChangedListeners_.end(), listener);
1066 if (iter == pImpl_->pipStateChangedListeners_.end()) {
1067 TLOGE(WmsLogTag::WMS_PIP, "could not find this listener");
1068 return WMError::WM_OK;
1069 }
1070 pImpl_->pipStateChangedListeners_.erase(iter);
1071 WMError ret = WMError::WM_OK;
1072 if (pImpl_->pipStateChangedListeners_.empty() &&
1073 pImpl_->pipStateChangedListenerAgent_ != nullptr) {
1074 ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
1075 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_PIP,
1076 pImpl_->pipStateChangedListenerAgent_);
1077 if (ret == WMError::WM_OK) {
1078 pImpl_->pipStateChangedListenerAgent_ = nullptr;
1079 }
1080 }
1081 return ret;
1082 }
1083
CloseTargetPiPWindow(const std::string & bundleName)1084 WMError WindowManagerLite::CloseTargetPiPWindow(const std::string& bundleName)
1085 {
1086 if (bundleName.empty()) {
1087 TLOGE(WmsLogTag::WMS_PIP, "bundleName is empty.");
1088 return WMError::WM_ERROR_INVALID_PARAM;
1089 }
1090 TLOGD(WmsLogTag::WMS_PIP, "bundleName:%{public}s", bundleName.c_str());
1091 return SingletonContainer::Get<WindowAdapterLite>().CloseTargetPiPWindow(bundleName);
1092 }
1093
GetCurrentPiPWindowInfo(std::string & bundleName)1094 WMError WindowManagerLite::GetCurrentPiPWindowInfo(std::string& bundleName)
1095 {
1096 return SingletonContainer::Get<WindowAdapterLite>().GetCurrentPiPWindowInfo(bundleName);
1097 }
1098
UpdatePiPWindowStateChanged(const std::string & bundleName,bool isForeground) const1099 void WindowManagerLite::UpdatePiPWindowStateChanged(const std::string& bundleName, bool isForeground) const
1100 {
1101 pImpl_->UpdatePiPWindowStateChanged(bundleName, isForeground);
1102 }
1103
GetAccessibilityWindowInfo(std::vector<sptr<AccessibilityWindowInfo>> & infos) const1104 WMError WindowManagerLite::GetAccessibilityWindowInfo(std::vector<sptr<AccessibilityWindowInfo>>& infos) const
1105 {
1106 WMError ret = SingletonContainer::Get<WindowAdapterLite>().GetAccessibilityWindowInfo(infos);
1107 if (ret != WMError::WM_OK) {
1108 WLOGFE("get window info failed");
1109 }
1110 return ret;
1111 }
1112
RegisterWindowUpdateListener(const sptr<IWindowUpdateListener> & listener)1113 WMError WindowManagerLite::RegisterWindowUpdateListener(const sptr<IWindowUpdateListener>& listener)
1114 {
1115 if (listener == nullptr) {
1116 WLOGFE("listener could not be null");
1117 return WMError::WM_ERROR_NULLPTR;
1118 }
1119 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
1120 if (pImpl_->windowUpdateListenerAgent_ == nullptr) {
1121 pImpl_->windowUpdateListenerAgent_ = new WindowManagerAgentLite();
1122 }
1123 WMError ret = SingletonContainer::Get<WindowAdapterLite>().RegisterWindowManagerAgent(
1124 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_UPDATE, pImpl_->windowUpdateListenerAgent_);
1125 if (ret != WMError::WM_OK) {
1126 WLOGFW("RegisterWindowManagerAgent failed!");
1127 pImpl_->windowUpdateListenerAgent_ = nullptr;
1128 } else {
1129 auto iter = std::find(pImpl_->windowUpdateListeners_.begin(), pImpl_->windowUpdateListeners_.end(), listener);
1130 if (iter != pImpl_->windowUpdateListeners_.end()) {
1131 WLOGI("Listener is already registered.");
1132 return WMError::WM_OK;
1133 }
1134 pImpl_->windowUpdateListeners_.emplace_back(listener);
1135 }
1136 return ret;
1137 }
1138
UnregisterWindowUpdateListener(const sptr<IWindowUpdateListener> & listener)1139 WMError WindowManagerLite::UnregisterWindowUpdateListener(const sptr<IWindowUpdateListener>& listener)
1140 {
1141 if (listener == nullptr) {
1142 WLOGFE("listener could not be null");
1143 return WMError::WM_ERROR_NULLPTR;
1144 }
1145 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
1146 auto iter = std::find(pImpl_->windowUpdateListeners_.begin(), pImpl_->windowUpdateListeners_.end(), listener);
1147 if (iter == pImpl_->windowUpdateListeners_.end()) {
1148 WLOGFE("could not find this listener");
1149 return WMError::WM_OK;
1150 }
1151 pImpl_->windowUpdateListeners_.erase(iter);
1152 WMError ret = WMError::WM_OK;
1153 if (pImpl_->windowUpdateListeners_.empty() && pImpl_->windowUpdateListenerAgent_ != nullptr) {
1154 ret = SingletonContainer::Get<WindowAdapterLite>().UnregisterWindowManagerAgent(
1155 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_UPDATE, pImpl_->windowUpdateListenerAgent_);
1156 if (ret == WMError::WM_OK) {
1157 pImpl_->windowUpdateListenerAgent_ = nullptr;
1158 }
1159 }
1160 return ret;
1161 }
1162
ProcessRegisterWindowInfoChangeCallback(WindowInfoKey observedInfo,const sptr<IWindowInfoChangedListener> & listener)1163 WMError WindowManagerLite::ProcessRegisterWindowInfoChangeCallback(WindowInfoKey observedInfo,
1164 const sptr<IWindowInfoChangedListener>& listener)
1165 {
1166 switch (observedInfo) {
1167 case WindowInfoKey::VISIBILITY_STATE :
1168 return RegisterVisibilityStateChangedListener(listener);
1169 default:
1170 TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Invalid observedInfo: %{public}d", static_cast<uint32_t>(observedInfo));
1171 return WMError::WM_ERROR_INVALID_PARAM;
1172 }
1173 }
1174
ProcessUnregisterWindowInfoChangeCallback(WindowInfoKey observedInfo,const sptr<IWindowInfoChangedListener> & listener)1175 WMError WindowManagerLite::ProcessUnregisterWindowInfoChangeCallback(WindowInfoKey observedInfo,
1176 const sptr<IWindowInfoChangedListener>& listener)
1177 {
1178 switch (observedInfo) {
1179 case WindowInfoKey::VISIBILITY_STATE :
1180 return UnregisterVisibilityStateChangedListener(listener);
1181 default:
1182 TLOGE(WmsLogTag::WMS_ATTRIBUTE, "Invalid observedInfo: %{public}d", static_cast<uint32_t>(observedInfo));
1183 return WMError::WM_ERROR_INVALID_PARAM;
1184 }
1185 }
1186
RegisterWindowInfoChangeCallback(const std::unordered_set<WindowInfoKey> & observedInfo,const sptr<IWindowInfoChangedListener> & listener)1187 WMError WindowManagerLite::RegisterWindowInfoChangeCallback(const std::unordered_set<WindowInfoKey>& observedInfo,
1188 const sptr<IWindowInfoChangedListener>& listener)
1189 {
1190 std::ostringstream observedInfoForLog;
1191 observedInfoForLog << "ObservedInfo: ";
1192 auto ret = WMError::WM_OK;
1193 for (const auto& info : observedInfo) {
1194 observedInfoForLog << static_cast<uint32_t>(info) << ", ";
1195 if (listener->GetInterestInfo().find(info) == listener->GetInterestInfo().end()) {
1196 listener->AddInterestInfo(info);
1197 }
1198 ret = ProcessRegisterWindowInfoChangeCallback(info, listener);
1199 if (ret != WMError::WM_OK) {
1200 observedInfoForLog << "failed";
1201 break;
1202 }
1203 }
1204 TLOGI(WmsLogTag::WMS_ATTRIBUTE, "%{public}s", observedInfoForLog.str().c_str());
1205 return ret;
1206 }
1207
UnregisterWindowInfoChangeCallback(const std::unordered_set<WindowInfoKey> & observedInfo,const sptr<IWindowInfoChangedListener> & listener)1208 WMError WindowManagerLite::UnregisterWindowInfoChangeCallback(const std::unordered_set<WindowInfoKey>& observedInfo,
1209 const sptr<IWindowInfoChangedListener>& listener)
1210 {
1211 std::ostringstream observedInfoForLog;
1212 observedInfoForLog << "ObservedInfo: ";
1213 auto ret = WMError::WM_OK;
1214 for (const auto& info : observedInfo) {
1215 observedInfoForLog << static_cast<uint32_t>(info) << ", ";
1216 if (listener->GetInterestInfo().find(info) == listener->GetInterestInfo().end()) {
1217 listener->AddInterestInfo(info);
1218 }
1219 ret = ProcessUnregisterWindowInfoChangeCallback(info, listener);
1220 if (ret != WMError::WM_OK) {
1221 observedInfoForLog << "failed";
1222 break;
1223 }
1224 }
1225 TLOGI(WmsLogTag::WMS_ATTRIBUTE, "%{public}s", observedInfoForLog.str().c_str());
1226 return ret;
1227 }
1228
ListWindowInfo(const WindowInfoOption & windowInfoOption,std::vector<sptr<WindowInfo>> & infos) const1229 WMError WindowManagerLite::ListWindowInfo(const WindowInfoOption& windowInfoOption,
1230 std::vector<sptr<WindowInfo>>& infos) const
1231 {
1232 TLOGI(WmsLogTag::WMS_ATTRIBUTE, "windowInfoOption: %{public}u %{public}u %{public}" PRIu64" %{public}d",
1233 static_cast<WindowInfoFilterOptionDataType>(windowInfoOption.windowInfoFilterOption),
1234 static_cast<WindowInfoTypeOptionDataType>(windowInfoOption.windowInfoTypeOption),
1235 windowInfoOption.displayId, windowInfoOption.windowId);
1236 WMError ret = SingletonContainer::Get<WindowAdapterLite>().ListWindowInfo(windowInfoOption, infos);
1237 if (ret != WMError::WM_OK) {
1238 TLOGE(WmsLogTag::WMS_ATTRIBUTE, "failed");
1239 }
1240 return ret;
1241 }
1242 } // namespace Rosen
1243 } // namespace OHOS
1244