1 /*
2  * Copyright (c) 2022-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_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_FORM_FORM_PATTERN_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_FORM_FORM_PATTERN_H
18 
19 #include <unordered_map>
20 
21 #include "transaction/rs_interfaces.h"
22 
23 #include "core/common/ace_application_info.h"
24 #include "core/components/form/resource/form_request_data.h"
25 #include "core/components_ng/event/event_hub.h"
26 #include "core/components_ng/pattern/form/accessibility_session_adapter_form.h"
27 #include "core/components_ng/pattern/form/form_event_hub.h"
28 #include "core/components_ng/pattern/form/form_layout_property.h"
29 #include "core/components_ng/pattern/pattern.h"
30 #include "form_skeleton_params.h"
31 
32 namespace OHOS {
33 namespace MMI {
34 class PointerEvent;
35 } // namespace MMI
36 
37 namespace Ace {
38 class SubContainer;
39 class FormManagerDelegate;
40 
41 namespace NG {
42 enum class FormChildNodeType : int32_t {
43     /**
44      * Arkts card node type
45     */
46     FORM_SURFACE_NODE,
47 
48     /**
49      * static form image node type
50     */
51     FORM_STATIC_IMAGE_NODE,
52 
53     /**
54      * form skeleton node type
55     */
56     FORM_SKELETON_NODE,
57 
58     /**
59      * forbidden form root node
60     */
61     FORM_FORBIDDEN_ROOT_NODE,
62 
63     /**
64      * forbidden form text node
65     */
66     FORM_FORBIDDEN_TEXT_NODE,
67 };
68 
69 class FormPattern : public Pattern {
70     DECLARE_ACE_TYPE(FormPattern, Pattern);
71 
72 public:
73     FormPattern();
74     ~FormPattern() override;
75 
76     void OnActionEvent(const std::string& action);
77 
78     void OnLoadEvent();
79 
80     void HandleUnTrustForm();
81 
CreateLayoutProperty()82     RefPtr<LayoutProperty> CreateLayoutProperty() override
83     {
84         return MakeRefPtr<FormLayoutProperty>();
85     }
86 
CreateEventHub()87     RefPtr<EventHub> CreateEventHub() override
88     {
89         return MakeRefPtr<FormEventHub>();
90     }
91 
92     std::unique_ptr<DrawDelegate> GetDrawDelegate();
93 
94     const RefPtr<SubContainer>& GetSubContainer() const;
95 
96     void DispatchPointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent,
97         SerializedGesture& serializedGesture);
98 
99     void OnSnapshot(std::shared_ptr<Media::PixelMap> pixelMap);
100 
101     void HandleOnSnapshot(std::shared_ptr<Media::PixelMap> pixelMap);
102 
GetExternalRenderContext()103     RefPtr<RenderContext> GetExternalRenderContext()
104     {
105         return externalRenderContext_;
106     }
107 
GetIsLoaded()108     bool GetIsLoaded() const
109     {
110         return isLoaded_;
111     }
112 
SetFormLinkInfos(const std::vector<std::string> & infos)113     void SetFormLinkInfos(const std::vector<std::string>& infos)
114     {
115         formLinkInfos_.clear();
116         formLinkInfos_ = infos;
117     }
118 
119     void GetRectRelativeToWindow(int32_t &top, int32_t &left);
120 
IsJsCard()121     bool IsJsCard() const
122     {
123         return isJsCard_;
124     }
125 
SetObscured(bool isObscured)126     void SetObscured(bool isObscured)
127     {
128         isFormObscured_ = isObscured;
129     }
130 
131     RefPtr<AccessibilitySessionAdapter> GetAccessibilitySessionAdapter() override;
132 
133     void OnAccessibilityChildTreeRegister(uint32_t windowId, int32_t treeId, int64_t accessibilityId);
134 
135     void OnAccessibilityChildTreeDeregister();
136 
137     void OnAccessibilityDumpChildInfo(const std::vector<std::string>& params, std::vector<std::string>& info);
138 
139     void OnLanguageConfigurationUpdate() override;
140 
141     void GetTimeLimitResource(std::string &content);
142 
143     void UnregisterAccessibility();
144 
145 private:
146     void OnAttachToFrameNode() override;
147     bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& config) override;
148     void OnRebuildFrame() override;
149     void OnVisibleChange(bool isVisible) override;
150     void OnModifyDone() override;
151 
152     void InitFormManagerDelegate();
153     void CreateCardContainer();
154     void RemoveSubContainer();
155 
156     void FireOnAcquiredEvent(int64_t id) const;
157     void FireOnRouterEvent(const std::unique_ptr<JsonValue>& action);
158     void FireOnLoadEvent() const;
159     void FireOnErrorEvent(const std::string& code, const std::string& msg) const;
160     void FireOnUninstallEvent(int64_t id) const;
161     void FireFormSurfaceNodeCallback(const std::shared_ptr<Rosen::RSSurfaceNode>& node, const AAFwk::Want& want);
162     void FireFormSurfaceChangeCallback(float width, float height, float borderWidth = 0.0);
163     void FireFormSurfaceDetachCallback();
164     void UpdateBackgroundColorWhenUnTrustForm();
165 
166     bool ISAllowUpdate() const;
167     void EnableDrag();
168     void UpdateConfiguration();
169     void HandleFormComponent(const RequestFormInfo& info);
170     void AddFormComponent(const RequestFormInfo& info);
171     void UpdateFormComponent(const RequestFormInfo& info);
172     void UpdateFormComponentSize(const RequestFormInfo& info);
173     void UpdateTimeLimitFontCfg();
174 
175     void HandleSnapshot(uint32_t delayTime);
176     void TakeSurfaceCaptureForUI();
177     void UpdateStaticCard();
178     RefPtr<FrameNode> CreateImageNode();
179     void UpdateImageNode();
180     void RemoveFrsNode();
181     void ReleaseRenderer();
182     void DelayDeleteImageNode(bool needHandleCachedClick);
183     void SetNonTransparentAfterRecover();
184     void DeleteImageNodeAfterRecover(bool needHandleCachedClick);
185     void HandleStaticFormEvent(const PointF& touchPoint);
186     void ProcDeleteImageNode(const AAFwk::Want& want);
187     void AttachRSNode(const std::shared_ptr<Rosen::RSSurfaceNode>& node, const AAFwk::Want& want);
188     void AttachJsRSNode(const std::shared_ptr<Rosen::RSNode> &jsNode);
189     void HandleEnableForm(const bool enable);
190 
191     void InitClickEvent();
192     void HandleTouchDownEvent(const TouchEventInfo& event);
193     void HandleTouchUpEvent(const TouchEventInfo& event);
194 
195     void LoadFormSkeleton(bool isRefresh = false);
196     bool ShouldLoadFormSkeleton(bool isTransparencyEnabled, const RequestFormInfo &info);
197     void LoadDisableFormStyle(const RequestFormInfo& info, bool isRefresh = false);
198     void RemoveDisableFormStyle(const RequestFormInfo& info);
199     void RemoveFormChildNode(FormChildNodeType formChildNodeType);
200     int32_t GetFormDimensionHeight(int32_t dimension);
201     RefPtr<FrameNode> CreateColumnNode(FormChildNodeType formChildNodeType);
202     RefPtr<FrameNode> CreateTimeLimitNode();
203     RefPtr<FrameNode> CreateRectNode(const RefPtr<FrameNode>& parent, const CalcSize& idealSize,
204         const MarginProperty& margin, uint32_t fillColor, double opacity);
205     void CreateSkeletonView(const RefPtr<FrameNode>& parent, const std::shared_ptr<FormSkeletonParams>& params,
206         int32_t dimensionHeight);
207     void AddFormChildNode(FormChildNodeType formChildNodeType, const RefPtr<FrameNode> child);
208     RefPtr<FrameNode> GetFormChildNode(FormChildNodeType formChildNodeType) const;
209     double GetTimeLimitFontSize();
210     bool IsMaskEnableForm(const RequestFormInfo &info);
211     void UpdateChildNodeOpacity(FormChildNodeType formChildNodeType, double opacity);
212     void SnapshotSurfaceNode();
213     bool CheckFormBundleForbidden(const std::string &bundleName);
214     void DelayResetManuallyClickFlag();
215     void RemoveDelayResetManuallyClickFlagTask();
216     // used by ArkTS Card, for RSSurfaceNode from FRS,
217     RefPtr<RenderContext> externalRenderContext_;
218 
219     RefPtr<SubContainer> subContainer_;
220     RefPtr<FormManagerDelegate> formManagerBridge_;
221     RefPtr<AccessibilitySessionAdapterForm> accessibilitySessionAdapter_;
222 
223     RequestFormInfo cardInfo_;
224     bool isLoaded_ = false;
225     bool isVisible_ = true;
226     bool isBeenLayout_ = false;
227     bool isUnTrust_ = false;
228     bool isDynamic_ = true;
229     bool isFrsNodeDetached_ = false;
230     bool needSnapshotAgain_ = false;
231     bool isSnapshot_ = false;
232     RefPtr<PixelMap> pixelMap_ = nullptr;
233     int64_t snapshotTimestamp_ = 0;
234     int32_t scopeId_;
235     std::string localeTag_ = AceApplicationInfo::GetInstance().GetLocaleTag();
236     std::vector<std::string> formLinkInfos_;
237     TimeStamp touchDownTime_;
238     bool shouldResponseClick_ = false;
239     Offset lastTouchLocation_;
240     ColorMode colorMode = ColorMode::LIGHT;
241 
242     bool isFormObscured_ = false;
243     bool isJsCard_ = true;
244     std::unordered_map<FormChildNodeType, RefPtr<FrameNode>> formChildrenNodeMap_;
245     bool isTibetanLanguage_ = false;
246     bool isManuallyClick_ = false;
247 };
248 } // namespace NG
249 } // namespace Ace
250 } // namespace OHOS
251 
252 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_FORM_FORM_PATTERN_H
253