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