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