diff options
author | Martijn Coenen <maco@google.com> | 2014-11-12 15:20:32 -0800 |
---|---|---|
committer | Martijn Coenen <maco@google.com> | 2014-11-12 15:23:11 -0800 |
commit | d943597d17fb8aa462b119040334478756f9e2f9 (patch) | |
tree | 294ca9d4a1abe7427c1b8da051964e0d99856932 | |
parent | eebaf6f543d8b8983b2b0dce29812d2d2329424f (diff) | |
download | android_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-x | src/com/android/nfc/NfcService.java | 26 | ||||
-rw-r--r-- | src/com/android/nfc/cardemulation/CardEmulationManager.java | 9 | ||||
-rw-r--r-- | src/com/android/nfc/cardemulation/PreferredServices.java | 14 |
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); |