Offhost NFC services shouldn't be able to register non-autotransact polling loop filters
Bug: 336301469
Test: Tested with CTS
Merged-In: Idbf4fd98531532274c8af437aa35ff99f1c4ce3e
Change-Id: Idbf4fd98531532274c8af437aa35ff99f1c4ce3e
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 4611c15..f3cca8b 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -4472,8 +4472,8 @@
</declare-styleable>
<!-- Specify one or more <code>polling-loop-filter</code> elements inside a
- <code>host-apdu-service</code> to indicate polling loop frames that
- your service can handle. -->
+ <code>host-apdu-service</code> or <code>offhost-apdu-service</code> to indicate polling
+ loop frames that your service can handle. -->
<!-- @FlaggedApi("android.nfc.Flags.FLAG_NFC_READ_POLLING_LOOP") -->
<declare-styleable name="PollingLoopFilter">
<!-- The polling loop frame. This attribute is mandatory. -->
@@ -4485,8 +4485,8 @@
</declare-styleable>
<!-- Specify one or more <code>polling-loop-pattern-filter</code> elements inside a
- <code>host-apdu-service</code> to indicate polling loop frames that
- your service can handle. -->
+ <code>host-apdu-service</code> or <code>offhost-apdu-service</code> to indicate polling
+ loop frames that your service can handle. -->
<!-- @FlaggedApi("android.nfc.Flags.FLAG_NFC_READ_POLLING_LOOP") -->
<declare-styleable name="PollingLoopPatternFilter">
<!-- The patter to match polling loop frames to, must to be compatible with
diff --git a/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java b/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java
index 572e20d..a470f93 100644
--- a/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java
+++ b/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java
@@ -410,7 +410,12 @@
boolean autoTransact = a.getBoolean(
com.android.internal.R.styleable.PollingLoopFilter_autoTransact,
false);
- mAutoTransact.put(plf, autoTransact);
+ if (!mOnHost && !autoTransact) {
+ Log.e(TAG, "Ignoring polling-loop-filter " + plf
+ + " for offhost service that isn't autoTranact");
+ } else {
+ mAutoTransact.put(plf, autoTransact);
+ }
a.recycle();
} else if (eventType == XmlPullParser.START_TAG
&& "polling-loop-pattern-filter".equals(tagName) && currentGroup == null) {
@@ -422,7 +427,12 @@
boolean autoTransact = a.getBoolean(
com.android.internal.R.styleable.PollingLoopFilter_autoTransact,
false);
- mAutoTransactPatterns.put(Pattern.compile(plf), autoTransact);
+ if (!mOnHost && !autoTransact) {
+ Log.e(TAG, "Ignoring polling-loop-filter " + plf
+ + " for offhost service that isn't autoTranact");
+ } else {
+ mAutoTransactPatterns.put(Pattern.compile(plf), autoTransact);
+ }
a.recycle();
}
}
@@ -729,8 +739,10 @@
@FlaggedApi(Flags.FLAG_NFC_READ_POLLING_LOOP)
public void addPollingLoopFilter(@NonNull String pollingLoopFilter,
boolean autoTransact) {
+ if (!mOnHost && !autoTransact) {
+ return;
+ }
mAutoTransact.put(pollingLoopFilter, autoTransact);
-
}
/**
@@ -755,8 +767,10 @@
@FlaggedApi(Flags.FLAG_NFC_READ_POLLING_LOOP)
public void addPollingLoopPatternFilter(@NonNull String pollingLoopPatternFilter,
boolean autoTransact) {
+ if (!mOnHost && !autoTransact) {
+ return;
+ }
mAutoTransactPatterns.put(Pattern.compile(pollingLoopPatternFilter), autoTransact);
-
}
/**