summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartijn Coenen <maco@google.com>2014-11-12 15:20:32 -0800
committerMartijn Coenen <maco@google.com>2014-11-12 15:23:11 -0800
commitd943597d17fb8aa462b119040334478756f9e2f9 (patch)
tree294ca9d4a1abe7427c1b8da051964e0d99856932
parenteebaf6f543d8b8983b2b0dce29812d2d2329424f (diff)
downloadandroid_packages_apps_Nfc-d943597d17fb8aa462b119040334478756f9e2f9.tar.gz
android_packages_apps_Nfc-d943597d17fb8aa462b119040334478756f9e2f9.tar.bz2
android_packages_apps_Nfc-d943597d17fb8aa462b119040334478756f9e2f9.zip
Restrict RF Field events to preferred app.
If any of the packages in nfcee_extras.xml is preferred (either tap&pay or foreground), only that app will get RF field events. Otherwise, all apps in nfcee_extras will get the events. Long term solution will be to reduce reliance on RF field events (which doesn't scale), and instead tie this to AID selection. Bug: 18358874 Change-Id: I29276b8929f48b8ca33d61c4120a7405c0ab4dcf
-rwxr-xr-xsrc/com/android/nfc/NfcService.java26
-rw-r--r--src/com/android/nfc/cardemulation/CardEmulationManager.java9
-rw-r--r--src/com/android/nfc/cardemulation/PreferredServices.java14
3 files changed, 46 insertions, 3 deletions
diff --git a/src/com/android/nfc/NfcService.java b/src/com/android/nfc/NfcService.java
index 86531bdf..62566180 100755
--- a/src/com/android/nfc/NfcService.java
+++ b/src/com/android/nfc/NfcService.java
@@ -80,11 +80,13 @@ import com.android.nfc.handover.HandoverManager;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.Arrays;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
+
public class NfcService implements DeviceHostListener {
static final boolean DBG = false;
static final String TAG = "NfcService";
@@ -1807,16 +1809,34 @@ public class NfcService implements DeviceHostListener {
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
// Resume app switches so the receivers can start activites without delay
mNfcDispatcher.resumeAppSwitches();
-
+ ArrayList<String> matchingPackages = new ArrayList<String>();
+ ArrayList<String> preferredPackages = new ArrayList<String>();
synchronized (this) {
for (PackageInfo pkg : mInstalledPackages) {
if (pkg != null && pkg.applicationInfo != null) {
if (mNfceeAccessControl.check(pkg.applicationInfo)) {
- intent.setPackage(pkg.packageName);
- mContext.sendBroadcast(intent);
+ matchingPackages.add(pkg.packageName);
+ if (mCardEmulationManager != null &&
+ mCardEmulationManager.packageHasPreferredService(pkg.packageName)) {
+ preferredPackages.add(pkg.packageName);
+ }
}
}
}
+ if (preferredPackages.size() > 0) {
+ // If there's any packages in here which are preferred, only
+ // send field events to those packages, to prevent other apps
+ // with signatures in nfcee_access.xml from acting upon the events.
+ for (String packageName : preferredPackages){
+ intent.setPackage(packageName);
+ mContext.sendBroadcast(intent);
+ }
+ } else {
+ for (String packageName : matchingPackages){
+ intent.setPackage(packageName);
+ mContext.sendBroadcast(intent);
+ }
+ }
}
}
diff --git a/src/com/android/nfc/cardemulation/CardEmulationManager.java b/src/com/android/nfc/cardemulation/CardEmulationManager.java
index e1794645..02d36227 100644
--- a/src/com/android/nfc/cardemulation/CardEmulationManager.java
+++ b/src/com/android/nfc/cardemulation/CardEmulationManager.java
@@ -248,6 +248,15 @@ public class CardEmulationManager implements RegisteredServicesCache.Callback,
}
/**
+ * Returns whether a service in this package is preferred,
+ * either because it's the default payment app or it's running
+ * in the foreground.
+ */
+ public boolean packageHasPreferredService(String packageName) {
+ return mPreferredServices.packageHasPreferredService(packageName);
+ }
+
+ /**
* This class implements the application-facing APIs
* and are called from binder. All calls must be
* permission-checked.
diff --git a/src/com/android/nfc/cardemulation/PreferredServices.java b/src/com/android/nfc/cardemulation/PreferredServices.java
index 89542259..41f10fad 100644
--- a/src/com/android/nfc/cardemulation/PreferredServices.java
+++ b/src/com/android/nfc/cardemulation/PreferredServices.java
@@ -354,6 +354,20 @@ public class PreferredServices implements com.android.nfc.ForegroundUtils.Callba
loadDefaultsFromSettings(userId);
}
+ public boolean packageHasPreferredService(String packageName) {
+ if (packageName == null) return false;
+
+ if (mPaymentDefaults.currentPreferred != null &&
+ packageName.equals(mPaymentDefaults.currentPreferred.getPackageName())) {
+ return true;
+ } else if (mForegroundCurrent != null &&
+ packageName.equals(mForegroundCurrent.getPackageName())) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("Preferred services (in order of importance): ");
pw.println(" *** Current preferred foreground service: " + mForegroundCurrent);