• 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 #ifndef FRAMEWORKS_BRIDGE_CJ_FRONTEND_CPP_VIEW_VIEW_ABSTRACT_H
17 #define FRAMEWORKS_BRIDGE_CJ_FRONTEND_CPP_VIEW_VIEW_ABSTRACT_H
18 
19 #include <functional>
20 #include <optional>
21 #include <string>
22 #include <vector>
23 
24 #include "base/geometry/dimension.h"
25 #include "base/geometry/dimension_rect.h"
26 #include "base/json/json_util.h"
27 #include "base/log/ace_scoring_log.h"
28 #include "base/log/ace_trace.h"
29 #include "base/log/log.h"
30 #include "base/memory/ace_type.h"
31 #include "base/utils/macros.h"
32 #include "bridge/cj_frontend/interfaces/cj_ffi/cj_common_ffi.h"
33 #include "bridge/cj_frontend/interfaces/cj_ffi/cj_macro.h"
34 #include "core/common/container.h"
35 #include "core/common/resource/resource_manager.h"
36 #include "core/common/resource/resource_object.h"
37 #include "core/common/resource/resource_wrapper.h"
38 #include "core/components/common/properties/decoration.h"
39 #include "core/components/common/properties/placement.h"
40 #include "core/components_ng/pattern/text/text_menu_extension.h"
41 #include "core/components_ng/pattern/text/text_model.h"
42 #ifndef __OHOS_NG__
43 #include "core/components/box/box_component.h"
44 #include "core/components/display/display_component.h"
45 #include "core/components/menu/menu_component.h"
46 #include "core/components/theme/theme_manager.h"
47 #include "core/components/transform/transform_component.h"
48 #endif
49 #include "ffi_remote_data.h"
50 
51 #include "core/gestures/tap_gesture.h"
52 #include "core/pipeline/base/component.h"
53 
54 using VectorTextMenuItemHandle = void*;
55 
56 extern "C" {
57 struct NativeResourceObject {
58     const char* bundleName;
59     const char* moduleName;
60     int32_t id;
61     int32_t type;
62     const char* paramsJsonStr;
63 };
64 
65 struct FfiTextMenuItem {
66     ExternalString content;
67     ExternalString icon;
68     ExternalString id;
69 };
70 }
71 
72 typedef VectorTextMenuItemHandle (*CjOnCreateMenu)(VectorTextMenuItemHandle);
73 typedef bool (*CjOnMenuItemClick)(FfiTextMenuItem, int32_t, int32_t);
74 
75 namespace OHOS::Ace {
76 enum class ResourceType : uint32_t {
77     COLOR = 10001,
78     FLOAT,
79     STRING,
80     PLURAL,
81     BOOLEAN,
82     INTARRAY,
83     INTEGER,
84     PATTERN,
85     STRARRAY,
86     MEDIA = 20000,
87     RAWFILE = 30000,
88     SYMBOL = 40000
89 };
90 }
91 
92 namespace OHOS::Ace::Framework {
93 RefPtr<ResourceObject> GetResourceObject(const NativeResourceObject& obj);
94 RefPtr<ResourceObject> GetResourceObjectByBundleAndModule(const NativeResourceObject& obj);
95 RefPtr<ResourceWrapper> CreateResourceWrapper(const NativeResourceObject& obj, RefPtr<ResourceObject>& resourceObject);
96 RefPtr<ResourceWrapper> CreateResourceWrapper();
97 
98 enum class Align {
99     TOP_LEFT,
100     TOP_CENTER,
101     TOP_RIGHT,
102     CENTER_LEFT,
103     CENTER,
104     CENTER_RIGHT,
105     BOTTOM_LEFT,
106     BOTTOM_CENTER,
107     BOTTOM_RIGHT,
108 };
109 
110 enum class CJResponseType : int32_t {
111     RIGHT_CLICK = 0,
112     LONGPRESS,
113 };
114 
115 class ACE_EXPORT ViewAbstract : public OHOS::FFI::FFIData {
DECL_TYPE(ViewAbstract,OHOS::FFI::FFIData)116     DECL_TYPE(ViewAbstract, OHOS::FFI::FFIData)
117 public:
118     ViewAbstract() : FFIData() {}
119 
120     template<typename T>
GetTheme()121     static RefPtr<T> GetTheme()
122     {
123         auto currentObj = Container::Current();
124         if (!currentObj) {
125             LOGW("container is null");
126             return nullptr;
127         }
128         auto pipelineContext = currentObj->GetPipelineContext();
129         if (!pipelineContext) {
130             LOGE("pipelineContext is null!");
131             return nullptr;
132         }
133         auto themeManager = pipelineContext->GetThemeManager();
134         if (!themeManager) {
135             LOGE("themeManager is null!");
136             return nullptr;
137         }
138         return themeManager->GetTheme<T>();
139     }
140 
141     static RefPtr<ThemeConstants> GetThemeConstants(
142         const std::string& bundleName = "", const std::string& moduleName = "");
143     static void CjEnabled(bool enabled);
144 
145     static void CompleteResourceObject(NativeResourceObject& obj, std::string& bundleName, std::string& moduleName);
146     static void CompleteResourceObjectWithBundleName(
147         NativeResourceObject& obj, std::string& bundleName, std::string& moduleName, int32_t& resId);
148     static bool ConvertResourceType(const std::string& typeName, ResourceType& resType);
149     static bool ParseDollarResource(const std::string& resPath, std::string& targetModule, ResourceType& resType,
150         std::string& resName, bool isParseType);
151 
152     static bool ParseCjString(NativeResourceObject& obj, std::string& result);
153     static bool ParseCjMedia(NativeResourceObject& obj, std::string& result);
154     static bool ParseCjSymbolId(NativeResourceObject& obj, uint32_t& result);
155     static bool ParseCjColor(NativeResourceObject& obj, Color& result);
156     static bool ParseCjDimension(
157         NativeResourceObject& obj, CalcDimension& result, DimensionUnit defaultUnit, bool isSupportPercent = true);
158     static bool ParseCjDimensionVP(NativeResourceObject& obj, CalcDimension& result, bool isSupportPercent = true);
159     static bool ParseCjDimensionFP(NativeResourceObject& obj, CalcDimension& result, bool isSupportPercent = true);
160     static bool ParseCjDouble(NativeResourceObject& obj, double& result);
161     static bool ParseCjInteger(NativeResourceObject& obj, uint32_t& result);
162     static bool ParseCjInteger(NativeResourceObject& obj, int32_t& result);
163     static bool ParseCjBool(NativeResourceObject& obj, bool& result);
164     static bool ParseCjIntegerArray(NativeResourceObject& obj, std::vector<uint32_t>& result);
165     static bool ParseCjStringArray(NativeResourceObject& obj, std::vector<std::string>& result);
166 
167     template<typename T>
ParseCjInteger(NativeResourceObject & obj,T & result)168     static bool ParseCjInteger(NativeResourceObject& obj, T& result)
169     {
170         std::string bundleName;
171         std::string moduleName;
172         CompleteResourceObject(obj, bundleName, moduleName);
173         if (obj.type == -1) {
174             return false;
175         }
176         auto resourceObject = GetResourceObjectByBundleAndModule(obj);
177         auto resourceWrapper = CreateResourceWrapper(obj, resourceObject);
178         if (!resourceWrapper) {
179             return false;
180         }
181         if (obj.id == -1) {
182             if (!obj.paramsJsonStr) {
183                 return false;
184             }
185             auto params = JsonUtil::ParseJsonString(obj.paramsJsonStr);
186             if (!params->IsArray()) {
187                 return false;
188             }
189             auto param = params->GetArrayItem(0);
190             if (obj.type == static_cast<int32_t>(ResourceType::INTEGER)) {
191                 result = static_cast<T>(resourceWrapper->GetIntByName(param->GetString()));
192                 return true;
193             }
194             return false;
195         }
196         if (obj.type == static_cast<int32_t>(ResourceType::INTEGER)) {
197             result = static_cast<T>(resourceWrapper->GetInt(static_cast<uint32_t>(obj.id)));
198             return true;
199         }
200         return false;
201     }
202 
203     static bool ParseEditMenuOptions(CjOnCreateMenu& cjOnCreateMenu, CjOnMenuItemClick& cjOnMenuItemClick,
204         NG::OnCreateMenuCallback& onCreateMenuCallback, NG::OnMenuItemClickCallback& onMenuItemClick);
205 
206 private:
207     static void CompleteResourceObjectInner(
208         NativeResourceObject& obj, std::string& bundleName, std::string& moduleName, int32_t& resIdValue);
209     static bool ParseCjMediaInternal(NativeResourceObject& obj, std::string& result);
210     static void ParseOnCreateMenu(CjOnCreateMenu& cjOnCreateMenu, NG::OnCreateMenuCallback& onCreateMenuCallback);
211     static void ParseOnMenuItemClick(
212         CjOnMenuItemClick& cjOnMenuItemClick, NG::OnMenuItemClickCallback& onMenuItemClick);
213 };
214 } // namespace OHOS::Ace::Framework
215 #endif // FRAMEWORKS_BRIDGE_CJ_FRONTEND_CPP_VIEW_VIEW_ABSTRACT_H
216