[NFC] Fix setPreferredApp() 30/173330/3
authorRafal Walczyna <r.walczyna@partner.samsung.com>
Mon, 26 Feb 2018 11:11:58 +0000 (12:11 +0100)
committerRafal Walczyna <r.walczyna@partner.samsung.com>
Thu, 22 Mar 2018 06:53:17 +0000 (07:53 +0100)
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 <r.walczyna@partner.samsung.com>
src/nfc/nfc_adapter.cc

index 9a00aa3..41691a7 100644 (file)
@@ -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_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;
@@ -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);
   }