1bc2ed2b3Sopenharmony_ci/*
2bc2ed2b3Sopenharmony_ci * Copyright (C) 2023-2023 Huawei Device 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 "ce_service.h"
16bc2ed2b3Sopenharmony_ci#include "nfc_event_publisher.h"
17bc2ed2b3Sopenharmony_ci#include "nfc_event_handler.h"
18bc2ed2b3Sopenharmony_ci#include "external_deps_proxy.h"
19bc2ed2b3Sopenharmony_ci#include "loghelper.h"
20bc2ed2b3Sopenharmony_ci#include "nfc_sdk_common.h"
21bc2ed2b3Sopenharmony_ci#include "setting_data_share_impl.h"
22bc2ed2b3Sopenharmony_ci#include "accesstoken_kit.h"
23bc2ed2b3Sopenharmony_ci#include "hap_token_info.h"
24bc2ed2b3Sopenharmony_ci
25bc2ed2b3Sopenharmony_cinamespace OHOS {
26bc2ed2b3Sopenharmony_cinamespace NFC {
27bc2ed2b3Sopenharmony_ciconst int FIELD_COMMON_EVENT_INTERVAL = 1000;
28bc2ed2b3Sopenharmony_ciconst int DEACTIVATE_TIMEOUT = 6000;
29bc2ed2b3Sopenharmony_cistatic const int DEFAULT_HOST_ROUTE_DEST = 0x00;
30bc2ed2b3Sopenharmony_cistatic const int PWR_STA_SWTCH_ON_SCRN_UNLCK = 0x01;
31bc2ed2b3Sopenharmony_cistatic const int DEFAULT_PWR_STA_HOST = PWR_STA_SWTCH_ON_SCRN_UNLCK;
32bc2ed2b3Sopenharmony_ciconst std::string APP_REMOVED = "app_removed";
33bc2ed2b3Sopenharmony_ciconst std::string APP_ADDED = "app_added";
34bc2ed2b3Sopenharmony_cistd::mutex g_defaultPaymentAppInitMutex = {};
35bc2ed2b3Sopenharmony_ci
36bc2ed2b3Sopenharmony_ciCeService::CeService(std::weak_ptr<NfcService> nfcService, std::weak_ptr<NCI::INciCeInterface> nciCeProxy)
37bc2ed2b3Sopenharmony_ci    : nfcService_(nfcService), nciCeProxy_(nciCeProxy)
38bc2ed2b3Sopenharmony_ci
39bc2ed2b3Sopenharmony_ci{
40bc2ed2b3Sopenharmony_ci    Uri nfcDefaultPaymentApp(KITS::NFC_DATA_URI_PAYMENT_DEFAULT_APP);
41bc2ed2b3Sopenharmony_ci    DelayedSingleton<SettingDataShareImpl>::GetInstance()->GetElementName(
42bc2ed2b3Sopenharmony_ci        nfcDefaultPaymentApp, KITS::DATA_SHARE_KEY_NFC_PAYMENT_DEFAULT_APP, defaultPaymentElement_);
43bc2ed2b3Sopenharmony_ci
44bc2ed2b3Sopenharmony_ci    appStateObserver_ = std::make_shared<AppStateObserver>(this);
45bc2ed2b3Sopenharmony_ci    DebugLog("CeService constructor end");
46bc2ed2b3Sopenharmony_ci}
47bc2ed2b3Sopenharmony_ci
48bc2ed2b3Sopenharmony_ciCeService::~CeService()
49bc2ed2b3Sopenharmony_ci{
50bc2ed2b3Sopenharmony_ci    hostCardEmulationManager_ = nullptr;
51bc2ed2b3Sopenharmony_ci    aidToAidEntry_.clear();
52bc2ed2b3Sopenharmony_ci    foregroundElement_.SetBundleName("");
53bc2ed2b3Sopenharmony_ci    foregroundElement_.SetAbilityName("");
54bc2ed2b3Sopenharmony_ci    foregroundElement_.SetDeviceID("");
55bc2ed2b3Sopenharmony_ci    foregroundElement_.SetModuleName("");
56bc2ed2b3Sopenharmony_ci    defaultPaymentElement_.SetBundleName("");
57bc2ed2b3Sopenharmony_ci    defaultPaymentElement_.SetAbilityName("");
58bc2ed2b3Sopenharmony_ci    defaultPaymentElement_.SetDeviceID("");
59bc2ed2b3Sopenharmony_ci    defaultPaymentElement_.SetModuleName("");
60bc2ed2b3Sopenharmony_ci    initDefaultPaymentAppDone_ = false;
61bc2ed2b3Sopenharmony_ci    dynamicAids_.clear();
62bc2ed2b3Sopenharmony_ci    DebugLog("CeService deconstructor end");
63bc2ed2b3Sopenharmony_ci}
64bc2ed2b3Sopenharmony_ci
65bc2ed2b3Sopenharmony_civoid CeService::PublishFieldOnOrOffCommonEvent(bool isFieldOn)
66bc2ed2b3Sopenharmony_ci{
67bc2ed2b3Sopenharmony_ci    ExternalDepsProxy::GetInstance().PublishNfcFieldStateChanged(isFieldOn);
68bc2ed2b3Sopenharmony_ci}
69bc2ed2b3Sopenharmony_ci
70bc2ed2b3Sopenharmony_cibool CeService::RegHceCmdCallback(const sptr<KITS::IHceCmdCallback> &callback, const std::string &type,
71bc2ed2b3Sopenharmony_ci                                  Security::AccessToken::AccessTokenID callerToken)
72bc2ed2b3Sopenharmony_ci{
73bc2ed2b3Sopenharmony_ci    if (hostCardEmulationManager_ == nullptr) {
74bc2ed2b3Sopenharmony_ci        ErrorLog("hce is null");
75bc2ed2b3Sopenharmony_ci        return false;
76bc2ed2b3Sopenharmony_ci    }
77bc2ed2b3Sopenharmony_ci    return hostCardEmulationManager_->RegHceCmdCallback(callback, type, callerToken);
78bc2ed2b3Sopenharmony_ci}
79bc2ed2b3Sopenharmony_ci
80bc2ed2b3Sopenharmony_cibool CeService::UnRegHceCmdCallback(const std::string &type, Security::AccessToken::AccessTokenID callerToken)
81bc2ed2b3Sopenharmony_ci{
82bc2ed2b3Sopenharmony_ci    if (hostCardEmulationManager_ == nullptr) {
83bc2ed2b3Sopenharmony_ci        ErrorLog("hce is null");
84bc2ed2b3Sopenharmony_ci        return false;
85bc2ed2b3Sopenharmony_ci    }
86bc2ed2b3Sopenharmony_ci    return hostCardEmulationManager_->UnRegHceCmdCallback(type, callerToken);
87bc2ed2b3Sopenharmony_ci}
88bc2ed2b3Sopenharmony_ci
89bc2ed2b3Sopenharmony_cibool CeService::UnRegAllCallback(Security::AccessToken::AccessTokenID callerToken)
90bc2ed2b3Sopenharmony_ci{
91bc2ed2b3Sopenharmony_ci    if (hostCardEmulationManager_ == nullptr) {
92bc2ed2b3Sopenharmony_ci        ErrorLog("hce is null");
93bc2ed2b3Sopenharmony_ci        return false;
94bc2ed2b3Sopenharmony_ci    }
95bc2ed2b3Sopenharmony_ci    return hostCardEmulationManager_->UnRegAllCallback(callerToken);
96bc2ed2b3Sopenharmony_ci}
97bc2ed2b3Sopenharmony_ci
98bc2ed2b3Sopenharmony_cibool CeService::IsDefaultService(ElementName &element, const std::string &type)
99bc2ed2b3Sopenharmony_ci{
100bc2ed2b3Sopenharmony_ci    return type == KITS::TYPE_PAYMENT && element.GetBundleName() == defaultPaymentElement_.GetBundleName() &&
101bc2ed2b3Sopenharmony_ci           element.GetAbilityName() == defaultPaymentElement_.GetAbilityName();
102bc2ed2b3Sopenharmony_ci}
103bc2ed2b3Sopenharmony_ci
104bc2ed2b3Sopenharmony_cibool CeService::SendHostApduData(const std::string &hexCmdData, bool raw, std::string &hexRespData,
105bc2ed2b3Sopenharmony_ci                                 Security::AccessToken::AccessTokenID callerToken)
106bc2ed2b3Sopenharmony_ci{
107bc2ed2b3Sopenharmony_ci    if (hostCardEmulationManager_ == nullptr) {
108bc2ed2b3Sopenharmony_ci        ErrorLog("hce is null");
109bc2ed2b3Sopenharmony_ci        return false;
110bc2ed2b3Sopenharmony_ci    }
111bc2ed2b3Sopenharmony_ci    return hostCardEmulationManager_->SendHostApduData(hexCmdData, raw, hexRespData, callerToken);
112bc2ed2b3Sopenharmony_ci}
113bc2ed2b3Sopenharmony_ci
114bc2ed2b3Sopenharmony_cibool CeService::InitConfigAidRouting(bool forceUpdate)
115bc2ed2b3Sopenharmony_ci{
116bc2ed2b3Sopenharmony_ci    DebugLog("AddAidRoutingHceAids: start, forceUpdate is %{public}d", forceUpdate);
117bc2ed2b3Sopenharmony_ci    std::lock_guard<std::mutex> lock(configRoutingMutex_);
118bc2ed2b3Sopenharmony_ci    std::map<std::string, AidEntry> aidEntries;
119bc2ed2b3Sopenharmony_ci    BuildAidEntries(aidEntries);
120bc2ed2b3Sopenharmony_ci    InfoLog("AddAidRoutingHceAids, aid entries cache size %{public}zu,aid entries newly builded size %{public}zu",
121bc2ed2b3Sopenharmony_ci            aidToAidEntry_.size(), aidEntries.size());
122bc2ed2b3Sopenharmony_ci    if (aidEntries == aidToAidEntry_ && !forceUpdate) {
123bc2ed2b3Sopenharmony_ci        InfoLog("aid entries do not change.");
124bc2ed2b3Sopenharmony_ci        return false;
125bc2ed2b3Sopenharmony_ci    }
126bc2ed2b3Sopenharmony_ci
127bc2ed2b3Sopenharmony_ci    if (nciCeProxy_.expired()) {
128bc2ed2b3Sopenharmony_ci        ErrorLog("InitConfigAidRouting: nciCeProxy_ is nullptr.");
129bc2ed2b3Sopenharmony_ci        return false;
130bc2ed2b3Sopenharmony_ci    }
131bc2ed2b3Sopenharmony_ci    nciCeProxy_.lock()->ClearAidTable();
132bc2ed2b3Sopenharmony_ci    aidToAidEntry_.clear();
133bc2ed2b3Sopenharmony_ci    bool addAllResult = true;
134bc2ed2b3Sopenharmony_ci    for (const auto &pair : aidEntries) {
135bc2ed2b3Sopenharmony_ci        AidEntry entry = pair.second;
136bc2ed2b3Sopenharmony_ci        std::string aid = entry.aid;
137bc2ed2b3Sopenharmony_ci        int aidInfo = entry.aidInfo;
138bc2ed2b3Sopenharmony_ci        int power = entry.power;
139bc2ed2b3Sopenharmony_ci        int route = entry.route;
140bc2ed2b3Sopenharmony_ci        InfoLog("AddAidRoutingHceAids: aid= %{public}s, aidInfo= "
141bc2ed2b3Sopenharmony_ci                "0x%{public}x, route=0x%{public}x, power=0x%{public}x",
142bc2ed2b3Sopenharmony_ci                aid.c_str(), aidInfo, route, power);
143bc2ed2b3Sopenharmony_ci        bool addResult = nciCeProxy_.lock()->AddAidRouting(aid, route, aidInfo, power);
144bc2ed2b3Sopenharmony_ci        if (!addResult) {
145bc2ed2b3Sopenharmony_ci            ErrorLog("AddAidRoutingHceAids: add aid failed aid= %{public}s", aid.c_str());
146bc2ed2b3Sopenharmony_ci            addAllResult = false;
147bc2ed2b3Sopenharmony_ci        }
148bc2ed2b3Sopenharmony_ci    }
149bc2ed2b3Sopenharmony_ci    if (addAllResult) {
150bc2ed2b3Sopenharmony_ci        InfoLog("AddAidRoutingHceAids: add aids success, update the aid entries cache");
151bc2ed2b3Sopenharmony_ci        aidToAidEntry_ = std::move(aidEntries);
152bc2ed2b3Sopenharmony_ci    }
153bc2ed2b3Sopenharmony_ci    DebugLog("AddAidRoutingHceAids: end");
154bc2ed2b3Sopenharmony_ci    return true;
155bc2ed2b3Sopenharmony_ci}
156bc2ed2b3Sopenharmony_ci
157bc2ed2b3Sopenharmony_civoid CeService::HandleAppStateChanged(const std::string &bundleName, const std::string &abilityName,
158bc2ed2b3Sopenharmony_ci                                      int abilityState)
159bc2ed2b3Sopenharmony_ci{
160bc2ed2b3Sopenharmony_ci    if (bundleName.empty()) {
161bc2ed2b3Sopenharmony_ci        ErrorLog("OnForegroundApplicationChanged bundle name is empty.");
162bc2ed2b3Sopenharmony_ci        return;
163bc2ed2b3Sopenharmony_ci    }
164bc2ed2b3Sopenharmony_ci
165bc2ed2b3Sopenharmony_ci    if (bundleName != foregroundElement_.GetBundleName()) {
166bc2ed2b3Sopenharmony_ci        DebugLog("OnForegroundApplicationChanged not equal to the foreground element, no need to handle.");
167bc2ed2b3Sopenharmony_ci        return;
168bc2ed2b3Sopenharmony_ci    }
169bc2ed2b3Sopenharmony_ci    if (abilityState == static_cast<int32_t>(AppExecFwk::ApplicationState::APP_STATE_FOREGROUND)) {
170bc2ed2b3Sopenharmony_ci        DebugLog("OnForegroundApplicationChanged foreground state, no need to handle.");
171bc2ed2b3Sopenharmony_ci        return;
172bc2ed2b3Sopenharmony_ci    }
173bc2ed2b3Sopenharmony_ci
174bc2ed2b3Sopenharmony_ci    ClearHceInfo();
175bc2ed2b3Sopenharmony_ci    InfoLog("foreground app state change: refresh route table");
176bc2ed2b3Sopenharmony_ci    ConfigRoutingAndCommit();
177bc2ed2b3Sopenharmony_ci}
178bc2ed2b3Sopenharmony_ci
179bc2ed2b3Sopenharmony_civoid CeService::BuildAidEntries(std::map<std::string, AidEntry> &aidEntries)
180bc2ed2b3Sopenharmony_ci{
181bc2ed2b3Sopenharmony_ci    std::vector<AppDataParser::HceAppAidInfo> hceApps;
182bc2ed2b3Sopenharmony_ci    ExternalDepsProxy::GetInstance().GetHceApps(hceApps);
183bc2ed2b3Sopenharmony_ci    InfoLog("AddAidRoutingHceOtherAids: hce apps size %{public}zu", hceApps.size());
184bc2ed2b3Sopenharmony_ci    for (const AppDataParser::HceAppAidInfo &appAidInfo : hceApps) {
185bc2ed2b3Sopenharmony_ci        bool isForeground = appAidInfo.element.GetBundleName() == foregroundElement_.GetBundleName() &&
186bc2ed2b3Sopenharmony_ci                           appAidInfo.element.GetAbilityName() == foregroundElement_.GetAbilityName();
187bc2ed2b3Sopenharmony_ci        bool isDefaultPayment = appAidInfo.element.GetBundleName() == defaultPaymentElement_.GetBundleName() &&
188bc2ed2b3Sopenharmony_ci                                appAidInfo.element.GetAbilityName() == defaultPaymentElement_.GetAbilityName();
189bc2ed2b3Sopenharmony_ci        for (const AppDataParser::AidInfo &aidInfo : appAidInfo.customDataAid) {
190bc2ed2b3Sopenharmony_ci            // add payment aid of default payment app and foreground app
191bc2ed2b3Sopenharmony_ci            // add other aid of all apps
192bc2ed2b3Sopenharmony_ci            bool shouldAdd = KITS::KEY_OHTER_AID == aidInfo.name || isForeground || isDefaultPayment;
193bc2ed2b3Sopenharmony_ci            if (shouldAdd) {
194bc2ed2b3Sopenharmony_ci                AidEntry aidEntry;
195bc2ed2b3Sopenharmony_ci                aidEntry.aid = aidInfo.value;
196bc2ed2b3Sopenharmony_ci                aidEntry.aidInfo = 0;
197bc2ed2b3Sopenharmony_ci                aidEntry.power = DEFAULT_PWR_STA_HOST;
198bc2ed2b3Sopenharmony_ci                aidEntry.route = DEFAULT_HOST_ROUTE_DEST;
199bc2ed2b3Sopenharmony_ci                aidEntries[aidInfo.value] = aidEntry;
200bc2ed2b3Sopenharmony_ci            }
201bc2ed2b3Sopenharmony_ci        }
202bc2ed2b3Sopenharmony_ci    }
203bc2ed2b3Sopenharmony_ci    for (const std::string &aid : dynamicAids_) {
204bc2ed2b3Sopenharmony_ci        AidEntry aidEntry;
205bc2ed2b3Sopenharmony_ci        aidEntry.aid = aid;
206bc2ed2b3Sopenharmony_ci        aidEntry.aidInfo = 0;
207bc2ed2b3Sopenharmony_ci        aidEntry.power = DEFAULT_PWR_STA_HOST;
208bc2ed2b3Sopenharmony_ci        aidEntry.route = DEFAULT_HOST_ROUTE_DEST;
209bc2ed2b3Sopenharmony_ci        aidEntries[aid] = aidEntry;
210bc2ed2b3Sopenharmony_ci    }
211bc2ed2b3Sopenharmony_ci}
212bc2ed2b3Sopenharmony_ci
213bc2ed2b3Sopenharmony_civoid CeService::ClearAidEntriesCache()
214bc2ed2b3Sopenharmony_ci{
215bc2ed2b3Sopenharmony_ci    std::lock_guard<std::mutex> lock(configRoutingMutex_);
216bc2ed2b3Sopenharmony_ci    aidToAidEntry_.clear();
217bc2ed2b3Sopenharmony_ci    DebugLog("ClearAidEntriesCache end");
218bc2ed2b3Sopenharmony_ci}
219bc2ed2b3Sopenharmony_ci
220bc2ed2b3Sopenharmony_cibool CeService::IsDynamicAid(const std::string &targetAid)
221bc2ed2b3Sopenharmony_ci{
222bc2ed2b3Sopenharmony_ci    for (const std::string &aid : dynamicAids_) {
223bc2ed2b3Sopenharmony_ci        if (aid == targetAid) {
224bc2ed2b3Sopenharmony_ci            return true;
225bc2ed2b3Sopenharmony_ci        }
226bc2ed2b3Sopenharmony_ci    }
227bc2ed2b3Sopenharmony_ci    return false;
228bc2ed2b3Sopenharmony_ci}
229bc2ed2b3Sopenharmony_ci
230bc2ed2b3Sopenharmony_civoid CeService::OnDefaultPaymentServiceChange()
231bc2ed2b3Sopenharmony_ci{
232bc2ed2b3Sopenharmony_ci    ElementName newElement;
233bc2ed2b3Sopenharmony_ci    Uri nfcDefaultPaymentApp(KITS::NFC_DATA_URI_PAYMENT_DEFAULT_APP);
234bc2ed2b3Sopenharmony_ci    DelayedSingleton<SettingDataShareImpl>::GetInstance()->GetElementName(
235bc2ed2b3Sopenharmony_ci        nfcDefaultPaymentApp, KITS::DATA_SHARE_KEY_NFC_PAYMENT_DEFAULT_APP, newElement);
236bc2ed2b3Sopenharmony_ci    if (newElement.GetURI() == defaultPaymentElement_.GetURI()) {
237bc2ed2b3Sopenharmony_ci        InfoLog("OnDefaultPaymentServiceChange: payment service not change");
238bc2ed2b3Sopenharmony_ci        return;
239bc2ed2b3Sopenharmony_ci    }
240bc2ed2b3Sopenharmony_ci
241bc2ed2b3Sopenharmony_ci    if (nfcService_.expired()) {
242bc2ed2b3Sopenharmony_ci        ErrorLog("nfcService_ is nullptr.");
243bc2ed2b3Sopenharmony_ci        return;
244bc2ed2b3Sopenharmony_ci    }
245bc2ed2b3Sopenharmony_ci    if (!nfcService_.lock()->IsNfcEnabled()) {
246bc2ed2b3Sopenharmony_ci        ErrorLog("NFC not enabled, should not happen.The default payment app is be set when nfc is enabled.");
247bc2ed2b3Sopenharmony_ci        return;
248bc2ed2b3Sopenharmony_ci    }
249bc2ed2b3Sopenharmony_ci    ExternalDepsProxy::GetInstance().WriteDefaultPaymentAppChangeHiSysEvent(defaultPaymentElement_.GetBundleName(),
250bc2ed2b3Sopenharmony_ci                                                                            newElement.GetBundleName());
251bc2ed2b3Sopenharmony_ci    UpdateDefaultPaymentElement(newElement);
252bc2ed2b3Sopenharmony_ci    InfoLog("OnDefaultPaymentServiceChange: refresh route table");
253bc2ed2b3Sopenharmony_ci    ConfigRoutingAndCommit();
254bc2ed2b3Sopenharmony_ci}
255bc2ed2b3Sopenharmony_civoid CeService::OnAppAddOrChangeOrRemove(std::shared_ptr<EventFwk::CommonEventData> data)
256bc2ed2b3Sopenharmony_ci{
257bc2ed2b3Sopenharmony_ci    DebugLog("OnAppAddOrChangeOrRemove start");
258bc2ed2b3Sopenharmony_ci
259bc2ed2b3Sopenharmony_ci    if (!AppEventCheckValid(data)) {
260bc2ed2b3Sopenharmony_ci        return;
261bc2ed2b3Sopenharmony_ci    }
262bc2ed2b3Sopenharmony_ci
263bc2ed2b3Sopenharmony_ci    std::string action = data->GetWant().GetAction();
264bc2ed2b3Sopenharmony_ci    ElementName element = data->GetWant().GetElement();
265bc2ed2b3Sopenharmony_ci    std::string bundleName = element.GetBundleName();
266bc2ed2b3Sopenharmony_ci
267bc2ed2b3Sopenharmony_ci    InfoLog("OnAppAddOrChangeOrRemove: change bundleName %{public}s, default payment bundle name %{public}s, "
268bc2ed2b3Sopenharmony_ci            "installed status %{public}d",
269bc2ed2b3Sopenharmony_ci            bundleName.c_str(), defaultPaymentElement_.GetBundleName().c_str(),
270bc2ed2b3Sopenharmony_ci            defaultPaymentBundleInstalled_);
271bc2ed2b3Sopenharmony_ci
272bc2ed2b3Sopenharmony_ci    if (bundleName == defaultPaymentElement_.GetBundleName() &&
273bc2ed2b3Sopenharmony_ci        action == EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED) {
274bc2ed2b3Sopenharmony_ci        UpdateDefaultPaymentBundleInstalledStatus(false);
275bc2ed2b3Sopenharmony_ci        ExternalDepsProxy::GetInstance().WriteDefaultPaymentAppChangeHiSysEvent(
276bc2ed2b3Sopenharmony_ci            defaultPaymentElement_.GetBundleName(), APP_REMOVED);
277bc2ed2b3Sopenharmony_ci    }
278bc2ed2b3Sopenharmony_ci
279bc2ed2b3Sopenharmony_ci    if (bundleName == defaultPaymentElement_.GetBundleName() &&
280bc2ed2b3Sopenharmony_ci        action == EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_ADDED) {
281bc2ed2b3Sopenharmony_ci        UpdateDefaultPaymentBundleInstalledStatus(true);
282bc2ed2b3Sopenharmony_ci        ExternalDepsProxy::GetInstance().WriteDefaultPaymentAppChangeHiSysEvent(
283bc2ed2b3Sopenharmony_ci            defaultPaymentElement_.GetBundleName(), APP_ADDED);
284bc2ed2b3Sopenharmony_ci    }
285bc2ed2b3Sopenharmony_ci
286bc2ed2b3Sopenharmony_ci    if (nfcService_.expired()) {
287bc2ed2b3Sopenharmony_ci        ErrorLog("nfcService_ is nullptr.");
288bc2ed2b3Sopenharmony_ci        return;
289bc2ed2b3Sopenharmony_ci    }
290bc2ed2b3Sopenharmony_ci    if (!nfcService_.lock()->IsNfcEnabled()) {
291bc2ed2b3Sopenharmony_ci        ErrorLog(" NFC not enabled, not need to update routing entry ");
292bc2ed2b3Sopenharmony_ci        return;
293bc2ed2b3Sopenharmony_ci    }
294bc2ed2b3Sopenharmony_ci    InfoLog("OnAppAddOrChangeOrRemove: refresh route table");
295bc2ed2b3Sopenharmony_ci    ConfigRoutingAndCommit();
296bc2ed2b3Sopenharmony_ci    DebugLog("OnAppAddOrChangeOrRemove end");
297bc2ed2b3Sopenharmony_ci}
298bc2ed2b3Sopenharmony_ci
299bc2ed2b3Sopenharmony_cibool CeService::AppEventCheckValid(std::shared_ptr<EventFwk::CommonEventData> data)
300bc2ed2b3Sopenharmony_ci{
301bc2ed2b3Sopenharmony_ci    if (data == nullptr) {
302bc2ed2b3Sopenharmony_ci        ErrorLog("invalid event data");
303bc2ed2b3Sopenharmony_ci        return false;
304bc2ed2b3Sopenharmony_ci    }
305bc2ed2b3Sopenharmony_ci    std::string action = data->GetWant().GetAction();
306bc2ed2b3Sopenharmony_ci    if (action.empty()) {
307bc2ed2b3Sopenharmony_ci        ErrorLog("action is empty");
308bc2ed2b3Sopenharmony_ci        return false;
309bc2ed2b3Sopenharmony_ci    }
310bc2ed2b3Sopenharmony_ci    if ((action != EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_ADDED) &&
311bc2ed2b3Sopenharmony_ci        (action != EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_CHANGED) &&
312bc2ed2b3Sopenharmony_ci        (action != EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED)) {
313bc2ed2b3Sopenharmony_ci        InfoLog("not the interested action");
314bc2ed2b3Sopenharmony_ci        return false;
315bc2ed2b3Sopenharmony_ci    }
316bc2ed2b3Sopenharmony_ci
317bc2ed2b3Sopenharmony_ci    ElementName element = data->GetWant().GetElement();
318bc2ed2b3Sopenharmony_ci    std::string bundleName = element.GetBundleName();
319bc2ed2b3Sopenharmony_ci    if (bundleName.empty()) {
320bc2ed2b3Sopenharmony_ci        ErrorLog("invalid bundleName.");
321bc2ed2b3Sopenharmony_ci        return false;
322bc2ed2b3Sopenharmony_ci    }
323bc2ed2b3Sopenharmony_ci    return true;
324bc2ed2b3Sopenharmony_ci}
325bc2ed2b3Sopenharmony_civoid CeService::UpdateDefaultPaymentBundleInstalledStatus(bool installed)
326bc2ed2b3Sopenharmony_ci{
327bc2ed2b3Sopenharmony_ci    InfoLog("UpdateDefaultPaymentBundleInstalledStatus: bundleName %{public}d", installed);
328bc2ed2b3Sopenharmony_ci    std::lock_guard<std::mutex> lock(configRoutingMutex_);
329bc2ed2b3Sopenharmony_ci    defaultPaymentBundleInstalled_ = installed;
330bc2ed2b3Sopenharmony_ci}
331bc2ed2b3Sopenharmony_ci
332bc2ed2b3Sopenharmony_civoid CeService::UpdateDefaultPaymentElement(const ElementName &element)
333bc2ed2b3Sopenharmony_ci{
334bc2ed2b3Sopenharmony_ci    InfoLog("UpdateDefaultPaymentElement: bundleName %{public}s", element.GetURI().c_str());
335bc2ed2b3Sopenharmony_ci    std::lock_guard<std::mutex> lock(configRoutingMutex_);
336bc2ed2b3Sopenharmony_ci    defaultPaymentElement_ = element;
337bc2ed2b3Sopenharmony_ci    defaultPaymentBundleInstalled_ = true;
338bc2ed2b3Sopenharmony_ci}
339bc2ed2b3Sopenharmony_ciKITS::DefaultPaymentType CeService::GetDefaultPaymentType()
340bc2ed2b3Sopenharmony_ci{
341bc2ed2b3Sopenharmony_ci    InfoLog("GetDefaultPaymentType: default payment bundle name %{public}s, "
342bc2ed2b3Sopenharmony_ci            "installed status %{public}d",
343bc2ed2b3Sopenharmony_ci            defaultPaymentElement_.GetBundleName().c_str(), defaultPaymentBundleInstalled_);
344bc2ed2b3Sopenharmony_ci
345bc2ed2b3Sopenharmony_ci    if (defaultPaymentElement_.GetBundleName().empty()) {
346bc2ed2b3Sopenharmony_ci        return KITS::DefaultPaymentType::TYPE_EMPTY;
347bc2ed2b3Sopenharmony_ci    }
348bc2ed2b3Sopenharmony_ci    if (!defaultPaymentBundleInstalled_) {
349bc2ed2b3Sopenharmony_ci        return KITS::DefaultPaymentType::TYPE_UNINSTALLED;
350bc2ed2b3Sopenharmony_ci    }
351bc2ed2b3Sopenharmony_ci    if (defaultPaymentElement_.GetBundleName() ==  nciCeProxy_.lock()->GetSimVendorBundleName()) {
352bc2ed2b3Sopenharmony_ci        return KITS::DefaultPaymentType::TYPE_UICC;
353bc2ed2b3Sopenharmony_ci    }
354bc2ed2b3Sopenharmony_ci    if (ExternalDepsProxy::GetInstance().IsHceApp(defaultPaymentElement_)) {
355bc2ed2b3Sopenharmony_ci        return KITS::DefaultPaymentType::TYPE_HCE;
356bc2ed2b3Sopenharmony_ci    }
357bc2ed2b3Sopenharmony_ci
358bc2ed2b3Sopenharmony_ci    return KITS::DefaultPaymentType::TYPE_ESE;
359bc2ed2b3Sopenharmony_ci}
360bc2ed2b3Sopenharmony_ci
361bc2ed2b3Sopenharmony_civoid CeService::ConfigRoutingAndCommit()
362bc2ed2b3Sopenharmony_ci{
363bc2ed2b3Sopenharmony_ci    if (nfcService_.expired()) {
364bc2ed2b3Sopenharmony_ci        ErrorLog("ConfigRoutingAndCommit: nfc service is null");
365bc2ed2b3Sopenharmony_ci        return;
366bc2ed2b3Sopenharmony_ci    }
367bc2ed2b3Sopenharmony_ci    std::weak_ptr<NfcRoutingManager> routingManager = nfcService_.lock()->GetNfcRoutingManager();
368bc2ed2b3Sopenharmony_ci    if (routingManager.expired()) {
369bc2ed2b3Sopenharmony_ci        ErrorLog("ConfigRoutingAndCommit: routing manager is null");
370bc2ed2b3Sopenharmony_ci        return;
371bc2ed2b3Sopenharmony_ci    }
372bc2ed2b3Sopenharmony_ci
373bc2ed2b3Sopenharmony_ci    bool updateAids = false;
374bc2ed2b3Sopenharmony_ci    bool updatePaymentType = UpdateDefaultPaymentType();
375bc2ed2b3Sopenharmony_ci    if (updatePaymentType) {
376bc2ed2b3Sopenharmony_ci        updateAids = InitConfigAidRouting(true);
377bc2ed2b3Sopenharmony_ci    } else {
378bc2ed2b3Sopenharmony_ci        updateAids = InitConfigAidRouting(false);
379bc2ed2b3Sopenharmony_ci    }
380bc2ed2b3Sopenharmony_ci
381bc2ed2b3Sopenharmony_ci    InfoLog(
382bc2ed2b3Sopenharmony_ci        "ConfigRoutingAndCommit: aids updated status %{public}d, default payment type updated status %{public}d.",
383bc2ed2b3Sopenharmony_ci        updateAids, updatePaymentType);
384bc2ed2b3Sopenharmony_ci    if (updateAids || updatePaymentType) {
385bc2ed2b3Sopenharmony_ci        routingManager.lock()->ComputeRoutingParams(defaultPaymentType_);
386bc2ed2b3Sopenharmony_ci        routingManager.lock()->CommitRouting();
387bc2ed2b3Sopenharmony_ci    }
388bc2ed2b3Sopenharmony_ci}
389bc2ed2b3Sopenharmony_ci
390bc2ed2b3Sopenharmony_civoid CeService::SearchElementByAid(const std::string &aid, ElementName &aidElement)
391bc2ed2b3Sopenharmony_ci{
392bc2ed2b3Sopenharmony_ci    if (aid.empty()) {
393bc2ed2b3Sopenharmony_ci        InfoLog("aid is empty");
394bc2ed2b3Sopenharmony_ci        return;
395bc2ed2b3Sopenharmony_ci    }
396bc2ed2b3Sopenharmony_ci    // find dynamic aid
397bc2ed2b3Sopenharmony_ci    if (IsDynamicAid(aid) && !foregroundElement_.GetBundleName().empty()) {
398bc2ed2b3Sopenharmony_ci        InfoLog("is foreground element");
399bc2ed2b3Sopenharmony_ci        aidElement.SetBundleName(foregroundElement_.GetBundleName());
400bc2ed2b3Sopenharmony_ci        aidElement.SetAbilityName(foregroundElement_.GetAbilityName());
401bc2ed2b3Sopenharmony_ci        return;
402bc2ed2b3Sopenharmony_ci    }
403bc2ed2b3Sopenharmony_ci    std::vector<AppDataParser::HceAppAidInfo> hceApps;
404bc2ed2b3Sopenharmony_ci    ExternalDepsProxy::GetInstance().GetHceAppsByAid(aid, hceApps);
405bc2ed2b3Sopenharmony_ci    if (hceApps.empty()) {
406bc2ed2b3Sopenharmony_ci        InfoLog("No applications found");
407bc2ed2b3Sopenharmony_ci        return;
408bc2ed2b3Sopenharmony_ci    }
409bc2ed2b3Sopenharmony_ci    // only one element, resolved
410bc2ed2b3Sopenharmony_ci    if (hceApps.size() == 1) {
411bc2ed2b3Sopenharmony_ci        ElementName element = hceApps[0].element;
412bc2ed2b3Sopenharmony_ci        aidElement.SetBundleName(element.GetBundleName());
413bc2ed2b3Sopenharmony_ci        aidElement.SetAbilityName(element.GetAbilityName());
414bc2ed2b3Sopenharmony_ci        return;
415bc2ed2b3Sopenharmony_ci    }
416bc2ed2b3Sopenharmony_ci    InfoLog("Found too many applications");
417bc2ed2b3Sopenharmony_ci    for (const AppDataParser::HceAppAidInfo &hceApp : hceApps) {
418bc2ed2b3Sopenharmony_ci        ElementName elementName = hceApp.element;
419bc2ed2b3Sopenharmony_ci        InfoLog("ElementName: %{public}s", elementName.GetBundleName().c_str());
420bc2ed2b3Sopenharmony_ci        InfoLog("ElementValue: %{public}s", elementName.GetAbilityName().c_str());
421bc2ed2b3Sopenharmony_ci
422bc2ed2b3Sopenharmony_ci        bool isForeground = elementName.GetBundleName() == foregroundElement_.GetBundleName() &&
423bc2ed2b3Sopenharmony_ci                           elementName.GetAbilityName() == foregroundElement_.GetAbilityName();
424bc2ed2b3Sopenharmony_ci        bool isDefaultPayment = elementName.GetBundleName() == defaultPaymentElement_.GetBundleName() &&
425bc2ed2b3Sopenharmony_ci                                elementName.GetAbilityName() == defaultPaymentElement_.GetAbilityName();
426bc2ed2b3Sopenharmony_ci        if (isForeground) {
427bc2ed2b3Sopenharmony_ci            // is foregroud, resolved
428bc2ed2b3Sopenharmony_ci            InfoLog("is foreground element");
429bc2ed2b3Sopenharmony_ci            aidElement.SetBundleName(elementName.GetBundleName());
430bc2ed2b3Sopenharmony_ci            aidElement.SetAbilityName(elementName.GetAbilityName());
431bc2ed2b3Sopenharmony_ci            return;
432bc2ed2b3Sopenharmony_ci        } else if (isDefaultPayment && IsPaymentAid(aid, hceApp)) {
433bc2ed2b3Sopenharmony_ci            // is default payment, resolved
434bc2ed2b3Sopenharmony_ci            InfoLog("is default payment element");
435bc2ed2b3Sopenharmony_ci            aidElement.SetBundleName(elementName.GetBundleName());
436bc2ed2b3Sopenharmony_ci            aidElement.SetAbilityName(elementName.GetAbilityName());
437bc2ed2b3Sopenharmony_ci            return;
438bc2ed2b3Sopenharmony_ci        }
439bc2ed2b3Sopenharmony_ci    }
440bc2ed2b3Sopenharmony_ci
441bc2ed2b3Sopenharmony_ci    HandleOtherAidConflicted(hceApps);
442bc2ed2b3Sopenharmony_ci    InfoLog("SearchElementByAid end.");
443bc2ed2b3Sopenharmony_ci}
444bc2ed2b3Sopenharmony_civoid CeService::HandleOtherAidConflicted(const std::vector<AppDataParser::HceAppAidInfo> &hceApps)
445bc2ed2b3Sopenharmony_ci{
446bc2ed2b3Sopenharmony_ci    InfoLog("too many applications found, let user decide.");
447bc2ed2b3Sopenharmony_ci    TAG::NfcNotificationId notificationId = TAG::NFC_HCE_AID_CONFLICTED_ID;
448bc2ed2b3Sopenharmony_ci    ExternalDepsProxy::GetInstance().PublishNfcNotification(notificationId, "", 0);
449bc2ed2b3Sopenharmony_ci}
450bc2ed2b3Sopenharmony_ci
451bc2ed2b3Sopenharmony_cibool CeService::UpdateDefaultPaymentType()
452bc2ed2b3Sopenharmony_ci{
453bc2ed2b3Sopenharmony_ci    KITS::DefaultPaymentType defaultPaymentType = GetDefaultPaymentType();
454bc2ed2b3Sopenharmony_ci    InfoLog("The last default payment type %{public}d, the new one %{public}d.", defaultPaymentType_,
455bc2ed2b3Sopenharmony_ci            defaultPaymentType);
456bc2ed2b3Sopenharmony_ci    if (defaultPaymentType == defaultPaymentType_) {
457bc2ed2b3Sopenharmony_ci        return false;
458bc2ed2b3Sopenharmony_ci    }
459bc2ed2b3Sopenharmony_ci    std::lock_guard<std::mutex> lock(configRoutingMutex_);
460bc2ed2b3Sopenharmony_ci    ExternalDepsProxy::GetInstance().WriteDefaultRouteChangeHiSysEvent(
461bc2ed2b3Sopenharmony_ci        static_cast<int>(defaultPaymentType_), static_cast<int>(defaultPaymentType));
462bc2ed2b3Sopenharmony_ci    defaultPaymentType_ = defaultPaymentType;
463bc2ed2b3Sopenharmony_ci    NotifyDefaultPaymentType(static_cast<int>(defaultPaymentType_));
464bc2ed2b3Sopenharmony_ci    return true;
465bc2ed2b3Sopenharmony_ci}
466bc2ed2b3Sopenharmony_ci
467bc2ed2b3Sopenharmony_cibool CeService::IsPaymentAid(const std::string &aid, const AppDataParser::HceAppAidInfo &hceApp)
468bc2ed2b3Sopenharmony_ci{
469bc2ed2b3Sopenharmony_ci    for (const AppDataParser::AidInfo &aidInfo : hceApp.customDataAid) {
470bc2ed2b3Sopenharmony_ci        if (KITS::KEY_PAYMENT_AID == aidInfo.name && aid == aidInfo.value) {
471bc2ed2b3Sopenharmony_ci            return true;
472bc2ed2b3Sopenharmony_ci        }
473bc2ed2b3Sopenharmony_ci    }
474bc2ed2b3Sopenharmony_ci    return false;
475bc2ed2b3Sopenharmony_ci}
476bc2ed2b3Sopenharmony_ci
477bc2ed2b3Sopenharmony_civoid CeService::HandleFieldActivated()
478bc2ed2b3Sopenharmony_ci{
479bc2ed2b3Sopenharmony_ci    if (nfcService_.expired() || nfcService_.lock()->eventHandler_ == nullptr) {
480bc2ed2b3Sopenharmony_ci        return;
481bc2ed2b3Sopenharmony_ci    }
482bc2ed2b3Sopenharmony_ci    nfcService_.lock()->eventHandler_->RemoveEvent(static_cast<uint32_t>(NfcCommonEvent::MSG_NOTIFY_FIELD_OFF));
483bc2ed2b3Sopenharmony_ci    nfcService_.lock()->eventHandler_->RemoveEvent(
484bc2ed2b3Sopenharmony_ci        static_cast<uint32_t>(NfcCommonEvent::MSG_NOTIFY_FIELD_OFF_TIMEOUT));
485bc2ed2b3Sopenharmony_ci    nfcService_.lock()->eventHandler_->SendEvent(
486bc2ed2b3Sopenharmony_ci        static_cast<uint32_t>(NfcCommonEvent::MSG_NOTIFY_FIELD_OFF_TIMEOUT), DEACTIVATE_TIMEOUT);
487bc2ed2b3Sopenharmony_ci
488bc2ed2b3Sopenharmony_ci    uint64_t currentTime = KITS::NfcSdkCommon::GetRelativeTime();
489bc2ed2b3Sopenharmony_ci    if (currentTime < lastFieldOnTime_) {
490bc2ed2b3Sopenharmony_ci        WarnLog("currentTime = %{public}lu, lastFieldOnTime_ = %{public}lu", currentTime, lastFieldOnTime_);
491bc2ed2b3Sopenharmony_ci        lastFieldOnTime_ = 0;
492bc2ed2b3Sopenharmony_ci        return;
493bc2ed2b3Sopenharmony_ci    }
494bc2ed2b3Sopenharmony_ci    if (currentTime - lastFieldOnTime_ > FIELD_COMMON_EVENT_INTERVAL) {
495bc2ed2b3Sopenharmony_ci        lastFieldOnTime_ = currentTime;
496bc2ed2b3Sopenharmony_ci        nfcService_.lock()->eventHandler_->SendEvent(static_cast<uint32_t>(NfcCommonEvent::MSG_NOTIFY_FIELD_ON));
497bc2ed2b3Sopenharmony_ci    }
498bc2ed2b3Sopenharmony_ci}
499bc2ed2b3Sopenharmony_ci
500bc2ed2b3Sopenharmony_civoid CeService::HandleFieldDeactivated()
501bc2ed2b3Sopenharmony_ci{
502bc2ed2b3Sopenharmony_ci    if (nfcService_.expired() || nfcService_.lock()->eventHandler_ == nullptr) {
503bc2ed2b3Sopenharmony_ci        return;
504bc2ed2b3Sopenharmony_ci    }
505bc2ed2b3Sopenharmony_ci    nfcService_.lock()->eventHandler_->RemoveEvent(
506bc2ed2b3Sopenharmony_ci        static_cast<uint32_t>(NfcCommonEvent::MSG_NOTIFY_FIELD_OFF_TIMEOUT));
507bc2ed2b3Sopenharmony_ci    nfcService_.lock()->eventHandler_->RemoveEvent(static_cast<uint32_t>(NfcCommonEvent::MSG_NOTIFY_FIELD_OFF));
508bc2ed2b3Sopenharmony_ci
509bc2ed2b3Sopenharmony_ci    uint64_t currentTime = KITS::NfcSdkCommon::GetRelativeTime();
510bc2ed2b3Sopenharmony_ci    if (currentTime < lastFieldOffTime_) {
511bc2ed2b3Sopenharmony_ci        WarnLog("currentTime = %{public}lu, lastFieldOffTime_ = %{public}lu", currentTime, lastFieldOffTime_);
512bc2ed2b3Sopenharmony_ci        lastFieldOffTime_ = 0;
513bc2ed2b3Sopenharmony_ci        return;
514bc2ed2b3Sopenharmony_ci    }
515bc2ed2b3Sopenharmony_ci    if (currentTime - lastFieldOffTime_ > FIELD_COMMON_EVENT_INTERVAL) {
516bc2ed2b3Sopenharmony_ci        lastFieldOffTime_ = currentTime;
517bc2ed2b3Sopenharmony_ci        nfcService_.lock()->eventHandler_->SendEvent(static_cast<uint32_t>(NfcCommonEvent::MSG_NOTIFY_FIELD_OFF),
518bc2ed2b3Sopenharmony_ci                                                     FIELD_COMMON_EVENT_INTERVAL);
519bc2ed2b3Sopenharmony_ci    }
520bc2ed2b3Sopenharmony_ci}
521bc2ed2b3Sopenharmony_civoid CeService::OnCardEmulationData(const std::vector<uint8_t> &data)
522bc2ed2b3Sopenharmony_ci{
523bc2ed2b3Sopenharmony_ci    if (hostCardEmulationManager_ == nullptr) {
524bc2ed2b3Sopenharmony_ci        ErrorLog("hce is null");
525bc2ed2b3Sopenharmony_ci        return;
526bc2ed2b3Sopenharmony_ci    }
527bc2ed2b3Sopenharmony_ci    hostCardEmulationManager_->OnHostCardEmulationDataNfcA(data);
528bc2ed2b3Sopenharmony_ci}
529bc2ed2b3Sopenharmony_civoid CeService::OnCardEmulationActivated()
530bc2ed2b3Sopenharmony_ci{
531bc2ed2b3Sopenharmony_ci    if (hostCardEmulationManager_ == nullptr) {
532bc2ed2b3Sopenharmony_ci        ErrorLog("hce is null");
533bc2ed2b3Sopenharmony_ci        return;
534bc2ed2b3Sopenharmony_ci    }
535bc2ed2b3Sopenharmony_ci    hostCardEmulationManager_->OnCardEmulationActivated();
536bc2ed2b3Sopenharmony_ci}
537bc2ed2b3Sopenharmony_civoid CeService::OnCardEmulationDeactivated()
538bc2ed2b3Sopenharmony_ci{
539bc2ed2b3Sopenharmony_ci    if (hostCardEmulationManager_ == nullptr) {
540bc2ed2b3Sopenharmony_ci        ErrorLog("hce is null");
541bc2ed2b3Sopenharmony_ci        return;
542bc2ed2b3Sopenharmony_ci    }
543bc2ed2b3Sopenharmony_ci    hostCardEmulationManager_->OnCardEmulationDeactivated();
544bc2ed2b3Sopenharmony_ci}
545bc2ed2b3Sopenharmony_ciOHOS::sptr<OHOS::IRemoteObject> CeService::AsObject()
546bc2ed2b3Sopenharmony_ci{
547bc2ed2b3Sopenharmony_ci    return nullptr;
548bc2ed2b3Sopenharmony_ci}
549bc2ed2b3Sopenharmony_civoid CeService::Initialize()
550bc2ed2b3Sopenharmony_ci{
551bc2ed2b3Sopenharmony_ci    DebugLog("CeService Initialize start");
552bc2ed2b3Sopenharmony_ci    dataRdbObserver_ = sptr<DefaultPaymentServiceChangeCallback>(
553bc2ed2b3Sopenharmony_ci        new (std::nothrow) DefaultPaymentServiceChangeCallback(shared_from_this()));
554bc2ed2b3Sopenharmony_ci    InitDefaultPaymentApp();
555bc2ed2b3Sopenharmony_ci    defaultPaymentType_ = GetDefaultPaymentType();
556bc2ed2b3Sopenharmony_ci    ExternalDepsProxy::GetInstance().WriteDefaultRouteChangeHiSysEvent(
557bc2ed2b3Sopenharmony_ci        static_cast<int>(KITS::DefaultPaymentType::TYPE_UNKNOWN), static_cast<int>(defaultPaymentType_));
558bc2ed2b3Sopenharmony_ci    NotifyDefaultPaymentType(static_cast<int>(defaultPaymentType_));
559bc2ed2b3Sopenharmony_ci    hostCardEmulationManager_ =
560bc2ed2b3Sopenharmony_ci        std::make_shared<HostCardEmulationManager>(nfcService_, nciCeProxy_, shared_from_this());
561bc2ed2b3Sopenharmony_ci    DebugLog("CeService Initialize end");
562bc2ed2b3Sopenharmony_ci}
563bc2ed2b3Sopenharmony_ci
564bc2ed2b3Sopenharmony_cibool CeService::InitDefaultPaymentApp()
565bc2ed2b3Sopenharmony_ci{
566bc2ed2b3Sopenharmony_ci    std::lock_guard<std::mutex> lock(g_defaultPaymentAppInitMutex);
567bc2ed2b3Sopenharmony_ci    if (initDefaultPaymentAppDone_) {
568bc2ed2b3Sopenharmony_ci        WarnLog("InitDefaultPaymentApp: already done");
569bc2ed2b3Sopenharmony_ci        return false;
570bc2ed2b3Sopenharmony_ci    }
571bc2ed2b3Sopenharmony_ci    Uri nfcDefaultPaymentApp(KITS::NFC_DATA_URI_PAYMENT_DEFAULT_APP);
572bc2ed2b3Sopenharmony_ci    KITS::ErrorCode registerResult = DelayedSingleton<SettingDataShareImpl>::GetInstance()->
573bc2ed2b3Sopenharmony_ci        RegisterDataObserver(nfcDefaultPaymentApp, dataRdbObserver_);
574bc2ed2b3Sopenharmony_ci    if (registerResult != KITS::ERR_NONE) {
575bc2ed2b3Sopenharmony_ci        initDefaultPaymentAppDone_ = false;
576bc2ed2b3Sopenharmony_ci        ErrorLog("register default payment app failed");
577bc2ed2b3Sopenharmony_ci        return false;
578bc2ed2b3Sopenharmony_ci    }
579bc2ed2b3Sopenharmony_ci    DelayedSingleton<SettingDataShareImpl>::GetInstance()->GetElementName(
580bc2ed2b3Sopenharmony_ci        nfcDefaultPaymentApp, KITS::DATA_SHARE_KEY_NFC_PAYMENT_DEFAULT_APP, defaultPaymentElement_);
581bc2ed2b3Sopenharmony_ci    defaultPaymentBundleInstalled_ =
582bc2ed2b3Sopenharmony_ci        ExternalDepsProxy::GetInstance().IsBundleInstalled(defaultPaymentElement_.GetBundleName());
583bc2ed2b3Sopenharmony_ci
584bc2ed2b3Sopenharmony_ci    std::string appStatus = defaultPaymentBundleInstalled_ ? APP_ADDED : APP_REMOVED;
585bc2ed2b3Sopenharmony_ci    ExternalDepsProxy::GetInstance().WriteDefaultPaymentAppChangeHiSysEvent(defaultPaymentElement_.GetBundleName(),
586bc2ed2b3Sopenharmony_ci                                                                            appStatus);
587bc2ed2b3Sopenharmony_ci    initDefaultPaymentAppDone_ = true;
588bc2ed2b3Sopenharmony_ci    return true;
589bc2ed2b3Sopenharmony_ci}
590bc2ed2b3Sopenharmony_ci
591bc2ed2b3Sopenharmony_civoid CeService::Deinitialize()
592bc2ed2b3Sopenharmony_ci{
593bc2ed2b3Sopenharmony_ci    DebugLog("CeService Deinitialize start");
594bc2ed2b3Sopenharmony_ci    ClearAidEntriesCache();
595bc2ed2b3Sopenharmony_ci    foregroundElement_.SetBundleName("");
596bc2ed2b3Sopenharmony_ci    foregroundElement_.SetAbilityName("");
597bc2ed2b3Sopenharmony_ci    foregroundElement_.SetDeviceID("");
598bc2ed2b3Sopenharmony_ci    foregroundElement_.SetModuleName("");
599bc2ed2b3Sopenharmony_ci    defaultPaymentElement_.SetBundleName("");
600bc2ed2b3Sopenharmony_ci    defaultPaymentElement_.SetAbilityName("");
601bc2ed2b3Sopenharmony_ci    defaultPaymentElement_.SetDeviceID("");
602bc2ed2b3Sopenharmony_ci    defaultPaymentElement_.SetModuleName("");
603bc2ed2b3Sopenharmony_ci    initDefaultPaymentAppDone_ = false;
604bc2ed2b3Sopenharmony_ci    dynamicAids_.clear();
605bc2ed2b3Sopenharmony_ci    Uri nfcDefaultPaymentApp(KITS::NFC_DATA_URI_PAYMENT_DEFAULT_APP);
606bc2ed2b3Sopenharmony_ci    DelayedSingleton<SettingDataShareImpl>::GetInstance()->ReleaseDataObserver(nfcDefaultPaymentApp,
607bc2ed2b3Sopenharmony_ci                                                                               dataRdbObserver_);
608bc2ed2b3Sopenharmony_ci    DebugLog("CeService Deinitialize end");
609bc2ed2b3Sopenharmony_ci}
610bc2ed2b3Sopenharmony_ci
611bc2ed2b3Sopenharmony_cibool CeService::StartHce(const ElementName &element, const std::vector<std::string> &aids)
612bc2ed2b3Sopenharmony_ci{
613bc2ed2b3Sopenharmony_ci    if (nfcService_.expired()) {
614bc2ed2b3Sopenharmony_ci        ErrorLog("nfcService_ is nullptr.");
615bc2ed2b3Sopenharmony_ci        return false;
616bc2ed2b3Sopenharmony_ci    }
617bc2ed2b3Sopenharmony_ci    if (!nfcService_.lock()->IsNfcEnabled()) {
618bc2ed2b3Sopenharmony_ci        ErrorLog("NFC not enabled, should not happen.");
619bc2ed2b3Sopenharmony_ci        return false;
620bc2ed2b3Sopenharmony_ci    }
621bc2ed2b3Sopenharmony_ci    SetHceInfo(element, aids);
622bc2ed2b3Sopenharmony_ci    InfoLog("StartHce: refresh route table");
623bc2ed2b3Sopenharmony_ci    ConfigRoutingAndCommit();
624bc2ed2b3Sopenharmony_ci    return true;
625bc2ed2b3Sopenharmony_ci}
626bc2ed2b3Sopenharmony_ci
627bc2ed2b3Sopenharmony_civoid CeService::SetHceInfo(const ElementName &element, const std::vector<std::string> &aids)
628bc2ed2b3Sopenharmony_ci{
629bc2ed2b3Sopenharmony_ci    InfoLog("SetHceInfo start.");
630bc2ed2b3Sopenharmony_ci    std::lock_guard<std::mutex> lock(configRoutingMutex_);
631bc2ed2b3Sopenharmony_ci    foregroundElement_ = element;
632bc2ed2b3Sopenharmony_ci    ExternalDepsProxy::GetInstance().WriteForegroundAppChangeHiSysEvent(foregroundElement_.GetBundleName());
633bc2ed2b3Sopenharmony_ci    dynamicAids_.clear();
634bc2ed2b3Sopenharmony_ci    dynamicAids_ = std::move(aids);
635bc2ed2b3Sopenharmony_ci}
636bc2ed2b3Sopenharmony_ci
637bc2ed2b3Sopenharmony_civoid CeService::ClearHceInfo()
638bc2ed2b3Sopenharmony_ci{
639bc2ed2b3Sopenharmony_ci    InfoLog("ClearHceInfo start.");
640bc2ed2b3Sopenharmony_ci    std::lock_guard<std::mutex> lock(configRoutingMutex_);
641bc2ed2b3Sopenharmony_ci    foregroundElement_.SetBundleName("");
642bc2ed2b3Sopenharmony_ci    foregroundElement_.SetAbilityName("");
643bc2ed2b3Sopenharmony_ci    foregroundElement_.SetDeviceID("");
644bc2ed2b3Sopenharmony_ci    foregroundElement_.SetModuleName("");
645bc2ed2b3Sopenharmony_ci    ExternalDepsProxy::GetInstance().WriteForegroundAppChangeHiSysEvent(foregroundElement_.GetBundleName());
646bc2ed2b3Sopenharmony_ci    dynamicAids_.clear();
647bc2ed2b3Sopenharmony_ci}
648bc2ed2b3Sopenharmony_ci
649bc2ed2b3Sopenharmony_cibool CeService::StopHce(const ElementName &element, Security::AccessToken::AccessTokenID callerToken)
650bc2ed2b3Sopenharmony_ci{
651bc2ed2b3Sopenharmony_ci    bool isForegroud = element.GetBundleName() == foregroundElement_.GetBundleName() &&
652bc2ed2b3Sopenharmony_ci                       element.GetAbilityName() == foregroundElement_.GetAbilityName();
653bc2ed2b3Sopenharmony_ci    if (isForegroud) {
654bc2ed2b3Sopenharmony_ci        ClearHceInfo();
655bc2ed2b3Sopenharmony_ci        InfoLog("StopHce: refresh route table");
656bc2ed2b3Sopenharmony_ci        ConfigRoutingAndCommit();
657bc2ed2b3Sopenharmony_ci    }
658bc2ed2b3Sopenharmony_ci    return hostCardEmulationManager_->UnRegAllCallback(callerToken);
659bc2ed2b3Sopenharmony_ci}
660bc2ed2b3Sopenharmony_ci
661bc2ed2b3Sopenharmony_cibool CeService::HandleWhenRemoteDie(Security::AccessToken::AccessTokenID callerToken)
662bc2ed2b3Sopenharmony_ci{
663bc2ed2b3Sopenharmony_ci    Security::AccessToken::HapTokenInfo hapTokenInfo;
664bc2ed2b3Sopenharmony_ci    int result = Security::AccessToken::AccessTokenKit::GetHapTokenInfo(callerToken, hapTokenInfo);
665bc2ed2b3Sopenharmony_ci
666bc2ed2b3Sopenharmony_ci    InfoLog("get hap token info, result = %{public}d", result);
667bc2ed2b3Sopenharmony_ci    if (result) {
668bc2ed2b3Sopenharmony_ci        return false;
669bc2ed2b3Sopenharmony_ci    }
670bc2ed2b3Sopenharmony_ci    if (hapTokenInfo.bundleName.empty()) {
671bc2ed2b3Sopenharmony_ci        ErrorLog("HandleWhenRemoteDie: not got bundle name");
672bc2ed2b3Sopenharmony_ci        return false;
673bc2ed2b3Sopenharmony_ci    }
674bc2ed2b3Sopenharmony_ci
675bc2ed2b3Sopenharmony_ci    bool isForegroud = hapTokenInfo.bundleName == foregroundElement_.GetBundleName();
676bc2ed2b3Sopenharmony_ci    if (isForegroud) {
677bc2ed2b3Sopenharmony_ci        ClearHceInfo();
678bc2ed2b3Sopenharmony_ci        InfoLog("remote die: refresh route table");
679bc2ed2b3Sopenharmony_ci        ConfigRoutingAndCommit();
680bc2ed2b3Sopenharmony_ci    }
681bc2ed2b3Sopenharmony_ci    return hostCardEmulationManager_->UnRegAllCallback(callerToken);
682bc2ed2b3Sopenharmony_ci}
683bc2ed2b3Sopenharmony_ci
684bc2ed2b3Sopenharmony_civoid CeService::NotifyDefaultPaymentType(int paymentType)
685bc2ed2b3Sopenharmony_ci{
686bc2ed2b3Sopenharmony_ci    InfoLog("NotifyDefaultPaymentType: %{public}d", paymentType);
687bc2ed2b3Sopenharmony_ci    if (nciCeProxy_.expired()) {
688bc2ed2b3Sopenharmony_ci        ErrorLog("NotifyDefaultPaymentType: nciCeProxy_ is nullptr.");
689bc2ed2b3Sopenharmony_ci        return;
690bc2ed2b3Sopenharmony_ci    }
691bc2ed2b3Sopenharmony_ci    nciCeProxy_.lock()->NotifyDefaultPaymentType(paymentType);
692bc2ed2b3Sopenharmony_ci}
693bc2ed2b3Sopenharmony_ci
694bc2ed2b3Sopenharmony_civoid CeService::HandleDataShareReady()
695bc2ed2b3Sopenharmony_ci{
696bc2ed2b3Sopenharmony_ci    // when bundle manager init done, when recv the event of dataShareReady;
697bc2ed2b3Sopenharmony_ci    // app list and default payment app need to get from bundle manager, need init if not been initialized.
698bc2ed2b3Sopenharmony_ci    InfoLog("HandleDataShareReady: Init app list and DefaultPayment App");
699bc2ed2b3Sopenharmony_ci    ExternalDepsProxy::GetInstance().InitAppList();
700bc2ed2b3Sopenharmony_ci    if (InitDefaultPaymentApp()) {
701bc2ed2b3Sopenharmony_ci        ConfigRoutingAndCommit();
702bc2ed2b3Sopenharmony_ci    }
703bc2ed2b3Sopenharmony_ci}
704bc2ed2b3Sopenharmony_ci} // namespace NFC
705bc2ed2b3Sopenharmony_ci} // namespace OHOS