From e910e8bf863e50ef434c980d5d2ee403b3307514 Mon Sep 17 00:00:00 2001 From: Love Khanna Date: Fri, 12 May 2017 13:53:42 +0530 Subject: [PATCH] AID suffix registration. Test: compiles. Change-Id: I0ab02599814722055d77eef29e734bfd45e8d1ee --- .../nfc/cardemulation/ApduServiceInfo.java | 25 +++++++++++++++++++ .../nfc/cardemulation/CardEmulation.java | 12 +++++---- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/core/java/android/nfc/cardemulation/ApduServiceInfo.java b/core/java/android/nfc/cardemulation/ApduServiceInfo.java index 7678678f3513a..218e4f223549d 100644 --- a/core/java/android/nfc/cardemulation/ApduServiceInfo.java +++ b/core/java/android/nfc/cardemulation/ApduServiceInfo.java @@ -253,6 +253,20 @@ public final class ApduServiceInfo implements Parcelable { Log.e(TAG, "Ignoring invalid or duplicate aid: " + aid); } a.recycle(); + } else if (eventType == XmlPullParser.START_TAG && + tagName.equals("aid-suffix-filter") && currentGroup != null) { + final TypedArray a = res.obtainAttributes(attrs, + com.android.internal.R.styleable.AidFilter); + String aid = a.getString(com.android.internal.R.styleable.AidFilter_name). + toUpperCase(); + // Add wildcard char to indicate suffix + aid = aid.concat("#"); + if (CardEmulation.isValidAid(aid) && !currentGroup.aids.contains(aid)) { + currentGroup.aids.add(aid); + } else { + Log.e(TAG, "Ignoring invalid or duplicate aid: " + aid); + } + a.recycle(); } } } catch (NameNotFoundException e) { @@ -297,6 +311,17 @@ public final class ApduServiceInfo implements Parcelable { return prefixAids; } + public List getSubsetAids() { + final ArrayList subsetAids = new ArrayList(); + for (AidGroup group : getAidGroups()) { + for (String aid : group.aids) { + if (aid.endsWith("#")) { + subsetAids.add(aid); + } + } + } + return subsetAids; + } /** * Returns the registered AID group for this category. */ diff --git a/core/java/android/nfc/cardemulation/CardEmulation.java b/core/java/android/nfc/cardemulation/CardEmulation.java index b49288e6e59ef..6dd7993965992 100644 --- a/core/java/android/nfc/cardemulation/CardEmulation.java +++ b/core/java/android/nfc/cardemulation/CardEmulation.java @@ -606,6 +606,8 @@ public final class CardEmulation { *
  • Consist of only hex characters *
  • Additionally, we allow an asterisk at the end, to indicate * a prefix + *
  • Additinally we allow an (#) at symbol at the end, to indicate + * a subset * * * @hide @@ -614,20 +616,20 @@ public final class CardEmulation { if (aid == null) return false; - // If a prefix AID, the total length must be odd (even # of AID chars + '*') - if (aid.endsWith("*") && ((aid.length() % 2) == 0)) { + // If a prefix/subset AID, the total length must be odd (even # of AID chars + '*') + if ((aid.endsWith("*") || aid.endsWith("#")) && ((aid.length() % 2) == 0)) { Log.e(TAG, "AID " + aid + " is not a valid AID."); return false; } - // If not a prefix AID, the total length must be even (even # of AID chars) - if (!aid.endsWith("*") && ((aid.length() % 2) != 0)) { + // If not a prefix/subset AID, the total length must be even (even # of AID chars) + if ((!(aid.endsWith("*") || aid.endsWith("#"))) && ((aid.length() % 2) != 0)) { Log.e(TAG, "AID " + aid + " is not a valid AID."); return false; } // Verify hex characters - if (!aid.matches("[0-9A-Fa-f]{10,32}\\*?")) { + if (!aid.matches("[0-9A-Fa-f]{10,32}\\*?\\#?")) { Log.e(TAG, "AID " + aid + " is not a valid AID."); return false; }