1 /* 2 * Copyright (C) 2023-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #ifndef CE_SERVICE_H 16 #define CE_SERVICE_H 17 #include "nfc_service.h" 18 #include "host_card_emulation_manager.h" 19 #include "inci_ce_interface.h" 20 #include "ihce_cmd_callback.h" 21 #include "app_data_parser.h" 22 #include "common_event_manager.h" 23 #include "element_name.h" 24 #include "idefault_payment_service_change_callback.h" 25 #include "default_payment_service_change_callback.h" 26 #include "app_state_observer.h" 27 #include "infc_app_state_observer.h" 28 29 namespace OHOS { 30 namespace NFC { 31 class NfcService; 32 class NfcEventHandler; 33 class HostCardEmulationManager; 34 using OHOS::AppExecFwk::ElementName; 35 class CeService : public IDefaultPaymentServiceChangeCallback, 36 public std::enable_shared_from_this<CeService>, 37 public INfcAppStateObserver { 38 public: 39 struct AidEntry { 40 std::string aid; 41 int route; 42 int aidInfo; 43 int power; 44 bool operator==(const AidEntry &other) const 45 { 46 return aid == other.aid && route == other.route && aidInfo == other.aidInfo && power == other.power; 47 } 48 }; 49 50 explicit CeService(std::weak_ptr<NfcService> nfcService, std::weak_ptr<NCI::INciCeInterface> nciCeProxy); 51 ~CeService(); 52 53 void HandleFieldActivated(); 54 void HandleFieldDeactivated(); 55 void OnCardEmulationData(const std::vector<uint8_t> &data); 56 void OnCardEmulationActivated(); 57 void OnCardEmulationDeactivated(); 58 static void PublishFieldOnOrOffCommonEvent(bool isFieldOn); 59 bool RegHceCmdCallback(const sptr<KITS::IHceCmdCallback> &callback, const std::string &type, 60 Security::AccessToken::AccessTokenID callerToken); 61 62 bool UnRegHceCmdCallback(const std::string &type, Security::AccessToken::AccessTokenID callerToken); 63 64 bool UnRegAllCallback(Security::AccessToken::AccessTokenID callerToken); 65 bool IsDefaultService(ElementName &element, const std::string &type); 66 67 bool SendHostApduData(const std::string &hexCmdData, bool raw, std::string &hexRespData, 68 Security::AccessToken::AccessTokenID callerToken); 69 70 bool InitConfigAidRouting(bool forceUpdate); 71 void OnDefaultPaymentServiceChange() override; 72 OHOS::sptr<OHOS::IRemoteObject> AsObject() override; 73 void Initialize(); 74 void Deinitialize(); 75 bool StartHce(const ElementName &element, const std::vector<std::string> &aids); 76 bool StopHce(const ElementName &element, Security::AccessToken::AccessTokenID callerToken); 77 bool HandleWhenRemoteDie(Security::AccessToken::AccessTokenID callerToken); 78 void OnAppAddOrChangeOrRemove(std::shared_ptr<EventFwk::CommonEventData> data); 79 80 void ConfigRoutingAndCommit(); 81 void SearchElementByAid(const std::string &aid, ElementName &aidElement); 82 KITS::DefaultPaymentType GetDefaultPaymentType(); 83 84 void HandleAppStateChanged(const std::string &bundleName, const std::string &abilityName, 85 int abilityState) override; 86 87 void HandleDataShareReady(); 88 89 private: 90 void BuildAidEntries(std::map<std::string, AidEntry> &aidEntries); 91 void ClearAidEntriesCache(); 92 bool IsDynamicAid(const std::string &aid); 93 bool IsPaymentAid(const std::string &aid, const AppDataParser::HceAppAidInfo &hceApp); 94 void SetHceInfo(const ElementName &element, const std::vector<std::string> &aids); 95 void ClearHceInfo(); 96 bool AppEventCheckValid(std::shared_ptr<EventFwk::CommonEventData> data); 97 void UpdateDefaultPaymentBundleInstalledStatus(bool installed); 98 99 void HandleOtherAidConflicted(const std::vector<AppDataParser::HceAppAidInfo> &hceApps); 100 bool UpdateDefaultPaymentType(); 101 void UpdateDefaultPaymentElement(const ElementName &element); 102 void NotifyDefaultPaymentType(int paymentType); 103 bool InitDefaultPaymentApp(); 104 105 uint64_t lastFieldOnTime_ = 0; 106 uint64_t lastFieldOffTime_ = 0; 107 bool initDefaultPaymentAppDone_ = false; 108 109 std::weak_ptr<NfcService> nfcService_{}; 110 111 friend class NfcService; 112 std::weak_ptr<NCI::INciCeInterface> nciCeProxy_{}; 113 std::shared_ptr<HostCardEmulationManager> hostCardEmulationManager_{}; 114 ElementName defaultPaymentElement_; 115 bool defaultPaymentBundleInstalled_ {}; 116 KITS::DefaultPaymentType defaultPaymentType_ = KITS::DefaultPaymentType::TYPE_EMPTY; 117 sptr<DefaultPaymentServiceChangeCallback> dataRdbObserver_; 118 119 ElementName foregroundElement_ {}; 120 std::vector<std::string> dynamicAids_ {}; 121 122 std::mutex configRoutingMutex_ {}; 123 std::map<std::string, AidEntry> aidToAidEntry_{}; 124 std::shared_ptr<AppStateObserver> appStateObserver_; 125 }; 126 } // namespace NFC 127 } // namespace OHOS 128 #endif