}
PlatformResult NFCAdapter::SetPreferredApp() {
- ScopeLogger();
+ ScopeLogger("m_is_preferred_app_set: %d", m_is_preferred_app_set);
if (m_is_preferred_app_set) {
return PlatformResult(ErrorCode::NO_ERROR);
}
+ bool is_activated_handler = false;
+
+ // check whether app has any activated handler for payment category
+ // if yes, there is no need of calling nfc_se_set_preferred_handler
+ std::vector<nfc_se_type_e> nfc_ce_types{NFC_SE_TYPE_ESE, NFC_SE_TYPE_UICC, NFC_SE_TYPE_HCE};
+ LoggerD(
+ "Checking for activated handlers using "
+ "nfc_se_is_activated_handler_for_category");
+ for (auto type : nfc_ce_types) {
+ int ret = nfc_se_is_activated_handler_for_category(type, NFC_CARD_EMULATION_CATEGORY_PAYMENT,
+ &is_activated_handler);
+ if (NFC_ERROR_NONE != ret) {
+ LoggerE("nfc_se_is_activated_handler_for_category failed: %d, type: %d", ret, (int)type);
+ return NFCUtil::CodeToResult(ret, NFCUtil::getNFCErrorMessage(ret).c_str());
+ }
+ if (is_activated_handler) {
+ LoggerD("App is an activated hadler, no need of calling nfc_se_set_preferred_handler");
+ return PlatformResult(ErrorCode::NO_ERROR);
+ }
+ }
+
+ // if there is no activated handler we need to ensure
+ // that there is at least one registered AID
+ LoggerD("Checking for registered AIDs");
+ AIDDataVector aids{};
+ for (auto type : nfc_ce_types) {
+ int ret =
+ nfc_se_foreach_registered_aids(type, NFC_CARD_EMULATION_CATEGORY_PAYMENT, SaveRow, &aids);
+ if (NFC_ERROR_NONE != ret) {
+ LoggerE("nfc_se_foreach_registered_aids failed: %d, type: %d", ret, (int)type);
+ return NFCUtil::CodeToResult(ret, NFCUtil::getNFCErrorMessage(ret).c_str());
+ }
+ if (!aids.empty()) {
+ break;
+ }
+ }
+ if (aids.empty()) {
+ return LogAndCreateResult(ErrorCode::ABORT_ERR, "No AID registered");
+ }
+ LoggerD("Found %d AIDs", aids.size());
int ret = nfc_se_set_preferred_handler();
if (ret != NFC_ERROR_NONE) {
- LoggerE("SetPreferredApp failed: %d", ret);
+ LoggerE("nfc_se_set_preferred_handler failed: %d", ret);
return NFCUtil::CodeToResult(ret, NFCUtil::getNFCErrorMessage(ret).c_str(), true);
}
m_is_preferred_app_set = true;
int ret = nfc_se_unset_preferred_handler();
if (ret != NFC_ERROR_NONE) {
- LoggerE("SetPreferredApp failed: %d", ret);
+ LoggerE("nfc_se_unset_preferred_handler failed: %d", ret);
return NFCUtil::CodeToResult(ret, NFCUtil::getNFCErrorMessage(ret).c_str(), true);
}