1/*
2 * Copyright (c) 2022-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#ifndef OHOS_JS_WINDOW_REGISTER_MANAGER_H
16#define OHOS_JS_WINDOW_REGISTER_MANAGER_H
17#include <map>
18#include <mutex>
19#include "js_window_listener.h"
20#include "native_engine/native_engine.h"
21#include "native_engine/native_reference.h"
22#include "native_engine/native_value.h"
23#include "refbase.h"
24#include "window.h"
25namespace OHOS {
26namespace Rosen {
27enum class CaseType {
28    CASE_WINDOW_MANAGER = 0,
29    CASE_WINDOW,
30    CASE_STAGE
31};
32
33enum class ListenerFunctionType : uint32_t {
34    SYSTEM_AVOID_AREA_CHANGE_CB,
35    AVOID_AREA_CHANGE_CB,
36};
37
38class JsWindowRegisterManager {
39public:
40    JsWindowRegisterManager();
41    ~JsWindowRegisterManager();
42    WmErrorCode RegisterListener(sptr<Window> window, std::string type,
43        CaseType caseType, napi_env env, napi_value callback, napi_value parameter = nullptr);
44    WmErrorCode UnregisterListener(sptr<Window> window, std::string type,
45        CaseType caseType, napi_env env, napi_value value);
46
47private:
48    bool IsCallbackRegistered(napi_env env, std::string& type, napi_value jsListenerObject);
49    WmErrorCode ProcessSystemAvoidAreaChangeRegister(sptr<JsWindowListener> listener, sptr<Window> window,
50        bool isRegister, napi_env env, napi_value parameter = nullptr);
51    WmErrorCode ProcessAvoidAreaChangeRegister(sptr<JsWindowListener> listener, sptr<Window> window, bool isRegister,
52        napi_env env, napi_value parameter = nullptr);
53    WmErrorCode ProcessRegisterCallback(ListenerFunctionType listenerFunctionType, CaseType caseType,
54        const sptr<JsWindowListener>& listener, const sptr<Window>& window, bool isRegister, napi_env env,
55        napi_value parameter);
56    std::map<std::string, std::map<std::shared_ptr<NativeReference>, sptr<JsWindowListener>>> jsCbMap_;
57    std::mutex mtx_;
58};
59} // namespace Rosen
60} // namespace OHOS
61#endif // OHOS_JS_WINDOW_REGISTER_MANAGER_H