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