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