From: Rafal Walczyna Date: Mon, 26 Feb 2018 11:11:58 +0000 (+0100) Subject: [NFC] Fix setPreferredApp() X-Git-Tag: submit/tizen_4.0/20180323.180729~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dd10e9cadbde937fff5689d1455bd6f74aec4aca;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [NFC] Fix setPreferredApp() It was unable to use when there was only one app or app was already set as preferred. Added checking for already activated app. [Verification] 100% passrate (auto + manual)_on solis TW2 Change-Id: Ie85d1c09692bebdca7afe5278f63db9071d1adf5 Signed-off-by: Rafal Walczyna --- diff --git a/src/nfc/nfc_adapter.cc b/src/nfc/nfc_adapter.cc index 9a00aa37..41691a78 100644 --- a/src/nfc/nfc_adapter.cc +++ b/src/nfc/nfc_adapter.cc @@ -1510,15 +1510,55 @@ void NFCAdapter::GetAIDsForCategory(const std::string& type, } 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_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; @@ -1535,7 +1575,7 @@ PlatformResult NFCAdapter::UnsetPreferredApp() { 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); }