• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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_register_manager.h"
17 #include <cstdint>
18 #include <transaction/rs_interfaces.h>
19 #include "window_manager_hilog.h"
20 
21 namespace OHOS {
22 namespace Rosen {
CjWindowRegisterManager()23 CjWindowRegisterManager::CjWindowRegisterManager()
24 {
25     InitWindowManagerListeners();
26     InitWindowListeners();
27     InitStageListeners();
28 }
29 
InitWindowManagerListeners()30 void CjWindowRegisterManager::InitWindowManagerListeners()
31 {
32     listenerProcess_[CaseType::CASE_WINDOW_MANAGER] = {
33         {SYSTEM_BAR_TINT_CHANGE_CB, [this](sptr<CjWindowListener> listener,
34             sptr<Window> window, const RegListenerInfo& info)
35             {return this->ProcessSystemBarChangeRegister(listener, window, info); } },
36         {GESTURE_NAVIGATION_ENABLED_CHANGE_CB,
37             [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
38             {return this->ProcessGestureNavigationEnabledChangeRegister(listener, window, info); } },
39         {WATER_MARK_FLAG_CHANGE_CB, [this](sptr<CjWindowListener> listener, sptr<Window> window,
40             const RegListenerInfo& info)
41             {return this->ProcessWaterMarkFlagChangeRegister(listener, window, info); } },
42     };
43 }
44 
InitWindowListeners()45 void CjWindowRegisterManager::InitWindowListeners()
46 {
47     listenerProcess_[CaseType::CASE_WINDOW] = {
48         {WINDOW_SIZE_CHANGE_CB,
49             [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
50             {return this->ProcessWindowChangeRegister(listener, window, info); } },
51         {SYSTEM_AVOID_AREA_CHANGE_CB,
52             [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
53             {return this->ProcessSystemAvoidAreaChangeRegister(listener, window, info); } },
54         {AVOID_AREA_CHANGE_CB,
55             [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
56             {return this->ProcessAvoidAreaChangeRegister(listener, window, info); } },
57         {LIFECYCLE_EVENT_CB, [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
58             {return this->ProcessLifeCycleEventRegister(listener, window, info); } },
59         {WINDOW_EVENT_CB, [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
60             {return this->ProcessLifeCycleEventRegister(listener, window, info); } },
61         {KEYBOARD_HEIGHT_CHANGE_CB,
62             [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
63             {return this->ProcessOccupiedAreaChangeRegister(listener, window, info); } },
64         {TOUCH_OUTSIDE_CB, [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
65             {return this->ProcessTouchOutsideRegister(listener, window, info); } },
66         {SCREENSHOT_EVENT_CB,
67             [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
68             {return this->ProcessScreenshotRegister(listener, window, info); } },
69         {DIALOG_TARGET_TOUCH_CB,
70             [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
71             {return this->ProcessDialogTargetTouchRegister(listener, window, info); } },
72         {DIALOG_DEATH_RECIPIENT_CB,
73             [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
74             {return this->ProcessDialogDeathRecipientRegister(listener, window, info); } },
75         {WINDOW_STATUS_CHANGE_CB,
76             [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
77             {return this->ProcessWindowStatusChangeRegister(listener, window, info); } },
78         {WINDOW_TITLE_BUTTON_RECT_CHANGE_CB,
79             [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
80             {return this->ProcessWindowTitleButtonRectChangeRegister(listener, window, info); } },
81         {WINDOW_VISIBILITY_CHANGE_CB,
82             [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
83             {return this->ProcessWindowVisibilityChangeRegister(listener, window, info); } },
84         {WINDOW_SUB_WINDOW_CLOSE_CB,
85             [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
86             {return this->ProcessSubWindowCloseRegister(listener, window, info); } },
87         {WINDOW_RECT_CHANGE_CB,
88             [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
89             {return this->ProcessWindowRectChangeRegister(listener, window, info); } },
90         {WINDOW_NO_INTERACTION_DETECTED_CB,
91             [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
92             {return this->ProcessNoInteractionDetectedRegister(listener, window, info); } },
93     };
94 }
95 
InitStageListeners()96 void CjWindowRegisterManager::InitStageListeners()
97 {
98     listenerProcess_[CaseType::CASE_STAGE] = {
99         {WINDOW_STAGE_EVENT_CB,
100             [this](sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
101             {return this->ProcessLifeCycleEventRegister(listener, window, info); } },
102     };
103 }
104 
ProcessSystemBarChangeRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)105 WmErrorCode CjWindowRegisterManager::ProcessSystemBarChangeRegister(
106     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
107 {
108     return WmErrorCode::WM_OK;
109 }
110 
ProcessGestureNavigationEnabledChangeRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)111 WmErrorCode CjWindowRegisterManager::ProcessGestureNavigationEnabledChangeRegister(
112     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
113 {
114     return WmErrorCode::WM_OK;
115 }
116 
ProcessWaterMarkFlagChangeRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)117 WmErrorCode CjWindowRegisterManager::ProcessWaterMarkFlagChangeRegister(
118     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
119 {
120     return WmErrorCode::WM_OK;
121 }
122 
ProcessWindowChangeRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)123 WmErrorCode CjWindowRegisterManager::ProcessWindowChangeRegister(
124     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
125 {
126     if (window == nullptr) {
127         TLOGE(WmsLogTag::DEFAULT, "[WindowRegister] window is nullptr");
128         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
129     }
130     sptr<IWindowChangeListener> thisListener(listener);
131     WmErrorCode ret;
132     if (info.isRegister) {
133         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->RegisterWindowChangeListener(thisListener));
134     } else {
135         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->UnregisterWindowChangeListener(thisListener));
136     }
137     return ret;
138 }
139 
ProcessSystemAvoidAreaChangeRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)140 WmErrorCode CjWindowRegisterManager::ProcessSystemAvoidAreaChangeRegister(
141     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
142 {
143     return WmErrorCode::WM_OK;
144 }
145 
ProcessAvoidAreaChangeRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)146 WmErrorCode CjWindowRegisterManager::ProcessAvoidAreaChangeRegister(
147     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
148 {
149     if (window == nullptr) {
150         TLOGE(WmsLogTag::DEFAULT, "[WindowRegister] window is nullptr");
151         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
152     }
153     sptr<IAvoidAreaChangedListener> thisListener(listener);
154     WmErrorCode ret;
155     if (info.isRegister) {
156         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->RegisterAvoidAreaChangeListener(thisListener));
157     } else {
158         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->UnregisterAvoidAreaChangeListener(thisListener));
159     }
160     return ret;
161 }
162 
ProcessLifeCycleEventRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)163 WmErrorCode CjWindowRegisterManager::ProcessLifeCycleEventRegister(
164     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
165 {
166     if (window == nullptr) {
167         TLOGE(WmsLogTag::WMS_SUB, "[WindowRegister] window is nullptr");
168         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
169     }
170     sptr<IWindowLifeCycle> thisListener(listener);
171     WmErrorCode ret;
172     if (info.isRegister) {
173         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->RegisterLifeCycleListener(thisListener));
174     } else {
175         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->UnregisterLifeCycleListener(thisListener));
176     }
177     return ret;
178 }
179 
ProcessOccupiedAreaChangeRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)180 WmErrorCode CjWindowRegisterManager::ProcessOccupiedAreaChangeRegister(
181     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
182 {
183     if (window == nullptr) {
184         TLOGE(WmsLogTag::WMS_SUB, "[WindowRegister] window is nullptr");
185         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
186     }
187     sptr<IOccupiedAreaChangeListener> thisListener(listener);
188     WmErrorCode ret;
189     if (info.isRegister) {
190         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->RegisterOccupiedAreaChangeListener(thisListener));
191     } else {
192         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->UnregisterOccupiedAreaChangeListener(thisListener));
193     }
194     return ret;
195 }
196 
ProcessTouchOutsideRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)197 WmErrorCode CjWindowRegisterManager::ProcessTouchOutsideRegister(
198     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
199 {
200     if (window == nullptr) {
201         TLOGE(WmsLogTag::DEFAULT, "[WindowRegister] window is nullptr");
202         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
203     }
204     sptr<ITouchOutsideListener> thisListener(listener);
205     WmErrorCode ret;
206     if (info.isRegister) {
207         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->RegisterTouchOutsideListener(thisListener));
208     } else {
209         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->UnregisterTouchOutsideListener(thisListener));
210     }
211     return ret;
212 }
213 
ProcessScreenshotRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)214 WmErrorCode CjWindowRegisterManager::ProcessScreenshotRegister(
215     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
216 {
217     if (window == nullptr) {
218         TLOGE(WmsLogTag::DEFAULT, "[WindowRegister] window is nullptr");
219         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
220     }
221     sptr<IScreenshotListener> thisListener(listener);
222     WmErrorCode ret;
223     if (info.isRegister) {
224         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->RegisterScreenshotListener(thisListener));
225     } else {
226         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->UnregisterScreenshotListener(thisListener));
227     }
228     return ret;
229 }
230 
ProcessDialogTargetTouchRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)231 WmErrorCode CjWindowRegisterManager::ProcessDialogTargetTouchRegister(
232     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
233 {
234     if (window == nullptr) {
235         TLOGE(WmsLogTag::WMS_DIALOG, "[WindowRegister] window is nullptr");
236         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
237     }
238     sptr<IDialogTargetTouchListener> thisListener(listener);
239     WmErrorCode ret;
240     if (info.isRegister) {
241         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->RegisterDialogTargetTouchListener(thisListener));
242     } else {
243         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->UnregisterDialogTargetTouchListener(thisListener));
244     }
245     return ret;
246 }
247 
ProcessDialogDeathRecipientRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)248 WmErrorCode CjWindowRegisterManager::ProcessDialogDeathRecipientRegister(
249     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
250 {
251     return WmErrorCode::WM_OK;
252 }
253 
ProcessWindowStatusChangeRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)254 WmErrorCode CjWindowRegisterManager::ProcessWindowStatusChangeRegister(
255     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
256 {
257     if (window == nullptr) {
258         TLOGE(WmsLogTag::DEFAULT, "[WindowRegister] window is nullptr");
259         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
260     }
261     sptr<IWindowStatusChangeListener> thisListener(listener);
262     WmErrorCode ret;
263     if (info.isRegister) {
264         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->RegisterWindowStatusChangeListener(thisListener));
265     } else {
266         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->UnregisterWindowStatusChangeListener(thisListener));
267     }
268     return ret;
269 }
270 
ProcessWindowTitleButtonRectChangeRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)271 WmErrorCode CjWindowRegisterManager::ProcessWindowTitleButtonRectChangeRegister(
272     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
273 {
274     if (window == nullptr) {
275         TLOGE(WmsLogTag::DEFAULT, "[WindowRegister] window is nullptr");
276         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
277     }
278     sptr<IWindowTitleButtonRectChangedListener> thisListener(listener);
279     WmErrorCode ret;
280     if (info.isRegister) {
281         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->RegisterWindowTitleButtonRectChangeListener(thisListener));
282     } else {
283         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->UnregisterWindowTitleButtonRectChangeListener(thisListener));
284     }
285     return ret;
286 }
287 
ProcessWindowVisibilityChangeRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)288 WmErrorCode CjWindowRegisterManager::ProcessWindowVisibilityChangeRegister(
289     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
290 {
291     if (window == nullptr) {
292         TLOGE(WmsLogTag::DEFAULT, "[WindowRegister] window is nullptr");
293         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
294     }
295     sptr<IWindowVisibilityChangedListener> thisListener(listener);
296     WmErrorCode ret;
297     if (info.isRegister) {
298         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->RegisterWindowVisibilityChangeListener(thisListener));
299     } else {
300         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->UnregisterWindowVisibilityChangeListener(thisListener));
301     }
302     return ret;
303 }
304 
ProcessWindowRectChangeRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)305 WmErrorCode CjWindowRegisterManager::ProcessWindowRectChangeRegister(
306     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
307 {
308     if (window == nullptr) {
309         TLOGE(WmsLogTag::DEFAULT, "[WindowRegister] window is nullptr");
310         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
311     }
312     sptr<IWindowRectChangeListener> thisListener(listener);
313     WmErrorCode ret;
314     if (info.isRegister) {
315         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->RegisterWindowRectChangeListener(thisListener));
316     } else {
317         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->UnregisterWindowRectChangeListener(thisListener));
318     }
319     return ret;
320 }
321 
ProcessSubWindowCloseRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)322 WmErrorCode CjWindowRegisterManager::ProcessSubWindowCloseRegister(
323     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
324 {
325     if (window == nullptr) {
326         TLOGE(WmsLogTag::DEFAULT, "[WindowRegister] window is nullptr");
327         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
328     }
329     sptr<ISubWindowCloseListener> thisListener(listener);
330     WmErrorCode ret;
331     if (info.isRegister) {
332         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->RegisterSubWindowCloseListeners(thisListener));
333     } else {
334         ret = WM_JS_TO_ERROR_CODE_MAP.at(window->UnregisterSubWindowCloseListeners(thisListener));
335     }
336     return ret;
337 }
338 
ProcessNoInteractionDetectedRegister(sptr<CjWindowListener> listener,sptr<Window> window,const RegListenerInfo & info)339 WmErrorCode CjWindowRegisterManager::ProcessNoInteractionDetectedRegister(
340     sptr<CjWindowListener> listener, sptr<Window> window, const RegListenerInfo& info)
341 {
342     if (window == nullptr) {
343         TLOGE(WmsLogTag::DEFAULT, "[WindowRegister] window is nullptr");
344         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
345     }
346     sptr<IWindowNoInteractionListener> thisListener(listener);
347     if (!info.isRegister) {
348         return WM_JS_TO_ERROR_CODE_MAP.at(window->UnregisterWindowNoInteractionListener(thisListener));
349     }
350     constexpr int64_t secToMicrosecRatio = 1000;
351     constexpr int64_t noInteractionMax = LLONG_MAX / secToMicrosecRatio;
352     const int64_t timeout = info.parameter;
353     if (timeout <= 0 || (timeout > noInteractionMax)) {
354         TLOGE(WmsLogTag::DEFAULT,
355             "invalid parameter: no-interaction-timeout %{public}" PRId64 " is not in(0s~%{public}" PRId64,
356             timeout, noInteractionMax);
357         return WmErrorCode::WM_ERROR_INVALID_PARAM;
358     }
359     thisListener->SetTimeout(timeout * secToMicrosecRatio);
360     return WM_JS_TO_ERROR_CODE_MAP.at(window->RegisterWindowNoInteractionListener(thisListener));
361 }
362 
IsCallbackRegistered(std::string type,int64_t callbackObject)363 bool CjWindowRegisterManager::IsCallbackRegistered(std::string type, int64_t callbackObject)
364 {
365     if (cjCbMap_.empty() || cjCbMap_.find(type) == cjCbMap_.end()) {
366         TLOGI(WmsLogTag::WMS_SUB, "[WindowRegister]Method %{public}s has not been registerted", type.c_str());
367         return false;
368     }
369 
370     for (auto iter = cjCbMap_[type].begin(); iter != cjCbMap_[type].end(); ++iter) {
371         if (callbackObject == iter->first) {
372             TLOGE(WmsLogTag::WMS_SUB,
373                 "[WindowRegister]Method %{public}s has already been registered", type.c_str());
374             return true;
375         }
376     }
377     return false;
378 }
379 
RegisterListener(sptr<Window> window,std::string type,CaseType caseType,int64_t callbackObject,int64_t parameter)380 WmErrorCode CjWindowRegisterManager::RegisterListener(sptr<Window> window, std::string type,
381     CaseType caseType, int64_t callbackObject, int64_t parameter)
382 {
383     std::lock_guard<std::shared_mutex> lock(mtx_);
384     if (IsCallbackRegistered(type, callbackObject)) {
385         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
386     }
387     if (listenerProcess_[caseType].count(type) == 0) {
388         TLOGE(WmsLogTag::WMS_SUB, "[WindowRegister]Type %{public}s is not supported", type.c_str());
389         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
390     }
391     if (callbackObject == NONE_CALLBACK_OBJECT) {
392         TLOGE(WmsLogTag::WMS_SUB, "[WindowRegister]Invalid callback object %{public}" PRId64, callbackObject);
393         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
394     }
395     sptr<CjWindowListener> windowManagerListener = new(std::nothrow) CjWindowListener(callbackObject, caseType);
396     if (windowManagerListener == nullptr) {
397         TLOGE(WmsLogTag::WMS_SUB, "[WindowRegister]New CjWindowListener failed");
398         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
399     }
400     windowManagerListener->SetMainEventHandler();
401     WmErrorCode ret = listenerProcess_[caseType][type](windowManagerListener, window, {true, parameter});
402     if (ret != WmErrorCode::WM_OK) {
403         TLOGE(WmsLogTag::WMS_SUB, "[WindowRegister]Register type %{public}s failed", type.c_str());
404         return ret;
405     }
406     cjCbMap_[type][callbackObject] = windowManagerListener;
407     TLOGI(WmsLogTag::WMS_SUB, "[WindowRegister]Register type %{public}s success! callback map size: %{public}zu",
408         type.c_str(), cjCbMap_[type].size());
409     return WmErrorCode::WM_OK;
410 }
411 
UnregisterListener(sptr<Window> window,std::string type,CaseType caseType,int64_t callbackObject)412 WmErrorCode CjWindowRegisterManager::UnregisterListener(sptr<Window> window, std::string type,
413     CaseType caseType, int64_t callbackObject)
414 {
415     std::lock_guard<std::shared_mutex> lock(mtx_);
416     if (cjCbMap_.empty() || cjCbMap_.find(type) == cjCbMap_.end()) {
417         TLOGE(WmsLogTag::WMS_SUB, "[WindowRegister]Type %{public}s was not registerted", type.c_str());
418         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
419     }
420     if (listenerProcess_[caseType].count(type) == 0) {
421         TLOGE(WmsLogTag::WMS_SUB, "[WindowRegister]Type %{public}s is not supported", type.c_str());
422         return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
423     }
424     if (callbackObject == NONE_CALLBACK_OBJECT) {
425         for (auto it = cjCbMap_[type].begin(); it != cjCbMap_[type].end();) {
426             WmErrorCode ret = listenerProcess_[caseType][type](it->second, window, {false, 0});
427             if (ret != WmErrorCode::WM_OK) {
428                 TLOGE(WmsLogTag::WMS_SUB,
429                     "[WindowRegister]Unregister type %{public}s failed, no value", type.c_str());
430                 return ret;
431             }
432             cjCbMap_[type].erase(it++);
433         }
434     } else {
435         auto& innerMap = cjCbMap_[type];
436         auto it = innerMap.find(callbackObject);
437         if (it != innerMap.end()) {
438             WmErrorCode ret = listenerProcess_[caseType][type](it->second, window, {false, 0});
439             if (ret != WmErrorCode::WM_OK) {
440                 TLOGE(WmsLogTag::DEFAULT, "[WindowRegister]Unregister type %{public}s failed, ret: %{public}d!",
441                     type.c_str(), static_cast<int32_t>(ret));
442                 return ret;
443             }
444             innerMap.erase(it);
445             return ret;
446         } else {
447             TLOGE(WmsLogTag::DEFAULT,
448                 "[WindowRegister]Unregister type %{public}s failed because not found callback!", type.c_str());
449             return WmErrorCode::WM_ERROR_STATE_ABNORMALLY;
450         }
451     }
452     return WmErrorCode::WM_OK;
453 }
454 }
455 }
456