summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartijn Coenen <maco@google.com>2014-11-19 02:37:00 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-11-19 02:37:01 +0000
commitd5c1305a0bc29f69d77b513b3c9ec7da25b327b7 (patch)
treeeb15d44aff6dcc92d7cdfd2235cdfcf792a64419
parenteadc627caf5ff7458005d17b58a18b3c65725a6f (diff)
parentd943597d17fb8aa462b119040334478756f9e2f9 (diff)
downloadandroid_packages_apps_Nfc-d5c1305a0bc29f69d77b513b3c9ec7da25b327b7.tar.gz
android_packages_apps_Nfc-d5c1305a0bc29f69d77b513b3c9ec7da25b327b7.tar.bz2
android_packages_apps_Nfc-d5c1305a0bc29f69d77b513b3c9ec7da25b327b7.zip
Merge "Restrict RF Field events to preferred app." into lmp-mr1-dev
-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 46697717..d7b34866 100755
--- a/src/com/android/nfc/NfcService.java
+++ b/src/com/android/nfc/NfcService.java
@@ -80,11 +80,13 @@ import com.android.nfc.handover.HandoverDataParser;
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";
@@ -1806,16 +1808,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);