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