• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "window_manager.h"
17 
18 #include <algorithm>
19 #include <cinttypes>
20 
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