1 /*
2  * Copyright (c) 2023 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 #ifndef FOUNDATION_ACE_INTERFACES_OBSERVER_H
17 #define FOUNDATION_ACE_INTERFACES_OBSERVER_H
18 
19 #include <list>
20 #include <optional>
21 #include <unordered_map>
22 #include <string>
23 
24 #include "napi/native_api.h"
25 #include "napi/native_common.h"
26 #include "napi/native_node_api.h"
27 
28 #include "ui_observer_listener.h"
29 
30 #include "core/components_ng/base/observer_handler.h"
31 
32 namespace OHOS::Ace::Napi {
33 class UIObserver {
34 public:
35     static void RegisterNavigationCallback(const std::shared_ptr<UIObserverListener>& listener);
36     static void RegisterNavigationCallback(
37         std::string navigationId, const std::shared_ptr<UIObserverListener>& listener);
38     static void UnRegisterNavigationCallback(napi_value cb);
39     static void UnRegisterNavigationCallback(std::string navigationId, napi_value cb);
40     static void HandleNavigationStateChange(const NG::NavDestinationInfo& info);
41 
42     static void RegisterScrollEventCallback(const std::shared_ptr<UIObserverListener>& listener);
43     static void RegisterScrollEventCallback(
44         const std::string& id, const std::shared_ptr<UIObserverListener>& listener);
45     static void UnRegisterScrollEventCallback(napi_value cb);
46     static void UnRegisterScrollEventCallback(const std::string& id, napi_value cb);
47     static void HandleScrollEventStateChange(const std::string& id, int32_t uniqueId,
48         NG::ScrollEventType eventType, float offset);
49 
50     static void RegisterRouterPageCallback(
51         napi_env env, napi_value uiAbilityContext, const std::shared_ptr<UIObserverListener>& listener);
52     static void RegisterRouterPageCallback(
53         int32_t uiContextInstanceId, const std::shared_ptr<UIObserverListener>& listener);
54     static void UnRegisterRouterPageCallback(napi_env env, napi_value uiAbilityContext, napi_value callback);
55     static void UnRegisterRouterPageCallback(int32_t uiContextInstanceId, napi_value callback);
56     static void HandleRouterPageStateChange(NG::AbilityContextInfo& info, const NG::RouterPageInfoNG& pageInfo);
57 
58     static void RegisterDensityCallback(
59         int32_t uiContextInstanceId, const std::shared_ptr<UIObserverListener>& listener);
60     static void UnRegisterDensityCallback(int32_t uiContextInstanceId, napi_value callback);
61     static void HandleDensityChange(NG::AbilityContextInfo& info, double density);
62     static void RegisterDrawCallback(int32_t uiContextInstanceId, const std::shared_ptr<UIObserverListener>& listener);
63     static void UnRegisterDrawCallback(int32_t uiContextInstanceId, napi_value callback);
64     static void RegisterLayoutCallback(
65         int32_t uiContextInstanceId, const std::shared_ptr<UIObserverListener>& listener);
66     static void UnRegisterLayoutCallback(int32_t uiContextInstanceId, napi_value callback);
67     static void HandDrawCommandSendChange();
68     static void HandLayoutDoneChange();
69 
70     static void RegisterNavDestinationSwitchCallback(
71         napi_env env, napi_value uiAbilityContext, const std::optional<std::string>& navigationId,
72         const std::shared_ptr<UIObserverListener>& listener);
73     static void RegisterNavDestinationSwitchCallback(
74         int32_t uiContextInstanceId, const std::optional<std::string>& navigationId,
75         const std::shared_ptr<UIObserverListener>& listener);
76     static void UnRegisterNavDestinationSwitchCallback(napi_env env, napi_value uiAbilityContext,
77         const std::optional<std::string>& navigationId, napi_value callback);
78     static void UnRegisterNavDestinationSwitchCallback(int32_t uiContextInstanceId,
79         const std::optional<std::string>& navigationId, napi_value callback);
80     static void HandleNavDestinationSwitch(
81         const NG::AbilityContextInfo& info, NG::NavDestinationSwitchInfo& switchInfo);
82 
83     static void RegisterWillClickCallback(
84         napi_env env, napi_value uiAbilityContext, const std::shared_ptr<UIObserverListener>& listener);
85     static void RegisterWillClickCallback(
86         int32_t uiContextInstanceId, const std::shared_ptr<UIObserverListener>& listener);
87     static void UnRegisterWillClickCallback(napi_env env, napi_value uiAbilityContext, napi_value callback);
88     static void UnRegisterWillClickCallback(int32_t uiContextInstanceId, napi_value callback);
89     static void HandleWillClick(NG::AbilityContextInfo& info, const GestureEvent& gestureEventInfo,
90         const ClickInfo& clickInfo, const RefPtr<NG::FrameNode>& frameNode);
91 
92     static void RegisterDidClickCallback(
93         napi_env env, napi_value uiAbilityContext, const std::shared_ptr<UIObserverListener>& listener);
94     static void RegisterDidClickCallback(
95         int32_t uiContextInstanceId, const std::shared_ptr<UIObserverListener>& listener);
96     static void UnRegisterDidClickCallback(napi_env env, napi_value uiAbilityContext, napi_value callback);
97     static void UnRegisterDidClickCallback(int32_t uiContextInstanceId, napi_value callback);
98     static void HandleDidClick(NG::AbilityContextInfo& info, const GestureEvent& gestureEventInfo,
99         const ClickInfo& clickInfo, const RefPtr<NG::FrameNode>& frameNode);
100 
101     static void RegisterTabContentStateCallback(const std::shared_ptr<UIObserverListener>& listener);
102     static void RegisterTabContentStateCallback(
103         const std::string& id, const std::shared_ptr<UIObserverListener>& listener);
104     static void UnRegisterTabContentStateCallback(napi_value cb);
105     static void UnRegisterTabContentStateCallback(const std::string& id, napi_value cb);
106     static void HandleTabContentStateChange(const NG::TabContentInfo& tabContentInfo);
107 
108     static bool ParseStringFromNapi(napi_env env, napi_value val, std::string& str);
109     static bool MatchValueType(napi_env env, napi_value value, napi_valuetype targetType);
110 private:
111     static void HandleAbilityUIContextNavDestinationSwitch(
112         const NG::AbilityContextInfo& info, NG::NavDestinationSwitchInfo& switchInfo);
113     static void HandleUIContextNavDestinationSwitch(const NG::NavDestinationSwitchInfo& switchInfo);
114     using NavIdAndListenersMap =
115         std::unordered_map<std::optional<std::string>, std::list<std::shared_ptr<UIObserverListener>>>;
116     static void HandleListenersWithEmptyNavigationId(
117         const NavIdAndListenersMap& listenersMap, const NG::NavDestinationSwitchInfo& switchInfo);
118     static void HandleListenersWithSpecifiedNavigationId(
119         const NavIdAndListenersMap& listenersMap, const NG::NavDestinationSwitchInfo& switchInfo);
120     static void GetAbilityInfos(napi_env env, napi_value abilityContext, NG::AbilityContextInfo& info);
121     static napi_env GetCurrentNapiEnv();
122 
123     static std::list<std::shared_ptr<UIObserverListener>> unspecifiedNavigationListeners_;
124     static std::unordered_map<std::string, std::list<std::shared_ptr<UIObserverListener>>>
125         specifiedCNavigationListeners_;
126     static std::list<std::shared_ptr<UIObserverListener>> scrollEventListeners_;
127     static std::unordered_map<std::string, std::list<std::shared_ptr<UIObserverListener>>>
128         specifiedScrollEventListeners_;
129     static std::unordered_map<napi_ref, std::list<std::shared_ptr<UIObserverListener>>>
130         abilityContextRouterPageListeners_;
131     static std::unordered_map<int32_t, std::list<std::shared_ptr<UIObserverListener>>>
132         specifiedRouterPageListeners_;
133     static std::unordered_map<napi_ref, NG::AbilityContextInfo> infosForRouterPage_;
134     static std::unordered_map<int32_t, std::list<std::shared_ptr<UIObserverListener>>>
135         specifiedDensityListeners_;
136 
137     static std::unordered_map<napi_ref, std::list<std::shared_ptr<UIObserverListener>>>
138         abilityContextWillClickListeners_;
139     static std::unordered_map<int32_t, std::list<std::shared_ptr<UIObserverListener>>>
140         specifiedWillClickListeners_;
141     static std::unordered_map<napi_ref, std::list<std::shared_ptr<UIObserverListener>>>
142         abilityContextDidClickListeners_;
143     static std::unordered_map<int32_t, std::list<std::shared_ptr<UIObserverListener>>>
144         specifiedDidClickListeners_;
145     static std::list<std::shared_ptr<UIObserverListener>> tabContentStateListeners_;
146     static std::unordered_map<std::string, std::list<std::shared_ptr<UIObserverListener>>>
147         specifiedTabContentStateListeners_;
148 
149     static std::unordered_map<int32_t, std::list<std::shared_ptr<UIObserverListener>>> specifiedDrawListeners_;
150     static std::unordered_map<int32_t, std::list<std::shared_ptr<UIObserverListener>>> specifiedLayoutListeners_;
151 
152     static std::unordered_map<napi_ref, NavIdAndListenersMap> abilityUIContextNavDesSwitchListeners_;
153     static std::unordered_map<int32_t, NavIdAndListenersMap> uiContextNavDesSwitchListeners_;
154     static std::unordered_map<napi_ref, NG::AbilityContextInfo> infosForNavDesSwitch_;
155     static std::unordered_map<napi_ref, NG::AbilityContextInfo> willClickInfos_;
156     static std::unordered_map<napi_ref, NG::AbilityContextInfo> didClickInfos_;
157 };
158 } // namespace OHOS::Ace::Napi
159 #endif // FOUNDATION_ACE_INTERFACES_OBSERVER_H