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
21 #include "marshalling_helper.h"
22 #include "window_adapter.h"
23 #include "window_manager_agent.h"
24 #include "window_manager_hilog.h"
25 #include "wm_common.h"
26 #ifdef EFFICIENCY_MANAGER_ENABLE
27 #include "suspend_manager_client.h"
28 #endif // EFFICIENCY_MANAGER_ENABLE
29
30 namespace OHOS {
31 namespace Rosen {
32 namespace {
33 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowManager"};
34 }
35
Marshalling(Parcel & parcel) const36 bool WindowVisibilityInfo::Marshalling(Parcel &parcel) const
37 {
38 return parcel.WriteUint32(windowId_) && parcel.WriteInt32(pid_) &&
39 parcel.WriteInt32(uid_) && parcel.WriteBool(isVisible_) &&
40 parcel.WriteUint32(static_cast<uint32_t>(windowType_));
41 }
42
Unmarshalling(Parcel & parcel)43 WindowVisibilityInfo* WindowVisibilityInfo::Unmarshalling(Parcel &parcel)
44 {
45 auto windowVisibilityInfo = new (std::nothrow) WindowVisibilityInfo();
46 if (windowVisibilityInfo == nullptr) {
47 WLOGFE("window visibility info is nullptr.");
48 return nullptr;
49 }
50 bool res = parcel.ReadUint32(windowVisibilityInfo->windowId_) && parcel.ReadInt32(windowVisibilityInfo->pid_) &&
51 parcel.ReadInt32(windowVisibilityInfo->uid_) && parcel.ReadBool(windowVisibilityInfo->isVisible_);
52 if (!res) {
53 delete windowVisibilityInfo;
54 return nullptr;
55 }
56 windowVisibilityInfo->windowType_ = static_cast<WindowType>(parcel.ReadUint32());
57 return windowVisibilityInfo;
58 }
59
Marshalling(Parcel & parcel) const60 bool AccessibilityWindowInfo::Marshalling(Parcel &parcel) const
61 {
62 return parcel.WriteInt32(wid_) && parcel.WriteUint32(windowRect_.width_) &&
63 parcel.WriteUint32(windowRect_.height_) && parcel.WriteInt32(windowRect_.posX_) &&
64 parcel.WriteInt32(windowRect_.posY_) && parcel.WriteBool(focused_) && parcel.WriteBool(isDecorEnable_) &&
65 parcel.WriteUint64(displayId_) && parcel.WriteUint32(layer_) &&
66 parcel.WriteUint32(static_cast<uint32_t>(mode_)) && parcel.WriteUint32(static_cast<uint32_t>(type_));
67 }
68
Unmarshalling(Parcel & parcel)69 AccessibilityWindowInfo* AccessibilityWindowInfo::Unmarshalling(Parcel &parcel)
70 {
71 auto info = new (std::nothrow) AccessibilityWindowInfo();
72 if (info == nullptr) {
73 WLOGFE("accessibility window info is nullptr.");
74 return nullptr;
75 }
76 bool res = parcel.ReadInt32(info->wid_) && parcel.ReadUint32(info->windowRect_.width_) &&
77 parcel.ReadUint32(info->windowRect_.height_) && parcel.ReadInt32(info->windowRect_.posX_) &&
78 parcel.ReadInt32(info->windowRect_.posY_) && parcel.ReadBool(info->focused_) &&
79 parcel.ReadBool(info->isDecorEnable_) && parcel.ReadUint64(info->displayId_) &&
80 parcel.ReadUint32(info->layer_);
81 if (!res) {
82 delete info;
83 return nullptr;
84 }
85 info->mode_ = static_cast<WindowMode>(parcel.ReadUint32());
86 info->type_ = static_cast<WindowType>(parcel.ReadUint32());
87 return info;
88 }
89
Marshalling(Parcel & parcel) const90 bool FocusChangeInfo::Marshalling(Parcel &parcel) const
91 {
92 return parcel.WriteUint32(windowId_) && parcel.WriteUint64(displayId_) &&
93 parcel.WriteInt32(pid_) && parcel.WriteInt32(uid_) &&
94 parcel.WriteUint32(static_cast<uint32_t>(windowType_));
95 }
96
Unmarshalling(Parcel & parcel)97 FocusChangeInfo* FocusChangeInfo::Unmarshalling(Parcel &parcel)
98 {
99 auto focusChangeInfo = new FocusChangeInfo();
100 bool res = parcel.ReadUint32(focusChangeInfo->windowId_) && parcel.ReadUint64(focusChangeInfo->displayId_) &&
101 parcel.ReadInt32(focusChangeInfo->pid_) && parcel.ReadInt32(focusChangeInfo->uid_);
102 if (!res) {
103 delete focusChangeInfo;
104 return nullptr;
105 }
106 focusChangeInfo->windowType_ = static_cast<WindowType>(parcel.ReadUint32());
107 return focusChangeInfo;
108 }
109
110 WM_IMPLEMENT_SINGLE_INSTANCE(WindowManager)
111
112 class WindowManager::Impl {
113 public:
114 void NotifyFocused(uint32_t windowId, const sptr<IRemoteObject>& abilityToken,
115 WindowType windowType, DisplayId displayId);
116 void NotifyUnfocused(uint32_t windowId, const sptr<IRemoteObject>& abilityToken,
117 WindowType windowType, DisplayId displayId);
118 void NotifyFocused(const sptr<FocusChangeInfo>& focusChangeInfo);
119 void NotifyUnfocused(const sptr<FocusChangeInfo>& focusChangeInfo);
120 void NotifySystemBarChanged(DisplayId displayId, const SystemBarRegionTints& tints);
121 void NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>>& infos, WindowUpdateType type);
122 void NotifyWindowVisibilityInfoChanged(const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos);
123 void UpdateCameraFloatWindowStatus(uint32_t accessTokenId, bool isShowing);
124 static inline SingletonDelegator<WindowManager> delegator_;
125
126 std::recursive_mutex mutex_;
127 std::vector<sptr<IFocusChangedListener>> focusChangedListeners_;
128 sptr<WindowManagerAgent> focusChangedListenerAgent_;
129 std::vector<sptr<ISystemBarChangedListener>> systemBarChangedListeners_;
130 sptr<WindowManagerAgent> systemBarChangedListenerAgent_;
131 std::vector<sptr<IWindowUpdateListener>> windowUpdateListeners_;
132 sptr<WindowManagerAgent> windowUpdateListenerAgent_;
133 std::vector<sptr<IVisibilityChangedListener>> windowVisibilityListeners_;
134 sptr<WindowManagerAgent> windowVisibilityListenerAgent_;
135 std::vector<sptr<ICameraFloatWindowChangedListener>> cameraFloatWindowChangedListeners_;
136 sptr<WindowManagerAgent> cameraFloatWindowChangedListenerAgent_;
137 };
138
NotifyFocused(const sptr<FocusChangeInfo> & focusChangeInfo)139 void WindowManager::Impl::NotifyFocused(const sptr<FocusChangeInfo>& focusChangeInfo)
140 {
141 WLOGFD("NotifyFocused [%{public}u; %{public}" PRIu64"; %{public}d; %{public}d; %{public}u; %{public}p]",
142 focusChangeInfo->windowId_, focusChangeInfo->displayId_, focusChangeInfo->pid_, focusChangeInfo->uid_,
143 static_cast<uint32_t>(focusChangeInfo->windowType_), focusChangeInfo->abilityToken_.GetRefPtr());
144 std::vector<sptr<IFocusChangedListener>> focusChangeListeners;
145 {
146 std::lock_guard<std::recursive_mutex> lock(mutex_);
147 focusChangeListeners = focusChangedListeners_;
148 }
149 for (auto& listener : focusChangeListeners) {
150 listener->OnFocused(focusChangeInfo);
151 }
152 }
153
NotifyUnfocused(const sptr<FocusChangeInfo> & focusChangeInfo)154 void WindowManager::Impl::NotifyUnfocused(const sptr<FocusChangeInfo>& focusChangeInfo)
155 {
156 WLOGFD("NotifyUnfocused [%{public}u; %{public}" PRIu64"; %{public}d; %{public}d; %{public}u; %{public}p]",
157 focusChangeInfo->windowId_, focusChangeInfo->displayId_, focusChangeInfo->pid_, focusChangeInfo->uid_,
158 static_cast<uint32_t>(focusChangeInfo->windowType_), focusChangeInfo->abilityToken_.GetRefPtr());
159 std::vector<sptr<IFocusChangedListener>> focusChangeListeners;
160 {
161 std::lock_guard<std::recursive_mutex> lock(mutex_);
162 focusChangeListeners = focusChangedListeners_;
163 }
164 for (auto& listener : focusChangeListeners) {
165 listener->OnUnfocused(focusChangeInfo);
166 }
167 }
168
NotifySystemBarChanged(DisplayId displayId,const SystemBarRegionTints & tints)169 void WindowManager::Impl::NotifySystemBarChanged(DisplayId displayId, const SystemBarRegionTints& tints)
170 {
171 for (auto tint : tints) {
172 WLOGFD("type:%{public}d, enable:%{public}d," \
173 "backgroundColor:%{public}x, contentColor:%{public}x " \
174 "region:[%{public}d, %{public}d, %{public}d, %{public}d]",
175 tint.type_, tint.prop_.enable_, tint.prop_.backgroundColor_, tint.prop_.contentColor_,
176 tint.region_.posX_, tint.region_.posY_, tint.region_.width_, tint.region_.height_);
177 }
178 std::vector<sptr<ISystemBarChangedListener>> systemBarChangeListeners;
179 {
180 std::lock_guard<std::recursive_mutex> lock(mutex_);
181 systemBarChangeListeners = systemBarChangedListeners_;
182 }
183 for (auto& listener : systemBarChangeListeners) {
184 listener->OnSystemBarPropertyChange(displayId, tints);
185 }
186 }
187
NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>> & infos,WindowUpdateType type)188 void WindowManager::Impl::NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>>& infos,
189 WindowUpdateType type)
190 {
191 if (infos.empty()) {
192 WLOGFE("infos is empty");
193 return;
194 }
195 for (auto& info : infos) {
196 WLOGFD("NotifyAccessibilityWindowInfo: wid[%{public}u], rect[%{public}d %{public}d %{public}d %{public}d]," \
197 "isFocused[%{public}d], isDecorEnable[%{public}d], displayId[%{public}" PRIu64"], layer[%{public}u]," \
198 "mode[%{public}u], type[%{public}u, updateType[%{public}d]",
199 info->wid_, info->windowRect_.width_, info->windowRect_.height_, info->windowRect_.posX_,
200 info->windowRect_.posY_, info->focused_, info->isDecorEnable_, info->displayId_, info->layer_,
201 info->mode_, info->type_, type);
202 }
203
204 std::vector<sptr<IWindowUpdateListener>> windowUpdateListeners;
205 {
206 std::lock_guard<std::recursive_mutex> lock(mutex_);
207 windowUpdateListeners = windowUpdateListeners_;
208 }
209 for (auto& listener : windowUpdateListeners) {
210 listener->OnWindowUpdate(infos, type);
211 }
212 }
213
NotifyWindowVisibilityInfoChanged(const std::vector<sptr<WindowVisibilityInfo>> & windowVisibilityInfos)214 void WindowManager::Impl::NotifyWindowVisibilityInfoChanged(
215 const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos)
216 {
217 std::vector<sptr<IVisibilityChangedListener>> visibilityChangeListeners;
218 {
219 std::lock_guard<std::recursive_mutex> lock(mutex_);
220 visibilityChangeListeners = windowVisibilityListeners_;
221 }
222 for (auto& listener : visibilityChangeListeners) {
223 listener->OnWindowVisibilityChanged(windowVisibilityInfos);
224 }
225 }
226
UpdateCameraFloatWindowStatus(uint32_t accessTokenId,bool isShowing)227 void WindowManager::Impl::UpdateCameraFloatWindowStatus(uint32_t accessTokenId, bool isShowing)
228 {
229 WLOGFD("Camera float window, accessTokenId = %{public}u, isShowing = %{public}u", accessTokenId, isShowing);
230 std::vector<sptr<ICameraFloatWindowChangedListener>> cameraFloatWindowChangeListeners;
231 {
232 std::lock_guard<std::recursive_mutex> lock(mutex_);
233 cameraFloatWindowChangeListeners = cameraFloatWindowChangedListeners_;
234 }
235 for (auto& listener : cameraFloatWindowChangeListeners) {
236 listener->OnCameraFloatWindowChange(accessTokenId, isShowing);
237 }
238 }
239
WindowManager()240 WindowManager::WindowManager() : pImpl_(std::make_unique<Impl>()) {}
241
RegisterFocusChangedListener(const sptr<IFocusChangedListener> & listener)242 bool WindowManager::RegisterFocusChangedListener(const sptr<IFocusChangedListener>& listener)
243 {
244 if (listener == nullptr) {
245 WLOGFE("listener could not be null");
246 return false;
247 }
248
249 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
250 bool ret = true;
251 if (pImpl_->focusChangedListenerAgent_ == nullptr) {
252 pImpl_->focusChangedListenerAgent_ = new WindowManagerAgent();
253 ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
254 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_FOCUS, pImpl_->focusChangedListenerAgent_);
255 }
256 if (!ret) {
257 WLOGFW("RegisterWindowManagerAgent failed !");
258 pImpl_->focusChangedListenerAgent_ = nullptr;
259 } else {
260 auto iter = std::find(pImpl_->focusChangedListeners_.begin(), pImpl_->focusChangedListeners_.end(), listener);
261 if (iter != pImpl_->focusChangedListeners_.end()) {
262 WLOGFW("Listener is already registered.");
263 return true;
264 }
265 pImpl_->focusChangedListeners_.push_back(listener);
266 }
267 return ret;
268 }
269
UnregisterFocusChangedListener(const sptr<IFocusChangedListener> & listener)270 bool WindowManager::UnregisterFocusChangedListener(const sptr<IFocusChangedListener>& listener)
271 {
272 if (listener == nullptr) {
273 WLOGFE("listener could not be null");
274 return false;
275 }
276
277 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
278 auto iter = std::find(pImpl_->focusChangedListeners_.begin(), pImpl_->focusChangedListeners_.end(), listener);
279 if (iter == pImpl_->focusChangedListeners_.end()) {
280 WLOGFE("could not find this listener");
281 return true;
282 }
283 pImpl_->focusChangedListeners_.erase(iter);
284 bool ret = true;
285 if (pImpl_->focusChangedListeners_.empty() && pImpl_->focusChangedListenerAgent_ != nullptr) {
286 ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
287 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_FOCUS, pImpl_->focusChangedListenerAgent_);
288 pImpl_->focusChangedListenerAgent_ = nullptr;
289 }
290 return ret;
291 }
292
RegisterSystemBarChangedListener(const sptr<ISystemBarChangedListener> & listener)293 bool WindowManager::RegisterSystemBarChangedListener(const sptr<ISystemBarChangedListener>& listener)
294 {
295 if (listener == nullptr) {
296 WLOGFE("listener could not be null");
297 return false;
298 }
299
300 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
301 bool ret = true;
302 if (pImpl_->systemBarChangedListenerAgent_ == nullptr) {
303 pImpl_->systemBarChangedListenerAgent_ = new WindowManagerAgent();
304 ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
305 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_SYSTEM_BAR, pImpl_->systemBarChangedListenerAgent_);
306 }
307 if (!ret) {
308 WLOGFW("RegisterWindowManagerAgent failed !");
309 pImpl_->systemBarChangedListenerAgent_ = nullptr;
310 } else {
311 auto iter = std::find(pImpl_->systemBarChangedListeners_.begin(), pImpl_->systemBarChangedListeners_.end(),
312 listener);
313 if (iter != pImpl_->systemBarChangedListeners_.end()) {
314 WLOGFW("Listener is already registered.");
315 return true;
316 }
317 pImpl_->systemBarChangedListeners_.push_back(listener);
318 }
319 return ret;
320 }
321
UnregisterSystemBarChangedListener(const sptr<ISystemBarChangedListener> & listener)322 bool WindowManager::UnregisterSystemBarChangedListener(const sptr<ISystemBarChangedListener>& listener)
323 {
324 if (listener == nullptr) {
325 WLOGFE("listener could not be null");
326 return false;
327 }
328
329 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
330 auto iter = std::find(pImpl_->systemBarChangedListeners_.begin(), pImpl_->systemBarChangedListeners_.end(),
331 listener);
332 if (iter == pImpl_->systemBarChangedListeners_.end()) {
333 WLOGFE("could not find this listener");
334 return true;
335 }
336 pImpl_->systemBarChangedListeners_.erase(iter);
337 bool ret = true;
338 if (pImpl_->systemBarChangedListeners_.empty() && pImpl_->systemBarChangedListenerAgent_ != nullptr) {
339 ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
340 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_SYSTEM_BAR, pImpl_->systemBarChangedListenerAgent_);
341 pImpl_->systemBarChangedListenerAgent_ = nullptr;
342 }
343 return ret;
344 }
345
MinimizeAllAppWindows(DisplayId displayId)346 void WindowManager::MinimizeAllAppWindows(DisplayId displayId)
347 {
348 WLOGFD("displayId %{public}" PRIu64"", displayId);
349 SingletonContainer::Get<WindowAdapter>().MinimizeAllAppWindows(displayId);
350 }
351
ToggleShownStateForAllAppWindows()352 WMError WindowManager::ToggleShownStateForAllAppWindows()
353 {
354 WLOGFD("ToggleShownStateForAllAppWindows");
355 return SingletonContainer::Get<WindowAdapter>().ToggleShownStateForAllAppWindows();
356 }
357
SetWindowLayoutMode(WindowLayoutMode mode)358 WMError WindowManager::SetWindowLayoutMode(WindowLayoutMode mode)
359 {
360 WLOGFD("set window layout mode: %{public}u", mode);
361 WMError ret = SingletonContainer::Get<WindowAdapter>().SetWindowLayoutMode(mode);
362 if (ret != WMError::WM_OK) {
363 WLOGFE("set layout mode failed");
364 }
365 return ret;
366 }
367
RegisterWindowUpdateListener(const sptr<IWindowUpdateListener> & listener)368 bool WindowManager::RegisterWindowUpdateListener(const sptr<IWindowUpdateListener> &listener)
369 {
370 if (listener == nullptr) {
371 WLOGFE("listener could not be null");
372 return false;
373 }
374 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
375 bool ret = true;
376 if (pImpl_->windowUpdateListenerAgent_ == nullptr) {
377 pImpl_->windowUpdateListenerAgent_ = new WindowManagerAgent();
378 ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
379 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_UPDATE, pImpl_->windowUpdateListenerAgent_);
380 }
381 if (!ret) {
382 WLOGFW("RegisterWindowManagerAgent failed !");
383 pImpl_->windowUpdateListenerAgent_ = nullptr;
384 } else {
385 auto iter = std::find(pImpl_->windowUpdateListeners_.begin(), pImpl_->windowUpdateListeners_.end(), listener);
386 if (iter != pImpl_->windowUpdateListeners_.end()) {
387 WLOGFI("Listener is already registered.");
388 return true;
389 }
390 pImpl_->windowUpdateListeners_.emplace_back(listener);
391 }
392 return ret;
393 }
394
UnregisterWindowUpdateListener(const sptr<IWindowUpdateListener> & listener)395 bool WindowManager::UnregisterWindowUpdateListener(const sptr<IWindowUpdateListener>& listener)
396 {
397 if (listener == nullptr) {
398 WLOGFE("listener could not be null");
399 return false;
400 }
401 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
402 auto iter = std::find(pImpl_->windowUpdateListeners_.begin(), pImpl_->windowUpdateListeners_.end(), listener);
403 if (iter == pImpl_->windowUpdateListeners_.end()) {
404 WLOGFE("could not find this listener");
405 return true;
406 }
407 pImpl_->windowUpdateListeners_.erase(iter);
408 bool ret = true;
409 if (pImpl_->windowUpdateListeners_.empty() && pImpl_->windowUpdateListenerAgent_ != nullptr) {
410 ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
411 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_UPDATE, pImpl_->windowUpdateListenerAgent_);
412 pImpl_->windowUpdateListenerAgent_ = nullptr;
413 }
414 return ret;
415 }
416
RegisterVisibilityChangedListener(const sptr<IVisibilityChangedListener> & listener)417 bool WindowManager::RegisterVisibilityChangedListener(const sptr<IVisibilityChangedListener>& listener)
418 {
419 if (listener == nullptr) {
420 WLOGFE("listener could not be null");
421 return false;
422 }
423 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
424 bool ret = true;
425 if (pImpl_->windowVisibilityListenerAgent_ == nullptr) {
426 pImpl_->windowVisibilityListenerAgent_ = new WindowManagerAgent();
427 ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
428 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_VISIBILITY,
429 pImpl_->windowVisibilityListenerAgent_);
430 }
431 if (!ret) {
432 WLOGFW("RegisterWindowManagerAgent failed !");
433 pImpl_->windowVisibilityListenerAgent_ = nullptr;
434 } else {
435 auto iter = std::find(pImpl_->windowVisibilityListeners_.begin(), pImpl_->windowVisibilityListeners_.end(),
436 listener);
437 if (iter != pImpl_->windowVisibilityListeners_.end()) {
438 WLOGFW("Listener is already registered.");
439 return true;
440 }
441 pImpl_->windowVisibilityListeners_.emplace_back(listener);
442 }
443 return ret;
444 }
445
UnregisterVisibilityChangedListener(const sptr<IVisibilityChangedListener> & listener)446 bool WindowManager::UnregisterVisibilityChangedListener(const sptr<IVisibilityChangedListener>& listener)
447 {
448 if (listener == nullptr) {
449 WLOGFE("listener could not be null");
450 return false;
451 }
452 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
453 pImpl_->windowVisibilityListeners_.erase(std::remove_if(pImpl_->windowVisibilityListeners_.begin(),
454 pImpl_->windowVisibilityListeners_.end(), [listener](sptr<IVisibilityChangedListener> registeredListener) {
455 return registeredListener == listener;
456 }), pImpl_->windowVisibilityListeners_.end());
457
458 bool ret = true;
459 if (pImpl_->windowVisibilityListeners_.empty() && pImpl_->windowVisibilityListenerAgent_ != nullptr) {
460 ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
461 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_WINDOW_VISIBILITY,
462 pImpl_->windowVisibilityListenerAgent_);
463 pImpl_->windowVisibilityListenerAgent_ = nullptr;
464 }
465 return ret;
466 }
467
RegisterCameraFloatWindowChangedListener(const sptr<ICameraFloatWindowChangedListener> & listener)468 bool WindowManager::RegisterCameraFloatWindowChangedListener(const sptr<ICameraFloatWindowChangedListener>& listener)
469 {
470 if (listener == nullptr) {
471 WLOGFE("listener could not be null");
472 return false;
473 }
474
475 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
476 bool ret = true;
477 if (pImpl_->cameraFloatWindowChangedListenerAgent_ == nullptr) {
478 pImpl_->cameraFloatWindowChangedListenerAgent_ = new WindowManagerAgent();
479 ret = SingletonContainer::Get<WindowAdapter>().RegisterWindowManagerAgent(
480 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_CAMERA_FLOAT,
481 pImpl_->cameraFloatWindowChangedListenerAgent_);
482 }
483 if (!ret) {
484 WLOGFW("RegisterWindowManagerAgent failed !");
485 pImpl_->cameraFloatWindowChangedListenerAgent_ = nullptr;
486 } else {
487 auto iter = std::find(pImpl_->cameraFloatWindowChangedListeners_.begin(),
488 pImpl_->cameraFloatWindowChangedListeners_.end(), listener);
489 if (iter != pImpl_->cameraFloatWindowChangedListeners_.end()) {
490 WLOGFW("Listener is already registered.");
491 return true;
492 }
493 pImpl_->cameraFloatWindowChangedListeners_.push_back(listener);
494 }
495 return ret;
496 }
497
UnregisterCameraFloatWindowChangedListener(const sptr<ICameraFloatWindowChangedListener> & listener)498 bool WindowManager::UnregisterCameraFloatWindowChangedListener(const sptr<ICameraFloatWindowChangedListener>& listener)
499 {
500 if (listener == nullptr) {
501 WLOGFE("listener could not be null");
502 return false;
503 }
504
505 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
506 auto iter = std::find(pImpl_->cameraFloatWindowChangedListeners_.begin(),
507 pImpl_->cameraFloatWindowChangedListeners_.end(), listener);
508 if (iter == pImpl_->cameraFloatWindowChangedListeners_.end()) {
509 WLOGFE("could not find this listener");
510 return true;
511 }
512 pImpl_->cameraFloatWindowChangedListeners_.erase(iter);
513 bool ret = true;
514 if (pImpl_->cameraFloatWindowChangedListeners_.empty() &&
515 pImpl_->cameraFloatWindowChangedListenerAgent_ != nullptr) {
516 ret = SingletonContainer::Get<WindowAdapter>().UnregisterWindowManagerAgent(
517 WindowManagerAgentType::WINDOW_MANAGER_AGENT_TYPE_CAMERA_FLOAT,
518 pImpl_->cameraFloatWindowChangedListenerAgent_);
519 pImpl_->cameraFloatWindowChangedListenerAgent_ = nullptr;
520 }
521 return ret;
522 }
523
UpdateFocusChangeInfo(const sptr<FocusChangeInfo> & focusChangeInfo,bool focused) const524 void WindowManager::UpdateFocusChangeInfo(const sptr<FocusChangeInfo>& focusChangeInfo, bool focused) const
525 {
526 if (focusChangeInfo == nullptr) {
527 WLOGFE("focusChangeInfo is nullptr.");
528 return;
529 }
530 WLOGFD("window focus change: %{public}d, id: %{public}u", focused, focusChangeInfo->windowId_);
531 if (focused) {
532 #ifdef EFFICIENCY_MANAGER_ENABLE
533 SuspendManager::SuspendManagerClient::GetInstance().ThawOneApplication(focusChangeInfo->uid_,
534 "", "THAW_BY_FOCUS_CHANGED");
535 #endif // EFFICIENCY_MANAGER_ENABLE
536 pImpl_->NotifyFocused(focusChangeInfo);
537 } else {
538 pImpl_->NotifyUnfocused(focusChangeInfo);
539 }
540 }
541
UpdateSystemBarRegionTints(DisplayId displayId,const SystemBarRegionTints & tints) const542 void WindowManager::UpdateSystemBarRegionTints(DisplayId displayId,
543 const SystemBarRegionTints& tints) const
544 {
545 pImpl_->NotifySystemBarChanged(displayId, tints);
546 }
547
NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>> & infos,WindowUpdateType type) const548 void WindowManager::NotifyAccessibilityWindowInfo(const std::vector<sptr<AccessibilityWindowInfo>>& infos,
549 WindowUpdateType type) const
550 {
551 pImpl_->NotifyAccessibilityWindowInfo(infos, type);
552 }
553
UpdateWindowVisibilityInfo(const std::vector<sptr<WindowVisibilityInfo>> & windowVisibilityInfos) const554 void WindowManager::UpdateWindowVisibilityInfo(
555 const std::vector<sptr<WindowVisibilityInfo>>& windowVisibilityInfos) const
556 {
557 pImpl_->NotifyWindowVisibilityInfoChanged(windowVisibilityInfos);
558 }
559
GetAccessibilityWindowInfo(std::vector<sptr<AccessibilityWindowInfo>> & infos) const560 WMError WindowManager::GetAccessibilityWindowInfo(std::vector<sptr<AccessibilityWindowInfo>>& infos) const
561 {
562 WMError ret = SingletonContainer::Get<WindowAdapter>().GetAccessibilityWindowInfo(infos);
563 if (ret != WMError::WM_OK) {
564 WLOGFE("get window info failed");
565 }
566 return ret;
567 }
568
GetVisibilityWindowInfo(std::vector<sptr<WindowVisibilityInfo>> & infos) const569 WMError WindowManager::GetVisibilityWindowInfo(std::vector<sptr<WindowVisibilityInfo>>& infos) const
570 {
571 WMError ret = SingletonContainer::Get<WindowAdapter>().GetVisibilityWindowInfo(infos);
572 if (ret != WMError::WM_OK) {
573 WLOGFE("get window visibility info failed");
574 }
575 return ret;
576 }
577
UpdateCameraFloatWindowStatus(uint32_t accessTokenId,bool isShowing) const578 void WindowManager::UpdateCameraFloatWindowStatus(uint32_t accessTokenId, bool isShowing) const
579 {
580 pImpl_->UpdateCameraFloatWindowStatus(accessTokenId, isShowing);
581 }
582
OnRemoteDied() const583 void WindowManager::OnRemoteDied() const
584 {
585 WLOGFI("wms is died");
586 std::lock_guard<std::recursive_mutex> lock(pImpl_->mutex_);
587 pImpl_->focusChangedListenerAgent_ = nullptr;
588 pImpl_->systemBarChangedListenerAgent_ = nullptr;
589 pImpl_->windowUpdateListenerAgent_ = nullptr;
590 pImpl_->windowVisibilityListenerAgent_ = nullptr;
591 pImpl_->cameraFloatWindowChangedListenerAgent_ = nullptr;
592 }
593 } // namespace Rosen
594 } // namespace OHOS
595