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 #include <dlfcn.h>
17 #include "view_data_wrap_ohos.h"
18
19 namespace OHOS::Ace {
20 #ifdef APP_USE_ARM
21 constexpr char LIB_HINT2_TYPE_Z_SO_NAME[] = "/system/lib/module/core/atomicservicecomponent/libhint2type.z.so";
22 #elif defined(APP_USE_X86_64)
23 constexpr char LIB_HINT2_TYPE_Z_SO_NAME[] = "/system/lib64/module/core/atomicservicecomponent/libhint2type.z.so";
24 #else
25 constexpr char LIB_HINT2_TYPE_Z_SO_NAME[] = "/system/lib64/module/core/atomicservicecomponent/libhint2type.z.so";
26 #endif
27 constexpr char HINT_2_TYPE[] = "Hint2Type";
28 using Hint2Type = int (*) (std::vector<std::string>, std::vector<int>&, std::vector<std::string>&);
29
CreatePageNodeInfoWrap()30 RefPtr<PageNodeInfoWrap> PageNodeInfoWrap::CreatePageNodeInfoWrap()
31 {
32 return AceType::MakeRefPtr<PageNodeInfoWrapOhos>();
33 }
34
GetPageNodeInfo() const35 const AbilityBase::PageNodeInfo& PageNodeInfoWrapOhos::GetPageNodeInfo() const
36 {
37 return pageNodeInfo_;
38 }
39
CreateViewDataWrap()40 RefPtr<ViewDataWrap> ViewDataWrap::CreateViewDataWrap()
41 {
42 return AceType::MakeRefPtr<ViewDataWrapOhos>();
43 }
44
ViewDataToType(const AbilityBase::ViewData& viewData)45 AbilityBase::AutoFillType ViewDataWrap::ViewDataToType(const AbilityBase::ViewData& viewData)
46 {
47 auto type = AbilityBase::AutoFillType::UNSPECIFIED;
48 for (auto it = viewData.nodes.begin(); it != viewData.nodes.end(); ++it) {
49 if (!it->value.empty()) {
50 if (type < it->autoFillType && it->autoFillType < AbilityBase::AutoFillType::FULL_STREET_ADDRESS) {
51 return it->autoFillType;
52 }
53 }
54 }
55 for (auto it = viewData.nodes.begin(); it != viewData.nodes.end(); ++it) {
56 if (!it->value.empty()) {
57 if (AbilityBase::AutoFillType::FULL_STREET_ADDRESS <= it->autoFillType &&
58 it->autoFillType <= AbilityBase::AutoFillType::FORMAT_ADDRESS) {
59 return it->autoFillType;
60 }
61 }
62 }
63 return type;
64 }
65
LoadHint2Type(const std::vector<std::string>& placeHolder, std::vector<int>& intType, std::vector<std::string>& metadata)66 bool ViewDataWrap::LoadHint2Type(const std::vector<std::string>& placeHolder, std::vector<int>& intType,
67 std::vector<std::string>& metadata)
68 {
69 void* handle = dlopen(LIB_HINT2_TYPE_Z_SO_NAME, RTLD_LAZY);
70 if (handle == nullptr) {
71 LOGE("Failed to open libhint2type library %{public}s, reason: %{public}sn",
72 LIB_HINT2_TYPE_Z_SO_NAME, dlerror());
73 return false;
74 }
75 Hint2Type hintFun = reinterpret_cast<Hint2Type>(dlsym(handle, HINT_2_TYPE));
76 if (hintFun == nullptr) {
77 dlclose(handle);
78 LOGE("Failed to get symbol %{public}s in %{public}s", HINT_2_TYPE, LIB_HINT2_TYPE_Z_SO_NAME);
79 return false;
80 }
81 if (hintFun(placeHolder, intType, metadata)) {
82 LOGE("Failed to Hint 2 intType");
83 dlclose(handle);
84 return false;
85 }
86 dlclose(handle);
87 return true;
88 }
89
GetPlaceHolderValue(AbilityBase::ViewData& viewData)90 bool ViewDataWrap::GetPlaceHolderValue(AbilityBase::ViewData& viewData)
91 {
92 std::vector<std::string> placeHolder;
93 std::vector<int> intType;
94 std::vector<std::string> metadata;
95 for (auto it = viewData.nodes.begin(); it != viewData.nodes.end(); ++it) {
96 if (it->autoFillType == AbilityBase::AutoFillType::UNSPECIFIED) {
97 placeHolder.push_back(it->placeholder);
98 }
99 }
100 auto isSuccessLoadHint2Type = LoadHint2Type(placeHolder, intType, metadata);
101 if (!isSuccessLoadHint2Type) {
102 LOGE("Load Hint2Type Failed !");
103 return false;
104 }
105 size_t index = 0;
106 for (auto it = viewData.nodes.begin(); it != viewData.nodes.end(); ++it) {
107 if (index >= intType.size()) {
108 LOGE("intType size err !");
109 break;
110 }
111 if (it->autoFillType == AbilityBase::AutoFillType::UNSPECIFIED) {
112 it->autoFillType = HintToAutoFillType(intType[index]);
113 ++index;
114 }
115 }
116 return true;
117 }
118
HintToAutoFillType(const int& intType)119 AbilityBase::AutoFillType ViewDataWrap::HintToAutoFillType(const int& intType)
120 {
121 std::vector<AbilityBase::AutoFillType> hintVector = {
122 AbilityBase::AutoFillType::UNSPECIFIED,
123 AbilityBase::AutoFillType::NICKNAME,
124 AbilityBase::AutoFillType::PERSON_FULL_NAME,
125 AbilityBase::AutoFillType::PERSON_LAST_NAME,
126 AbilityBase::AutoFillType::PERSON_FIRST_NAME,
127 AbilityBase::AutoFillType::PHONE_NUMBER,
128 AbilityBase::AutoFillType::PHONE_COUNTRY_CODE,
129 AbilityBase::AutoFillType::FULL_PHONE_NUMBER,
130 AbilityBase::AutoFillType::EMAIL_ADDRESS,
131 AbilityBase::AutoFillType::ID_CARD_NUMBER,
132 AbilityBase::AutoFillType::FORMAT_ADDRESS,
133 AbilityBase::AutoFillType::COUNTRY_ADDRESS,
134 AbilityBase::AutoFillType::PROVINCE_ADDRESS,
135 AbilityBase::AutoFillType::CITY_ADDRESS,
136 AbilityBase::AutoFillType::DISTRICT_ADDRESS,
137 AbilityBase::AutoFillType::FULL_STREET_ADDRESS,
138 AbilityBase::AutoFillType::DETAIL_INFO_WITHOUT_STREET,
139 AbilityBase::AutoFillType::HOUSE_NUMBER,
140 AbilityBase::AutoFillType::BANK_CARD_NUMBER };
141
142 if (intType < 0 || (size_t)intType >= hintVector.size()) {
143 return hintVector[0];
144 }
145 return hintVector[intType];
146 }
147
CreateViewDataWrap(const AbilityBase::ViewData& viewData)148 RefPtr<ViewDataWrap> ViewDataWrap::CreateViewDataWrap(const AbilityBase::ViewData& viewData)
149 {
150 return AceType::MakeRefPtr<ViewDataWrapOhos>(viewData);
151 }
152
ViewDataWrapOhos(const AbilityBase::ViewData& viewData)153 ViewDataWrapOhos::ViewDataWrapOhos(const AbilityBase::ViewData& viewData): viewData_(viewData)
154 {
155 for (const auto& node: viewData.nodes) {
156 pageNodeInfoWraps_.emplace_back(AceType::MakeRefPtr<PageNodeInfoWrapOhos>(node));
157 }
158 }
159
GetViewData()160 const AbilityBase::ViewData& ViewDataWrapOhos::GetViewData()
161 {
162 viewData_.nodes.clear();
163 for (const auto& nodeWrap: pageNodeInfoWraps_) {
164 auto nodeWrapOhos = AceType::DynamicCast<PageNodeInfoWrapOhos>(nodeWrap);
165 if (nodeWrapOhos) {
166 viewData_.nodes.emplace_back(nodeWrapOhos->GetPageNodeInfo());
167 }
168 }
169 return viewData_;
170 }
171 } // namespace OHOS::Ace
172