1bc2ed2b3Sopenharmony_ci/*
2bc2ed2b3Sopenharmony_ci* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd.
3bc2ed2b3Sopenharmony_ci* Licensed under the Apache License, Version 2.0 (the "License");
4bc2ed2b3Sopenharmony_ci* you may not use this file except in compliance with the License.
5bc2ed2b3Sopenharmony_ci* You may obtain a copy of the License at
6bc2ed2b3Sopenharmony_ci*
7bc2ed2b3Sopenharmony_ci* http://www.apache.org/licenses/LICENSE-2.0
8bc2ed2b3Sopenharmony_ci*
9bc2ed2b3Sopenharmony_ci* Unless required by applicable law or agreed to in writing, software
10bc2ed2b3Sopenharmony_ci* distributed under the License is distributed on an "AS IS" BASIS,
11bc2ed2b3Sopenharmony_ci* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12bc2ed2b3Sopenharmony_ci* See the License for the specific language governing permissions and
13bc2ed2b3Sopenharmony_ci* limitations under the License.
14bc2ed2b3Sopenharmony_ci*/
15bc2ed2b3Sopenharmony_ci#include "app_data_parser.h"
16bc2ed2b3Sopenharmony_ci
17bc2ed2b3Sopenharmony_ci#include "accesstoken_kit.h"
18bc2ed2b3Sopenharmony_ci#include "common_event_manager.h"
19bc2ed2b3Sopenharmony_ci#include "iservice_registry.h"
20bc2ed2b3Sopenharmony_ci#include "loghelper.h"
21bc2ed2b3Sopenharmony_ci#include "nfc_sdk_common.h"
22bc2ed2b3Sopenharmony_ci#include "system_ability_definition.h"
23bc2ed2b3Sopenharmony_ci#include "taginfo.h"
24bc2ed2b3Sopenharmony_ci#include "nfc_permission_checker.h"
25bc2ed2b3Sopenharmony_ci
26bc2ed2b3Sopenharmony_cinamespace OHOS {
27bc2ed2b3Sopenharmony_cinamespace NFC {
28bc2ed2b3Sopenharmony_ciconst int USER_ID = 100;
29bc2ed2b3Sopenharmony_cistatic AppDataParser g_appDataParser;
30bc2ed2b3Sopenharmony_ci/** Tag type of tag app metadata name */
31bc2ed2b3Sopenharmony_cistatic const std::string KEY_TAG_TECH = "tag-tech";
32bc2ed2b3Sopenharmony_cistd::mutex g_appListInitMutex = {};
33bc2ed2b3Sopenharmony_cisptr<BundleMgrDeathRecipient> bundleMgrDeathRecipient_(new (std::nothrow) BundleMgrDeathRecipient());
34bc2ed2b3Sopenharmony_ci
35bc2ed2b3Sopenharmony_civoid BundleMgrDeathRecipient::OnRemoteDied([[maybe_unused]] const wptr<IRemoteObject> &remote)
36bc2ed2b3Sopenharmony_ci{
37bc2ed2b3Sopenharmony_ci    InfoLog("bundleMgrService dead");
38bc2ed2b3Sopenharmony_ci};
39bc2ed2b3Sopenharmony_ci
40bc2ed2b3Sopenharmony_ciAppDataParser::AppDataParser()
41bc2ed2b3Sopenharmony_ci{
42bc2ed2b3Sopenharmony_ci    g_tagAppAndTechMap.clear();
43bc2ed2b3Sopenharmony_ci    g_hceAppAndAidMap.clear();
44bc2ed2b3Sopenharmony_ci}
45bc2ed2b3Sopenharmony_ci
46bc2ed2b3Sopenharmony_ciAppDataParser::~AppDataParser()
47bc2ed2b3Sopenharmony_ci{
48bc2ed2b3Sopenharmony_ci}
49bc2ed2b3Sopenharmony_ci
50bc2ed2b3Sopenharmony_ciAppDataParser& AppDataParser::GetInstance()
51bc2ed2b3Sopenharmony_ci{
52bc2ed2b3Sopenharmony_ci    return g_appDataParser;
53bc2ed2b3Sopenharmony_ci}
54bc2ed2b3Sopenharmony_ci
55bc2ed2b3Sopenharmony_cisptr<AppExecFwk::IBundleMgr> AppDataParser::GetBundleMgrProxy()
56bc2ed2b3Sopenharmony_ci{
57bc2ed2b3Sopenharmony_ci    sptr<ISystemAbilityManager> systemAbilityManager =
58bc2ed2b3Sopenharmony_ci        SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
59bc2ed2b3Sopenharmony_ci    if (!systemAbilityManager) {
60bc2ed2b3Sopenharmony_ci        ErrorLog("GetBundleMgrProxy, systemAbilityManager is null");
61bc2ed2b3Sopenharmony_ci        return nullptr;
62bc2ed2b3Sopenharmony_ci    }
63bc2ed2b3Sopenharmony_ci    sptr<IRemoteObject> remoteObject = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
64bc2ed2b3Sopenharmony_ci    if (!remoteObject) {
65bc2ed2b3Sopenharmony_ci        ErrorLog("GetBundleMgrProxy, remoteObject is null");
66bc2ed2b3Sopenharmony_ci        return nullptr;
67bc2ed2b3Sopenharmony_ci    }
68bc2ed2b3Sopenharmony_ci    sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = iface_cast<AppExecFwk::IBundleMgr>(remoteObject);
69bc2ed2b3Sopenharmony_ci    bundleMgrProxy->AsObject()->AddDeathRecipient(bundleMgrDeathRecipient_);
70bc2ed2b3Sopenharmony_ci    return bundleMgrProxy;
71bc2ed2b3Sopenharmony_ci}
72bc2ed2b3Sopenharmony_ci
73bc2ed2b3Sopenharmony_cibool AppDataParser::HandleAppAddOrChangedEvent(std::shared_ptr<EventFwk::CommonEventData> data)
74bc2ed2b3Sopenharmony_ci{
75bc2ed2b3Sopenharmony_ci    if (data == nullptr) {
76bc2ed2b3Sopenharmony_ci        ErrorLog("HandleAppAddOrChangedEvent, invalid data.");
77bc2ed2b3Sopenharmony_ci        return false;
78bc2ed2b3Sopenharmony_ci    }
79bc2ed2b3Sopenharmony_ci    ElementName element = data->GetWant().GetElement();
80bc2ed2b3Sopenharmony_ci    std::string bundleName = element.GetBundleName();
81bc2ed2b3Sopenharmony_ci    if (bundleName.empty()) {
82bc2ed2b3Sopenharmony_ci        ErrorLog("HandleAppAddOrChangedEvent, invaid bundleName.");
83bc2ed2b3Sopenharmony_ci        return false;
84bc2ed2b3Sopenharmony_ci    }
85bc2ed2b3Sopenharmony_ci    DebugLog("HandleAppAddOrChangedEvent bundlename: %{public}s", bundleName.c_str());
86bc2ed2b3Sopenharmony_ci    bool tag = UpdateAppListInfo(element, KITS::ACTION_TAG_FOUND);
87bc2ed2b3Sopenharmony_ci    bool host = UpdateAppListInfo(element, KITS::ACTION_HOST_APDU_SERVICE);
88bc2ed2b3Sopenharmony_ci    bool offHost = UpdateAppListInfo(element, KITS::ACTION_OFF_HOST_APDU_SERVICE);
89bc2ed2b3Sopenharmony_ci    return tag || host || offHost;
90bc2ed2b3Sopenharmony_ci}
91bc2ed2b3Sopenharmony_ci
92bc2ed2b3Sopenharmony_cibool AppDataParser::HandleAppRemovedEvent(std::shared_ptr<EventFwk::CommonEventData> data)
93bc2ed2b3Sopenharmony_ci{
94bc2ed2b3Sopenharmony_ci    if (data == nullptr) {
95bc2ed2b3Sopenharmony_ci        ErrorLog("HandleAppRemovedEvent, invalid data.");
96bc2ed2b3Sopenharmony_ci        return false;
97bc2ed2b3Sopenharmony_ci    }
98bc2ed2b3Sopenharmony_ci    ElementName element = data->GetWant().GetElement();
99bc2ed2b3Sopenharmony_ci    std::string bundleName = element.GetBundleName();
100bc2ed2b3Sopenharmony_ci    if (bundleName.empty()) {
101bc2ed2b3Sopenharmony_ci        ErrorLog("HandleAppRemovedEvent, invalid bundleName.");
102bc2ed2b3Sopenharmony_ci        return false;
103bc2ed2b3Sopenharmony_ci    }
104bc2ed2b3Sopenharmony_ci    DebugLog("HandleAppRemovedEvent, bundleName %{public}s tag size %{public}zu, hce size %{public}zu",
105bc2ed2b3Sopenharmony_ci        bundleName.c_str(),
106bc2ed2b3Sopenharmony_ci        g_tagAppAndTechMap.size(),
107bc2ed2b3Sopenharmony_ci        g_hceAppAndAidMap.size());
108bc2ed2b3Sopenharmony_ci    bool tag = RemoveTagAppInfo(element);
109bc2ed2b3Sopenharmony_ci    bool hce = RemoveHceAppInfo(element);
110bc2ed2b3Sopenharmony_ci    bool offHost = RemoveOffHostAppInfo(element);
111bc2ed2b3Sopenharmony_ci    return tag || hce || offHost;
112bc2ed2b3Sopenharmony_ci}
113bc2ed2b3Sopenharmony_ci
114bc2ed2b3Sopenharmony_cibool AppDataParser::VerifyHapPermission(const std::string bundleName, const std::string action)
115bc2ed2b3Sopenharmony_ci{
116bc2ed2b3Sopenharmony_ci    std::string permissionNfc;
117bc2ed2b3Sopenharmony_ci    OHOS::Security::AccessToken::AccessTokenID tokenID;
118bc2ed2b3Sopenharmony_ci    std::map<std::string, std::string> permissionMap = {
119bc2ed2b3Sopenharmony_ci        {KITS::ACTION_TAG_FOUND, TAG_PERM},
120bc2ed2b3Sopenharmony_ci        {KITS::ACTION_HOST_APDU_SERVICE, CARD_EMU_PERM},
121bc2ed2b3Sopenharmony_ci        {KITS::ACTION_OFF_HOST_APDU_SERVICE, CARD_EMU_PERM}
122bc2ed2b3Sopenharmony_ci    };
123bc2ed2b3Sopenharmony_ci    std::map<std::string, std::string>::iterator it = permissionMap.find(action.c_str());
124bc2ed2b3Sopenharmony_ci    if (it != permissionMap.end()) {
125bc2ed2b3Sopenharmony_ci        permissionNfc = it->second;
126bc2ed2b3Sopenharmony_ci    } else {
127bc2ed2b3Sopenharmony_ci        ErrorLog("VerifyHapPermission, action no in map!");
128bc2ed2b3Sopenharmony_ci        return false;
129bc2ed2b3Sopenharmony_ci    }
130bc2ed2b3Sopenharmony_ci    tokenID= OHOS::Security::AccessToken::AccessTokenKit::GetHapTokenID(USER_ID, bundleName, 0);
131bc2ed2b3Sopenharmony_ci    int result = OHOS::Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenID, permissionNfc);
132bc2ed2b3Sopenharmony_ci    if (result != OHOS::Security::AccessToken::PERMISSION_GRANTED) {
133bc2ed2b3Sopenharmony_ci        ErrorLog("bundleName %{public}s no permission %{public}s", bundleName.c_str(), permissionNfc.c_str());
134bc2ed2b3Sopenharmony_ci        return false;
135bc2ed2b3Sopenharmony_ci    }
136bc2ed2b3Sopenharmony_ci    return true;
137bc2ed2b3Sopenharmony_ci}
138bc2ed2b3Sopenharmony_ci
139bc2ed2b3Sopenharmony_civoid AppDataParser::QueryAbilityInfos(const std::string action, std::vector<AbilityInfo> &abilityInfos,
140bc2ed2b3Sopenharmony_ci    std::vector<ExtensionAbilityInfo> &extensionInfos)
141bc2ed2b3Sopenharmony_ci{
142bc2ed2b3Sopenharmony_ci    sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = GetBundleMgrProxy();
143bc2ed2b3Sopenharmony_ci    if (bundleMgrProxy == nullptr) {
144bc2ed2b3Sopenharmony_ci        ErrorLog("QueryAbilityInfos, bundleMgrProxy is nullptr.");
145bc2ed2b3Sopenharmony_ci        return;
146bc2ed2b3Sopenharmony_ci    }
147bc2ed2b3Sopenharmony_ci    AAFwk::Want want;
148bc2ed2b3Sopenharmony_ci    want.SetAction(action);
149bc2ed2b3Sopenharmony_ci    if (KITS::ACTION_TAG_FOUND == action) {
150bc2ed2b3Sopenharmony_ci        // only tag action have uris
151bc2ed2b3Sopenharmony_ci        want.SetType("*/*");
152bc2ed2b3Sopenharmony_ci    }
153bc2ed2b3Sopenharmony_ci
154bc2ed2b3Sopenharmony_ci    bool withDefault = false;
155bc2ed2b3Sopenharmony_ci    bool findDefaultApp = false;
156bc2ed2b3Sopenharmony_ci    auto abilityInfoFlag = AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_DEFAULT
157bc2ed2b3Sopenharmony_ci        | AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL_URI
158bc2ed2b3Sopenharmony_ci        | AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA;
159bc2ed2b3Sopenharmony_ci    if (!bundleMgrProxy->ImplicitQueryInfos(want, abilityInfoFlag, USER_ID, withDefault,
160bc2ed2b3Sopenharmony_ci        abilityInfos, extensionInfos, findDefaultApp)) {
161bc2ed2b3Sopenharmony_ci        WarnLog("QueryAbilityInfos, query none for action %{public}s", action.c_str());
162bc2ed2b3Sopenharmony_ci        return;
163bc2ed2b3Sopenharmony_ci    }
164bc2ed2b3Sopenharmony_ci}
165bc2ed2b3Sopenharmony_ci
166bc2ed2b3Sopenharmony_cibool AppDataParser::UpdateAppListInfo(ElementName &element, const std::string action)
167bc2ed2b3Sopenharmony_ci{
168bc2ed2b3Sopenharmony_ci    if (action.compare(KITS::ACTION_TAG_FOUND) != 0 && action.compare(KITS::ACTION_HOST_APDU_SERVICE) != 0 &&
169bc2ed2b3Sopenharmony_ci        action != KITS::ACTION_OFF_HOST_APDU_SERVICE) {
170bc2ed2b3Sopenharmony_ci        DebugLog("UpdateAppListInfo, ignore action = %{public}s", action.c_str());
171bc2ed2b3Sopenharmony_ci        return false;
172bc2ed2b3Sopenharmony_ci    }
173bc2ed2b3Sopenharmony_ci    std::string bundleName = element.GetBundleName();
174bc2ed2b3Sopenharmony_ci    if (!VerifyHapPermission(bundleName, action)) {
175bc2ed2b3Sopenharmony_ci        DebugLog("Hap have no permission for action = %{public}s", action.c_str());
176bc2ed2b3Sopenharmony_ci        return false;
177bc2ed2b3Sopenharmony_ci    }
178bc2ed2b3Sopenharmony_ci
179bc2ed2b3Sopenharmony_ci    // query the applications infos that're matched with the acitons.
180bc2ed2b3Sopenharmony_ci    std::vector<AbilityInfo> abilityInfos;
181bc2ed2b3Sopenharmony_ci    std::vector<ExtensionAbilityInfo> extensionAbilityInfos;
182bc2ed2b3Sopenharmony_ci    QueryAbilityInfos(action, abilityInfos, extensionAbilityInfos);
183bc2ed2b3Sopenharmony_ci    for (auto& abilityInfo : abilityInfos) {
184bc2ed2b3Sopenharmony_ci        if (bundleName.empty() || bundleName.compare(abilityInfo.bundleName) != 0) {
185bc2ed2b3Sopenharmony_ci            continue;
186bc2ed2b3Sopenharmony_ci        }
187bc2ed2b3Sopenharmony_ci        ElementName hapElement(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name,
188bc2ed2b3Sopenharmony_ci                abilityInfo.moduleName);
189bc2ed2b3Sopenharmony_ci        if (action.compare(KITS::ACTION_TAG_FOUND) == 0) {
190bc2ed2b3Sopenharmony_ci            UpdateTagAppList(abilityInfo, hapElement);
191bc2ed2b3Sopenharmony_ci        }
192bc2ed2b3Sopenharmony_ci        if (action.compare(KITS::ACTION_HOST_APDU_SERVICE) == 0) {
193bc2ed2b3Sopenharmony_ci            UpdateHceAppList(abilityInfo, hapElement);
194bc2ed2b3Sopenharmony_ci        }
195bc2ed2b3Sopenharmony_ci        if (action.compare(KITS::ACTION_OFF_HOST_APDU_SERVICE) == 0) {
196bc2ed2b3Sopenharmony_ci            UpdateOffHostAppList(abilityInfo, hapElement);
197bc2ed2b3Sopenharmony_ci        }
198bc2ed2b3Sopenharmony_ci    }
199bc2ed2b3Sopenharmony_ci    return true;
200bc2ed2b3Sopenharmony_ci}
201bc2ed2b3Sopenharmony_ci
202bc2ed2b3Sopenharmony_cibool AppDataParser::InitAppListByAction(const std::string action)
203bc2ed2b3Sopenharmony_ci{
204bc2ed2b3Sopenharmony_ci    // query the applications infos that're matched with the acitons.
205bc2ed2b3Sopenharmony_ci    std::vector<AbilityInfo> abilityInfos;
206bc2ed2b3Sopenharmony_ci    std::vector<ExtensionAbilityInfo> extensionAbilityInfos;
207bc2ed2b3Sopenharmony_ci    QueryAbilityInfos(action, abilityInfos, extensionAbilityInfos);
208bc2ed2b3Sopenharmony_ci    if (KITS::ACTION_TAG_FOUND.compare(action) == 0) {
209bc2ed2b3Sopenharmony_ci        for (auto& tagAbilityInfo : abilityInfos) {
210bc2ed2b3Sopenharmony_ci            ElementName element(tagAbilityInfo.deviceId, tagAbilityInfo.bundleName, tagAbilityInfo.name,
211bc2ed2b3Sopenharmony_ci                tagAbilityInfo.moduleName);
212bc2ed2b3Sopenharmony_ci            UpdateTagAppList(tagAbilityInfo, element);
213bc2ed2b3Sopenharmony_ci        }
214bc2ed2b3Sopenharmony_ci    } else if (KITS::ACTION_HOST_APDU_SERVICE.compare(action) == 0) {
215bc2ed2b3Sopenharmony_ci        for (auto& hceAbilityInfo : abilityInfos) {
216bc2ed2b3Sopenharmony_ci            ElementName element(hceAbilityInfo.deviceId, hceAbilityInfo.bundleName, hceAbilityInfo.name,
217bc2ed2b3Sopenharmony_ci                hceAbilityInfo.moduleName);
218bc2ed2b3Sopenharmony_ci            UpdateHceAppList(hceAbilityInfo, element);
219bc2ed2b3Sopenharmony_ci        }
220bc2ed2b3Sopenharmony_ci    } else if (KITS::ACTION_OFF_HOST_APDU_SERVICE.compare(action) == 0) {
221bc2ed2b3Sopenharmony_ci        for (auto& offHostAbilityInfo : abilityInfos) {
222bc2ed2b3Sopenharmony_ci            ElementName element(offHostAbilityInfo.deviceId, offHostAbilityInfo.bundleName, offHostAbilityInfo.name,
223bc2ed2b3Sopenharmony_ci                offHostAbilityInfo.moduleName);
224bc2ed2b3Sopenharmony_ci            UpdateOffHostAppList(offHostAbilityInfo, element);
225bc2ed2b3Sopenharmony_ci        }
226bc2ed2b3Sopenharmony_ci    } else {
227bc2ed2b3Sopenharmony_ci        WarnLog("InitAppListByAction,unknown action = %{public}s", action.c_str());
228bc2ed2b3Sopenharmony_ci    }
229bc2ed2b3Sopenharmony_ci    return true;
230bc2ed2b3Sopenharmony_ci}
231bc2ed2b3Sopenharmony_ci
232bc2ed2b3Sopenharmony_cibool AppDataParser::IsMatchedByBundleName(ElementName &src, ElementName &target)
233bc2ed2b3Sopenharmony_ci{
234bc2ed2b3Sopenharmony_ci    if (src.GetBundleName().compare(target.GetBundleName()) == 0) {
235bc2ed2b3Sopenharmony_ci        return true;
236bc2ed2b3Sopenharmony_ci    }
237bc2ed2b3Sopenharmony_ci    return false;
238bc2ed2b3Sopenharmony_ci}
239bc2ed2b3Sopenharmony_ci
240bc2ed2b3Sopenharmony_ciElementName AppDataParser::GetMatchedTagKeyElement(ElementName &element)
241bc2ed2b3Sopenharmony_ci{
242bc2ed2b3Sopenharmony_ci    ElementName emptyElement;
243bc2ed2b3Sopenharmony_ci    std::vector<TagAppTechInfo>::iterator iter;
244bc2ed2b3Sopenharmony_ci    for (iter = g_tagAppAndTechMap.begin(); iter != g_tagAppAndTechMap.end(); ++iter) {
245bc2ed2b3Sopenharmony_ci        if (IsMatchedByBundleName(element, (*iter).element)) {
246bc2ed2b3Sopenharmony_ci            return (*iter).element;
247bc2ed2b3Sopenharmony_ci        }
248bc2ed2b3Sopenharmony_ci    }
249bc2ed2b3Sopenharmony_ci    return emptyElement;
250bc2ed2b3Sopenharmony_ci}
251bc2ed2b3Sopenharmony_ci
252bc2ed2b3Sopenharmony_ciElementName AppDataParser::GetMatchedHceKeyElement(ElementName &element)
253bc2ed2b3Sopenharmony_ci{
254bc2ed2b3Sopenharmony_ci    ElementName emptyElement;
255bc2ed2b3Sopenharmony_ci    std::vector<HceAppAidInfo>::iterator iter;
256bc2ed2b3Sopenharmony_ci    for (iter = g_hceAppAndAidMap.begin(); iter != g_hceAppAndAidMap.end(); ++iter) {
257bc2ed2b3Sopenharmony_ci        if (IsMatchedByBundleName(element, (*iter).element)) {
258bc2ed2b3Sopenharmony_ci            return (*iter).element;
259bc2ed2b3Sopenharmony_ci        }
260bc2ed2b3Sopenharmony_ci    }
261bc2ed2b3Sopenharmony_ci    return emptyElement;
262bc2ed2b3Sopenharmony_ci}
263bc2ed2b3Sopenharmony_ci
264bc2ed2b3Sopenharmony_civoid AppDataParser::UpdateTagAppList(AbilityInfo &abilityInfo, ElementName &element)
265bc2ed2b3Sopenharmony_ci{
266bc2ed2b3Sopenharmony_ci    if (!GetMatchedTagKeyElement(element).GetBundleName().empty()) {
267bc2ed2b3Sopenharmony_ci        WarnLog("UpdateTagAppList, rm duplicated app %{public}s", element.GetBundleName().c_str());
268bc2ed2b3Sopenharmony_ci        RemoveTagAppInfo(element);
269bc2ed2b3Sopenharmony_ci    }
270bc2ed2b3Sopenharmony_ci    std::vector<std::string> valueList;
271bc2ed2b3Sopenharmony_ci    for (auto& data : abilityInfo.metadata) {
272bc2ed2b3Sopenharmony_ci        if (KEY_TAG_TECH.compare(data.name) == 0) {
273bc2ed2b3Sopenharmony_ci            valueList.emplace_back(data.value);
274bc2ed2b3Sopenharmony_ci            DebugLog("UpdateTagAppList from metadata, push tech %{public}s", data.value.c_str());
275bc2ed2b3Sopenharmony_ci        }
276bc2ed2b3Sopenharmony_ci    }
277bc2ed2b3Sopenharmony_ci    for (auto& data : abilityInfo.metaData.customizeData) {
278bc2ed2b3Sopenharmony_ci        if (KEY_TAG_TECH.compare(data.name) == 0) {
279bc2ed2b3Sopenharmony_ci            valueList.emplace_back(data.value);
280bc2ed2b3Sopenharmony_ci            DebugLog("UpdateTagAppList from customizeData, push tech %{public}s", data.value.c_str());
281bc2ed2b3Sopenharmony_ci        }
282bc2ed2b3Sopenharmony_ci    }
283bc2ed2b3Sopenharmony_ci    for (auto& uri : abilityInfo.skillUri) {
284bc2ed2b3Sopenharmony_ci        if (uri.type.empty()) {
285bc2ed2b3Sopenharmony_ci            continue;
286bc2ed2b3Sopenharmony_ci        }
287bc2ed2b3Sopenharmony_ci        // format example: "type": "tag-tech/NfcA"
288bc2ed2b3Sopenharmony_ci        auto pos = uri.type.find("/");
289bc2ed2b3Sopenharmony_ci        if (pos == std::string::npos) {
290bc2ed2b3Sopenharmony_ci            ErrorLog("UpdateTagAppList from skillUri, separator not found %{public}s", uri.type.c_str());
291bc2ed2b3Sopenharmony_ci            continue;
292bc2ed2b3Sopenharmony_ci        }
293bc2ed2b3Sopenharmony_ci        std::string tech = uri.type.substr(0, pos);
294bc2ed2b3Sopenharmony_ci        if (KEY_TAG_TECH.compare(tech) != 0) {
295bc2ed2b3Sopenharmony_ci            ErrorLog("UpdateTagAppList KEY_TAG_TECH for %{public}s", tech.c_str());
296bc2ed2b3Sopenharmony_ci            continue;
297bc2ed2b3Sopenharmony_ci        }
298bc2ed2b3Sopenharmony_ci        std::string nfcType = uri.type.substr(pos + 1, uri.type.size());
299bc2ed2b3Sopenharmony_ci        if (std::find(valueList.begin(), valueList.end(), nfcType) == valueList.end()) {
300bc2ed2b3Sopenharmony_ci            valueList.emplace_back(nfcType);
301bc2ed2b3Sopenharmony_ci            DebugLog("UpdateTagAppList from skillUri, push tech %{public}s", nfcType.c_str());
302bc2ed2b3Sopenharmony_ci        }
303bc2ed2b3Sopenharmony_ci    }
304bc2ed2b3Sopenharmony_ci
305bc2ed2b3Sopenharmony_ci    if (valueList.empty()) {
306bc2ed2b3Sopenharmony_ci        DebugLog("UpdateTagAppList, ignore for app %{public}s %{public}s", element.GetBundleName().c_str(),
307bc2ed2b3Sopenharmony_ci            element.GetAbilityName().c_str());
308bc2ed2b3Sopenharmony_ci        return;
309bc2ed2b3Sopenharmony_ci    }
310bc2ed2b3Sopenharmony_ci
311bc2ed2b3Sopenharmony_ci    TagAppTechInfo tagAppTechInfo;
312bc2ed2b3Sopenharmony_ci    tagAppTechInfo.element = element;
313bc2ed2b3Sopenharmony_ci    tagAppTechInfo.tech = valueList;
314bc2ed2b3Sopenharmony_ci    g_tagAppAndTechMap.push_back(tagAppTechInfo);
315bc2ed2b3Sopenharmony_ci    DebugLog("UpdateTagAppList, push for app %{public}s %{public}s", element.GetBundleName().c_str(),
316bc2ed2b3Sopenharmony_ci        element.GetAbilityName().c_str());
317bc2ed2b3Sopenharmony_ci}
318bc2ed2b3Sopenharmony_ci
319bc2ed2b3Sopenharmony_civoid AppDataParser::UpdateHceAppList(AbilityInfo &abilityInfo, ElementName &element)
320bc2ed2b3Sopenharmony_ci{
321bc2ed2b3Sopenharmony_ci    if (!GetMatchedHceKeyElement(element).GetBundleName().empty()) {
322bc2ed2b3Sopenharmony_ci        WarnLog("UpdateHceAppList, rm duplicated app %{public}s", element.GetBundleName().c_str());
323bc2ed2b3Sopenharmony_ci        RemoveHceAppInfo(element);
324bc2ed2b3Sopenharmony_ci    }
325bc2ed2b3Sopenharmony_ci    std::vector<AidInfo> customDataAidList;
326bc2ed2b3Sopenharmony_ci    AidInfo customDataAid;
327bc2ed2b3Sopenharmony_ci    for (auto& data : abilityInfo.metadata) {
328bc2ed2b3Sopenharmony_ci        if ((KITS::KEY_PAYMENT_AID.compare(data.name) == 0) || (KITS::KEY_OHTER_AID.compare(data.name) == 0)) {
329bc2ed2b3Sopenharmony_ci            customDataAid.name = data.name;
330bc2ed2b3Sopenharmony_ci            customDataAid.value = data.value;
331bc2ed2b3Sopenharmony_ci            customDataAidList.emplace_back(customDataAid);
332bc2ed2b3Sopenharmony_ci            DebugLog("UpdateHceAppList from metadata, push aid %{public}s", data.value.c_str());
333bc2ed2b3Sopenharmony_ci        }
334bc2ed2b3Sopenharmony_ci    }
335bc2ed2b3Sopenharmony_ci    for (auto& data : abilityInfo.metaData.customizeData) {
336bc2ed2b3Sopenharmony_ci        if ((KITS::KEY_PAYMENT_AID.compare(data.name) == 0) || (KITS::KEY_OHTER_AID.compare(data.name) == 0)) {
337bc2ed2b3Sopenharmony_ci            customDataAid.name = data.name;
338bc2ed2b3Sopenharmony_ci            customDataAid.value = data.value;
339bc2ed2b3Sopenharmony_ci            customDataAidList.emplace_back(customDataAid);
340bc2ed2b3Sopenharmony_ci            DebugLog("UpdateHceAppList from customizeData, push aid %{public}s", data.value.c_str());
341bc2ed2b3Sopenharmony_ci        }
342bc2ed2b3Sopenharmony_ci    }
343bc2ed2b3Sopenharmony_ci    if (customDataAidList.empty()) {
344bc2ed2b3Sopenharmony_ci        DebugLog("UpdateHceAppList, ignore for app %{public}s %{public}s", element.GetBundleName().c_str(),
345bc2ed2b3Sopenharmony_ci            element.GetAbilityName().c_str());
346bc2ed2b3Sopenharmony_ci        return;
347bc2ed2b3Sopenharmony_ci    }
348bc2ed2b3Sopenharmony_ci    HceAppAidInfo hceAppAidInfo;
349bc2ed2b3Sopenharmony_ci    hceAppAidInfo.element = element;
350bc2ed2b3Sopenharmony_ci    hceAppAidInfo.iconId = abilityInfo.iconId;
351bc2ed2b3Sopenharmony_ci    hceAppAidInfo.labelId = abilityInfo.labelId;
352bc2ed2b3Sopenharmony_ci    hceAppAidInfo.customDataAid = customDataAidList;
353bc2ed2b3Sopenharmony_ci    g_hceAppAndAidMap.push_back(hceAppAidInfo);
354bc2ed2b3Sopenharmony_ci    DebugLog("UpdateHceAppList, push for app %{public}s %{public}s", element.GetBundleName().c_str(),
355bc2ed2b3Sopenharmony_ci        element.GetAbilityName().c_str());
356bc2ed2b3Sopenharmony_ci}
357bc2ed2b3Sopenharmony_ci
358bc2ed2b3Sopenharmony_civoid AppDataParser::UpdateOffHostAppList(AbilityInfo &abilityInfo, ElementName &element)
359bc2ed2b3Sopenharmony_ci{
360bc2ed2b3Sopenharmony_ci    if (HaveMatchedOffHostKeyElement(element)) {
361bc2ed2b3Sopenharmony_ci        WarnLog("UpdateOffHostAppList, rm duplicated app %{public}s", element.GetBundleName().c_str());
362bc2ed2b3Sopenharmony_ci        RemoveOffHostAppInfo(element);
363bc2ed2b3Sopenharmony_ci    }
364bc2ed2b3Sopenharmony_ci    HceAppAidInfo offHostAppAidInfo;
365bc2ed2b3Sopenharmony_ci    offHostAppAidInfo.element = element;
366bc2ed2b3Sopenharmony_ci    offHostAppAidInfo.iconId = abilityInfo.iconId;
367bc2ed2b3Sopenharmony_ci    offHostAppAidInfo.labelId = abilityInfo.labelId;
368bc2ed2b3Sopenharmony_ci    g_offHostAppAndAidMap.push_back(offHostAppAidInfo);
369bc2ed2b3Sopenharmony_ci    DebugLog("UpdateOffHostAppList, push for app %{public}s %{public}s", element.GetBundleName().c_str(),
370bc2ed2b3Sopenharmony_ci        element.GetAbilityName().c_str());
371bc2ed2b3Sopenharmony_ci}
372bc2ed2b3Sopenharmony_ci
373bc2ed2b3Sopenharmony_cibool AppDataParser::HaveMatchedOffHostKeyElement(ElementName &element)
374bc2ed2b3Sopenharmony_ci{
375bc2ed2b3Sopenharmony_ci    std::vector<HceAppAidInfo>::iterator iter;
376bc2ed2b3Sopenharmony_ci    for (iter = g_offHostAppAndAidMap.begin(); iter != g_offHostAppAndAidMap.end(); ++iter) {
377bc2ed2b3Sopenharmony_ci        if (IsMatchedByBundleName(element, (*iter).element)) {
378bc2ed2b3Sopenharmony_ci            return true;
379bc2ed2b3Sopenharmony_ci        }
380bc2ed2b3Sopenharmony_ci    }
381bc2ed2b3Sopenharmony_ci    return false;
382bc2ed2b3Sopenharmony_ci}
383bc2ed2b3Sopenharmony_ci
384bc2ed2b3Sopenharmony_cibool AppDataParser::RemoveTagAppInfo(ElementName &element)
385bc2ed2b3Sopenharmony_ci{
386bc2ed2b3Sopenharmony_ci    ElementName keyElement = GetMatchedTagKeyElement(element);
387bc2ed2b3Sopenharmony_ci    if (keyElement.GetBundleName().empty()) {
388bc2ed2b3Sopenharmony_ci        WarnLog("RemoveTagAppInfo, keyElement is none, ignore it.");
389bc2ed2b3Sopenharmony_ci        return false;
390bc2ed2b3Sopenharmony_ci    }
391bc2ed2b3Sopenharmony_ci    DebugLog("RemoveTagAppInfo, request app %{public}s", keyElement.GetBundleName().c_str());
392bc2ed2b3Sopenharmony_ci    std::vector<TagAppTechInfo>::iterator iter;
393bc2ed2b3Sopenharmony_ci    for (iter = g_tagAppAndTechMap.begin(); iter != g_tagAppAndTechMap.end(); ++iter) {
394bc2ed2b3Sopenharmony_ci        // compare only bundle name to remote the app.
395bc2ed2b3Sopenharmony_ci        if (IsMatchedByBundleName(element, (*iter).element)) {
396bc2ed2b3Sopenharmony_ci            DebugLog("RemoveTagAppInfo, erase app %{public}s", keyElement.GetBundleName().c_str());
397bc2ed2b3Sopenharmony_ci            g_tagAppAndTechMap.erase(iter);
398bc2ed2b3Sopenharmony_ci            return true;
399bc2ed2b3Sopenharmony_ci        }
400bc2ed2b3Sopenharmony_ci    }
401bc2ed2b3Sopenharmony_ci    return false;
402bc2ed2b3Sopenharmony_ci}
403bc2ed2b3Sopenharmony_ci
404bc2ed2b3Sopenharmony_cibool AppDataParser::RemoveHceAppInfo(ElementName &element)
405bc2ed2b3Sopenharmony_ci{
406bc2ed2b3Sopenharmony_ci    ElementName keyElement = GetMatchedHceKeyElement(element);
407bc2ed2b3Sopenharmony_ci    if (keyElement.GetBundleName().empty()) {
408bc2ed2b3Sopenharmony_ci        WarnLog("RemoveHceAppInfo, keyElement is none, ignore it.");
409bc2ed2b3Sopenharmony_ci        return false;
410bc2ed2b3Sopenharmony_ci    }
411bc2ed2b3Sopenharmony_ci    DebugLog("RemoveHceAppInfo, app %{public}s", keyElement.GetBundleName().c_str());
412bc2ed2b3Sopenharmony_ci    std::vector<HceAppAidInfo>::iterator iter;
413bc2ed2b3Sopenharmony_ci    for (iter = g_hceAppAndAidMap.begin(); iter != g_hceAppAndAidMap.end(); ++iter) {
414bc2ed2b3Sopenharmony_ci        // compare only bundle name to remote the app.
415bc2ed2b3Sopenharmony_ci        if (IsMatchedByBundleName(element, (*iter).element)) {
416bc2ed2b3Sopenharmony_ci            DebugLog("RemoveHceAppInfo, erase app %{public}s", keyElement.GetBundleName().c_str());
417bc2ed2b3Sopenharmony_ci            g_hceAppAndAidMap.erase(iter);
418bc2ed2b3Sopenharmony_ci            return true;
419bc2ed2b3Sopenharmony_ci        }
420bc2ed2b3Sopenharmony_ci    }
421bc2ed2b3Sopenharmony_ci    return false;
422bc2ed2b3Sopenharmony_ci}
423bc2ed2b3Sopenharmony_ci
424bc2ed2b3Sopenharmony_cibool AppDataParser::RemoveOffHostAppInfo(ElementName &element)
425bc2ed2b3Sopenharmony_ci{
426bc2ed2b3Sopenharmony_ci    if (!HaveMatchedOffHostKeyElement(element)) {
427bc2ed2b3Sopenharmony_ci        WarnLog("RemoveOffHostAppInfo, keyElement is none, ignore it.");
428bc2ed2b3Sopenharmony_ci        return false;
429bc2ed2b3Sopenharmony_ci    }
430bc2ed2b3Sopenharmony_ci
431bc2ed2b3Sopenharmony_ci    DebugLog("RemoveOffHostAppInfo, app %{public}s", element.GetBundleName().c_str());
432bc2ed2b3Sopenharmony_ci    std::vector<HceAppAidInfo>::iterator iter;
433bc2ed2b3Sopenharmony_ci    for (iter = g_offHostAppAndAidMap.begin(); iter != g_offHostAppAndAidMap.end(); ++iter) {
434bc2ed2b3Sopenharmony_ci        // compare only bundle name to remote the app.
435bc2ed2b3Sopenharmony_ci        if (IsMatchedByBundleName(element, (*iter).element)) {
436bc2ed2b3Sopenharmony_ci            DebugLog("RemoveOffHostAppInfo, erase app %{public}s", element.GetBundleName().c_str());
437bc2ed2b3Sopenharmony_ci            g_offHostAppAndAidMap.erase(iter);
438bc2ed2b3Sopenharmony_ci            return true;
439bc2ed2b3Sopenharmony_ci        }
440bc2ed2b3Sopenharmony_ci    }
441bc2ed2b3Sopenharmony_ci    return false;
442bc2ed2b3Sopenharmony_ci}
443bc2ed2b3Sopenharmony_ci
444bc2ed2b3Sopenharmony_civoid AppDataParser::InitAppList()
445bc2ed2b3Sopenharmony_ci{
446bc2ed2b3Sopenharmony_ci    std::lock_guard<std::mutex> lock(g_appListInitMutex);
447bc2ed2b3Sopenharmony_ci    if (appListInitDone_) {
448bc2ed2b3Sopenharmony_ci        WarnLog("InitAppList: already done");
449bc2ed2b3Sopenharmony_ci        return;
450bc2ed2b3Sopenharmony_ci    }
451bc2ed2b3Sopenharmony_ci    sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = GetBundleMgrProxy();
452bc2ed2b3Sopenharmony_ci    if (!bundleMgrProxy) {
453bc2ed2b3Sopenharmony_ci        ErrorLog("InitAppList, bundleMgrProxy is nullptr.");
454bc2ed2b3Sopenharmony_ci        appListInitDone_ = false;
455bc2ed2b3Sopenharmony_ci        return;
456bc2ed2b3Sopenharmony_ci    }
457bc2ed2b3Sopenharmony_ci    InfoLog("InitAppListByAction start");
458bc2ed2b3Sopenharmony_ci    InitAppListByAction(KITS::ACTION_TAG_FOUND);
459bc2ed2b3Sopenharmony_ci    InitAppListByAction(KITS::ACTION_HOST_APDU_SERVICE);
460bc2ed2b3Sopenharmony_ci    InitAppListByAction(KITS::ACTION_OFF_HOST_APDU_SERVICE);
461bc2ed2b3Sopenharmony_ci    InfoLog("InitAppList, tag size %{public}zu, hce size %{public}zu, off host app  %{public}zu",
462bc2ed2b3Sopenharmony_ci            g_tagAppAndTechMap.size(), g_hceAppAndAidMap.size(), g_offHostAppAndAidMap.size());
463bc2ed2b3Sopenharmony_ci    appListInitDone_ = true;
464bc2ed2b3Sopenharmony_ci}
465bc2ed2b3Sopenharmony_ci
466bc2ed2b3Sopenharmony_cistd::vector<ElementName> AppDataParser::GetDispatchTagAppsByTech(std::vector<int> discTechList)
467bc2ed2b3Sopenharmony_ci{
468bc2ed2b3Sopenharmony_ci    std::vector<ElementName> elements;
469bc2ed2b3Sopenharmony_ci    for (size_t i = 0; i < discTechList.size(); i++) {
470bc2ed2b3Sopenharmony_ci        std::string discStrTech = KITS::TagInfo::GetStringTech(discTechList[i]);
471bc2ed2b3Sopenharmony_ci        DebugLog("GetDispatchTagAppsByTech, tag size = %{public}zu", g_tagAppAndTechMap.size());
472bc2ed2b3Sopenharmony_ci        if (discStrTech.empty()) {
473bc2ed2b3Sopenharmony_ci            continue;
474bc2ed2b3Sopenharmony_ci        }
475bc2ed2b3Sopenharmony_ci
476bc2ed2b3Sopenharmony_ci        // parse for all installed app that can handle this technology.
477bc2ed2b3Sopenharmony_ci        std::vector<TagAppTechInfo>::iterator iter;
478bc2ed2b3Sopenharmony_ci        for (iter = g_tagAppAndTechMap.begin(); iter != g_tagAppAndTechMap.end(); ++iter) {
479bc2ed2b3Sopenharmony_ci            bool appExisted = false;
480bc2ed2b3Sopenharmony_ci            for (auto item : elements) {
481bc2ed2b3Sopenharmony_ci                if (IsMatchedByBundleName(item, (*iter).element)) {
482bc2ed2b3Sopenharmony_ci                    appExisted = true;
483bc2ed2b3Sopenharmony_ci                    break;
484bc2ed2b3Sopenharmony_ci                }
485bc2ed2b3Sopenharmony_ci            }
486bc2ed2b3Sopenharmony_ci            if (appExisted) {
487bc2ed2b3Sopenharmony_ci                continue;
488bc2ed2b3Sopenharmony_ci            }
489bc2ed2b3Sopenharmony_ci
490bc2ed2b3Sopenharmony_ci            std::vector<std::string> vectorTech = (*iter).tech;
491bc2ed2b3Sopenharmony_ci            for (size_t i = 0; i < vectorTech.size(); i++) {
492bc2ed2b3Sopenharmony_ci                DebugLog("GetDispatchTagAppsByTech, cmp tech %{public}s vs %{public}s",
493bc2ed2b3Sopenharmony_ci                    discStrTech.c_str(), vectorTech[i].c_str());
494bc2ed2b3Sopenharmony_ci                if (discStrTech.compare(vectorTech[i]) == 0) {
495bc2ed2b3Sopenharmony_ci                    elements.push_back((*iter).element);
496bc2ed2b3Sopenharmony_ci                    break;
497bc2ed2b3Sopenharmony_ci                }
498bc2ed2b3Sopenharmony_ci            }
499bc2ed2b3Sopenharmony_ci        }
500bc2ed2b3Sopenharmony_ci    }
501bc2ed2b3Sopenharmony_ci    return elements;
502bc2ed2b3Sopenharmony_ci}
503bc2ed2b3Sopenharmony_ci
504bc2ed2b3Sopenharmony_ci#ifdef VENDOR_APPLICATIONS_ENABLED
505bc2ed2b3Sopenharmony_cistd::vector<ElementName> AppDataParser::GetVendorDispatchTagAppsByTech(std::vector<int>& discTechList)
506bc2ed2b3Sopenharmony_ci{
507bc2ed2b3Sopenharmony_ci    std::vector<ElementName> elements {};
508bc2ed2b3Sopenharmony_ci    std::vector<AAFwk::Want> hceAppList {};
509bc2ed2b3Sopenharmony_ci    if (queryApplicationByVendor_ == nullptr) {
510bc2ed2b3Sopenharmony_ci        ErrorLog("AppDataParser::GetVendorDispatchTagAppsByTech queryApplicationByVendor_ is nullptr.");
511bc2ed2b3Sopenharmony_ci        return std::vector<ElementName>();
512bc2ed2b3Sopenharmony_ci    }
513bc2ed2b3Sopenharmony_ci    queryApplicationByVendor_->OnQueryAppInfo(KEY_TAG_APP, discTechList, hceAppList, elements);
514bc2ed2b3Sopenharmony_ci    return elements;
515bc2ed2b3Sopenharmony_ci}
516bc2ed2b3Sopenharmony_ci
517bc2ed2b3Sopenharmony_civoid AppDataParser::RegQueryApplicationCb(sptr<IQueryAppInfoCallback> callback)
518bc2ed2b3Sopenharmony_ci{
519bc2ed2b3Sopenharmony_ci    queryApplicationByVendor_ = callback;
520bc2ed2b3Sopenharmony_ci}
521bc2ed2b3Sopenharmony_ci
522bc2ed2b3Sopenharmony_civoid AppDataParser::RegCardEmulationNotifyCb(sptr<IOnCardEmulationNotifyCb> callback)
523bc2ed2b3Sopenharmony_ci{
524bc2ed2b3Sopenharmony_ci    onCardEmulationNotify_ = callback;
525bc2ed2b3Sopenharmony_ci}
526bc2ed2b3Sopenharmony_ci
527bc2ed2b3Sopenharmony_cisptr<IOnCardEmulationNotifyCb> AppDataParser::GetNotifyCardEmulationCallback() const
528bc2ed2b3Sopenharmony_ci{
529bc2ed2b3Sopenharmony_ci    return onCardEmulationNotify_;
530bc2ed2b3Sopenharmony_ci}
531bc2ed2b3Sopenharmony_ci#endif
532bc2ed2b3Sopenharmony_ci
533bc2ed2b3Sopenharmony_civoid AppDataParser::GetHceAppsByAid(const std::string& aid, std::vector<AppDataParser::HceAppAidInfo>& hceApps)
534bc2ed2b3Sopenharmony_ci{
535bc2ed2b3Sopenharmony_ci    for (const HceAppAidInfo& appAidInfo : g_hceAppAndAidMap) {
536bc2ed2b3Sopenharmony_ci        for (const AidInfo& aidInfo : appAidInfo.customDataAid) {
537bc2ed2b3Sopenharmony_ci            if (aid == aidInfo.value) {
538bc2ed2b3Sopenharmony_ci                hceApps.push_back(appAidInfo);
539bc2ed2b3Sopenharmony_ci                break;
540bc2ed2b3Sopenharmony_ci            }
541bc2ed2b3Sopenharmony_ci        }
542bc2ed2b3Sopenharmony_ci    }
543bc2ed2b3Sopenharmony_ci}
544bc2ed2b3Sopenharmony_ci
545bc2ed2b3Sopenharmony_ci#ifdef VENDOR_APPLICATIONS_ENABLED
546bc2ed2b3Sopenharmony_civoid AppDataParser::GetHceAppsFromVendor(std::vector<HceAppAidInfo> &hceApps)
547bc2ed2b3Sopenharmony_ci{
548bc2ed2b3Sopenharmony_ci    if (queryApplicationByVendor_ == nullptr) {
549bc2ed2b3Sopenharmony_ci        WarnLog("AppDataParser::GetHceApps queryApplicationByVendor_ is nullptr.");
550bc2ed2b3Sopenharmony_ci        return;
551bc2ed2b3Sopenharmony_ci    }
552bc2ed2b3Sopenharmony_ci    std::vector<int> techList {};
553bc2ed2b3Sopenharmony_ci    std::vector<AAFwk::Want> vendorHceAppAndAidList {};
554bc2ed2b3Sopenharmony_ci    std::vector<AppExecFwk::ElementName> elementNameList {};
555bc2ed2b3Sopenharmony_ci    queryApplicationByVendor_->OnQueryAppInfo(KEY_HCE_APP, techList, vendorHceAppAndAidList, elementNameList);
556bc2ed2b3Sopenharmony_ci    if (vendorHceAppAndAidList.size() != 0) {
557bc2ed2b3Sopenharmony_ci        for (auto appAidInfoWant : vendorHceAppAndAidList) {
558bc2ed2b3Sopenharmony_ci            std::shared_ptr<HceAppAidInfo> appAidInfo = std::make_shared<HceAppAidInfo>();
559bc2ed2b3Sopenharmony_ci            appAidInfo->element = appAidInfoWant.GetElement();
560bc2ed2b3Sopenharmony_ci            const std::string KEY_OTHER_AID = "other-aid";
561bc2ed2b3Sopenharmony_ci            const std::string KEY_PAYMENT_AID = "payment-aid";
562bc2ed2b3Sopenharmony_ci            std::vector<std::string> otherAidList = appAidInfoWant.GetStringArrayParam(KEY_OTHER_AID);
563bc2ed2b3Sopenharmony_ci            std::vector<std::string> paymentAidList = appAidInfoWant.GetStringArrayParam(KEY_PAYMENT_AID);
564bc2ed2b3Sopenharmony_ci            for (std::string otherAid : otherAidList) {
565bc2ed2b3Sopenharmony_ci                std::shared_ptr<AidInfo> aidInfo = std::make_shared<AidInfo>();
566bc2ed2b3Sopenharmony_ci                aidInfo->name = KEY_OTHER_AID;
567bc2ed2b3Sopenharmony_ci                aidInfo->value = otherAid;
568bc2ed2b3Sopenharmony_ci                appAidInfo->customDataAid.push_back(*aidInfo);
569bc2ed2b3Sopenharmony_ci            }
570bc2ed2b3Sopenharmony_ci            for (std::string paymentAid : paymentAidList) {
571bc2ed2b3Sopenharmony_ci                std::shared_ptr<AidInfo> aidInfo = std::make_shared<AidInfo>();
572bc2ed2b3Sopenharmony_ci                aidInfo->name = KEY_PAYMENT_AID;
573bc2ed2b3Sopenharmony_ci                aidInfo->value = paymentAid;
574bc2ed2b3Sopenharmony_ci                appAidInfo->customDataAid.push_back(*aidInfo);
575bc2ed2b3Sopenharmony_ci            }
576bc2ed2b3Sopenharmony_ci            hceApps.push_back(*appAidInfo);
577bc2ed2b3Sopenharmony_ci        }
578bc2ed2b3Sopenharmony_ci    }
579bc2ed2b3Sopenharmony_ci}
580bc2ed2b3Sopenharmony_ci
581bc2ed2b3Sopenharmony_civoid AppDataParser::GetPaymentAbilityInfosFromVendor(std::vector<AbilityInfo> &paymentAbilityInfos)
582bc2ed2b3Sopenharmony_ci{
583bc2ed2b3Sopenharmony_ci    std::vector<HceAppAidInfo> hceApps;
584bc2ed2b3Sopenharmony_ci    std::set<std::string> bundleNames;
585bc2ed2b3Sopenharmony_ci    GetHceAppsFromVendor(hceApps);
586bc2ed2b3Sopenharmony_ci    DebugLog("The hceApps len %{public}lu", hceApps.size());
587bc2ed2b3Sopenharmony_ci    sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = GetBundleMgrProxy();
588bc2ed2b3Sopenharmony_ci    if (bundleMgrProxy == nullptr) {
589bc2ed2b3Sopenharmony_ci        ErrorLog("bundleMgrProxy is nullptr!");
590bc2ed2b3Sopenharmony_ci        return;
591bc2ed2b3Sopenharmony_ci    }
592bc2ed2b3Sopenharmony_ci    for (auto& appAidInfo : hceApps) {
593bc2ed2b3Sopenharmony_ci        DebugLog("The bundlename : %{public}s", appAidInfo.element.GetBundleName().c_str());
594bc2ed2b3Sopenharmony_ci        if (appAidInfo.element.GetBundleName().empty() || !IsPaymentApp(appAidInfo)) {
595bc2ed2b3Sopenharmony_ci            continue;
596bc2ed2b3Sopenharmony_ci        }
597bc2ed2b3Sopenharmony_ci        if (bundleNames.count(appAidInfo.element.GetBundleName()) > 0) {
598bc2ed2b3Sopenharmony_ci            DebugLog("The bundlename : %{public}s is in the bundleNames", appAidInfo.element.GetBundleName().c_str());
599bc2ed2b3Sopenharmony_ci            continue;
600bc2ed2b3Sopenharmony_ci        }
601bc2ed2b3Sopenharmony_ci        bundleNames.insert(appAidInfo.element.GetBundleName());
602bc2ed2b3Sopenharmony_ci        AbilityInfo ability;
603bc2ed2b3Sopenharmony_ci        ability.name = appAidInfo.element.GetAbilityName();
604bc2ed2b3Sopenharmony_ci        ability.bundleName = appAidInfo.element.GetBundleName();
605bc2ed2b3Sopenharmony_ci        AppExecFwk::BundleInfo bundleInfo{};
606bc2ed2b3Sopenharmony_ci        int32_t bundleInfoFlag = static_cast<int32_t>(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY) |
607bc2ed2b3Sopenharmony_ci                                 static_cast<int32_t>(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) |
608bc2ed2b3Sopenharmony_ci                                 static_cast<int32_t>(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION);
609bc2ed2b3Sopenharmony_ci        if (bundleMgrProxy == nullptr) {
610bc2ed2b3Sopenharmony_ci            ErrorLog("bundleMgrProxy is nullptr!");
611bc2ed2b3Sopenharmony_ci            break;
612bc2ed2b3Sopenharmony_ci        }
613bc2ed2b3Sopenharmony_ci        bundleMgrProxy->GetBundleInfoV9(
614bc2ed2b3Sopenharmony_ci            ability.bundleName, bundleInfoFlag, bundleInfo, AppExecFwk::Constants::START_USERID);
615bc2ed2b3Sopenharmony_ci        DebugLog("The bundlename : %{public}s,the labelId : %{public}d,the iconId : %{public}d",
616bc2ed2b3Sopenharmony_ci            appAidInfo.element.GetBundleName().c_str(),
617bc2ed2b3Sopenharmony_ci            bundleInfo.applicationInfo.labelId,
618bc2ed2b3Sopenharmony_ci            bundleInfo.applicationInfo.iconId);
619bc2ed2b3Sopenharmony_ci        if (bundleInfo.applicationInfo.labelId != 0 && bundleInfo.applicationInfo.iconId != 0) {
620bc2ed2b3Sopenharmony_ci            ability.labelId = bundleInfo.applicationInfo.labelId;
621bc2ed2b3Sopenharmony_ci            ability.iconId = bundleInfo.applicationInfo.iconId;
622bc2ed2b3Sopenharmony_ci            paymentAbilityInfos.push_back(ability);
623bc2ed2b3Sopenharmony_ci        }
624bc2ed2b3Sopenharmony_ci    }
625bc2ed2b3Sopenharmony_ci}
626bc2ed2b3Sopenharmony_ci
627bc2ed2b3Sopenharmony_cibool AppDataParser::IsHceAppFromVendor(const ElementName &elementName)
628bc2ed2b3Sopenharmony_ci{
629bc2ed2b3Sopenharmony_ci    std::vector<HceAppAidInfo> hceApps;
630bc2ed2b3Sopenharmony_ci    GetHceAppsFromVendor(hceApps);
631bc2ed2b3Sopenharmony_ci    for (auto &app : hceApps) {
632bc2ed2b3Sopenharmony_ci        if (app.element.GetBundleName() == elementName.GetBundleName() &&
633bc2ed2b3Sopenharmony_ci            app.element.GetAbilityName() == elementName.GetAbilityName()) {
634bc2ed2b3Sopenharmony_ci            return true;
635bc2ed2b3Sopenharmony_ci        }
636bc2ed2b3Sopenharmony_ci    }
637bc2ed2b3Sopenharmony_ci    return false;
638bc2ed2b3Sopenharmony_ci}
639bc2ed2b3Sopenharmony_ci#endif
640bc2ed2b3Sopenharmony_cibool AppDataParser::IsBundleInstalled(const std::string &bundleName)
641bc2ed2b3Sopenharmony_ci{
642bc2ed2b3Sopenharmony_ci    sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = GetBundleMgrProxy();
643bc2ed2b3Sopenharmony_ci    if (bundleMgrProxy == nullptr) {
644bc2ed2b3Sopenharmony_ci        ErrorLog("bundleMgrProxy is nullptr!");
645bc2ed2b3Sopenharmony_ci        return false;
646bc2ed2b3Sopenharmony_ci    }
647bc2ed2b3Sopenharmony_ci    if (bundleName.empty()) {
648bc2ed2b3Sopenharmony_ci        ErrorLog("bundle name is empty");
649bc2ed2b3Sopenharmony_ci        return false;
650bc2ed2b3Sopenharmony_ci    }
651bc2ed2b3Sopenharmony_ci    AppExecFwk::BundleInfo bundleInfo;
652bc2ed2b3Sopenharmony_ci    bool result = bundleMgrProxy->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT,
653bc2ed2b3Sopenharmony_ci                                                bundleInfo, USER_ID);
654bc2ed2b3Sopenharmony_ci    ErrorLog("get bundle %{public}s result %{public}d ", bundleName.c_str(), result);
655bc2ed2b3Sopenharmony_ci    return result;
656bc2ed2b3Sopenharmony_ci}
657bc2ed2b3Sopenharmony_civoid AppDataParser::GetHceApps(std::vector<HceAppAidInfo> &hceApps)
658bc2ed2b3Sopenharmony_ci{
659bc2ed2b3Sopenharmony_ci    for (const HceAppAidInfo &appAidInfo : g_hceAppAndAidMap) {
660bc2ed2b3Sopenharmony_ci        hceApps.push_back(appAidInfo);
661bc2ed2b3Sopenharmony_ci    }
662bc2ed2b3Sopenharmony_ci#ifdef VENDOR_APPLICATIONS_ENABLED
663bc2ed2b3Sopenharmony_ci    GetHceAppsFromVendor(hceApps);
664bc2ed2b3Sopenharmony_ci#endif
665bc2ed2b3Sopenharmony_ci}
666bc2ed2b3Sopenharmony_ci
667bc2ed2b3Sopenharmony_cibool AppDataParser::IsPaymentApp(const AppDataParser::HceAppAidInfo &hceAppInfo)
668bc2ed2b3Sopenharmony_ci{
669bc2ed2b3Sopenharmony_ci    for (const AppDataParser::AidInfo &aidInfo : hceAppInfo.customDataAid) {
670bc2ed2b3Sopenharmony_ci        if (KITS::KEY_PAYMENT_AID == aidInfo.name) {
671bc2ed2b3Sopenharmony_ci            return true;
672bc2ed2b3Sopenharmony_ci        }
673bc2ed2b3Sopenharmony_ci    }
674bc2ed2b3Sopenharmony_ci    return false;
675bc2ed2b3Sopenharmony_ci}
676bc2ed2b3Sopenharmony_ci
677bc2ed2b3Sopenharmony_cibool AppDataParser::IsHceApp(const ElementName &elementName)
678bc2ed2b3Sopenharmony_ci{
679bc2ed2b3Sopenharmony_ci    for (const AppDataParser::HceAppAidInfo &appAidInfo : g_hceAppAndAidMap) {
680bc2ed2b3Sopenharmony_ci        if (appAidInfo.element.GetBundleName() == elementName.GetBundleName() &&
681bc2ed2b3Sopenharmony_ci            appAidInfo.element.GetAbilityName() == elementName.GetAbilityName()) {
682bc2ed2b3Sopenharmony_ci            return true;
683bc2ed2b3Sopenharmony_ci        }
684bc2ed2b3Sopenharmony_ci    }
685bc2ed2b3Sopenharmony_ci#ifdef VENDOR_APPLICATIONS_ENABLED
686bc2ed2b3Sopenharmony_ci    return IsHceAppFromVendor(elementName);
687bc2ed2b3Sopenharmony_ci#else
688bc2ed2b3Sopenharmony_ci    return false;
689bc2ed2b3Sopenharmony_ci#endif
690bc2ed2b3Sopenharmony_ci}
691bc2ed2b3Sopenharmony_ci
692bc2ed2b3Sopenharmony_civoid AppDataParser::GetPaymentAbilityInfos(std::vector<AbilityInfo> &paymentAbilityInfos)
693bc2ed2b3Sopenharmony_ci{
694bc2ed2b3Sopenharmony_ci    if (!appListInitDone_) {
695bc2ed2b3Sopenharmony_ci        InfoLog("bundleMgr is null, try to init again.");
696bc2ed2b3Sopenharmony_ci        InitAppList();
697bc2ed2b3Sopenharmony_ci    }
698bc2ed2b3Sopenharmony_ci    for (const AppDataParser::HceAppAidInfo &appAidInfo : g_hceAppAndAidMap) {
699bc2ed2b3Sopenharmony_ci        if (!IsPaymentApp(appAidInfo)) {
700bc2ed2b3Sopenharmony_ci            continue;
701bc2ed2b3Sopenharmony_ci        }
702bc2ed2b3Sopenharmony_ci        AbilityInfo ability;
703bc2ed2b3Sopenharmony_ci        ability.name = appAidInfo.element.GetAbilityName();
704bc2ed2b3Sopenharmony_ci        ability.bundleName = appAidInfo.element.GetBundleName();
705bc2ed2b3Sopenharmony_ci        ability.labelId = appAidInfo.labelId;
706bc2ed2b3Sopenharmony_ci        ability.iconId = appAidInfo.iconId;
707bc2ed2b3Sopenharmony_ci        InfoLog("The bundlename : %{public}s,the labelId : %{public}d,the iconId : %{public}d",
708bc2ed2b3Sopenharmony_ci                ability.bundleName.c_str(), ability.labelId, ability.iconId);
709bc2ed2b3Sopenharmony_ci        paymentAbilityInfos.push_back(ability);
710bc2ed2b3Sopenharmony_ci    }
711bc2ed2b3Sopenharmony_ci
712bc2ed2b3Sopenharmony_ci    for (const AppDataParser::HceAppAidInfo &appAidInfo : g_offHostAppAndAidMap) {
713bc2ed2b3Sopenharmony_ci        AbilityInfo ability;
714bc2ed2b3Sopenharmony_ci        ability.name = appAidInfo.element.GetAbilityName();
715bc2ed2b3Sopenharmony_ci        ability.bundleName = appAidInfo.element.GetBundleName();
716bc2ed2b3Sopenharmony_ci        ability.labelId = appAidInfo.labelId;
717bc2ed2b3Sopenharmony_ci        ability.iconId = appAidInfo.iconId;
718bc2ed2b3Sopenharmony_ci        InfoLog("The bundlename : %{public}s,the labelId : %{public}d,the iconId : %{public}d",
719bc2ed2b3Sopenharmony_ci                ability.bundleName.c_str(), ability.labelId, ability.iconId);
720bc2ed2b3Sopenharmony_ci        paymentAbilityInfos.push_back(ability);
721bc2ed2b3Sopenharmony_ci    }
722bc2ed2b3Sopenharmony_ci#ifdef VENDOR_APPLICATIONS_ENABLED
723bc2ed2b3Sopenharmony_ci    GetPaymentAbilityInfosFromVendor(paymentAbilityInfos);
724bc2ed2b3Sopenharmony_ci#endif
725bc2ed2b3Sopenharmony_ci}
726bc2ed2b3Sopenharmony_ci
727bc2ed2b3Sopenharmony_cibool AppDataParser::GetBundleInfo(AppExecFwk::BundleInfo &bundleInfo, const std::string &bundleName)
728bc2ed2b3Sopenharmony_ci{
729bc2ed2b3Sopenharmony_ci    if (bundleName.empty()) {
730bc2ed2b3Sopenharmony_ci        InfoLog("sim bundle name is empty.");
731bc2ed2b3Sopenharmony_ci        return false;
732bc2ed2b3Sopenharmony_ci    }
733bc2ed2b3Sopenharmony_ci    sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = GetBundleMgrProxy();
734bc2ed2b3Sopenharmony_ci    if (bundleMgrProxy == nullptr) {
735bc2ed2b3Sopenharmony_ci        ErrorLog("bundleMgrProxy is nullptr.");
736bc2ed2b3Sopenharmony_ci        return false;
737bc2ed2b3Sopenharmony_ci    }
738bc2ed2b3Sopenharmony_ci    bool result = bundleMgrProxy->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT,
739bc2ed2b3Sopenharmony_ci                                                bundleInfo, USER_ID);
740bc2ed2b3Sopenharmony_ci    InfoLog("get bundle %{public}s result %{public}d ", bundleName.c_str(), result);
741bc2ed2b3Sopenharmony_ci    if (!result) {
742bc2ed2b3Sopenharmony_ci        ErrorLog("get bundle %{public}s failed ", bundleName.c_str());
743bc2ed2b3Sopenharmony_ci        return false;
744bc2ed2b3Sopenharmony_ci    }
745bc2ed2b3Sopenharmony_ci    return true;
746bc2ed2b3Sopenharmony_ci}
747bc2ed2b3Sopenharmony_ci
748bc2ed2b3Sopenharmony_cibool AppDataParser::IsSystemApp(uint32_t uid)
749bc2ed2b3Sopenharmony_ci{
750bc2ed2b3Sopenharmony_ci    sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = GetBundleMgrProxy();
751bc2ed2b3Sopenharmony_ci    if (bundleMgrProxy == nullptr) {
752bc2ed2b3Sopenharmony_ci        ErrorLog(" bundleMgrProxy is nullptr.");
753bc2ed2b3Sopenharmony_ci        return false;
754bc2ed2b3Sopenharmony_ci    }
755bc2ed2b3Sopenharmony_ci    return bundleMgrProxy->CheckIsSystemAppByUid(uid);
756bc2ed2b3Sopenharmony_ci}
757bc2ed2b3Sopenharmony_ci
758bc2ed2b3Sopenharmony_cistd::string AppDataParser::GetBundleNameByUid(uint32_t uid)
759bc2ed2b3Sopenharmony_ci{
760bc2ed2b3Sopenharmony_ci    auto bundleMgr = GetBundleMgrProxy();
761bc2ed2b3Sopenharmony_ci    if (bundleMgr == nullptr) {
762bc2ed2b3Sopenharmony_ci        ErrorLog("bundleMgr is nullptr.");
763bc2ed2b3Sopenharmony_ci        return std::string();
764bc2ed2b3Sopenharmony_ci    }
765bc2ed2b3Sopenharmony_ci    std::string bundleName;
766bc2ed2b3Sopenharmony_ci    int ret = bundleMgr->GetNameForUid(uid, bundleName);
767bc2ed2b3Sopenharmony_ci    if (ret == ERR_OK) {
768bc2ed2b3Sopenharmony_ci        return bundleName;
769bc2ed2b3Sopenharmony_ci    } else {
770bc2ed2b3Sopenharmony_ci        ErrorLog("GetNameForUid failed, ret = %{public}d.", ret);
771bc2ed2b3Sopenharmony_ci        return std::string();
772bc2ed2b3Sopenharmony_ci    }
773bc2ed2b3Sopenharmony_ci}
774bc2ed2b3Sopenharmony_ci} // namespace NFC
775bc2ed2b3Sopenharmony_ci} // namespace OHOS
776