Merge changes from topic 'NCI-2.0'

* changes:
  AID suffix registration.
  NCI2.0 update LF_T3T_PARAMETERS of 18 byte.
This commit is contained in:
Ruchi Kandoi
2017-07-06 22:41:29 +00:00
committed by Gerrit Code Review
5 changed files with 72 additions and 9 deletions

View File

@@ -253,6 +253,20 @@ public final class ApduServiceInfo implements Parcelable {
Log.e(TAG, "Ignoring invalid or duplicate aid: " + aid); Log.e(TAG, "Ignoring invalid or duplicate aid: " + aid);
} }
a.recycle(); 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) { } catch (NameNotFoundException e) {
@@ -297,6 +311,17 @@ public final class ApduServiceInfo implements Parcelable {
return prefixAids; return prefixAids;
} }
public List<String> getSubsetAids() {
final ArrayList<String> subsetAids = new ArrayList<String>();
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. * Returns the registered AID group for this category.
*/ */

View File

@@ -606,6 +606,8 @@ public final class CardEmulation {
* <li>Consist of only hex characters * <li>Consist of only hex characters
* <li>Additionally, we allow an asterisk at the end, to indicate * <li>Additionally, we allow an asterisk at the end, to indicate
* a prefix * a prefix
* <li>Additinally we allow an (#) at symbol at the end, to indicate
* a subset
* </ul> * </ul>
* *
* @hide * @hide
@@ -614,20 +616,20 @@ public final class CardEmulation {
if (aid == null) if (aid == null)
return false; return false;
// If a prefix AID, the total length must be odd (even # of AID chars + '*') // If a prefix/subset AID, the total length must be odd (even # of AID chars + '*')
if (aid.endsWith("*") && ((aid.length() % 2) == 0)) { if ((aid.endsWith("*") || aid.endsWith("#")) && ((aid.length() % 2) == 0)) {
Log.e(TAG, "AID " + aid + " is not a valid AID."); Log.e(TAG, "AID " + aid + " is not a valid AID.");
return false; return false;
} }
// If not a prefix AID, the total length must be even (even # of AID chars) // If not a prefix/subset AID, the total length must be even (even # of AID chars)
if (!aid.endsWith("*") && ((aid.length() % 2) != 0)) { if ((!(aid.endsWith("*") || aid.endsWith("#"))) && ((aid.length() % 2) != 0)) {
Log.e(TAG, "AID " + aid + " is not a valid AID."); Log.e(TAG, "AID " + aid + " is not a valid AID.");
return false; return false;
} }
// Verify hex characters // 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."); Log.e(TAG, "AID " + aid + " is not a valid AID.");
return false; return false;
} }

View File

@@ -64,6 +64,7 @@ import android.util.Log;
* android:description="@string/servicedesc"&gt; * android:description="@string/servicedesc"&gt;
* &lt;system-code-filter android:name="4000"/&gt; * &lt;system-code-filter android:name="4000"/&gt;
* &lt;nfcid2-filter android:name="02FE000000000000"/&gt; * &lt;nfcid2-filter android:name="02FE000000000000"/&gt;
&lt;t3tPmm-filter android:name="FFFFFFFFFFFFFFFF"/&gt;
* &lt;/host-nfcf-service&gt; * &lt;/host-nfcf-service&gt;
* </pre> * </pre>
* *
@@ -76,6 +77,7 @@ import android.util.Log;
* <ul> * <ul>
* <li>Exactly one {@link android.R.styleable#SystemCodeFilter &lt;system-code-filter&gt;} tag.</li> * <li>Exactly one {@link android.R.styleable#SystemCodeFilter &lt;system-code-filter&gt;} tag.</li>
* <li>Exactly one {@link android.R.styleable#Nfcid2Filter &lt;nfcid2-filter&gt;} tag.</li> * <li>Exactly one {@link android.R.styleable#Nfcid2Filter &lt;nfcid2-filter&gt;} tag.</li>
* <li>Zero or one {@link android.R.styleable#T3tPmmFilter &lt;t3tPmm-filter&gt;} tag.</li>
* </ul> * </ul>
* </p> * </p>
* *

View File

@@ -18,9 +18,9 @@ package android.nfc.cardemulation;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo; import android.content.pm.ServiceInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources; import android.content.res.Resources;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.content.res.XmlResourceParser; import android.content.res.XmlResourceParser;
@@ -79,12 +79,17 @@ public final class NfcFServiceInfo implements Parcelable {
*/ */
final int mUid; final int mUid;
/**
* LF_T3T_PMM of the service
*/
final String mT3tPmm;
/** /**
* @hide * @hide
*/ */
public NfcFServiceInfo(ResolveInfo info, String description, public NfcFServiceInfo(ResolveInfo info, String description,
String systemCode, String dynamicSystemCode, String nfcid2, String dynamicNfcid2, String systemCode, String dynamicSystemCode, String nfcid2, String dynamicNfcid2,
int uid) { int uid, String t3tPmm) {
this.mService = info; this.mService = info;
this.mDescription = description; this.mDescription = description;
this.mSystemCode = systemCode; this.mSystemCode = systemCode;
@@ -92,6 +97,7 @@ public final class NfcFServiceInfo implements Parcelable {
this.mNfcid2 = nfcid2; this.mNfcid2 = nfcid2;
this.mDynamicNfcid2 = dynamicNfcid2; this.mDynamicNfcid2 = dynamicNfcid2;
this.mUid = uid; this.mUid = uid;
this.mT3tPmm = t3tPmm;
} }
public NfcFServiceInfo(PackageManager pm, ResolveInfo info) public NfcFServiceInfo(PackageManager pm, ResolveInfo info)
@@ -130,6 +136,7 @@ public final class NfcFServiceInfo implements Parcelable {
String systemCode = null; String systemCode = null;
String nfcid2 = null; String nfcid2 = null;
String t3tPmm = null;
final int depth = parser.getDepth(); final int depth = parser.getDepth();
while (((eventType = parser.next()) != XmlPullParser.END_TAG || while (((eventType = parser.next()) != XmlPullParser.END_TAG ||
@@ -160,10 +167,22 @@ public final class NfcFServiceInfo implements Parcelable {
nfcid2 = null; nfcid2 = null;
} }
a.recycle(); a.recycle();
} else if (eventType == XmlPullParser.START_TAG && tagName.equals("t3tPmm-filter")
&& t3tPmm == null) {
final TypedArray a = res.obtainAttributes(attrs,
com.android.internal.R.styleable.T3tPmmFilter);
t3tPmm = a.getString(
com.android.internal.R.styleable.T3tPmmFilter_name).toUpperCase();
if (t3tPmm == null) {
String defaultT3tPmm = "FFFFFFFFFFFFFFFF";
t3tPmm = defaultT3tPmm;
}
a.recycle();
} }
} }
mSystemCode = (systemCode == null ? "NULL" : systemCode); mSystemCode = (systemCode == null ? "NULL" : systemCode);
mNfcid2 = (nfcid2 == null ? "NULL" : nfcid2); mNfcid2 = (nfcid2 == null ? "NULL" : nfcid2);
mT3tPmm = (t3tPmm == null ? "NULL" : t3tPmm);
} catch (NameNotFoundException e) { } catch (NameNotFoundException e) {
throw new XmlPullParserException("Unable to create context for: " + si.packageName); throw new XmlPullParserException("Unable to create context for: " + si.packageName);
} finally { } finally {
@@ -202,6 +221,10 @@ public final class NfcFServiceInfo implements Parcelable {
return mUid; return mUid;
} }
public String getT3tPmm() {
return mT3tPmm;
}
public CharSequence loadLabel(PackageManager pm) { public CharSequence loadLabel(PackageManager pm) {
return mService.loadLabel(pm); return mService.loadLabel(pm);
} }
@@ -223,6 +246,7 @@ public final class NfcFServiceInfo implements Parcelable {
if (mDynamicNfcid2 != null) { if (mDynamicNfcid2 != null) {
out.append(", dynamic NFCID2: " + mDynamicNfcid2); out.append(", dynamic NFCID2: " + mDynamicNfcid2);
} }
out.append(", T3T PMM:" + mT3tPmm);
return out.toString(); return out.toString();
} }
@@ -235,7 +259,7 @@ public final class NfcFServiceInfo implements Parcelable {
if (!thatService.getComponent().equals(this.getComponent())) return false; if (!thatService.getComponent().equals(this.getComponent())) return false;
if (!thatService.mSystemCode.equalsIgnoreCase(this.mSystemCode)) return false; if (!thatService.mSystemCode.equalsIgnoreCase(this.mSystemCode)) return false;
if (!thatService.mNfcid2.equalsIgnoreCase(this.mNfcid2)) return false; if (!thatService.mNfcid2.equalsIgnoreCase(this.mNfcid2)) return false;
if (!thatService.mT3tPmm.equalsIgnoreCase(this.mT3tPmm)) return false;
return true; return true;
} }
@@ -264,6 +288,7 @@ public final class NfcFServiceInfo implements Parcelable {
dest.writeString(mDynamicNfcid2); dest.writeString(mDynamicNfcid2);
} }
dest.writeInt(mUid); dest.writeInt(mUid);
dest.writeString(mT3tPmm);
}; };
public static final Parcelable.Creator<NfcFServiceInfo> CREATOR = public static final Parcelable.Creator<NfcFServiceInfo> CREATOR =
@@ -283,8 +308,9 @@ public final class NfcFServiceInfo implements Parcelable {
dynamicNfcid2 = source.readString(); dynamicNfcid2 = source.readString();
} }
int uid = source.readInt(); int uid = source.readInt();
String t3tPmm = source.readString();
NfcFServiceInfo service = new NfcFServiceInfo(info, description, NfcFServiceInfo service = new NfcFServiceInfo(info, description,
systemCode, dynamicSystemCode, nfcid2, dynamicNfcid2, uid); systemCode, dynamicSystemCode, nfcid2, dynamicNfcid2, uid, t3tPmm);
return service; return service;
} }
@@ -299,6 +325,7 @@ public final class NfcFServiceInfo implements Parcelable {
" (Description: " + getDescription() + ")"); " (Description: " + getDescription() + ")");
pw.println(" System Code: " + getSystemCode()); pw.println(" System Code: " + getSystemCode());
pw.println(" NFCID2: " + getNfcid2()); pw.println(" NFCID2: " + getNfcid2());
pw.println(" T3tPmm: " + getT3tPmm());
} }
} }

View File

@@ -3462,6 +3462,13 @@ i
<attr name="name" /> <attr name="name" />
</declare-styleable> </declare-styleable>
<!-- Specify one or more <code>t3tPmm-filter</code> elements inside a
<code>host-nfcf-service</code> element to specify a LF_T3T_PMM -->
<declare-styleable name="T3tPmmFilter">
<attr name="name" />
</declare-styleable>
<declare-styleable name="ActionMenuItemView"> <declare-styleable name="ActionMenuItemView">
<attr name="minWidth" /> <attr name="minWidth" />
</declare-styleable> </declare-styleable>